/[thuban]/branches/WIP-pyshapelib-bramz/ChangeLog
ViewVC logotype

Annotation of /branches/WIP-pyshapelib-bramz/ChangeLog

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1834 - (hide annotations)
Mon Oct 20 11:01:14 2003 UTC (21 years, 4 months ago) by bh
Original Path: trunk/thuban/ChangeLog
File size: 301841 byte(s)
update ChangeLog

1 bh 1834 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 bh 1832 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 silke 1829 2003-10-16 Silke Reimer <[email protected]>
34    
35     * debian/*: New directory with configuration files for building a thuban
36     deb-package.
37    
38 bh 1822 2003-10-14 Bernhard Herzog <[email protected]>
39    
40 bh 1828 * 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 bh 1826 * 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 bh 1822 * 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 bh 1812 2003-10-13 Bernhard Herzog <[email protected]>
78    
79 bh 1820 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 bh 1814 * 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 bh 1812 * 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 bh 1805 2003-10-10 Bernhard Herzog <[email protected]>
139    
140 bh 1810 * 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 bh 1807 * 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 bh 1805 * README: Fix typo.
172    
173 bh 1803 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 jan 1801 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 bh 1799 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 bh 1794 2003-10-08 Bernhard Herzog <[email protected]>
200    
201 bh 1796 * 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 bh 1794 * 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 jan 1792 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 bh 1788 2003-10-08 Bernhard Herzog <[email protected]>
216    
217 bh 1790 * 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 bh 1788 * 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 bh 1785 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 bh 1773 2003-10-06 Bernhard Herzog <[email protected]>
267    
268 bh 1783 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 bh 1777 * Thuban/UI/application.py (ThubanApplication.maps_changed): Add
312     doc-string
313    
314     2003-10-06 Bernhard Herzog <[email protected]>
315    
316 bh 1775 * 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 bh 1773 * 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 bh 1770 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 jan 1767 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 bh 1757 2003-09-26 Bernhard Herzog <[email protected]>
351    
352 bh 1760 * 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 bh 1757 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 bh 1751 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 jan 1745 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 bh 1743 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 bh 1737 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 jan 1730 2003-09-22 Jan-Oliver Wagner <[email protected]>
414    
415 jan 1735 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 jan 1730 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 jan 1720 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 bh 1718 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 jan 1716 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 jan 1714 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 jan 1705 2003-09-03 Jan-Oliver Wagner <[email protected]>
494    
495 jan 1707 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 jan 1705 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 bh 1694 2003-09-01 Bernhard Herzog <[email protected]>
516    
517 bh 1701 * 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 bh 1699 * 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 bh 1696 * 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 bh 1694 * 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 bh 1692 2003-08-29 Bernhard Herzog <[email protected]>
555    
556     * HOWTO-Release: Tweak item about running the tests.
557    
558 jan 1690 2003-08-29 Jan-Oliver Wagner <[email protected]>
559    
560     * /Doc/manual/thuban-manual.xml: updated to version 1.0pre2.
561    
562 bh 1688 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 bh 1672 2003-08-28 Bernhard Herzog <[email protected]>
593    
594 bh 1685 * 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 bh 1672 * 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 bh 1663 2003-08-27 Bernhard Herzog <[email protected]>
666    
667 bh 1665 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 bh 1663 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 bh 1659 2003-08-26 Bernhard Herzog <[email protected]>
789    
790 bh 1661 * 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 bh 1659 * 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 bh 1643 2003-08-25 Bernhard Herzog <[email protected]>
806    
807 bh 1657 * 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 bh 1655 * 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 bh 1653 * 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 bh 1651 * 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 bh 1649 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 bh 1647 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 bh 1645 * 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 bh 1643 * 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 bh 1632 2003-08-22 Bernhard Herzog <[email protected]>
916 bh 1641
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 bh 1639 Implement saving a session with a postgis connection
923 bh 1632
924 bh 1639 * 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 bh 1637 * 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 bh 1635 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 bh 1632 * 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 bh 1633 (DBFrame.OnRemove): Display a message if the connection can't be
1013     removed because it's still in use.
1014 bh 1632
1015 jan 1629 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 bh 1627 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 jan 1623 2003-08-21 Jan-Oliver Wagner <[email protected]>
1039    
1040 jan 1626 * 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 jan 1623 * 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 bh 1621 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 jan 1619 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 bh 1606 2003-08-19 Bernhard Herzog <[email protected]>
1126    
1127 bh 1609 * 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 bh 1606 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 jan 1604 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 bh 1600 2003-08-18 Bernhard Herzog <[email protected]>
1187    
1188 bh 1602 * 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 bh 1600 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 jan 1596 2003-08-18 Jan-Oliver Wagner <[email protected]>
1218    
1219     * Thuban/UI/about.py (About.__init__): Added Silke Reimer.
1220    
1221 bh 1586 2003-08-15 Bernhard Herzog <[email protected]>
1222    
1223 bh 1594 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 bh 1592 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 bh 1590 * 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 bh 1588 * 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 bh 1586 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 jan 1584 2003-08-12 Jan-Oliver Wagner <[email protected]>
1347    
1348     * Thuban/UI/about.py (About.__init__): Added Björn Broscheit.
1349    
1350 bh 1580 2003-08-12 Bernhard Herzog <[email protected]>
1351    
1352 bh 1582 * po/de.po: New. German translations by Bjoern Broscheit
1353    
1354     2003-08-12 Bernhard Herzog <[email protected]>
1355    
1356 bh 1580 * Thuban/UI/projdialog.py (UnknownProjPanel._DoLayout): Translated
1357     strings have to be one string literal.
1358    
1359 bh 1573 2003-08-11 Bernhard Herzog <[email protected]>
1360    
1361 bh 1578 * 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 bh 1573 * Thuban/UI/join.py (JoinDialog.OnJoin): Add missing space to
1379     error message
1380    
1381 jan 1569 2003-08-08 Jan-Oliver Wagner <[email protected]>
1382    
1383 jan 1571 * 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 jan 1569 * Thuban/UI/about.py (About.__init__): Reworked the hall of fame. Now
1390     the list corresponds to the "About" web page.
1391    
1392 bh 1567 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 bh 1556 2003-08-07 Bernhard Herzog <[email protected]>
1407    
1408 bh 1565 * 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 bh 1561 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 bh 1560 * 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 bh 1561 used inside of Thuban and the generic Shape class has gone away.
1440 bh 1560
1441 bh 1563 * 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 bh 1561 2003-08-07 Bernhard Herzog <[email protected]>
1446    
1447 bh 1559 * 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 bh 1556 * 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 bh 1553 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 jan 1550 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 bh 1548 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 jan 1545 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 bh 1540 2003-08-01 Bernhard Herzog <[email protected]>
1564    
1565 bh 1543 * 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 bh 1540 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 jonathan 1534 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 frank 1532 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 jonathan 1531 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 jonathan 1529 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 bh 1522 2003-07-30 Bernhard Herzog <[email protected]>
1652    
1653 bh 1524 * 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 bh 1522 * 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 jonathan 1517 2003-07-29 Jonathan Coles <[email protected]>
1669    
1670 jonathan 1519 * 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 jonathan 1517 * 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 bh 1512 2003-07-29 Bernhard Herzog <[email protected]>
1686    
1687 bh 1516 * Thuban/Model/data.py: Remove the now unused import of warnings
1688    
1689     2003-07-29 Bernhard Herzog <[email protected]>
1690    
1691 bh 1514 * 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 bh 1512 * Thuban/Model/transientdb.py: Remove some unnecessary imports
1696    
1697 jonathan 1503 2003-07-29 Jonathan Coles <[email protected]>
1698 jonathan 1506
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 jonathan 1503
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 bh 1500 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 frank 1497 2003-07-29 Frank Koormann <[email protected]>
1722    
1723 frank 1508 * Doc/manual/thuban-manual.xml: Extended section on supported
1724     projections.
1725    
1726     2003-07-29 Frank Koormann <[email protected]>
1727    
1728 frank 1497 * Doc/manual/thuban-manual.xml: gaspell-checked.
1729    
1730 jonathan 1493 2003-07-29 Jonathan Coles <[email protected]>
1731    
1732 jonathan 1495 * 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 jonathan 1493 * 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 bh 1483 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 jan 1767 executable. The #! isn't necessary here since if you absolutely
1774 bh 1483 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 frank 1479 2003-07-24 Frank Koormann <[email protected]>
1783    
1784     * Doc/manual/thuban-manual.xml: Added section on table management.
1785    
1786 bh 1477 2003-07-24 Bernhard Herzog <[email protected]>
1787    
1788     * test/runtests.py (main): Recognize the long "verbose" option
1789     correctly.
1790    
1791 jonathan 1470 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 bh 1451 2003-07-18 Bernhard Herzog <[email protected]>
1832    
1833 bh 1465 * 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 bh 1463 * 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 bh 1461 * Thuban/UI/view.py (MapCanvas.OnLeftDown): Capture the mouse.
1878    
1879     2003-07-18 Bernhard Herzog <[email protected]>
1880    
1881 bh 1459 * 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 bh 1457 * 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 bh 1455 * 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 bh 1453 * 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 bh 1451 * 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 jonathan 1449 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 jonathan 1442 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 jan 1424 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 bh 1418 2003-07-15 Bernhard Herzog <[email protected]>
2061    
2062 bh 1422 * 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 bh 1420 * 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 bh 1418 * 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 jonathan 1416 2003-07-14 Jonathan Coles <[email protected]>
2095    
2096     * test/test_view.py: New. Tests for ViewPort.
2097    
2098 frank 1409 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 frank 1411 * 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 jonathan 1403 2003-07-10 Jonathan Coles <[email protected]>
2108    
2109 jonathan 1406 * 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 jonathan 1403 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 bh 1376 2003-07-08 Bernhard Herzog <[email protected]>
2197    
2198 bh 1382 * 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 bh 1380 * 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 bh 1378 * 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 bh 1376 * 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 bh 1372 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 bh 1365 2003-07-03 Bernhard Herzog <[email protected]>
2274    
2275 bh 1370 * Doc/manual/thuban-manual.xml: Fix the CVS Revision Tag syntax
2276    
2277     2003-07-03 Bernhard Herzog <[email protected]>
2278    
2279 bh 1368 * 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 bh 1365 * 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 jonathan 1360 2003-07-02 Jonathan Coles <[email protected]>
2300 jonathan 1349
2301 jonathan 1360 * Thuban/Model/classgen.py (generate_singletons,
2302     generate_uniform_distribution, generate_quantiles,
2303 jonathan 1363 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 jonathan 1360 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 jonathan 1358 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 jonathan 1349 * 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 frank 1334 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 bh 1329 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 frank 1334
2476 bh 1329 * 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 frank 1325 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 jonathan 1318 2003-06-30 Jonathan Coles <[email protected]>
2487    
2488 jonathan 1349 * 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 jonathan 1320 * Thuban/version.py: SQLite/PySQLite version dependencies
2498     were too high.
2499    
2500     2003-06-30 Jonathan Coles <[email protected]>
2501    
2502 jonathan 1318 * Thuban/version.py: Update version to 0.8.1
2503    
2504     * MANIFEST.in: Added Projections so that default.proj is
2505     included.
2506    
2507 jonathan 1312 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 jonathan 1304 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 jonathan 1299 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 jonathan 1286 2003-06-23 Jonathan Coles <[email protected]>
2564 jonathan 1297
2565     * setup.py: Add Resources/XML to resource list.
2566    
2567     2003-06-23 Jonathan Coles <[email protected]>
2568 jonathan 1286
2569 jonathan 1297 * setup.cfg: Fix copyright dates
2570    
2571     2003-06-23 Jonathan Coles <[email protected]>
2572    
2573 jonathan 1294 * 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 jonathan 1289 * 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 jonathan 1286 * 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 bh 1283 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 bh 1281 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 jonathan 1272 2003-06-20 Jonathan Coles <[email protected]>
2631    
2632 jonathan 1279 * 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 jonathan 1272 * 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 bh 1270 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 jonathan 1265 2003-06-20 Jonathan Coles <[email protected]>
2744    
2745 jonathan 1267 * 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 jonathan 1265 * 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 bh 1256 2003-06-20 Bernhard Herzog <[email protected]>
2769    
2770 bh 1260 * 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 bh 1258 * 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 bh 1256 * 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 jonathan 1254 2003-06-20 Jonathan Coles <[email protected]>
2802    
2803 jonathan 1265 This is mainly about fixing RTbug #1949.
2804    
2805 jonathan 1254 * 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 bh 1244 2003-06-19 Bernhard Herzog <[email protected]>
2825    
2826 bh 1248 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 bh 1246 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 bh 1244 * Doc/thuban.dtd (classification): Correct the content model of
2875     the classification element.
2876     (projection): Add the "name" attribute
2877    
2878 frank 1242 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 jonathan 1235 2003-06-18 Jonathan Coles <[email protected]>
2898    
2899 jonathan 1239 * setup.py: Fix a few problems that occured under Windows.
2900    
2901     2003-06-18 Jonathan Coles <[email protected]>
2902    
2903 jonathan 1235 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 jonathan 1237 * 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 jonathan 1224 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 bh 1220 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 jonathan 1212 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 bh 1208 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 jonathan 1201 2003-06-13 Jonathan Coles <[email protected]>
3057    
3058 jonathan 1203 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 jonathan 1201 * 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 bh 1195 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 jonathan 1169 2003-06-12 Jonathan Coles <[email protected]>
3128 jonathan 1175
3129 jonathan 1193 * 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 jonathan 1191 * Thuban/Lib/fileutil.py: As is done under Windows, create the
3135 jonathan 1193 user directory if it doesn't exist on a posix system.
3136     Fixes RTbug #1815.
3137 jonathan 1191
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 jonathan 1182 * 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 jonathan 1178 * 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 jonathan 1175 * 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 jonathan 1172
3178     * Thuban/Model/xmlreader.py: New. Contains the XMLReader class
3179     that was in load.py
3180 jonathan 1169
3181 jonathan 1172 * 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 jonathan 1169 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 jonathan 1172 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 jonathan 1169 * 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 jan 1156 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 frank 1151 2003-06-11 Frank Koormann <[email protected]>
3272    
3273 frank 1152 * Thuban/Lib/fileutil.py (get_application_dir): Minor stability
3274     update.
3275    
3276     2003-06-11 Frank Koormann <[email protected]>
3277    
3278 frank 1151 * 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 bh 1143 2003-06-10 Bernhard Herzog <[email protected]>
3288    
3289 bh 1147 * 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 bh 1145 * 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 bh 1143 * 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 jan 1141 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 frank 1134 2003-06-05 Frank Koormann <[email protected]>
3350    
3351 frank 1139 * 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 frank 1137 * 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 frank 1134 * 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 bh 1130 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 tkoester 1128 2003-06-03 Thomas Koester <[email protected]>
3402    
3403     * Thuban/Model/classgen.py (GenQuantiles0): New function.
3404    
3405 bh 1120 2003-06-02 Bernhard Herzog <[email protected]>
3406    
3407 bh 1127 * 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 bh 1120 * 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 bh 1112 2003-05-30 Bernhard Herzog <[email protected]>
3440    
3441 bh 1118 * 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 bh 1116 * 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 bh 1114 * 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 bh 1112 * 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 jonathan 1109 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 jan 1097 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 bh 1089 2003-05-28 Bernhard Herzog <[email protected]>
3538    
3539 bh 1095 * 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 bh 1093 * 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 bh 1089 * 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 jan 1087 2003-05-28 Jan-Oliver Wagner <[email protected]>
3561 jan 1085
3562 jan 1087 * 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 jan 1085 * Thuban/UI/mainwindow.py (MainWindow.TableClose, MainWindow.TableShow):
3568     sort the selection list for the dialog.
3569    
3570 frank 1083 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 bh 1079 2003-05-28 Bernhard Herzog <[email protected]>
3578    
3579 bh 1081 * 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 bh 1079 * 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 frank 1077 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 bh 1069 2003-05-27 Bernhard Herzog <[email protected]>
3596    
3597 bh 1075 * 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 bh 1073 * 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 bh 1071 * 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 bh 1069 * 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 frank 1065 2003-05-27 Frank Koormann <[email protected]>
3660    
3661 frank 1067 * 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 frank 1065 * Resources/Bitmaps/legend_icon_layer.xpm: New, icon for legend.
3667    
3668     * Thuban/UI/legend.py (LegendTree.__FillTree): Use "legend_icon_layer"
3669    
3670 jan 1062 2003-05-27 Jan-Oliver Wagner <[email protected]>
3671    
3672 bh 1069 * test/test_menu.py (MenuTest.test): Added test for
3673     Menu.RemoveItem().
3674 jan 1062
3675 bh 1069 * Thuban/UI/menu.py (Menu.RemoveItem): New. Remove an item from
3676     the menu.
3677 jan 1062
3678 frank 1059 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 bh 1053 2003-05-27 Bernhard Herzog <[email protected]>
3698    
3699 bh 1055 * 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 bh 1053 * 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 frank 1051 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 jan 1048 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 frank 1046 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 bh 1038 2003-05-26 Bernhard Herzog <[email protected]>
3742    
3743 bh 1044 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 bh 1038 * 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 bh 1040 * test/test_session.py (TestSessionSimple.test_open_table_file):
3776     New. test case for OpenTableFile
3777    
3778 jan 1033 2003-05-26 Jan-Oliver Wagner <[email protected]>
3779    
3780 jan 1035 * 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 bh 1038 * Thuban/UI/tableview.py (LayerTableFrame.__init__): If there is
3788     already a selection present, update the grid accordingly.
3789 jan 1033
3790     * Thuban/UI/mainwindow.py (MainWindow.TableShow): Make the dialog
3791     resizeable and increase its initial size.
3792    
3793 frank 1030 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 jan 1021 2003-05-23 Jan-Oliver Wagner <[email protected]>
3816    
3817 jan 1024 * Thuban/UI/join.py (JoinDialog.OnJoin): Use _() for strings.
3818     Use QueryTableFrame instead of TableFrame.
3819 jan 1021
3820 jan 1024 * 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 jan 1021 * 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 bh 1017 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 jan 1015 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 frank 1011 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 bh 1006 2003-05-22 Bernhard Herzog <[email protected]>
3872    
3873 bh 1008 * 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 bh 1006 * Thuban/UI/join.py (JoinDialog.OnJoin): Make sure to really call
3880     the wxMessageDialog's Destroy() method.
3881    
3882 frank 1004 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 bh 995 2003-05-22 Bernhard Herzog <[email protected]>
3901    
3902 bh 999 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 bh 997 * 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 bh 995 * 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 tkoester 993 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 frank 992 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 bh 988 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 tkoester 986 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 bh 983 2003-05-22 Bernhard Herzog <[email protected]>
3983    
3984 bh 985 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 bh 983 * 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 frank 981 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 jonathan 972 2003-05-21 Jonathan Coles <[email protected]>
4073 jonathan 971
4074 jonathan 975 * 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 jonathan 971 * 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 bh 958 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 jan 955 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 frank 952 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 jonathan 949 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 frank 924 2003-05-19 Frank Koormann <[email protected]>
4263    
4264 frank 927 * 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 frank 924 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 bh 919 2003-05-16 Bernhard Herzog <[email protected]>
4280    
4281 bh 921 * 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 bh 919 * 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 frank 917 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 bh 908 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 jonathan 906 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 jonathan 897 2003-05-12 Jonathan Coles <[email protected]>
4359    
4360 jonathan 899 * 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 jonathan 897 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 frank 893 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 jonathan 889 2003-05-09 Jonathan Coles <[email protected]>
4388    
4389 jonathan 897 * 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 jonathan 889 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 frank 872 2003-05-09 Frank Koormann <[email protected]>
4483    
4484     * Thuban/UI/scalebar.py (DrawScaleBar): Draw only if interval > 0.0.
4485    
4486 frank 860 2003-05-08 Frank Koormann <[email protected]>
4487    
4488 frank 870 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 frank 867 * Thuban/UI/scalebar.py
4497     (ScaleBar.DrawScalebar): Format string bug fixed.
4498    
4499     2003-05-08 Frank Koormann <[email protected]>
4500    
4501 frank 865 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 frank 860 * 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 frank 857 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 bh 850 2003-05-07 Bernhard Herzog <[email protected]>
4539    
4540 bh 852 * 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 bh 850 * 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 frank 848 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 bh 840 2003-05-06 Bernhard Herzog <[email protected]>
4575    
4576 bh 846 * 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 bh 843 * 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 bh 840 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 jonathan 833 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 bh 826 2003-05-06 Bernhard Herzog <[email protected]>
4699    
4700     * Resources/Projections/defaults.proj: Fix spelling of Mercator
4701    
4702 jonathan 823 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 bh 819 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 jonathan 817 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 bh 809 2003-05-05 Bernhard Herzog <[email protected]>
4801    
4802 bh 811 * 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 bh 809 * 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 jan 807 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 jonathan 793 2003-04-30 Jonathan Coles <[email protected]>
4831    
4832 jonathan 803 * 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 jonathan 793 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 jan 792 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 bh 786 2003-04-30 Bernhard Herzog <[email protected]>
4889    
4890 bh 790 * Thuban/UI/view.py: Fix some typos.
4891    
4892 bh 788 * 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 bh 786 * 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 jonathan 793 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 bh 779 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 jonathan 767 2003-04-29 Jonathan Coles <[email protected]>
4930    
4931 jonathan 769 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 jonathan 776 "true". Addresses RTbug #1025.
4934 jonathan 769
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 jonathan 767 * 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 bh 764 2003-04-29 Bernhard Herzog <[email protected]>
4962    
4963 bh 766 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 bh 764 * 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 jonathan 767 2003-04-29 Jonathan Coles <[email protected]>
5015 jonathan 735
5016 jonathan 762 * 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 jonathan 756 * 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 jonathan 753 * 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 jonathan 748 * 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 jonathan 743 * 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 jonathan 735 * 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 bh 734 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 jonathan 735 2003-04-24 Jonathan Coles <[email protected]>
5138 jonathan 724
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 bh 723 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 jonathan 721 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 jonathan 715 2003-04-23 Jonathan Coles <[email protected]>
5248    
5249 jonathan 720 * 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 jonathan 716 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 jonathan 715 * 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 bh 703 2003-04-22 Bernhard Herzog <[email protected]>
5327    
5328 bh 705 * Thuban/UI/mainwindow.py: Remove some unused imports and global
5329     constants
5330    
5331 bh 703 * Thuban/UI/identifyview.py (IdentifyListCtrl.selected_shape)
5332     (IdentifyGridCtrl.selected_shape): Use table, not shapetable.
5333    
5334 bh 700 2003-04-17 Bernhard Herzog <[email protected]>
5335    
5336 bh 701 * 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 bh 700 * 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 jonathan 688 2003-04-16 Jonathan Coles <[email protected]>
5348    
5349 jonathan 693 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 jonathan 688 * 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 bh 687 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 jonathan 673 2003-04-15 Jonathan Coles <[email protected]>
5411    
5412 jonathan 680 * 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 jonathan 673 * 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 jonathan 674 drawing initialization call to draw_polygon_init()
5438     (MapRenderer.draw_polygon_shape): Use new signature of
5439     draw_polygon_shape.
5440 jonathan 673
5441 jonathan 674 * Thuban/UI/classgen.py (GenUniformPanel): Fix spin control
5442     weirdness by setting the range to (1, maxint).
5443 jonathan 673
5444 jonathan 674 * 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 jonathan 673
5450 jonathan 674 * HOWTO-Release: Filled in missing steps for releasing packages.
5451    
5452 bh 672 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 jonathan 669 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 frank 664 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 jonathan 662 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 jonathan 646 2003-04-11 Jonathan Coles <[email protected]>
5516    
5517 jonathan 662 * 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 jonathan 647 * 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 jonathan 646 * Resources/Bitmaps/close_12.xpm, Resources/Bitmaps/dock_12.xpm,
5556 jonathan 647 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 jonathan 646
5565 jonathan 636 2003-04-10 Jonathan Coles <[email protected]>
5566    
5567 jonathan 644 * Thuban/Model/classification.py: (ClassGroupRange.__init__):
5568     Should pass group to ClassGroup constructor.
5569    
5570     2003-04-10 Jonathan Coles <[email protected]>
5571    
5572 jonathan 636 * 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 jonathan 626 2003-04-09 Jonathan Coles <[email protected]>
5600    
5601 jonathan 634 * 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 jonathan 626 * 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 bh 623 2003-04-07 Bernhard Herzog <[email protected]>
5648    
5649 bh 625 * 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 bh 623 * 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 jonathan 612 2003-04-07 Jonathan Coles <[email protected]>
5675    
5676 jonathan 619 * 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 jonathan 612 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 jonathan 601 2003-04-04 Jonathan Coles <[email protected]>
5728 jonathan 608
5729 jonathan 612 * 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 jonathan 608 * 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 jonathan 603
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 jonathan 601
5755 jonathan 603 * 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 jonathan 601
5791 bh 600 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 bh 591 2003-04-02 Bernhard Herzog <[email protected]>
5816    
5817 bh 595 * 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 bh 593 * Thuban/UI/application.py (ThubanApplication.OpenSession): Make
5822     sure the filename is absolute to avoid problems when saving the
5823     session again
5824    
5825 bh 591 * Thuban/Model/table.py: Remove unnecessary import. Fix a typo.
5826    
5827 jonathan 587 2003-04-01 Jonathan Coles <[email protected]>
5828    
5829 jonathan 589 * Thuban/UI/renderer.py (MapRenderer.draw_point_shape): Check
5830 jonathan 587 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 bh 586 2003-04-01 Bernhard Herzog <[email protected]>
5835    
5836     * test/test_map.py: Don't use from <module> import *
5837    
5838 jonathan 581 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 jonathan 575 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 jonathan 569 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 jonathan 557 2003-03-26 Jonathan Coles <[email protected]>
5896    
5897 jonathan 567 * 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 jonathan 557 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 jonathan 554 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 jonathan 552 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 jonathan 541 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 bh 538 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 jonathan 527 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 jan 523 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 jonathan 514 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 jonathan 490 2003-03-10 Jonathan Coles <[email protected]>
6156    
6157 jonathan 505 * 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 jonathan 499 * 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 jonathan 497 * 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 jonathan 495 * 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 jonathan 490 * 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 jonathan 483 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 jonathan 478 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 bh 477 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 jonathan 459 2003-03-05 Jonathan Coles <[email protected]>
6268    
6269 jonathan 475 * Thuban/common.py: Move FIELDTYPE constants back to table.py.
6270 jonathan 471
6271 jonathan 475 * Thuban/Model/load.py: import FIELDTYPE constants from table.
6272 jonathan 471
6273 jonathan 475 * Thuban/UI/classifier.py: import FIELDTYPE constants from table.
6274 jonathan 471
6275 jonathan 475 * Thuban/Model/table.py: Put FIELDTYPE constants back.
6276 jonathan 471
6277     2003-03-05 Jonathan Coles <[email protected]>
6278    
6279 jonathan 459 * 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 bh 456 2003-03-04 Bernhard Herzog <[email protected]>
6318    
6319 bh 458 * 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 bh 456 * 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 jonathan 448 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 jonathan 445 2003-02-27 Jonathan Coles <[email protected]>
6359 jonathan 434
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 jonathan 445 functions. Fix to create a tuple with a single value instead of
6382     simply returning the value.
6383 jonathan 434
6384     * Thuban/UI/renderer.py: Use new Classification and Group functions.
6385     Use common.py functions.
6386    
6387 jonathan 445 * Thuban/UI/tree.py: Use common.py functions.
6388 jonathan 447
6389     * test/test_classification.py: Use new Classification and Group
6390     classes.
6391 jonathan 434
6392 jonathan 426 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 bh 425 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 frank 423 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 jonathan 408 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 bh 405 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 bh 402 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 jonathan 399 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 jonathan 396 2003-02-10 Jonathan Coles <[email protected]>
6521    
6522 tkoester 403 * Thuban/Model/save.py (Saver.open_element, Saver.close_element):
6523 jonathan 396 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 tkoester 403 Set[Fill|Stroke|StrokeWidth]() methods. Code should call the
6536 jonathan 396 SetDefault*() methods on the layer's classification object.
6537 tkoester 403 (Layer.__init__): Use the new SetDefault*() methods in the
6538 jonathan 396 Classification class.
6539    
6540     * Thuban/Model/load.py (ProcessSession): Use the new ClassData
6541     object instead of a dictionary.
6542    
6543 tkoester 403 * Thuban/UI/classifier.py (ClassRenderer): New class to
6544 jonathan 396 draw the classifications in the dialog box's table.
6545     (Classifier): Modified to use the ClassRenderer class.
6546    
6547 tkoester 403 * Thuban/UI/mainwindow.py (MainWindow): Use the SetDefault*()
6548     methods of the Classification class.
6549 jonathan 396
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 jonathan 387 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 jonathan 380 2003-01-28 Jonathan Coles <[email protected]>
6569    
6570 jonathan 384 * Thuban/UI/classifier.py (Classifier): Resolved merging conflicts.
6571 tkoester 403 Fixed crashing problem on some systems. Dialog box shows
6572 jonathan 380 classification data.
6573    
6574 jonathan 384 * 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 tkoester 403 2003-01-27 Jan-Oliver Wagner <[email protected]>
6585 jan 375
6586 tkoester 403 * Thuban/__init__.py (_): New.
6587 jan 375
6588     * Thuban/Model/classification.py, Thuban/Model/extension.py,
6589     Thuban/Model/layer.py, Thuban/Model/load.py, Thuban/Model/map.py,
6590 tkoester 403 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 jan 375
6597 jonathan 370 2003-01-27 Jonathan Coles <[email protected]>
6598    
6599 tkoester 403 * Thuban/Model/layer.py: Classification initialization calls.
6600 jonathan 370
6601 tkoester 403 * Thuban/Model/classification.py: Created class to encapsulate
6602     a layer classification. Supports specific data points and
6603     ranges.
6604 jonathan 370
6605 tkoester 403 * Thuban/Model/load.py: Added support for loading classification
6606     information.
6607 jonathan 370
6608 tkoester 403 * Thuban/Model/save.py: Added support for saving classification
6609     information.
6610 jonathan 370
6611 tkoester 403 * Thuban/UI/classifier.py: Initial class for a dialog box for
6612     specifying classification information.
6613 jonathan 370
6614 tkoester 403 * Thuban/UI/mainwindows.py: Support for opening the classifier
6615     dialog.
6616 jonathan 370
6617 tkoester 403 * Thuban/UI/renderer.py: Support for drawing a layer with the
6618     classification information.
6619 jonathan 370
6620 tkoester 403 * Data/iceland_sample_class.thuban: iceland_sample with
6621     classification data.
6622 jonathan 370
6623 tkoester 403 * test/test_classification: Tests for the Classification class.
6624 jonathan 370
6625 bh 359 2002-12-09 Bernhard Herzog <[email protected]>
6626    
6627 bh 361 * test/test_command.py: New. Tests for the command classes.
6628    
6629 bh 359 * 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 bh 354 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 frank 352 2002-11-06 Frank Koormann <[email protected]>
6655    
6656 bh 354 * 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 tkoester 403
6660 bh 349 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 bh 344 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 bh 326 2002-09-20 Bernhard Herzog <[email protected]>
6684    
6685 bh 341 * test/test_fileutil.py: New. Test cases for Thuban.Lib.fileutil
6686    
6687     * Thuban/Lib/fileutil.py: Fixup some whitespace and typos
6688    
6689 bh 338 * 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 bh 326 * 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 bh 335 * 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 bh 322 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 bh 317 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 bh 313 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 bh 315 (MainWindow.build_menu): remove an incorrect comment.
6755 bh 313
6756 bh 311 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 bh 308 2002-09-06 Bernhard Herzog <[email protected]>
6766    
6767     * Thuban/UI/mainwindow.py (MainWindow.OnClose): Unsubscribe
6768     VIEW_POSITION
6769    
6770 tkoester 403 2002-09-04 Frank Koormann <[email protected]>
6771 frank 306
6772     * Resources/Bitmaps/fullextent.xpm: Updated Icon (removed "potatoe")
6773    
6774 bh 302 2002-09-02 Bernhard Herzog <[email protected]>
6775    
6776 bh 304 * 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 bh 302 * 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 bh 292 2002-08-30 Bernhard Herzog <[email protected]>
6792    
6793 bh 300 * 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 bh 297 * Thuban/UI/view.py (MapCanvas.__init__, MapCanvas.OnPaint)
6802     (MapCanvas.do_redraw): Get rid of the unused update_region
6803     instance variable
6804    
6805 bh 294 * Thuban/UI/view.py: Add/update some doc-strings.
6806    
6807 bh 292 * 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 bh 287 2002-08-29 Bernhard Herzog <[email protected]>
6814    
6815 bh 291 * Thuban/UI/renderer.py (ScreenRenderer.draw_shape_layer): Handle
6816     arcs with multiple parts.
6817    
6818 bh 289 * Thuban/UI/view.py (ZoomInTool.MouseUp, ZoomOutTool.MouseUp):
6819     Handle degenrate rectangles.
6820    
6821 bh 287 * 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 bh 285 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 bh 278 2002-08-26 Bernhard Herzog <[email protected]>
6833    
6834 bh 282 * 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 bh 278 * 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 bh 280 (LayerTableGrid.select_shape): Remove a debug print
6844 bh 278
6845     * Thuban/UI/mainwindow.py (MainWindow.LayerShowTable): Use the
6846     LayerTableFrame
6847    
6848 bh 277 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 bh 269 2002-08-22 Bernhard Herzog <[email protected]>
6854    
6855 bh 275 * Thuban/Model/table.py (Table.write_record): New method to write
6856     records.
6857 tkoester 403 (Table.__init__): Open the DBF file for writing too.
6858 bh 275
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 bh 271 * 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 bh 269 * 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 bh 266 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 tkoester 403 2002-08-16 Jan-Oliver Wagner <[email protected]>
6896 jan 265
6897     * Thuban/UI/mainwindow.py: menu item 'show session tree' now disable if
6898     tree window already open
6899    
6900 bh 259 2002-08-15 Bernhard Herzog <[email protected]>
6901    
6902 bh 263 * 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 bh 259 * 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 bh 254 2002-08-14 Bernhard Herzog <[email protected]>
6914    
6915 bh 256 * 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 bh 254 * 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 bh 252 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 bh 247 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 bh 238 2002-07-24 Bernhard Herzog <[email protected]>
6974    
6975 bh 243 * 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 bh 238 * Thuban/UI/mainwindow.py (MainWindow.__init__): Turn the initial
6994     window size into a parameter.
6995    
6996 bh 235 2002-07-23 Bernhard Herzog <[email protected]>
6997    
6998 bh 237 * Thuban/UI/menu.py (Menu.item_index): Also search for menus not
6999     just commands.
7000    
7001 bh 235 * 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 bh 230 2002-07-19 Bernhard Herzog <[email protected]>
7011    
7012 bh 234 * 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 tkoester 403 (SessionTreeCtrl.unsubscribe_all, SessionTreeCtrl.session_changed):
7024 bh 234 Only have to (un)subscribe CHANGED
7025    
7026     * Thuban/Model/map.py (Map.TreeInfo): Deal better with empty maps.
7027    
7028 bh 230 * 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 bh 225 2002-07-18 Bernhard Herzog <[email protected]>
7033    
7034 bh 228 * 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 bh 225 * 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 bh 217 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 tkoester 403 Thuban/Model/session.py (Session.TreeInfo):
7085 bh 217 Add TreeInfo methods to implement the new tree view update scheme
7086    
7087 bh 216 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 bh 213 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 bh 205 2002-07-09 Bernhard Herzog <[email protected]>
7112    
7113 bh 210 * setup.py: In the setup call, use the thuban homepage as the
7114     value of the url parameter.
7115    
7116 bh 208 * 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 bh 207 * 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 bh 205 * 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 bh 202 2002-07-08 Bernhard Herzog <[email protected]>
7144    
7145 bh 205 * 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 bh 202 * 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 tkoester 403 2002-06-20 Jan-Oliver Wagner <[email protected]>
7166 jan 199
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 bh 194 2002-05-29 Bernhard Herzog <[email protected]>
7176    
7177     * Thuban/UI/mainwindow.py (MainWindow.bind_command_events): Bind
7178 bh 202 the events for a command.
7179 bh 194 (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 bh 190 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 bh 192 * 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 bh 184 2002-05-23 Bernhard Herzog <[email protected]>
7207    
7208 bh 186 * Thuban/UI/mainwindow.py (MainWindow.__init__): Fix spelling of
7209     layer_outline_color. Fix it in the definition of the command too.
7210    
7211 bh 184 * Thuban/UI/command.py (Command): Fix typo in doc string
7212    
7213 bh 182 2002-05-22 Bernhard Herzog <[email protected]>
7214    
7215     * Thuban/UI/mainwindow.py (MainWindow.RunMessageBox): Fix a typo
7216     in the docstring
7217    
7218 bh 175 2002-05-15 Bernhard Herzog <[email protected]>
7219    
7220 bh 180 * 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 bh 175 * 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 bh 172 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 bh 165 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 bh 163 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 bh 146 2002-05-07 Bernhard Herzog <[email protected]>
7270    
7271 bh 154 * Data/iceland_sample.session, Data/iceland_sample.thuban: Rename
7272     the file to have a .thuban extension.
7273    
7274 bh 152 * 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 bh 146 * 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 bh 129 2002-05-03 Bernhard Herzog <[email protected]>
7338    
7339 bh 131 * Thuban/UI/mainwindow.py (MainWindow.SaveSessionAs,
7340     MainWindow.OpenSession): Change the file extension of the session
7341     files to .thuban
7342    
7343 bh 129 * Thuban/Model/session.py (Session.AddMap, forwarded_channels):
7344     Move the map channels to be forwarded by the session into the
7345 bh 146 class constant with forwarded_channels. Also add
7346     LAYER_PROJECTION_CHANGED and LAYER_VISIBILITY_CHANGED to
7347     forwarded_channels
7348 bh 129
7349     * Thuban/Model/base.py (Modifiable.changed): Fix doc-string (a
7350     typo and some rewording).
7351    
7352 bh 126 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 bh 124 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 tkoester 403 2002-04-26 Frank Koormann <[email protected]>
7395 frank 120
7396     * Thuban/UI/mainwindow.py: AddLayer, Dialog title s/session/data
7397    
7398 tkoester 403 2002-04-24 Frank Koormann <[email protected]>
7399    
7400 frank 118 * Resources/Bitmaps/identify.xpm: shadow added
7401    
7402     * Resources/Bitmaps/fullextent.xpm: new
7403 jan 116
7404 tkoester 403 2002-04-22 Jan-Oliver Wagner <[email protected]>
7405 jan 116
7406 tkoester 403 * Thuban/UI/tree.py (update_tree): added test for None on map bounding
7407     box
7408 jan 114
7409 tkoester 403 2002-04-21 Jan-Oliver Wagner <[email protected]>
7410    
7411 jan 114 * 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 tkoester 403 icon; added map_full_extend as tool
7417 jan 114
7418 tkoester 403 2002-04-19 Jan-Oliver Wagner <[email protected]>
7419 jan 107
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 bh 100 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 bh 89 2002-04-04 Bernhard Herzog <[email protected]>
7451    
7452 bh 91 * setup.py (thuban_bdist_rpm.initialize_options): Use
7453     initialize_options to create the scripts for the rpm.
7454    
7455 bh 89 * extensions/pyprojection/setup.py (PROJ4_PREFIX): Just use /
7456    
7457 bh 85 2002-04-03 Bernhard Herzog <[email protected]>
7458    
7459 bh 87 * setup.py: Increment version to 0.1.1
7460    
7461 bh 85 * 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 bh 83 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 bh 81 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 bh 72 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 bh 71 2002-01-14 Bernhard Herzog <[email protected]>
7508    
7509     * setup.py (data_dist.make_distribution): Fix some typos
7510    
7511 bh 70 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 bh 64 2001-09-14 Bernhard Herzog <[email protected]>
7522    
7523 bh 70 * Thuban/UI/identifyview.py (IdentifyListCtrl.selected_shape):
7524     Handle the case of no layer (i.e. layer is None) properly.
7525    
7526 tkoester 403 * Thuban/UI/proj4dialog.py (UTMDialog.__init__, Proj4Dialog.__init__):
7527 bh 70 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 bh 64 * 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 bh 59 2001-09-13 Bernhard Herzog <[email protected]>
7539    
7540 bh 64 * Thuban/UI/tree.py (SessionTreeCtrl.OnSelChanged): Make sure to
7541     deselect the layer if no layer is selected
7542    
7543 bh 59 * Thuban/UI/view.py (MapCanvas.OnPaint): Only delay drawing to
7544     idle time when there actually is something to draw. If there's
7545     nothing to draw simply clear the window
7546     (MapCanvas.do_redraw): Call dc.EndDrawing and add some comments.
7547     (MapCanvas.SetMap): force a redraw in all cases because
7548     FitMapToWindow doesn't always do it.
7549     (MapCanvas.ZoomFactor): Add an optional parameter, center, to
7550     specify the point to move into the center of the window
7551     (ZoomOutTool.MouseUp, ZoomInTool.MouseUp): If the mouse wasn't
7552     dragged, zoon in/out by a factor of 2
7553 bh 64 (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 bh 59
7558     * Thuban/Model/session.py (create_empty_session): Unset the
7559     modified bit before returning it
7560    
7561     * Thuban/UI/mainwindow.py (MainWindow.NewSession): Use
7562     create_empty_session session to create the new, empty session.
7563    
7564     * Thuban/UI/mainwindow.py (MainWindow.__init__): Set the size of
7565     the tool bitmaps.
7566     (MainWindow.OnClose, MainWindow.save_modified_session): Separate
7567     the code that asks whether the session should be saved into the
7568     new method save_modified_session.
7569     (MainWindow.OpenSession, MainWindow.NewSession): Use the new
7570     method to save modified session here too.
7571    
7572 bh 55 2001-09-11 Bernhard Herzog <[email protected]>
7573    
7574     * setup.py (InnoIconItem): fix typo
7575    
7576     (thuban_bdist_inno.run):
7577     (bdist_inno.run): Move the decision not to create symlinks on
7578     non-nt platforms to thuban_bdist_inno and do it unconditinally
7579     since we never want to create the symlinks here
7580    
7581 bh 48 2001-09-10 Bernhard Herzog <[email protected]>
7582    
7583 bh 53 * Thuban/UI/mainwindow.py (MainWindow.IdentifyTool): Popup the
7584     identify view immediately
7585    
7586     * Thuban/UI/controls.py: New file with two classes RecordListCtrl
7587     and SelectableRecordListCtrl that implement the code shared by the
7588     identify view and the label dialog
7589    
7590     * Thuban/UI/identifyview.py (IdentifyListCtrl): Derive from the
7591     new class RecordListCtrl
7592    
7593     * Thuban/UI/labeldialog.py (LabelDialog.OnOK): Check whether the
7594     return value of GetValue is None instead of using it as a boolean
7595     directly so that Zero numbers are handled properly.
7596     (LabelListCtrl): Derive from the new class
7597     SelectableRecordListCtrl
7598    
7599 bh 48 * Thuban/UI/proj4dialog.py (Proj4Dialog.__init__):
7600     (Proj4Dialog.dialogLayout): Make the window resizable and set the
7601     size of the text control explicitly to make the sizers work on
7602     both Windows and X.
7603    
7604 bh 44 2001-09-07 Bernhard Herzog <[email protected]>
7605    
7606     * Thuban/UI/view.py (MapCanvas.find_shape_at):Add a new parameter
7607     that can limit the search to the currently selected layer.
7608     (MapCanvas.SelectShapeAt): Make sure that the currently selected
7609     layer stays selected even when no shape is found
7610 bh 46 (MapCanvas.FitRectToWindow): If the rect has zero with or zero
7611     height do nothing (avoids zero division errors)
7612 bh 44
7613 bh 32 2001-09-06 Bernhard Herzog <[email protected]>
7614    
7615 bh 42 * Thuban/UI/tree.py (SessionTreeCtrl, SessionTreeView.__init__):
7616     Correct the spelling of SessionTreeCtrl. dabbrev is too damn
7617     convenient :-)
7618     (SessionTreeCtrl.__init__, SessionTreeCtrl.update_tree): Introduce
7619     a new instvar layer_to_item to map layers to tree items
7620     (SessionTreeCtrl.layer_selected): Select the appropriate tree item
7621     to match the current selection in the interactor
7622    
7623 bh 40 * Thuban/UI/interactor.py (Interactor.SelectedLayer):
7624     (Interactor.HasSelectedLayer): New methods to query the current
7625     selection
7626    
7627     * Thuban/UI/mainwindow.py (MainWindow.current_layer):
7628     (MainWindow.has_selected_layer): Simply call the appropriate
7629     interactor method
7630    
7631     * Thuban/UI/mainwindow.py (MainWindow.__init__):
7632     (MainWindow.LayerShowTable):
7633     (MainWindow.identify_view_on_demand): Store the interactor in an
7634     instvar and use that reference instead of going through main.app
7635    
7636 tkoester 403 * Thuban/UI/mainwindow.py (MainWindow.ShowSessionTree):
7637     * Thuban/UI/application.py (ThubanApplication.OnInit):
7638 bh 40 * Thuban/UI/main.py (main): Create the session tree view in main
7639     with the new mainwindow method ShowSessionTree and not directly
7640     the application's OnInit method
7641    
7642     * Thuban/UI/tree.py (myTreeCtrlPanel):
7643     (SessioinTreeCtrl): Rename to SessioinTreeCtrl and turn it into a
7644     TreeCtrl isntead of a panel. This affects most method since we now
7645     refer to self instead of self.tree
7646     (SessionTreeView): New class implementing a non-modal dialog
7647     showing the session tree.
7648    
7649 bh 35 * Thuban/UI/mainwindow.py (MainWindow.LayerShowTable): Pass the
7650     layer to the tableview dialog.
7651    
7652     * Thuban/UI/tableview.py: Add some doc-strings
7653 tkoester 403 (TableGrid):
7654 bh 35 (TableGrid.OnRangeSelect):
7655     (TableGrid.OnSelectCell):
7656     (TableFrame.__init__):
7657     (TableFrame.row_selected):
7658     Selecting rows in the grid view now updates the selected shapes
7659     through the TableFrame. To achieve this we derive TableGrid from
7660     Publisher and introduce the message type ROW_SELECTED which the
7661     TableFrame subscribes to and which is issued by OnRangeSelect and
7662     OnSelectCell
7663    
7664     (DataTable.SelectRow): Removed because it's no longer needed in
7665     the row/shape selection scheme
7666    
7667 bh 32 * Thuban/UI/dialogs.py: New file implementing common classes for
7668     dialogs
7669    
7670     * Thuban/UI/tableview.py (TableGrid.__init__): Don't subscribe to
7671     the SELECTED_SHAPE message anymore. This is now handled by the
7672     parent.
7673     (TableGrid.select_shape): Only update the selection if the shape
7674     is not None.
7675     (TableFrame): Inherit from the new NonModalDialog class.
7676     (TableFrame.__init__, TableFrame.select_shape): Handle the
7677     SELECT_SHAPE message.
7678     (TableFrame.OnClose): Extend the inherited method to unsubscribe
7679     SELECT_SHAPE
7680    
7681     * Thuban/UI/mainwindow.py (MainWindow.init_dialogs):
7682     (MainWindow.add_dialog):
7683     (MainWindow.dialog_open):
7684     (MainWindow.remove_dialog):
7685     (MainWindow.get_open_dialog): New methods to maintain a dictionary
7686     of opened non-modal dialogs.
7687    
7688     (MainWindow.__init__): Initialize the new non-modal dictionary
7689     management code
7690     (MainWindow.LayerShowTable): maintain separate dialogs for each
7691     table using the non-modal dialog management code to only open a
7692     view once for each table.
7693    
7694     (MainWindow.IdentifyTool):
7695     (MainWindow.__init__):
7696     (MainWindow.identify_view_on_demand): Don't open the identify view
7697     in IdentifyTool anymore. This will be done automatically by the
7698     new method identify_view_on_demand which handles the
7699     SELECTED_SHAPE message so that the identify view will be opened on
7700     demand
7701    
7702     * Thuban/UI/identifyview.py (IdentifyListCtrl.__init__): Remove
7703     the interactor argument. The SELECTED_SHAPE message is now handled
7704     by the parent.
7705     (IdentifyView.__init__): Add the interactor argument so that we
7706     can handle the SELECTED_SHAPE message here
7707     (IdentifyView.selected_shape): New method to handle the
7708     SELECTED_SHAPE messages
7709    
7710     * Thuban/UI/identifyview.py (IdentifyView): Derive from the new
7711     NonModalDialog class
7712     (IdentifyView.OnClose): Extend the inherited version to
7713     unsubscribe SELECT_SHAPE
7714    
7715     * Thuban/Model/session.py (Session.UnsetModified): Remove debug prints
7716    
7717 bh 26 2001-09-05 Bernhard Herzog <[email protected]>
7718    
7719     * Thuban/UI/view.py (MapCanvas.__init__): New argument, interactor.
7720 tkoester 403
7721 bh 26 * Thuban/UI/mainwindow.py (MainWindow.__init__): New argument
7722     interactor to pass through to the MapCanvas
7723 tkoester 403
7724 bh 26 * Thuban/UI/application.py (ThubanApplication.OnInit): Use the new
7725     argument to the MainWindow constructor to get rid of the ugly hack
7726     that made main.app available early just so that the mapcanvas
7727     could access the interactor object.
7728    
7729 bh 19 2001-09-04 Bernhard Herzog <[email protected]>
7730    
7731 bh 22 * Thuban/UI/mainwindow.py (MainWindow.RunMessageBox): New method
7732     that runs a modal message box
7733     (MainWindow.OnClose): Use the new method
7734     (MainWindow.RemoveLayer): Just do nothing in case no layer is
7735     selected. The command should be grayed out anyway, so there's no
7736     need to pop up a message box.
7737     (MainWindow.AddLayer): Pop up a message box with an error message
7738     if the shape file can't be opened
7739    
7740     * Thuban/Model/layer.py (Layer.__init__): Open the shapefile
7741     immediately. This will cause an exception in case the file can't
7742     be opened and we can display an appropriate message.
7743    
7744 bh 19 * MANIFEST.in: Add extensions/pyprojection/LICENSE
7745    
7746     * setup.py (thuban_bdist_rpm): New class implementing a Thuban
7747     specific bdist_rpm command.
7748    
7749     * Thuban/UI/main.py: Catch ImportError exceptions when importing
7750     the locale module because it may not be available on some
7751     installations.
7752    
7753     * extensions/pyprojection/LICENSE: Copy of the license text in
7754     Projection.i. Having it in a separate file makes it easier to
7755     refer to license text in e.g. RPMs
7756    
7757 bh 18 2001-09-03 Bernhard Herzog <[email protected]>
7758    
7759 bh 19 * setup.py: use wx-config instead of wxgtk-config because it's
7760     more generic
7761    
7762     * setup.py (ThubanInstall.get_outputs): Add the symlink in
7763     <prefix>/bin to the outputs
7764     (ThubanInstall.link_file): New method to link files. We need this
7765     because the standard copy_files refuses to link non-existing
7766     files.
7767     (ThubanInstall.run): Remove the leading install root from the
7768     script filename if an install root was specified and use the new
7769     link_file method
7770 tkoester 403
7771 bh 18 * Thuban/UI/mainwindow.py (MainWindow.AddLayer): Fit the map to
7772     the window when the first layer is added to the map.
7773    
7774     * setup.py (ThubanInstall.run): Honor the build root (self.root)
7775     when linking thuban.py to <prefix>/bin
7776    
7777 bh 16 2001-08-31 Bernhard Herzog <[email protected]>
7778    
7779     * setup.py: In the setup call, the install parameters shouldn't
7780     have trailing slashes because distutils on non-posix platforms
7781     doesn't like that. The same applies to other directories like
7782     "Resources/Bitmaps"
7783    
7784     In the configuration section for nt, move the wxWindows directory
7785     optins into the part clearly marked as editable.
7786    
7787     (InstallLocal.initialize_options):
7788     (InstallLocal.user_options): remove the currently unused debug
7789     flag
7790     (thuban_build_py.find_all_modules): Add this method so that it
7791     works for our case of having packages and modules in one
7792     distribution as well.
7793     (ThubanInstall.initialize_options):
7794     (ThubanInstall.finalize_options):
7795     (ThubanInstall.user_options):
7796     (ThubanInstall.boolean_options): Add new options, do-symlink and
7797     extra files. Since these are the first ThubanInstall specific
7798     options, override user_options and boolean_options
7799     (ThubanInstall.run): Honor the new do-symlink and extra-files
7800     options.
7801     (ThubanInstall.get_outputs): Add to override the base-class's
7802     version and add the extra-files to the outputs
7803     (bdist_inno): New class for windows distributions with Inno Setup
7804     (InnoIconItem): Helper class for bdist_inno
7805     (thuban_bdist_inno): Thuban specific version of bdist_inno. Added
7806     this together with the appropriate parameters, to the setup call.
7807 tkoester 403
7808 bh 16 * setup.cfg (bdist_inno): added new section for the inno setup
7809     installer
7810    
7811     * Thuban/UI/tree.py (myTreeCtrlPanel.__init__): New inst var
7812     changing_selection to avoid recursive selection events when
7813     modifying the selection in response to a selection event.
7814     (myTreeCtrlPanel.normalize_selection): Set the new inst var when
7815     changing the tree's selection.
7816     (myTreeCtrlPanel.OnSelChanged): Only normalize the selection when
7817     we're not being called indirectly from normalize_selection.
7818    
7819     * Thuban/UI/mainwindow.py (MainWindow.update_command_ui): Call
7820     event.Check only if the command is actuall checkable.
7821     (MainWindow.__init__): Call the toolbar's Realize method to make
7822     sure that the items are actually shown
7823    
7824 bh 7 2001-08-28 Bernhard Herzog <[email protected]>
7825    
7826 bh 9 * setup.py: Fix some doc strings
7827    
7828 bh 7 * ChangeLog: started
7829    

Properties

Name Value
svn:eol-style native
svn:keywords Author Date Id Revision

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26