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

Legend:
Removed from v.184  
changed lines
  Added in v.2064

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26