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

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

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26