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

Legend:
Removed from v.848  
changed lines
  Added in v.1834

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26