/[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 311 by bh, Tue Sep 10 16:45:32 2002 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]>
4625    
4626            * Thuban/UI/view.py (MapCanvas.set_view_transform): Limit the
4627            maximum and minimum scale factors.
4628    
4629            * test/test_classgen.py (ClassGenTest.test): Update to reflect the
4630            changes in classgen.py
4631    
4632    2003-05-30  Jonathan Coles   <[email protected]>
4633    
4634            * Thuban/Model/classgen.py: Remove ClassGenerator class but make
4635            all the methods functions. Fixes RTBug #1903.
4636    
4637            * Thuban/Model/map.py (Map.TopLayer, Map.BottomLayer): Renamed
4638            to MoveLayerToTop and MoveLayerToBottom respectively. Fixes
4639            RTBug #1907.
4640    
4641            * Thuban/UI/classgen.py: Use classgen functions that were part
4642            of the ClassGenerator class. Put try/finally blocks around
4643            code that uses wxBeginBusyCursor()/wxEndBusyCursor(). Fixes
4644            RTBug #1904.
4645    
4646            * Thuban/UI/classifier.py: Remove unused import of ClassGenerator.
4647    
4648            * Thuban/UI/legend.py: The legend was cleared and repopulated any
4649            time something changed which caused some state to be lost such
4650            as which children were expanded or collapsed. Fixes RTBug #1901.
4651            (LegendTree._OnMsgMapLayersAdded): Add only new layers.
4652            (LegendTree.__OnMsgMapLayersRemoved): Remove layers that exist in
4653            the legend but not in the map.
4654            (LegendTree.__FillTree): Move main functionality out into smaller
4655            methods that can be used by other methods.
4656            (LegendTree.__FillTreeLayer): Reuse old slots in the image list
4657            if they are available.
4658            (LegendTree.DeleteAllItems): Renamed from __DeleteAllItems so
4659            that we override the wxTreeCtrl method. Iterate over children
4660            and call __RemoveLayer.
4661            (LegendTree.__AddLayer): New. Add a new layer to the legend.
4662            (LegendTree.__RemoveLayer): Remove a layer from the legend.
4663            (LegendTree.DeleteChildren): New, overrides wxTreeCtrl method.
4664            Should only be called with the id of a layer branch.
4665            (LegendTree.GetRootItem): New, overrides wxTreeCtrl method.
4666            Returns the root item or creates one if necessary.
4667    
4668            * Thuban/UI/renderer.py (MapRenderer.draw_raster_layer): Call
4669            ProjectRasterFile with tuple arguments instead of strings.
4670    
4671            * Thuban/UI/tableview.py (QueryTableFrame.OnQuery): Wrap code
4672            with try/finally. Fixes RTBug #1904.
4673    
4674            * Thuban/UI/view.py (MapCanvas.OnPaint): Wrap code
4675            with try/finally. Fixes RTBug #1904.
4676            (MapCanvas.FitSelectedToWindow): If a single point is selected
4677            simply center it on the display. Fixes RTBug #1849.
4678    
4679            * extensions/thuban/gdalwarp.cpp: Removed code that allowed gdalwarp
4680            to be compiled as a standalone app. Now the code can only be
4681            called from Python which simplifies the parameter passing.
4682            (ProjectRasterFile): Handle Python arguments. Remove code that
4683            checks for a destination dataset. Add more clean up code.
4684    
4685            * test/test_map.py (TestMapWithContents.test_raise_layer_top,
4686            TestMapWithContents.test_lower_layer_bottom):
4687            Test Map.MoveLayerToTop() and Map.MoveLayerToBottom() respectively.
4688            Fixes RTBug #1907.
4689    
4690            * Thuban/UI/mainwindow.py (MainWindow.ToggleLegend): Apply a full
4691            extent to the map when the legend is toggled. Fixes RTBug #1881.
4692    
4693    2003-05-29  Jan-Oliver Wagner <[email protected]>
4694    
4695            * Thuban/UI/tableview.py (LayerTableFrame.OnClose): Bug-fix: Now
4696            unsubscribes all that is subcribed in __init__.
4697    
4698    2003-05-28  Bernhard Herzog  <[email protected]>
4699    
4700            * Thuban/UI/mainwindow.py (MainWindow.DuplicateLayer)
4701            (MainWindow.CanDuplicateLayer): New methods to implement the
4702            Layer/Duplicate command.
4703            (layer_duplicate command): New.
4704            (main_menu): Add layer_duplicate to the Layer menu.
4705    
4706    2003-05-28  Bernhard Herzog  <[email protected]>
4707    
4708            * Thuban/UI/tableview.py (NullRenderer.Draw): New. Our own
4709            renderer so that NULL/None values get displayed differently (by a
4710            gray rectangle).
4711            (TableGrid.__init__): Override the default renderers
4712    
4713    2003-05-28  Bernhard Herzog  <[email protected]>
4714    
4715            * Thuban/Model/layer.py (Layer.SetShapeStore): Set the
4716            classification to "None" if the type of the field has changed.
4717    
4718            * test/test_layer.py (SetShapeStoreTests): New. Class with a few
4719            test for the Layer.SetShapeStore method
4720    
4721    2003-05-28  Jan-Oliver Wagner <[email protected]>
4722    
4723            * Thuban/Model/layer.py (Layer.TreeInfo): Fixed a bug (a layer
4724            does not necessarily have a filename).
4725    
4726    2003-05-28  Jan-Oliver Wagner <[email protected]>
4727    
4728            * Thuban/UI/mainwindow.py (MainWindow.TableClose, MainWindow.TableShow):
4729            sort the selection list for the dialog.
4730    
4731    2003-05-28  Frank Koormann  <[email protected]>
4732    
4733            * extensions/thuban/wxproj.cpp
4734            (project_point): Removed cast to int for projected point coordinates.
4735            (shape_centroid): Return last point if all polygon vertices fall
4736            to one point.
4737    
4738    2003-05-28  Bernhard Herzog  <[email protected]>
4739    
4740            * Thuban/UI/mainwindow.py (_can_unjoin): Add doc-string and cope
4741            with layers that don't have shapestores, i.e. raster layers.
4742    
4743    2003-05-28  Bernhard Herzog  <[email protected]>
4744    
4745            * Thuban/Model/table.py (DBFTable.__init__): Omit the extension
4746            when determining the title from the filename.
4747    
4748            * test/test_dbf_table.py (TestDBFTable.test_title): Update to
4749            reflect changes in the way the title is derived from the filename
4750    
4751    2003-05-28  Frank Koormann  <[email protected]>
4752    
4753            * Thuban/UI/mainwindow.py (MainWindow.TableShow):
4754            Added wxDEFAULT_DIALOG_STYLE to show table dialog styles.
4755    
4756    2003-05-27  Bernhard Herzog  <[email protected]>
4757    
4758            * Thuban/UI/mainwindow.py (MainWindow.delegated_messages): Also
4759            delegate SelectedLayer.
4760            (MainWindow.LayerUnjoinTable): Implement.
4761            (_can_unjoin): New. Helper function for the sensitivity of the
4762            layer/unjoin command.
4763    
4764            * Thuban/Model/data.py (ShapefileStore.OrigShapeStore)
4765            (DerivedShapeStore.OrigShapeStore): New. Return the original
4766            shapestore. Used to figure out how to unjoin.
4767            (DerivedShapeStore.Shapefile): Fix a typo.
4768    
4769    2003-05-27  Bernhard Herzog  <[email protected]>
4770    
4771            * Thuban/UI/join.py (JoinDialog): Extend to handle layer joins as
4772            well
4773            (JoinDialog.__init__): Use the layer parameter and only build the
4774            left choice when a layer is given
4775            (JoinDialog.OnJoin): Handle layer joins as well
4776            (JoinDialog.OnLeftTable, JoinDialog.OnRightTable): Handle the case
4777            that the user selects the "Select..." item. The sensitivitly
4778            updating is now in update_sensitivity
4779            (JoinDialog.y): New method to refactor the sensitivity update of
4780            the join button into its own method.
4781    
4782            * Thuban/UI/mainwindow.py (MainWindow.LayerJoinTable): Implement.
4783    
4784    2003-05-27  Bernhard Herzog  <[email protected]>
4785    
4786            * Thuban/UI/mainwindow.py (table_close command): Make it sensitive
4787            iff there are unreferenced tables in the session
4788    
4789    2003-05-27  Bernhard Herzog  <[email protected]>
4790    
4791            * Thuban/Model/messages.py (TABLE_REMOVED): New message.
4792    
4793            * Thuban/Model/session.py (Session.UnreferencedTables): New method
4794            to return tables that are not referenced by other tables or shape
4795            stores and can be removed.
4796            (Session.RemoveTable): Issue a TABLE_REMOVED message after
4797            removing the table
4798    
4799            * Thuban/UI/mainwindow.py: Remove unused imports
4800            (MainWindow.TableClose): Implement.
4801    
4802            * Thuban/UI/tableview.py (TableFrame.__init__): Subscribe to some
4803            messages so that the frame will be automatically closed when a new
4804            session is opened or the table is removed.
4805            (TableFrame.OnClose): Unsubscribe the Subscriptions made in
4806            __init__
4807            (TableFrame.close_on_session_replaced)
4808            (TableFrame.close_on_table_removed): New. Subscribers that close
4809            the window
4810    
4811            * test/test_session.py (TestSessionMessages.test_remove_table)
4812            (TestSessionSimple.test_remove_table): Move the test to
4813            TestSessionSimple and add test for the TABLE_REMOVED message
4814            (TestSessionBase.setUp): Also subscribe to TABLE_REMOVED
4815            (TestSessionSimple.test_unreferenced_tables) New. Test for the
4816            UnreferencedTables method.
4817            (UnreferencedTablesTests): New. Class with some more sophisticated
4818            tests for UnreferencedTables.
4819    
4820    2003-05-27  Frank Koormann  <[email protected]>
4821    
4822            * Thuban/UI/tableview.py (QueryTableFrame.__init__): The "_S_election"
4823            display has some unwanted side effects. Removed again.
4824    
4825    2003-05-27  Frank Koormann  <[email protected]>
4826    
4827            * Resources/Bitmaps/legend_icon_layer.xpm: New, icon for legend.
4828    
4829            * Thuban/UI/legend.py (LegendTree.__FillTree): Use "legend_icon_layer"
4830    
4831    2003-05-27  Jan-Oliver Wagner <[email protected]>
4832    
4833            * test/test_menu.py (MenuTest.test): Added test for
4834            Menu.RemoveItem().
4835    
4836            * Thuban/UI/menu.py (Menu.RemoveItem): New. Remove an item from
4837            the menu.
4838    
4839    2003-05-27  Frank Koormann  <[email protected]>
4840            
4841            Nonmodal dialogs without parent (i.e. they can fall behind the main
4842            window)
4843    
4844            * Thuban/UI/mainwindow.py (MainWindow.OnClose): Explicitly destroy
4845            all dialogs in the dialogs dictionary and the canvas.
4846    
4847            * Thuban/UI/dialogs.py (NonModalNonParentDialog): New class, without
4848            parent, i.e. can fall behind other windows.
4849            (NonModalDialog.OnClose): Check is dialog is in mainwindow.dialog
4850            dictionary before removing it.
4851    
4852            * Thuban/UI/classifier.py: Dialog derived from NonModalNonParentDialog
4853    
4854            * Thuban/UI/projdialog.py: Dialog derived from NonModalNonParentDialog
4855            * Thuban/UI/tableview.py: Dialog derived from NonModalNonParentDialog
4856            * Thuban/UI/tree.py: Dialog derived from NonModalNonParentDialog
4857    
4858    2003-05-27  Bernhard Herzog  <[email protected]>
4859    
4860            * Thuban/UI/mainwindow.py (MainWindow.ShowTableView): New. Open a
4861            tableview dialog
4862            (MainWindow.TableShow): Use ShowTableView to open the dialogs.
4863            Also, don't use the table's titles as the dialog names. The titles
4864            aren't guaranteed to be unique.
4865            (MainWindow.TableOpen): Open a table view dialog after opening the
4866            table
4867    
4868    2003-05-27  Bernhard Herzog  <[email protected]>
4869    
4870            * Thuban/UI/mainwindow.py: Remove the Table/Hide menu item. Its
4871            effect can be achieved by simply closing the window showing the
4872            table.
4873            (MainWindow.TableHide): Removed.
4874            (main_menu): Removed "table_hide"
4875    
4876    2003-05-27  Frank Koormann  <[email protected]>
4877    
4878            Fix legend tree display problems under Win32
4879    
4880            * Thuban/UI/legend.py:  BMP_SIZE_W = 15
4881            (LegendTree.__FillTree): Display "legend_icon_map.xpm" with layer title.
4882            (LegendTree.__FillTreeLayer): Explicitely set SelectedImage.
4883    
4884            * Resources/Bitmaps/legend_icon_map.xpm: New icon for legend.
4885    
4886    2003-05-27  Jan-Oliver Wagner <[email protected]>
4887    
4888            * Thuban/UI/menu.py (Menu.InsertSeparator): Additional optional parameter
4889            'after' now allows to insert separators almost anywhere in the menu.
4890    
4891    2003-05-27  Frank Koormann  <[email protected]>
4892    
4893            * Thuban/UI/tableview.py (QueryTableFrame.__init__): Underline the
4894            "S" of selection box label to hint on hot key (Alt-S). Works under
4895            Win32 but is ignored under GTK.
4896    
4897    2003-05-26  Frank Koormann  <[email protected]>
4898    
4899            * Thuban/UI/projdialog.py (ProjFrame.__do_layout, ProjPanel._DoLayout):
4900            Center Choices.
4901    
4902    2003-05-26  Bernhard Herzog  <[email protected]>
4903    
4904            Remove the Precision methods again. They're too DBF specific to be
4905            part of the table interface and they're only used in table_to_dbf
4906            anyway.
4907            
4908            * Thuban/Model/transientdb.py (TransientTableBase.Width):Use a
4909            fixed precision of 12 for doubles.
4910            (TransientTableBase.Precision): Removed
4911            (AutoTransientTable.Width): Delegate to self.table.
4912    
4913            * Thuban/Model/table.py (DBFTable.Precision)
4914            (MemoryTable.Precision): Removed.
4915            (MemoryTable.Width): Use a fixed precision of 12 for doubles.
4916            (table_to_dbf): Use a fixed precision of 12 for floats unless the
4917            column object specifies something else.
4918    
4919            * test/test_dbf_table.py (TestTableToDBF.test_table_to_dbf): New.
4920            test for table_to_dbf
4921    
4922    2003-05-26  Bernhard Herzog  <[email protected]>
4923    
4924            * test/test_transientdb.py
4925            (TestTransientTable.run_iceland_political_tests): Fix a comment.
4926    
4927    2003-05-26  Bernhard Herzog  <[email protected]>
4928    
4929            * Thuban/UI/mainwindow.py (MainWindow.TableOpen): Real
4930            implementation. Mark parts of the file format strings for
4931            localization.
4932    
4933            * Thuban/Model/session.py (Session.OpenTableFile): New. Open a dbf
4934            file and add the table to the tables managed by the session
4935    
4936            * test/test_session.py (TestSessionSimple.test_open_table_file):
4937            New. test case for OpenTableFile
4938    
4939    2003-05-26  Jan-Oliver Wagner <[email protected]>
4940    
4941            * Thuban/UI/controls.py, Thuban/UI/identifyview.py, Thuban/UI/join.py,
4942            Thuban/UI/labeldialog.py, Thuban/UI/mainwindow.py,
4943            Thuban/UI/proj4dialog.py, Thuban/UI/tableview.py, Thuban/UI/view.py:
4944            Replace the true/false of wxWindows by True/False of Python 2.2.1.
4945    
4946    2003-05-26  Jan-Oliver Wagner <[email protected]>
4947    
4948            * Thuban/UI/tableview.py (LayerTableFrame.__init__): If there is
4949            already a selection present, update the grid accordingly.
4950    
4951            * Thuban/UI/mainwindow.py (MainWindow.TableShow): Make the dialog
4952            resizeable and increase its initial size.
4953    
4954    2003-05-26  Frank Koormann  <[email protected]>
4955    
4956            Table export functionality
4957    
4958            * Thuban/Model/table.py (DBFTable.Width, MemoryTable.Width):
4959            Return width (in characters) for a column.
4960            (DBFTable.Precision, MemoryTable.Precision): Return decimal precision.
4961            (table_to_dbf): Write table to dbf file.
4962            (table_to_csv): Write table to csv file.
4963    
4964            * Thuban/Model/transientdb.py (TransientTableBase.Width,
4965            TransientTableBase.Precision): Return column width and precision.
4966    
4967            * Thuban/UI/tableview.py (QueryTableFrame.OnSaveAs): Call table_to_dbf
4968            or table_to_csv depending on file selection.
4969    
4970            * test/test_dbf_table.py:
4971            Test table_to_dbf (extension of former part of test).
4972    
4973            * test/test_csv_table.py:
4974            Test table_to_csv.
4975    
4976    2003-05-23  Jan-Oliver Wagner <[email protected]>
4977    
4978            * Thuban/UI/join.py (JoinDialog.OnJoin): Use _() for strings.
4979            Use QueryTableFrame instead of TableFrame.
4980    
4981            * Thuban/UI/mainwindow.py (MainWindow.LayerShowTable): Prefix the
4982            table window with 'Layer Table:' instead of 'Table:'.
4983    
4984    2003-05-23  Jan-Oliver Wagner <[email protected]>
4985    
4986            Give all tables a title via mix-in TitledObject.LayerShowTable
4987    
4988            * Thuban/Model/base.py (TitledObject.SetTitle): Call method 'issue'
4989            only if it exists.
4990    
4991            * Thuban/Model/table.py (DBFTable, MemoryTable): mix-in TitledObject
4992            and call its init-method with a default title. Remove Title() method.
4993    
4994            * Thuban/Model/transientdb.py (TransientTable, TransientJoinedTable,
4995            AutoTransientTable): mix-in TitledObject and call its init-method with
4996            a default title. Remove Title() method.
4997    
4998    2003-05-23  Bernhard Herzog  <[email protected]>
4999    
5000            * Thuban/Model/session.py (Session.AddShapeStore): Define
5001            AddShapeStore analogously to AddTable.
5002    
5003            * test/test_session.py (TestSessionSimple.test_add_shapestore):
5004            New. Test for AddShapeStore
5005    
5006    2003-05-23  Jan-Oliver Wagner <[email protected]>
5007    
5008            Introducing QueryTableFrame and a very coarse ShowTable implementation.
5009    
5010            * Thuban/UI/tableview.py (LayerTableFrame, QueryTableFrame): Split the
5011            class LayerTableFrame into two classes, LayerTableFrame and QueryTableFrame.
5012            The latter implements the selection GUI without dependency on a layer.
5013            LayerTableFrame now is derived from QueryTableFrame and connects
5014            to a layer.
5015    
5016            * Thuban/UI/mainwindow.py (MainWindow.TableShow): A very coarse
5017            implementation that still needs work.
5018    
5019            * Thuban/Model/layer.py (Layer.TreeInfo): Added filename.
5020    
5021    2003-05-22  Frank Koormann  <[email protected]>
5022    
5023            * Thuban/Model/transientdb.py (TransientJoinedTable.__init__):
5024            Added "outer_join = False" as optional parameter.
5025            (TransientJoinedTable.create): If outer join is true, perform a
5026            "LEFT OUTER JOIN" instead of "JOIN", which preserves all records of
5027            the left table. Records not matching are filled with 0 / None.
5028    
5029            * Thuban/UI/join.py (JoinDialog.__init__): Checkbox for outer join.
5030            (JoinDialog.OnJoin): Consider outer join check box.
5031    
5032    2003-05-22  Bernhard Herzog  <[email protected]>
5033    
5034            * Thuban/UI/join.py (JoinDialog.OnJoin): Use exc_info in a
5035            somewhat safer way. Storing the traceback in a local variable can
5036            lead to memory leaks
5037    
5038    2003-05-22  Bernhard Herzog  <[email protected]>
5039    
5040            * Thuban/UI/join.py (JoinDialog.OnJoin): Make sure to really call
5041            the wxMessageDialog's Destroy() method.
5042    
5043    2003-05-22  Frank Koormann  <[email protected]>
5044    
5045            * Thuban/UI/join.py (JoinDialog.__init__): Make use of
5046            TransientTable.Title()
5047    
5048    2003-05-22  Frank Koormann  <[email protected]>
5049    
5050            Join Dialog, initial version.
5051    
5052            * Thuban/UI/mainwindow.py (MainWindow.TableJoin): Removed print.
5053    
5054            * Thuban/UI/join.py (JoinDialog): Functional implementation of
5055            former framework. Renamed Table1/Table2 to LeftTable/RightTable
5056            in all occurences.
5057    
5058            * Thuban/Model/transientdb.py (TransientJoinedTable.__doc__):
5059            Typo fixed.
5060    
5061    2003-05-22  Bernhard Herzog  <[email protected]>
5062    
5063            Give the tables titles so that the GUI can display more meaningful
5064            names. For now the titles are fixed but depend on e.g. filenames
5065            or the titles of the joined tables.
5066    
5067            * Thuban/Model/transientdb.py (TransientTable.Title)
5068            (TransientJoinedTable.Title, AutoTransientTable.Title): New.
5069    
5070            * Thuban/Model/table.py (DBFTable.Title, MemoryTable.Title): New.
5071    
5072            * test/test_transientdb.py
5073            (TestTransientTable.test_auto_transient_table_title): New. Test
5074            for the Title method
5075            (TestTransientTable.test_transient_joined_table)
5076            (TestTransientTable.test_transient_table): Add test for the Title
5077            methods
5078    
5079            * test/test_memory_table.py (TestMemoryTable.test_title): New.
5080            Test for the Title method
5081    
5082            * test/test_dbf_table.py (TestDBFTable.test_title): New. Test for
5083            the Title method
5084    
5085    2003-05-22  Bernhard Herzog  <[email protected]>
5086    
5087            * test/test_layer.py (TestLayer.setUp, TestLayer.tearDown):
5088            Provide a better way to destroy the layers
5089            (TestLayer.test_base_layer, TestLayer.test_arc_layer)
5090            (TestLayer.test_point_layer, TestLayer.test_empty_layer)
5091            (TestLayer.test_polygon_layer, TestLayer.test_get_field_type): Use
5092            the new way to destroy the layers.
5093            (TestLayer.test_derived_store): New. Test for using a layer with a
5094            DerivedShapeStore
5095    
5096            * Thuban/Model/layer.py (Layer.SetShapeStore): Only set the
5097            filename if the shape store actually has one.
5098    
5099    2003-05-22  Bernhard Herzog  <[email protected]>
5100    
5101            * Thuban/Model/table.py (DBFTable.FileName): New. Accessor method
5102            for the filename
5103    
5104            * test/test_dbf_table.py (TestDBFTable.test_filename): New. Test
5105            for the FileName method
5106            (TestDBFTableWriting.test_write): Fix spelling of filename
5107    
5108    2003-05-22  Thomas Koester  <[email protected]>
5109    
5110            * Thuban/Model/range.py, test/test_range.py: Brought over new Range
5111            from SciParam that now really is immutable.
5112    
5113    2003-05-22  Frank Koormann  <[email protected]>
5114    
5115            Layer Top/Bottom placement added to legend.
5116    
5117            * Thuban/UI/legend.py
5118            (LegendPanel._OnMoveTop(), LayerPanel._OnMoveBottom): New, methods
5119            bound to tool events.
5120            (LegendTree.MoveCurrentItemTop(), LegendTree.MoveCurrentItemBottom):
5121            New, methods binding the event methods with the map methods.
5122    
5123            * Thuban/Model/map.py (Map.TopLayer(), Map.BottomLayer()): New, place
5124            layer at top/bottom of layer stack.
5125    
5126            * Resources/Bitmaps/top_layer.xpm: New button icon.
5127    
5128            * Resources/Bitmaps/bottom_layer.xpm: New button icon.
5129    
5130    2003-05-22  Bernhard Herzog  <[email protected]>
5131    
5132            * Thuban/Model/session.py (Session.RemoveTable): New method to
5133            remove tables
5134    
5135            * test/test_session.py (TestSessionSimple.test_remove_table): New.
5136            Test for RemoveTable
5137    
5138    2003-05-22  Thomas Koester  <[email protected]>
5139    
5140            * Thuban/Model/classgen.py: Added short module doc string and CVS id.
5141            (ClassGenerator.GenUniformDistribution): Use new Range __init__, too.
5142    
5143    2003-05-22  Bernhard Herzog  <[email protected]>
5144    
5145            Implement a way to discover dependencies between tables and
5146            shapestores.
5147    
5148            * Thuban/Model/transientdb.py (TransientTableBase.Dependencies)
5149            (TransientJoinedTable.Dependencies)
5150            (AutoTransientTable.SimpleQuery): New. Implement the dependencies
5151            interface
5152            (TransientJoinedTable.__init__): Keep tack of the original table
5153            objects in addition to the corresponding transient tables.
5154    
5155            * Thuban/Model/table.py (DBFTable.Dependencies)
5156            (MemoryTable.Dependencies): New. Implement the dependencies
5157            interface
5158    
5159            * Thuban/Model/data.py (ShapeTable): New. Helper class for
5160            ShapefileStore
5161            (ShapefileStore.__init__): Use ShapeTable instead of
5162            AutoTransientTable
5163            (ShapefileStore.Table, ShapefileStore.Shapefile): Add doc-strings
5164            (ShapefileStore.FileName, ShapefileStore.FileType): New. Accessor
5165            methods for filename and type
5166            (ShapefileStore.Dependencies): New. Implement the dependencies
5167            interface
5168            (DerivedShapeStore): New class to replace SimpleStore. The main
5169            difference to SimpleStore is that it depends not on a shapefile
5170            but another shapestore which expresses the dependencies a bit
5171            better
5172            (SimpleStore.__init__): Add deprecation warning.
5173    
5174            * test/test_dbf_table.py (TestDBFTable.test_dependencies): New.
5175            Test for the Dependencies method.
5176    
5177            * test/test_memory_table.py (TestMemoryTable.test_dependencies):
5178            New. Test for the Dependencies method.
5179    
5180            * test/test_transientdb.py
5181            (TestTransientTable.test_auto_transient_table_dependencies): New.
5182            Test for the Dependencies method.
5183            (TestTransientTable.test_transient_joined_table): Add test for the
5184            Dependencies method.
5185    
5186            * test/test_session.py (TestSessionSimple.setUp)
5187            (TestSessionSimple.tearDown): New. Implement a better way to
5188            destroy the sessions.
5189            (TestSessionSimple.test_initial_state)
5190            (TestSessionSimple.test_add_table): Bind session to self.session
5191            so that it's destroyed by tearDown
5192            (TestSessionSimple.test_open_shapefile): New. Test for
5193            OpenShapefile and the object it returns
5194    
5195    2003-05-22  Bernhard Herzog  <[email protected]>
5196    
5197            * Thuban/Model/session.py (Session.AddTable): New method to
5198            register tables with the session.
5199            (Session.Tables): Return the tables registered with AddTable too.
5200    
5201            * test/test_session.py (TestSessionSimple.test_add_table): New.
5202            Test case for the AddTable method
5203    
5204    2003-05-22  Frank Koormann  <[email protected]>
5205    
5206            UI polishing updates: Place main buttons (OK, Cancel, etc) in the
5207            lower right corner, center labels for selections, initialize controls
5208            in reasonable order for keyboard navigation.
5209    
5210            * Thuban/UI/projdialog.py (ProjFrame.__init__, ProjFrame.__doLayout)
5211            (ProjFrame.__DoOnProjAvail): Determine position of current projection
5212            using the wxListBox.FindString() method. Still a problem (#1886)
5213    
5214            * Thuban/UI/classifier.py
5215            (Classifier.__init__, SelectPropertiesDialog.__init__)
5216    
5217            * Thuban/UI/classgen.py (ClassGenDialog.__init__,
5218            (ClassGenDialog.__DoOnGenTypeSelect): Moved initialization of the
5219            different classification types from here to __init__.
5220            (GenUniquePanel.__init__): Set the column width of the first field
5221            in the Field ListCtrl to the full width.
5222    
5223            * Thuban/UI/tableview.py (LayerTableFrame.__init__): Rename 'Save As'
5224            Button to 'Export'. Center Buttons in Selection Box, set Focus to
5225            Grid.
5226            (LayerTableFrame.OnKeyDown()): New, bound to the grid with EVT_KEY_DOWN,
5227            changes focus to the Selection when pressing "Alt-S".
5228    
5229            * Thuban/UI/legend.py (LegendTree.__SetVisibilityStyle): Only gray out
5230            the text if not visible. The italic font sometimes exceeds the
5231            rendering area.
5232    
5233    2003-05-21  Jonathan Coles   <[email protected]>
5234    
5235            * Thuban/UI/dock.py (DockFrame): Rename references to _OnClose
5236            to OnClose so that Thuban closes correctly.
5237    
5238            * Thuban/UI/mainwindow.py (MainWindow.OnClose): Call
5239            DockFrame.OnClose, not DockFrame._OnClose.
5240    
5241    2003-05-21  Jonathan Coles   <[email protected]>
5242    
5243            * Thuban/Model/classgen.py (ClassGenerator.GenQuantiles): Remove
5244            references to 'inf' and use new Range __init__ to pass floats
5245            directly rather than converting them to strings first.
5246            Fixes RTBug #1876.
5247    
5248            * Thuban/Model/classification.py (ClassGroupRange.SetRange):
5249            Use new Range ___init__ to pass floats.
5250    
5251            * Thuban/Model/layer.py (RasterLayer.__init__): Test if the
5252            filename is a valid image file. Throw IOError otherwise.
5253    
5254            * Thuban/Model/range.py: Brought over new Range from SciParam that
5255            is immutable and has an __init__ which can accept floats.
5256    
5257            * Thuban/UI/mainwindow.py (MainWindow.AddLayer): Move OpenShapefile
5258            into try block. AddLayer doesn't throw any exceptions anymore.
5259            (MainWindow.AddRasterLayer): Move constructor of RasterLayer into
5260            try block.
5261    
5262            * Thuban/UI/projdialog.py (GeoPanel.__init__): Put Degrees as
5263            the first item in choices. Fixes RTBug #1882.
5264    
5265            * Thuban/UI/renderer.py (MapRenderer.render_map): Check if scale
5266            has gone to 0 which is a serious problem. abort.
5267            (MapRenderer.draw_raster_layer): Catch IOError seperately and
5268            print the error from GDAL.
5269    
5270            * Thuban/UI/tableview.py (TableGrid.__init__): Call
5271            ToggleEventListeners to turn on listening.
5272            (TableGrid.ToggleEventListeners): New. Turns event listening on
5273            and off so as to prevent excessive messages.
5274            (LayerTableFrame.OnQuery): Use TableGrid.ToggleEventListeners
5275            to suppress excessive messages when selecting many rows.
5276            Fixes RTBug #1880.
5277    
5278            * Thuban/UI/view.py: Added checks against if scale == 0. This
5279            is a serious problem that can occur when an image without
5280            geo data is loading and causes the map projection bounds to
5281            go to infinity. Right now, the solution is to simply try
5282            to recover.
5283    
5284            * extensions/thuban/cpl_mfile.cpp (MFILEClose): Make sure
5285            to set the MFILEReceiver attributes even if the data is NULL.
5286    
5287            * extensions/thuban/gdalwarp.cpp: Improved the error handling
5288            and passed GDAL messages back up to the Python layer. Also
5289            tried to fix some memory leaks that were present in the original
5290            utility but didn't matter because the program aborted.
5291    
5292            * test/test_range.py: Copied over tests from SciParam. Removed
5293            tests against importing. Fixes RTBug #1867.
5294    
5295    2003-05-21  Bernhard Herzog  <[email protected]>
5296    
5297            * test/test_load.py: Remove unused imports and restructure the
5298            test code
5299            (LoadSessionTest): Split into one class for each test and turn
5300            LoadSessionTest itself into the base class for all such session
5301            tests.
5302            (ClassificationTest): New base class for load tests that test
5303            classifications
5304            (TestSingleLayer, TestLayerVisibility, TestClassification)
5305            (TestLabels, TestLayerProjection, TestRasterLayer): New classes
5306            for the individual tests
5307    
5308            * test/support.py (FileLoadTestCase.filename): New base class for
5309            file loading tests
5310    
5311    2003-05-21  Jan-Oliver Wagner <[email protected]>
5312    
5313            * Resources/Projections/defaults.proj: Renamed 'Universal Transverse
5314            Mercator' to 'UTM Zone 32' as a more convenient example.
5315            Added 'Gauss Krueger Zone 6'.
5316    
5317            * Data/iceland_sample_raster.thuban: political polygon now
5318            filled transparent to have the raster image visible at once.
5319    
5320    2003-05-21  Frank Koormann  <[email protected]>
5321    
5322            * Thuban/UI/mainwindow.py (MainWindow): Renamed _OnClose() back to
5323            OnClose() to keep in sync with extensions. Internally Thuban
5324            still uses "underscored" names.
5325    
5326    2003-05-20  Jonathan Coles   <[email protected]>
5327    
5328            This puts back Raster layer support. These layers support projections
5329            through the GDAL library. Currently, the CVS version is being used.
5330            There are no Debian packages available although this may change soon.
5331            A GDAL driver was extended to support writing to memory rather to
5332            files.
5333    
5334            There is still some work that needs to be done, such as some error
5335            handling when loading invalid images or when there is a problem
5336            projecting the image. This putback simply checks in the majority
5337            of the work.
5338    
5339            * setup.py: Add gdalwarp library extension.
5340    
5341            * Thuban/Model/layer.py (BaseLayer.HasClassification): New.
5342            Defaults to False, but can be overridden by subclasses if they
5343            support classification.
5344            (RasterLayer): New. Defines a new layer that represents an
5345            image.
5346    
5347            * Thuban/Model/load.py (SessionLoader.__init__): Add rasterlayer
5348            tag handler.
5349            (SessionLoader.start_layer): Encode the filename.
5350            (SessionLoader.start_rasterlayer, SessionLoader.end_rasterlayer):
5351            New. Supports reading a rasterlayer tag.
5352    
5353            * Thuban/Model/map.py (Map.BoundingBox): Fix typo in comment.
5354    
5355            * Thuban/Model/save.py (XMLWriter.encode): Don't assume that we
5356            get a string in Latin1. If we get such as string convert it to
5357            unicode first, otherwise leave if alone before encoding.
5358            (SessionSaver.write_layer): Add support for writing both Layers
5359            and RasterLayers.
5360    
5361            * Thuban/Model/transientdb.py (AutoTransientTable.SimpleQuery):
5362            The right argument may not be a string, it could also be a Column.
5363    
5364            * Thuban/UI/application.py (ThubanApplication.CreateMainWindow):
5365            Make initial window size 600x400. Fixes RTBug #1872.
5366    
5367            * Thuban/UI/classifier.py (Classifier.__init__): Rearrange how
5368            the dialog is constructed so that we can support layers that
5369            do not have classifications.
5370            (Classifier._OnTry): Only build a classification if the layer
5371            supports one.
5372    
5373            * Thuban/UI/legend.py: Change all checks that a layer is an
5374            instance of Layer into checks against BaseLayer.
5375            (LegendTree.__FillTreeLayer): Only add children to a branch if
5376            the layer supports classification.
5377    
5378            * Thuban/UI/mainwindow.py (MainWindow.NewSession,
5379            MainWindow.OpenSession): Don't proceed with an action if the
5380            user chooses Cancel when they are asked to save changes.
5381            (MainWindow.AddRasterLayer): New. Open a dialog to allow the
5382            user to select an image file. Create a new RasterLayer and add
5383            it to the map.
5384    
5385            * Thuban/UI/renderer.py (MapRenderer.render_map): Add support
5386            for rendering RasterLayer layers.
5387            (MapRenderer.draw_raster_layer): Actually method that calls
5388            the GDALWarp python wrapper and constructs an image from the
5389            data returned.
5390    
5391            * Thuban/UI/tableview.py (LayerTableFrame.__init__): Change the
5392            Choices symbols to match those used in the table query method.
5393            Replace deprecated method calls on table with new method names.
5394    
5395            * Thuban/UI/view.py (MapCanvas.set_view_transform): Try to limit
5396            how small the scale can get. This still needs more testing.
5397    
5398            * extensions/thuban/bmpdataset.cpp: New, but copied from GDAL.
5399            Provides a driver to output in .bmp format.
5400    
5401            * extensions/thuban/cpl_mfile.cpp, extensions/thuban/cpl_mfile.h:
5402            New. Provides IO routines which write to memory, rather than a file.
5403    
5404            * extensions/thuban/gdalwarp.cpp: New, but basically a direct copy
5405            of the gdalwarp utility provided in GDAL. Added function calls
5406            that can be accessed from python.
5407    
5408            * Data/iceland_sample_raster.thuban: New. Sample file that uses
5409            a raster layer.
5410    
5411            * Data/iceland/island.tfw, Data/iceland/island.tif: New. Raster
5412            layer image data.
5413    
5414            * Doc/thuban.dtd: Added rasterlayer attribute definition.
5415    
5416            * test/test_layer.py, test/test_load.py, test/test_save.py: Added
5417            tests associated with the raster layer code.
5418    
5419            * test/test_transientdb.py
5420            (TestTransientTable.test_auto_transient_table_query): Added a test
5421            for using a Column object as the "right" parameter to a query.
5422    
5423    2003-05-19  Frank Koormann  <[email protected]>
5424    
5425            * Thuban/version.py (get_changelog_date):
5426            Catch exceptions if ChangeLog does not exist.
5427    
5428            * Thuban/UI/view.py (MapCanvas.Export): Bugfix
5429    
5430    2003-05-19  Frank Koormann  <[email protected]>
5431    
5432            Extended version information for Thuban
5433    
5434            * Thuban/version.py: New, version information for Thuban: Last
5435            modification date and last ChangeLog entry date.
5436    
5437            * Thuban/UI/mainwindow.py (MainWindow.About()): Extended version
5438            information: Display Thuban, wxPython and Python version.
5439    
5440    2003-05-16  Bernhard Herzog  <[email protected]>
5441    
5442            * Thuban/Model/save.py: Remove some unused imports including the
5443            __future__ import for nested_scopes as Thuban relies on Python 2.2
5444            now.
5445            (XMLWriter.encode): Remove the special case for a None argument.
5446            In the saver encode is always called with a string argument.
5447    
5448    2003-05-16  Bernhard Herzog  <[email protected]>
5449    
5450            * Thuban/UI/__init__.py: Remove the work-around for the locale bug
5451            in wxPython (at least when usinvg wxGTK) prior to 2.4. The symptom
5452            of the bug was that e.g. float("1.2") would fail. Thuban now
5453            requires 2.4.x.
5454            
5455    2003-05-16  Frank Koormann   <[email protected]>
5456    
5457            Printing enhancement and WMF export (under Win32)
5458    
5459            * Thuban/UI/renderer.py (ExportRenderer): New, derived from
5460            ScreenRenderer. Renders Map, Legend and Scalebar for export.
5461            (PrinterRenderer): New, derived from ExportRenderer. Replaces the old
5462            PrintRender.
5463    
5464            * Thuban/UI/view.py (MapPrintout.__init__): Enhanced parameter set
5465            to fullfil information needed for PrinterRenderer.
5466            (MapCanvas.Export): New. Export Map (currently only to WMF on Win32).
5467            (MapCanvas.Print): Adapted to new MapPrintout.
5468            (OutputTransform): General calculations to transform from canvas
5469            coordinates to export/printing devices.
5470    
5471            * Thuban/UI/mainwindow.py (MainWindow.ExportMap()): New. Added also
5472            new method_command to call ExportMap, with platform dependency (only
5473            __WXMSW__)
5474      
5475            * Thuban/UI/scalebar.py (ScaleBar.DrawScaleBar): Position and Size
5476            of scalebar drawing area as new parameters.
5477            
5478            * Thuban/Model/scalebar.py (roundInterval): round long instead of int
5479    
5480            * Thuban/UI/legend.py (ScalebarBitmap.__SetScale):
5481            Update to extended scalebar.DrawScalebar header.
5482    
5483            * test/test_export.py: New, test Thuban.UI.view.OutputTransform()
5484    
5485            * test/test_scalebar.py: Made test executable as standalone.
5486    
5487    2003-05-16  Bernhard Herzog  <[email protected]>
5488    
5489            * Thuban/Model/table.py (Table): Remove this compatibility alias
5490            for DBFTable.
5491    
5492            * test/test_table.py: Import DBFTable as Table because that alias
5493            doesn't exist anymore.
5494    
5495            * Thuban/UI/classgen.py: Remove some unused imports
5496    
5497    2003-05-14  Jonathan Coles   <[email protected]>
5498    
5499            * Thuban/Model/classgen.py (ClassGenerator.GenSingletonsFromList):
5500            Fix docstring.
5501            (ClassGenerator.GenUniformDistribution): Fix spelling of method name.
5502            (ClassGenerator.GenQuantiles): Use the left/right brackets and min/max
5503            values of the supplied range to determine the beginning and end
5504            bounds of the generated classes.
5505    
5506            * Thuban/Model/range.py (Range.number_re): Now accepts floats that
5507            do not have a leading 0 (.5 is now accepted as well as 0.5).
5508    
5509            * Thuban/UI/classgen.py (ClassGenDialog.OnOK): Fix name of method
5510            call to ClassGenerator.GenUniformDistribution.
5511    
5512            * Thuban/UI/projdialog.py (ProjFrame.__do_layout): Fix Windows
5513            layout bug with the 'Projection' label.
5514    
5515            * test/support.py (FloatTestCase): New. Needed for the Range tests.
5516    
5517            * test/test_range.py: New. Imported from SciParam.
5518    
5519    2003-05-12  Jonathan Coles   <[email protected]>
5520    
5521            * Thuban/UI/classgen.py (GenQuantilesPanel.GetList): Replace call
5522            to table.UniqueValues() with calls that retrieve all the values
5523            from the table. This will need to be replaced by a method on table
5524            which can simply return the list (perhaps more efficiently).
5525    
5526    2003-05-12  Jonathan Coles   <[email protected]>
5527    
5528            The return value of ClassGenerator.CalculateQuantiles has changed.
5529            Refer to the documentation for details.
5530    
5531            * test/test_classgen.py: Modified Quantile tests to use the
5532            new return values.
5533    
5534            * Thuban/Model/classgen.py
5535            (ClassGenerator.GenQuantiles): Add comments describing the parameters,
5536            use new return values from CalculateQuantiles to produce the correct
5537            range bounds in the Classification.
5538            (ClassGenerator.CalculateQuantiles): Add more comments describing
5539            the return values and parameters. Make minor adjustments to improve
5540            the legibility of the code. Fix problem with adjusted not being set
5541            in most cases.
5542    
5543    2003-05-12  Frank Koormann <[email protected]>
5544            
5545            * Thuban/Model/save.py (XMLWriter.encode()): Explicite call to unicode
5546            and latin1. Fixes #1851 finally.
5547    
5548    2003-05-09  Jonathan Coles   <[email protected]>
5549    
5550            * test/test_classgen.py: New. Tests the Quantile algorithm.
5551    
5552            * Thuban/Model/classgen.py (ClassGenerator.CalculateQuantiles):
5553            Clean up debugging statement, add comments, fix a small bug in the
5554            returned adjusted percentiles.
5555            
5556    2003-05-09  Jonathan Coles   <[email protected]>
5557    
5558            Introduces Range class from SciParam into the ClassGroupRange class,
5559            and such ranges can now be saved and loaded from disk.
5560    
5561            Quantiles are now available in the Classification Generator.
5562    
5563            Initial support for building Queries on a table. Doesn't do anything
5564            but run some tests.
5565    
5566            * Thuban/Model/classification.py: Explicit imports.
5567            (ClassGroupRange): Use the Range class to store the underlying
5568            range information. The interface remains the same, except for
5569            GetRange(), and you can also supply a Range object as the min
5570            parameter to SetRange or __init__.
5571    
5572            * Thuban/Model/load.py (XMLReader.encode): New. Encodes the given
5573            string appropriately for use in Thuban. Fixes RTbug #1851.
5574            (SessionLoader.end_projection): Handle the context of the
5575            projection tag a bit better by looking at what objects are not
5576            None. There was an assumption that a projection tag for a map
5577            could occur before any layers.
5578            (SessionLoader.start_clrange): Provide backward compatibility for
5579            reading min/max values as well as the new range parameter.
5580    
5581            * Thuban/Model/map.py: Explicit imports.
5582    
5583            * Thuban/Model/resource.py: Import _.
5584            (ProjFileSaver.write): write header using projfile.dtd.
5585    
5586            * Thuban/Model/save.py: Explicit imports.
5587            (XMLWriter.encode): New. Encode the given string from a format
5588            used by Thuban into UTF-8. Fixes RTbug #1851.
5589    
5590            * Thuban/UI/classgen.py: Explicit imports.
5591            (ClassGenDialog.__init__): Clean up the code and add support
5592            for Quantiles.
5593            (ClassGenDialog.OnOK): Add support for Quantiles.
5594            (GenQuantilesPanel): New. Input panel for Quantiles.
5595            (ClassGenerator, CustomRamp, MonochromaticRamp, GreyRamp, RedRamp,
5596            GreenRamp, BlueRamp, HotToColdRamp): Move to Thuban/Model/classgen.py
5597    
5598            * Thuban/Model/classgen.py: New. Contains all the classes named above.
5599    
5600            * Thuban/UI/classifier.py: Explicit imports.
5601            (ClassTable.GetValueAsCust, ClassTable.__ParseInput,
5602            ClassTable.SetValueAsCustom): Reworked to use new Range class.
5603    
5604            * Thuban/UI/legend.py: Explicit imports.
5605    
5606            * Thuban/UI/mainwindow.py: Add support for the Join Dialog. Added
5607            a Table menu and associated method calls.
5608            (MainWindow.choose_color): Removed. No longer needed.
5609    
5610            * Thuban/UI/projdialog.py (ProjFrame.__VerifyButtons): Save button
5611            should be disabled if no projection is selected in the available
5612            list.
5613    
5614            * Thuban/UI/renderer.py: Explicit imports.
5615    
5616            * Thuban/UI/tableview.py (TableGrid.OnRangeSelect): Fix some issues
5617            with correctly selecting the rows and issuing the right events.
5618            Be sure to call Skip() to allow the grid to do some of its own
5619            handling which allows the rows to actually be selected.
5620            (LayerTableGrid.select_shapes): Rename from select_shape. Supports
5621            selecting multiple shapes.
5622            (LayerTableFrame): Support for building Queries.
5623            (LayerTableFrame.select_shapes): Allow multiple shapes to be selected.
5624    
5625            * Thuban/UI/tree.py: Explicit imports.
5626    
5627            * Thuban/UI/view.py (MapCanvas): Delegate "SelectedShapes" so the
5628            table view can call it.
5629    
5630            * test/test_classification.py: Explicit imports.
5631            (TestClassification.test_ClassGroupRange): Fix test for new
5632            Range class.
5633    
5634            * Doc/thuban.dtd: Add range parameter for clrange.
5635    
5636            * Thuban/Model/range.py: Taken from SciParam. Used as the underlying
5637            object in ClassGroupRange, and also uesd for inputting ranges in
5638            the classifer table and elsewhere.
5639    
5640            * Thuban/UI/join.py: New. Initial Join dialog. No real functionality
5641            yet.
5642    
5643    2003-05-09  Frank Koormann <[email protected]>
5644    
5645            * Thuban/UI/scalebar.py (DrawScaleBar): Draw only if interval > 0.0.
5646    
5647    2003-05-08  Frank Koormann <[email protected]>
5648    
5649            Coding style updates
5650    
5651            * test/test_scalebar.py: Replaced tab indentation by spaces.
5652    
5653            * Thuban/UI/scalebar.py: Explicit imports.
5654    
5655    2003-05-08  Frank Koormann <[email protected]>
5656    
5657            * Thuban/UI/scalebar.py
5658            (ScaleBar.DrawScalebar): Format string bug fixed.
5659    
5660    2003-05-08  Frank Koormann <[email protected]>
5661    
5662            Reorganization of scalebar component (no wx in Thuban/Model)
5663    
5664            * Thuban/Model/scalebar.py: Rendering moved to Thuban/UI/scalebar.py
5665            (deriveInterval):
5666            Calculate scalebar interval and unit which fits in width for scale.
5667            (roundInterval): Round float.
5668    
5669            * Thuban/UI/scalebar.py (ScaleBar): Scalebar rendering
5670    
5671            * test/test_scalebar.py: Test for Thuban/Model/scalebar.py methods.
5672    
5673            * Thuban/UI/legend.py: Import Thuban.UI.scalebar
5674    
5675    2003-05-08  Frank Koormann <[email protected]>
5676    
5677            * Thuban/UI/legend.py (ScalebarBitmap.SetCanvas):
5678            Initialize ScaleBar with canvas.map
5679    
5680            * Thuban/Model/scalebar.py (ScaleBar.roundInterval()): New,
5681            round intervals to display smarter lengths
5682            (ScaleBar.DrawScalebar): Draw Scalebar only if the map contains a
5683            layer. If the maps has no projection applied grey the scalebar.
5684    
5685    2003-05-07  Frank Koormann <[email protected]>
5686            
5687            Basic Scalebar features added.
5688    
5689            * Thuban/Model/scalebar.py (ScaleBar): New, scalebar rendering.
5690    
5691            * Thuban/UI/legend.py (LegendPanel): Added scalebar bitmap
5692            (ScaleBarBitmap): New, links the scalebar bitmap with view messages
5693            and the renderer.
5694    
5695            * Thuban/UI/view.py (MapCanvas.set_view_transform): Issue SCALE_CHANGED.
5696    
5697            * Thuban/UI/messages.py: SCALE_CHANGED added.
5698    
5699    2003-05-07  Bernhard Herzog  <[email protected]>
5700    
5701            * Thuban/Model/session.py (Session.__init__): New instance
5702            variable shapestores to hold a list of all open shapestore objects
5703            (Session.ShapeStores): New. Accessor method for the shapestores
5704            list.
5705            (Session._add_shapestore, Session._clean_weak_store_refs): New.
5706            Internal methods to maintain the shapestores list.
5707            (Session.Tables): New. Return all tables open in the session.
5708            (Session.OpenShapefile): Insert the new ShapeStore into the
5709            shapestores list.
5710    
5711            * test/test_session.py (TestSessionSimple.test_initial_state): Add
5712            tests for ShapeStores and Tables
5713            (TestSessionWithContent.test_shape_stores)
5714            (TestSessionWithContent.test_tables): New. Test cases for
5715            ShapeStores and Tables
5716    
5717    2003-05-07  Bernhard Herzog  <[email protected]>
5718    
5719            * Thuban/Model/transientdb.py (TransientTableBase.ReadRowAsDict):
5720            Add comments about the optimizations used.
5721            (AutoTransientTable.ReadValue, TransientTableBase.ReadValue): New.
5722            Implement the ReadValue table interface method.
5723    
5724            * test/test_transientdb.py
5725            (TestTransientTable.run_iceland_political_tests)
5726            (TestTransientTable.test_transient_joined_table): Add tests for
5727            ReadValue
5728    
5729    2003-05-07  Frank Koormann <[email protected]>
5730    
5731            * Resources/Bitmaps/fulllayerextent.xpm,
5732            Resources/Bitmaps/fullselextent.xpm: Replaced the place holders with
5733            new icons.
5734    
5735    2003-05-06  Bernhard Herzog  <[email protected]>
5736    
5737            * Thuban/Model/transientdb.py (AutoTransientTable.SimpleQuery):
5738            New. Simply delegate to the transient table's version.
5739    
5740            * test/test_transientdb.py
5741            (TestTransientTable.test_auto_transient_table_query): New. Test
5742            case for AutoTransientTable's SimpleQuery
5743    
5744    2003-05-06  Bernhard Herzog  <[email protected]>
5745    
5746            * Thuban/Model/transientdb.py (TransientTableBase.SimpleQuery):
5747            Implement a simple query method for the query dialog
5748            (TransientTableBase.create): Add an INTEGER PRIMARY KEY that holds
5749            the row index or shapeid.
5750            (TransientTable.create): Insert the right value of the row index
5751            (TransientJoinedTable.create): Copy the row index of the left
5752            table to the joined result table
5753    
5754            * test/test_transientdb.py
5755            (TestTransientTable.test_transient_table_read_twice): Fix
5756            doc-string
5757            (TestTransientTable.test_transient_table_query): New. Test for the
5758            SimpleQuery method
5759    
5760    2003-05-06  Bernhard Herzog  <[email protected]>
5761    
5762            Convert all table users to use the new table interface. This only
5763            covers Thuban itself, not GREAT-ER or other applications built on
5764            Thuban yet, so the compatibility interface stays in place for the
5765            time being but it now issues DeprecationWarnings.
5766    
5767            Finally, the new Table interface has a new method, HasColumn.
5768    
5769            * Thuban/Model/table.py (OldTableInterfaceMixin): All methods
5770            issue deprecation warnings when they're. The warnings refer to the
5771            caller of the method.
5772            (OldTableInterfaceMixin.__deprecation_warning): New. Helper method
5773            for the deprecation warnings
5774    
5775            * test/test_table.py: Ignore the deprecation warnings for the old
5776            table in the tests in this module. The purpose of the tests is to
5777            test the old interface, after all.
5778    
5779            * test/test_transientdb.py
5780            (TestTransientTable.run_iceland_political_tests): Use the
5781            constants for the types. Add a test for HasColumn
5782            (TestTransientTable.test_transient_joined_table): Adapt to new
5783            table interface. Add a test for HasColumn
5784            (TestTransientTable.test_transient_table_read_twice): Adapt to new
5785            table interface
5786    
5787            * Thuban/UI/tableview.py (DataTable.SetTable, DataTable.GetValue):
5788            Adapt to new table interface
5789    
5790            * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Adapt to
5791            new table interface
5792    
5793            * Thuban/UI/controls.py (RecordListCtrl.fill_list)
5794            (RecordTable.SetTable): Adapt to new table interface
5795    
5796            * Thuban/UI/classifier.py (Classifier.__init__)
5797            (Classifier.__init__): Adapt to new table interface
5798    
5799            * Thuban/UI/classgen.py (ClassGenDialog.__init__)
5800            (GenUniformPanel._OnRetrieve, GenUniquePanel._OnRetrieve): Adapt
5801            to new table interface
5802    
5803            * Thuban/Model/transientdb.py (TransientTableBase.HasColumn)
5804            (AutoTransientTable.HasColumn): Implement the new table interface
5805            method
5806            (AutoTransientTable.ReadRowAsDict, AutoTransientTable.ValueRange)
5807            (AutoTransientTable.UniqueValues): Adapt to new table interface
5808    
5809            * Thuban/Model/layer.py (Layer.SetShapeStore, Layer.GetFieldType):
5810            Adapt to new table interface
5811    
5812            * test/test_layer.py (TestLayer.open_shapefile): Helper method to
5813            simplify opening shapefiles a bit easier.
5814            (TestLayer.test_arc_layer, TestLayer.test_polygon_layer)
5815            (TestLayer.test_point_layer): Use the new helper method
5816            (TestLayer.test_get_field_type): New. Test for the GetFieldType
5817            method
5818    
5819            * test/test_dbf_table.py (TestDBFTable.test_has_column): Test for
5820            the new table method
5821    
5822            * test/test_memory_table.py (TestMemoryTable.test_has_column):
5823            Test for the new table method HasColumn
5824    
5825    2003-05-06  Jonathan Coles   <[email protected]>
5826    
5827            Addresses the "Selection Extent" wish of RTbug #1787.
5828    
5829            * Resources/Bitmaps/fulllayerextent.xpm,
5830            Resources/Bitmaps/fullselextent.xpm: Bitmaps for layer and selection
5831            extent. These are just place holders for the real bitmaps.
5832    
5833            * Thuban/Model/layer.py (Shape): Since a Shape is immutable only
5834            calculate the bounding box once (the first time compute_bbox() is
5835            called).
5836            (Layer.ShapesBoundingBox): New. Given a list of shape ids, return
5837            the bounding box for the shapes in lat/long coordinates.
5838    
5839            * Thuban/UI/mainwindow.py: Added new "Full selection extent" menu
5840            option.
5841            (MainWindow.has_selected_shapes): New. Returns true if there are
5842            any selected shapes.
5843            (MainWindow.FullSelectionExtent): New. Calls
5844            MapCanvas.FitSelectedToWindow() when the user selects the menu option.
5845            (_has_selected_shapes): New. Returns true if there are any
5846            selected shapes.
5847    
5848            * Thuban/UI/selection.py (Selection.HasSelectedShapes): New. Returns
5849            true if there are any selected shapes.
5850    
5851            * Thuban/UI/view.py (MapCanvas): Added delegated method
5852            HasSelectedShapes.
5853            (MapCanvas.FitSelectedToWindow): New. Centers and scales any selected
5854            shapes on the canvas using the map projection (if any).
5855    
5856            * test/test_layer.py (TestLayer.test_arc_layer): Add some tests
5857            for Layer.ShapesBoundingBox().
5858    
5859    2003-05-06  Bernhard Herzog  <[email protected]>
5860    
5861            * Resources/Projections/defaults.proj: Fix spelling of Mercator
5862    
5863    2003-05-05  Jonathan Coles   <[email protected]>
5864    
5865            Addresses the "Full Layer Extent" wish of RTbug #1787.
5866    
5867            * Resources/Projections/defaults.proj: Added UK National Grid.
5868    
5869            * Thuban/UI/mainwindow.py: Added new "Full layer extent" menu option.
5870            (MainWindow.FullLayerExtent): New. Calls MapCanvas.FitLayerToWindow()
5871            when the user selects the menu option.
5872    
5873            * Thuban/UI/view.py (MapCanvas.FitLayerToWindow): New. Centers and
5874            scales the given layer on the canvas using the map projection.
5875    
5876    2003-05-05  Bernhard Herzog  <[email protected]>
5877    
5878            Convert the table implementations to a new table interface. All
5879            tables use a common mixin class to provide backwards compatibility
5880            until all table users have been updated.
5881    
5882            * Thuban/Model/table.py (OldTableInterfaceMixin): Mixin class to
5883            provide backwards compatibility for table classes implementing the
5884            new interface
5885            (DBFTable, MemoryTable): Implement the new table interface. Use
5886            OldTableInterfaceMixin as base for compatibility
5887            (DBFColumn, MemoryColumn): New. Column description for DBFTable
5888            and MemoryTable resp.
5889    
5890            * test/test_dbf_table.py: New. Test cases for the DBFTable with
5891            the new table interface.
5892    
5893            * test/test_memory_table.py: New. Test cases for the MemoryTable
5894            with the new table interface.
5895    
5896            * test/test_table.py: Document the all tests in this file as only
5897            for backwards compatibility. The equivalent tests for the new
5898            interface are in test_memory_table.py and test_dbf_table.py
5899            (MemoryTableTest.test_read): field_info should be returning tuples
5900            with four items
5901            (MemoryTableTest.test_write): Make doc-string a more precise.
5902    
5903            * Thuban/Model/transientdb.py (TransientTableBase): Convert to new
5904            table interface. Derive from from OldTableInterfaceMixin for
5905            compatibility.
5906            (TransientTableBase.create): New intance variable column_map to
5907            map from names and indices to column objects
5908            (TransientTable.create): Use the new table interface of the input
5909            table
5910            (AutoTransientTable): Convert to new table interface. Derive from
5911            from OldTableInterfaceMixin for compatibility.
5912            (AutoTransientTable.write_record): Removed. It's not implemented
5913            yet and we still have to decide how to handle writing with the new
5914            table and data framework.
5915    
5916            * test/test_transientdb.py
5917            (TestTransientTable.run_iceland_political_tests)
5918            (TestTransientTable.test_transient_joined_table): Use the new
5919            table interface
5920    
5921    2003-05-05  Jonathan Coles   <[email protected]>
5922    
5923            This is namely a collection of UI updates to improve user interactivity.
5924            Tabbing between controls now exists and you can use ESC to close dialog
5925            boxes; ENTER will active the default button.
5926    
5927            * Thuban/UI/classgen.py (ClassGenDialog.__init__): Rearrange the
5928            order that the controls are created so that tabbing works correctly.
5929            (ClassGenDialog.OnOK): Renamed from _OnGenerate() so that the
5930            wxDialog can handle the default button correctly.
5931            (ClassGenDialog.OnCancel): Renamed from _OnCloseBtn() for the
5932            same reasons as for OnOK.
5933            (GenUniformPanel._OnRetrieve): Call wxBeginBusyCursor/wxEndBusyCursor
5934            when we ask the table for the maximum/minimum values of a field
5935            which could take a very long time.
5936    
5937            * Thuban/UI/classifier.py (Classifier.__init__): Rearrange the
5938            order that the controls are created so that tabbing works correctly.
5939            (SelectPropertiesDialog.__init__): Rearrange the order that the
5940            controls are created so that tabbing works correctly.
5941    
5942            * Thuban/UI/dialogs.py: Copied NonModalDialog box and changed it
5943            to derive from a wxDialog but behave like the original implementation
5944            which was derived from a wxFrame. wxDialog provides useful key
5945            handling functionality like ESC calling OnCancel and ENTER calling
5946            OnOK which is lost with wxFrame.
5947    
5948            * Thuban/UI/mainwindow.py: Add "..." to menu items that will open
5949            new dialogs.
5950    
5951            * Thuban/UI/projdialog.py (ProjFrame.__init__): Rearrange the
5952            order that the controls are created so that tabbing works correctly.
5953            (ProjFrame.OnApply): Renamed from _OnTry() to use wxDialog behaviour.
5954            (ProjFrame.OnOK): Renamed from _OnOK() to use wxDialog behaviour.
5955            (ProjFrame.OnCancel): Renamed from _OnClose() to use wxDialog behaviour.
5956            (ProjPanel.__init__): Add "Airy" to the list of ellipsoids so we
5957            can provide the "UK National Grid" as a default projection.
5958            (UTMPanel.__init__): Rearrange the order that the controls are
5959            created so that tabbing works correctly.
5960    
5961    2003-05-05  Bernhard Herzog  <[email protected]>
5962    
5963            * extensions/thuban/wxproj.cpp: Fix some of the comments.
5964            (project_point): If a map projection but no layer projection is
5965            given, convert degrees to radians before applying the map
5966            projection.
5967    
5968            * Thuban/UI/tableview.py (TableGrid.disallow_messages)
5969            (TableGrid.allow_messages): New methods to make it possible to
5970            inhibit message sending.
5971            (TableGrid.issue): Only send the message if not inhibited.
5972            (LayerTableGrid.select_shape): Use the new methods to make sure
5973            that no ROW_SELECTED message is sent while we're updating the
5974            selected rows to match the selected shapes.
5975    
5976    2003-05-02  Jan-Oliver Wagner <[email protected]>
5977    
5978            Implementation of MemoryTable.
5979    
5980            * Thuban/Model/table.py (MemoryTable): New. Quite simple table
5981            implementation that operates on a list of tuples. All of the data
5982            are kept in the memory.
5983    
5984            * test/test_table.py (MemoryTableTest): New.
5985    
5986            * test/test_transientdb.py (SimpleTable): Removed.
5987            (TestTransientTable.test_transient_joined_table,
5988            (TestTransientTable.test_transient_table_read_twice): Replaced
5989            SimpleTable by MemoryTable.
5990    
5991    2003-04-30  Jonathan Coles   <[email protected]>
5992    
5993            * Data/iceland_sample.thuban: Now contains correct projections
5994            for each of the layers.
5995    
5996            * Resources/Projections/defaults.proj: Geographic projection
5997            contains unit conversion parameter.
5998    
5999    2003-04-30  Jonathan Coles   <[email protected]>
6000    
6001            The most important part of this putback is the projection changes.
6002            It should now be possible to specify the projection that a layer
6003            is in and then specify a different projection for the map. The
6004            projection dialog has an extra parameter for a geographic projection
6005            which lets the user select if the input is in degrees or radians.
6006    
6007            * Thuban/Model/layer.py (Layer.ShapesInRegion): Fix docstring
6008            to say that the parameter is a tuple of unprojected
6009            points (which is what the callers to this method were assuming).
6010            Also, since the points are unprojected we need to projected them.
6011    
6012            * Thuban/UI/legend.py (LegendTree.MoveCurrentItemUp,
6013            LegendTree.MoveCurrentItemDown): If the layer or any of the layer's
6014            groups are selected, move the layer up/down. Fixes RTbug #1833.
6015    
6016            * Thuban/UI/mainwindow.py: Move menu item map_rename up.
6017    
6018            * Thuban/UI/projdialog.py (ProjFrame._OnSave): Add missing
6019            parameter in call to SetClientData.
6020            (GeoPanel): Add support for selecting the units that the
6021            source data is in (Radians or Degrees).
6022    
6023            * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Optimize
6024            the rendering loop by reducing the number of if's, removing the
6025            unnecessary try/except block, and checking if the old group
6026            is the same as the new one (which happens a lot if there is
6027            no classification, or lots of shapes are in the same group).
6028    
6029            * Thuban/UI/view.py (MapCanvas.OnPaint): Add a try/except block
6030            around the redraw routine to try to catch problems that the user
6031            may create by selecting invalid projections for the data set and
6032            map. Clears the display if there are any problems and prints the
6033            error.
6034            (MapCanvas.do_redraw): Use DC.Clear() instead of drawing a filled
6035            rectangle.
6036    
6037            * extensions/thuban/wxproj.cpp (project_point): First invert the
6038            supplied point (which should be in projected coordinates) using
6039            the layer's projection and then project the point using the
6040            map's projection.
6041            (project_points): Use project_point() to project each point.
6042    
6043    2003-04-30  Jan-Oliver Wagner <[email protected]>
6044    
6045            * Thuban/Model/layer.py (Layer.SetShapeStore): Fixed a bug:
6046            don't set the Classification to None if the classfication field
6047            is None (ie only a DEFAULT).
6048    
6049    2003-04-30  Bernhard Herzog  <[email protected]>
6050    
6051            * Thuban/UI/view.py: Fix some typos.
6052    
6053            * Thuban/UI/mainwindow.py (MainWindow.identify_view_on_demand): Do
6054            not pop up the dialog if the selection becomes empty (this could
6055            happen if e.g. a new selection is opened while the identify tool
6056            is active and dialog had been closed)
6057    
6058    2003-04-30  Bernhard Herzog  <[email protected]>
6059    
6060            * Thuban/Model/transientdb.py (TransientTableBase.__init__): New
6061            instance variable read_record_last_result
6062            (TransientTableBase.read_record): Make sure reading the same
6063            record twice works. The implementation uses the new instance
6064            variable read_record_last_result
6065    
6066            * test/test_transientdb.py
6067            (TestTransientTable.test_transient_table_read_twice): New test
6068            case for the above bug-fix.
6069    
6070    2003-04-29  Jonathan Coles   <[email protected]>
6071    
6072            * Thuban/common.py: Removed. No longer needed Str2Num. RTbug #1832.
6073    
6074            * Thuban/UI/classgen.py: Remove all uses of Str2Num.
6075    
6076            * Thuban/UI/classifier.py: Remove all uses of Str2Num.
6077            (ClassTable.SetValueAsCustom): Rename keyword argument in
6078            ClassGroup* constructors to match argument name.
6079    
6080    2003-04-29  Bernhard Herzog  <[email protected]>
6081    
6082            * Thuban/Model/session.py (Session.Destroy): Explicitly close the
6083            transient DB if it exists to make sure it doesn't leave a journal
6084            file in the temp directory.
6085    
6086            * Thuban/Model/transientdb.py (TransientDatabase.close): Set
6087            self.conn to None after closing the connection to make sure it's
6088            not closed twice
6089    
6090    2003-04-29  Jonathan Coles   <[email protected]>
6091    
6092            Add a visible parameter in the layer XML tag. The default value is
6093            "true". If anything other than "false" is specified we also assume
6094            "true". Addresses RTbug #1025.
6095    
6096            * Doc/thuban.dtd: Add visible parameter to a layer.
6097    
6098            * Thuban/Model/layer.py (BaseLayer.__init__): Change default value
6099            of visible from 1 to True.
6100            (Layer.__init__): Change default value of visible from 1 to True.
6101    
6102            * Thuban/Model/load.py (SessionLoader.start_layer): Read visible
6103            parameter.
6104    
6105            * Thuban/Model/save.py (SessionSaver.write_layer): Save visible
6106            parameter.
6107    
6108            * test/test_load.py: Add new test data contents_test_visible.
6109            (LoadSessionTest.setUp): save test data.
6110            (LoadSessionTest.testLayerVisibility): Test if the visible flag
6111            is loaded correctly.
6112    
6113            * test/test_save.py (SaveSessionTest.testSingleLayer): Add test
6114            for saving an invisible layer.
6115    
6116    2003-04-29  Jonathan Coles   <[email protected]>
6117    
6118            * Thuban/UI/mainwindow.py (MainWindow.SetMap): Look up the
6119            legend dialog box and tell it to change its map to the one
6120            supplied to SetMap(). Fixes RTbug #1770.
6121    
6122    2003-04-29  Bernhard Herzog  <[email protected]>
6123    
6124            Next step of table implementation. Introduce a transient database
6125            using SQLite that some of the data is copied to on demand. This
6126            allows us to do joins and other operations that require an index
6127            for good performance with reasonable efficiency. Thuban now needs
6128            SQLite 2.8.0 and pysqlite 0.4.1. Older versions may work but I
6129            haven't tested that.
6130            
6131            * Thuban/Model/transientdb.py: New. Transient database
6132            implementation.
6133    
6134            * test/test_transientdb.py: New. Tests for the transient DB
6135            classes.
6136    
6137            * Thuban/Model/session.py (AutoRemoveFile, AutoRemoveDir): New
6138            classes to help automatically remove temporary files and
6139            directories.
6140            (Session.__init__): New instance variables temp_dir for the
6141            temporary directory and transient_db for the SQLite database
6142            (Session.temp_directory): New. Create a temporary directory if not
6143            yet done and return its name. Use AutoRemoveDir to have it
6144            automatically deleted
6145            (Session.TransientDB): Instantiate the transient database if not
6146            done yet and return it.
6147    
6148            * Thuban/Model/data.py (ShapefileStore.__init__): Use an
6149            AutoTransientTable so that data is copied to the transient DB on
6150            demand.
6151            (SimpleStore): New class that simply combines a table and a
6152            shapefile
6153    
6154            * Thuban/Model/table.py (Table, DBFTable): Rename Table into
6155            DBFTable and update its doc-string to reflect the fact that this
6156            is only the table interface to a DBF file. Table is now an alias
6157            for DBFTable for temporary backwards compatibility.
6158    
6159            * Thuban/UI/application.py (ThubanApplication.OnExit): Make sure
6160            the last reference to the session goes away so that the temporary
6161            files are removed properly.
6162    
6163            * test/test_load.py (LoadSessionTest.tearDown): Remove the
6164            reference to the session to make sure the temporary files are
6165            removed.
6166    
6167    2003-04-29  Bernhard Herzog  <[email protected]>
6168    
6169            * Thuban/Model/load.py (XMLReader.__init__, XMLReader.read): Turn
6170            the __parser instance variable into a normal local variable in
6171            read. It's only used there and read will never be called more than
6172            once. Plus it introduces a reference cycle that keeps can keep the
6173            session object alive for a long time.
6174    
6175    2003-04-29  Jonathan Coles   <[email protected]>
6176    
6177            * Thuban/Model/proj.py (Projection): Removed Set*() methods to make
6178            Projection an immutable item. Fixes RTbug #1825.
6179            (Projection.__init__): Initialize instance variables here.
6180            (ProjFile.Replace): New. Replace the given projection object with
6181            the new projection object. This solves the problem of needing the
6182            mutator Projection.SetProjection() in the ProjFrame class and
6183            allows a projection to change parameters without changing its
6184            location in the file.
6185    
6186            * Thuban/UI/mainwindow.py (MainWindow.SaveSessionAs): Dialog should
6187            be of type wxSAVE and should verify overwriting a file.
6188    
6189            * Thuban/UI/projdialog.py (ProjFrame._OnSave): Use the new
6190            ProjFile.Replace() method instead of the mutator
6191            Projection.SetProjection(). Also requires that we reassign the
6192            client data to the new projection.
6193    
6194            * test/test_proj.py (TestProjection.test): Test GetName() and
6195            GetAllParameters()
6196            (TestProjFile.test): Remove tests for Set*() methods. Add tests
6197            for Replace().
6198    
6199    2003-04-25  Jonathan Coles   <[email protected]>
6200    
6201            * Thuban/Model/save.py (SessionSaver.write_projection): Make sure
6202            to save the name of the projection.
6203    
6204            * test/test_save.py (SaveSessionTest.testLayerProjection): New
6205            test to verify layer projections are saved correctly.
6206    
6207    2003-04-25  Jonathan Coles   <[email protected]>
6208    
6209            * Thuban/Model/proj.py (Projection.SetName): Set the name
6210            to "Unknown" if name is None.
6211            (Projection.SetAllParameters): New. Set the projection's
6212            parameter list to the one supplied.
6213            (Projection.SetProjection): New. Set the projection's
6214            properties to those of the supplied Projection.
6215    
6216            * Thuban/UI/mainwindow.py (MainWindow.MapProjection): Set
6217            the dialog title to include the map's title.
6218            (MainWindow.LayerProjection): Set the dialog title to include
6219            the layer's title.
6220    
6221            * Thuban/UI/projdialog.py (ProjFrame.__ShowError): Consolidate
6222            error dialogs into a single method call.
6223            (ProjFrame.__VerifyButtons): Add more states to check.
6224            (ProjFrame.__GetProjection): Return the current state of an
6225            edited projection or None.
6226            (ProjFrame.__FillAvailList): Remove checks for states that
6227            shouldn't exist.
6228            (ProjFrame._OnNew): Clear all selected items and supply
6229            a projection panel if necessary.
6230    
6231            * test/test_proj.py (TestProjFile.test): Add tests for
6232            ProjFile.SetAllParameters, ProjFile.SetProjection,
6233            ProjFile.SetName.
6234    
6235    2003-04-25  Jonathan Coles   <[email protected]>
6236    
6237            * Thuban/UI/projdialog.py (ProjFrame.__FillAvailList): Now
6238            takes an optional argument to select the current projection.
6239            This does not guarantee that the item is visible due to
6240            limited wxWindows functionality. Fixes RTBug #1821.
6241    
6242    2003-04-25  Jonathan Coles   <[email protected]>
6243    
6244            * Thuban/Model/load.py (SessionLoader.start_projection): Remember
6245            the projection name and use it when constructing the Projection
6246            object.
6247    
6248            * Thuban/Model/proj.py (Projection.__init__): Change the default
6249            value for 'name' to None and then test if name is equal to None
6250            in the body of the constructor. This way the caller doesn't have to
6251            know what the default value should be. Namely, useful in load.py
6252            where we have to pick a default value if the 'name' parameter
6253            doesn't exist in the XML file.
6254    
6255            * test/test_load.py (LoadSessionTest.testLayerProjection): New.
6256            Tests a file where a layer has a projection.
6257    
6258    2003-04-25  Jonathan Coles   <[email protected]>
6259    
6260            * Thuban/Model/layer.py (Layer.TreeInfo): Add an item to the
6261            tree for projection information.
6262    
6263            * Thuban/Model/load.py (XMLReader.GetFilename): Renamed from
6264            XMLReader.GetFileName.
6265            (SessionLoader): Added support for loading projection tags that
6266            appear inside a layer.
6267    
6268            * Thuban/Model/proj.py (ProjFile): Document the class. Move
6269            back to using a list because the order of the projections in
6270            the file is important to maintain. Fixes RTbug #1817.
6271    
6272            * Thuban/Model/resource.py: Rename calls to ProjFile.GetFileName
6273            to ProjFile.GetFilename.
6274    
6275            * Thuban/Model/save.py (SessionSaver.write_layer): Save projection
6276            information.
6277    
6278            * Thuban/UI/projdialog.py (ProjFrame._OnAddToList): Renamed from
6279            ProjFrame._OnSaveAs. Removed old dead code from previous
6280            implementation.
6281            (ProjFrame._OnExport): Add support for exporting more than one
6282            projection to a single file.
6283            (ProjFrame.__FillAvailList): use string formatting (% operator)
6284            to build strings that are (partly) translated. Fixes RTbug #1818.
6285    
6286            * test/test_proj.py (TestProjFile.test): New. Tests the base ProjFile
6287            class.
6288    
6289    2003-04-24  Bernhard Herzog  <[email protected]>
6290    
6291            * po/es.po: Updated Spanish translation by Daniel Calvelo Aros
6292    
6293            * po/fr.po: New. French translation by Daniel Calvelo Aros
6294    
6295            * Thuban/UI/projdialog.py (ProjFrame._OnSaveAs): Don't translate
6296            empty strings.
6297    
6298    2003-04-24  Jonathan Coles   <[email protected]>
6299    
6300            * Thuban/Model/layer.py (Layer.GetProjection): New. Needed to
6301            implement the interface that the ProjFrame dialog expects.
6302    
6303            * Thuban/Model/proj.py (Projection.SetName): New. Allows the
6304            name of the projection to be changed.
6305            (ProjFile): Use a dictionary instead of a list so that removing
6306            projections is easier and we are sure about uniqueness.
6307            (ProjFile.Remove): Remove the given projection object.
6308    
6309            * Thuban/Model/resource.py (GetSystemProjFiles, GetUserProjFiles):
6310            Return a list with only one projection file instead of searching for
6311            any projection file. This simplifies many things if the user can
6312            only have one system file and one user file.
6313    
6314            * Thuban/UI/classgen.py: Change all references to
6315            genCombo to genChoice.
6316    
6317            * Thuban/UI/mainwindow.py: Add a Projection option under the
6318            layer menu.
6319            (MainWindow.LayerProjection): New. Open up a projection window
6320            for a layer.
6321    
6322            * Thuban/UI/projdialog.py: Large changes to how the dialog is
6323            laid out. Use three panels instead of one. One for the list of
6324            projections, one for the edit controls, and one for the buttons.
6325            Fixed resizing problems so that the dialog resizes correctly
6326            when the projection panel changes. Added import/export, save, and
6327            new buttons/functionality.
6328    
6329    2003-04-24  Bernhard Herzog  <[email protected]>
6330    
6331            First step towards table management. Introduce a simple data
6332            abstraction so that we replace the data a layer uses more easily
6333            in the next step.
6334    
6335            * Thuban/Model/data.py: New file with a simple data abstraction
6336            that bundles shapefile and dbffile into one object.
6337    
6338            * Thuban/Model/session.py (Session.OpenShapefile): New method to
6339            open shapefiles and return a shape store object
6340    
6341            * Thuban/Model/layer.py (Layer.__init__): Pass the data as a store
6342            object instead of a shapefile filename. This introduces a new
6343            instance variable store holding the datastore. For intermediate
6344            backwards compatibility keep the old instance variables.
6345            (open_shapefile): Removed. No longer needed with the shape store.
6346            (Layer.SetShapeStore, Layer.ShapeStore): New methods to set and
6347            get the shape store used by a layer.
6348            (Layer.Destroy): No need to explicitly destroy the shapefile or
6349            table anymore.
6350    
6351            * Thuban/UI/mainwindow.py (MainWindow.AddLayer)
6352            (MainWindow.AddLayer): Use the session's OpenShapefile method to
6353            open shapefiles
6354    
6355            * Thuban/Model/load.py (ProcessSession.start_layer): Use the
6356            session's OpenShapefile method to open shapefiles
6357    
6358            * test/test_classification.py
6359            (TestClassification.test_classification): Use the session's
6360            OpenShapefile method to open shapefiles and build the filename in
6361            a more platform independed way
6362    
6363            * test/test_layer.py (TestLayer.setUp, TestLayer.tearDown):
6364            Implement to have a session to use in the tests
6365            (TestLayer.test_arc_layer, TestLayer.test_polygon_layer)
6366            (TestLayer.test_point_layer, TestLayer.test_empty_layer): Use the
6367            session's OpenShapefile method to open shapefiles
6368            (TestLayerLegend.setUp): Instantiate a session so that we can use
6369            it to open shapefiles.
6370            (TestLayerLegend.tearDown): Make sure that all references to
6371            layers and session are removed otherwise we may get a resource
6372            leak
6373    
6374            * test/test_map.py (TestMapAddLayer.test_add_layer)
6375            (TestMapWithContents.setUp): Instantiate a session so that we can
6376            use it to open shapefiles.
6377            (TestMapWithContents.tearDown): Make sure that all references to
6378            layers, maps and sessions are removed otherwise we may get a
6379            resource leak
6380            ("__main__"): use support.run_tests() so that more info about
6381            uncollected garbage is printed
6382    
6383            * test/test_save.py (SaveSessionTest.testSingleLayer): Use the
6384            session's OpenShapefile method to open shapefiles
6385            ("__main__"): use support.run_tests() so that more info about
6386            uncollected garbage is printed
6387    
6388            * test/test_selection.py (TestSelection.tearDown): Make sure that
6389            all references to the session and the selection are removed
6390            otherwise we may get a resource leak
6391            (TestSelection.get_layer): Instantiate a session so that we can
6392            use it to open shapefiles.
6393            ("__main__"): use support.run_tests() so that more info about
6394            uncollected garbage is printed
6395    
6396            * test/test_session.py (TestSessionBase.tearDown)
6397            (TestSessionWithContent.tearDown): Make sure that all references
6398            to the session and layers are removed otherwise we may get a
6399            resource leak
6400            (TestSessionWithContent.setUp): Use the session's OpenShapefile
6401            method to open shapefiles
6402    
6403    2003-04-24  Jonathan Coles   <[email protected]>
6404    
6405            * Thuban/Model/load.py (XMLReader.read): Should have been checking
6406            if the file_or_filename object had the 'read' attribute.
6407    
6408    2003-04-23  Jonathan Coles   <[email protected]>
6409    
6410            * Thuban/Model/resource.py: Fixes RTbug #1813.
6411            (ReadProjFile): Add documentation about which exceptions are raised.
6412            Always pass the exceptions up to the caller.
6413            (GetProjFiles): If the directory can't be read return an empty list.
6414            If any of the proj files can't be read skip that file and go
6415            on to the next one.
6416    
6417            * test/test_proj.py: Added test cases to handle nonexistent files,
6418            unreadable files, and files that don't parse correctly.
6419    
6420    2003-04-23  Jonathan Coles   <[email protected]>
6421    
6422            Projection dialog. Allows the user to select from a list
6423            of projection templates and optionally edit them and save new ones.
6424    
6425            * Thuban/UI/projdialog.py (ProjFrame): New. Main dialog.
6426            (ProjPanel): Base class for projection specific panels.
6427            (TMPanel): Projection panel for Transverse Mercartor.
6428            (UTMPanel): Projection panel for Universal Transverse Mercartor.
6429            (LCCPanel): Projection panel for Lambert Conic Conformal.
6430            (GeoPanel): Projetion panel for Geographic Projection.
6431    
6432    2003-04-23  Jonathan Coles   <[email protected]>
6433    
6434            * Thuban/Model/load.py (XMLReader): Renamed from XMLProcessor to
6435            promote symmetry. There now exists XMLReader and XMLWriter.
6436            (XMLReader.read): New. Call to read the given file descriptor or
6437            filename.
6438            (XMLReader.close): New. Make sure the file is closed.
6439            (XMLReader.GetFileName): New. Return just the file name that is being
6440            read from.
6441            (XMLReader.GetDirectory): New. Return just the directory of the file
6442            that is being read.
6443            (XMLReader.AddDispatchers): New. Take a dictionary which contains
6444            the names of functions to call as the XML tree is parsed.
6445            (XMLReader.startElementNS): Updated to use new dispatcher dictionary.
6446            (XMLReader.endElementNS): Updated to use new dispatcher dictionary.
6447            (SessionLoader): Removed class variables start_dispatcher and
6448            end_dispatcher since this functionality is now part of a class
6449            instance. Fixes RTbug #1808.
6450            (SessionLoader.__init__): Add dispatcher functions.
6451            (load_xmlfile): Code was moved into the XMLReader.read().
6452            (load_session): Use modified SessionLoader.
6453    
6454            * Thuban/Model/map.py (Map.GetProjection): New. Returns the
6455            map's projection.
6456    
6457            * Thuban/Model/proj.py (Projection.GetParameters): Renamed to
6458            GetAllParameters.
6459            (Projection.GetParameter): Returns the value for the given parameter.
6460    
6461            * Thuban/Model/resource.py: Use XMLReader and XMLWriter.
6462            (GetProjFiles): Renamed from GetProjections. Now returns a list
6463            of ProjFile objects.
6464            (GetSystemProjFiles): Renamed from GetSuppliedProjections. Returns
6465            a list of ProjFile objects whose files are not user defined.
6466            (GetUserProjFiles): Renamed from GetUserProjections. Returns a
6467            list of ProjFile objects whose files are user defined.
6468            (ProjFileReader): Extend new XMLReader.
6469    
6470            * Thuban/Model/save.py (XMLWriter): Renamed from XMLSaver to
6471            promote symmetry.
6472    
6473            * Thuban/UI/classgen.py (ClassGenDialog.__init__): Use a wxChoice
6474            control instead of a wxComboBox. wxChoice controls do not generate
6475            events as the uses highlights possible choices which fixes problems
6476            with resizing the dialog when the use selects an option.
6477    
6478            * Thuban/UI/classifier.py (Classifier.__init__): Use a wxChoice
6479            control instead of a wxComboBox.
6480    
6481            * Thuban/UI/mainwindow.py (MainWindow.Projection): Use new projection
6482            dialog.
6483    
6484            * test/test_proj.py (TestProjection.test): New tests for GetParameter
6485            method.
6486    
6487    2003-04-22  Bernhard Herzog  <[email protected]>
6488    
6489            * Thuban/UI/mainwindow.py: Remove some unused imports and global
6490            constants
6491    
6492            * Thuban/UI/identifyview.py (IdentifyListCtrl.selected_shape)
6493            (IdentifyGridCtrl.selected_shape): Use table, not shapetable.
6494    
6495    2003-04-17  Bernhard Herzog  <[email protected]>
6496    
6497            * Thuban/Model/layer.py: Don't import LAYER_LEGEND_CHANGED.
6498            (Layer): Update doc-string since LAYER_LEGEND_CHANGED is not used
6499            anymore.
6500            (Layer.BoundingBox, Layer.GetFieldType, Layer.NumShapes)
6501            (Layer.ShapeType, Layer.Shape): No need to call
6502            self.open_shapefile since it's always called in __init__
6503    
6504            * Thuban/UI/application.py (ThubanApplication.MainLoop): Removed.
6505            In wxPython 2.4 there's no need to extend MainLoop anymore since
6506            wxPython itself makes sure OnExit is called.
6507    
6508    2003-04-16  Jonathan Coles   <[email protected]>
6509    
6510            Initial putback of projection management code. Includes new
6511            classes to read and write projection files. The current load
6512            and save classes were abstracted a bit so they could be reused.
6513            The Projection class was extended to provide new methods and
6514            have a name.
6515    
6516            * Thuban/Model/load.py (XMLProcessor): New. Contains all the
6517            general XML reading methods that were part of ProcessSession.
6518    
6519            * Thuban/Model/proj.py (Projection.__init__): Accepts an optional
6520            name.
6521            (ProjFile): New. Represents a file that contains projection
6522            information.
6523    
6524            * Thuban/Model/resource.py: New. Contains general utilities
6525            for read and writing projection files.
6526    
6527            * Thuban/Model/save.py (XMLSaver): New. Contains all the
6528            general XML writing methods that were part of SessionSaver.
6529            (SessionSaver): Renamed from Saver.
6530    
6531            * test/test_proj.py: New test cases for the projection
6532            file read and write functions.
6533    
6534    2003-04-16  Jonathan Coles   <[email protected]>
6535    
6536            * Thuban/Model/classification.py: Use repr() around values
6537            in the ClassGroup*.__repr__() methods so it is clearer when
6538            a value is a string and when it is a number.
6539    
6540            * test/test_load.py: Rework the classification test to test
6541            that we can load old files.
6542            (testLabels): Test a file where the groups have labels.
6543    
6544    2003-04-16  Bernhard Herzog  <[email protected]>
6545    
6546            Safer implementation of the performance enhancements of the
6547            low-level renderer:
6548            
6549            * extensions/thuban/wxproj.cpp (extract_projection)
6550            (extract_pointer): Rename extract_projection to extract_pointer
6551            and redefine its purpose to return the pointer stored in a CObject
6552            returned by the object's cobject method. Update all callers.
6553            (s_draw_info, free_draw_info, draw_polygon_init): Implement the
6554            handling of these low-level parameters so that each s_draw_info
6555            instance is handled as a CObject at python level that also
6556            contains real references to the actual python objects which
6557            contain the values in the struct. Add free_draw_info as the
6558            destructor.
6559            (draw_polygon_shape): Add the py_draw_info parameter which must a
6560            cobject containing an s_draw_info pointer.
6561    
6562            * Thuban/UI/renderer.py (MapRenderer.polygon_render_param): New
6563            method to instantiat the low-level render parameter
6564            (MapRenderer.draw_shape_layer): Use the new method. Remove some
6565            commented out code.
6566            (MapRenderer.draw_polygon_shape): Make the first parameter not the
6567            layer but the low-level render parameter
6568            (ScreenRenderer.draw_shape_layer): Use the low-level render
6569            parameter.
6570    
6571    2003-04-15  Jonathan Coles   <[email protected]>
6572    
6573            * Thuban/Model/classification.py: Implemented __repr__ for
6574            the ClassGroup* classes to make debugging a bit easier.
6575            (ClassGroup.SetLabel): Check that the string is an instance
6576            of StringTypes not StringType. Accounts for Unicode strings.
6577    
6578            * Thuban/Model/color.py: Implemented __repr__ to make
6579            debugging a bit easier.
6580    
6581            * Thuban/Model/save.py (Saver.write_classification): Need to
6582            save the group label.
6583    
6584            * test/test_load.py (testClassification): New. Loads the
6585            iceland_sample_test.thuban file and checks if it was loaded
6586            correctly.
6587    
6588    2003-04-15  Jonathan Coles   <[email protected]>
6589    
6590            * extensions/thuban/wxproj.cpp (draw_polygon_init): New. Used
6591            to improve rendering performance by initializing the variables
6592            that are not change each time draw_polygon_shape() is called.
6593            The values are stored in a global struct draw_info.
6594            (draw_polygon_shape): Removed initialization code that is
6595            now in draw_polygon_init().
6596    
6597            * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Make
6598            drawing initialization call to draw_polygon_init()
6599            (MapRenderer.draw_polygon_shape): Use new signature of
6600            draw_polygon_shape.
6601    
6602            * Thuban/UI/classgen.py (GenUniformPanel): Fix spin control
6603            weirdness by setting the range to (1, maxint).
6604    
6605            * Thuban/Model/classification.py (ClassGroupProperties): Make
6606            instance variables private and optimize comparison operator
6607            by first checking if the color references are the same.
6608            (ClassGroupSingleton): Make instance variables private.
6609            (ClassGroupRange): Make instance variables private.
6610    
6611            * HOWTO-Release: Filled in missing steps for releasing packages.
6612    
6613    2003-04-15  Bernhard Herzog  <[email protected]>
6614    
6615            First stab at internationalized messages:
6616    
6617            * Thuban/__init__.py (_): Implement the translation function for
6618            real using the python gettext module.
6619    
6620            * Thuban/UI/classifier.py (ClassTable.GetRowLabelValue): Don't
6621            translate empty strings.
6622    
6623            * Thuban/UI/application.py (ThubanApplication.read_startup_files):
6624            Add a missing space to a warning message
6625    
6626            * po/README: New. Notes about the management of the translation
6627            files.
6628    
6629            * po/Makefile: New. Makefile to help manage the translation files.
6630    
6631            * po/es.po: New. Spanish translation by Daniel Calvelo Aros
6632    
6633            * MANIFEST.in: Include the *.mo files in Resources/Locale and the
6634            translations and support files in po/
6635    
6636            * setup.py (data_files): Add the *.mo files to the data_files too
6637    
6638            * README: Add note about the translations when building from CVS
6639    
6640    2003-04-14  Jonathan Coles   <[email protected]>
6641    
6642            * Thuban/UI/dock.py: Fixes some window resizing problems most
6643            noticable under windows. Always assume the button bitmaps will
6644            be there. Code clean up.
6645            (DockabelWindow.Dock, DockableWindow.UnDock): Force all the
6646            images for the dock/undock button to the same images.
6647            Work around for RTbug #1801.
6648    
6649            * Thuban/UI/legend.py (LegendPanel.__init__): The toolbar should
6650            be allowed to grow within the sizer. Fixes a bug under Windows
6651            where the toolbar wasn't being drawn.
6652    
6653    2003-04-14  Frank Koormann   <[email protected]>
6654    
6655            * Resources/Bitmaps/dock_12.xpm, Resources/Bitmaps/undock_12.xpm:
6656            Updated design to try to make the button functionality more
6657            transparent.
6658    
6659    2003-04-14  Jonathan Coles   <[email protected]>
6660    
6661            * Thuban/UI/legend.py (LegendPanel.__init__): Call Create() to
6662            finalize the intialization of the panel.
6663    
6664            * Thuban/UI/dock.py (DockPanel.Create): New. Finalizes the
6665            creation of the panel. Should be the last thing called in the
6666            initializer of a subclass.
6667    
6668            * Thuban/UI/classgen.py (ClassGenDialog.__init__): Actively
6669            set the current selections in the combo boxes. This is needed
6670            under Windows.
6671    
6672            * Thuban/UI/classifier.py (Classifier.__init__): Add a top
6673            level panel to the dialog so that the background colors are
6674            consistent under Windows.
6675    
6676    2003-04-11  Jonathan Coles   <[email protected]>
6677    
6678            * Thuban/UI/classgen.py: Change color ramps to start at white
6679            not black.
6680    
6681            * Thuban/UI/legend.py: Enable/disable the legend buttons when
6682            the legend changes. Fixes RTbug #1793.
6683    
6684            * test/test_classification.py: Added test for copying of
6685            classifications.
6686    
6687    2003-04-11  Jonathan Coles   <[email protected]>
6688    
6689            * Thuban/UI/resource.py: New. Centralize the loading of resources
6690            such as bitmaps.
6691    
6692            * Thuban/UI/classgen.py (GenUniquePanel.__init__): Reordered buttons,
6693            added images to the move buttons, added 'reverse' button.
6694            (CustomRampPanel.__init__): Added images to the move buttons.
6695            (GreyRamp): New. Generates a ramp from white to black.
6696            (HotToColdRamp): New. Generates a ramp from cold to hot colors.
6697    
6698            * Thuban/UI/classifier.py: Refactored ID's from ID_CLASSIFY_* to
6699            ID_PROPERTY_*.
6700            (Classifier.__init__): Minor changes to the layout.
6701            (Classifier._OnTitleChanged): Listen for when the user edits the
6702            title and update the dialog's title and the layer's title.
6703    
6704            * Thuban/UI/dock.py: Use new bitmaps for the control buttons.
6705    
6706            * Thuban/UI/legend.py: Use new bitmaps for the control buttons.
6707            (LegendTree._OnMsgLayerTitleChanged): Change the displayed title
6708            if the layer's title changes.
6709    
6710            * Thuban/UI/mainwindow.py: Added new menu item and associated code
6711            to open a dialog to rename the map.
6712            (MainWindow): Use new resource class to import bitmaps.
6713    
6714    2003-04-11  Jonathan Coles   <[email protected]>
6715    
6716            * Resources/Bitmaps/close_12.xpm, Resources/Bitmaps/dock_12.xpm,
6717            Resources/Bitmaps/group_use.xpm, Resources/Bitmaps/group_use_all.xpm,
6718            Resources/Bitmaps/group_use_none.xpm,
6719            Resources/Bitmaps/group_use_not.xpm,
6720            Resources/Bitmaps/hide_layer.xpm,
6721            Resources/Bitmaps/layer_properties.xpm,
6722            Resources/Bitmaps/lower_layer.xpm, Resources/Bitmaps/raise_layer.xpm,
6723            Resources/Bitmaps/show_layer.xpm, Resources/Bitmaps/undock_12.xpm:
6724            New.
6725    
6726    2003-04-10  Jonathan Coles   <[email protected]>
6727    
6728            * Thuban/Model/classification.py: (ClassGroupRange.__init__):
6729            Should pass group to ClassGroup constructor.
6730    
6731    2003-04-10  Jonathan Coles   <[email protected]>
6732    
6733            * Thuban/Model/classification.py: (ClassGroup): Move all the common
6734            methods of the derived classes ([Set|Get]Properties(), __eq__, __ne__)
6735            here. Implement SetVisible(), IsVisible().
6736            (ClassGroup.__init__): Add group parameter which acts as a copy
6737            constructor.
6738    
6739            * Thuban/UI/classifier.py (ClassTable): Add a new column for the
6740            "Visible" check boxes.
6741            (Classifier): Rename the buttons and refactor the code to match
6742            the new labels.
6743    
6744            * Thuban/UI/legend.py: Classify button is now called "Properties".
6745            Refactored the code to change variable names.
6746            (LegendTree.__FillTreeLayer): Only list a group if it is visible.
6747    
6748            * Thuban/UI/mainwindow.py: MainWindow.OpenClassifier renamed to
6749            MainWindow.OpenLayerProperties. MainWindow.LayerEditProperties
6750            renamed to MainWindow.LayerEditProperties.
6751            (MainWindow.ToggleLegend): Don't include map name in legend title.
6752            (MainWindow.SetMap): Added the map name to the window title.
6753            (MainWindow.LayerFillColor, MainWindow.LayerTransparentFill,
6754            MainWindow.LayerOutlineColor, MainWindow.LayerNoOutline): Removed.
6755            Functionality is found in the layer properties dialog.
6756    
6757            * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Only
6758            draw visible groups.
6759    
6760    2003-04-09  Jonathan Coles   <[email protected]>
6761    
6762            * Thuban/UI/classgen.py: Modifications to allow simple
6763            addition and selection of new color schemes.
6764            (MonochromaticRamp): New. Generates a ramp between two colors.
6765            (RedRamp): New. Generates a ramp of all red.
6766            (GreenRamp): New. Generates a ramp of all green.
6767            (BlueRamp): New. Generates a ramp of all blue.
6768    
6769    2003-04-09  Jonathan Coles   <[email protected]>
6770    
6771            * Thuban/Model/classification.py (Classification.__deepcopy__):
6772            Need to copy over field and fieldType attributes.
6773    
6774            * Thuban/Model/table.py (Table.field_range): New. Retrive the
6775            maximum and minimum values over the entire table for a given
6776            field.
6777            (Table.GetUniqueValues): New. Retrieve all the unique values
6778            in the table for a given field.
6779    
6780            * Thuban/UI/classgen.py: Renamed GenRangePanel to GenUniformPanel.
6781            (GenUniquePanel): New. Controls to allow the user to select
6782            which unique field values they would like in the classification.
6783            (CustomRampPanel): Code that was in ClassGenDialog that allows
6784            the user to select the properties for a custom ramp.
6785            (ClassGenerator.GenUniformDistribution): Was called GenerateRanges.
6786    
6787            * Thuban/UI/classifier.py: Removed a lot of debugging code.
6788            (Classifier._SetClassification): Callback method so that the
6789            class generator can set the classification in the grid.
6790            (ClassGroupPropertiesCtrl): New. Encapsulates the drawing and
6791            editing of a group properties class into a wxWindows control.
6792    
6793            * Thuban/UI/dock.py: It was decided that if the user closes
6794            a dockable window the window should simply hide itself. That
6795            way if the user wants to show the dock again it appears in the
6796            same place as it was when it was closed.
6797            (DockableWindow.Destroy): Call renamed method OnDockDestroy().
6798            (DockableWindow._OnButtonClose): Hide the window instead of
6799            destroying it.
6800            (DockableWindow._OnClose): Hide the window instead of
6801            destroying it.
6802    
6803            * Thuban/UI/legend.py (LegendTree): Use a private method to
6804            consistently set the font and style of the text. Fixes RTbug #1786.
6805    
6806            * Thuban/UI/mainwindow.py: Import just the Classifier class.
6807    
6808    2003-04-07  Bernhard Herzog  <[email protected]>
6809    
6810            * Thuban/UI/mainwindow.py (main_menu): Move the toggle_legend item
6811            to the map module
6812    
6813    2003-04-07  Bernhard Herzog  <[email protected]>
6814    
6815            * Thuban/UI/mainwindow.py (MainWindow.ShowSessionTree): Removed in
6816            favor of ToggleSessionTree
6817            (MainWindow.ToggleSessionTree): New method to toggle visibility of
6818            the session tree.
6819            (MainWindow.SessionTreeShown): New method to return whether the
6820            session tree is currently shown.
6821            (MainWindow.ToggleLegend): New method to toggle visibility of the
6822            legend
6823            (MainWindow.ShowLegend): Implement in terms of ToggleLegend and
6824            LegendShown
6825            (MainWindow.LegendShown): New method to return whether the legend
6826            is currently shown.
6827            (_method_command): Add checked parameter so we can define check
6828            menu items
6829            (_has_tree_window_shown, _has_legend_shown): Use the appropriate
6830            mainwindow methods.
6831            (show_session_tree, show_legend commands): Removed.
6832            (toggle_session_tree, toggle_legend commands): New commands to
6833            toggle the visibility of the dialogs
6834    
6835    2003-04-07  Jonathan Coles   <[email protected]>
6836    
6837            * Thuban/UI/classgen.py: Fix Windows problem.
6838    
6839            * Thuban/UI/dock.py: Fix Windows problem.
6840    
6841            * Thuban/UI/mainwindow.py: Use False instead of false.
6842            (MainWindow.ShowLegend): Remove unnecessary switch parameter.
6843    
6844    2003-04-07  Jonathan Coles   <[email protected]>
6845    
6846            Since we now say that the order of the groups in a classification
6847            matters, it makes sense to be able to manipulate that order. Most
6848            of the changes to Thuban/Model/classification.py are to that end.
6849    
6850            * Thuban/Model/classification.py (Classification.AppendGroup,
6851            Classification.InsertGroup, Classification.ReplaceGroup,
6852            Classification.RemoveGroup, Classification.GetGroup): Do as the
6853            names imply.
6854            (Classification.FindGroup): This was called GetGroup, but GetGroup
6855            takes an index, while FindGroup takes a value.
6856            (Classification.__deepcopy__): Copy all the groups, BUT NOT THE LAYER
6857            REFERENCE. Currently there is a cyclic reference between the layer
6858            and its classification. If the classification doesn't need to know
6859            its owning layer we can change this, since it may make sense to be
6860            able to use the same classification with different layers.
6861    
6862            * Thuban/Model/load.py: Use Classification.AppendGroup(), not AddGroup()
6863    
6864            * Thuban/UI/classgen.py: Use Classification.AppendGroup(),
6865            not AddGroup()
6866    
6867            * Thuban/UI/classifier.py: Now that we can depend on the order in
6868            a Classification and have methods to manipulate that order we don't
6869            need to use our own data structures in the grid. We can simply make
6870            the grid/table access the information they need from a copy of
6871            the classification object.
6872            (Classifier._OnCloseBtn): Event handler for when the user clicks
6873            'Close'. This is needed so if the user applies changes and then
6874            continues to change the table the user has the option of discarding
6875            the most recent changes and keeping what they applied.
6876    
6877            * Thuban/UI/mainwindow.py: Put "Show Legend" and "Show Session Tree"
6878            into the same group.
6879    
6880            * extensions/thuban/wxproj.cpp (check_version): If Thuban is compiled
6881            with a really old version of proj, PJ_VERSION won't even be defined.
6882            If it isn't defined then just compile so that the function always
6883            returns Py_False.
6884    
6885            * test/test_classification.py: Fix tests to use the renamed methods.
6886            Still need to write tests for the new methods.
6887    
6888    2003-04-04  Jonathan Coles   <[email protected]>
6889    
6890            * Thuban/UI/classifier.py (Classifier.__SelectField): Move the
6891            call to SetSelection out of the method and before the call
6892            to __SelectField in __init__. This prevents a recursion of events
6893            when _OnFieldSelect is triggered by the user.
6894    
6895    2003-04-04  Jonathan Coles   <[email protected]>
6896    
6897            * Thuban/Model/classification.py: Rename Color.None to
6898            Color.Transparent.
6899            (ClassGroupProperties.SetLineColori, ClassGroupProperties.SetFill):
6900            Don't bother copying the color, since Colors are immutable.
6901    
6902            * Thuban/Model/color.py, Thuban/Model/layer.py, Thuban/Model/load.py,
6903            Thuban/UI/classifier.py, Thuban/UI/mainwindow.py,
6904            Thuban/UI/renderer.py, Thuban/UI/view.py:
6905            Rename Color.None to Color.Transparent.
6906        
6907            * test/test_classification.py, test/test_load.py: Rename Color.None
6908            to Color.Transparent.
6909    
6910    2003-04-04  Jonathan Coles   <[email protected]>
6911    
6912            * Thuban/Model/classification.py: Fix assert calls.
6913            (ClassGroupProperties.SetLineColor, ClassGroupProperties.SetFill):
6914            Copy the color parameter rather than hold onto a reference.
6915    
6916            * Thuban/Model/color.py (Color.__copy__, Color.__deepcopy): Copy
6917            the color object.
6918            (NoColor.__copy__, NoColor.__deepcopy): Return 'self' so that we
6919            are sure there exists only one refernce to Color.None in the system.
6920            This allows us to use 'is' rather than the comparision functions.
6921            
6922            * Thuban/Model/save.py: Fix assert calls.
6923            
6924            * Thuban/UI/classifier.py: Fix assert calls.
6925            (ClassGrid._OnCellDClick): Call up to the classifier to open the
6926            dialog to edit the groups properties.
6927            (ClassGrid._OnCellResize): Make sure that the scollbars are drawn
6928            correctly if a cell is resized.
6929            (ClassTable.SetClassification): New. Changes the classification
6930            that is in the table.
6931            (ClassTable.__SetRow): Allow groups to be prepended.
6932            (Classifier): New code for opening the EditProperties and
6933            GenerateRanges dialogs.
6934            (SelectPropertiesDialog.__GetColor): Only set the color in the
6935            color dialog if the current color is not None.
6936            
6937            * Thuban/UI/dock.py: Fix assert calls.
6938            
6939            * Thuban/UI/legend.py: Fix assert calls.
6940            
6941            * Thuban/UI/renderer.py: Fix assert calls.
6942            
6943            * Thuban/UI/classgen.py (ClassGenDialog): Dialog for generating
6944            classifications.
6945            (GenRangePanel): Panel specific to range generation.
6946            (GenSingletonPanel): Panel specific to singleton generation.
6947            (ClassGenerator): Class responsible for actually generating
6948            the classification from the data gathered in the dialog box.
6949            (PropertyRamp): Generates properties whose values range from
6950            a starting property to an ending property.
6951    
6952    2003-04-03  Bernhard Herzog  <[email protected]>
6953    
6954            * test/support.py (print_garbage_information): New function that
6955            prints information about still connected messages and memory
6956            leaks.
6957            (run_suite): Removed.
6958            (run_tests): New function for use as a replacement of
6959            unittest.main in the test_* files. This one calls
6960            print_garbage_information at the end.
6961    
6962            * test/runtests.py (main): Use support.print_garbage_information
6963    
6964            * test/test_layer.py: Use support.run_tests instead of
6965            unittest.main so we get memory leak information
6966            (TestLayer.test_arc_layer, TestLayer.test_polygon_layer)
6967            (TestLayer.test_point_layer, TestLayer.test_empty_layer)
6968            (TestLayerLegend.test_visibility): Call the layer's Destroy method
6969            to fix a memory leak.
6970    
6971            * test/test_classification.py: Use support.run_tests instead of
6972            unittest.main so we get memory leak information
6973            (TestClassification.test_classification): Call the layer's Destroy
6974            method to fix a memory leak.
6975    
6976    2003-04-02  Bernhard Herzog  <[email protected]>
6977    
6978            * extensions/thuban/wxproj.cpp (check_version, check_version_gtk):
6979            Handle the reference counts of the return value and errors in
6980            PyArg_ParseTuple correctly.
6981    
6982            * Thuban/UI/application.py (ThubanApplication.OpenSession): Make
6983            sure the filename is absolute to avoid problems when saving the
6984            session again
6985    
6986            * Thuban/Model/table.py: Remove unnecessary import. Fix a typo.
6987    
6988    2003-04-01  Jonathan Coles   <[email protected]>
6989    
6990            *  Thuban/UI/renderer.py (MapRenderer.draw_point_shape): Check
6991            that there actually are points in the returned list of points
6992            before trying to index into the list. The list may be empty if
6993            the shape is a Null Shape.
6994    
6995    2003-04-01  Bernhard Herzog  <[email protected]>
6996    
6997            * test/test_map.py: Don't use from <module> import *
6998    
6999    2003-04-01  Jonathan Coles   <[email protected]>
7000    
7001            * Thuban/Model/session.py: Use LAYER_CHANGED instead of
7002            LAYER_LEGEND_CHANGED
7003    
7004            * Thuban/UI/dock.py (DockableWindow._OnButtonClose): Call
7005            self.Destroy() to close the window after yesterday's changes.
7006    
7007            * test/test_map.py, test/test_session.py: Fix messages that
7008            are sent from maps and layers.
7009    
7010    2003-03-31  Jonathan Coles   <[email protected]>
7011    
7012            * Thuban/UI/classifier.py: Commented out some debugging statements.
7013            (ClassDataPreviewer.Draw): Draw rectangles for polygon layers per
7014            RTbug #1769.
7015    
7016            * Thuban/UI/dock.py (DockableWindow.UnDock): Restore size and
7017            position (although position doesn't work yet under GTK).
7018            (DockableWindow.Destroy): New. Called when the window must be
7019            closed. Namely needed when the DockFrame closes and must close
7020            its children.
7021            (DockFrame): Listen for EVT_CLOSE and destroy all children.
7022    
7023            * Thuban/UI/legend.py (LegendPanel.Destroy): New. Cleans up
7024            when then window is told to close.
7025            (LegendTree._OnMsgLayerChanged): Fixes a seg fault bug. See
7026            comment in source for more info.
7027    
7028            * Thuban/UI/main.py: Show the legend by default when Thuban starts.
7029    
7030            * Thuban/UI/mainwindow.py: Renamed OnClose to _OnClose for
7031            symmetry with other such methods.
7032            (MainWindow.ShowLegend): Show the legend docked by default.
7033    
7034    2003-03-28  Jonathan Coles   <[email protected]>
7035    
7036            * Thuban/UI/classifier.py: Support for highlighting a specific
7037            group within the grid when the classification dialog is opened.
7038            Also contains a lot of debugging printouts which will later
7039            be removed.
7040    
7041            * Thuban/UI/dock.py: Complete rework on the dock code so that
7042            that it is fairly removed from the rest of the Thuban application.
7043            It is easy to add new docks which the rest of the program having
7044            to be aware of them.
7045    
7046            * Thuban/UI/legend.py: Modifications to support selecting a
7047            specific group in the classification dialog. Changed how layers
7048            are drawn when the layer is visible/invisible.
7049    
7050            * Thuban/UI/mainwindow.py: Removed legend specific code and
7051            replaced it with calls to the new dock code.
7052    
7053            * Thuban/UI/renderer.py (MapRenderer.__init__): Added assert
7054            to check if scale > 0. Trying to track down a divide by zero.
7055    
7056    2003-03-26  Jonathan Coles   <[email protected]>
7057    
7058            * Thuban/UI/legend.py: Removed unnecessary LegendDialog class.
7059            (LegendPanel): Removed _OnDock()/_OnUnDock() methods which are
7060            now part of DockableWindow.
7061            (LegendPanel.DoOnSelChanged): Select the current layer in the
7062            map.
7063            (LegendTree._OnSelChanged): Call LegendPanel.DoOnSelChanged()
7064            with the selected layer and/or group.
7065    
7066    2003-03-26  Jonathan Coles   <[email protected]>
7067    
7068            This putback contains the code for dockable windows. There is
7069            no support in wxWindows as of this date for windows that can
7070            attach themselves to other windows.
7071    
7072            The current model contains a DockableWindow which has a parent
7073            window for when it is detached and a dock window that it puts
7074            its contents in when it is docked. The contents of a DockableWindow
7075            must be a DockPanel. DockPanel itself derives from wxPanel.
7076    
7077            * Thuban/Model/layer.py (Layer.ClassChanged): Send a LAYER_CHANGED
7078            message, not a LAYER_LEGEND_CHANGED message.
7079    
7080            * Thuban/Model/map.py (Map): Forward LAYER_CHANGED messages.
7081    
7082            * Thuban/UI/classifier.py (Classifier.__init__): Use wxADJUST_MINSIZE
7083            as one of the style properties for the fieldTypeText item to
7084            be sure that its size is correct when the text changes.
7085    
7086            * Thuban/UI/dock.py: New. Classes for the DockPanel and
7087            DockableWindow.
7088    
7089            * Thuban/UI/legend.py: Added some more buttons and made the
7090            LegendPanel a DockPanel.
7091    
7092            * Thuban/UI/mainwindow.py: Added sash windows to the main window
7093            and supporting functions for manipulating the sashes.
7094            (MainWindow.ShowLegend): Create a DockableWindow with the
7095            LegendPanel as the contents.
7096    
7097            * Thuban/UI/messages.py: Added DOCKABLE_* messages
7098    
7099            * Thuban/UI/view.py (MapCanves.SetMap): Listen for LAYER_CHANGED,
7100            not LAYER_LEGEND_CHANGED, messages.
7101    
7102    2003-03-25  Jonathan Coles   <[email protected]>
7103    
7104            * setup.py: Added custom script bdist_rpm_build_script so that
7105            when the rpm is built the path to wx-config is correct.
7106    
7107            * setup.cfg: Added line saying to use the custom build script
7108    
7109    2003-03-20  Jonathan Coles   <[email protected]>
7110    
7111            Initial implementation of the Legend.
7112    
7113            * Thuban/UI/legend.py: New. Creates a window that shows the map's
7114            Legend information and allows the user to add/modify classifications
7115            and how the layers are drawn on the map.
7116    
7117            * setup.py: New command 'build_docs' which currently uses
7118            happydoc to generate html documentation for Thuban.
7119    
7120            * Thuban/Model/classification.py (ClassGroup.GetDisplayText): New.
7121            Returns a string which is appropriately describes the group.
7122    
7123            * Thuban/Model/layer.py (Layer.SetClassification): Generate a
7124            LAYER_CHANGED event instead of a LAYER_LEGEND_CHANGED event.
7125    
7126            * Thuban/Model/map.py (Map): Rename messages and use new, more
7127            specific, messages.
7128    
7129            * Thuban/Model/messages.py: New message to indicate that a layer's
7130            data has changed (LAYER_CHANGED). New map messages to indicate
7131            when layers have been added/removed/changed or if the stacking order
7132            of the layers has changed.
7133    
7134            * Thuban/Model/session.py: Rename and use new messages.
7135    
7136            * Thuban/UI/classifier.py: Remember if any changes have actually
7137            been applied so that if the dialog is cancelled without an application
7138            of changes we don't have to set a new classification.
7139            (ClassDataPreviewer): Pulled out the window specific code and put it
7140            ClassDataPreviewWindow. ClassDataPreviewer can then be used to draw
7141            symbols on any DC.
7142            
7143            * Thuban/UI/mainwindow.py: New code to open the legend.
7144    
7145            * Thuban/UI/view.py: Use new message names.
7146    
7147    2003-03-19  Jonathan Coles   <[email protected]>
7148    
7149            * Thuban/UI/main.py (verify_versions): New. Checks the versions
7150            of Python, wxPython, and some other libraries.
7151    
7152            * extensions/thuban/wxproj.cpp (check_version): Checks the given
7153            version against what wxproj was compiled with.
7154            (check_version_gtk): If wxproj was compiled with gtk then check
7155            the given version against the version of the gtk library
7156            currently being used.
7157    
7158    2003-03-14  Bernhard Herzog  <[email protected]>
7159    
7160            * test/test_command.py: Run the tests when the module is run as a
7161            script
7162    
7163    2003-03-14  Bernhard Herzog  <[email protected]>
7164    
7165            Implement selection of multiple selected shapes in the same layer:
7166    
7167            - Introduce a new class to hold the selection. This basically
7168              replaces the interactor which was nothing more than the
7169              selection anyway. A major difference is of course that the new
7170              selection class supports multiple selected shapes in one layer
7171            
7172            - Move the object that represents the selection from the
7173              application to the canvas. The canvas is a better place than the
7174              application because the selection represents which shapes and
7175              layer of the map displayed by the canvas are selected and
7176              affects how the map is drawn.
7177    
7178            - Make the selection and its messages publicly available through
7179              the mainwindow.
7180    
7181            - The non-modal dialogs do not get a reference to the interactor
7182              anymore as they can simply refer to their parent, the
7183              mainwindow, for the what the interactor had to offer.
7184    
7185            * Thuban/UI/selection.py: New module with a class to represent the
7186            selection.
7187    
7188            * Thuban/UI/messages.py (SELECTED_TABLE, SELECTED_MAP): Remove
7189            these unused messages
7190    
7191            * Thuban/UI/application.py (ThubanApplication.OnInit)
7192            (ThubanApplication.OnExit, ThubanApplication.SetSession): The
7193            interactor is gone now.
7194            (ThubanApplication.CreateMainWindow): There is no interactor
7195            anymore so we pass None as the interactor argument for now for
7196            compatibility.
7197    
7198            * Thuban/UI/view.py (MapCanvas.delegated_messages)
7199            (MapCanvas.Subscribe, MapCanvas.Unsubscribe): In Subscribe and
7200            Unsubscribe, delegate messages according to the delegated_messages
7201            class variable.
7202            (MapCanvas.__getattr__, MapCanvas.delegated_methods): Get some
7203            attributes from instance variables as described with the
7204            delegated_methods class variable.
7205            (MapCanvas.__init__): New instance variable selection holding the
7206            current selection
7207            (MapCanvas.do_redraw): Deal with multiple selected shapes. Simply
7208            pass them on to the renderer
7209            (MapCanvas.SetMap): Clear the selection when a different map is
7210            selected.
7211            (MapCanvas.shape_selected): Simple force a complete redraw. The
7212            selection class now takes care of only issueing SHAPES_SELECTED
7213            messages when the set of selected shapes actually does change.
7214            (MapCanvas.SelectShapeAt): The selection is now managed in
7215            self.selection
7216    
7217            * Thuban/UI/mainwindow.py (MainWindow.delegated_messages)
7218            (MainWindow.Subscribe, MainWindow.Unsubscribe): In Subscribe and
7219            Unsubscribe, delegate messages according to the delegated_messages
7220            class variable.
7221            (MainWindow.delegated_methods, MainWindow.__getattr__): Get some
7222            attributes from instance variables as described with the
7223            delegated_methods class variable.
7224            (MainWindow.__init__): The interactor as ivar is gone. The
7225            parameter is still there for compatibility. The selection messages
7226            now come from the canvas.
7227            (MainWindow.current_layer, MainWindow.has_selected_layer):
7228            Delegate to the the canvas.
7229            (MainWindow.LayerShowTable, MainWindow.Classify)
7230            (MainWindow.identify_view_on_demand): The dialogs don't need the
7231            interactor parameter anymore.
7232    
7233            * Thuban/UI/tableview.py (TableFrame.__init__)
7234            (LayerTableFrame.__init__, LayerTableFrame.OnClose)
7235            (LayerTableFrame.row_selected): The interactor is gone. It's job
7236            from the dialog's point of view is now done by the mainwindow,
7237            i.e. the parent. Subscribe to SHAPES_SELECTED instead
7238            of SELECTED_SHAPE
7239            
7240            * Thuban/UI/dialogs.py (NonModalDialog.__init__): The interactor
7241            is gone. It's job from the dialog's point of view is now done by
7242            the mainwindow, i.e. the parent.
7243            
7244            * Thuban/UI/classifier.py (Classifier.__init__): The interactor is
7245            gone. It's job from the dialog's point of view is now done by the
7246            mainwindow, i.e. the parent.
7247    
7248            * Thuban/UI/tree.py (SessionTreeView.__init__): The interactor is
7249            gone. It's job from the dialog's point of view is now done by the
7250            mainwindow, i.e. the parent.
7251            (SessionTreeCtrl.__init__): New parameter mainwindow which is
7252            stored as self.mainwindow. The mainwindow is need so that the tree
7253            can still subscribe to the selection messages.
7254            (SessionTreeCtrl.__init__, SessionTreeCtrl.unsubscribe_all)
7255            (SessionTreeCtrl.update_tree, SessionTreeCtrl.OnSelChanged): The
7256            selection is now accessible through the mainwindow. Subscribe to
7257            SHAPES_SELECTED instead of SELECTED_SHAPE
7258    
7259            * Thuban/UI/identifyview.py (IdentifyView.__init__): Use the
7260            SHAPES_SELECTED message now.
7261            (IdentifyView.selected_shape): Now subscribed to SHAPES_SELECTED,
7262            so deal with multiple shapes
7263            (IdentifyView.__init__, IdentifyView.OnClose): The interactor is
7264            gone. It's job from the dialog's point of view is now done by the
7265            mainwindow, i.e. the parent.
7266    
7267            * Thuban/UI/controls.py (RecordListCtrl.fill_list): The second
7268            parameter is now a list of shape ids.
7269            (RecordTable.SetTable): The second parameter is now a list of
7270            indices.
7271    
7272            * Thuban/UI/renderer.py (ScreenRenderer.RenderMap): Rename the
7273            selected_shape parameter and ivar to selected_shapes. It's now a
7274            list of shape ids.
7275            (MapRenderer.draw_label_layer): Deal with multiple selected
7276            shapes. Rearrange the code a bit so that the setup and shape type
7277            distinctions are only executed once.
7278    
7279            * test/test_selection.py: Test cases for the selection class
7280    
7281    2003-03-11  Jonathan Coles   <[email protected]>
7282    
7283            * Thuban/Model/load.py: Temporary fix so that the xml reader
7284            doesn't cause Thuban to crash.
7285    
7286            * Thuban/Model/layer.py: Handle the cyclic references between
7287            a layer and its classification better, and be sure to disconnect
7288            the classification from the layer when the layer is destroyed
7289            so that we don't maintain a cyclic reference that may not be
7290            garbage collected.
7291    
7292            * Thuban/Model/classification.py: See comment for layer.py.
7293    
7294    2003-03-12  Jan-Oliver Wagner <[email protected]>
7295    
7296            * HOWTO-Release: New. Information on the steps for releasing
7297            a new version of Thuban.
7298    
7299    2003-03-11  Jonathan Coles   <[email protected]>
7300    
7301            * Thuban/UI/classifier.py: Add normal border to SelectPropertiesDialog.
7302            Use True instead of true.
7303            (Classifier): Should have a single panel in which all the controls lie.
7304    
7305            * Thuban/UI/proj4dialog.py: Add normal border.
7306    
7307            * Thuban/UI/tree.py: Fixed problem with bad item images under Windows.
7308    
7309            * Thuban/UI/mainwindow.py: Use True instead of true.
7310    
7311            * setup.py: Update some definitions to use wxWindows2.4 files
7312    
7313            * Data/iceland_sample_class.thuban: Fixed file so that the
7314            field_type information is present.
7315    
7316    2003-03-10  Jonathan Coles   <[email protected]>
7317    
7318            * Thuban/UI/classifier.py (Classifier.__init__): Make the
7319            field type label grow so that when the text changes the
7320            size is updated correctly. This may be a wxWindows bug.
7321    
7322    2003-03-10  Jonathan Coles   <[email protected]>
7323    
7324            * Thuban/UI/application.py: Changed SESSION_CHANGED to
7325            SESSION_REPLACED.
7326    
7327            * Thuban/UI/classifier.py: Wrap text with _().
7328            (ClassGrid.CreateTable): Set dimensions and size hints here,
7329            instead of in Reset, so we only set the size once.
7330    
7331            * Thuban/UI/dialogs.py: Don't need Shutdown(); just use Close()!
7332    
7333            * Thuban/UI/mainwindow.py (MainWindow.prepare_new_session):
7334            Call Close() instead of Shutdown().
7335    
7336            * Thuban/UI/messages.py: Changed SESSION_CHANGED to SESSION_REPLACED.
7337    
7338            * Thuban/UI/tree.py: Changed SESSION_CHANGED to SESSION_REPLACED.
7339            Go back to using OnClose() instead of Shutdown().
7340    
7341    2003-03-10  Jonathan Coles   <[email protected]>
7342    
7343            * Thuban/UI/classifier.py (Classifier): SelectField() needed
7344            to know the old field index as well as the new one.
7345    
7346    2003-03-10  Jonathan Coles   <[email protected]>
7347    
7348            * Thuban/UI/classifier.py (Classifier): Use __SelectField()
7349            to correctly set the table information and call this from
7350            __init__ and from _OnFieldSelect so that all the information
7351            is up to date when the dialog opens and when a field is changed.
7352    
7353    2003-03-10  Jonathan Coles   <[email protected]>
7354    
7355            * Thuban/Model/classification.py (Classification): Don't use
7356            layer's message function directly, use the ClassChanged() method
7357            when then classification changes. SetField/SetFieldType/SetLayer
7358            must keep the information about field name and field type in
7359            sync when an owning layer is set or removed.
7360    
7361            * Thuban/Model/layer.py: Added ClassChanged() so that the
7362            classification can tell the layer when its data has changed.
7363            (Layer.SetClassification): Accepts None as an arguement to
7364            remove the current classification and correctly handles
7365            adding a new classification.
7366    
7367            * Thuban/Model/load.py: Comment out print statement
7368    
7369            * test/test_classification.py, test/test_save.py: New and
7370            improved tests.
7371    
7372    2003-03-07  Jonathan Coles   <[email protected]>
7373    
7374            * Thuban/Model/classification.py: Implemented __copy__ and
7375            __deepcopy__ for ClassGroup* and ClassGroupProperites so
7376            they can easily be copied by the classifier dialog.
7377            (ClassGroupProperites.__init__): The default line color should
7378            have been Color.Black.
7379    
7380            * Thuban/UI/classifier.py: Setting and Getting table values now
7381            uses a consistent set of functions.
7382            (Classifier): Now non-modal. Has field type label which changes
7383            as the field changes. Keep track of buttons in a list so that
7384            we can enable/disable the buttons when the None field is selected.
7385            (SelectPropertiesDialog): Add buttons to make the colors transparent.
7386    
7387            * Thuban/UI/dialogs.py (NonModalDialog.Shutdown): New method which
7388            does what OnClose did, but can be called by the application to
7389            close a window. Needed when a session changes, and we have to
7390            close the classifier windows.
7391    
7392            * Thuban/UI/mainwindow.py (MainWindow.prepare_new_session):
7393            Shuts down open dialogs. Used when a new session is created
7394            or a session is opened.
7395            (MainWindow.SaveSession): Should only call application.SaveSession()
7396            if we don't call SaveSessionAs first.
7397            (MainWindow.Classify): Allow different classifier dialogs for
7398            different layers.
7399    
7400            * Thuban/UI/tree.py (SessionTreeView): Remove OnClose and let
7401            the parent class handle it. Add Shutdown() to unsubscibe from
7402            event notification and call the parent Shutdown(). This was
7403            necessary so the application can close the tree window.
7404    
7405    2003-03-06  Jonathan Coles   <[email protected]>
7406    
7407            * Thuban/Model/classification.py: Minor documentation changes,
7408            Addition of __eq__ and __ne__ methods.
7409            (Classification.SetLayer): prevent recursion between this method
7410            and Layer.SetClassification().
7411    
7412            * Thuban/Model/color.py: Addition of __eq__ and __ne__ methods.
7413    
7414            * Thuban/Model/layer.py (SetClassification): prevent recursion
7415            between this method and Classification.SetLayer().
7416    
7417            * test/test_classification.py, test/test_load.py,
7418            test/test_session.py: Fixed and added tests for the classification
7419            classes.
7420    
7421    2003-03-06  Bernhard Herzog  <[email protected]>
7422    
7423            * Thuban/UI/classifier.py (ClassGrid.__init__)
7424            (ClassGrid.CreateTable): Move the SetSelectionMode call to
7425            CreateTable because otherwise it triggers an assertion in
7426            wxPython/wxGTK 2.4.
7427    
7428    2003-03-05  Jonathan Coles   <[email protected]>
7429    
7430            * Thuban/common.py: Move FIELDTYPE constants back to table.py.
7431    
7432            * Thuban/Model/load.py: import FIELDTYPE constants from table.
7433    
7434            * Thuban/UI/classifier.py: import FIELDTYPE constants from table.
7435    
7436            * Thuban/Model/table.py: Put FIELDTYPE constants back.
7437    
7438    2003-03-05  Jonathan Coles   <[email protected]>
7439    
7440            * Thuban/UI/classifier.py: Added class documentation.
7441            Fixed RTbug #1713, #1714. Added Move[Up|Down] buttons.
7442            Store just the groups in the table and generate the other
7443            column information when it is requested. Add "None" field
7444            to pull-down to select no classification.
7445    
7446            * Thuban/common.py: Moved FIELDTYPE constants from table.py
7447            (Str2Num): Only catch ValueError exceptions.
7448    
7449            * Thuban/Model/classification.py: Class documentation. Renaming
7450            of methods with Stroke to Line. Groups are stored in a single
7451            list with the default as the first element. Groups are searched
7452            in the order they appear in the list.
7453    
7454            * Thuban/Model/color.py: Documentation.
7455    
7456            * Thuban/Model/layer.py (Layer): Add GetFieldType to retreive
7457            the kind of data represented by a field.
7458    
7459            * Thuban/Model/load.py (ProcessSession): Use proper string
7460            conversion function; fixes RTbug #1713.
7461    
7462            * Thuban/Model/save.py (Saver): Store field type information.
7463    
7464            * Thuban/Model/table.py: Put FIELDTYPE constants in common.py.
7465            (Table): Add field_info_by_name() to retrieve field information
7466            by specifying the field name, not the number.
7467    
7468            * Thuban/UI/mainwindow.py: Function name changes.
7469    
7470            * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Only
7471            get the layer classification once. Don't try to classify
7472            values when the field is None: just use the default properties.
7473    
7474            * Thuban/UI/view.py: Function name changes.
7475    
7476            * Doc/thuban.dtd: Add field_type attribute to a classification.
7477    
7478    2003-03-04  Bernhard Herzog  <[email protected]>
7479    
7480            * Doc/thuban.dtd: Use correct syntax for optional attributes. Make
7481            the fill and stroke layer attributes optional with suitable
7482            default values. Add the stroke_width layer attribute. Use correct
7483            syntax for empty elements. Make the attribute list for labels
7484            refer to the label element.
7485    
7486    2003-03-04  Bernhard Herzog  <[email protected]>
7487    
7488            * setup.py (thuban_build_py.build): Add a comment about distutils in
7489            Python 2.3 containing some of the functionality we implement in
7490            setup.py ourselves.
7491    
7492            * Thuban/UI/classifier.py (ClassGrid.__init__): Set the table
7493            before the selection mode. Doing it the other way round triggers
7494            an assertion in wxWindows.
7495    
7496            * Thuban/Model/save.py (escape): Fix typo in doc-string
7497    
7498            * Thuban/Model/classification.py: Remove unnecessary wxPython
7499            import
7500    
7501    2003-03-04  Jonathan Coles   <[email protected]>
7502    
7503            * Thuban/Model/classification.py (ClassGroupRange.GetProperties):
7504            Parameter 'value' should default to None.
7505    
7506            * Thuban/UI/mainwindow.py: Use Layer.GetClassification() since
7507            the class attribute __classification is now private.
7508    
7509            * Thuban/UI/classifier.py (ClassGrid): Moved OnCellDClick() from
7510            Classifier to ClassGrid. Added support for removing selected rows,
7511            which including code for keeping track of when cells are selected,
7512            and deselected.
7513            (ClassTable): Support for added/removing rows. Fixed a problem
7514            with __ParseInput whereby it would not allow strings (only numbers)
7515            to be entered.
7516            (Classifier): Added button and supporting code for removing
7517            selected rows.
7518    
7519    2003-02-27  Jonathan Coles   <[email protected]>
7520    
7521            * Thuban/common.py: Moved color conversion functions into
7522            Thuban/UI/common.py.
7523            (Str2Num): Now converts the float (not the string) to a long/int
7524            so that an exception isn't thrown.
7525    
7526            * Thuban/UI/common.py: Common functions used in several UI modules
7527    
7528            * Thuban/Model/classification.py: Changed the class hierarchy
7529            so that a Classification consists of Groups which return
7530            Properties when a value matches a Group.
7531    
7532            * Thuban/Model/layer.py: Fixed name resolution problem.
7533    
7534            * Thuban/Model/load.py: Use new Classification and Group functions.
7535    
7536            * Thuban/Model/save.py (Saver.write_attribs): Fixes a test case
7537            failure.
7538            (Saver.write_classification): Use new Classification and Group
7539            functions.
7540    
7541            * Thuban/UI/classifier.py: Changes to use new Classification and Group
7542            functions. Fix to create a tuple with a single value instead of
7543            simply returning the value.
7544    
7545            * Thuban/UI/renderer.py: Use new Classification and Group functions.
7546            Use common.py functions.
7547    
7548            * Thuban/UI/tree.py: Use common.py functions.
7549            
7550            * test/test_classification.py: Use new Classification and Group
7551            classes.
7552    
7553    2003-02-24  Jonathan Coles   <[email protected]>
7554    
7555            * Thuban/common.py (Color2wxColour, wxColour2Color): Conversion
7556            functions from Thuban color objects to wxWindow colour objects.
7557    
7558            * Thuban/Model/classification.py (Classification): Renamed
7559            GetProperties() to GetClassData(). Used the new iterator
7560            in TreeInfo().
7561            (ClassIterator): Iterator implementation to iterate over the
7562            ClassData objects in a classification object.
7563    
7564            * Thuban/Model/save.py (Saver.write_classificaton): Uses
7565            the new iterator to save the classification information.
7566    
7567            * Thuban/UI/classifier.py (SelectPropertiesDialog): Support
7568            for changing the stroke and fill colors and previewing the
7569            changes.
7570    
7571            * Thuban/UI/mainwindow.py (MainWindow.OpenSession,
7572            MainWindow.SaveSessionAs): Text string changes so the dialogs
7573            have more meaningful titles.
7574    
7575            * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Change
7576            Classification method name from GetProperties to GetClassData.
7577    
7578            * Thuban/UI/view.py (MapCanvas.find_shape_at): Use method calls
7579            instead of accessing now non-existent class variables.
7580    
7581    2003-02-24  Bernhard Herzog  <[email protected]>
7582    
7583            * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Remove
7584            unneeded Shape() call. Rendering is substantially faster without
7585            it and it avoids some problems with broken shape files.
7586    
7587    2003-02-20  Frank Koormann   <[email protected]>
7588    
7589            Force minimal size of identify and label dialogs. The autosizing
7590            looked too ugly.
7591    
7592            * Thuban/UI/controls.py (RecordListCtrl): Set minimal width for columns.
7593            * Thuban/UI/labeldialog.py (LabelDialog.dialog_layout):
7594            Set size of listctrl.
7595            * Thuban/UI/identifyview.py (IdentifyView.__init__):
7596            Set size of dialog.
7597    
7598    2003-02-19  Jonathan Coles   <[email protected]>
7599    
7600            * test/test_classification.py, test/test_layer.py,
7601            test/test_load.py, test/test_map.py, test/test_session.py:
7602            Updated the tests to use the new functions that are in the
7603            respective classes.
7604    
7605            * Thuban/Model/classification.py (Classification):
7606            Uses the new ClassData* classes. Modification messages are
7607            passed up to the parent layer (if it exists).
7608            (ClassData): New class to encapsulate the common data in each
7609            classification property.
7610            (ClassDataDefault): Represents the Default class. data.
7611            (ClassDataPoint): Represents a single class. data point
7612            (ClassDataRange): Represents a class. range
7613            (ClassDataMap): Represents a class. map (unused).
7614    
7615            * Thuban/Model/color.py: Added Color.None to represent something
7616            with no color. Color.Black represents the color black.
7617            (NoColor): Helper class derived from Color to represent something
7618            with no color.
7619    
7620            * Thuban/Model/layer.py (Layer): Removed references to fill, stroke,
7621            stroke_width attributes. Made the 'classification' attribute private.
7622            New methods for setting/getting the classification.
7623    
7624            * Thuban/Model/load.py (ProcessSession): Use new methods on Layer
7625            to get the classifcation and use the new ClassData* classes to
7626            hold the classification data. Use Str2Num to convert numbers
7627            properly.
7628    
7629            * Thuban/Model/save.py (Saver): Use new Color and Classification
7630            methods
7631    
7632            * Thuban/UI/classifier.py (ClassGrid): New class to represent a
7633            custom grid.
7634            (ClassTable): Support for editing Values and Labels and for
7635            changing what type (point or range) of data is stored in each
7636            property based on how the user enters the data.
7637            (Classifier): Support for saving the new classifications and
7638            launching the dialog to edit a property.
7639            (SelectPropertiesDialog): New class for editing the visual
7640            properties of a classification (stroke color, width, and fill color)
7641            (ClassPreviewer): Took the Draw method from ClassRenderer and
7642            made most of it into this new class. Intend to use this class in
7643            the SelectPropertiesDialog for previewing changes.
7644    
7645            * Thuban/UI/renderer.py: Use new Color and Classification methods.
7646    
7647            * Thuban/UI/tree.py: Formatting changes.
7648    
7649            * Doc/thuban.dtd: Add 'label' element
7650    
7651            * Thuban/common.py: New. Contains common routines used throughout
7652            the code.
7653            (Str2Num): Takes a string and converts it to the "best" type of
7654            number.
7655    
7656    2003-02-14  Bernhard Herzog  <[email protected]>
7657    
7658            * Thuban/UI/view.py (MapCanvas.OnLeftUp): Make sure that the
7659            dragging flag is always set to 0 even when the tool implementation
7660            raises an exception
7661    
7662    2003-02-11  Bernhard Herzog  <[email protected]>
7663    
7664            * Thuban/UI/application.py (ThubanApplication.splash_screen): New
7665            method to create a splash screen.
7666            (ThubanApplication.ShowMainWindow): New. Show the main window.
7667            Needed so the splash screen can display the mainwindow
7668            (ThubanApplication.OnInit): Call the
7669            new splash_screen method to determine whether the application
7670            should display a splash screen. If it displays a splash screen do
7671            not immediately show the main window.
7672    
7673    2003-02-11  Jonathan Coles  <[email protected]>
7674    
7675            * Thuban/Model/classification.py: Added import line to fix
7676            feature conflicts between running on python2.2 and python2.1.
7677    
7678            * Thuban/UI/classifier.py (ClassTable): Didn't need to hang
7679            onto the clinfo parameter, so removed the deepcopy().
7680    
7681    2003-02-10  Jonathan Coles  <[email protected]>
7682    
7683            * Thuban/Model/save.py (Saver.open_element, Saver.close_element):
7684            Added element_open variable to track opening and closing of tags
7685            so that tags that don't span more than one line are closed with
7686            /> instead of </tag_name>. Use the GetDefault*() methods of
7687            the Classification class.
7688    
7689            * Thuban/Model/classification.py (Classificaton): Added set and
7690            get methods for the default data. The class also takes a layer
7691            reference so that modification messages can be sent. Fixed the
7692            methods to use the new ClassData class.
7693            (ClassData): New class to encapsulate the classification data
7694    
7695            * Thuban/Model/layer.py (Layer): Remove the
7696            Set[Fill|Stroke|StrokeWidth]() methods. Code should call the
7697            SetDefault*() methods on the layer's classification object.
7698            (Layer.__init__): Use the new SetDefault*() methods in the
7699            Classification class.
7700    
7701            * Thuban/Model/load.py (ProcessSession): Use the new ClassData
7702            object instead of a dictionary.
7703    
7704            * Thuban/UI/classifier.py (ClassRenderer): New class to
7705            draw the classifications in the dialog box's table.
7706            (Classifier): Modified to use the ClassRenderer class.
7707    
7708            * Thuban/UI/mainwindow.py (MainWindow): Use the SetDefault*()
7709            methods of the Classification class.
7710    
7711            * Thuban/UI/renderer.py (MapRenderer): Use the Get*() methods
7712            of the ClassData class.
7713    
7714            * test/test_classification.py, test/test_layer.py,
7715            test/test_map.py, test/test_session.py: Fix the tests to work
7716            with the above code changes.
7717    
7718    2003-02-03  Jonathan Coles  <[email protected]>
7719    
7720            * Thuban/Model/classification.py (Classification): Added getNull()
7721            to return the NullData reference
7722    
7723            * Thuban/Model/layer.py (Layer.SetFill, Layer.SetStroke,
7724            Layer.SetStrokeWidth): Modified these functions to change the
7725            null data in the classification rather than keep these values
7726            directly in the Layer class. Menu options to change these values
7727            work again.
7728    
7729    2003-01-28  Jonathan Coles  <[email protected]>
7730    
7731            * Thuban/UI/classifier.py (Classifier): Resolved merging conflicts.
7732            Fixed crashing problem on some systems. Dialog box shows
7733            classification data.
7734    
7735            * Thuban/UI/tree.py (SessionTreeCtrl.add_items): Handle drawing
7736            Colors in the tree view.
7737    
7738            * Thuban/Model/layer.py (Layer.TreeInfo): Added a call to build
7739            the tree info for classifications. Commented out unnecessary lines.
7740    
7741            * Thuban/Model/classification.py (Classification.TreeInfo): New
7742            function to add information about the classification into the
7743            tree view.
7744    
7745    2003-01-27  Jan-Oliver Wagner <[email protected]>
7746    
7747            * Thuban/__init__.py (_): New.
7748    
7749            * Thuban/Model/classification.py, Thuban/Model/extension.py,
7750            Thuban/Model/layer.py, Thuban/Model/load.py, Thuban/Model/map.py,
7751            Thuban/Model/session.py, Thuban/UI/application.py,
7752            Thuban/UI/classifier.py, Thuban/UI/context.py, Thuban/UI/controls.py,
7753            Thuban/UI/identifyview.py, Thuban/UI/labeldialog.py,
7754            Thuban/UI/mainwindow.py, Thuban/UI/menu.py, Thuban/UI/proj4dialog.py,
7755            Thuban/UI/renderer.py, Thuban/UI/tree.py, Thuban/Lib/connector.py,
7756            Thuban/Lib/fileutil.py: Replace user string by _() for i18n.
7757    
7758    2003-01-27  Jonathan Coles  <[email protected]>
7759    
7760            * Thuban/Model/layer.py: Classification initialization calls.
7761    
7762            * Thuban/Model/classification.py: Created class to encapsulate
7763            a layer classification. Supports specific data points and
7764            ranges.
7765    
7766            * Thuban/Model/load.py: Added support for loading classification
7767            information.
7768    
7769            * Thuban/Model/save.py: Added support for saving classification
7770            information.
7771    
7772            * Thuban/UI/classifier.py: Initial class for a dialog box for
7773            specifying classification information.
7774    
7775            * Thuban/UI/mainwindows.py: Support for opening the classifier
7776            dialog.
7777    
7778            * Thuban/UI/renderer.py: Support for drawing a layer with the
7779            classification information.
7780    
7781            * Data/iceland_sample_class.thuban: iceland_sample with
7782            classification data.
7783    
7784            * test/test_classification: Tests for the Classification class.
7785    
7786    2002-12-09  Bernhard Herzog  <[email protected]>
7787    
7788            * test/test_command.py: New. Tests for the command classes.
7789    
7790            * Thuban/UI/command.py (ToolCommand): New class for tool commands.
7791            (Command.IsTool): New method to distinguish between command
7792            switching tools and other commands.
7793    
7794            * Thuban/UI/view.py (MapCanvas.SelectTool): New method to select
7795            the tool to avoid direct assignments to instance variables
7796            (MapCanvas.ZoomInTool, MapCanvas.ZoomOutTool, MapCanvas.PanTool)
7797            (MapCanvas.IdentifyTool, MapCanvas.LabelTool): Use SelectTool to
7798            change the tool
7799    
7800            * Thuban/UI/mainwindow.py (MainWindow.update_command_ui): If an
7801            active tool's command turns insensitive, disable the tool.
7802            (_tool_command): Use the new ToolCommand class
7803    
7804            * Examples/simple_extensions/simple_tool.py (simple_tool): Use the
7805            SelectTool method to change the tool
7806            (iconfile): Use the ToolCommand class
7807    
7808    2002-12-03  Bernhard Herzog  <[email protected]>
7809    
7810            * Thuban/UI/tree.py (SessionTreeCtrl.normalize_selection): Handle
7811            the case of selected items that are not children of Layers or Maps
7812            properly. Previously this bug would trigger an assertion in
7813            wxWindows.
7814    
7815    2002-11-06  Frank Koormann  <[email protected]>
7816    
7817            * Thuban/UI/mainwindow.py: Altered the order of tools in the
7818            toolbar: First now are all navigation tools (Zoom In/Out, Pan,
7819            Full Extent).
7820    
7821    2002-10-23  Bernhard Herzog  <[email protected]>
7822    
7823            * setup.py (setup call): version now 0.1.3
7824    
7825            * MANIFEST.in: Add the files in test/
7826    
7827            * test/README: Add note about tests requiring the iceland data
7828    
7829            * Thuban/UI/mainwindow.py (MainWindow.About): Add 2002 to
7830            copyright notice.
7831    
7832    2002-10-18  Bernhard Herzog  <[email protected]>
7833    
7834            * test/test_map.py
7835            (TestMapWithContents.test_projected_bounding_box): Use an explicit
7836            epsilon.
7837    
7838            * test/support.py (FloatComparisonMixin.assertFloatEqual)
7839            (FloatComparisonMixin.assertFloatSeqEqual): give a more useful
7840            message if the assertion fails and don't return the return value
7841            of self.assert_. In assertFloatSeqEqual the return meant that not
7842            all items of the sequence were compared.
7843    
7844    2002-09-20  Bernhard Herzog  <[email protected]>
7845    
7846            * test/test_fileutil.py: New. Test cases for Thuban.Lib.fileutil
7847    
7848            * Thuban/Lib/fileutil.py: Fixup some whitespace and typos
7849    
7850            * test/test_map.py (TestMapWithContents.test_tree_info): Create
7851            the string with the bounding box on the fly because of platform
7852            differences in the way %g is handled.
7853    
7854            * test/test_layer.py (TestLayer.test_empty_layer): Create an empty
7855            DBFfile too because Thuban layers can't yet cope missing DBF
7856            files.
7857    
7858    2002-09-20  Bernhard Herzog  <[email protected]>
7859    
7860            * test/test_menu.py: Use initthuban instead of
7861            add_thuban_dir_to_path to initialize Thuban.
7862    
7863            * test/support.py (FloatComparisonMixin.assertFloatEqual): New.
7864            Mixin class for float comparisons
7865            (SubscriberMixin): New. Mixin class to test messages sent through
7866            the Connector class
7867    
7868            * test/README: Fix a typo and add the -v flag to the command for
7869            individual tests
7870    
7871            * test/test_session.py: New. Test cases for Thuban.Model.session
7872    
7873            * test/test_proj.py: New. Test cases for Thuban.Model.proj
7874    
7875            * test/test_map.py: New. Test cases for Thuban.Model.map
7876    
7877            * test/test_layer.py: New. Test cases for Thuban.Model.layer
7878    
7879            * test/test_label.py: New. Test cases for Thuban.Model.label
7880    
7881            * test/test_connector.py: New. Test cases for Thuban.Lib.connector
7882    
7883            * test/test_color.py: New. Test cases for Thuban.Model.color
7884    
7885            * test/test_base.py: New. Test cases for Thuban.Model.base
7886    
7887    2002-09-13  Bernhard Herzog  <[email protected]>
7888    
7889            * Thuban/Model/session.py (Session.forwarded_channels): Forward
7890            the CHANGED channel too.
7891    
7892            * Thuban/Model/map.py (Map.forwarded_channels): Forward the
7893            CHANGED channel too.
7894            (Map.__init__): Call the Modifiable constructor as well.
7895    
7896            * Thuban/Model/base.py (Modifiable.UnsetModified): Issue a CHANGED
7897            event if the modified flag changes.
7898            (Modifiable.changed): Tweak the doc-string.
7899    
7900            * Thuban/UI/mainwindow.py (MainWindow.view_position_changed)
7901            (MainWindow.set_position_text): Put the code that puts the text
7902            with the mouse position into the status bar into the new method
7903            set_position_text so that it can overwritten in derived classes.
7904    
7905    2002-09-12  Bernhard Herzog  <[email protected]>
7906    
7907            * Thuban/UI/mainwindow.py (MainWindow.RunMessageBox): Center the
7908            message box on the main window.
7909    
7910    2002-09-11  Bernhard Herzog  <[email protected]>
7911    
7912            * Thuban/UI/mainwindow.py: Underline the 'x' in "Exit" instead of
7913            the 'E' because it's less likely to interfere with other menu
7914            entries.
7915            (MainWindow.build_menu): remove an incorrect comment.
7916    
7917  2002-09-10  Bernhard Herzog  <[email protected]>  2002-09-10  Bernhard Herzog  <[email protected]>
7918    
7919          * Thuban/UI/mainwindow.py (MainWindow.Map): New.          * Thuban/UI/mainwindow.py (MainWindow.Map): New.
# Line 12  Line 7928 
7928          * Thuban/UI/mainwindow.py (MainWindow.OnClose): Unsubscribe          * Thuban/UI/mainwindow.py (MainWindow.OnClose): Unsubscribe
7929          VIEW_POSITION          VIEW_POSITION
7930    
7931  2002-09-04  Frank Koormann   <[email protected]>  2002-09-04  Frank Koormann  <[email protected]>
7932    
7933          * Resources/Bitmaps/fullextent.xpm: Updated Icon (removed "potatoe")          * Resources/Bitmaps/fullextent.xpm: Updated Icon (removed "potatoe")
7934    
# Line 99  Line 8015 
8015    
8016          * Thuban/Model/table.py (Table.write_record): New method to write          * Thuban/Model/table.py (Table.write_record): New method to write
8017          records.          records.
8018          (Table.__init__): Open the DBF file for writing too.          (Table.__init__): Open the DBF file for writing too.
8019    
8020          * Thuban/UI/controls.py (RecordTable.SetValue): Write the value          * Thuban/UI/controls.py (RecordTable.SetValue): Write the value
8021          into the underlying table.          into the underlying table.
# Line 137  Line 8053 
8053          * setup.py (ThubanInstall.run): Don't repr install_lib_orig          * setup.py (ThubanInstall.run): Don't repr install_lib_orig
8054          because thubaninit_contents will do it for us.          because thubaninit_contents will do it for us.
8055    
8056  2002-08-16      Jan-Oliver Wagner <[email protected]>  2002-08-16  Jan-Oliver Wagner <[email protected]>
8057    
8058          * Thuban/UI/mainwindow.py: menu item 'show session tree' now disable if          * Thuban/UI/mainwindow.py: menu item 'show session tree' now disable if
8059          tree window already open          tree window already open
# Line 265  Line 8181 
8181          * Thuban/UI/tree.py: We can now simply subscribe to the session's          * Thuban/UI/tree.py: We can now simply subscribe to the session's
8182          CHANGED channel to be informed of changes.          CHANGED channel to be informed of changes.
8183          (SessionTreeCtrl.session_channels): Not needed any longer.          (SessionTreeCtrl.session_channels): Not needed any longer.
8184          (SessionTreeCtrl.unsubscribe_all, SessionTreeCtrl.session_changed):          (SessionTreeCtrl.unsubscribe_all, SessionTreeCtrl.session_changed):
8185          Only have to (un)subscribe CHANGED          Only have to (un)subscribe CHANGED
8186    
8187          * Thuban/Model/map.py (Map.TreeInfo): Deal better with empty maps.          * Thuban/Model/map.py (Map.TreeInfo): Deal better with empty maps.
# Line 326  Line 8242 
8242          * Thuban/Model/layer.py (Layer.TreeInfo),          * Thuban/Model/layer.py (Layer.TreeInfo),
8243          Thuban/Model/extension.py (Extension.TreeInfo),          Thuban/Model/extension.py (Extension.TreeInfo),
8244          Thuban/Model/map.py (Map.TreeInfo),          Thuban/Model/map.py (Map.TreeInfo),
8245          Thuban/Model/session.py (Session.TreeInfo):          Thuban/Model/session.py (Session.TreeInfo):
8246          Add TreeInfo methods to implement the new tree view update scheme          Add TreeInfo methods to implement the new tree view update scheme
8247    
8248  2002-07-16  Bernhard Herzog  <[email protected]>  2002-07-16  Bernhard Herzog  <[email protected]>
# Line 407  Line 8323 
8323          * setup.py: In the setup call, make sure that the library          * setup.py: In the setup call, make sure that the library
8324          directories are under $prefix/lib not directly under $prefix.          directories are under $prefix/lib not directly under $prefix.
8325    
8326  2002-06-20      Jan-Oliver Wagner <[email protected]>  2002-06-20  Jan-Oliver Wagner <[email protected]>
8327    
8328          * Thuban/Model/extension.py: new module to handle extension objects.          * Thuban/Model/extension.py: new module to handle extension objects.
8329          * Thuban/Model/messages.py: new messages for extensions.          * Thuban/Model/messages.py: new messages for extensions.
# Line 636  Line 8552 
8552          * Thuban/UI/messages.py (VIEW_POSITION): New message for the          * Thuban/UI/messages.py (VIEW_POSITION): New message for the
8553          position in the statusbar          position in the statusbar
8554    
8555  2002-04-26      Frank Koormann <[email protected]>  2002-04-26  Frank Koormann <[email protected]>
8556    
8557          * Thuban/UI/mainwindow.py: AddLayer, Dialog title s/session/data          * Thuban/UI/mainwindow.py: AddLayer, Dialog title s/session/data
8558    
8559  2002-04-24      Frank Koormann <[email protected]>  2002-04-24  Frank Koormann <[email protected]>
8560            
8561          * Resources/Bitmaps/identify.xpm: shadow added          * Resources/Bitmaps/identify.xpm: shadow added
8562    
8563          * Resources/Bitmaps/fullextent.xpm: new          * Resources/Bitmaps/fullextent.xpm: new
           
 2002-04-22      Jan-Oliver Wagner <[email protected]>  
8564    
8565          * Thuban/UI/tree.py (update_tree): added test for None on map bounding box  2002-04-22  Jan-Oliver Wagner <[email protected]>
8566    
8567  2002-04-21      Jan-Oliver Wagner <[email protected]>          * Thuban/UI/tree.py (update_tree): added test for None on map bounding
8568            box
8569    
8570    2002-04-21  Jan-Oliver Wagner <[email protected]>
8571    
8572          * Thuban/UI/proj4dialog.py (UTMProposeZoneDialog): new          * Thuban/UI/proj4dialog.py (UTMProposeZoneDialog): new
8573    
8574          * Thuban/UI/tree.py (update_tree): added added map extent          * Thuban/UI/tree.py (update_tree): added added map extent
8575    
8576          * Thuban/UI/mainwindow.py (_method_command): extended by parameter          * Thuban/UI/mainwindow.py (_method_command): extended by parameter
8577          icon; added map_full_extend as tool          icon; added map_full_extend as tool
8578    
8579  2002-04-19      Jan-Oliver Wagner <[email protected]>  2002-04-19  Jan-Oliver Wagner <[email protected]>
8580    
8581          * Thuban/UI/mainwindow.py (SaveSession): launch save as dialog for          * Thuban/UI/mainwindow.py (SaveSession): launch save as dialog for
8582          saving _new_ sessions          saving _new_ sessions
# Line 761  Line 8678 
8678    
8679          * setup.py: increase version number to 0.1          * setup.py: increase version number to 0.1
8680          (data_dist): New command class for data distribution          (data_dist): New command class for data distribution
           
8681    
8682  2001-09-14  Bernhard Herzog  <[email protected]>  2001-09-14  Bernhard Herzog  <[email protected]>
8683    
8684          * Thuban/UI/identifyview.py (IdentifyListCtrl.selected_shape):          * Thuban/UI/identifyview.py (IdentifyListCtrl.selected_shape):
8685          Handle the case of no layer (i.e. layer is None) properly.          Handle the case of no layer (i.e. layer is None) properly.
8686    
8687          * Thuban/UI/proj4dialog.py (UTMDialog.__init__, Proj4Dialog.__init__):          * Thuban/UI/proj4dialog.py (UTMDialog.__init__, Proj4Dialog.__init__):
8688          Set the initial selection of the combo boxes to reflect the          Set the initial selection of the combo boxes to reflect the
8689          projection we're starting with in a way that works on windows,          projection we're starting with in a way that works on windows,
8690          too.          too.
# Line 878  Line 8794 
8794          (MainWindow.identify_view_on_demand): Store the interactor in an          (MainWindow.identify_view_on_demand): Store the interactor in an
8795          instvar and use that reference instead of going through main.app          instvar and use that reference instead of going through main.app
8796    
8797          * Thuban/UI/mainwindow.py (MainWindow.ShowSessionTree):          * Thuban/UI/mainwindow.py (MainWindow.ShowSessionTree):
8798          * Thuban/UI/application.py (ThubanApplication.OnInit):          * Thuban/UI/application.py (ThubanApplication.OnInit):
8799          * Thuban/UI/main.py (main): Create the session tree view in main          * Thuban/UI/main.py (main): Create the session tree view in main
8800          with the new mainwindow method ShowSessionTree and not directly          with the new mainwindow method ShowSessionTree and not directly
8801          the application's OnInit method          the application's OnInit method
# Line 895  Line 8811 
8811          layer to the tableview dialog.          layer to the tableview dialog.
8812    
8813          * Thuban/UI/tableview.py: Add some doc-strings          * Thuban/UI/tableview.py: Add some doc-strings
8814          (TableGrid):          (TableGrid):
8815          (TableGrid.OnRangeSelect):          (TableGrid.OnRangeSelect):
8816          (TableGrid.OnSelectCell):          (TableGrid.OnSelectCell):
8817          (TableFrame.__init__):          (TableFrame.__init__):
# Line 962  Line 8878 
8878  2001-09-05  Bernhard Herzog  <[email protected]>  2001-09-05  Bernhard Herzog  <[email protected]>
8879    
8880          * Thuban/UI/view.py (MapCanvas.__init__): New argument, interactor.          * Thuban/UI/view.py (MapCanvas.__init__): New argument, interactor.
8881            
8882          * Thuban/UI/mainwindow.py (MainWindow.__init__): New argument          * Thuban/UI/mainwindow.py (MainWindow.__init__): New argument
8883          interactor to pass through to the MapCanvas          interactor to pass through to the MapCanvas
8884            
8885          * Thuban/UI/application.py (ThubanApplication.OnInit): Use the new          * Thuban/UI/application.py (ThubanApplication.OnInit): Use the new
8886          argument to the MainWindow constructor to get rid of the ugly hack          argument to the MainWindow constructor to get rid of the ugly hack
8887          that made main.app available early just so that the mapcanvas          that made main.app available early just so that the mapcanvas
# Line 1012  Line 8928 
8928          (ThubanInstall.run): Remove the leading install root from the          (ThubanInstall.run): Remove the leading install root from the
8929          script filename if an install root was specified and use the new          script filename if an install root was specified and use the new
8930          link_file method          link_file method
8931            
8932          * Thuban/UI/mainwindow.py (MainWindow.AddLayer): Fit the map to          * Thuban/UI/mainwindow.py (MainWindow.AddLayer): Fit the map to
8933          the window when the first layer is added to the map.          the window when the first layer is added to the map.
8934    
# Line 1049  Line 8965 
8965          (InnoIconItem): Helper class for bdist_inno          (InnoIconItem): Helper class for bdist_inno
8966          (thuban_bdist_inno): Thuban specific version of bdist_inno. Added          (thuban_bdist_inno): Thuban specific version of bdist_inno. Added
8967          this together with the appropriate parameters, to the setup call.          this together with the appropriate parameters, to the setup call.
8968            
8969          * setup.cfg (bdist_inno): added new section for the inno setup          * setup.cfg (bdist_inno): added new section for the inno setup
8970          installer          installer
8971    

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

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26