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

Legend:
Removed from v.766  
changed lines
  Added in v.1799

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26