/[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 59 by bh, Thu Sep 13 13:56:47 2001 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]>
4569    
4570            * Resources/Bitmaps/fulllayerextent.xpm,
4571            Resources/Bitmaps/fullselextent.xpm: Replaced the place holders with
4572            new icons.
4573    
4574    2003-05-06  Bernhard Herzog  <[email protected]>
4575    
4576            * Thuban/Model/transientdb.py (AutoTransientTable.SimpleQuery):
4577            New. Simply delegate to the transient table's version.
4578    
4579            * test/test_transientdb.py
4580            (TestTransientTable.test_auto_transient_table_query): New. Test
4581            case for AutoTransientTable's SimpleQuery
4582    
4583    2003-05-06  Bernhard Herzog  <[email protected]>
4584    
4585            * Thuban/Model/transientdb.py (TransientTableBase.SimpleQuery):
4586            Implement a simple query method for the query dialog
4587            (TransientTableBase.create): Add an INTEGER PRIMARY KEY that holds
4588            the row index or shapeid.
4589            (TransientTable.create): Insert the right value of the row index
4590            (TransientJoinedTable.create): Copy the row index of the left
4591            table to the joined result table
4592    
4593            * test/test_transientdb.py
4594            (TestTransientTable.test_transient_table_read_twice): Fix
4595            doc-string
4596            (TestTransientTable.test_transient_table_query): New. Test for the
4597            SimpleQuery method
4598    
4599    2003-05-06  Bernhard Herzog  <[email protected]>
4600    
4601            Convert all table users to use the new table interface. This only
4602            covers Thuban itself, not GREAT-ER or other applications built on
4603            Thuban yet, so the compatibility interface stays in place for the
4604            time being but it now issues DeprecationWarnings.
4605    
4606            Finally, the new Table interface has a new method, HasColumn.
4607    
4608            * Thuban/Model/table.py (OldTableInterfaceMixin): All methods
4609            issue deprecation warnings when they're. The warnings refer to the
4610            caller of the method.
4611            (OldTableInterfaceMixin.__deprecation_warning): New. Helper method
4612            for the deprecation warnings
4613    
4614            * test/test_table.py: Ignore the deprecation warnings for the old
4615            table in the tests in this module. The purpose of the tests is to
4616            test the old interface, after all.
4617    
4618            * test/test_transientdb.py
4619            (TestTransientTable.run_iceland_political_tests): Use the
4620            constants for the types. Add a test for HasColumn
4621            (TestTransientTable.test_transient_joined_table): Adapt to new
4622            table interface. Add a test for HasColumn
4623            (TestTransientTable.test_transient_table_read_twice): Adapt to new
4624            table interface
4625    
4626            * Thuban/UI/tableview.py (DataTable.SetTable, DataTable.GetValue):
4627            Adapt to new table interface
4628    
4629            * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Adapt to
4630            new table interface
4631    
4632            * Thuban/UI/controls.py (RecordListCtrl.fill_list)
4633            (RecordTable.SetTable): Adapt to new table interface
4634    
4635            * Thuban/UI/classifier.py (Classifier.__init__)
4636            (Classifier.__init__): Adapt to new table interface
4637    
4638            * Thuban/UI/classgen.py (ClassGenDialog.__init__)
4639            (GenUniformPanel._OnRetrieve, GenUniquePanel._OnRetrieve): Adapt
4640            to new table interface
4641    
4642            * Thuban/Model/transientdb.py (TransientTableBase.HasColumn)
4643            (AutoTransientTable.HasColumn): Implement the new table interface
4644            method
4645            (AutoTransientTable.ReadRowAsDict, AutoTransientTable.ValueRange)
4646            (AutoTransientTable.UniqueValues): Adapt to new table interface
4647    
4648            * Thuban/Model/layer.py (Layer.SetShapeStore, Layer.GetFieldType):
4649            Adapt to new table interface
4650    
4651            * test/test_layer.py (TestLayer.open_shapefile): Helper method to
4652            simplify opening shapefiles a bit easier.
4653            (TestLayer.test_arc_layer, TestLayer.test_polygon_layer)
4654            (TestLayer.test_point_layer): Use the new helper method
4655            (TestLayer.test_get_field_type): New. Test for the GetFieldType
4656            method
4657    
4658            * test/test_dbf_table.py (TestDBFTable.test_has_column): Test for
4659            the new table method
4660    
4661            * test/test_memory_table.py (TestMemoryTable.test_has_column):
4662            Test for the new table method HasColumn
4663    
4664    2003-05-06  Jonathan Coles   <[email protected]>
4665    
4666            Addresses the "Selection Extent" wish of RTbug #1787.
4667    
4668            * Resources/Bitmaps/fulllayerextent.xpm,
4669            Resources/Bitmaps/fullselextent.xpm: Bitmaps for layer and selection
4670            extent. These are just place holders for the real bitmaps.
4671    
4672            * Thuban/Model/layer.py (Shape): Since a Shape is immutable only
4673            calculate the bounding box once (the first time compute_bbox() is
4674            called).
4675            (Layer.ShapesBoundingBox): New. Given a list of shape ids, return
4676            the bounding box for the shapes in lat/long coordinates.
4677    
4678            * Thuban/UI/mainwindow.py: Added new "Full selection extent" menu
4679            option.
4680            (MainWindow.has_selected_shapes): New. Returns true if there are
4681            any selected shapes.
4682            (MainWindow.FullSelectionExtent): New. Calls
4683            MapCanvas.FitSelectedToWindow() when the user selects the menu option.
4684            (_has_selected_shapes): New. Returns true if there are any
4685            selected shapes.
4686    
4687            * Thuban/UI/selection.py (Selection.HasSelectedShapes): New. Returns
4688            true if there are any selected shapes.
4689    
4690            * Thuban/UI/view.py (MapCanvas): Added delegated method
4691            HasSelectedShapes.
4692            (MapCanvas.FitSelectedToWindow): New. Centers and scales any selected
4693            shapes on the canvas using the map projection (if any).
4694    
4695            * test/test_layer.py (TestLayer.test_arc_layer): Add some tests
4696            for Layer.ShapesBoundingBox().
4697    
4698    2003-05-06  Bernhard Herzog  <[email protected]>
4699    
4700            * Resources/Projections/defaults.proj: Fix spelling of Mercator
4701    
4702    2003-05-05  Jonathan Coles   <[email protected]>
4703    
4704            Addresses the "Full Layer Extent" wish of RTbug #1787.
4705    
4706            * Resources/Projections/defaults.proj: Added UK National Grid.
4707    
4708            * Thuban/UI/mainwindow.py: Added new "Full layer extent" menu option.
4709            (MainWindow.FullLayerExtent): New. Calls MapCanvas.FitLayerToWindow()
4710            when the user selects the menu option.
4711    
4712            * Thuban/UI/view.py (MapCanvas.FitLayerToWindow): New. Centers and
4713            scales the given layer on the canvas using the map projection.
4714    
4715    2003-05-05  Bernhard Herzog  <[email protected]>
4716    
4717            Convert the table implementations to a new table interface. All
4718            tables use a common mixin class to provide backwards compatibility
4719            until all table users have been updated.
4720    
4721            * Thuban/Model/table.py (OldTableInterfaceMixin): Mixin class to
4722            provide backwards compatibility for table classes implementing the
4723            new interface
4724            (DBFTable, MemoryTable): Implement the new table interface. Use
4725            OldTableInterfaceMixin as base for compatibility
4726            (DBFColumn, MemoryColumn): New. Column description for DBFTable
4727            and MemoryTable resp.
4728    
4729            * test/test_dbf_table.py: New. Test cases for the DBFTable with
4730            the new table interface.
4731    
4732            * test/test_memory_table.py: New. Test cases for the MemoryTable
4733            with the new table interface.
4734    
4735            * test/test_table.py: Document the all tests in this file as only
4736            for backwards compatibility. The equivalent tests for the new
4737            interface are in test_memory_table.py and test_dbf_table.py
4738            (MemoryTableTest.test_read): field_info should be returning tuples
4739            with four items
4740            (MemoryTableTest.test_write): Make doc-string a more precise.
4741    
4742            * Thuban/Model/transientdb.py (TransientTableBase): Convert to new
4743            table interface. Derive from from OldTableInterfaceMixin for
4744            compatibility.
4745            (TransientTableBase.create): New intance variable column_map to
4746            map from names and indices to column objects
4747            (TransientTable.create): Use the new table interface of the input
4748            table
4749            (AutoTransientTable): Convert to new table interface. Derive from
4750            from OldTableInterfaceMixin for compatibility.
4751            (AutoTransientTable.write_record): Removed. It's not implemented
4752            yet and we still have to decide how to handle writing with the new
4753            table and data framework.
4754    
4755            * test/test_transientdb.py
4756            (TestTransientTable.run_iceland_political_tests)
4757            (TestTransientTable.test_transient_joined_table): Use the new
4758            table interface
4759    
4760    2003-05-05  Jonathan Coles   <[email protected]>
4761    
4762            This is namely a collection of UI updates to improve user interactivity.
4763            Tabbing between controls now exists and you can use ESC to close dialog
4764            boxes; ENTER will active the default button.
4765    
4766            * Thuban/UI/classgen.py (ClassGenDialog.__init__): Rearrange the
4767            order that the controls are created so that tabbing works correctly.
4768            (ClassGenDialog.OnOK): Renamed from _OnGenerate() so that the
4769            wxDialog can handle the default button correctly.
4770            (ClassGenDialog.OnCancel): Renamed from _OnCloseBtn() for the
4771            same reasons as for OnOK.
4772            (GenUniformPanel._OnRetrieve): Call wxBeginBusyCursor/wxEndBusyCursor
4773            when we ask the table for the maximum/minimum values of a field
4774            which could take a very long time.
4775    
4776            * Thuban/UI/classifier.py (Classifier.__init__): Rearrange the
4777            order that the controls are created so that tabbing works correctly.
4778            (SelectPropertiesDialog.__init__): Rearrange the order that the
4779            controls are created so that tabbing works correctly.
4780    
4781            * Thuban/UI/dialogs.py: Copied NonModalDialog box and changed it
4782            to derive from a wxDialog but behave like the original implementation
4783            which was derived from a wxFrame. wxDialog provides useful key
4784            handling functionality like ESC calling OnCancel and ENTER calling
4785            OnOK which is lost with wxFrame.
4786    
4787            * Thuban/UI/mainwindow.py: Add "..." to menu items that will open
4788            new dialogs.
4789    
4790            * Thuban/UI/projdialog.py (ProjFrame.__init__): Rearrange the
4791            order that the controls are created so that tabbing works correctly.
4792            (ProjFrame.OnApply): Renamed from _OnTry() to use wxDialog behaviour.
4793            (ProjFrame.OnOK): Renamed from _OnOK() to use wxDialog behaviour.
4794            (ProjFrame.OnCancel): Renamed from _OnClose() to use wxDialog behaviour.
4795            (ProjPanel.__init__): Add "Airy" to the list of ellipsoids so we
4796            can provide the "UK National Grid" as a default projection.
4797            (UTMPanel.__init__): Rearrange the order that the controls are
4798            created so that tabbing works correctly.
4799    
4800    2003-05-05  Bernhard Herzog  <[email protected]>
4801    
4802            * extensions/thuban/wxproj.cpp: Fix some of the comments.
4803            (project_point): If a map projection but no layer projection is
4804            given, convert degrees to radians before applying the map
4805            projection.
4806    
4807            * Thuban/UI/tableview.py (TableGrid.disallow_messages)
4808            (TableGrid.allow_messages): New methods to make it possible to
4809            inhibit message sending.
4810            (TableGrid.issue): Only send the message if not inhibited.
4811            (LayerTableGrid.select_shape): Use the new methods to make sure
4812            that no ROW_SELECTED message is sent while we're updating the
4813            selected rows to match the selected shapes.
4814    
4815    2003-05-02  Jan-Oliver Wagner <[email protected]>
4816    
4817            Implementation of MemoryTable.
4818    
4819            * Thuban/Model/table.py (MemoryTable): New. Quite simple table
4820            implementation that operates on a list of tuples. All of the data
4821            are kept in the memory.
4822    
4823            * test/test_table.py (MemoryTableTest): New.
4824    
4825            * test/test_transientdb.py (SimpleTable): Removed.
4826            (TestTransientTable.test_transient_joined_table,
4827            (TestTransientTable.test_transient_table_read_twice): Replaced
4828            SimpleTable by MemoryTable.
4829    
4830    2003-04-30  Jonathan Coles   <[email protected]>
4831    
4832            * Data/iceland_sample.thuban: Now contains correct projections
4833            for each of the layers.
4834    
4835            * Resources/Projections/defaults.proj: Geographic projection
4836            contains unit conversion parameter.
4837    
4838    2003-04-30  Jonathan Coles   <[email protected]>
4839    
4840            The most important part of this putback is the projection changes.
4841            It should now be possible to specify the projection that a layer
4842            is in and then specify a different projection for the map. The
4843            projection dialog has an extra parameter for a geographic projection
4844            which lets the user select if the input is in degrees or radians.
4845    
4846            * Thuban/Model/layer.py (Layer.ShapesInRegion): Fix docstring
4847            to say that the parameter is a tuple of unprojected
4848            points (which is what the callers to this method were assuming).
4849            Also, since the points are unprojected we need to projected them.
4850    
4851            * Thuban/UI/legend.py (LegendTree.MoveCurrentItemUp,
4852            LegendTree.MoveCurrentItemDown): If the layer or any of the layer's
4853            groups are selected, move the layer up/down. Fixes RTbug #1833.
4854    
4855            * Thuban/UI/mainwindow.py: Move menu item map_rename up.
4856    
4857            * Thuban/UI/projdialog.py (ProjFrame._OnSave): Add missing
4858            parameter in call to SetClientData.
4859            (GeoPanel): Add support for selecting the units that the
4860            source data is in (Radians or Degrees).
4861    
4862            * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Optimize
4863            the rendering loop by reducing the number of if's, removing the
4864            unnecessary try/except block, and checking if the old group
4865            is the same as the new one (which happens a lot if there is
4866            no classification, or lots of shapes are in the same group).
4867    
4868            * Thuban/UI/view.py (MapCanvas.OnPaint): Add a try/except block
4869            around the redraw routine to try to catch problems that the user
4870            may create by selecting invalid projections for the data set and
4871            map. Clears the display if there are any problems and prints the
4872            error.
4873            (MapCanvas.do_redraw): Use DC.Clear() instead of drawing a filled
4874            rectangle.
4875    
4876            * extensions/thuban/wxproj.cpp (project_point): First invert the
4877            supplied point (which should be in projected coordinates) using
4878            the layer's projection and then project the point using the
4879            map's projection.
4880            (project_points): Use project_point() to project each point.
4881    
4882    2003-04-30  Jan-Oliver Wagner <[email protected]>
4883    
4884            * Thuban/Model/layer.py (Layer.SetShapeStore): Fixed a bug:
4885            don't set the Classification to None if the classfication field
4886            is None (ie only a DEFAULT).
4887    
4888    2003-04-30  Bernhard Herzog  <[email protected]>
4889    
4890            * Thuban/UI/view.py: Fix some typos.
4891    
4892            * Thuban/UI/mainwindow.py (MainWindow.identify_view_on_demand): Do
4893            not pop up the dialog if the selection becomes empty (this could
4894            happen if e.g. a new selection is opened while the identify tool
4895            is active and dialog had been closed)
4896    
4897    2003-04-30  Bernhard Herzog  <[email protected]>
4898    
4899            * Thuban/Model/transientdb.py (TransientTableBase.__init__): New
4900            instance variable read_record_last_result
4901            (TransientTableBase.read_record): Make sure reading the same
4902            record twice works. The implementation uses the new instance
4903            variable read_record_last_result
4904    
4905            * test/test_transientdb.py
4906            (TestTransientTable.test_transient_table_read_twice): New test
4907            case for the above bug-fix.
4908    
4909    2003-04-29  Jonathan Coles   <[email protected]>
4910    
4911            * Thuban/common.py: Removed. No longer needed Str2Num. RTbug #1832.
4912    
4913            * Thuban/UI/classgen.py: Remove all uses of Str2Num.
4914    
4915            * Thuban/UI/classifier.py: Remove all uses of Str2Num.
4916            (ClassTable.SetValueAsCustom): Rename keyword argument in
4917            ClassGroup* constructors to match argument name.
4918    
4919    2003-04-29  Bernhard Herzog  <[email protected]>
4920    
4921            * Thuban/Model/session.py (Session.Destroy): Explicitly close the
4922            transient DB if it exists to make sure it doesn't leave a journal
4923            file in the temp directory.
4924    
4925            * Thuban/Model/transientdb.py (TransientDatabase.close): Set
4926            self.conn to None after closing the connection to make sure it's
4927            not closed twice
4928    
4929    2003-04-29  Jonathan Coles   <[email protected]>
4930    
4931            Add a visible parameter in the layer XML tag. The default value is
4932            "true". If anything other than "false" is specified we also assume
4933            "true". Addresses RTbug #1025.
4934    
4935            * Doc/thuban.dtd: Add visible parameter to a layer.
4936    
4937            * Thuban/Model/layer.py (BaseLayer.__init__): Change default value
4938            of visible from 1 to True.
4939            (Layer.__init__): Change default value of visible from 1 to True.
4940    
4941            * Thuban/Model/load.py (SessionLoader.start_layer): Read visible
4942            parameter.
4943    
4944            * Thuban/Model/save.py (SessionSaver.write_layer): Save visible
4945            parameter.
4946    
4947            * test/test_load.py: Add new test data contents_test_visible.
4948            (LoadSessionTest.setUp): save test data.
4949            (LoadSessionTest.testLayerVisibility): Test if the visible flag
4950            is loaded correctly.
4951    
4952            * test/test_save.py (SaveSessionTest.testSingleLayer): Add test
4953            for saving an invisible layer.
4954    
4955    2003-04-29  Jonathan Coles   <[email protected]>
4956    
4957            * Thuban/UI/mainwindow.py (MainWindow.SetMap): Look up the
4958            legend dialog box and tell it to change its map to the one
4959            supplied to SetMap(). Fixes RTbug #1770.
4960    
4961    2003-04-29  Bernhard Herzog  <[email protected]>
4962    
4963            Next step of table implementation. Introduce a transient database
4964            using SQLite that some of the data is copied to on demand. This
4965            allows us to do joins and other operations that require an index
4966            for good performance with reasonable efficiency. Thuban now needs
4967            SQLite 2.8.0 and pysqlite 0.4.1. Older versions may work but I
4968            haven't tested that.
4969            
4970            * Thuban/Model/transientdb.py: New. Transient database
4971            implementation.
4972    
4973            * test/test_transientdb.py: New. Tests for the transient DB
4974            classes.
4975    
4976            * Thuban/Model/session.py (AutoRemoveFile, AutoRemoveDir): New
4977            classes to help automatically remove temporary files and
4978            directories.
4979            (Session.__init__): New instance variables temp_dir for the
4980            temporary directory and transient_db for the SQLite database
4981            (Session.temp_directory): New. Create a temporary directory if not
4982            yet done and return its name. Use AutoRemoveDir to have it
4983            automatically deleted
4984            (Session.TransientDB): Instantiate the transient database if not
4985            done yet and return it.
4986    
4987            * Thuban/Model/data.py (ShapefileStore.__init__): Use an
4988            AutoTransientTable so that data is copied to the transient DB on
4989            demand.
4990            (SimpleStore): New class that simply combines a table and a
4991            shapefile
4992    
4993            * Thuban/Model/table.py (Table, DBFTable): Rename Table into
4994            DBFTable and update its doc-string to reflect the fact that this
4995            is only the table interface to a DBF file. Table is now an alias
4996            for DBFTable for temporary backwards compatibility.
4997    
4998            * Thuban/UI/application.py (ThubanApplication.OnExit): Make sure
4999            the last reference to the session goes away so that the temporary
5000            files are removed properly.
5001    
5002            * test/test_load.py (LoadSessionTest.tearDown): Remove the
5003            reference to the session to make sure the temporary files are
5004            removed.
5005    
5006    2003-04-29  Bernhard Herzog  <[email protected]>
5007    
5008            * Thuban/Model/load.py (XMLReader.__init__, XMLReader.read): Turn
5009            the __parser instance variable into a normal local variable in
5010            read. It's only used there and read will never be called more than
5011            once. Plus it introduces a reference cycle that keeps can keep the
5012            session object alive for a long time.
5013    
5014    2003-04-29  Jonathan Coles   <[email protected]>
5015    
5016            * Thuban/Model/proj.py (Projection): Removed Set*() methods to make
5017            Projection an immutable item. Fixes RTbug #1825.
5018            (Projection.__init__): Initialize instance variables here.
5019            (ProjFile.Replace): New. Replace the given projection object with
5020            the new projection object. This solves the problem of needing the
5021            mutator Projection.SetProjection() in the ProjFrame class and
5022            allows a projection to change parameters without changing its
5023            location in the file.
5024    
5025            * Thuban/UI/mainwindow.py (MainWindow.SaveSessionAs): Dialog should
5026            be of type wxSAVE and should verify overwriting a file.
5027    
5028            * Thuban/UI/projdialog.py (ProjFrame._OnSave): Use the new
5029            ProjFile.Replace() method instead of the mutator
5030            Projection.SetProjection(). Also requires that we reassign the
5031            client data to the new projection.
5032    
5033            * test/test_proj.py (TestProjection.test): Test GetName() and
5034            GetAllParameters()
5035            (TestProjFile.test): Remove tests for Set*() methods. Add tests
5036            for Replace().
5037    
5038    2003-04-25  Jonathan Coles   <[email protected]>
5039    
5040            * Thuban/Model/save.py (SessionSaver.write_projection): Make sure
5041            to save the name of the projection.
5042    
5043            * test/test_save.py (SaveSessionTest.testLayerProjection): New
5044            test to verify layer projections are saved correctly.
5045    
5046    2003-04-25  Jonathan Coles   <[email protected]>
5047    
5048            * Thuban/Model/proj.py (Projection.SetName): Set the name
5049            to "Unknown" if name is None.
5050            (Projection.SetAllParameters): New. Set the projection's
5051            parameter list to the one supplied.
5052            (Projection.SetProjection): New. Set the projection's
5053            properties to those of the supplied Projection.
5054    
5055            * Thuban/UI/mainwindow.py (MainWindow.MapProjection): Set
5056            the dialog title to include the map's title.
5057            (MainWindow.LayerProjection): Set the dialog title to include
5058            the layer's title.
5059    
5060            * Thuban/UI/projdialog.py (ProjFrame.__ShowError): Consolidate
5061            error dialogs into a single method call.
5062            (ProjFrame.__VerifyButtons): Add more states to check.
5063            (ProjFrame.__GetProjection): Return the current state of an
5064            edited projection or None.
5065            (ProjFrame.__FillAvailList): Remove checks for states that
5066            shouldn't exist.
5067            (ProjFrame._OnNew): Clear all selected items and supply
5068            a projection panel if necessary.
5069    
5070            * test/test_proj.py (TestProjFile.test): Add tests for
5071            ProjFile.SetAllParameters, ProjFile.SetProjection,
5072            ProjFile.SetName.
5073    
5074    2003-04-25  Jonathan Coles   <[email protected]>
5075    
5076            * Thuban/UI/projdialog.py (ProjFrame.__FillAvailList): Now
5077            takes an optional argument to select the current projection.
5078            This does not guarantee that the item is visible due to
5079            limited wxWindows functionality. Fixes RTBug #1821.
5080    
5081    2003-04-25  Jonathan Coles   <[email protected]>
5082    
5083            * Thuban/Model/load.py (SessionLoader.start_projection): Remember
5084            the projection name and use it when constructing the Projection
5085            object.
5086    
5087            * Thuban/Model/proj.py (Projection.__init__): Change the default
5088            value for 'name' to None and then test if name is equal to None
5089            in the body of the constructor. This way the caller doesn't have to
5090            know what the default value should be. Namely, useful in load.py
5091            where we have to pick a default value if the 'name' parameter
5092            doesn't exist in the XML file.
5093    
5094            * test/test_load.py (LoadSessionTest.testLayerProjection): New.
5095            Tests a file where a layer has a projection.
5096    
5097    2003-04-25  Jonathan Coles   <[email protected]>
5098    
5099            * Thuban/Model/layer.py (Layer.TreeInfo): Add an item to the
5100            tree for projection information.
5101    
5102            * Thuban/Model/load.py (XMLReader.GetFilename): Renamed from
5103            XMLReader.GetFileName.
5104            (SessionLoader): Added support for loading projection tags that
5105            appear inside a layer.
5106    
5107            * Thuban/Model/proj.py (ProjFile): Document the class. Move
5108            back to using a list because the order of the projections in
5109            the file is important to maintain. Fixes RTbug #1817.
5110    
5111            * Thuban/Model/resource.py: Rename calls to ProjFile.GetFileName
5112            to ProjFile.GetFilename.
5113    
5114            * Thuban/Model/save.py (SessionSaver.write_layer): Save projection
5115            information.
5116    
5117            * Thuban/UI/projdialog.py (ProjFrame._OnAddToList): Renamed from
5118            ProjFrame._OnSaveAs. Removed old dead code from previous
5119            implementation.
5120            (ProjFrame._OnExport): Add support for exporting more than one
5121            projection to a single file.
5122            (ProjFrame.__FillAvailList): use string formatting (% operator)
5123            to build strings that are (partly) translated. Fixes RTbug #1818.
5124    
5125            * test/test_proj.py (TestProjFile.test): New. Tests the base ProjFile
5126            class.
5127    
5128    2003-04-24  Bernhard Herzog  <[email protected]>
5129    
5130            * po/es.po: Updated Spanish translation by Daniel Calvelo Aros
5131    
5132            * po/fr.po: New. French translation by Daniel Calvelo Aros
5133    
5134            * Thuban/UI/projdialog.py (ProjFrame._OnSaveAs): Don't translate
5135            empty strings.
5136    
5137    2003-04-24  Jonathan Coles   <[email protected]>
5138    
5139            * Thuban/Model/layer.py (Layer.GetProjection): New. Needed to
5140            implement the interface that the ProjFrame dialog expects.
5141    
5142            * Thuban/Model/proj.py (Projection.SetName): New. Allows the
5143            name of the projection to be changed.
5144            (ProjFile): Use a dictionary instead of a list so that removing
5145            projections is easier and we are sure about uniqueness.
5146            (ProjFile.Remove): Remove the given projection object.
5147    
5148            * Thuban/Model/resource.py (GetSystemProjFiles, GetUserProjFiles):
5149            Return a list with only one projection file instead of searching for
5150            any projection file. This simplifies many things if the user can
5151            only have one system file and one user file.
5152    
5153            * Thuban/UI/classgen.py: Change all references to
5154            genCombo to genChoice.
5155    
5156            * Thuban/UI/mainwindow.py: Add a Projection option under the
5157            layer menu.
5158            (MainWindow.LayerProjection): New. Open up a projection window
5159            for a layer.
5160    
5161            * Thuban/UI/projdialog.py: Large changes to how the dialog is
5162            laid out. Use three panels instead of one. One for the list of
5163            projections, one for the edit controls, and one for the buttons.
5164            Fixed resizing problems so that the dialog resizes correctly
5165            when the projection panel changes. Added import/export, save, and
5166            new buttons/functionality.
5167    
5168    2003-04-24  Bernhard Herzog  <[email protected]>
5169    
5170            First step towards table management. Introduce a simple data
5171            abstraction so that we replace the data a layer uses more easily
5172            in the next step.
5173    
5174            * Thuban/Model/data.py: New file with a simple data abstraction
5175            that bundles shapefile and dbffile into one object.
5176    
5177            * Thuban/Model/session.py (Session.OpenShapefile): New method to
5178            open shapefiles and return a shape store object
5179    
5180            * Thuban/Model/layer.py (Layer.__init__): Pass the data as a store
5181            object instead of a shapefile filename. This introduces a new
5182            instance variable store holding the datastore. For intermediate
5183            backwards compatibility keep the old instance variables.
5184            (open_shapefile): Removed. No longer needed with the shape store.
5185            (Layer.SetShapeStore, Layer.ShapeStore): New methods to set and
5186            get the shape store used by a layer.
5187            (Layer.Destroy): No need to explicitly destroy the shapefile or
5188            table anymore.
5189    
5190            * Thuban/UI/mainwindow.py (MainWindow.AddLayer)
5191            (MainWindow.AddLayer): Use the session's OpenShapefile method to
5192            open shapefiles
5193    
5194            * Thuban/Model/load.py (ProcessSession.start_layer): Use the
5195            session's OpenShapefile method to open shapefiles
5196    
5197            * test/test_classification.py
5198            (TestClassification.test_classification): Use the session's
5199            OpenShapefile method to open shapefiles and build the filename in
5200            a more platform independed way
5201    
5202            * test/test_layer.py (TestLayer.setUp, TestLayer.tearDown):
5203            Implement to have a session to use in the tests
5204            (TestLayer.test_arc_layer, TestLayer.test_polygon_layer)
5205            (TestLayer.test_point_layer, TestLayer.test_empty_layer): Use the
5206            session's OpenShapefile method to open shapefiles
5207            (TestLayerLegend.setUp): Instantiate a session so that we can use
5208            it to open shapefiles.
5209            (TestLayerLegend.tearDown): Make sure that all references to
5210            layers and session are removed otherwise we may get a resource
5211            leak
5212    
5213            * test/test_map.py (TestMapAddLayer.test_add_layer)
5214            (TestMapWithContents.setUp): Instantiate a session so that we can
5215            use it to open shapefiles.
5216            (TestMapWithContents.tearDown): Make sure that all references to
5217            layers, maps and sessions are removed otherwise we may get a
5218            resource leak
5219            ("__main__"): use support.run_tests() so that more info about
5220            uncollected garbage is printed
5221    
5222            * test/test_save.py (SaveSessionTest.testSingleLayer): Use the
5223            session's OpenShapefile method to open shapefiles
5224            ("__main__"): use support.run_tests() so that more info about
5225            uncollected garbage is printed
5226    
5227            * test/test_selection.py (TestSelection.tearDown): Make sure that
5228            all references to the session and the selection are removed
5229            otherwise we may get a resource leak
5230            (TestSelection.get_layer): Instantiate a session so that we can
5231            use it to open shapefiles.
5232            ("__main__"): use support.run_tests() so that more info about
5233            uncollected garbage is printed
5234    
5235            * test/test_session.py (TestSessionBase.tearDown)
5236            (TestSessionWithContent.tearDown): Make sure that all references
5237            to the session and layers are removed otherwise we may get a
5238            resource leak
5239            (TestSessionWithContent.setUp): Use the session's OpenShapefile
5240            method to open shapefiles
5241    
5242    2003-04-24  Jonathan Coles   <[email protected]>
5243    
5244            * Thuban/Model/load.py (XMLReader.read): Should have been checking
5245            if the file_or_filename object had the 'read' attribute.
5246    
5247    2003-04-23  Jonathan Coles   <[email protected]>
5248    
5249            * Thuban/Model/resource.py: Fixes RTbug #1813.
5250            (ReadProjFile): Add documentation about which exceptions are raised.
5251            Always pass the exceptions up to the caller.
5252            (GetProjFiles): If the directory can't be read return an empty list.
5253            If any of the proj files can't be read skip that file and go
5254            on to the next one.
5255    
5256            * test/test_proj.py: Added test cases to handle nonexistent files,
5257            unreadable files, and files that don't parse correctly.
5258    
5259    2003-04-23  Jonathan Coles   <[email protected]>
5260    
5261            Projection dialog. Allows the user to select from a list
5262            of projection templates and optionally edit them and save new ones.
5263    
5264            * Thuban/UI/projdialog.py (ProjFrame): New. Main dialog.
5265            (ProjPanel): Base class for projection specific panels.
5266            (TMPanel): Projection panel for Transverse Mercartor.
5267            (UTMPanel): Projection panel for Universal Transverse Mercartor.
5268            (LCCPanel): Projection panel for Lambert Conic Conformal.
5269            (GeoPanel): Projetion panel for Geographic Projection.
5270    
5271    2003-04-23  Jonathan Coles   <[email protected]>
5272    
5273            * Thuban/Model/load.py (XMLReader): Renamed from XMLProcessor to
5274            promote symmetry. There now exists XMLReader and XMLWriter.
5275            (XMLReader.read): New. Call to read the given file descriptor or
5276            filename.
5277            (XMLReader.close): New. Make sure the file is closed.
5278            (XMLReader.GetFileName): New. Return just the file name that is being
5279            read from.
5280            (XMLReader.GetDirectory): New. Return just the directory of the file
5281            that is being read.
5282            (XMLReader.AddDispatchers): New. Take a dictionary which contains
5283            the names of functions to call as the XML tree is parsed.
5284            (XMLReader.startElementNS): Updated to use new dispatcher dictionary.
5285            (XMLReader.endElementNS): Updated to use new dispatcher dictionary.
5286            (SessionLoader): Removed class variables start_dispatcher and
5287            end_dispatcher since this functionality is now part of a class
5288            instance. Fixes RTbug #1808.
5289            (SessionLoader.__init__): Add dispatcher functions.
5290            (load_xmlfile): Code was moved into the XMLReader.read().
5291            (load_session): Use modified SessionLoader.
5292    
5293            * Thuban/Model/map.py (Map.GetProjection): New. Returns the
5294            map's projection.
5295    
5296            * Thuban/Model/proj.py (Projection.GetParameters): Renamed to
5297            GetAllParameters.
5298            (Projection.GetParameter): Returns the value for the given parameter.
5299    
5300            * Thuban/Model/resource.py: Use XMLReader and XMLWriter.
5301            (GetProjFiles): Renamed from GetProjections. Now returns a list
5302            of ProjFile objects.
5303            (GetSystemProjFiles): Renamed from GetSuppliedProjections. Returns
5304            a list of ProjFile objects whose files are not user defined.
5305            (GetUserProjFiles): Renamed from GetUserProjections. Returns a
5306            list of ProjFile objects whose files are user defined.
5307            (ProjFileReader): Extend new XMLReader.
5308    
5309            * Thuban/Model/save.py (XMLWriter): Renamed from XMLSaver to
5310            promote symmetry.
5311    
5312            * Thuban/UI/classgen.py (ClassGenDialog.__init__): Use a wxChoice
5313            control instead of a wxComboBox. wxChoice controls do not generate
5314            events as the uses highlights possible choices which fixes problems
5315            with resizing the dialog when the use selects an option.
5316    
5317            * Thuban/UI/classifier.py (Classifier.__init__): Use a wxChoice
5318            control instead of a wxComboBox.
5319    
5320            * Thuban/UI/mainwindow.py (MainWindow.Projection): Use new projection
5321            dialog.
5322    
5323            * test/test_proj.py (TestProjection.test): New tests for GetParameter
5324            method.
5325    
5326    2003-04-22  Bernhard Herzog  <[email protected]>
5327    
5328            * Thuban/UI/mainwindow.py: Remove some unused imports and global
5329            constants
5330    
5331            * Thuban/UI/identifyview.py (IdentifyListCtrl.selected_shape)
5332            (IdentifyGridCtrl.selected_shape): Use table, not shapetable.
5333    
5334    2003-04-17  Bernhard Herzog  <[email protected]>
5335    
5336            * Thuban/Model/layer.py: Don't import LAYER_LEGEND_CHANGED.
5337            (Layer): Update doc-string since LAYER_LEGEND_CHANGED is not used
5338            anymore.
5339            (Layer.BoundingBox, Layer.GetFieldType, Layer.NumShapes)
5340            (Layer.ShapeType, Layer.Shape): No need to call
5341            self.open_shapefile since it's always called in __init__
5342    
5343            * Thuban/UI/application.py (ThubanApplication.MainLoop): Removed.
5344            In wxPython 2.4 there's no need to extend MainLoop anymore since
5345            wxPython itself makes sure OnExit is called.
5346    
5347    2003-04-16  Jonathan Coles   <[email protected]>
5348    
5349            Initial putback of projection management code. Includes new
5350            classes to read and write projection files. The current load
5351            and save classes were abstracted a bit so they could be reused.
5352            The Projection class was extended to provide new methods and
5353            have a name.
5354    
5355            * Thuban/Model/load.py (XMLProcessor): New. Contains all the
5356            general XML reading methods that were part of ProcessSession.
5357    
5358            * Thuban/Model/proj.py (Projection.__init__): Accepts an optional
5359            name.
5360            (ProjFile): New. Represents a file that contains projection
5361            information.
5362    
5363            * Thuban/Model/resource.py: New. Contains general utilities
5364            for read and writing projection files.
5365    
5366            * Thuban/Model/save.py (XMLSaver): New. Contains all the
5367            general XML writing methods that were part of SessionSaver.
5368            (SessionSaver): Renamed from Saver.
5369    
5370            * test/test_proj.py: New test cases for the projection
5371            file read and write functions.
5372    
5373    2003-04-16  Jonathan Coles   <[email protected]>
5374    
5375            * Thuban/Model/classification.py: Use repr() around values
5376            in the ClassGroup*.__repr__() methods so it is clearer when
5377            a value is a string and when it is a number.
5378    
5379            * test/test_load.py: Rework the classification test to test
5380            that we can load old files.
5381            (testLabels): Test a file where the groups have labels.
5382    
5383    2003-04-16  Bernhard Herzog  <[email protected]>
5384    
5385            Safer implementation of the performance enhancements of the
5386            low-level renderer:
5387            
5388            * extensions/thuban/wxproj.cpp (extract_projection)
5389            (extract_pointer): Rename extract_projection to extract_pointer
5390            and redefine its purpose to return the pointer stored in a CObject
5391            returned by the object's cobject method. Update all callers.
5392            (s_draw_info, free_draw_info, draw_polygon_init): Implement the
5393            handling of these low-level parameters so that each s_draw_info
5394            instance is handled as a CObject at python level that also
5395            contains real references to the actual python objects which
5396            contain the values in the struct. Add free_draw_info as the
5397            destructor.
5398            (draw_polygon_shape): Add the py_draw_info parameter which must a
5399            cobject containing an s_draw_info pointer.
5400    
5401            * Thuban/UI/renderer.py (MapRenderer.polygon_render_param): New
5402            method to instantiat the low-level render parameter
5403            (MapRenderer.draw_shape_layer): Use the new method. Remove some
5404            commented out code.
5405            (MapRenderer.draw_polygon_shape): Make the first parameter not the
5406            layer but the low-level render parameter
5407            (ScreenRenderer.draw_shape_layer): Use the low-level render
5408            parameter.
5409    
5410    2003-04-15  Jonathan Coles   <[email protected]>
5411    
5412            * Thuban/Model/classification.py: Implemented __repr__ for
5413            the ClassGroup* classes to make debugging a bit easier.
5414            (ClassGroup.SetLabel): Check that the string is an instance
5415            of StringTypes not StringType. Accounts for Unicode strings.
5416    
5417            * Thuban/Model/color.py: Implemented __repr__ to make
5418            debugging a bit easier.
5419    
5420            * Thuban/Model/save.py (Saver.write_classification): Need to
5421            save the group label.
5422    
5423            * test/test_load.py (testClassification): New. Loads the
5424            iceland_sample_test.thuban file and checks if it was loaded
5425            correctly.
5426    
5427    2003-04-15  Jonathan Coles   <[email protected]>
5428    
5429            * extensions/thuban/wxproj.cpp (draw_polygon_init): New. Used
5430            to improve rendering performance by initializing the variables
5431            that are not change each time draw_polygon_shape() is called.
5432            The values are stored in a global struct draw_info.
5433            (draw_polygon_shape): Removed initialization code that is
5434            now in draw_polygon_init().
5435    
5436            * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Make
5437            drawing initialization call to draw_polygon_init()
5438            (MapRenderer.draw_polygon_shape): Use new signature of
5439            draw_polygon_shape.
5440    
5441            * Thuban/UI/classgen.py (GenUniformPanel): Fix spin control
5442            weirdness by setting the range to (1, maxint).
5443    
5444            * Thuban/Model/classification.py (ClassGroupProperties): Make
5445            instance variables private and optimize comparison operator
5446            by first checking if the color references are the same.
5447            (ClassGroupSingleton): Make instance variables private.
5448            (ClassGroupRange): Make instance variables private.
5449    
5450            * HOWTO-Release: Filled in missing steps for releasing packages.
5451    
5452    2003-04-15  Bernhard Herzog  <[email protected]>
5453    
5454            First stab at internationalized messages:
5455    
5456            * Thuban/__init__.py (_): Implement the translation function for
5457            real using the python gettext module.
5458    
5459            * Thuban/UI/classifier.py (ClassTable.GetRowLabelValue): Don't
5460            translate empty strings.
5461    
5462            * Thuban/UI/application.py (ThubanApplication.read_startup_files):
5463            Add a missing space to a warning message
5464    
5465            * po/README: New. Notes about the management of the translation
5466            files.
5467    
5468            * po/Makefile: New. Makefile to help manage the translation files.
5469    
5470            * po/es.po: New. Spanish translation by Daniel Calvelo Aros
5471    
5472            * MANIFEST.in: Include the *.mo files in Resources/Locale and the
5473            translations and support files in po/
5474    
5475            * setup.py (data_files): Add the *.mo files to the data_files too
5476    
5477            * README: Add note about the translations when building from CVS
5478    
5479    2003-04-14  Jonathan Coles   <[email protected]>
5480    
5481            * Thuban/UI/dock.py: Fixes some window resizing problems most
5482            noticable under windows. Always assume the button bitmaps will
5483            be there. Code clean up.
5484            (DockabelWindow.Dock, DockableWindow.UnDock): Force all the
5485            images for the dock/undock button to the same images.
5486            Work around for RTbug #1801.
5487    
5488            * Thuban/UI/legend.py (LegendPanel.__init__): The toolbar should
5489            be allowed to grow within the sizer. Fixes a bug under Windows
5490            where the toolbar wasn't being drawn.
5491    
5492    2003-04-14  Frank Koormann   <[email protected]>
5493    
5494            * Resources/Bitmaps/dock_12.xpm, Resources/Bitmaps/undock_12.xpm:
5495            Updated design to try to make the button functionality more
5496            transparent.
5497    
5498    2003-04-14  Jonathan Coles   <[email protected]>
5499    
5500            * Thuban/UI/legend.py (LegendPanel.__init__): Call Create() to
5501            finalize the intialization of the panel.
5502    
5503            * Thuban/UI/dock.py (DockPanel.Create): New. Finalizes the
5504            creation of the panel. Should be the last thing called in the
5505            initializer of a subclass.
5506    
5507            * Thuban/UI/classgen.py (ClassGenDialog.__init__): Actively
5508            set the current selections in the combo boxes. This is needed
5509            under Windows.
5510    
5511            * Thuban/UI/classifier.py (Classifier.__init__): Add a top
5512            level panel to the dialog so that the background colors are
5513            consistent under Windows.
5514    
5515    2003-04-11  Jonathan Coles   <[email protected]>
5516    
5517            * Thuban/UI/classgen.py: Change color ramps to start at white
5518            not black.
5519    
5520            * Thuban/UI/legend.py: Enable/disable the legend buttons when
5521            the legend changes. Fixes RTbug #1793.
5522    
5523            * test/test_classification.py: Added test for copying of
5524            classifications.
5525    
5526    2003-04-11  Jonathan Coles   <[email protected]>
5527    
5528            * Thuban/UI/resource.py: New. Centralize the loading of resources
5529            such as bitmaps.
5530    
5531            * Thuban/UI/classgen.py (GenUniquePanel.__init__): Reordered buttons,
5532            added images to the move buttons, added 'reverse' button.
5533            (CustomRampPanel.__init__): Added images to the move buttons.
5534            (GreyRamp): New. Generates a ramp from white to black.
5535            (HotToColdRamp): New. Generates a ramp from cold to hot colors.
5536    
5537            * Thuban/UI/classifier.py: Refactored ID's from ID_CLASSIFY_* to
5538            ID_PROPERTY_*.
5539            (Classifier.__init__): Minor changes to the layout.
5540            (Classifier._OnTitleChanged): Listen for when the user edits the
5541            title and update the dialog's title and the layer's title.
5542    
5543            * Thuban/UI/dock.py: Use new bitmaps for the control buttons.
5544    
5545            * Thuban/UI/legend.py: Use new bitmaps for the control buttons.
5546            (LegendTree._OnMsgLayerTitleChanged): Change the displayed title
5547            if the layer's title changes.
5548    
5549            * Thuban/UI/mainwindow.py: Added new menu item and associated code
5550            to open a dialog to rename the map.
5551            (MainWindow): Use new resource class to import bitmaps.
5552    
5553    2003-04-11  Jonathan Coles   <[email protected]>
5554    
5555            * Resources/Bitmaps/close_12.xpm, Resources/Bitmaps/dock_12.xpm,
5556            Resources/Bitmaps/group_use.xpm, Resources/Bitmaps/group_use_all.xpm,
5557            Resources/Bitmaps/group_use_none.xpm,
5558            Resources/Bitmaps/group_use_not.xpm,
5559            Resources/Bitmaps/hide_layer.xpm,
5560            Resources/Bitmaps/layer_properties.xpm,
5561            Resources/Bitmaps/lower_layer.xpm, Resources/Bitmaps/raise_layer.xpm,
5562            Resources/Bitmaps/show_layer.xpm, Resources/Bitmaps/undock_12.xpm:
5563            New.
5564    
5565    2003-04-10  Jonathan Coles   <[email protected]>
5566    
5567            * Thuban/Model/classification.py: (ClassGroupRange.__init__):
5568            Should pass group to ClassGroup constructor.
5569    
5570    2003-04-10  Jonathan Coles   <[email protected]>
5571    
5572            * Thuban/Model/classification.py: (ClassGroup): Move all the common
5573            methods of the derived classes ([Set|Get]Properties(), __eq__, __ne__)
5574            here. Implement SetVisible(), IsVisible().
5575            (ClassGroup.__init__): Add group parameter which acts as a copy
5576            constructor.
5577    
5578            * Thuban/UI/classifier.py (ClassTable): Add a new column for the
5579            "Visible" check boxes.
5580            (Classifier): Rename the buttons and refactor the code to match
5581            the new labels.
5582    
5583            * Thuban/UI/legend.py: Classify button is now called "Properties".
5584            Refactored the code to change variable names.
5585            (LegendTree.__FillTreeLayer): Only list a group if it is visible.
5586    
5587            * Thuban/UI/mainwindow.py: MainWindow.OpenClassifier renamed to
5588            MainWindow.OpenLayerProperties. MainWindow.LayerEditProperties
5589            renamed to MainWindow.LayerEditProperties.
5590            (MainWindow.ToggleLegend): Don't include map name in legend title.
5591            (MainWindow.SetMap): Added the map name to the window title.
5592            (MainWindow.LayerFillColor, MainWindow.LayerTransparentFill,
5593            MainWindow.LayerOutlineColor, MainWindow.LayerNoOutline): Removed.
5594            Functionality is found in the layer properties dialog.
5595    
5596            * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Only
5597            draw visible groups.
5598    
5599    2003-04-09  Jonathan Coles   <[email protected]>
5600    
5601            * Thuban/UI/classgen.py: Modifications to allow simple
5602            addition and selection of new color schemes.
5603            (MonochromaticRamp): New. Generates a ramp between two colors.
5604            (RedRamp): New. Generates a ramp of all red.
5605            (GreenRamp): New. Generates a ramp of all green.
5606            (BlueRamp): New. Generates a ramp of all blue.
5607    
5608    2003-04-09  Jonathan Coles   <[email protected]>
5609    
5610            * Thuban/Model/classification.py (Classification.__deepcopy__):
5611            Need to copy over field and fieldType attributes.
5612    
5613            * Thuban/Model/table.py (Table.field_range): New. Retrive the
5614            maximum and minimum values over the entire table for a given
5615            field.
5616            (Table.GetUniqueValues): New. Retrieve all the unique values
5617            in the table for a given field.
5618    
5619            * Thuban/UI/classgen.py: Renamed GenRangePanel to GenUniformPanel.
5620            (GenUniquePanel): New. Controls to allow the user to select
5621            which unique field values they would like in the classification.
5622            (CustomRampPanel): Code that was in ClassGenDialog that allows
5623            the user to select the properties for a custom ramp.
5624            (ClassGenerator.GenUniformDistribution): Was called GenerateRanges.
5625    
5626            * Thuban/UI/classifier.py: Removed a lot of debugging code.
5627            (Classifier._SetClassification): Callback method so that the
5628            class generator can set the classification in the grid.
5629            (ClassGroupPropertiesCtrl): New. Encapsulates the drawing and
5630            editing of a group properties class into a wxWindows control.
5631    
5632            * Thuban/UI/dock.py: It was decided that if the user closes
5633            a dockable window the window should simply hide itself. That
5634            way if the user wants to show the dock again it appears in the
5635            same place as it was when it was closed.
5636            (DockableWindow.Destroy): Call renamed method OnDockDestroy().
5637            (DockableWindow._OnButtonClose): Hide the window instead of
5638            destroying it.
5639            (DockableWindow._OnClose): Hide the window instead of
5640            destroying it.
5641    
5642            * Thuban/UI/legend.py (LegendTree): Use a private method to
5643            consistently set the font and style of the text. Fixes RTbug #1786.
5644    
5645            * Thuban/UI/mainwindow.py: Import just the Classifier class.
5646    
5647    2003-04-07  Bernhard Herzog  <[email protected]>
5648    
5649            * Thuban/UI/mainwindow.py (main_menu): Move the toggle_legend item
5650            to the map module
5651    
5652    2003-04-07  Bernhard Herzog  <[email protected]>
5653    
5654            * Thuban/UI/mainwindow.py (MainWindow.ShowSessionTree): Removed in
5655            favor of ToggleSessionTree
5656            (MainWindow.ToggleSessionTree): New method to toggle visibility of
5657            the session tree.
5658            (MainWindow.SessionTreeShown): New method to return whether the
5659            session tree is currently shown.
5660            (MainWindow.ToggleLegend): New method to toggle visibility of the
5661            legend
5662            (MainWindow.ShowLegend): Implement in terms of ToggleLegend and
5663            LegendShown
5664            (MainWindow.LegendShown): New method to return whether the legend
5665            is currently shown.
5666            (_method_command): Add checked parameter so we can define check
5667            menu items
5668            (_has_tree_window_shown, _has_legend_shown): Use the appropriate
5669            mainwindow methods.
5670            (show_session_tree, show_legend commands): Removed.
5671            (toggle_session_tree, toggle_legend commands): New commands to
5672            toggle the visibility of the dialogs
5673    
5674    2003-04-07  Jonathan Coles   <[email protected]>
5675    
5676            * Thuban/UI/classgen.py: Fix Windows problem.
5677    
5678            * Thuban/UI/dock.py: Fix Windows problem.
5679    
5680            * Thuban/UI/mainwindow.py: Use False instead of false.
5681            (MainWindow.ShowLegend): Remove unnecessary switch parameter.
5682    
5683    2003-04-07  Jonathan Coles   <[email protected]>
5684    
5685            Since we now say that the order of the groups in a classification
5686            matters, it makes sense to be able to manipulate that order. Most
5687            of the changes to Thuban/Model/classification.py are to that end.
5688    
5689            * Thuban/Model/classification.py (Classification.AppendGroup,
5690            Classification.InsertGroup, Classification.ReplaceGroup,
5691            Classification.RemoveGroup, Classification.GetGroup): Do as the
5692            names imply.
5693            (Classification.FindGroup): This was called GetGroup, but GetGroup
5694            takes an index, while FindGroup takes a value.
5695            (Classification.__deepcopy__): Copy all the groups, BUT NOT THE LAYER
5696            REFERENCE. Currently there is a cyclic reference between the layer
5697            and its classification. If the classification doesn't need to know
5698            its owning layer we can change this, since it may make sense to be
5699            able to use the same classification with different layers.
5700    
5701            * Thuban/Model/load.py: Use Classification.AppendGroup(), not AddGroup()
5702    
5703            * Thuban/UI/classgen.py: Use Classification.AppendGroup(),
5704            not AddGroup()
5705    
5706            * Thuban/UI/classifier.py: Now that we can depend on the order in
5707            a Classification and have methods to manipulate that order we don't
5708            need to use our own data structures in the grid. We can simply make
5709            the grid/table access the information they need from a copy of
5710            the classification object.
5711            (Classifier._OnCloseBtn): Event handler for when the user clicks
5712            'Close'. This is needed so if the user applies changes and then
5713            continues to change the table the user has the option of discarding
5714            the most recent changes and keeping what they applied.
5715    
5716            * Thuban/UI/mainwindow.py: Put "Show Legend" and "Show Session Tree"
5717            into the same group.
5718    
5719            * extensions/thuban/wxproj.cpp (check_version): If Thuban is compiled
5720            with a really old version of proj, PJ_VERSION won't even be defined.
5721            If it isn't defined then just compile so that the function always
5722            returns Py_False.
5723    
5724            * test/test_classification.py: Fix tests to use the renamed methods.
5725            Still need to write tests for the new methods.
5726    
5727    2003-04-04  Jonathan Coles   <[email protected]>
5728    
5729            * Thuban/UI/classifier.py (Classifier.__SelectField): Move the
5730            call to SetSelection out of the method and before the call
5731            to __SelectField in __init__. This prevents a recursion of events
5732            when _OnFieldSelect is triggered by the user.
5733    
5734    2003-04-04  Jonathan Coles   <[email protected]>
5735    
5736            * Thuban/Model/classification.py: Rename Color.None to
5737            Color.Transparent.
5738            (ClassGroupProperties.SetLineColori, ClassGroupProperties.SetFill):
5739            Don't bother copying the color, since Colors are immutable.
5740    
5741            * Thuban/Model/color.py, Thuban/Model/layer.py, Thuban/Model/load.py,
5742            Thuban/UI/classifier.py, Thuban/UI/mainwindow.py,
5743            Thuban/UI/renderer.py, Thuban/UI/view.py:
5744            Rename Color.None to Color.Transparent.
5745        
5746            * test/test_classification.py, test/test_load.py: Rename Color.None
5747            to Color.Transparent.
5748    
5749    2003-04-04  Jonathan Coles   <[email protected]>
5750    
5751            * Thuban/Model/classification.py: Fix assert calls.
5752            (ClassGroupProperties.SetLineColor, ClassGroupProperties.SetFill):
5753            Copy the color parameter rather than hold onto a reference.
5754    
5755            * Thuban/Model/color.py (Color.__copy__, Color.__deepcopy): Copy
5756            the color object.
5757            (NoColor.__copy__, NoColor.__deepcopy): Return 'self' so that we
5758            are sure there exists only one refernce to Color.None in the system.
5759            This allows us to use 'is' rather than the comparision functions.
5760            
5761            * Thuban/Model/save.py: Fix assert calls.
5762            
5763            * Thuban/UI/classifier.py: Fix assert calls.
5764            (ClassGrid._OnCellDClick): Call up to the classifier to open the
5765            dialog to edit the groups properties.
5766            (ClassGrid._OnCellResize): Make sure that the scollbars are drawn
5767            correctly if a cell is resized.
5768            (ClassTable.SetClassification): New. Changes the classification
5769            that is in the table.
5770            (ClassTable.__SetRow): Allow groups to be prepended.
5771            (Classifier): New code for opening the EditProperties and
5772            GenerateRanges dialogs.
5773            (SelectPropertiesDialog.__GetColor): Only set the color in the
5774            color dialog if the current color is not None.
5775            
5776            * Thuban/UI/dock.py: Fix assert calls.
5777            
5778            * Thuban/UI/legend.py: Fix assert calls.
5779            
5780            * Thuban/UI/renderer.py: Fix assert calls.
5781            
5782            * Thuban/UI/classgen.py (ClassGenDialog): Dialog for generating
5783            classifications.
5784            (GenRangePanel): Panel specific to range generation.
5785            (GenSingletonPanel): Panel specific to singleton generation.
5786            (ClassGenerator): Class responsible for actually generating
5787            the classification from the data gathered in the dialog box.
5788            (PropertyRamp): Generates properties whose values range from
5789            a starting property to an ending property.
5790    
5791    2003-04-03  Bernhard Herzog  <[email protected]>
5792    
5793            * test/support.py (print_garbage_information): New function that
5794            prints information about still connected messages and memory
5795            leaks.
5796            (run_suite): Removed.
5797            (run_tests): New function for use as a replacement of
5798            unittest.main in the test_* files. This one calls
5799            print_garbage_information at the end.
5800    
5801            * test/runtests.py (main): Use support.print_garbage_information
5802    
5803            * test/test_layer.py: Use support.run_tests instead of
5804            unittest.main so we get memory leak information
5805            (TestLayer.test_arc_layer, TestLayer.test_polygon_layer)
5806            (TestLayer.test_point_layer, TestLayer.test_empty_layer)
5807            (TestLayerLegend.test_visibility): Call the layer's Destroy method
5808            to fix a memory leak.
5809    
5810            * test/test_classification.py: Use support.run_tests instead of
5811            unittest.main so we get memory leak information
5812            (TestClassification.test_classification): Call the layer's Destroy
5813            method to fix a memory leak.
5814    
5815    2003-04-02  Bernhard Herzog  <[email protected]>
5816    
5817            * extensions/thuban/wxproj.cpp (check_version, check_version_gtk):
5818            Handle the reference counts of the return value and errors in
5819            PyArg_ParseTuple correctly.
5820    
5821            * Thuban/UI/application.py (ThubanApplication.OpenSession): Make
5822            sure the filename is absolute to avoid problems when saving the
5823            session again
5824    
5825            * Thuban/Model/table.py: Remove unnecessary import. Fix a typo.
5826    
5827    2003-04-01  Jonathan Coles   <[email protected]>
5828    
5829            *  Thuban/UI/renderer.py (MapRenderer.draw_point_shape): Check
5830            that there actually are points in the returned list of points
5831            before trying to index into the list. The list may be empty if
5832            the shape is a Null Shape.
5833    
5834    2003-04-01  Bernhard Herzog  <[email protected]>
5835    
5836            * test/test_map.py: Don't use from <module> import *
5837    
5838    2003-04-01  Jonathan Coles   <[email protected]>
5839    
5840            * Thuban/Model/session.py: Use LAYER_CHANGED instead of
5841            LAYER_LEGEND_CHANGED
5842    
5843            * Thuban/UI/dock.py (DockableWindow._OnButtonClose): Call
5844            self.Destroy() to close the window after yesterday's changes.
5845    
5846            * test/test_map.py, test/test_session.py: Fix messages that
5847            are sent from maps and layers.
5848    
5849    2003-03-31  Jonathan Coles   <[email protected]>
5850    
5851            * Thuban/UI/classifier.py: Commented out some debugging statements.
5852            (ClassDataPreviewer.Draw): Draw rectangles for polygon layers per
5853            RTbug #1769.
5854    
5855            * Thuban/UI/dock.py (DockableWindow.UnDock): Restore size and
5856            position (although position doesn't work yet under GTK).
5857            (DockableWindow.Destroy): New. Called when the window must be
5858            closed. Namely needed when the DockFrame closes and must close
5859            its children.
5860            (DockFrame): Listen for EVT_CLOSE and destroy all children.
5861    
5862            * Thuban/UI/legend.py (LegendPanel.Destroy): New. Cleans up
5863            when then window is told to close.
5864            (LegendTree._OnMsgLayerChanged): Fixes a seg fault bug. See
5865            comment in source for more info.
5866    
5867            * Thuban/UI/main.py: Show the legend by default when Thuban starts.
5868    
5869            * Thuban/UI/mainwindow.py: Renamed OnClose to _OnClose for
5870            symmetry with other such methods.
5871            (MainWindow.ShowLegend): Show the legend docked by default.
5872    
5873    2003-03-28  Jonathan Coles   <[email protected]>
5874    
5875            * Thuban/UI/classifier.py: Support for highlighting a specific
5876            group within the grid when the classification dialog is opened.
5877            Also contains a lot of debugging printouts which will later
5878            be removed.
5879    
5880            * Thuban/UI/dock.py: Complete rework on the dock code so that
5881            that it is fairly removed from the rest of the Thuban application.
5882            It is easy to add new docks which the rest of the program having
5883            to be aware of them.
5884    
5885            * Thuban/UI/legend.py: Modifications to support selecting a
5886            specific group in the classification dialog. Changed how layers
5887            are drawn when the layer is visible/invisible.
5888    
5889            * Thuban/UI/mainwindow.py: Removed legend specific code and
5890            replaced it with calls to the new dock code.
5891    
5892            * Thuban/UI/renderer.py (MapRenderer.__init__): Added assert
5893            to check if scale > 0. Trying to track down a divide by zero.
5894    
5895    2003-03-26  Jonathan Coles   <[email protected]>
5896    
5897            * Thuban/UI/legend.py: Removed unnecessary LegendDialog class.
5898            (LegendPanel): Removed _OnDock()/_OnUnDock() methods which are
5899            now part of DockableWindow.
5900            (LegendPanel.DoOnSelChanged): Select the current layer in the
5901            map.
5902            (LegendTree._OnSelChanged): Call LegendPanel.DoOnSelChanged()
5903            with the selected layer and/or group.
5904    
5905    2003-03-26  Jonathan Coles   <[email protected]>
5906    
5907            This putback contains the code for dockable windows. There is
5908            no support in wxWindows as of this date for windows that can
5909            attach themselves to other windows.
5910    
5911            The current model contains a DockableWindow which has a parent
5912            window for when it is detached and a dock window that it puts
5913            its contents in when it is docked. The contents of a DockableWindow
5914            must be a DockPanel. DockPanel itself derives from wxPanel.
5915    
5916            * Thuban/Model/layer.py (Layer.ClassChanged): Send a LAYER_CHANGED
5917            message, not a LAYER_LEGEND_CHANGED message.
5918    
5919            * Thuban/Model/map.py (Map): Forward LAYER_CHANGED messages.
5920    
5921            * Thuban/UI/classifier.py (Classifier.__init__): Use wxADJUST_MINSIZE
5922            as one of the style properties for the fieldTypeText item to
5923            be sure that its size is correct when the text changes.
5924    
5925            * Thuban/UI/dock.py: New. Classes for the DockPanel and
5926            DockableWindow.
5927    
5928            * Thuban/UI/legend.py: Added some more buttons and made the
5929            LegendPanel a DockPanel.
5930    
5931            * Thuban/UI/mainwindow.py: Added sash windows to the main window
5932            and supporting functions for manipulating the sashes.
5933            (MainWindow.ShowLegend): Create a DockableWindow with the
5934            LegendPanel as the contents.
5935    
5936            * Thuban/UI/messages.py: Added DOCKABLE_* messages
5937    
5938            * Thuban/UI/view.py (MapCanves.SetMap): Listen for LAYER_CHANGED,
5939            not LAYER_LEGEND_CHANGED, messages.
5940    
5941    2003-03-25  Jonathan Coles   <[email protected]>
5942    
5943            * setup.py: Added custom script bdist_rpm_build_script so that
5944            when the rpm is built the path to wx-config is correct.
5945    
5946            * setup.cfg: Added line saying to use the custom build script
5947    
5948    2003-03-20  Jonathan Coles   <[email protected]>
5949    
5950            Initial implementation of the Legend.
5951    
5952            * Thuban/UI/legend.py: New. Creates a window that shows the map's
5953            Legend information and allows the user to add/modify classifications
5954            and how the layers are drawn on the map.
5955    
5956            * setup.py: New command 'build_docs' which currently uses
5957            happydoc to generate html documentation for Thuban.
5958    
5959            * Thuban/Model/classification.py (ClassGroup.GetDisplayText): New.
5960            Returns a string which is appropriately describes the group.
5961    
5962            * Thuban/Model/layer.py (Layer.SetClassification): Generate a
5963            LAYER_CHANGED event instead of a LAYER_LEGEND_CHANGED event.
5964    
5965            * Thuban/Model/map.py (Map): Rename messages and use new, more
5966            specific, messages.
5967    
5968            * Thuban/Model/messages.py: New message to indicate that a layer's
5969            data has changed (LAYER_CHANGED). New map messages to indicate
5970            when layers have been added/removed/changed or if the stacking order
5971            of the layers has changed.
5972    
5973            * Thuban/Model/session.py: Rename and use new messages.
5974    
5975            * Thuban/UI/classifier.py: Remember if any changes have actually
5976            been applied so that if the dialog is cancelled without an application
5977            of changes we don't have to set a new classification.
5978            (ClassDataPreviewer): Pulled out the window specific code and put it
5979            ClassDataPreviewWindow. ClassDataPreviewer can then be used to draw
5980            symbols on any DC.
5981            
5982            * Thuban/UI/mainwindow.py: New code to open the legend.
5983    
5984            * Thuban/UI/view.py: Use new message names.
5985    
5986    2003-03-19  Jonathan Coles   <[email protected]>
5987    
5988            * Thuban/UI/main.py (verify_versions): New. Checks the versions
5989            of Python, wxPython, and some other libraries.
5990    
5991            * extensions/thuban/wxproj.cpp (check_version): Checks the given
5992            version against what wxproj was compiled with.
5993            (check_version_gtk): If wxproj was compiled with gtk then check
5994            the given version against the version of the gtk library
5995            currently being used.
5996    
5997    2003-03-14  Bernhard Herzog  <[email protected]>
5998    
5999            * test/test_command.py: Run the tests when the module is run as a
6000            script
6001    
6002    2003-03-14  Bernhard Herzog  <[email protected]>
6003    
6004            Implement selection of multiple selected shapes in the same layer:
6005    
6006            - Introduce a new class to hold the selection. This basically
6007              replaces the interactor which was nothing more than the
6008              selection anyway. A major difference is of course that the new
6009              selection class supports multiple selected shapes in one layer
6010            
6011            - Move the object that represents the selection from the
6012              application to the canvas. The canvas is a better place than the
6013              application because the selection represents which shapes and
6014              layer of the map displayed by the canvas are selected and
6015              affects how the map is drawn.
6016    
6017            - Make the selection and its messages publicly available through
6018              the mainwindow.
6019    
6020            - The non-modal dialogs do not get a reference to the interactor
6021              anymore as they can simply refer to their parent, the
6022              mainwindow, for the what the interactor had to offer.
6023    
6024            * Thuban/UI/selection.py: New module with a class to represent the
6025            selection.
6026    
6027            * Thuban/UI/messages.py (SELECTED_TABLE, SELECTED_MAP): Remove
6028            these unused messages
6029    
6030            * Thuban/UI/application.py (ThubanApplication.OnInit)
6031            (ThubanApplication.OnExit, ThubanApplication.SetSession): The
6032            interactor is gone now.
6033            (ThubanApplication.CreateMainWindow): There is no interactor
6034            anymore so we pass None as the interactor argument for now for
6035            compatibility.
6036    
6037            * Thuban/UI/view.py (MapCanvas.delegated_messages)
6038            (MapCanvas.Subscribe, MapCanvas.Unsubscribe): In Subscribe and
6039            Unsubscribe, delegate messages according to the delegated_messages
6040            class variable.
6041            (MapCanvas.__getattr__, MapCanvas.delegated_methods): Get some
6042            attributes from instance variables as described with the
6043            delegated_methods class variable.
6044            (MapCanvas.__init__): New instance variable selection holding the
6045            current selection
6046            (MapCanvas.do_redraw): Deal with multiple selected shapes. Simply
6047            pass them on to the renderer
6048            (MapCanvas.SetMap): Clear the selection when a different map is
6049            selected.
6050            (MapCanvas.shape_selected): Simple force a complete redraw. The
6051            selection class now takes care of only issueing SHAPES_SELECTED
6052            messages when the set of selected shapes actually does change.
6053            (MapCanvas.SelectShapeAt): The selection is now managed in
6054            self.selection
6055    
6056            * Thuban/UI/mainwindow.py (MainWindow.delegated_messages)
6057            (MainWindow.Subscribe, MainWindow.Unsubscribe): In Subscribe and
6058            Unsubscribe, delegate messages according to the delegated_messages
6059            class variable.
6060            (MainWindow.delegated_methods, MainWindow.__getattr__): Get some
6061            attributes from instance variables as described with the
6062            delegated_methods class variable.
6063            (MainWindow.__init__): The interactor as ivar is gone. The
6064            parameter is still there for compatibility. The selection messages
6065            now come from the canvas.
6066            (MainWindow.current_layer, MainWindow.has_selected_layer):
6067            Delegate to the the canvas.
6068            (MainWindow.LayerShowTable, MainWindow.Classify)
6069            (MainWindow.identify_view_on_demand): The dialogs don't need the
6070            interactor parameter anymore.
6071    
6072            * Thuban/UI/tableview.py (TableFrame.__init__)
6073            (LayerTableFrame.__init__, LayerTableFrame.OnClose)
6074            (LayerTableFrame.row_selected): The interactor is gone. It's job
6075            from the dialog's point of view is now done by the mainwindow,
6076            i.e. the parent. Subscribe to SHAPES_SELECTED instead
6077            of SELECTED_SHAPE
6078            
6079            * Thuban/UI/dialogs.py (NonModalDialog.__init__): The interactor
6080            is gone. It's job from the dialog's point of view is now done by
6081            the mainwindow, i.e. the parent.
6082            
6083            * Thuban/UI/classifier.py (Classifier.__init__): The interactor is
6084            gone. It's job from the dialog's point of view is now done by the
6085            mainwindow, i.e. the parent.
6086    
6087            * Thuban/UI/tree.py (SessionTreeView.__init__): The interactor is
6088            gone. It's job from the dialog's point of view is now done by the
6089            mainwindow, i.e. the parent.
6090            (SessionTreeCtrl.__init__): New parameter mainwindow which is
6091            stored as self.mainwindow. The mainwindow is need so that the tree
6092            can still subscribe to the selection messages.
6093            (SessionTreeCtrl.__init__, SessionTreeCtrl.unsubscribe_all)
6094            (SessionTreeCtrl.update_tree, SessionTreeCtrl.OnSelChanged): The
6095            selection is now accessible through the mainwindow. Subscribe to
6096            SHAPES_SELECTED instead of SELECTED_SHAPE
6097    
6098            * Thuban/UI/identifyview.py (IdentifyView.__init__): Use the
6099            SHAPES_SELECTED message now.
6100            (IdentifyView.selected_shape): Now subscribed to SHAPES_SELECTED,
6101            so deal with multiple shapes
6102            (IdentifyView.__init__, IdentifyView.OnClose): The interactor is
6103            gone. It's job from the dialog's point of view is now done by the
6104            mainwindow, i.e. the parent.
6105    
6106            * Thuban/UI/controls.py (RecordListCtrl.fill_list): The second
6107            parameter is now a list of shape ids.
6108            (RecordTable.SetTable): The second parameter is now a list of
6109            indices.
6110    
6111            * Thuban/UI/renderer.py (ScreenRenderer.RenderMap): Rename the
6112            selected_shape parameter and ivar to selected_shapes. It's now a
6113            list of shape ids.
6114            (MapRenderer.draw_label_layer): Deal with multiple selected
6115            shapes. Rearrange the code a bit so that the setup and shape type
6116            distinctions are only executed once.
6117    
6118            * test/test_selection.py: Test cases for the selection class
6119    
6120    2003-03-11  Jonathan Coles   <[email protected]>
6121    
6122            * Thuban/Model/load.py: Temporary fix so that the xml reader
6123            doesn't cause Thuban to crash.
6124    
6125            * Thuban/Model/layer.py: Handle the cyclic references between
6126            a layer and its classification better, and be sure to disconnect
6127            the classification from the layer when the layer is destroyed
6128            so that we don't maintain a cyclic reference that may not be
6129            garbage collected.
6130    
6131            * Thuban/Model/classification.py: See comment for layer.py.
6132    
6133    2003-03-12  Jan-Oliver Wagner <[email protected]>
6134    
6135            * HOWTO-Release: New. Information on the steps for releasing
6136            a new version of Thuban.
6137    
6138    2003-03-11  Jonathan Coles   <[email protected]>
6139    
6140            * Thuban/UI/classifier.py: Add normal border to SelectPropertiesDialog.
6141            Use True instead of true.
6142            (Classifier): Should have a single panel in which all the controls lie.
6143    
6144            * Thuban/UI/proj4dialog.py: Add normal border.
6145    
6146            * Thuban/UI/tree.py: Fixed problem with bad item images under Windows.
6147    
6148            * Thuban/UI/mainwindow.py: Use True instead of true.
6149    
6150            * setup.py: Update some definitions to use wxWindows2.4 files
6151    
6152            * Data/iceland_sample_class.thuban: Fixed file so that the
6153            field_type information is present.
6154    
6155    2003-03-10  Jonathan Coles   <[email protected]>
6156    
6157            * Thuban/UI/classifier.py (Classifier.__init__): Make the
6158            field type label grow so that when the text changes the
6159            size is updated correctly. This may be a wxWindows bug.
6160    
6161    2003-03-10  Jonathan Coles   <[email protected]>
6162    
6163            * Thuban/UI/application.py: Changed SESSION_CHANGED to
6164            SESSION_REPLACED.
6165    
6166            * Thuban/UI/classifier.py: Wrap text with _().
6167            (ClassGrid.CreateTable): Set dimensions and size hints here,
6168            instead of in Reset, so we only set the size once.
6169    
6170            * Thuban/UI/dialogs.py: Don't need Shutdown(); just use Close()!
6171    
6172            * Thuban/UI/mainwindow.py (MainWindow.prepare_new_session):
6173            Call Close() instead of Shutdown().
6174    
6175            * Thuban/UI/messages.py: Changed SESSION_CHANGED to SESSION_REPLACED.
6176    
6177            * Thuban/UI/tree.py: Changed SESSION_CHANGED to SESSION_REPLACED.
6178            Go back to using OnClose() instead of Shutdown().
6179    
6180    2003-03-10  Jonathan Coles   <[email protected]>
6181    
6182            * Thuban/UI/classifier.py (Classifier): SelectField() needed
6183            to know the old field index as well as the new one.
6184    
6185    2003-03-10  Jonathan Coles   <[email protected]>
6186    
6187            * Thuban/UI/classifier.py (Classifier): Use __SelectField()
6188            to correctly set the table information and call this from
6189            __init__ and from _OnFieldSelect so that all the information
6190            is up to date when the dialog opens and when a field is changed.
6191    
6192    2003-03-10  Jonathan Coles   <[email protected]>
6193    
6194            * Thuban/Model/classification.py (Classification): Don't use
6195            layer's message function directly, use the ClassChanged() method
6196            when then classification changes. SetField/SetFieldType/SetLayer
6197            must keep the information about field name and field type in
6198            sync when an owning layer is set or removed.
6199    
6200            * Thuban/Model/layer.py: Added ClassChanged() so that the
6201            classification can tell the layer when its data has changed.
6202            (Layer.SetClassification): Accepts None as an arguement to
6203            remove the current classification and correctly handles
6204            adding a new classification.
6205    
6206            * Thuban/Model/load.py: Comment out print statement
6207    
6208            * test/test_classification.py, test/test_save.py: New and
6209            improved tests.
6210    
6211    2003-03-07  Jonathan Coles   <[email protected]>
6212    
6213            * Thuban/Model/classification.py: Implemented __copy__ and
6214            __deepcopy__ for ClassGroup* and ClassGroupProperites so
6215            they can easily be copied by the classifier dialog.
6216            (ClassGroupProperites.__init__): The default line color should
6217            have been Color.Black.
6218    
6219            * Thuban/UI/classifier.py: Setting and Getting table values now
6220            uses a consistent set of functions.
6221            (Classifier): Now non-modal. Has field type label which changes
6222            as the field changes. Keep track of buttons in a list so that
6223            we can enable/disable the buttons when the None field is selected.
6224            (SelectPropertiesDialog): Add buttons to make the colors transparent.
6225    
6226            * Thuban/UI/dialogs.py (NonModalDialog.Shutdown): New method which
6227            does what OnClose did, but can be called by the application to
6228            close a window. Needed when a session changes, and we have to
6229            close the classifier windows.
6230    
6231            * Thuban/UI/mainwindow.py (MainWindow.prepare_new_session):
6232            Shuts down open dialogs. Used when a new session is created
6233            or a session is opened.
6234            (MainWindow.SaveSession): Should only call application.SaveSession()
6235            if we don't call SaveSessionAs first.
6236            (MainWindow.Classify): Allow different classifier dialogs for
6237            different layers.
6238    
6239            * Thuban/UI/tree.py (SessionTreeView): Remove OnClose and let
6240            the parent class handle it. Add Shutdown() to unsubscibe from
6241            event notification and call the parent Shutdown(). This was
6242            necessary so the application can close the tree window.
6243    
6244    2003-03-06  Jonathan Coles   <[email protected]>
6245    
6246            * Thuban/Model/classification.py: Minor documentation changes,
6247            Addition of __eq__ and __ne__ methods.
6248            (Classification.SetLayer): prevent recursion between this method
6249            and Layer.SetClassification().
6250    
6251            * Thuban/Model/color.py: Addition of __eq__ and __ne__ methods.
6252    
6253            * Thuban/Model/layer.py (SetClassification): prevent recursion
6254            between this method and Classification.SetLayer().
6255    
6256            * test/test_classification.py, test/test_load.py,
6257            test/test_session.py: Fixed and added tests for the classification
6258            classes.
6259    
6260    2003-03-06  Bernhard Herzog  <[email protected]>
6261    
6262            * Thuban/UI/classifier.py (ClassGrid.__init__)
6263            (ClassGrid.CreateTable): Move the SetSelectionMode call to
6264            CreateTable because otherwise it triggers an assertion in
6265            wxPython/wxGTK 2.4.
6266    
6267    2003-03-05  Jonathan Coles   <[email protected]>
6268    
6269            * Thuban/common.py: Move FIELDTYPE constants back to table.py.
6270    
6271            * Thuban/Model/load.py: import FIELDTYPE constants from table.
6272    
6273            * Thuban/UI/classifier.py: import FIELDTYPE constants from table.
6274    
6275            * Thuban/Model/table.py: Put FIELDTYPE constants back.
6276    
6277    2003-03-05  Jonathan Coles   <[email protected]>
6278    
6279            * Thuban/UI/classifier.py: Added class documentation.
6280            Fixed RTbug #1713, #1714. Added Move[Up|Down] buttons.
6281            Store just the groups in the table and generate the other
6282            column information when it is requested. Add "None" field
6283            to pull-down to select no classification.
6284    
6285            * Thuban/common.py: Moved FIELDTYPE constants from table.py
6286            (Str2Num): Only catch ValueError exceptions.
6287    
6288            * Thuban/Model/classification.py: Class documentation. Renaming
6289            of methods with Stroke to Line. Groups are stored in a single
6290            list with the default as the first element. Groups are searched
6291            in the order they appear in the list.
6292    
6293            * Thuban/Model/color.py: Documentation.
6294    
6295            * Thuban/Model/layer.py (Layer): Add GetFieldType to retreive
6296            the kind of data represented by a field.
6297    
6298            * Thuban/Model/load.py (ProcessSession): Use proper string
6299            conversion function; fixes RTbug #1713.
6300    
6301            * Thuban/Model/save.py (Saver): Store field type information.
6302    
6303            * Thuban/Model/table.py: Put FIELDTYPE constants in common.py.
6304            (Table): Add field_info_by_name() to retrieve field information
6305            by specifying the field name, not the number.
6306    
6307            * Thuban/UI/mainwindow.py: Function name changes.
6308    
6309            * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Only
6310            get the layer classification once. Don't try to classify
6311            values when the field is None: just use the default properties.
6312    
6313            * Thuban/UI/view.py: Function name changes.
6314    
6315            * Doc/thuban.dtd: Add field_type attribute to a classification.
6316    
6317    2003-03-04  Bernhard Herzog  <[email protected]>
6318    
6319            * Doc/thuban.dtd: Use correct syntax for optional attributes. Make
6320            the fill and stroke layer attributes optional with suitable
6321            default values. Add the stroke_width layer attribute. Use correct
6322            syntax for empty elements. Make the attribute list for labels
6323            refer to the label element.
6324    
6325    2003-03-04  Bernhard Herzog  <[email protected]>
6326    
6327            * setup.py (thuban_build_py.build): Add a comment about distutils in
6328            Python 2.3 containing some of the functionality we implement in
6329            setup.py ourselves.
6330    
6331            * Thuban/UI/classifier.py (ClassGrid.__init__): Set the table
6332            before the selection mode. Doing it the other way round triggers
6333            an assertion in wxWindows.
6334    
6335            * Thuban/Model/save.py (escape): Fix typo in doc-string
6336    
6337            * Thuban/Model/classification.py: Remove unnecessary wxPython
6338            import
6339    
6340    2003-03-04  Jonathan Coles   <[email protected]>
6341    
6342            * Thuban/Model/classification.py (ClassGroupRange.GetProperties):
6343            Parameter 'value' should default to None.
6344    
6345            * Thuban/UI/mainwindow.py: Use Layer.GetClassification() since
6346            the class attribute __classification is now private.
6347    
6348            * Thuban/UI/classifier.py (ClassGrid): Moved OnCellDClick() from
6349            Classifier to ClassGrid. Added support for removing selected rows,
6350            which including code for keeping track of when cells are selected,
6351            and deselected.
6352            (ClassTable): Support for added/removing rows. Fixed a problem
6353            with __ParseInput whereby it would not allow strings (only numbers)
6354            to be entered.
6355            (Classifier): Added button and supporting code for removing
6356            selected rows.
6357    
6358    2003-02-27  Jonathan Coles   <[email protected]>
6359    
6360            * Thuban/common.py: Moved color conversion functions into
6361            Thuban/UI/common.py.
6362            (Str2Num): Now converts the float (not the string) to a long/int
6363            so that an exception isn't thrown.
6364    
6365            * Thuban/UI/common.py: Common functions used in several UI modules
6366    
6367            * Thuban/Model/classification.py: Changed the class hierarchy
6368            so that a Classification consists of Groups which return
6369            Properties when a value matches a Group.
6370    
6371            * Thuban/Model/layer.py: Fixed name resolution problem.
6372    
6373            * Thuban/Model/load.py: Use new Classification and Group functions.
6374    
6375            * Thuban/Model/save.py (Saver.write_attribs): Fixes a test case
6376            failure.
6377            (Saver.write_classification): Use new Classification and Group
6378            functions.
6379    
6380            * Thuban/UI/classifier.py: Changes to use new Classification and Group
6381            functions. Fix to create a tuple with a single value instead of
6382            simply returning the value.
6383    
6384            * Thuban/UI/renderer.py: Use new Classification and Group functions.
6385            Use common.py functions.
6386    
6387            * Thuban/UI/tree.py: Use common.py functions.
6388            
6389            * test/test_classification.py: Use new Classification and Group
6390            classes.
6391    
6392    2003-02-24  Jonathan Coles   <[email protected]>
6393    
6394            * Thuban/common.py (Color2wxColour, wxColour2Color): Conversion
6395            functions from Thuban color objects to wxWindow colour objects.
6396    
6397            * Thuban/Model/classification.py (Classification): Renamed
6398            GetProperties() to GetClassData(). Used the new iterator
6399            in TreeInfo().
6400            (ClassIterator): Iterator implementation to iterate over the
6401            ClassData objects in a classification object.
6402    
6403            * Thuban/Model/save.py (Saver.write_classificaton): Uses
6404            the new iterator to save the classification information.
6405    
6406            * Thuban/UI/classifier.py (SelectPropertiesDialog): Support
6407            for changing the stroke and fill colors and previewing the
6408            changes.
6409    
6410            * Thuban/UI/mainwindow.py (MainWindow.OpenSession,
6411            MainWindow.SaveSessionAs): Text string changes so the dialogs
6412            have more meaningful titles.
6413    
6414            * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Change
6415            Classification method name from GetProperties to GetClassData.
6416    
6417            * Thuban/UI/view.py (MapCanvas.find_shape_at): Use method calls
6418            instead of accessing now non-existent class variables.
6419    
6420    2003-02-24  Bernhard Herzog  <[email protected]>
6421    
6422            * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Remove
6423            unneeded Shape() call. Rendering is substantially faster without
6424            it and it avoids some problems with broken shape files.
6425    
6426    2003-02-20  Frank Koormann   <[email protected]>
6427    
6428            Force minimal size of identify and label dialogs. The autosizing
6429            looked too ugly.
6430    
6431            * Thuban/UI/controls.py (RecordListCtrl): Set minimal width for columns.
6432            * Thuban/UI/labeldialog.py (LabelDialog.dialog_layout):
6433            Set size of listctrl.
6434            * Thuban/UI/identifyview.py (IdentifyView.__init__):
6435            Set size of dialog.
6436    
6437    2003-02-19  Jonathan Coles   <[email protected]>
6438    
6439            * test/test_classification.py, test/test_layer.py,
6440            test/test_load.py, test/test_map.py, test/test_session.py:
6441            Updated the tests to use the new functions that are in the
6442            respective classes.
6443    
6444            * Thuban/Model/classification.py (Classification):
6445            Uses the new ClassData* classes. Modification messages are
6446            passed up to the parent layer (if it exists).
6447            (ClassData): New class to encapsulate the common data in each
6448            classification property.
6449            (ClassDataDefault): Represents the Default class. data.
6450            (ClassDataPoint): Represents a single class. data point
6451            (ClassDataRange): Represents a class. range
6452            (ClassDataMap): Represents a class. map (unused).
6453    
6454            * Thuban/Model/color.py: Added Color.None to represent something
6455            with no color. Color.Black represents the color black.
6456            (NoColor): Helper class derived from Color to represent something
6457            with no color.
6458    
6459            * Thuban/Model/layer.py (Layer): Removed references to fill, stroke,
6460            stroke_width attributes. Made the 'classification' attribute private.
6461            New methods for setting/getting the classification.
6462    
6463            * Thuban/Model/load.py (ProcessSession): Use new methods on Layer
6464            to get the classifcation and use the new ClassData* classes to
6465            hold the classification data. Use Str2Num to convert numbers
6466            properly.
6467    
6468            * Thuban/Model/save.py (Saver): Use new Color and Classification
6469            methods
6470    
6471            * Thuban/UI/classifier.py (ClassGrid): New class to represent a
6472            custom grid.
6473            (ClassTable): Support for editing Values and Labels and for
6474            changing what type (point or range) of data is stored in each
6475            property based on how the user enters the data.
6476            (Classifier): Support for saving the new classifications and
6477            launching the dialog to edit a property.
6478            (SelectPropertiesDialog): New class for editing the visual
6479            properties of a classification (stroke color, width, and fill color)
6480            (ClassPreviewer): Took the Draw method from ClassRenderer and
6481            made most of it into this new class. Intend to use this class in
6482            the SelectPropertiesDialog for previewing changes.
6483    
6484            * Thuban/UI/renderer.py: Use new Color and Classification methods.
6485    
6486            * Thuban/UI/tree.py: Formatting changes.
6487    
6488            * Doc/thuban.dtd: Add 'label' element
6489    
6490            * Thuban/common.py: New. Contains common routines used throughout
6491            the code.
6492            (Str2Num): Takes a string and converts it to the "best" type of
6493            number.
6494    
6495    2003-02-14  Bernhard Herzog  <[email protected]>
6496    
6497            * Thuban/UI/view.py (MapCanvas.OnLeftUp): Make sure that the
6498            dragging flag is always set to 0 even when the tool implementation
6499            raises an exception
6500    
6501    2003-02-11  Bernhard Herzog  <[email protected]>
6502    
6503            * Thuban/UI/application.py (ThubanApplication.splash_screen): New
6504            method to create a splash screen.
6505            (ThubanApplication.ShowMainWindow): New. Show the main window.
6506            Needed so the splash screen can display the mainwindow
6507            (ThubanApplication.OnInit): Call the
6508            new splash_screen method to determine whether the application
6509            should display a splash screen. If it displays a splash screen do
6510            not immediately show the main window.
6511    
6512    2003-02-11  Jonathan Coles  <[email protected]>
6513    
6514            * Thuban/Model/classification.py: Added import line to fix
6515            feature conflicts between running on python2.2 and python2.1.
6516    
6517            * Thuban/UI/classifier.py (ClassTable): Didn't need to hang
6518            onto the clinfo parameter, so removed the deepcopy().
6519    
6520    2003-02-10  Jonathan Coles  <[email protected]>
6521    
6522            * Thuban/Model/save.py (Saver.open_element, Saver.close_element):
6523            Added element_open variable to track opening and closing of tags
6524            so that tags that don't span more than one line are closed with
6525            /> instead of </tag_name>. Use the GetDefault*() methods of
6526            the Classification class.
6527    
6528            * Thuban/Model/classification.py (Classificaton): Added set and
6529            get methods for the default data. The class also takes a layer
6530            reference so that modification messages can be sent. Fixed the
6531            methods to use the new ClassData class.
6532            (ClassData): New class to encapsulate the classification data
6533    
6534            * Thuban/Model/layer.py (Layer): Remove the
6535            Set[Fill|Stroke|StrokeWidth]() methods. Code should call the
6536            SetDefault*() methods on the layer's classification object.
6537            (Layer.__init__): Use the new SetDefault*() methods in the
6538            Classification class.
6539    
6540            * Thuban/Model/load.py (ProcessSession): Use the new ClassData
6541            object instead of a dictionary.
6542    
6543            * Thuban/UI/classifier.py (ClassRenderer): New class to
6544            draw the classifications in the dialog box's table.
6545            (Classifier): Modified to use the ClassRenderer class.
6546    
6547            * Thuban/UI/mainwindow.py (MainWindow): Use the SetDefault*()
6548            methods of the Classification class.
6549    
6550            * Thuban/UI/renderer.py (MapRenderer): Use the Get*() methods
6551            of the ClassData class.
6552    
6553            * test/test_classification.py, test/test_layer.py,
6554            test/test_map.py, test/test_session.py: Fix the tests to work
6555            with the above code changes.
6556    
6557    2003-02-03  Jonathan Coles  <[email protected]>
6558    
6559            * Thuban/Model/classification.py (Classification): Added getNull()
6560            to return the NullData reference
6561    
6562            * Thuban/Model/layer.py (Layer.SetFill, Layer.SetStroke,
6563            Layer.SetStrokeWidth): Modified these functions to change the
6564            null data in the classification rather than keep these values
6565            directly in the Layer class. Menu options to change these values
6566            work again.
6567    
6568    2003-01-28  Jonathan Coles  <[email protected]>
6569    
6570            * Thuban/UI/classifier.py (Classifier): Resolved merging conflicts.
6571            Fixed crashing problem on some systems. Dialog box shows
6572            classification data.
6573    
6574            * Thuban/UI/tree.py (SessionTreeCtrl.add_items): Handle drawing
6575            Colors in the tree view.
6576    
6577            * Thuban/Model/layer.py (Layer.TreeInfo): Added a call to build
6578            the tree info for classifications. Commented out unnecessary lines.
6579    
6580            * Thuban/Model/classification.py (Classification.TreeInfo): New
6581            function to add information about the classification into the
6582            tree view.
6583    
6584    2003-01-27  Jan-Oliver Wagner <[email protected]>
6585    
6586            * Thuban/__init__.py (_): New.
6587    
6588            * Thuban/Model/classification.py, Thuban/Model/extension.py,
6589            Thuban/Model/layer.py, Thuban/Model/load.py, Thuban/Model/map.py,
6590            Thuban/Model/session.py, Thuban/UI/application.py,
6591            Thuban/UI/classifier.py, Thuban/UI/context.py, Thuban/UI/controls.py,
6592            Thuban/UI/identifyview.py, Thuban/UI/labeldialog.py,
6593            Thuban/UI/mainwindow.py, Thuban/UI/menu.py, Thuban/UI/proj4dialog.py,
6594            Thuban/UI/renderer.py, Thuban/UI/tree.py, Thuban/Lib/connector.py,
6595            Thuban/Lib/fileutil.py: Replace user string by _() for i18n.
6596    
6597    2003-01-27  Jonathan Coles  <[email protected]>
6598    
6599            * Thuban/Model/layer.py: Classification initialization calls.
6600    
6601            * Thuban/Model/classification.py: Created class to encapsulate
6602            a layer classification. Supports specific data points and
6603            ranges.
6604    
6605            * Thuban/Model/load.py: Added support for loading classification
6606            information.
6607    
6608            * Thuban/Model/save.py: Added support for saving classification
6609            information.
6610    
6611            * Thuban/UI/classifier.py: Initial class for a dialog box for
6612            specifying classification information.
6613    
6614            * Thuban/UI/mainwindows.py: Support for opening the classifier
6615            dialog.
6616    
6617            * Thuban/UI/renderer.py: Support for drawing a layer with the
6618            classification information.
6619    
6620            * Data/iceland_sample_class.thuban: iceland_sample with
6621            classification data.
6622    
6623            * test/test_classification: Tests for the Classification class.
6624    
6625    2002-12-09  Bernhard Herzog  <[email protected]>
6626    
6627            * test/test_command.py: New. Tests for the command classes.
6628    
6629            * Thuban/UI/command.py (ToolCommand): New class for tool commands.
6630            (Command.IsTool): New method to distinguish between command
6631            switching tools and other commands.
6632    
6633            * Thuban/UI/view.py (MapCanvas.SelectTool): New method to select
6634            the tool to avoid direct assignments to instance variables
6635            (MapCanvas.ZoomInTool, MapCanvas.ZoomOutTool, MapCanvas.PanTool)
6636            (MapCanvas.IdentifyTool, MapCanvas.LabelTool): Use SelectTool to
6637            change the tool
6638    
6639            * Thuban/UI/mainwindow.py (MainWindow.update_command_ui): If an
6640            active tool's command turns insensitive, disable the tool.
6641            (_tool_command): Use the new ToolCommand class
6642    
6643            * Examples/simple_extensions/simple_tool.py (simple_tool): Use the
6644            SelectTool method to change the tool
6645            (iconfile): Use the ToolCommand class
6646    
6647    2002-12-03  Bernhard Herzog  <[email protected]>
6648    
6649            * Thuban/UI/tree.py (SessionTreeCtrl.normalize_selection): Handle
6650            the case of selected items that are not children of Layers or Maps
6651            properly. Previously this bug would trigger an assertion in
6652            wxWindows.
6653    
6654    2002-11-06  Frank Koormann  <[email protected]>
6655    
6656            * Thuban/UI/mainwindow.py: Altered the order of tools in the
6657            toolbar: First now are all navigation tools (Zoom In/Out, Pan,
6658            Full Extent).
6659    
6660    2002-10-23  Bernhard Herzog  <[email protected]>
6661    
6662            * setup.py (setup call): version now 0.1.3
6663    
6664            * MANIFEST.in: Add the files in test/
6665    
6666            * test/README: Add note about tests requiring the iceland data
6667    
6668            * Thuban/UI/mainwindow.py (MainWindow.About): Add 2002 to
6669            copyright notice.
6670    
6671    2002-10-18  Bernhard Herzog  <[email protected]>
6672    
6673            * test/test_map.py
6674            (TestMapWithContents.test_projected_bounding_box): Use an explicit
6675            epsilon.
6676    
6677            * test/support.py (FloatComparisonMixin.assertFloatEqual)
6678            (FloatComparisonMixin.assertFloatSeqEqual): give a more useful
6679            message if the assertion fails and don't return the return value
6680            of self.assert_. In assertFloatSeqEqual the return meant that not
6681            all items of the sequence were compared.
6682    
6683    2002-09-20  Bernhard Herzog  <[email protected]>
6684    
6685            * test/test_fileutil.py: New. Test cases for Thuban.Lib.fileutil
6686    
6687            * Thuban/Lib/fileutil.py: Fixup some whitespace and typos
6688    
6689            * test/test_map.py (TestMapWithContents.test_tree_info): Create
6690            the string with the bounding box on the fly because of platform
6691            differences in the way %g is handled.
6692    
6693            * test/test_layer.py (TestLayer.test_empty_layer): Create an empty
6694            DBFfile too because Thuban layers can't yet cope missing DBF
6695            files.
6696    
6697    2002-09-20  Bernhard Herzog  <[email protected]>
6698    
6699            * test/test_menu.py: Use initthuban instead of
6700            add_thuban_dir_to_path to initialize Thuban.
6701    
6702            * test/support.py (FloatComparisonMixin.assertFloatEqual): New.
6703            Mixin class for float comparisons
6704            (SubscriberMixin): New. Mixin class to test messages sent through
6705            the Connector class
6706    
6707            * test/README: Fix a typo and add the -v flag to the command for
6708            individual tests
6709    
6710            * test/test_session.py: New. Test cases for Thuban.Model.session
6711    
6712            * test/test_proj.py: New. Test cases for Thuban.Model.proj
6713    
6714            * test/test_map.py: New. Test cases for Thuban.Model.map
6715    
6716            * test/test_layer.py: New. Test cases for Thuban.Model.layer
6717    
6718            * test/test_label.py: New. Test cases for Thuban.Model.label
6719    
6720            * test/test_connector.py: New. Test cases for Thuban.Lib.connector
6721    
6722            * test/test_color.py: New. Test cases for Thuban.Model.color
6723    
6724            * test/test_base.py: New. Test cases for Thuban.Model.base
6725    
6726    2002-09-13  Bernhard Herzog  <[email protected]>
6727    
6728            * Thuban/Model/session.py (Session.forwarded_channels): Forward
6729            the CHANGED channel too.
6730    
6731            * Thuban/Model/map.py (Map.forwarded_channels): Forward the
6732            CHANGED channel too.
6733            (Map.__init__): Call the Modifiable constructor as well.
6734    
6735            * Thuban/Model/base.py (Modifiable.UnsetModified): Issue a CHANGED
6736            event if the modified flag changes.
6737            (Modifiable.changed): Tweak the doc-string.
6738    
6739            * Thuban/UI/mainwindow.py (MainWindow.view_position_changed)
6740            (MainWindow.set_position_text): Put the code that puts the text
6741            with the mouse position into the status bar into the new method
6742            set_position_text so that it can overwritten in derived classes.
6743    
6744    2002-09-12  Bernhard Herzog  <[email protected]>
6745    
6746            * Thuban/UI/mainwindow.py (MainWindow.RunMessageBox): Center the
6747            message box on the main window.
6748    
6749    2002-09-11  Bernhard Herzog  <[email protected]>
6750    
6751            * Thuban/UI/mainwindow.py: Underline the 'x' in "Exit" instead of
6752            the 'E' because it's less likely to interfere with other menu
6753            entries.
6754            (MainWindow.build_menu): remove an incorrect comment.
6755    
6756    2002-09-10  Bernhard Herzog  <[email protected]>
6757    
6758            * Thuban/UI/mainwindow.py (MainWindow.Map): New.
6759            (_tool_command): Add sensitive parameter
6760            (_has_visible_map): Sensitivity callback to tools and other
6761            commands that require a visible map. Use it in map_zoom_in_tool,
6762            map_zoom_out_tool, map_pan_tool, map_identify_tool, map_label_tool
6763            and map_full_extent
6764    
6765    2002-09-06  Bernhard Herzog  <[email protected]>
6766    
6767            * Thuban/UI/mainwindow.py (MainWindow.OnClose): Unsubscribe
6768            VIEW_POSITION
6769    
6770    2002-09-04  Frank Koormann  <[email protected]>
6771    
6772            * Resources/Bitmaps/fullextent.xpm: Updated Icon (removed "potatoe")
6773    
6774    2002-09-02  Bernhard Herzog  <[email protected]>
6775    
6776            * Thuban/UI/view.py: Get rid of the idle redraw. This is done by
6777            wxWindows already and our implementation doesn't work correctly
6778            with wxGTK 2.3:
6779            (MapCanvas.__init__): Remove the instance variable
6780            (MapCanvas.OnPaint): Always call do_redraw when there's a map to
6781            be drawin
6782            (MapCanvas.OnIdle): Removed.
6783    
6784            * Thuban/UI/view.py (MapCanvas.unprojected_rect_around_point): Add
6785            a parameter to determine the size of the rectangle.
6786            (MapCanvas.find_shape_at): Create the box around the point on a
6787            layer by layer basis and make the size depend on the shape type.
6788            This solves a problem with the selection of point shapes at the
6789            border of the layer's bounding box
6790    
6791    2002-08-30  Bernhard Herzog  <[email protected]>
6792    
6793            * Thuban/UI/mainwindow.py (MainWindow.CanRemoveLayer): New method
6794            for the sensitivity  of remove layer.
6795            (_can_remove_layer): New. Sensitivity callback for remove layer
6796            (Command layer_remove): Use _can_remove_layer
6797    
6798            * Thuban/Model/map.py (Map.CanRemoveLayer): New method to
6799            determine whether a given layer can be deleted.
6800    
6801            * Thuban/UI/view.py (MapCanvas.__init__, MapCanvas.OnPaint)
6802            (MapCanvas.do_redraw): Get rid of the unused update_region
6803            instance variable
6804    
6805            * Thuban/UI/view.py: Add/update some doc-strings.
6806    
6807            * test/: new subdirectory with a bunch of unit tests.
6808    
6809            * test/README, test/test_table.py, test/test_save.py,
6810            test/test_menu.py, test/test_load.py: Initial set of tests and
6811            brief instructions on how to run them
6812    
6813    2002-08-29  Bernhard Herzog  <[email protected]>
6814    
6815            * Thuban/UI/renderer.py (ScreenRenderer.draw_shape_layer): Handle
6816            arcs with multiple parts.
6817    
6818            * Thuban/UI/view.py (ZoomInTool.MouseUp, ZoomOutTool.MouseUp):
6819            Handle degenrate rectangles.
6820    
6821            * Thuban/Model/table.py: Make writing records work correctly:
6822            (Table.__init__): Keep track of whether the DBF is open for
6823            writing
6824            (Table.write_record): Open the DBF file for writing when necessary
6825    
6826    2002-08-27  Bernhard Herzog  <[email protected]>
6827    
6828            * Thuban/Model/table.py (Table.write_record, Table.__init__): Open
6829            dbf files only for reading by default. Use a new writable dbf
6830            object for writing.
6831    
6832    2002-08-26  Bernhard Herzog  <[email protected]>
6833    
6834            * Thuban/UI/mainwindow.py: Refactor the context creation:
6835            (MainWindow.Context): New method to return a context
6836            (MainWindow.invoke_command, MainWindow.update_command_ui): Use the
6837            new method
6838    
6839            * Thuban/UI/tableview.py (TableGrid, LayerTableGrid): Split the
6840            layer table specific code from TableGrid into LayerTableGrid
6841            (TableFrame, LayerTableFrame): Split the layer table specific code
6842            from TableFrame into LayerTableFrame
6843            (LayerTableGrid.select_shape): Remove a debug print
6844    
6845            * Thuban/UI/mainwindow.py (MainWindow.LayerShowTable): Use the
6846            LayerTableFrame
6847    
6848    2002-08-23  Bernhard Herzog  <[email protected]>
6849    
6850            * Thuban/Model/layer.py (Layer.__init__): Make sure we have an
6851            absolute filename.
6852    
6853    2002-08-22  Bernhard Herzog  <[email protected]>
6854    
6855            * Thuban/Model/table.py (Table.write_record): New method to write
6856            records.
6857            (Table.__init__): Open the DBF file for writing too.
6858    
6859            * Thuban/UI/controls.py (RecordTable.SetValue): Write the value
6860            into the underlying table.
6861    
6862            * extensions/shapelib/shapefil.h (DBFCommit),
6863            extensions/shapelib/dbfopen.c (DBFCommit): New API function to
6864            commit any changes made to the DBF file.
6865    
6866            * Thuban/UI/mainwindow.py (make_check_current_tool)
6867            (_tool_command): Put the code that generates the "checked"
6868            callback into a separate function so that we can reuse it
6869            elsewhere
6870    
6871            * Thuban/Model/save.py (Saver): New class to handle serializing a
6872            session into an XML file. The main reason to introduce a class is
6873            that applications built on Thuban can derive from it so that they
6874            can save additional information in a session file.
6875            (save_session): Delegate almost all the work to the Saver class.
6876            Rename the filename argument to file because it may be a file like
6877            object now.
6878    
6879            * Thuban/Model/load.py: Get rid of the Python 1.5.2 compatibility
6880            code. Remove the little test code which would be executed when the
6881            module is run as a script which didn't work anymore since it can't
6882            import the other Thuban modules.
6883            (ProcessSession, load_session): Refactor the ProcessSession to
6884            have one method for each element start and end tag so that derived
6885            classes can easily override the processing of individual tags.
6886            Also, always parse with namespaces enabled because applications
6887            built on top of Thuban will likely use namespaces if they extend
6888            the session file format.
6889    
6890    2002-08-21  Bernhard Herzog  <[email protected]>
6891    
6892            * setup.py (ThubanInstall.run): Don't repr install_lib_orig
6893            because thubaninit_contents will do it for us.
6894    
6895    2002-08-16  Jan-Oliver Wagner <[email protected]>
6896    
6897            * Thuban/UI/mainwindow.py: menu item 'show session tree' now disable if
6898            tree window already open
6899    
6900    2002-08-15  Bernhard Herzog  <[email protected]>
6901    
6902            * Thuban/Model/layer.py (Layer.Destroy): Call the unboundd method
6903            with self.
6904    
6905            * Thuban/UI/view.py (MapCanvas.OnLeftUp): Only release the mouse
6906            when we have actually captured it.
6907    
6908            * Thuban/Model/layer.py (Layer.Destroy): New. Explicitly close the
6909            shapefile and destroy the table.
6910    
6911            * Thuban/Model/table.py (Table.Destroy): New. Close the DBF file.
6912    
6913    2002-08-14  Bernhard Herzog  <[email protected]>
6914    
6915            * Thuban/UI/controls.py (RecordTable.__init__): Remove the unused
6916            instance variable columns
6917            (RecordTable.GetTypeName): row and col may be negative in some
6918            cases.
6919    
6920            * setup.py (InstallLocal.initialize_options)
6921            (InstallLocal.finalize_options, InstallLocal.user_options): New
6922            option create-init-file to build a thubaninit.py when running
6923            install_local
6924            (InstallLocal.run): Create the thubaninit.py module when requested
6925            (thubaninit_contents): Split the template into several parts and
6926            create a new function thubaninit_contents that creates the
6927            contents of a thubaninit module.
6928            (ThubanInstall.run): Use the new function to create the thubaninit
6929            module.
6930    
6931    2002-07-30  Bernhard Herzog  <[email protected]>
6932    
6933            * Thuban/UI/application.py (ThubanApplication.OnExit): Do some
6934            cleanup.
6935            (ThubanApplication.MainLoop): Extend to automatically call OnExit.
6936    
6937            * Thuban/Model/session.py (Session.Destroy): Don't bypass the
6938            direct base class' Destroy method.
6939    
6940            * Thuban/Model/map.py (Map.ClearLayers): New method to delete all
6941            layers.
6942            (Map.Destroy): Destroy the label_layer as well and call the
6943            inherited Desatroymethod first so that no more messages are
6944            issued.
6945            (Map.RaiseLayer, Map.LowerLayer): Only issue LAYERS_CHANGED
6946            message if the stacking order actually has changed. Add
6947            doc-strings.
6948            (Map.BoundingBox): Correct the doc-string.
6949            (Map.AddLayer, Map.RemoveLayer, Map.Layers, Map.HasLayers)
6950            (Map.ProjectedBoundingBox, Map.SetProjection): Add doc-strings.
6951    
6952            * Thuban/Model/label.py (LabelLayer.ClearLabels): New to delete
6953            all labels.
6954    
6955    2002-07-29  Bernhard Herzog  <[email protected]>
6956    
6957            * Thuban/Model/map.py (Map.subscribe_layer_channels)
6958            (Map.unsubscribe_layer_channels): Put the code that (un)subscribes
6959            to a layer's channels into separate methods.
6960            (Map.RemoveLayer, Map.AddLayer): Call the new methods
6961            (Map.Destroy): Unsubscribe from a layer's channels before
6962            destroying it.
6963    
6964            * Thuban/UI/view.py (MapCanvas.find_shape_at): Change the
6965            selected_layer parameter to searched_layer which is the layer to
6966            search in.
6967            (MapCanvas.SelectShapeAt): New parameter layer to restrict the
6968            search to that layer. Return the selected layer and shape.
6969    
6970            * Examples/simple_extensions/simple_tool.py (simple_tool): Fix a
6971            typo
6972    
6973    2002-07-24  Bernhard Herzog  <[email protected]>
6974    
6975            * Thuban/UI/application.py (ThubanApplication.create_session):
6976            Extend the doc string.
6977            (ThubanApplication.subscribe_session)
6978            (ThubanApplication.unsubscribe_session): New methods to
6979            subscribe/unsubscribe to/from session channels.
6980            (ThubanApplication.SetSession): Call the new methods here.
6981            (ThubanApplication.maps_changed, ThubanApplication.set_map):
6982            Renamed set_map to maps_changed. Its now a subscriber for
6983            MAPS_CHANGED.
6984    
6985            * Thuban/UI/view.py (ZoomOutTool.MouseUp): Use the correct
6986            x-coordinate in case of simple clicks
6987    
6988            * Thuban/Model/base.py (Modifiable.changed): Apply the args tuple,
6989            don't pass it as a parameter
6990    
6991            * Thuban/Model/session.py (Session.RemoveMap): New
6992    
6993            * Thuban/UI/mainwindow.py (MainWindow.__init__): Turn the initial
6994            window size into a parameter.
6995    
6996    2002-07-23  Bernhard Herzog  <[email protected]>
6997    
6998            * Thuban/UI/menu.py (Menu.item_index): Also search for menus not
6999            just commands.
7000    
7001            * Thuban/UI/mainwindow.py (MainWindow.__init__): Change the
7002            parameter list a bit to allow setting the window title and the
7003            initial message in the status bar. Update the callers.
7004    
7005            * Thuban/UI/application.py (ThubanApplication.OnInit)
7006            (ThubanApplication.CreateMainWindow): Put the mainwindow
7007            instantiation into a separate method so that it can be overridden
7008            by a subclass.
7009    
7010    2002-07-19  Bernhard Herzog  <[email protected]>
7011    
7012            * Thuban/Model/session.py: Issue a CHANGED message every time
7013            another changed message is issued to make it easier to get
7014            notified of changes.
7015            (Session): Update the doc string
7016            (Session.forward): Issue changed-events as CHANGED as well.
7017            (Session.changed): Overwrite the inherited version to issue
7018            CHANGED events as well.
7019    
7020            * Thuban/UI/tree.py: We can now simply subscribe to the session's
7021            CHANGED channel to be informed of changes.
7022            (SessionTreeCtrl.session_channels): Not needed any longer.
7023            (SessionTreeCtrl.unsubscribe_all, SessionTreeCtrl.session_changed):
7024            Only have to (un)subscribe CHANGED
7025    
7026            * Thuban/Model/map.py (Map.TreeInfo): Deal better with empty maps.
7027    
7028            * Thuban/UI/main.py, Thuban/UI/__init__.py: Move the work-around
7029            for the wxPython locale bug to __init__.py so that it's
7030            automatically executed by anybody using UI code from Thuban.
7031    
7032    2002-07-18  Bernhard Herzog  <[email protected]>
7033    
7034            * Thuban/UI/main.py (main): app no longer needs to be global
7035    
7036            * Thuban/UI/mainwindow.py (MainWindow.__init__): Add application
7037            as parameter and store it in an instance variable
7038            (MainWindow.invoke_command, MainWindow.update_command_ui)
7039            (MainWindow.save_modified_session, MainWindow.NewSession)
7040            (MainWindow.OpenSession, MainWindow.SaveSession)
7041            (MainWindow.SaveSessionAs, MainWindow.ShowSessionTree): Use self's
7042            application object.
7043    
7044            * Thuban/UI/application.py (ThubanApplication.OnInit): Instantiate
7045            the main window with self.
7046    
7047            * Thuban/UI/context.py: New module with the context class
7048    
7049            * Thuban/UI/command.py (Command): Update doc string.
7050    
7051            * Thuban/UI/mainwindow.py (MainWindow.invoke_command,
7052            MainWindow.update_command_ui): Pass an instance of the context
7053            class to the command's methods
7054            (check_current_tool, call_method): Handle the new context
7055            implementation
7056    
7057            * Examples/simple_extensions/simple_tool.py (simple_tool,
7058            check_simple_tool): Handle the new context implementation
7059    
7060            * Examples/simple_extensions/simple_command.py (simple_command):
7061            Handle the new context implementation. Update the comments about
7062            the context.
7063    
7064            * Thuban/UI/application.py (ThubanApplication.SetSession): Add
7065            doc-string
7066            (ThubanApplication.Session): New method to return the session
7067            object
7068    
7069            * Thuban/UI/tree.py (SessionTreeCtrl.update_tree): The
7070            interactor's selected_layer may not be a layer of the current
7071            session when the tree is updated while a new session is being set.
7072    
7073    2002-07-17  Bernhard Herzog  <[email protected]>
7074    
7075            * Thuban/UI/tree.py (color_string): Removed. No longer used.
7076            (SessionTreeCtrl.update_tree, SessionTreeCtrl.add_items): Split
7077            update_tree into update_tree and add_items. The tree now uses a
7078            more generic way to display the contents of the tree.
7079            (SessionTreeCtrl): Add a doc string explaining the TreeInfo method
7080    
7081            * Thuban/Model/layer.py (Layer.TreeInfo),
7082            Thuban/Model/extension.py (Extension.TreeInfo),
7083            Thuban/Model/map.py (Map.TreeInfo),
7084            Thuban/Model/session.py (Session.TreeInfo):
7085            Add TreeInfo methods to implement the new tree view update scheme
7086    
7087    2002-07-16  Bernhard Herzog  <[email protected]>
7088    
7089            * Thuban/UI/application.py: Don't use "import from" for the
7090            MainWindow. It can't always be resolved.
7091            (ThubanApplication.OnInit): change reference to MainWindow
7092            accordingly.
7093    
7094            * Thuban/UI/menu.py (Menu.SetItems): New method to replace a menu
7095            completely
7096    
7097    2002-07-10  Bernhard Herzog  <[email protected]>
7098    
7099            * setup.py (create_init_module): New configurable variable whose
7100            default depends on the platform we're running on.
7101            (ThubanInstall.initialize_options): Initialize
7102            self.create_init_module from the global create_init_module
7103            (ThubanInstall.user_options): indictate that the options
7104            create-init-module and init-module-dir have arguments.
7105    
7106            * setup.py: In the setup call change the version number to include
7107            cvs.
7108    
7109            * MANIFEST.in: Add the files in Examples
7110    
7111    2002-07-09  Bernhard Herzog  <[email protected]>
7112    
7113            * setup.py: In the setup call, use the thuban homepage as the
7114            value of the url parameter.
7115    
7116            * Examples: New subdirectory for examples.
7117    
7118            * Examples/simple_extensions/simple_tool.xpm,
7119            Examples/simple_extensions/simple_tool.py,
7120            Examples/simple_extensions/simple_command.py,
7121            Examples/simple_extensions/README: Simple examples showing how to
7122            add new commands and tools.
7123    
7124            * setup.cfg (bdist_rpm): Add the default value for prefix and tell
7125            bdist_rpm that we also have an install script.
7126            (bdist_inno): Add 2002 to the copyright notice.
7127    
7128            * setup.py: Create a file in python's site-packages directory to
7129            make installation of Thuban as a library easier.
7130            (ThubanInstall.user_options): Add two new options,
7131            create-init-module and init-module-dir
7132            (ThubanInstall.expand_with_pure_python_dirs): New method to expand
7133            filenames for installation in the default directories.
7134            (ThubanInstall.select_scheme, ThubanInstall.convert_paths): Extend
7135            the inherited methods to capture some filenames before they're
7136            transformed too much by distutils.
7137            (ThubanInstall.run): Create the init module if requested.
7138            (ThubanInstall.thuban_init_filename): New method to return the
7139            full name of the init module.
7140            (ThubanInstall.get_outputs): Append the filename of the init
7141            module.
7142    
7143    2002-07-08  Bernhard Herzog  <[email protected]>
7144    
7145            * setup.py (thuban_bdist_rpm): Extend this version of bdist_rpm to
7146            handle the prefix properly which means that the default for the
7147            installation prefix should be /usr for RPMs and /usr/local when
7148            doing a normal source install.
7149            (bdist_rpm_install_script): Script to override the default install
7150            commands in the specfile generated by the bdist_rpm command.
7151            (thuban_bdist_rpm.user_options): Add a prefix option
7152            (thuban_bdist_rpm.initialize_options): Init the prefix option.
7153            Create the script files for the spec files as empty files here
7154            (thuban_bdist_rpm._make_spec_file): Override the inherited method
7155            to fill the script files with content.
7156    
7157            * Thuban/Model/save.py (relative_filename): Wrapper around
7158            Thuban.Lib.fileutil.relative_filename that accepts an empty dir
7159            argument. save_session now automatically uses this version,
7160            solving a problem when saving to a relative filename.
7161    
7162            * setup.py: In the setup call, make sure that the library
7163            directories are under $prefix/lib not directly under $prefix.
7164    
7165    2002-06-20  Jan-Oliver Wagner <[email protected]>
7166    
7167            * Thuban/Model/extension.py: new module to handle extension objects.
7168            * Thuban/Model/messages.py: new messages for extensions.
7169            * Thuban/Model/session.py (Session.Extensions, Session.HasExtensions,
7170            Session.AddExtension): new for handling extensions.
7171            Also some other minor changes to round up extension handling.
7172            * Thuban/UI/tree.py (SessionTreeCrtl:update_tree): Added visualization
7173            of Extension titles and title and names of its objects.
7174    
7175    2002-05-29  Bernhard Herzog  <[email protected]>
7176    
7177            * Thuban/UI/mainwindow.py (MainWindow.bind_command_events): Bind
7178            the events for a command.
7179            (MainWindow.add_toolbar_command, MainWindow.add_menu_command):
7180            Call bind_command_events to bind the events. add_toolbar_command
7181            can now bind events too so that it's possible to have commands
7182            that are only available through the toolbar.
7183            (MainWindow.init_ids): New instance variable events_bound to keep
7184            track of for which commands events have been bound.
7185    
7186    2002-05-28  Bernhard Herzog  <[email protected]>
7187    
7188            * Thuban/UI/menu.py: New module to build and manage menus.
7189    
7190            * Thuban/UI/mainwindow.py: Remove some unused imports.
7191            (MainWindow.__init__, main_menu): move the definition of the main
7192            menu from __init__ to the Menu instance main_menu.
7193            (MainWindow.build_menu_bar, MainWindow.build_menu): New methods to
7194            build the menu bar and sub-menus from a menu description.
7195    
7196            * Thuban/UI/application.py (ThubanApplication.OnInit): Read the
7197            startup file
7198            (ThubanApplication.read_startup_files): New method to run
7199            ~/.thuban/thubanstart.py
7200    
7201            * Thuban/UI/mainwindow.py (MainWindow.__init__, main_toolbar):
7202            Move the toolbar definition to the Menu instance main_toolbar.
7203            (MainWindow.build_toolbar): New method to build the toolbar
7204            similar to the build_menu methods
7205    
7206    2002-05-23  Bernhard Herzog  <[email protected]>
7207    
7208            * Thuban/UI/mainwindow.py (MainWindow.__init__): Fix spelling of
7209            layer_outline_color. Fix it in the definition of the command too.
7210    
7211            * Thuban/UI/command.py (Command): Fix typo in doc string
7212    
7213    2002-05-22  Bernhard Herzog  <[email protected]>
7214    
7215            * Thuban/UI/mainwindow.py (MainWindow.RunMessageBox): Fix a typo
7216            in the docstring
7217    
7218    2002-05-15  Bernhard Herzog  <[email protected]>
7219    
7220            * Thuban/Model/layer.py (Layer.open_shapefile): Set bbox to None
7221            when the shapefile is empty.
7222            (Layer.BoundingBox, Layer.LatLongBoundingBox): Both methods may
7223            now return None for empty shapefiles. Update doc-strings.
7224    
7225            * Thuban/Model/map.py (Map.BoundingBox): Add doc-string. Deal with
7226            the layer's bbox being None.
7227    
7228            * Thuban/UI/tree.py (SessionTreeCtrl.update_tree): Deal with the
7229            layer's bbox being None.
7230    
7231            * Thuban/UI/view.py (MapCanvas.shape_selected): Only redraw when
7232            necessary.
7233            (MapCanvas.__init__): New instance variables, last_selected_layer
7234            and last_selected_shape to determine how the selection has
7235            changed.
7236    
7237            * Thuban/UI/tableview.py (TableGrid.__init__): Do not call
7238            AutoSizeColumns because it will cause a traversal of the entire
7239            table which for large .dbf files will take a very long time.
7240    
7241    2002-05-14  Bernhard Herzog  <[email protected]>
7242    
7243            * Thuban/Model/layer.py (Layer.open_shapefile): Choose a better
7244            maximum depth for the tree than shapelib does by default.
7245    
7246    2002-05-10  Bernhard Herzog  <[email protected]>
7247    
7248            * setup.py (py_modules): The shptree modules doesn't have a
7249            wrapper, so don't include it in the py_modules
7250    
7251    2002-05-08  Bernhard Herzog  <[email protected]>
7252    
7253            * extensions/shapelib/shptree.c (compare_ints): Make arguments
7254            const void * as in the qsort prototype
7255            (SHPTreeFindLikelyShapes): Remove some unused variables.
7256    
7257            * Thuban/UI/view.py (PanTool.MouseMove): Use the bitmap the view
7258            maintains to redraw the window during a drag.
7259            (MapCanvas.unprojected_rect_around_point): New method to determine
7260            a small region around a point for hit-testing.
7261            (MapCanvas.find_shape_at): Only test the shapes in a small region
7262            around the point.
7263    
7264            * setup.py: Increment the version to 0.1.2
7265    
7266            * Thuban/UI/tree.py (SessionTreeCtrl.unsubscribe_all): Remove a
7267            debug print and set session to None after unsubscribing
7268    
7269    2002-05-07  Bernhard Herzog  <[email protected]>
7270    
7271            * Data/iceland_sample.session, Data/iceland_sample.thuban: Rename
7272            the file to have a .thuban extension.
7273    
7274            * Thuban/UI/tree.py (session_channels): New class constant with
7275            all the session channels to subscribe to to update the tree
7276            (SessionTreeCtrl.session_changed): Remember the session so that we
7277            can unsubscribe properly. Use the new class constant to
7278            unsubscribe from the old session and subscribe to the new one.
7279            (SessionTreeCtrl.unsubscribe_all): New method to unsubscribe all
7280            subscriptions of the SessionTreeCtrl.
7281            (SessionTreeView.OnClose): Call the tree's unsubscribe_all method.
7282    
7283            * Thuban/UI/mainwindow.py (MainWindow.__init__): Add the "Show
7284            Session Tree" command to the file menu.
7285    
7286            * Thuban/UI/view.py (MapCanvas.do_redraw): Pass the entire bitmap
7287            as update_region to the renderer.
7288    
7289            * Thuban/UI/renderer.py
7290            (ScreenRenderer.layer_ids, ScreenRenderer.draw_shape_layer): The
7291            update box is now directly a tuple, not a wxRect anymore.
7292    
7293            * Thuban/Model/layer.py (Layer.ShapesInRegion): Remove some debug
7294            prints.
7295    
7296    2002-05-07  Bernhard Herzog  <[email protected]>
7297    
7298            * setup.py: Add the shptree extension module. See
7299            extensions/pyshapelib/ChangeLog for more details.
7300    
7301            * extensions/shapelib/shpopen.c, extensions/shapelib/shapefil.h,
7302            extensions/shapelib/dbfopen.c: Really update to the versions of
7303            shapelib 1.2.9. For some reason it wasn't really done on
7304            2002-04-11.
7305    
7306            * extensions/shapelib/shptree.c: Modified version of shptree.c of
7307            shapelib 1.2.9. The only real difference is the use of qsort
7308            instead of a bubble sort implementation
7309    
7310            * Thuban/Model/layer.py (Layer.__init__): New instance variable
7311            shapetree to hold the shapelib quadtree for the shapefile
7312            (Layer.open_shapefile): Create the quad tree.
7313            (Layer.ShapesInRegion): New method to return the ids of shapes in
7314            a given region using the quad tree.
7315    
7316            * extensions/thuban/wxproj.cpp (project_points): Fix some typos in
7317            comment
7318            (draw_polygon_shape): Accept both arcs and polygons.
7319            (initwxproj): Use the new PYSHAPELIB_IMPORT_API macro to import
7320            the api.
7321    
7322            * Thuban/UI/renderer.py (MapRenderer.layer_ids): New method to
7323            return the shape ids to be rendered in a given layer.
7324            (MapRenderer.draw_shape_layer): Call layer_ids to get the list of
7325            ids. Use draw_polygon_shape to draw arc shapes as well.
7326            (ScreenRenderer.RenderMap): New parameter for the rectangle that
7327            has to be updated
7328            (ScreenRenderer.layer_ids): Make use of the layer's quadtree by
7329            calling it's ShapesInRegion method.
7330    
7331            * Thuban/UI/view.py (MapCanvas.__init__): New instance variable
7332            update_region for the update region.
7333            (MapCanvas.OnPaint): Maintain the update region
7334            (MapCanvas.do_redraw): Pass the bounding box of the update_region
7335            to the renderer when drawing the bitmap. Reset the update_region.
7336    
7337    2002-05-03  Bernhard Herzog  <[email protected]>
7338    
7339            * Thuban/UI/mainwindow.py (MainWindow.SaveSessionAs,
7340            MainWindow.OpenSession): Change the file extension of the session
7341            files to .thuban
7342    
7343            * Thuban/Model/session.py (Session.AddMap, forwarded_channels):
7344            Move the map channels to be forwarded by the session into the
7345            class constant with forwarded_channels. Also add
7346            LAYER_PROJECTION_CHANGED and LAYER_VISIBILITY_CHANGED to
7347            forwarded_channels
7348    
7349            * Thuban/Model/base.py (Modifiable.changed): Fix doc-string (a
7350            typo and some rewording).
7351    
7352    2002-05-02  Bernhard Herzog  <[email protected]>
7353    
7354            * Thuban/UI/view.py: Keep the temporary bitmap used during drawing
7355            around to speed up most redraws:
7356            (MapCanvas.__init__): New instance variable bitmap which holds the
7357            bitmap
7358            (MapCanvas.do_redraw): Redraw self.bitmap if necessary. Use
7359            self.bitmap to draw.
7360            (MapCanvas.full_redraw): New method to force a full redraw
7361            including the bitmap
7362            (MapCanvas.SetMap): Subscribe full_redraw instead of redraw to
7363            make sure the bitmap is redrawn.
7364            (MapCanvas.projection_changed, MapCanvas.set_view_transform,
7365            MapCanvas.shape_selected): Call full_redraw instead of readraw to
7366            make sure the bitmap is redrawn.
7367            (MapCanvas.OnSize): New method to handle size events so that the
7368            bitmap can be redrawn.
7369    
7370    2002-04-29  Bernhard Herzog  <[email protected]>
7371    
7372            * Thuban/UI/mainwindow.py (MainWindow.__init__): Subscribe to the
7373            canvas' VIEW_POSITION event
7374            (MainWindow.view_position_changed): Handler for VIEW_POSITION.
7375            Update the text in the status-bar accordingly.
7376    
7377            * Thuban/UI/view.py (MapCanvas): Derive from Publisher as well
7378            (MapCanvas.__del__): Implement because Publisher.__del__ has to be
7379            called.
7380            (MapCanvas.__init__): Bind EVT_LEAVE_WINDOW too. Initialize
7381            current_position
7382            (MapCanvas.set_current_position): New method to set
7383            current_position. Issue a VIEW_POSITION event
7384            (MapCanvas.CurrentPosition): New public method to return the value
7385            of current_position. Should be called when the VIEW_POSITION event
7386            is processed.
7387            (MapCanvas.OnLeftDown, MapCanvas.OnLeftUp, MapCanvas.OnMotion):
7388            Update the position.
7389            (MapCanvas.OnLeaveWindow): Set the position to None.
7390    
7391            * Thuban/UI/messages.py (VIEW_POSITION): New message for the
7392            position in the statusbar
7393    
7394    2002-04-26  Frank Koormann <[email protected]>
7395    
7396            * Thuban/UI/mainwindow.py: AddLayer, Dialog title s/session/data
7397    
7398    2002-04-24  Frank Koormann <[email protected]>
7399    
7400            * Resources/Bitmaps/identify.xpm: shadow added
7401    
7402            * Resources/Bitmaps/fullextent.xpm: new
7403    
7404    2002-04-22  Jan-Oliver Wagner <[email protected]>
7405    
7406            * Thuban/UI/tree.py (update_tree): added test for None on map bounding
7407            box
7408    
7409    2002-04-21  Jan-Oliver Wagner <[email protected]>
7410    
7411            * Thuban/UI/proj4dialog.py (UTMProposeZoneDialog): new
7412    
7413            * Thuban/UI/tree.py (update_tree): added added map extent
7414    
7415            * Thuban/UI/mainwindow.py (_method_command): extended by parameter
7416            icon; added map_full_extend as tool
7417    
7418    2002-04-19  Jan-Oliver Wagner <[email protected]>
7419    
7420            * Thuban/UI/mainwindow.py (SaveSession): launch save as dialog for
7421            saving _new_ sessions
7422    
7423            * Thuban/Model/session.py (create_empty_session): new session
7424            don't have a filename (set to None)
7425    
7426            * Thuban/UI/tree.py (update_tree): added filename and modified flag
7427    
7428            * Thuban/Model/load.py (ProcessSession): convert projection
7429            parameters from unicode to regular string
7430    
7431            * Data/iceland_sample.session: Added UTM Zone 26 projection.
7432    
7433    2002-04-11  Bernhard Herzog  <[email protected]>
7434    
7435            * extensions/shapelib/shapefil.h, extensions/shapelib/shpopen.c,
7436            extensions/shapelib/dbfopen.c: Update to the versions of shapelib
7437            1.2.9
7438    
7439            * setup.py (Lib.wxproj extension): Don't link shpopen.c and put
7440            the pyshapelib directoy into the list of include dirs, so that
7441            pyshapelib_api.h can be found.
7442    
7443            * extensions/thuban/wxproj.cpp (pyshapelib_api): New variable that
7444            holds the pyshapelib C-API
7445            (draw_polygon_shape, point_in_polygon_shape, shape_centroid): Use
7446            pyshapelib_api to access the shapelib functions.
7447            (initwxproj): Import the c_api from the shapelib module and
7448            initialize pyshapelib_api.
7449    
7450    2002-04-04  Bernhard Herzog  <[email protected]>
7451    
7452            * setup.py (thuban_bdist_rpm.initialize_options): Use
7453            initialize_options to create the scripts for the rpm.
7454    
7455            * extensions/pyprojection/setup.py (PROJ4_PREFIX): Just use /
7456    
7457    2002-04-03  Bernhard Herzog  <[email protected]>
7458    
7459            * setup.py: Increment version to 0.1.1
7460    
7461            * Thuban/UI/mainwindow.py (MainWindow.__init__): Move the "Add
7462            Layer" and "Remove Layer" commands from the layer menu to the map
7463            menu
7464    
7465    2002-02-15  Bernhard Herzog  <[email protected]>
7466    
7467            * Thuban/Model/layer.py (Layer.Shape): list append only takes one
7468            argument (python <= 1.5.2 erroneously accepted multiuple
7469            arguments)
7470    
7471    2002-02-04  Bernhard Herzog  <[email protected]>
7472    
7473            * Thuban/UI/identifyview.py (IdentifyGridCtrl): New class to use a
7474            RecordGrid in the identifyview.
7475            (IdentifyView.__init__): Use IdentifyGridCtrl instead of
7476            IdentifyListCtrl. The grid allows editing of the values.
7477    
7478            * Thuban/UI/controls.py (RecordTable, RecordGridCtrl): New classes
7479            implementing a grid for a single row of a thuban table.
7480    
7481            * Thuban/UI/view.py (MapCanvas.SelectShapeAt): Search through all
7482            layers by default. Easier to use than the previous default of only
7483            searching through the select layer which meant that if no layer
7484            was selected, you couldn't select a shape.
7485    
7486            * Thuban/UI/tableview.py (TableGrid.__init__): Fix typo
7487    
7488            * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Honour the
7489            stroke_width attribute
7490    
7491            * Thuban/Model/save.py (save_session): Write the new stroke_width
7492            attribute
7493    
7494            * Thuban/Model/load.py (ProcessSession.startElement): Read the
7495            stroke_width attribute
7496    
7497            * Thuban/Model/layer.py (Layer.__init__): New parameter and
7498            instance variable stroke_width
7499            (Layer.SetStrokeWidth): Set the stroke_width.
7500    
7501    2002-02-01  Bernhard Herzog  <[email protected]>
7502    
7503            * extensions/thuban/wxproj.cpp (project_points): Fix two
7504            off-by-one errors in the last loop that joins the various parts
7505            together.
7506    
7507    2002-01-14  Bernhard Herzog  <[email protected]>
7508    
7509            * setup.py (data_dist.make_distribution): Fix some typos
7510    
7511    2001-09-18  Bernhard Herzog  <[email protected]>
7512    
7513            * README: Slight tweaking in preparation for the 0.1 release
7514    
7515            * setup.cfg: Add section for sdist to create both tgz and zip
7516            archives
7517    
7518            * setup.py: increase version number to 0.1
7519            (data_dist): New command class for data distribution
7520    
7521    2001-09-14  Bernhard Herzog  <[email protected]>
7522    
7523            * Thuban/UI/identifyview.py (IdentifyListCtrl.selected_shape):
7524            Handle the case of no layer (i.e. layer is None) properly.
7525    
7526            * Thuban/UI/proj4dialog.py (UTMDialog.__init__, Proj4Dialog.__init__):
7527            Set the initial selection of the combo boxes to reflect the
7528            projection we're starting with in a way that works on windows,
7529            too.
7530    
7531            * Thuban/Lib/connector.py (Connector.print_connections): Print the
7532            puiblisher's ids in hex to make it easier to compare them to the
7533            standard repr of python methods
7534    
7535            * Thuban/Model/map.py (Map.Destroy): Unsubscribe the label_layer
7536            messages
7537    
7538  2001-09-13  Bernhard Herzog  <[email protected]>  2001-09-13  Bernhard Herzog  <[email protected]>
7539    
7540            * Thuban/UI/tree.py (SessionTreeCtrl.OnSelChanged): Make sure to
7541            deselect the layer if no layer is selected
7542    
7543          * Thuban/UI/view.py (MapCanvas.OnPaint): Only delay drawing to          * Thuban/UI/view.py (MapCanvas.OnPaint): Only delay drawing to
7544          idle time when there actually is something to draw. If there's          idle time when there actually is something to draw. If there's
7545          nothing to draw simply clear the window          nothing to draw simply clear the window
# Line 10  Line 7550 
7550          specify the point to move into the center of the window          specify the point to move into the center of the window
7551          (ZoomOutTool.MouseUp, ZoomInTool.MouseUp): If the mouse wasn't          (ZoomOutTool.MouseUp, ZoomInTool.MouseUp): If the mouse wasn't
7552          dragged, zoon in/out by a factor of 2          dragged, zoon in/out by a factor of 2
7553            (MapCanvas.find_shape_at): Iterate backwards (i.e. with decreasing
7554            index, i.e. reversed drawing order) so that objects appearing to
7555            be in from of others are selected first. This is probably mostly
7556            relevant for point shapes where the symbols used may overlap
7557    
7558          * Thuban/Model/session.py (create_empty_session): Unset the          * Thuban/Model/session.py (create_empty_session): Unset the
7559          modified bit before returning it          modified bit before returning it
# Line 89  Line 7633 
7633          (MainWindow.identify_view_on_demand): Store the interactor in an          (MainWindow.identify_view_on_demand): Store the interactor in an
7634          instvar and use that reference instead of going through main.app          instvar and use that reference instead of going through main.app
7635    
7636          * Thuban/UI/mainwindow.py (MainWindow.ShowSessionTree):          * Thuban/UI/mainwindow.py (MainWindow.ShowSessionTree):
7637          * Thuban/UI/application.py (ThubanApplication.OnInit):          * Thuban/UI/application.py (ThubanApplication.OnInit):
7638          * Thuban/UI/main.py (main): Create the session tree view in main          * Thuban/UI/main.py (main): Create the session tree view in main
7639          with the new mainwindow method ShowSessionTree and not directly          with the new mainwindow method ShowSessionTree and not directly
7640          the application's OnInit method          the application's OnInit method
# Line 106  Line 7650 
7650          layer to the tableview dialog.          layer to the tableview dialog.
7651    
7652          * Thuban/UI/tableview.py: Add some doc-strings          * Thuban/UI/tableview.py: Add some doc-strings
7653          (TableGrid):          (TableGrid):
7654          (TableGrid.OnRangeSelect):          (TableGrid.OnRangeSelect):
7655          (TableGrid.OnSelectCell):          (TableGrid.OnSelectCell):
7656          (TableFrame.__init__):          (TableFrame.__init__):
# Line 173  Line 7717 
7717  2001-09-05  Bernhard Herzog  <[email protected]>  2001-09-05  Bernhard Herzog  <[email protected]>
7718    
7719          * Thuban/UI/view.py (MapCanvas.__init__): New argument, interactor.          * Thuban/UI/view.py (MapCanvas.__init__): New argument, interactor.
7720            
7721          * Thuban/UI/mainwindow.py (MainWindow.__init__): New argument          * Thuban/UI/mainwindow.py (MainWindow.__init__): New argument
7722          interactor to pass through to the MapCanvas          interactor to pass through to the MapCanvas
7723            
7724          * Thuban/UI/application.py (ThubanApplication.OnInit): Use the new          * Thuban/UI/application.py (ThubanApplication.OnInit): Use the new
7725          argument to the MainWindow constructor to get rid of the ugly hack          argument to the MainWindow constructor to get rid of the ugly hack
7726          that made main.app available early just so that the mapcanvas          that made main.app available early just so that the mapcanvas
# Line 223  Line 7767 
7767          (ThubanInstall.run): Remove the leading install root from the          (ThubanInstall.run): Remove the leading install root from the
7768          script filename if an install root was specified and use the new          script filename if an install root was specified and use the new
7769          link_file method          link_file method
7770            
7771          * Thuban/UI/mainwindow.py (MainWindow.AddLayer): Fit the map to          * Thuban/UI/mainwindow.py (MainWindow.AddLayer): Fit the map to
7772          the window when the first layer is added to the map.          the window when the first layer is added to the map.
7773    
# Line 260  Line 7804 
7804          (InnoIconItem): Helper class for bdist_inno          (InnoIconItem): Helper class for bdist_inno
7805          (thuban_bdist_inno): Thuban specific version of bdist_inno. Added          (thuban_bdist_inno): Thuban specific version of bdist_inno. Added
7806          this together with the appropriate parameters, to the setup call.          this together with the appropriate parameters, to the setup call.
7807            
7808          * setup.cfg (bdist_inno): added new section for the inno setup          * setup.cfg (bdist_inno): added new section for the inno setup
7809          installer          installer
7810    

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

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26