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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1847 - (hide annotations)
Tue Oct 21 10:50:07 2003 UTC (21 years, 4 months ago) by bh
Original Path: trunk/thuban/ChangeLog
File size: 305184 byte(s)
update ChangeLog

1 bh 1840 2003-10-21 Bernhard Herzog <[email protected]>
2    
3 bh 1847 Add EPSG projection handling to .thuban files
4    
5     * test/test_save.py (SaveSessionTest.dtd)
6     (SaveSessionTest.testEmptySession)
7     (SaveSessionTest.testLayerProjection)
8     (SaveSessionTest.testRasterLayer)
9     (SaveSessionTest.testClassifiedLayer)
10     (SaveSessionTest.test_dbf_table)
11     (SaveSessionTest.test_joined_table)
12     (SaveSessionTest.test_save_postgis): Update to 1.0-dev namespace
13     (SaveSessionTest.testSingleLayer): Update to 1.0-dev namespace and
14     use a and epsg projection to test saving them
15    
16     * test/test_load.py (LoadSessionTest.dtd): Update to 1.0-dev
17     namespace
18     (TestLayerVisibility.file_contents, TestLabels.file_contents)
19     (TestLayerProjection.file_contents)
20     (TestRasterLayer.file_contents, TestJoinedTable.file_contents)
21     (TestPostGISLayer.file_contents)
22     (TestPostGISLayerPassword.file_contents)
23     (TestLoadError.file_contents, TestLoadError.test): Update to use
24     1.0-dev namespace
25     (TestSingleLayer.file_contents, TestSingleLayer.test): Update to
26     use 1.0-dev namespace and use an EPSG projection to test whether
27     loading it works
28    
29     * test/test_load_0_9.py: New. Effectively a copy of test_load.py
30     as of Thuban 0.9. These are now tests to determine whether Thuban
31     can still read files generated by Thuban 0.9
32    
33     * Thuban/Model/save.py (SessionSaver.write)
34     (SessionSaver.write_session): Use the 1.0 dtd and 1.0-dev
35     namespace
36     (SessionSaver.write_projection): Write the projection's epsg
37     attribute
38    
39     * Thuban/Model/load.py (SessionLoader.__init__): Also accept the
40     thuban-1.0-dev.dtd namespace
41     (SessionLoader.check_attrs): Allow a callable object as conversion
42     too
43     (SessionLoader.start_projection, SessionLoader.end_projection)
44     (SessionLoader.start_parameter): Handle the epsg attribute and
45     rename a few instance variables to lower case
46    
47     * Resources/XML/thuban-1.0.dtd: New. Only difference to
48     thuban-0.9.dtd is the epsg attribute for projections.
49    
50     2003-10-21 Bernhard Herzog <[email protected]>
51    
52 bh 1840 * test/runtests.py (main): Let the user specify which tests to run
53     on the command line
54    
55     * test/support.py (ThubanTestResult.getDescription): Override to
56     give a better short description. The description can be used as a
57     parameter to run_tests to run that particular test in isolation.
58    
59 frank 1837 2003-10-21 Frank Koormann <[email protected]>
60    
61     Popup menu for legend. Scheduled for the 1.2 release this was too
62     simple to implement: The popup menu is bound to the legend tree, while
63     the events are hanlded by its anchestor, the legend panel. This
64     allows reuse of all the event handlers already implemented for the
65     legend toolbar buttons.
66    
67     * Thuban/UI/legend.py (LegendPanel.__init__): EVT_MENU macros
68     to add handlers for the events issued by the popup menu.
69     (LegendPanel._OnToggleVisibility): Handler for toggling layer
70     visibility event
71     (LegendPanel._OnProjection): Handler for layer projection event.
72     (LegendTree.__init__): Added EVT_TREE_ITEM_RIGHT_CLICK
73     (LegendTree._OnRightClick): Event handler for right click, select item
74     and pop up menu.
75     (LegendTree.ToggleVisibility): Toggle layer visibility
76     (LegendTree.LayerProjection): Raise layer projection dialog for
77     current layer.
78    
79 bh 1836 2003-10-21 Bernhard Herzog <[email protected]>
80    
81     * Resources/Projections/defaults.proj: Use correct DOCTYPE
82     declaration. The top-level element is projectionlist not projfile
83    
84 bh 1834 2003-10-20 Bernhard Herzog <[email protected]>
85    
86     * Thuban/UI/projdialog.py (ProjFrame.write_proj_file): New. helper
87     method to write a projfile and display a busy cursor and error
88     dialogs.
89     (ProjFrame._OnSave, ProjFrame._OnAddToList, ProjFrame._OnImport)
90     (ProjFrame._OnExport, ProjFrame._OnRemove): Use write_proj_file
91     (ProjFrame.__FillAvailList): Translate "<None>" too and display a
92     busy cursor while loading the user and system prj files.
93    
94 bh 1832 2003-10-16 Bernhard Herzog <[email protected]>
95    
96     * Thuban/Model/resource.py (projfile_cache): Introduce a cache for
97     ProjFile objects
98     (clear_proj_file_cache): New function to clear the cache. Mainly
99     useful for use by the test suite
100     (read_proj_file): Use the cache.
101    
102     * test/test_proj.py (TestProjFile): Clarify the doc-string
103     (ProjFileReadTests): Update doc-string
104     (ProjFileReadTests.test_get_system_proj_file): Check whether the
105     system proj files is cached.
106     (ProjFileLoadTestCase): New base class for the proj file tests
107     derived from support.FileLoadTestCase to provide some common
108     behavior.
109     (TestLoadingProjFile)
110     (TestLoadingProjFileWithEmptyProjectionlist.file_contents)
111     (TestProjFileWithInvalidParameters.file_contents): Derive from
112     ProjFileLoadTestCase
113     (TestLoadingProjFile.test_caching): New. Test whether the cache
114     works
115    
116 silke 1829 2003-10-16 Silke Reimer <[email protected]>
117    
118     * debian/*: New directory with configuration files for building a thuban
119     deb-package.
120    
121 bh 1822 2003-10-14 Bernhard Herzog <[email protected]>
122    
123 bh 1828 * test/test_proj.py: Execute support.run_tests when run as
124     __main__ so that missing unsubscribes are detected
125     (TestProjFile.tearDown): Destroy the proj_file properly
126    
127     2003-10-14 Bernhard Herzog <[email protected]>
128    
129 bh 1826 * Thuban/Model/messages.py (PROJECTION_ADDED)
130     (PROJECTION_REPLACED, PROJECTION_REMOVED): New message types for
131     the ProjFile objects
132    
133     * Thuban/Model/proj.py (ProjFile): Derive from Publisher so we can
134     easily send messages when the projections change
135     (ProjFile.Add, ProjFile.Remove, ProjFile.Replace): Issue messages
136     when the change was successful
137    
138     * test/test_proj.py (TestProjFile.setUp): Subscribe to some of the
139     proj file messages
140     (TestProjFile.test_add_remove)
141     (TestProjFile.test_remove_non_existing)
142     (TestProjFile.test_replace)
143     (TestProjFile.test_replace_non_existing): Test whether the right
144     messages are sent
145    
146     2003-10-14 Bernhard Herzog <[email protected]>
147    
148 bh 1822 * test/test_proj.py (TestProjFile.test): Refactor into several
149     tests
150     (TestProjFile.test_add_remove)
151     (TestProjFile.test_remove_non_existing)
152     (TestProjFile.test_replace)
153     (TestProjFile.test_replace_non_existing): Some of the new
154     individual test cases
155     (TestProjFileSimple): New class for the rest of the test cases
156     that came out of the refactoring
157     (ProjFileTest): Derive from xmlsupport.ValidationTest so that the
158     derived classes don't have to
159    
160 bh 1812 2003-10-13 Bernhard Herzog <[email protected]>
161    
162 bh 1820 Add an optional EPSG code to the projection objects and extend the
163     .proj file format accordingly.
164    
165     * Resources/XML/projfile.dtd (element projection): Add epsg
166     attribute
167    
168     * Thuban/Model/proj.py (Projection.__init__): New parameter and
169     instance variable epsg. Update doc-string
170     (Projection.EPSGCode, Projection.Label): New methods to provide
171     access to EPSG code and a label for use in dialogs
172    
173     * Thuban/Model/resource.py (ProjFileReader.start_projection)
174     (ProjFileReader.end_projection, ProjFileSaver.write_projfile):
175     Handle the epsg code attribute when reading or writing proj files
176    
177     * Thuban/UI/projdialog.py (ProjFrame._OnSave)
178     (ProjFrame._OnAddToList, ProjFrame.__DoOnProjAvail)
179     (ProjFrame.__FillAvailList): Use the projection's Label method to
180     get the string for the list box
181    
182     * test/test_proj.py (TestProjection.test_label)
183     (TestProjection.test_label_epsg)
184     (TestProjection.test_epsgcode_for_non_epsg_projection)
185     (TestProjection.test_epsgcode_for_real_epsg_projection): New tests
186     for the label and EPSGCode methods
187     (WriteProjFileTests.doTestWrite, WriteProjFileTests.test_write)
188     (WriteProjFileTests.test_write_empty_file): Create the ProjFile
189     objects in the test cases and put the expected contents into the
190     test case methods too. Update doTestWrite accordingly
191     (TestLoadingProjFile)
192     (TestLoadingProjFileWithEmptyProjectionlist): New classes with the
193     read tests from TestProjFile.
194     (TestProjFile.doTestRead, TestProjFile.testRead): Removed. These
195     tests are now in the new classes.
196     (sample_projfile, sample_projfile_data)
197     (sample_projfile2, sample_projfile_data2): Removed. Not used
198     anymore.
199     (TestProjFile.test_read_unreadable_file): No need to reset the
200     permissions at the end anymore since we use a unique filename
201    
202     2003-10-13 Bernhard Herzog <[email protected]>
203    
204 bh 1814 * test/test_proj.py: Some more refactoring of the test cases
205     (ProjFileTest): New base class for the proj file tests.
206     (TestProjFile): Derive from ProjFileTest
207     (TestProjFile.test_read_unreadable_file)
208     (TestProjFile.test_read_empty_file, TestProjFile.doTestRead): Use
209     the new filename method to get a unique filename
210     (TestProjFile.doTestWrite, TestProjFile.testWrite): Removed.
211     (WriteProjFileTests): New class for proj file write tests.
212     Contains the write test that were in TestProjFile originally.
213    
214     2003-10-13 Bernhard Herzog <[email protected]>
215    
216 bh 1812 * test/test_proj.py (TestProjFile.testRead)
217     (TestProjFile.test_read_non_existing_file)
218     (TestProjFile.test_read_unreadable_file)
219     (TestProjFile.test_read_empty_file): Split into several methods.
220    
221 bh 1805 2003-10-10 Bernhard Herzog <[email protected]>
222    
223 bh 1810 * Thuban/UI/sizers.py: New file with custom sizers.
224    
225     * Thuban/UI/projdialog.py (ProjFrame.build_dialog): Instantiate
226     all projection type specific panels and put them into a
227     NotebookLikeSizer. This way the dialog doesn't change its size
228     when a different projection is selected
229     (ProjFrame.__init__): Rename projection_panels
230     projection_panel_defs and reuse projection_panels for a list of
231     the instantiated panels.
232     (ProjFrame._show_proj_panel, ProjFrame.__DoOnProjAvail)
233     (ProjFrame.__DoOnProjChoice): Changes due to the new handling of
234     the panels
235     (UnknownProjPanel._DoLayout): Place the newlines in the message
236     differently to make the panel narrower.
237     (TMPanel._DoLayout): Layout the parameters in one column.
238    
239     2003-10-10 Bernhard Herzog <[email protected]>
240    
241 bh 1807 * Thuban/UI/projdialog.py (ProjFrame.build_dialog): New method
242     that contains all the setup for the dialog's widgets, layout and
243     event handling.
244     (__): Call build_dialog to build the dialog.
245     (ProjFrame.__set_properties, ProjFrame.__do_layout): Removed.
246     Their functionality is now in build_dialog
247     (ProjFrame.__VerifyButtons, ProjFrame.__VerifyButtons)
248     (ProjFrame.__DoOnProjAvail, ProjFrame.__DoOnProjAvail)
249     (ProjFrame.__DoOnProjChoice): Small updates due to slightly
250     different widget names and hierarchy introduced with build_dialog.
251    
252     2003-10-10 Bernhard Herzog <[email protected]>
253    
254 bh 1805 * README: Fix typo.
255    
256 bh 1803 2003-10-09 Bernhard Herzog <[email protected]>
257    
258     * Thuban/Model/proj.py (ProjFile.Add): Do not check whether the
259     projection is already in the list. This is *a lot* faster when
260     loading files with hundreds of projections since it saves a linear
261     search. OTOH this will allow adding the same projection to the
262     user.proj file multiple times in the projection dialog but we'll
263     deal with that later
264    
265 jan 1801 2003-10-09 Jan-Oliver Wagner <[email protected]>
266    
267     * devtools: New. Directory for developer tools that are not intended
268     for the regular user.
269    
270     * devtools/create_epsg.py: New. Convert the epsg file of proj into
271     a python .proj file.
272    
273 bh 1799 2003-10-09 Bernhard Herzog <[email protected]>
274    
275     * test/test_proj.py
276     (TestProjection.test_get_parameter_without_equals_sign): New. Test
277     whether GetParameter handles parameters without "=" sign correctly
278    
279     * Thuban/Model/proj.py (Projection.GetParameter): Handle
280     parameters that do not contain a "=". Update the doc-string
281    
282 bh 1794 2003-10-08 Bernhard Herzog <[email protected]>
283    
284 bh 1796 * Thuban/UI/projdialog.py (ProjFrame.__set_properties): Remove the
285     length limit on the projname text control
286    
287     2003-10-08 Bernhard Herzog <[email protected]>
288    
289 bh 1794 * test/test_proj.py (TestProjection.test_get_projection_units_geo)
290     (TestProjection.test_get_projection_units_normal): New. Tests for
291     the Projection.GetProjectedUnits method
292    
293 jan 1792 2003-10-08 Jan-Oliver Wagner <[email protected]>
294    
295     * Thuban/Model/resource.py (get_user_proj_file): small bug-fix:
296     Added missing 'val' parameter.
297    
298 bh 1788 2003-10-08 Bernhard Herzog <[email protected]>
299    
300 bh 1790 * Thuban/UI/projdialog.py (ProjFrame.__DoOnProjAvail): When the
301     projection type of the currently selected projection is not known,
302     i.e. there's no panel for it, use the UnknownProjPanel
303     (ProjFrame.__DoOnProjChoice, ProjFrame._show_proj_panel): Split
304     the actual replacing of the proj panel into the new method
305     _show_proj_panel.
306     (UnknownProjPanel): Add doc-string.
307     (UnknownProjPanel._DoLayout): Insert a newline into the text so
308     that the panel is not so wide.
309    
310     2003-10-08 Bernhard Herzog <[email protected]>
311    
312 bh 1788 * Thuban/Model/resource.py (read_proj_file): Return the warnings
313     too. Update the doc-string
314     (get_proj_files): Removed. It wasn't used anywhere
315     (get_system_proj_files, get_system_proj_file): Rename to
316     get_system_proj_file and return the ProjFile object and not a list
317     of ProjFile objects. Update the callers.
318     (get_user_proj_files, get_user_proj_file): Rename to
319     get_user_proj_file return the ProjFile object and not a list of
320     ProjFile objects. Update the callers.
321     (ProjFileReader.__init__): New instance variable for the warnings.
322     Rename the __pf ivar to projfile. Update the methods referring to
323     __pf
324     (ProjFileReader.end_projection): Catch any errors raised when
325     instantiating the projection and record that as an error. The
326     projection will not be in the final ProjFile object.
327     (ProjFileReader.GetWarnings): New method to return the warnings.
328    
329     * Thuban/UI/projdialog.py (ProjFrame.show_warnings): New method to
330     show the warnings from the projfile reader
331     (ProjFrame._OnImport): Deal with any warnings returned by
332     read_proj_file
333     (ProjFrame.__FillAvailList): Deal with any warnings returned by
334     get_system_proj_file or get_user_proj_file.
335    
336     * test/test_proj.py (TestProjFile.doTestRead): Check the warnings.
337     (TestProjFileWithInvalidParameters.file_contents): New test cases
338     to test whether read_proj_file handles invalid projection
339     parameters correctly
340     (TestProjFile.test_get_system_proj_file): New. Simple test for
341     resource.get_system_proj_file
342    
343 bh 1785 2003-10-07 Bernhard Herzog <[email protected]>
344    
345     * test/test_derivedshapestore.py
346     (TestDerivedShapeStoreExceptions.tearDown): Clear the session
347     properly so that the temporary directories get deleted correctly
348    
349 bh 1773 2003-10-06 Bernhard Herzog <[email protected]>
350    
351 bh 1783 Handle the title changes in a proper MVC way.
352    
353     * Thuban/UI/mainwindow.py (MainWindow.__init__): Subscribe to the
354     canvas' TITLE_CHANGED messages
355     (MainWindow.update_title): New. Update the main window's title
356     (MainWindow.__SetTitle): Removed. Use update_title instead.
357     (MainWindow.SetMap): Use update_title instead of __SetTitle
358     (MainWindow.RenameMap): Do change the window title explicitly
359     here. That's handled in a proper MVC way now.
360     (MainWindow.title_changed): New. Subscriber for the TITLE_CHANGED
361     messages
362    
363     * Thuban/Lib/connector.py (Conduit): New class to help classes
364     that forward messages
365    
366     * Thuban/UI/viewport.py: Forward the map's TITLE_CHANGED messages
367     (ViewPort): Derive from Conduit instead of Publisher
368     (ViewPort.Subscribe, ViewPort.Unsubscribe): Use the new base class
369     when calling the inherited versions
370     (ViewPort._subscribe_map, ViewPort._unsubscribe_map): New helper
371     methods to subscribe and unsubscribe map messages
372     (ViewPort.SetMap, ViewPort.Destroy): Use the new helper methods to
373     handle the map subscriptions
374     (ViewPort.Map, ViewPort.map_projection_changed)
375     (ViewPort.layer_projection_changed): Add or update doc-strings
376    
377     * test/test_connector.py (TestPublisher.test_issue_simple): Fix
378     typo
379     (MyConduit): Helper class for the Conduit test.
380     (TestConduit): Test cases for Conduit
381    
382     * test/test_connector.py: Use support.run_tests as main.
383    
384     * test/test_viewport.py (ViewPortTest.setUp): Also subscribe to
385     the TITLE_CHANGED messages
386     (ViewPortTest.test_forwarding_title_changed): New test to check
387     whether the viewport forwards the map's TITLE_CHANGED messages
388     (TestViewportWithPostGIS.tearDown): Call the map's Destroy method
389     after the port's because the latter may require a still functional
390     map.
391    
392     2003-10-06 Bernhard Herzog <[email protected]>
393    
394 bh 1777 * Thuban/UI/application.py (ThubanApplication.maps_changed): Add
395     doc-string
396    
397     2003-10-06 Bernhard Herzog <[email protected]>
398    
399 bh 1775 * test/test_viewport.py (ViewPortTest.setUp)
400     (SimpleViewPortTest.test_init_with_size): Move the test for the
401     initial size as a constructor parameter from ViewPortTest.setUp
402     method to a new separate test in SimpleViewPortTest.
403    
404     2003-10-06 Bernhard Herzog <[email protected]>
405    
406 bh 1773 * test/test_viewport.py (MockView): New class derived from
407     ViewPort with a mock implementation of GetTextExtent to be used in
408     the test cases
409     (ViewPortTest.setUp): Use MockView instead of ViewPort
410    
411     * Thuban/UI/viewport.py (ViewPort.GetTextExtent): Turn this method
412     into what would be a "pure virtual function" in C++: always raise
413     NotImplementedError. Mock implementations for test cases don't
414     belong into the real code
415    
416 bh 1770 2003-10-02 Bernhard Herzog <[email protected]>
417    
418     * test/test_layer.py (TestLayer.test_empty_layer): Explicitly
419     close the dbf file we create so that it's contents have been
420     written properly.
421    
422     * libraries/shapelib/shptree.c, libraries/shapelib/shpopen.c,
423     libraries/shapelib/shapefil.h, libraries/shapelib/dbfopen.c:
424     Update to shapelib 1.2.10
425    
426 jan 1767 2003-10-01 Jan-Oliver Wagner <[email protected]>
427    
428     * Thuban/UI/tree.py, Thuban/UI/main.py: Remove the #! line as
429     it annoys lintian which warns about these files not being
430     executable. The #! isn't necessary here since if you absolutely
431     must execute them you can always say "python <filename>".
432    
433 bh 1757 2003-09-26 Bernhard Herzog <[email protected]>
434    
435 bh 1760 * Thuban/Model/classgen.py (GenQuantiles0): Removed since it's
436     only used in GREAT-ER but not used in Thuban itself. When GREAT-ER
437     is ported to a newer the import will fail, so it should be noticed
438     immediately that this function is gone.
439     Fixes RT#1919
440    
441     2003-09-26 Bernhard Herzog <[email protected]>
442    
443 bh 1757 Add a DTD for the projection files and make thuban write valid
444     projection files
445    
446     * Resources/XML/projfile.dtd: New. DTD for thuban's projection
447     files
448    
449     * Thuban/Model/resource.py (ProjFileSaver.write): Use
450     'projectionlist' as the name in the document type declaration so
451     that it matches the element type of the root element.
452    
453     * test/test_proj.py (sample_projfile, sample_projfile2): Use
454     'projectionlist' as the name in the document type declaration just
455     as it is done now in the files thuban would write
456     (sample_projfile, sample_projfile_data): Fix spelling of
457     "Mercator"
458     (TestProjFile.doTestWrite): Validate the written and the expected
459     XML data
460     (TestProjFile): Derive from ValidationTest so that we can run xml
461     validation tests
462    
463 bh 1751 2003-09-24 Bernhard Herzog <[email protected]>
464    
465     * Thuban/UI/renderer.py (ExportRenderer.render_legend): Do not
466     modify the list returned by map.Layers() in place since it is the
467     actual list of layers used by the map.
468    
469 jan 1745 2003-09-23 Jan-Oliver Wagner <[email protected]>
470    
471     * Doc/manual/thuban-manual.xml: Added subsection to chapter
472     Extensions to describe the extensions coming with the Thuban
473     standard package (gns2shp and importAPR).
474    
475 bh 1743 2003-09-23 Bernhard Herzog <[email protected]>
476    
477     * libraries/thuban/wxproj.cpp (project_point): if there's an
478     inverse but no forward projection, convert to degrees after
479     applying the inverse projection. Fixes RT#2096
480    
481     * test/test_wxproj.py: New. Test cases for wxproj.so. One test
482     implicitly tests for the fix to RT#2096
483    
484     * test/support.py (FloatComparisonMixin.assertFloatSeqEqual):
485     Check that the sequences have the same lengths
486    
487     * Resources/Projections/defaults.proj (Geographic projection): Use
488     a much more precise value for the to_meter attribute.
489    
490 bh 1737 2003-09-22 Bernhard Herzog <[email protected]>
491    
492     * test/support.py (initthuban): Make sure to unset the LANG env.
493     var. so that tests that compare translated strings work. Solves RT
494     #2094
495    
496 jan 1730 2003-09-22 Jan-Oliver Wagner <[email protected]>
497    
498 jan 1735 Small improvement of APR import.
499    
500     * Extensions/importAPR/test/test_apr.py (aprTest.test_LClass):
501     Added tests for text-ranges.
502    
503     * Extensions/importAPR/apr.py (APR_LClass.GetThubanRange): Now
504     returns a string object if the range is based on text.
505    
506     * Extensions/importAPR/importAPR.py (import_apr_dialog): Unified
507     range retrieval.
508    
509     2003-09-22 Jan-Oliver Wagner <[email protected]>
510    
511 jan 1730 Initial version of the importAPR extension which is in
512     experimental state.
513    
514     * /Extensions/importAPR/, /Extensions/importAPR/samples/,
515     /Extensions/importAPR/test/: New directories.
516    
517     * /Extensions/importAPR/samples/README: New: Howto load the samples.
518    
519     * /Extensions/importAPR/samples/iceland.apr: New: A sample APR
520     file which refers to the Thuban Iceland demo data.
521    
522     * /Extensions/importAPR/test/README: New: Howto execute the tests.
523    
524     * /Extensions/importAPR/test/test_apr.py: New: Tests for APR classes.
525    
526     * /Extensions/importAPR/apr.py: New: Classes for ArcView Objects
527     as in '.apr'-files.
528    
529     * /Extensions/importAPR/odb.py: New: Classes for generic ArcView
530     ODB Objects as in '.apr', '.avl' and other files.
531    
532     * /Extensions/importAPR/__init__.py: New: Init to make this
533     directory a package.
534    
535     * /Extensions/importAPR/importAPR.py: New: Import a ArcView
536     project file (.apr) and convert it to Thuban.
537    
538     2003-09-22 Jan-Oliver Wagner <[email protected]>
539    
540     * Extensions/gns2shp.gns2shp.py: The main module of gns2shp.
541    
542 jan 1720 2003-09-19 Jan-Oliver Wagner <[email protected]>
543    
544     * Doc/manual/thuban-manual.xml: Extended section 'Installation'
545     with description on RPM installation and RPM binary package
546     creation.
547    
548 bh 1718 2003-09-18 Bernhard Herzog <[email protected]>
549    
550     * setup.py (data_files): Only add the mo files if the Locales
551     directory actually exists, so that setup.py works with a fresh CVS
552     checkout
553    
554 jan 1716 2003-09-12 Jan-Oliver Wagner <[email protected]>
555    
556     * Examples/simple_extensions/simple_tool.py: bugfix: Tool is now
557     in viewport, not anymore in view
558    
559 jan 1714 2003-09-04 Jan-Oliver Wagner <[email protected]>
560    
561     Introducing first Extension (gns2shp).
562    
563     * Extensions, Extensions/gns2shp, Extensions/gns2shp/test: New.
564    
565     * Extensions/__init__.py: New. init to make this dir a package.
566    
567     * Extensions/gns2shp/__init__.py: New. init to make this dir a package.
568    
569     * Extensions/gns2shp/test/README: New. some info on this test directory.
570    
571     * Extensions/gns2shp/test/ls.txt: New. test data set (Liechtenstein).
572    
573     * Extensions/gns2shp/test/test_gns2shp.py: New. Test for correct creation
574     of Shapefile from GNS text file format
575    
576 jan 1705 2003-09-03 Jan-Oliver Wagner <[email protected]>
577    
578 jan 1707 Fix/workaround for bug #2019:
579     https://intevation.de/rt/webrt?serial_num=2019
580    
581     * Thuban/UI/identifyview.py (IdentifyView.ID_STOP): New.
582     (IdentifyView.__init__): Added another button that allows to
583     stop the identify mode.
584     (IdentifyView.OnStop): New. Stops the identify mode.
585    
586     2003-09-03 Jan-Oliver Wagner <[email protected]>
587    
588 jan 1705 Introducing a new exception dialog that allows to exit the
589     application immediately.
590     This fixes bug #2060: https://intevation.de/rt/webrt?serial_num=2060
591    
592     * Thuban/UI/exceptiondialog.py: New. A special exception dialog.
593    
594     * Thuban/UI/application.py (ThubanApplication.ShowExceptionDialog):
595     Made strings available to translations. Exchanged the simple
596     ScrolledMessageDialog by the new ExceptionDialog.
597    
598 bh 1694 2003-09-01 Bernhard Herzog <[email protected]>
599    
600 bh 1701 * NEWS: New. Summary of changes and release notes.
601    
602     * MANIFEST.in: Add NEWS
603    
604     2003-09-01 Bernhard Herzog <[email protected]>
605    
606 bh 1699 * MANIFEST.in: Correct the include statement for the mo-files and
607     include the documentation too.
608    
609     * setup.py (data_files): Add the .mo files
610     (setup call): Up to version 0.9.0
611    
612     2003-09-01 Bernhard Herzog <[email protected]>
613    
614 bh 1696 * Thuban/UI/dbdialog.py (ChooseDBTableDialog.__init__): Change the
615     parameter list to just parent and session
616     (ChooseDBTableDialog.__set_properties): Removed. Setting the
617     selection of empty list boxes is not allowed (and produces C++
618     assertion errors) and the rest of the setup is better done in
619     __init__ anyway.
620     (ChooseDBTableDialog.OnCancel, ChooseDBTableDialog.OnOK)
621     (ChooseDBTableDialog.OnLBDClick, DBDialog.OnOK): Use the Python
622     builtins True/False for booleans to avoid warnings from wxPython
623    
624     * Thuban/UI/mainwindow.py (MainWindow.AddDBLayer): Adapt to new
625     ChooseDBTableDialog constructor parameters.
626    
627     2003-09-01 Bernhard Herzog <[email protected]>
628    
629 bh 1694 * Thuban/Model/postgisdb.py
630     (PostGISTable): Extend doc-string
631     (PostGISTable._fetch_table_information): Set the column index
632     correctly, pretending ignored columns don't exist.
633    
634     * test/test_postgis_db.py (TestPostGISIgnoredColumns): New tests
635     for postgis tables with data types not yet supported by thuban.
636    
637 bh 1692 2003-08-29 Bernhard Herzog <[email protected]>
638    
639     * HOWTO-Release: Tweak item about running the tests.
640    
641 jan 1690 2003-08-29 Jan-Oliver Wagner <[email protected]>
642    
643     * /Doc/manual/thuban-manual.xml: updated to version 1.0pre2.
644    
645 bh 1688 2003-08-29 Bernhard Herzog <[email protected]>
646    
647     Add some missing parameters to projections. Proj complains about
648     them on windows but for some reason not on Linux.
649    
650     * test/test_save.py (SaveSessionTest.testLayerProjection): Add
651     missing required projection parameters
652    
653     * test/test_proj.py (TestProjFile.test): Add missing required
654     projection parameters
655    
656     * test/test_load_0_8.py (TestLayerProjection.file_contents)
657     (TestLayerProjection.test): Add missing required projection
658     parameters and tests for them
659    
660     * test/test_load.py (TestLayerProjection.file_contents)
661     (TestLayerProjection.test): Add missing required projection
662     parameters and tests for them
663    
664     * test/test_layer.py (TestLayer.test_base_layer): Add missing
665     required projection parameters
666    
667     2003-08-29 Bernhard Herzog <[email protected]>
668    
669     * libraries/pyprojection/Projection.i: Use pj_get_errno_ref to
670     access the pj_errno because directly accessing pj_errno doesn't
671     work on windows if the proj library is in a DLL
672    
673     * libraries/pyprojection/Projection_wrap.c: Update from Projection.i
674    
675 bh 1672 2003-08-28 Bernhard Herzog <[email protected]>
676    
677 bh 1685 * test/test_proj.py: Import things from Thuban after calling
678     initthuban
679    
680     * test/test_load.py (LoadSessionTest.filenames): New class
681     variable with the filename attributes to normalize
682     (LoadSessionTest.check_format): Pass self.filenames to
683     sax_eventlist to normalize the filename attributes
684    
685     * test/xmlsupport.py: Add cvs keywords
686     (SaxEventLister.__init__): New parameter filenames which indicates
687     attributes that contain filenames
688     (SaxEventLister.startElementNS): Normalize the filename attributes
689     with os.path.normpath
690     (sax_eventlist): New parameter filenames to pass through to
691     SaxEventLister
692    
693     * test/test_derivedshapestore.py: Make this file callable as a
694     program to execute the tests
695     (TestDerivedShapeStoreExceptions.test_table_with_wrong_size): Bind
696     the session to self.session so that it gets destroyed properly
697    
698     * test/test_layer.py (TestLayer.tearDown): Call the session's
699     Destroy method
700    
701     * test/test_map.py (TestMapBase.tearDown): Destroy self.session
702     too if it exists
703     (TestMapAddLayer.test_add_layer): Bind the session to self.session
704     so that it gets destroyed properly
705    
706     * test/postgissupport.py (reason_for_not_running_tests): Add a
707     test for the existence of popen2.Popen4.
708    
709     * test/test_save.py (SaveSessionTest.tearDown): New. Provide a
710     reliable way to destroy the sessions created in the test cases
711     (SaveSessionTest.test_dbf_table): Bind the session to self.session
712     so that it gets destroyed properly
713     (SaveSessionTest.testLayerProjection): Bind the session to
714     self.session so that it gets destroyed properly
715    
716     * test/test_session.py (UnreferencedTablesTests.tearDown): Make
717     sure that the session is destroyed properly
718    
719     * test/test_shapefilestore.py: Make this callable as a program to
720     execute the tests
721    
722     * test/test_scalebar.py: Remove unnecessary import of _ from
723     Thuban
724    
725     * test/support.py (print_garbage_information): Call initthuban
726     here because it may be called indirectly from test cases that test
727     test support modules which do not use anything from thuban itself
728     (ThubanTestProgram.runTests): Remove unnecessary debug print
729    
730     2003-08-28 Bernhard Herzog <[email protected]>
731    
732 bh 1672 * Thuban/version.py (longversion): Update to 0.9
733    
734     * Thuban/UI/mainwindow.py: Remove some unused imports
735    
736     * README: Add section about required additional software. Add date
737     and revision CVS keywords
738    
739     * HOWTO-Release: Add item about the translations. Add date and
740     revision CVs keywords and change formatting to match README a bit
741     better
742    
743     * po/de.po: Update for 0.9
744    
745     * test/README: Tweak the wording a little because many tests are
746     not really unittest.
747    
748 bh 1663 2003-08-27 Bernhard Herzog <[email protected]>
749    
750 bh 1665 As preparation for the 0.9 release, switch thuban files to a
751     non-dev namespace
752    
753     * Thuban/Model/save.py (SessionSaver.write_session): Write files
754     with the http://thuban.intevation.org/dtds/thuban-0.9.dtd
755     namespace
756    
757     * Thuban/Model/load.py (SessionLoader.__init__): Accept the
758     http://thuban.intevation.org/dtds/thuban-0.9.dtd namespace too
759    
760     * test/test_save.py (SaveSessionTest.dtd)
761     (SaveSessionTest.testEmptySession)
762     (SaveSessionTest.testSingleLayer)
763     (SaveSessionTest.testLayerProjection)
764     (SaveSessionTest.testRasterLayer)
765     (SaveSessionTest.testClassifiedLayer)
766     (SaveSessionTest.test_dbf_table)
767     (SaveSessionTest.test_joined_table)
768     (SaveSessionTest.test_save_postgis): Update for new namespace
769    
770     * test/test_load.py (LoadSessionTest.dtd, TestSingleLayer)
771     (TestLayerVisibility.file_contents, TestLabels.file_contents)
772     (TestLayerProjection.file_contents)
773     (TestRasterLayer.file_contents, TestJoinedTable.file_contents)
774     (TestPostGISLayer.file_contents)
775     (TestPostGISLayerPassword.file_contents)
776     (TestLoadError.file_contents, TestLoadError.test): Update for new
777     namespace
778    
779     2003-08-27 Bernhard Herzog <[email protected]>
780    
781 bh 1663 Make the table interface distinguish between row ids (an integer
782     that uniquely identifies a row) and row ordinals (a simple row
783     count from 0 to NumRows() - 1)
784    
785     * Thuban/Model/postgisdb.py (PostGISTable.RowIdToOrdinal)
786     (PostGISTable.RowOrdinalToId): New methods to conver between row
787     ids and row ordinals
788     (PostGISTable.ReadRowAsDict, PostGISTable.ReadValue): New keyword
789     parameter row_is_ordinal to indicate whether the row parameter is
790     the row id or the ordinal
791    
792     * Thuban/Model/transientdb.py (TransientTableBase.RowIdToOrdinal)
793     (TransientTableBase.RowOrdinalToId)
794     (AutoTransientTable.RowIdToOrdinal)
795     (AutoTransientTable.RowOrdinalToId): Same new methods as in
796     PostGISTable.
797     (TransientTableBase.ReadRowAsDict, TransientTableBase.ReadValue)
798     (AutoTransientTable.ReadRowAsDict, AutoTransientTable.ReadValue):
799     Same new parameter as in PostGISTable.
800    
801     * Thuban/Model/table.py (DBFTable.RowIdToOrdinal)
802     (DBFTable.RowOrdinalToId, MemoryTable.RowIdToOrdinal)
803     (MemoryTable.RowOrdinalToId): Same new methods as in PostGISTable.
804     (DBFTable.ReadValue, DBFTable.ReadRowAsDict)
805     (MemoryTable.ReadValue, MemoryTable.ReadRowAsDict): Same new
806     parameter as in PostGISTable.
807    
808     * Thuban/UI/tableview.py (DataTable.RowIdToOrdinal)
809     (DataTable.RowOrdinalToId): New methods to convert between row ids
810     and row ordinals.
811     (TableGrid.SelectRowById): New method to select a row based on its
812     ID as opposed to its ordinal
813     (DataTable.GetValue, TableGrid.OnRangeSelect)
814     (TableGrid.OnSelectCell, LayerTableGrid.select_shapes)
815     (QueryTableFrame.OnQuery, QueryTableFrame.get_selected)
816     (LayerTableFrame.__init__): Convert between row ids and row
817     ordinals as appropriate
818    
819     * test/postgissupport.py (PostGISDatabase.__init__): Add
820     doc-string.
821     (PostGISDatabase.initdb): The optional third item in a tuple in
822     tables is now a (key, value) list with additional arguments to
823     pass to upload_shapefile
824     (upload_shapefile): New parameter gid_offset to allow gids that
825     are not the same as the shapeids in the shapefile
826     (PostgreSQLServer.get_default_static_data_db): Use the new
827     gid_offset to make the gids in landmarks 1000 higher than the
828     shapeids in the shapefile
829    
830     * test/test_viewport.py
831     (TestViewportWithPostGIS.test_find_shape_at_point): Adapt to the
832     new shapeids in the landmarks table
833    
834     * test/test_transientdb.py
835     (TestTransientTable.run_iceland_political_tests)
836     (TestTransientTable.test_transient_joined_table): Add tests for
837     the new table methods and new keywords arguments.
838    
839     * test/test_postgis_db.py
840     (TestPostGISTable.test_read_row_as_dict_row_count_mode)
841     (TestPostGISTable.test_read_value_row_count_mode)
842     (TestPostGISTable.test_row_id_to_ordinal)
843     (TestPostGISTable.test_row_oridnal_to_id): New test for the new
844     table methods and the new arguments
845     (TestPostGISShapestorePoint.test_shapes_in_region)
846     (TestPostGISShapestorePoint.test_shape_raw_data)
847     (TestPostGISShapestorePoint.test_shape_points)
848     (TestPostGISShapestorePoint.test_shape_shapeid)
849     (TestPostGISShapestorePoint.test_all_shapes)
850     (TestPostGISTable.test_simple_query)
851     (TestPostGISTable.test_simple_query)
852     (TestPostGISTable.test_simple_query)
853     (TestPostGISTable.test_read_value)
854     (TestPostGISTable.test_read_row_as_dict): Adapt to the new
855     shapeids in the landmarks table
856    
857     * test/test_memory_table.py
858     (TestMemoryTable.test_read_row_as_dict_row_count_mode)
859     (TestMemoryTable.test_read_value_row_count_mode)
860     (TestMemoryTable.test_row_id_to_ordinal)
861     (TestMemoryTable.test_row_oridnal_to_id): New test for the new
862     table methods and the new arguments
863    
864     * test/test_dbf_table.py
865     (TestDBFTable.test_read_row_as_dict_row_count_mode)
866     (TestDBFTable.test_read_value_row_count_mode)
867     (TestDBFTable.test_row_id_to_ordinal)
868     (TestDBFTable.test_row_oridnal_to_id): New test for the new table
869     methods and the new arguments
870    
871 bh 1659 2003-08-26 Bernhard Herzog <[email protected]>
872    
873 bh 1661 * Thuban/Model/postgisdb.py (PostGISShapeStore.BoundingBox): Use a
874     more postgis specific but much faster method to get the bounding
875     box
876    
877     2003-08-26 Bernhard Herzog <[email protected]>
878    
879 bh 1659 * Thuban/Model/postgisdb.py (PostGISTable.Title)
880     (PostGISShapeStore.AllShapes): Add these missing methods.
881     (PostGISShapeStore.ShapesInRegion): No need to raise
882     StopIteration. We can simply return
883    
884     * test/test_postgis_db.py (TestPostGISTable.test_title)
885     (TestPostGISShapestorePoint.test_all_shapes): New tests for the
886     new methods
887    
888 bh 1643 2003-08-25 Bernhard Herzog <[email protected]>
889    
890 bh 1657 * Thuban/Model/postgisdb.py (shapetype_map): Add MUTLIPOLYGON.
891    
892     * test/test_postgis_db.py (PolygonTests): New class containing
893     those tests from TestPostGISShapestorePolygon that can also be
894     used to test MUTLIPOLYGON tables
895     (TestPostGISShapestorePolygon): Most tests are now in PolygonTests
896     so derive from that
897     (TestPostGISShapestoreMultiPolygon): New class with tests for
898     MUTLIPOLYGON tables
899    
900     * test/postgissupport.py (PostGISDatabase.initdb): Allow the
901     tables argument to have tuples with three items to override the
902     WKT type used.
903     (PostgreSQLServer.get_default_static_data_db): Use the above to
904     create a polygon table with MUTLIPOLYGONs
905     (point_to_wkt, coords_to_point, polygon_to_wkt, coords_to_polygon)
906     (arc_to_wkt, coords_to_multilinestring): Rename from *_to_wkt to
907     coords_to*
908     (coords_to_multipolygon): New. Convert to MUTLIPOLYGON
909     (wkt_converter): New. Map WKT types to converters
910     (upload_shapefile): New parameter force_wkt_type to use a
911     different WKT type than the default
912    
913     2003-08-25 Bernhard Herzog <[email protected]>
914    
915 bh 1655 * Thuban/UI/application.py
916     (ThubanApplication.run_db_param_dialog): New. Suitable as a
917     db_connection_callback. Main difference is that the dialog run
918     from this method doesn't have a parent so it can be used even when
919     there is no main window
920     (ThubanApplication.OpenSession): Use self.run_db_param_dialog if
921     no db_connection_callback was given. This way the dialog pops up
922     even when the .thuban file was given as a command line parameter.
923    
924     2003-08-25 Bernhard Herzog <[email protected]>
925    
926 bh 1653 * Thuban/UI/view.py (MapCanvas.OnLeftUp): Release the the mouse
927     before calling MouseLeftUp. MouseLeftUp may pop up modal dialogs
928     which leads to an effectively frozen X session because the user
929     can only interact with the dialog but the mouse is still grabbed
930     by the canvas.
931     Also, call the tool's Hide method before MouseLeftUp because
932     MouseLeftUp may change the tool's coordinates.
933    
934     2003-08-25 Bernhard Herzog <[email protected]>
935    
936 bh 1651 * Thuban/UI/application.py (ThubanApplication.OpenSession): Catch
937     LoadCancelled exceptions and handle them by returning immediately.
938    
939     2003-08-25 Bernhard Herzog <[email protected]>
940    
941 bh 1649 GUI part of loading sessions with postgis connections which may
942     require user interaction to get passwords or updated parameters
943    
944     * Thuban/UI/dbdialog.py (DBDialog): Reimplement to make it look a
945     bit nucer and be more generic.
946     (DBFrame.OnAdd): Adapt to new DBDialog interface
947    
948     * Thuban/UI/application.py (ThubanApplication.OpenSession): New
949     optional parameter db_connection_callback which is passed to
950     load_session.
951    
952     * Thuban/UI/mainwindow.py (MainWindow.run_db_param_dialog): New.
953     Suitable as a db_connection_callback
954     (MainWindow.OpenSession): Use self.run_db_param_dialog as the
955     db_connection_callback of the application's OpenSession method
956    
957    
958     2003-08-25 Bernhard Herzog <[email protected]>
959    
960 bh 1647 Basic loading of sessions containing postgis connections:
961    
962     * Thuban/Model/load.py (LoadError): Add doc-string
963     (LoadCancelled): New exception class to indicate a cancelled load
964     (SessionLoader.__init__): Add the db_connection_callback parameter
965     which will be used by the loader to get updated parameters and a
966     password for a database connection
967     (SessionLoader.__init__): Add the new XML elements to the
968     dispatchers dictionary
969     (SessionLoader.check_attrs): Two new conversions, ascii to convert
970     to a byte-string object and idref as a generic id reference
971     (SessionLoader.start_dbconnection)
972     (SessionLoader.start_dbshapesource): New. Handlers for the new XML
973     elements
974     (load_session): Add the db_connection_callback to pass through the
975     SessionLoader
976    
977     * test/test_load.py (TestPostGISLayer, TestPostGISLayerPassword):
978     New classes to test loading of sessions with postgis database
979     connections.
980    
981     2003-08-25 Bernhard Herzog <[email protected]>
982    
983 bh 1645 * Thuban/UI/mainwindow.py (__ThubanVersion__): Remove this and
984     replace it and the comment with __BuildDate__ by the Source: and
985     Id: cvs keywords as used in the other files.
986    
987     2003-08-25 Bernhard Herzog <[email protected]>
988    
989 bh 1643 * Thuban/Model/load.py (SessionLoader.check_attrs): Raise a
990     LoadError when a required attribute is missing. The code used to
991     be commented out for some reason, but probably should have been
992     active.
993    
994     * test/test_load.py (TestLoadError.test): Test the message in the
995     LoadError too to make sure it really is about the missing
996     attribute
997    
998 bh 1632 2003-08-22 Bernhard Herzog <[email protected]>
999 bh 1641
1000     * test/test_save.py (SaveSessionTest.test_dbf_table)
1001     (SaveSessionTest.test_joined_table): Add XML validation tests.
1002    
1003     2003-08-22 Bernhard Herzog <[email protected]>
1004    
1005 bh 1639 Implement saving a session with a postgis connection
1006 bh 1632
1007 bh 1639 * Resources/XML/thuban-0.9.dtd (dbconnection, dbshapesource) New
1008     elements for database connections and shapestores using db
1009     connections
1010     (session): Add the dbconnections to the content model
1011    
1012     * Thuban/Model/save.py (SessionSaver.write_db_connections): New.
1013     Write the db connections
1014     (SessionSaver.write_session): Call write_db_connections to write
1015     the connection before the data sources
1016     (SessionSaver.write_data_containers): Handle postgis shapestores
1017    
1018     * test/test_save.py (SaveSessionTest.thubanids)
1019     (SaveSessionTest.thubanidrefs): Update for new DTD
1020     (SaveSessionTest.test_save_postgis): New. Test saving a session
1021     with postgis connections
1022    
1023     * Thuban/Model/postgisdb.py (PostGISTable.DBConnection)
1024     (PostGISTable.TableName): New accessor methods for the connection
1025     and table name
1026    
1027     * test/test_postgis_db.py (TestPostGISTable.test_dbconn)
1028     (TestPostGISTable.test_dbname): New methods to test the new
1029     PostGISConnection methods
1030    
1031     2003-08-22 Bernhard Herzog <[email protected]>
1032    
1033 bh 1637 * Thuban/Model/postgisdb.py (ConnectionError): New exception class
1034     for exceptions occurring when establishing a Database connection
1035     (PostGISConnection.connect): Catch psycopg.OperationalError during
1036     connects and raise ConnectionError.
1037    
1038     * test/test_postgis_db.py (TestPostgisDBExceptions): New class for
1039     tests for database exceptions
1040    
1041     2003-08-22 Bernhard Herzog <[email protected]>
1042    
1043 bh 1635 Prepare the test suite for tests with required authentication
1044    
1045     * test/postgissupport.py (PostgreSQLServer.__init__): Add instance
1046     variables with two predefined users/passwords, one for the admin
1047     and one for a non-privileged user.
1048     (PostgreSQLServer.createdb): Pass the admin name to initdb and add
1049     the non-privileged user to the database and set the admin password
1050     (PostgreSQLServer.wait_for_postmaster): Use the admin user name.
1051     Better error reporting
1052     (PostgreSQLServer.connection_params)
1053     (PostgreSQLServer.connection_string): New methods to return
1054     information about how to connect to the server
1055     (PostgreSQLServer.execute_sql): New. Convenience method to execute
1056     SQL statements
1057     (PostgreSQLServer.require_authentication): Toggle whether the
1058     server requires authentication
1059     (PostgreSQLServer.create_user, PostgreSQLServer.alter_user): New.
1060     Add or alter users
1061     (PostGISDatabase.initdb): Pass the admin name one the
1062     subprocesses' command lines. Grant select rights on
1063     geometry_columns to everybody.
1064     (upload_shapefile): Use the admin name and password when
1065     connecting. Grant select rights on the new table to everybody.
1066    
1067     * test/test_viewport.py (TestViewportWithPostGIS.setUp): Use the
1068     server's new methods to get the connection parameters.
1069    
1070     * test/test_postgis_session.py (TestSessionWithPostGIS.setUp)
1071     (TestSessionWithPostGIS.test_remove_dbconn_exception): Use the
1072     server's new methods to get the connection parameters.
1073    
1074     * test/test_postgis_db.py
1075     (TestPostGISConnection.test_gis_tables_empty)
1076     (TestPostGISConnection.test_gis_tables_non_empty)
1077     (PostGISStaticTests.setUp): Use the server's new methods to get
1078     the connection parameters.
1079    
1080     2003-08-22 Bernhard Herzog <[email protected]>
1081    
1082 bh 1632 * Thuban/UI/about.py (About.__init__): Add the psycopg version.
1083    
1084     * Thuban/version.py: Add psycopg version
1085    
1086     * Thuban/Model/postgisdb.py (psycopg_version): New. Return the
1087     version of the psycopg module
1088    
1089     2003-08-22 Bernhard Herzog <[email protected]>
1090    
1091     * Thuban/UI/dbdialog.py (DBPwdDlg): Removed because it's not used.
1092     (DBFrame.OnEdit): Removed because it's not used and wouldn't work
1093     at the moment. The functionality should probably be implemented
1094     some time, though.
1095 bh 1633 (DBFrame.OnRemove): Display a message if the connection can't be
1096     removed because it's still in use.
1097 bh 1632
1098 jan 1629 2003-08-22 Jan-Oliver Wagner <[email protected]>
1099    
1100     * Thuban/UI/about.py (About.__init__): split up the huge about
1101     text into elements/lists for easier translation. This fixes bug
1102     https://intevation.de/rt/webrt?serial_num=2058
1103     Also, made some forgotten string available for the i18n.
1104    
1105 bh 1627 2003-08-21 Bernhard Herzog <[email protected]>
1106    
1107     Make postgis support really optional including insensitive menu
1108     items.
1109    
1110     * Thuban/Model/postgisdb.py (has_postgis_support): New. Return
1111     whether the postgis is supported.
1112    
1113     * Thuban/UI/dbdialog.py: Put the psycopg import into try..except
1114     to make postgis support optional
1115    
1116     * Thuban/UI/mainwindow.py (_has_postgis_support): New. Context
1117     version of Thuban.Model.postgisdb.has_postgis_support
1118     (database_management command): Make it only sensitive if postgis
1119     is supported.
1120    
1121 jan 1623 2003-08-21 Jan-Oliver Wagner <[email protected]>
1122    
1123 jan 1626 * Doc/manual/thuban-manual.xml: Added CVS revision for rev-history.
1124     (section Adding and Removing Layers): Added text and described
1125     multi-selection.
1126     (chapter Extensions): New.
1127    
1128     2003-08-21 Jan-Oliver Wagner <[email protected]>
1129    
1130 jan 1623 * Thuban/UI/mainwindow.py (MainWindow.AddLayer): Changed dialog
1131     settings to allow multiple files to load into the map.
1132     Also reduced selection to *.shp as a default.
1133    
1134 bh 1621 2003-08-20 Bernhard Herzog <[email protected]>
1135    
1136     Add dialogs and commands to open database connections and add
1137     database layers.
1138    
1139     * Thuban/UI/mainwindow.py (MainWindow.DatabaseManagement): New
1140     method to open the database connection management dialog
1141     (MainWindow.AddDBLayer): New method to add a layer from a database
1142     (_has_dbconnections): New helper function to use for sensitivity
1143     (database_management command, layer_add_db command): New commands
1144     that call the above new methods.
1145     (main_menu): Add the new commands to the menu.
1146    
1147     * Thuban/Model/postgisdb.py (PostGISConnection.__init__)
1148     (PostGISConnection.connect): Establish the actual connection in a
1149     separate method and call it in __init__. This makes it easier to
1150     override the behavior in test cases
1151     (PostGISConnection.BriefDescription): New method to return a brief
1152     description for use in dialogs.
1153    
1154     * test/test_postgis_db.py (NonConnection): DB connection that
1155     doesn't actually connect
1156     (TestBriefDescription): New class with tests for the new
1157     BriefDescription method
1158    
1159 jan 1619 2003-08-19 Jan-Oliver Wagner <[email protected]>
1160    
1161     Moved anything from extensions to libraries.
1162    
1163     * libraries: New.
1164    
1165     * libraries/ pyprojection, pyshapelib, shapelib, thuban: New.
1166    
1167     * libraries/pyprojection/ LICENSE, MANIFEST.in, Projection.i,
1168     Projection.py, Projection_wrap.c, setup.py, swighelp.txt: These files have
1169     been moved here from thuban/extensions/pyprojection/
1170     See there in the Attic for the older history.
1171    
1172     * libraries/pyshapelib/ COPYING, ChangeLog, NEWS, README, dbflib.i,
1173     dbflib.py, dbflib_wrap.c, pyshapelib_api.h, pytest.py, setup.py,
1174     shapelib.i, shapelib.py, shapelib_wrap.c, shptreemodule.c: These files
1175     have been moved here from thuban/extensions/pyshapelib/
1176     See there in the Attic for the older history.
1177    
1178     * libraries/shapelib/ dbfopen.c, shapefil.h, shpopen.c, shptree.c: These
1179     files have been moved here from thuban/extensions/shapelib/
1180     See there in the Attic for the older history.
1181    
1182     * libraries/thuban/ bmpdataset.cpp, cpl_mfile.cpp, cpl_mfile.h,
1183     gdalwarp.cpp, wxproj.cpp: These files have been moved here from
1184     thuban/extensions/thuban/
1185     See there in the Attic for the older history.
1186    
1187     * MANIFEST.in, setup.cfg, setup.py: renamed extensions to libraries.
1188    
1189     * extensions/thuban/ bmpdataset.cpp, cpl_mfile.cpp, cpl_mfile.h,
1190     gdalwarp.cpp, wxproj.cpp: Moved to libraries/thuban.
1191    
1192     * extensions/shapelib/ dbfopen.c, shapefil.h, shpopen.c, shptree.c:
1193     Moved to libraries/shapelib.
1194    
1195     * extensions/pyshapelib/ COPYING, NEWS, dbflib.py, pytest.py,
1196     shapelib.py, README, dbflib_wrap.c, setup.py, shapelib_wrap.c,
1197     ChangeLog, dbflib.i, pyshapelib_api.h, shapelib.i, shptreemodule.c:
1198     Moved to libraries/pyshapelib.
1199    
1200     * extensions/pyprojection/ MANIFEST.in, Projection.py, setup.py,
1201     LICENSE, Projection.i, Projection_wrap.c, swighelp.txt:
1202     Moved to libraries/pyprojection.
1203    
1204     * extensions/ pyprojection, pyshapelib, shapelib, thuban: Removed.
1205    
1206     * extensions: Removed.
1207    
1208 bh 1606 2003-08-19 Bernhard Herzog <[email protected]>
1209    
1210 bh 1609 * test/test_viewport.py (ViewPortTest): We don't use the
1211     facilities of FileTestMixin so don't derive from it.
1212     (TestViewportWithPostGIS): New class with tests for using a
1213     viewport on a map with postgis layers.
1214    
1215     2003-08-19 Bernhard Herzog <[email protected]>
1216    
1217     Add the db connection management to the session.
1218    
1219     * Thuban/Model/session.py (Session.__init__): New instance
1220     variable db_connections
1221     (Session.AddDBConnection, Session.DBConnections)
1222     (Session.HasDBConnections, Session.CanRemoveDBConnection)
1223     (Session.RemoveDBConnection): New methods to manage and query the
1224     db connections managed by the session
1225     (Session.OpenDBShapeStore): New method to open a shapestore from a
1226     db connection
1227    
1228     * Thuban/Model/messages.py (DBCONN_REMOVED, DBCONN_ADDED): New
1229     messages for the db connection handling in the session
1230    
1231     * test/test_postgis_session.py: New. test cases for the session's
1232     db connection handling with postgis connections
1233    
1234     2003-08-19 Bernhard Herzog <[email protected]>
1235    
1236 bh 1606 Add very basic postgis database support and the corresponding test
1237     cases. The test cases require a PostgreSQL + postgis installation
1238     but no existing database. The database will be created
1239     automatically by the test cases
1240    
1241     * test/README: Add note about skipped tests and the requirements
1242     of the postgis tests.
1243    
1244     * Thuban/Model/postgisdb.py: New. Basic postgis database support.
1245    
1246     * test/test_postgis_db.py: New. Test cases for the postgis
1247     support.
1248    
1249     * Thuban/Model/wellknowntext.py: New. Parser for well-known-text
1250     format
1251    
1252     * test/test_wellknowntext.py: New. Test cases for the
1253     wellknowntext parser
1254    
1255     * test/postgissupport.py: New. Support module for tests involving
1256     a postgis database.
1257    
1258     * test/support.py (execute_as_testsuite): Shut down the postmaster
1259     if it's still running after the tests
1260    
1261     * Thuban/Model/data.py (RAW_WKT): New constant for raw data in
1262     well known text format
1263    
1264 jan 1604 2003-08-19 Jan-Oliver Wagner <[email protected]>
1265    
1266     * Examples/simple_extensions/hello_world.py: New. Raises a Hello World
1267     message dialog.
1268    
1269 bh 1600 2003-08-18 Bernhard Herzog <[email protected]>
1270    
1271 bh 1602 * test/support.py (ThubanTestResult.printErrors): Indent the
1272     reason for the skips in the output to make it a bit more readable.
1273     (execute_as_testsuite): New helper function to run a test suite
1274     and print some more information.
1275     (run_tests): Use execute_as_testsuite to run the tests
1276    
1277     * test/runtests.py (main): Use execute_as_testsuite to run the
1278     tests
1279    
1280     2003-08-18 Bernhard Herzog <[email protected]>
1281    
1282 bh 1600 Fix some bugs in Thuban and the test suite that were uncovered by
1283     changes introduced in Python 2.3:
1284    
1285     * Thuban/Model/table.py (DBFTable.__init__): Make sure the
1286     filename is an absolute name
1287    
1288     * Thuban/Model/layer.py (RasterLayer.__init__): Make sure the
1289     filename is an absolute name
1290    
1291     * test/test_save.py (SaveSessionTest.testRasterLayer): Use a
1292     unique filename to save to and use the correct relative filename
1293     in the expected output.
1294     (SaveSessionTest.test_dbf_table): Use the correct relative
1295     filename in the expected output.
1296    
1297     * test/test_layer.py (TestLayer.test_raster_layer): Update the
1298     test to check whether the filename is absolute.
1299    
1300 jan 1596 2003-08-18 Jan-Oliver Wagner <[email protected]>
1301    
1302     * Thuban/UI/about.py (About.__init__): Added Silke Reimer.
1303    
1304 bh 1586 2003-08-15 Bernhard Herzog <[email protected]>
1305    
1306 bh 1594 Change the way shapes are returned by a shape store. The
1307     ShapesInRegion method returns an iterator over actual shape
1308     objects instead of a list of shape ids.
1309    
1310     * Thuban/Model/data.py (ShapefileShape.ShapeID): New. Return shape
1311     id.
1312     (ShapefileStore.ShapesInRegion): Return an iterator over the
1313     shapes which yields shape objects instead of returning a list of
1314     shape ids
1315     (ShapefileStore.AllShapes): New. Return an iterator over all
1316     shapes in the shape store
1317     (DerivedShapeStore.AllShapes): New. Like in ShapefileStore
1318    
1319     * Thuban/Model/layer.py (Layer.ShapesInRegion): Update
1320     doc-string.
1321    
1322     * Thuban/UI/baserenderer.py
1323     (BaseRenderer.layer_ids, BaseRenderer.layer_shapes): Rename to
1324     layer_shapes and make it return an iterator containg shapes
1325     instead of a list of ids.
1326     (BaseRenderer.draw_shape_layer): Update doc-string; Adapt to
1327     layer_shapes() change
1328    
1329     * Thuban/UI/renderer.py (ScreenRenderer.layer_ids)
1330     (ScreenRenderer.layer_shapes): Rename as in BaseRenderer
1331    
1332     * Thuban/UI/viewport.py (ViewPort._find_shape_in_layer): Adapt to
1333     changes in the ShapesInRegion return value.
1334     (ViewPort._get_hit_tester): Remove commented out code
1335    
1336     * test/mockgeo.py (SimpleShapeStore.ShapesInRegion): Adapt to the
1337     new return value.
1338     (SimpleShapeStore.AllShapes): New. Implement this method too.
1339    
1340     * test/test_layer.py (TestLayer.test_arc_layer)
1341     (TestLayer.test_polygon_layer, TestLayer.test_point_layer)
1342     (TestLayer.test_point_layer_with_projection)
1343     (TestLayer.test_derived_store): Adapt to changes in the
1344     ShapesInRegion return value.
1345    
1346     * test/test_shapefilestore.py
1347     (TestShapefileStoreArc.test_shapes_in_region)
1348     (TestShapefileStorePolygon.test_shapes_in_region)
1349     (TestShapefileStorePoint.test_shapes_in_region): Adapt to changes
1350     in the ShapesInRegion return value.
1351     (TestShapefileStorePoint.test_all_shapes)
1352     (TestShapefileStoreArc.test_shape_shapeid): New tests for the new
1353     methods
1354    
1355     * test/test_derivedshapestore.py
1356     (TestDerivedShapeStore.test_shapes_in_region): Adapt to changes in
1357     the ShapesInRegion return value.
1358     (TestDerivedShapeStore.test_all_shapes)
1359     (TestDerivedShapeStore.test_shape_shapeid): New tests for the new
1360     methods
1361    
1362     2003-08-15 Bernhard Herzog <[email protected]>
1363    
1364 bh 1592 Make the renderers deal correctly with raw vs. python level
1365     representation of shape geometries
1366    
1367     * Thuban/UI/baserenderer.py (BaseRenderer.low_level_renderer):
1368     Return a flag useraw in addition to the callable and the parameter
1369     to indicate whether the callable can deal with the raw shape data
1370     or uses the higher level python lists of coordinates. The callable
1371     now should accept either the raw data or the return value of the
1372     shape's Points() method.
1373     (BaseRenderer.draw_shape_layer): Adapt to the low_level_renderer
1374     change
1375     (BaseRenderer.projected_points): Instead of the shape id use the
1376     points list as parameter.
1377     (BaseRenderer.draw_polygon_shape, BaseRenderer.draw_arc_shape)
1378     (BaseRenderer.draw_point_shape): Adapt to projected_points()
1379     change and accept the points list as parameter instead of the
1380     shape id.
1381    
1382     * Thuban/UI/renderer.py (MapRenderer.low_level_renderer): Return
1383     the useraw flag as required by the BaseRenderer
1384     (ScreenRenderer.draw_shape_layer): Adapt to low-level renderer
1385     changes.
1386    
1387     * test/test_baserenderer.py
1388     (TestBaseRenderer.test_point_with_classification): New test for
1389     rendering a map with classifications.
1390    
1391     2003-08-15 Bernhard Herzog <[email protected]>
1392    
1393 bh 1590 * Thuban/UI/viewport.py (ViewPort.find_shape_at)
1394     (ViewPort._find_shape_in_layer, ViewPort._find_shape_in_layer)
1395     (ViewPort._get_hit_tester, ViewPort.projected_points)
1396     (ViewPort._hit_point, ViewPort._hit_arc, ViewPort._hit_polygon)
1397     (ViewPort._find_label_at): Split the find_shape_at method into
1398     several new methods and use the functions in the hit-test module.
1399    
1400     * Thuban/UI/hittest.py: New module with Python-level hit-testing
1401     functions
1402    
1403     * test/test_hittest.py: New. Test for the new hittest module
1404    
1405     2003-08-15 Bernhard Herzog <[email protected]>
1406    
1407 bh 1588 * Thuban/Model/layer.py (Layer.ShapesInRegion): Apply the layer
1408     projection to all corners of the bounding box to get a better
1409     approximation of the projected bounding box
1410    
1411     * test/test_layer.py (TestLayer.test_point_layer_with_projection):
1412     New. Test coordinate handling of a layer with a projection.
1413     Catches the bug fixed in Layer.ShapesInRegion
1414    
1415     2003-08-15 Bernhard Herzog <[email protected]>
1416    
1417 bh 1586 Move some of the mock objects in test_baserenderer into their own
1418     module so they can easily be used from other tests
1419    
1420     * test/mockgeo.py: New test helper module with some mock objects
1421     for geometry related things like shapes, shapestores and
1422     projections.
1423    
1424     * test/test_mockgeo.py: New. Tests for the new helper module
1425    
1426     * test/test_baserenderer.py: Some of the mock-objects are in
1427     mockgeo now.
1428    
1429 jan 1584 2003-08-12 Jan-Oliver Wagner <[email protected]>
1430    
1431     * Thuban/UI/about.py (About.__init__): Added Björn Broscheit.
1432    
1433 bh 1580 2003-08-12 Bernhard Herzog <[email protected]>
1434    
1435 bh 1582 * po/de.po: New. German translations by Bjoern Broscheit
1436    
1437     2003-08-12 Bernhard Herzog <[email protected]>
1438    
1439 bh 1580 * Thuban/UI/projdialog.py (UnknownProjPanel._DoLayout): Translated
1440     strings have to be one string literal.
1441    
1442 bh 1573 2003-08-11 Bernhard Herzog <[email protected]>
1443    
1444 bh 1578 * test/support.py (FloatComparisonMixin.assertPointListEquals):
1445     New. This method was used in various derived classes, but it's
1446     better to have it here.
1447    
1448     * test/test_shapefilestore.py
1449     (ShapefileStoreTests.assertPointListEquals): Removed. It's now in
1450     FloatComparisonMixin
1451    
1452     * test/test_layer.py (TestLayer.assertPointListEquals): Removed.
1453     It's now in FloatComparisonMixin
1454    
1455     * test/test_derivedshapestore.py
1456     (TestDerivedShapeStore.assertPointListEquals): Removed. It's now
1457     in FloatComparisonMixin
1458    
1459     2003-08-11 Bernhard Herzog <[email protected]>
1460    
1461 bh 1573 * Thuban/UI/join.py (JoinDialog.OnJoin): Add missing space to
1462     error message
1463    
1464 jan 1569 2003-08-08 Jan-Oliver Wagner <[email protected]>
1465    
1466 jan 1571 * Doc/manual/thuban-manual.xml: Now use authorgroup. Added revhistory
1467     with version number.
1468     Changed title to reflect version number of Thuban.
1469    
1470     2003-08-08 Jan-Oliver Wagner <[email protected]>
1471    
1472 jan 1569 * Thuban/UI/about.py (About.__init__): Reworked the hall of fame. Now
1473     the list corresponds to the "About" web page.
1474    
1475 bh 1567 2003-08-08 Bernhard Herzog <[email protected]>
1476    
1477     * Thuban/UI/projdialog.py (UTMProposeZoneDialog.dialogLayout):
1478     Make sure translated strings are recognized as one string literal.
1479    
1480     * Thuban/UI/proj4dialog.py (UTMProposeZoneDialog.dialogLayout):
1481     Make sure translated strings are recognized as one string literal.
1482    
1483     * Thuban/UI/classgen.py (ClassGenDialog.OnOK): Make sure
1484     translated strings are recognized as one string literal.
1485    
1486     * Thuban/UI/application.py (ThubanApplication.OpenSession): Make
1487     sure translated strings are recognized as one string literal.
1488    
1489 bh 1556 2003-08-07 Bernhard Herzog <[email protected]>
1490    
1491 bh 1565 * Thuban/Model/data.py (DerivedShapeStore.RawShapeFormat): New.
1492     Simply delegates to the original shapestore.
1493    
1494     * test/test_derivedshapestore.py
1495     (TestDerivedShapeStore.test_raw_format): New. Test case for
1496     DerivedShapeStore.RawShapeFormat
1497    
1498     2003-08-07 Bernhard Herzog <[email protected]>
1499    
1500 bh 1561 Add raw data interface to shape objects.
1501    
1502     * Thuban/Model/data.py (ShapefileShape, Shape): Rname the shape
1503     class to ShapefileShape which now holds shapefile specific
1504     information.
1505     (ShapefileShape.compute_bbox): Simplified to not cache any
1506     information. The way this method is used that shouldn't matter
1507     performance wise.
1508     (ShapefileShape.RawData): New. Return the shapeid which is the raw
1509     data format for shapes from shapefiles.
1510     (ShapefileStore.RawShapeFormat): New. Return the raw datatype used
1511     in the shape objects returned by a shapestore. For a
1512     ShapefileStore this is always RAW_SHAPEFILE.
1513     (RAW_PYTHON, RAW_SHAPEFILE): Constants for the RawShapeFormat
1514     method.
1515    
1516     * test/test_shapefilestore.py
1517     (TestShapefileStore.test_raw_format): New test to test the raw
1518     format feature of shapes.
1519    
1520 bh 1560 * Thuban/Model/layer.py: Remove the unused import of Shape from
1521     data. It was only there for interface compatibility but it's not
1522 bh 1561 used inside of Thuban and the generic Shape class has gone away.
1523 bh 1560
1524 bh 1563 * Thuban/UI/renderer.py (MapRenderer.low_level_renderer): Check
1525     the raw data format and only use an optimized version of its a
1526     shapefile.
1527    
1528 bh 1561 2003-08-07 Bernhard Herzog <[email protected]>
1529    
1530 bh 1559 * test/test_baserenderer.py (SimpleShape): Shape class for the
1531     tests.
1532     (SimpleShapeStore.Shape): Use SimpleShape instead of
1533     Thuban.Model.data.Shape to make the tests independed of the coming
1534     changes.
1535    
1536     2003-08-07 Bernhard Herzog <[email protected]>
1537    
1538 bh 1556 * test/support.py (SkipTest, ThubanTestResult, ThubanTestRunner)
1539     (ThubanTestProgram): New classes that extend the respective
1540     classes from unittest. These new version support skipping tests
1541     under certain expected conditions. In the Thuban test suite we
1542     uses this for tests that require the optional gdal support.
1543     (run_tests): Use ThubanTestProgram instead of the unittest.main()
1544    
1545     * test/runtests.py (main): Use the new ThubanTestRunner instead of
1546     the normal one from unittest
1547    
1548     * test/test_layer.py (TestLayer.test_raster_layer): If this test
1549     is not run because gdal support isn't available report this to the
1550     runner.
1551    
1552     * test/test_baserenderer.py
1553     (TestBaseRenderer.test_raster_no_projection): Do not run this test
1554     if gdal support isn't available and report this to the runner.
1555    
1556 bh 1553 2003-08-06 Bernhard Herzog <[email protected]>
1557    
1558     Rearrange the renderers a bit, partly in preparation for changes
1559     required for the postgis merge, partly to make it more testable.
1560     Also make the representation of coordinates in Shapes more
1561     consistent.
1562    
1563     * Thuban/UI/renderer.py (MapRenderer): Most of the code/methods in
1564     this class is now in BaseRenderer. This class is now practically
1565     only a specialization of BaseRenderer for rendering to an actual
1566     wx DC.
1567     (ScreenRenderer.draw_shape_layer): Use self.low_level_renderer()
1568     to get the shapetype specific rendering functions.
1569    
1570     * Thuban/UI/baserenderer.py: New file with the basic rendering
1571     logic. The code in this file is completely independend of wx.
1572     (BaseRenderer): Class with the basic rendering logic
1573    
1574     * test/test_baserenderer.py: New. Test cases for BaseRenderer
1575    
1576     * Thuban/UI/view.py (MapCanvas.__init__): New instance variable
1577     error_on_redraw to guard agains endless loops and stack overflows
1578     when there's a bug in the rendering code that raises exceptions.
1579     (MapCanvas.OnIdle, MapCanvas._do_redraw): Split the actual
1580     rendering into a separate method _do_redraw so that error handling
1581     is a bit easier. When an exception occurs, set error_on_redraw to
1582     true. When it's true on entry to OnIdle do nothing and return
1583     immediately.
1584    
1585     * Thuban/Model/data.py (ShapefileStore.Shape): For consistency, a
1586     Shape object will always have the coordinates as a list of list of
1587     coordinate pairs (tuples).
1588     (Shape.compute_bbox): Adapt to new representation.
1589    
1590     * Thuban/UI/viewport.py (ViewPort.find_shape_at)
1591     (ViewPort.LabelShapeAt): Adapt to new coordinate representation in
1592     Shape objects.
1593    
1594     * test/test_shapefilestore.py
1595     (ShapefileStoreTests.assertFloatTuplesEqual)
1596     (ShapefileStoreTests.assertPointListEquals): Rename to
1597     assertPointListEquals and change purpose to checking equality of
1598     the lists returned by Shape.Points().
1599     (TestShapefileStoreArc.test_shape)
1600     (TestShapefileStorePolygon.test_shape)
1601     (TestShapefileStorePoint.test_shape): Use the new
1602     assertPointListEquals instead of assertFloatTuplesEqual
1603    
1604     * test/test_layer.py (TestLayer.assertFloatTuplesEqual)
1605     (TestLayer.assertPointListEquals): Rename to assertPointListEquals
1606     and change purpose to checking equality of the lists returned by
1607     Shape.Points().
1608     (TestLayer.test_arc_layer, TestLayer.test_arc_layer)
1609     (TestLayer.test_polygon_layer, TestLayer.test_point_layer)
1610     (TestLayer.test_derived_store): Use the new assertPointListEquals
1611     instead of assertFloatTuplesEqual
1612    
1613     * test/test_derivedshapestore.py
1614     (TestDerivedShapeStore.assertFloatTuplesEqual)
1615     (TestDerivedShapeStore.assertPointListEquals): Rename to
1616     assertPointListEquals and change purpose to checking equality of
1617     the lists returned by Shape.Points().
1618     (TestDerivedShapeStore.test_shape): Use the new
1619     assertPointListEquals instead of assertFloatTuplesEqual
1620    
1621 jan 1550 2003-08-06 Jan-Oliver Wagner <[email protected]>
1622    
1623     * Thuban/UI/projdialog.py (UTMPanel._OnPropose): Added test for
1624     a bounding box. A dialog is raised in case, no bounding box
1625     is found. This fixes bug #2043:
1626     https://intevation.de/rt/webrt?serial_num=2043
1627    
1628 bh 1548 2003-08-05 Bernhard Herzog <[email protected]>
1629    
1630     * Thuban/Model/color.py (Color.__repr__): Make the repr of a color
1631     object look like a Color instantiation. Formerly it looked like a
1632     tuple.
1633    
1634     * test/test_color.py (TestColor.test_repr)
1635     (TestColor.test_equality, TestColor.test_inequality): New. test
1636     some more apects of the Color class
1637     (TestTransparent.test_repr, TestTransparent.test_hex)
1638     (TestTransparent.test_equality): New. Test cases for the
1639     Transparent object.
1640    
1641 jan 1545 2003-08-04 Jan-Oliver Wagner <[email protected]>
1642    
1643     * Doc/manual/thuban-manual.xml: a number of small improvements.
1644     The resulting file is the version submitted for GREAT-ER II.
1645    
1646 bh 1540 2003-08-01 Bernhard Herzog <[email protected]>
1647    
1648 bh 1543 * Thuban/UI/resource.py, Thuban/UI/projdialog.py,
1649     Thuban/UI/join.py, Thuban/UI/classgen.py, Thuban/UI/about.py,
1650     Thuban/Model/resource.py: Insert cvs keywords and doc-strings.
1651    
1652     * Thuban/UI/common.py: Insert cvs keywords and doc-strings.
1653     (Color2wxColour, wxColour2Color, ThubanBeginBusyCursor)
1654     (ThubanEndBusyCursor): Add doc-strings
1655    
1656     2003-08-01 Bernhard Herzog <[email protected]>
1657    
1658 bh 1540 First step towards PostGIS integration. More abstraction by movin
1659     more code from the layer to the shapestore. More methods of the
1660     layer are now simply delegated to the equivalent method of the
1661     shapestore. The SHAPETYPE_* constants are now in data not in
1662     layer.
1663    
1664     * Thuban/Model/data.py (SHAPETYPE_POLYGON, SHAPETYPE_ARC)
1665     (SHAPETYPE_POINT, Shape): Move these constants and classes from
1666     layer.py to data.py
1667     (ShapefileStore.__init__): More Initialization for the new methods
1668     and functionality.
1669     (ShapefileStore.ShapeType, ShapefileStore.NumShapes)
1670     (ShapefileStore.BoundingBox, ShapefileStore.ShapesInRegion)
1671     (ShapefileStore.Shape): New methods that were formerly implemented
1672     in the layer.
1673     (DerivedShapeStore.Shape, DerivedShapeStore.ShapesInRegion)
1674     (DerivedShapeStore.ShapeType, DerivedShapeStore.NumShapes)
1675     (DerivedShapeStore.BoundingBox): New. DerivedShapeStore
1676     equivalents of the new shape methods. These versions are simply
1677     delegated to the original shapstore.
1678    
1679     * Thuban/Model/layer.py (SHAPETYPE_POLYGON, SHAPETYPE_ARC)
1680     (SHAPETYPE_POINT, Shape): Removed. They're now in data.py
1681     (Layer.SetShapeStore): Removed the initializatin of instance
1682     variables that were needed for the stuff that's now in
1683     ShapefileStore
1684     (Layer.BoundingBox, Layer.NumShapes, Layer.ShapeType)
1685     (Layer.Shape, Layer.ShapesInRegion): Simply delegate to the
1686     shapestore.
1687    
1688     * Thuban/UI/classifier.py, Thuban/UI/renderer.py,
1689     Thuban/UI/viewport.py: Import the SHAPETYPE_* constants from data
1690     instead of layer.
1691    
1692     * test/test_shapefilestore.py: New. Tests for ShapefileStore.
1693    
1694     * test/test_derivedshapestore.py: New. Tests for DerivedShapeStore.
1695    
1696     * test/test_layer.py: Import the SHAPETYPE_* constants from data
1697     instead of layer.
1698     (TestLayer.test_derived_store): Remove the test for the exception
1699     when instantiating the DerivedShapeStore with an incompatible
1700     table which is now in test_derivedshapestore.py. Add some more
1701     tests of the layer methods to determine whether they work for a
1702     DerivedShapeStore as well.
1703    
1704 jonathan 1534 2003-07-31 Jonathan Coles <[email protected]>
1705    
1706     * Doc/manual/thuban-manual.xml: Fix the list of required packages
1707     by just listing the name and where they can be found.
1708    
1709 frank 1532 2003-07-31 Frank Koormann <[email protected]>
1710    
1711     * Doc/manual/thuban-manual.xml:
1712     Changed the screenshot elements to figure.
1713     Changed some variablelist elements to itemizedlist.
1714     Added section on GDAL formats.
1715    
1716 jonathan 1531 2003-07-31 Jonathan Coles <[email protected]>
1717    
1718     * Doc/manual/thuban-manual.xml: Added a few sentences about
1719     the Fix Border Color option when generating classes.
1720    
1721 jonathan 1529 2003-07-30 Jonathan Coles <[email protected]>
1722    
1723     * Thuban/Model/classgen.py: Add docstrings. Rename specific
1724     Ramp instances to use lower_case_style.
1725    
1726     * Thuban/UI/classgen.py: Use renamed Ramp instances.
1727    
1728     * Thuban/UI/classifier.py: Add docstrings.
1729    
1730     * Thuban/UI/dock.py: Add docstrings.
1731    
1732     * test/test_classgen.py: Use renamed Ramp instances.
1733    
1734 bh 1522 2003-07-30 Bernhard Herzog <[email protected]>
1735    
1736 bh 1524 * Thuban/Lib/connector.py (QueueingPublisher): Removed. This class
1737     was never used in Thuban.
1738    
1739     2003-07-30 Bernhard Herzog <[email protected]>
1740    
1741 bh 1522 * Thuban/UI/join.py (JoinDialog.__init__): Use the table's Title()
1742     method directly instead of going through the transient_table
1743     method. This faster because transient_table may force the copy of
1744     a DBF file into the transient database and setting a table's title
1745     doesnm't affect the title of the associated transient table, so
1746     this fixes RT #2042
1747    
1748     * Thuban/UI/main.py (__version__): Don't import the already
1749     removed show_exception_dialog.
1750    
1751 jonathan 1517 2003-07-29 Jonathan Coles <[email protected]>
1752    
1753 jonathan 1519 * Thuban/UI/application.py (ThubanApplication.ShowExceptionDialog):
1754     Put back this method and remove the equivalent function since we
1755     are setting the exception hook from within this class (OnInit).
1756    
1757     2003-07-29 Jonathan Coles <[email protected]>
1758    
1759 jonathan 1517 * Doc/manual/images/5_2_custom_ramp.png,
1760     Doc/manual/images/5_2_quantiles.png,
1761     Doc/manual/images/5_2_uniform_dist.png,
1762     Doc/manual/images/5_2_unique_values.png,
1763     Doc/manual/images/8_int_error.png: New screen shots.
1764    
1765     * Doc/manual/thuban-manual.xml: Fixed typos and wording, clarified
1766     some points, and added more screen shots.
1767    
1768 bh 1512 2003-07-29 Bernhard Herzog <[email protected]>
1769    
1770 bh 1516 * Thuban/Model/data.py: Remove the now unused import of warnings
1771    
1772     2003-07-29 Bernhard Herzog <[email protected]>
1773    
1774 bh 1514 * Thuban/Model/data.py (SimpleStore): Removed. This class has been
1775     deprecated since before the 0.8 release and isn't used in Thuban
1776     itself anymore.
1777    
1778 bh 1512 * Thuban/Model/transientdb.py: Remove some unnecessary imports
1779    
1780 jonathan 1503 2003-07-29 Jonathan Coles <[email protected]>
1781 jonathan 1506
1782     * Thuban/UI/application.py (ThubanApplication.OnInit): set the
1783     python exception hook here so that we are sure to catch any
1784     Thuban exception that happen during initialization.
1785    
1786     * Thuban/UI/main.py (main): Don't set the exception hook here,
1787     it will get set in ThubanApplication.OnInit.
1788    
1789     2003-07-29 Jonathan Coles <[email protected]>
1790 jonathan 1503
1791     * Thuban/UI/application.py (ThubanApplication.ShowExceptionDialog):
1792     Removed and called it show_exception_dialog() so that the exception
1793     handler can be set before the class is created.
1794    
1795     * Thuban/UI/main.py (main): Install the exception handler before
1796     a ThubanApplication is created.
1797    
1798 bh 1500 2003-07-29 Bernhard Herzog <[email protected]>
1799    
1800     * po/it.po: New. Italian translation by Maurizio Napolitano
1801    
1802     * po/ru.po: New. Russian translation by Alex Shevlakov
1803    
1804 frank 1497 2003-07-29 Frank Koormann <[email protected]>
1805    
1806 frank 1508 * Doc/manual/thuban-manual.xml: Extended section on supported
1807     projections.
1808    
1809     2003-07-29 Frank Koormann <[email protected]>
1810    
1811 frank 1497 * Doc/manual/thuban-manual.xml: gaspell-checked.
1812    
1813 jonathan 1493 2003-07-29 Jonathan Coles <[email protected]>
1814    
1815 jonathan 1495 * Doc/manual/images/3_5_legend.png: Added border to improve look
1816     on white background.
1817    
1818     2003-07-29 Jonathan Coles <[email protected]>
1819    
1820 jonathan 1493 * Doc/manual/thuban-manual.xml: Fixed grammar and typos. Added
1821     descriptions for the legend toolbar.
1822    
1823     * Doc/manual/images/4_2_raster_layer_properties.png: Removed
1824     cursor from dialog box.
1825    
1826     2003-07-28 Jonathan Coles <[email protected]>
1827    
1828     * Doc/manual/thuban-manual.xml: More screenshots and more chapters.
1829    
1830     * Doc/manual/images/2_4_session_tree.png,
1831     Doc/manual/images/3_5_legend.png, Doc/manual/images/3_rename_map.png,
1832     Doc/manual/images/4_2_layer_properties.png,
1833     Doc/manual/images/4_2_raster_layer_properties.png,
1834     Doc/manual/images/5_3_genclass.png,
1835     Doc/manual/images/5_classification.png,
1836     Doc/manual/images/6_projection.png,
1837     Doc/manual/images/7_1_table_view.png,
1838     Doc/manual/images/7_2_5_join.png: New screenshots.
1839    
1840     2003-07-24 Jonathan Coles <[email protected]>
1841    
1842     * Doc/manual/thuban-manual.xml: Chapter on Projection Management.
1843    
1844     2003-07-24 Jonathan Coles <[email protected]>
1845    
1846     * Doc/manual/thuban-manual.xml: Added EPS images and wrote
1847     chapter on Layer Management.
1848    
1849     * Doc/manual/Makefile: New. Makefile to generate all formats for the
1850     manual and images.
1851    
1852 bh 1483 2003-07-24 Bernhard Herzog <[email protected]>
1853    
1854     * Thuban/Model/range.py, Thuban/version.py: Remove the #! line as
1855     it annoys lintian which warns about these files not being
1856 jan 1767 executable. The #! isn't necessary here since if you absolutely
1857 bh 1483 must execute them you can always say "python <filename>".
1858    
1859     * Thuban/UI/renderer.py (ScreenRenderer.draw_shape_layer): Remove
1860     superfluous code to set brush and pen for point shapes
1861    
1862     * Thuban/UI/viewport.py: Remove commented out code that wouldn't
1863     belong in viewport anyway
1864    
1865 frank 1479 2003-07-24 Frank Koormann <[email protected]>
1866    
1867     * Doc/manual/thuban-manual.xml: Added section on table management.
1868    
1869 bh 1477 2003-07-24 Bernhard Herzog <[email protected]>
1870    
1871     * test/runtests.py (main): Recognize the long "verbose" option
1872     correctly.
1873    
1874 jonathan 1470 2003-07-22 Jonathan Coles <[email protected]>
1875    
1876     * Doc/manual/thuban-manual.xml: Continue to write first revision
1877     of the manual.
1878    
1879     * Thuban/UI/renderer.py (MapRenderer.render_map): Wrap method
1880     with Begin/EndDrawing() calls to ensure we aren't doing to
1881     many updates to the dc during rendering.
1882     (ScreenRenderer.draw_shape_layer): self.draw_point_shape takes
1883     a pen and brush argument so they need to be passed to the function.
1884    
1885     * Thuban/UI/viewport.py (ViewPort.calc_min_max_scales): New.
1886     Calculates the minimum and maximum scale values. Factored out
1887     of set_view_transform so that it could be used to zoom all the
1888     way into a single point.
1889     (ViewPort.set_view_transform): Call calc_min_max_scales().
1890     (ViewPort.FitSelectedToWindow): Zoom to the maximum scale
1891     if only a single point is selected.
1892    
1893     * Doc/manual/images/1_2_legend_close.png,
1894     Doc/manual/images/1_2_legend_dock.png,
1895     Doc/manual/images/1_2_mainwindow.png,
1896     Doc/manual/images/1_2_mainwindow.ps,
1897     Doc/manual/images/1_2_mainwindow.sk,
1898     Doc/manual/images/3_2_fullextent.png,
1899     Doc/manual/images/3_2_fulllayerextent.png,
1900     Doc/manual/images/3_2_fullshapeextent.png,
1901     Doc/manual/images/3_2_pan.png,
1902     Doc/manual/images/3_2_zoomin.png,
1903     Doc/manual/images/3_2_zoomout.png,
1904     Doc/manual/images/3_3_identify.png,
1905     Doc/manual/images/3_3_label.png,
1906     Doc/manual/images/3_5_invisible.png,
1907     Doc/manual/images/3_5_movedown.png,
1908     Doc/manual/images/3_5_moveup.png,
1909     Doc/manual/images/3_5_props.png,
1910     Doc/manual/images/3_5_tobottom.png,
1911     Doc/manual/images/3_5_totop.png,
1912     Doc/manual/images/3_5_visible.png: New. Images for the documentation.
1913    
1914 bh 1451 2003-07-18 Bernhard Herzog <[email protected]>
1915    
1916 bh 1465 * Thuban/UI/messages.py (MAP_REPLACED): New message.
1917    
1918     * Thuban/UI/viewport.py (ViewPort.SetMap): Issue MAP_REPLACED
1919     after the new map has been assigned
1920    
1921     * Thuban/UI/mainwindow.py (MainWindow.delegated_messages):
1922     Delegate MAP_REPLACED to the canvas too
1923     (MainWindow.prepare_new_session): Removed. Thanks to the new
1924     MAP_REPLACED message it's no longer needed
1925     (MainWindow.OpenSession, MainWindow.NewSession):
1926     prepare_new_session has been removed.
1927    
1928     * Thuban/UI/classifier.py (Classifier.__init__): Subscribe to
1929     MAP_REPLACED so that we can close the dialog if a new map is set.
1930     (Classifier.unsubscribe_messages): Unsubscribe from MAP_REPLACED
1931     (Classifier.map_replaced): Handle MAP_REPLACED by closing the
1932     dialog
1933    
1934     * test/test_viewport.py (SimpleViewPortTest)
1935     (SimpleViewPortTest.test_default_size): Add doc-strings
1936     (ViewPortTest.setUp): Bind map to self.map so we can use it in
1937     tests. Subscribe to MAP_REPLACED messages too.
1938     (ViewPortTest.tearDown): No need to explicitly unsubscribe
1939     (ViewPortTest.test_set_map): New test for the SetMap method.
1940    
1941     2003-07-18 Bernhard Herzog <[email protected]>
1942    
1943 bh 1463 * test/test_viewport.py (SimpleViewPortTest.test_default_size):
1944     Move this test from ViewPortTest.setUp to this new separate test
1945     case. setUp is not the place for the actual tests.
1946     (ViewPortTest.test_inital_settings, ViewPortTest.setUp): Move some
1947     more of the test from setUp to the new test test_inital_settings.
1948     (ViewPortTest.test_win_to_proj, ViewPortTest.test_proj_to_win)
1949     (ViewPortTest.test_proj_conv): Split test_proj_conv into
1950     test_win_to_proj and test_proj_to_win and make the tests easier to
1951     understand
1952     (ViewPortTest.testFitRectToWindow, ViewPortTest.testZoomFactor)
1953     (ViewPortTest.testZoomOutToRect, ViewPortTest.testTranslate)
1954     (ViewPortTest.test_unprojected_rect_around_point)
1955     (ViewPortTest.test_find_shape_at, ViewPortTest.testTools):
1956     Reformat to increase readability.
1957    
1958     2003-07-18 Bernhard Herzog <[email protected]>
1959    
1960 bh 1461 * Thuban/UI/view.py (MapCanvas.OnLeftDown): Capture the mouse.
1961    
1962     2003-07-18 Bernhard Herzog <[email protected]>
1963    
1964 bh 1459 * test/runtests.py: The test suite can now be run without an X
1965     connection. To make sure this remains true, remove the DISPLAY
1966     environment variable so that an error occurs if the wxGTK is
1967     imported accidentally
1968    
1969     2003-07-18 Bernhard Herzog <[email protected]>
1970    
1971 bh 1457 * Thuban/UI/viewport.py: Remove unused imports
1972    
1973     * Thuban/UI/view.py: Remove unused imports
1974    
1975     2003-07-18 Bernhard Herzog <[email protected]>
1976    
1977 bh 1455 * test/test_export.py Remove unused imports. The OutputTransform
1978     function is now in viewport.py and is called output_transform
1979     (TestScalebar.test_output_transform)
1980     (TestScalebar.test_OutputTransform): Renamed to
1981     test_output_transform and updated to use output_transform instead
1982     of OutputTransform
1983    
1984     * Thuban/UI/view.py (OutputTransform): Moved to viewport.py and
1985     renamed.
1986     (MapCanvas.Export, MapPrintout.draw_on_dc): OutputTransform was
1987     renamed to output_transform
1988    
1989     * Thuban/UI/viewport.py (OutputTransform, output_transform):
1990     Rename to output_transform
1991    
1992     2003-07-18 Bernhard Herzog <[email protected]>
1993    
1994 bh 1453 * Thuban/Model/layer.py (Layer.__init__): Rename
1995     classificationField to classificatin_column and init it here so
1996     that it can be used in SetClassificationColumn
1997     (Layer.GetClassificationColumn, Layer.GetClassificationField):
1998     Rename to GetClassificationColumn.
1999     (Layer.SetClassificationColumn, Layer.SetClassificationField):
2000     Rename to SetClassificationColumn and issue a LAYER_CHANGED
2001     message if the column changes.
2002     (Layer._classification_changed, Layer.ClassChanged): Rename to
2003     _classification_changed. Update the callers.
2004     (Layer.SetShapeStore): Further field->column renames.
2005    
2006     * Thuban/Model/load.py (SessionLoader.start_classification)
2007     (SessionLoader.start_clpoint): Updates because of
2008     field->column method name changes in the Layer class
2009    
2010     * Thuban/Model/save.py (SessionSaver.write_classification): Updates
2011     because of field->column method name changes in the Layer class
2012    
2013     * Thuban/UI/classifier.py (Classifier.__init__)
2014     (Classifier._OnTry, Classifier._OnRevert): Updates because of
2015     field->column method name changes in the Layer class
2016    
2017     * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Updates
2018     because of field->column method name changes in the Layer class
2019    
2020     * Thuban/UI/viewport.py (ViewPort.find_shape_at): Updates because
2021     of field->column method name changes in the Layer class
2022    
2023     * test/test_save.py (SaveSessionTest.testClassifiedLayer)
2024     (SaveSessionTest.testClassifiedLayer): Update because of
2025     field->column method name changes in the Layer class
2026    
2027     * test/test_layer.py (SetShapeStoreTests.setUp)
2028     (SetShapeStoreTests.test_sanity): Update because of field->column
2029     method name changes in the Layer class
2030     (TestLayerModification.setUp): Subscribe to LAYER_CHANGED as well
2031     (TestLayerModification.test_sanity)
2032     (TestLayerModification.test_initial_settings): remove unsued code
2033     and rename to test_sanity.
2034     (TestLayerModification.test_set_classification): New test for
2035     SetClassification and SetClassificationField.
2036    
2037     2003-07-18 Bernhard Herzog <[email protected]>
2038    
2039 bh 1451 * test/test_classgen.py (TestFixedRamp.test): Extend test to check
2040     the non-fixed values as well. The old test would have accepted a
2041     fixed ramp that only returnes the fixed properties
2042    
2043 jonathan 1449 2003-07-17 Jonathan Coles <[email protected]>
2044    
2045     * Doc/manual/mainwindow.png, Doc/manual/mainwindow.xcf: Screen
2046     shots for the manual. The XCF file is the source image and
2047     has additional layers to support changes.
2048    
2049     * Doc/manual/thuban-manual.xml: Wrote an initial Introduction.
2050    
2051     * Thuban/UI/classifier.py (Classifier.__BuildClassification):
2052     Return both the new class and the field name.
2053    
2054     * Thuban/UI/mainwindow.py (MainWindow.ToggleLegend): Don't
2055     fit the map to the window as this changes any zoom level that
2056     the user may have set.
2057    
2058 jonathan 1442 2003-07-16 Jonathan Coles <[email protected]>
2059    
2060     * Thuban/Model/classgen.py (generate_singletons,
2061     generate_uniform_distribution, generate_quantiles): Remove
2062     fixes parameter, but maintain the same functionality by having
2063     the calling function pass a FixedRamp object for the ramp.
2064     (FixedRamp): New. Adapts a ramp to have fixed property values.
2065    
2066     * Thuban/Model/classification.py: Use new CLASS_CHANGED message.
2067     (Classification): Inherit from Publisher.
2068     (Classification.__init__): Remove the layer parameter.
2069     Classifications no longer need to have a parent layer.
2070     (Classification.GetField, Classification.GetFieldType,
2071     Classification.SetFieldInfo): Removed. The field name is stored
2072     in the layer, and the type can be retreived by calling
2073     Layer.GetFieldType().
2074     (Classification._set_layer, Classification.GetLayer): Removed.
2075     Classifications no longer have a parent layer.
2076    
2077     * Thuban/Model/layer.py (Layer.Destroy): Unsubscribe from the
2078     classification.
2079     (Layer.SetShapeStore): Reset the classification first while
2080     we still have the old shape store to work with.
2081     (Layer.GetClassificationField, Layer.SetClassificationField):
2082     New. Method for getting/setting the field to classify on.
2083     (Layer.SetClassification): Simplified now that the layer
2084     simply has to hold a reference to the classification and not
2085     tell the classification who owns it.
2086     Fixes RTbug #2023.
2087    
2088     * Thuban/Model/load.py (SessionLoader.start_classification):
2089     Set the field name on the layer, not the classification.
2090    
2091     * Thuban/Model/messages.py: Add CLASS_CHANGED for when a
2092     classification is modified.
2093    
2094     * Thuban/Model/save.py (SessionSaver.write_classification):
2095     Get the field name and type from the layer.
2096    
2097     * Thuban/Model/table.py (table_to_dbf, table_to_csv): Renamed
2098     parameter records to rows and add docstring. Fixes RTbug #1997.
2099    
2100     * Thuban/UI/classgen.py (ClassGenDialog.OnOK): Use a fixed
2101     ramp when we need to fix certain values of a ramp rather than
2102     using the old fixes parameter. Fixes RTbug #2024.
2103    
2104     * Thuban/UI/classifier.py (ClassGrid.CreateTable): Add fieldType
2105     parameter.
2106     (ClassTable.Reset): Add fieldType parameter and use it, rather
2107     than asking the classification.
2108     (Classifier.__init__): Remember the original class's field
2109     and ask the layer for the field type, rather than the classification.
2110     (Classifier.__SetGridTable): Retrieve the field and field type
2111     for the table because they are not in the classification.
2112     (Classifier._OnTry, Classifier._OnRevert): Set the classification
2113     field on the layer in addition to the classification itself.
2114    
2115     * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Get the
2116     classification field from layer.
2117    
2118     * Thuban/UI/viewport.py (ViewPort.find_shape_at): Get the
2119     classification field from layer. Split up tests and remove
2120     *-imports. Fixes RTbug #1992.
2121    
2122     * test/test_classgen.py (TestFixedRamp): Test for the FixedRamp class.
2123    
2124     * test/test_classification.py
2125     (TestClassification.test_classification): Remove tests for methods
2126     that no longer exist.
2127    
2128     * test/test_layer.py (SetShapeStoreTests.setUp): Classification
2129     __init__ no longer has a field parameter, use SetClassificationField.
2130     (SetShapeStoreTests.test_sanity): Use layer object to get class
2131     field info.
2132    
2133     * test/test_save.py (SaveSessionTest.testClassifiedLayer): Use
2134     SetClassificationField on layer to set class field info.
2135    
2136     * test/test_viewport.py: Renamed from test/test_view.py.
2137    
2138 jan 1424 2003-07-16 Jan-Oliver Wagner <[email protected]>
2139    
2140     * Doc/manual/thuban-manual.xml: Added authors and an initial
2141     coarse structure.
2142    
2143 bh 1418 2003-07-15 Bernhard Herzog <[email protected]>
2144    
2145 bh 1422 * test/support.py (FloatComparisonMixin): This is a mix-in class
2146     and therefore should not be derived from any other class.
2147    
2148     * test/test_range.py (RangeTest): FloatComparisonMixin is a
2149     mix-in, so derive from TestCase as well.
2150    
2151     2003-07-15 Bernhard Herzog <[email protected]>
2152    
2153 bh 1420 * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Rework the
2154     draw_func handling a bit to remove one layer of indirection. This
2155     makes the renderer about 10% faster in the non-classifying case
2156     and the code a bit cleaner
2157     (MapRenderer.draw_point_shape): Add the pen and brush parameters
2158     and set them in the dc. Now the draw_point_shape method and
2159     wxproj's draw_polygon_shape function have basically the same
2160     signature so that both can be directly used as draw_func
2161    
2162     2003-07-15 Bernhard Herzog <[email protected]>
2163    
2164 bh 1418 * Thuban/Model/save.py (SessionSaver.write_classification): Encode
2165     string values (in addition to the labels) as UTF 8
2166    
2167     * Thuban/Model/load.py (SessionLoader.start_clpoint): Decode the
2168     values if the field type is string
2169    
2170     * test/test_save.py (SaveSessionTest.testClassifiedLayer): Test
2171     saving a session with non-ascii string classification values.
2172    
2173     * test/test_load.py (TestClassification.file_contents)
2174     (TestClassification.test): Check for non-ascii values in string
2175     classifications
2176    
2177 jonathan 1416 2003-07-14 Jonathan Coles <[email protected]>
2178    
2179     * test/test_view.py: New. Tests for ViewPort.
2180    
2181 frank 1409 2003-07-14 Frank Koormann <[email protected]>
2182    
2183     * Thuban/Model/load.py (SessionLoader.start_map): Encode map
2184     title to latin1. Fixes https://intevation.de/rt/webrt?serial_num=2013
2185    
2186 frank 1411 * test/test_load_0_8.py (TestUnicodeStrings): New, test load of
2187     unicode strings from session file: session title, map title and
2188     projection name.
2189    
2190 jonathan 1403 2003-07-10 Jonathan Coles <[email protected]>
2191    
2192 jonathan 1406 * Thuban/UI/viewport.py (Tool.MouseUp): Should have called
2193     drag_stop, not drag_move when the mouse is released.
2194    
2195     2003-07-10 Jonathan Coles <[email protected]>
2196    
2197 jonathan 1403 The most important part of this is the seperation of view.py into
2198     two pieces. viewport.py now has a class called ViewPort which
2199     contains all the non-wx parts of view.py and can therefore be
2200     tested. view.py contains only the wx-specific parts and is fairly
2201     simple.
2202    
2203     * Thuban/UI/view.py: Stripped out all non-wx functionality. Fixes
2204     RTTbug #1992.
2205     * Thuban/UI/viewport.py: New. Contains non-wx view functionality.
2206     RTTbug #1992.
2207    
2208     * Thuban/Model/classgen.py (generate_singletons,
2209     generate_uniform_distribution, generate_quantiles):
2210     Added 'fixes' parameter so that property attributes can
2211     be held constant over the generated classification groups.
2212     (CustomRamp.GetProperties): Remove unused variables.
2213    
2214     * Thuban/Model/map.py (Map.SetProjection): Send the old
2215     projection as an argument to listeners of the MAP_PROJECTION_CHANGED
2216     event.
2217    
2218     * Thuban/Model/table.py (table_to_dbf, table_to_csv): Added 'records'
2219     parameter which is a list of records that restricts which
2220     records are saved. Fixes RTbug #1997.
2221    
2222     * Thuban/UI/application.py (ThubanApplication.ShowExceptionDialog):
2223     Port exception dialog from GREAT-ER. Fixes RTbug #1993.
2224    
2225     * Thuban/UI/classgen.py (ClassGenDialog.__init__): Add controls
2226     to allow the user to fix line color/width on generated groups.
2227     (ClassGenDialog.OnOK): Use new 'fixes' parameter of the generate_*
2228     functions to optionally fix group properties.
2229    
2230     * Thuban/UI/main.py (main): Set exception hook to the
2231     ShowExceptionDialog. Fixes RTbug #1993.
2232    
2233     * Thuban/UI/mainwindow.py (MainWindow.ShowTableView): Raise
2234     the table window when it is selectd to be shown.
2235    
2236     * Thuban/UI/tableview.py (QueryTableFrame.__init__): Add an
2237     Export Selection button and move the export buttons underneath
2238     the table.
2239     (QueryTableFrame.UpdateStatusText): Added event argument so
2240     that it can respond to grid selection events. The status text
2241     is now updated even when the table is not associated with a
2242     layer as was previously assumed.
2243     (QueryTableFrame.OnGridSelectRange, OnGridSelectCell): Removed.
2244     UpdateStatusText responds to these events.
2245     (QueryTableFrame.OnSaveAs): Renamed to doExport.
2246     (QueryTableFrame.doExport): Helper function that saves the
2247     entire table, or selected rows, to a file.
2248     (QueryTableFrame.OnExport, QueryTableFrame.OnExportSel): New.
2249     Respond to export button events and call doExport.
2250    
2251     * extensions/thuban/gdalwarp.cpp (ProjectRasterFile): Make sure
2252     the function doesn't return NULL without first setting a Python
2253     Error.
2254    
2255     * test/runtests.py (main): Only print "Unknown option" for
2256     unsupported options.
2257    
2258     * test/support.py (FloatComparisonMixin.assertFloatEqual): Take
2259     optional epsilon argument to specify floating point accuracy.
2260     (FloatComparisonMixin.assertFloatSeqEqual): Call assertFloatEqual
2261     for each item test.
2262    
2263     * test/test_csv_table.py (TestCSVTable.test_table_to_cvs): Add
2264     tests for saving selected records.
2265    
2266     * test/test_dbf_table.py (TestTableToDBF.test_table_to_dbf): Add
2267     tests for saving selected records.
2268    
2269     * test/test_map.py (TestMapWithContents.test_set_projection):
2270     MAP_PROJECTION_CHANGED events send the old projection.
2271    
2272     * test/test_session.py
2273     (TestSessionWithContent.test_forward_map_projection):
2274     MAP_PROJECTION_CHANGED events send the old projection.
2275    
2276     * test/test_table.py (TableTest): Update tests to use non-deprecated
2277     functions.
2278    
2279 bh 1376 2003-07-08 Bernhard Herzog <[email protected]>
2280    
2281 bh 1382 * Thuban/Model/transientdb.py (TransientTableBase.Width): The type
2282     constants in the column objects are the standard ones defined in
2283     the table module.
2284    
2285     * test/test_transientdb.py
2286     (TestTransientTable.test_transienttable_to_dbf): New. Test whether
2287     exporting transient tables as DBF works. This should catch the bug
2288     just fixed in TransientTableBase.Width.
2289    
2290     2003-07-08 Bernhard Herzog <[email protected]>
2291    
2292 bh 1380 * Thuban/Model/classgen.py (CustomRamp.GetProperties): Compute the
2293     interpolated colors correctly.
2294    
2295     * test/test_classgen.py (TestCustomRamp.test_color_interpolation):
2296     New. Test case for the fix in classgen.py
2297    
2298     2003-07-08 Bernhard Herzog <[email protected]>
2299    
2300 bh 1378 * test/runtests.py (main): Make the default output less verbose
2301     and add a verbosity option (-v) to get the old output
2302    
2303     2003-07-08 Bernhard Herzog <[email protected]>
2304    
2305 bh 1376 * Resources/XML/thuban-0.9.dtd: New. This will become the DTD for
2306     0.9.
2307    
2308     * Thuban/Model/transientdb.py (TransientJoinedTable.JoinType):
2309     New. Return the join type
2310    
2311     * Thuban/Model/save.py (SessionSaver.write_session): Use new 0.9
2312     DTD
2313     (SessionSaver.write_data_containers): Save the join type for
2314     joined tables
2315    
2316     * Thuban/Model/load.py (SessionLoader.__init__): Add the new 0.9
2317     namespace
2318     (SessionLoader.start_jointable): Handle the jointype attribute
2319    
2320     * test/test_load_0_8.py: New. Effectively a copy of test_load.py
2321     as of Thuban 0.8. These are now tests to determine whether Thuban
2322     can still read files generated by Thuban 0.8
2323    
2324     * test/test_load.py (LoadSessionTest.dtd)
2325     (TestSingleLayer.file_contents)
2326     (TestLayerVisibility.file_contents, TestLabels.file_contents)
2327     (TestLayerProjection.file_contents)
2328     (TestRasterLayer.file_contents, TestJoinedTable.file_contents)
2329     (TestJoinedTable.file_contents)
2330     (TestLoadError.file_contents): Update for new DTD
2331     (TestJoinedTable.file_contents, TestJoinedTable.setUp): Add test
2332     for new join type attribute
2333    
2334     * test/test_save.py (SaveSessionTest.dtd)
2335     (SaveSessionTest.testEmptySession)
2336     (SaveSessionTest.testSingleLayer)
2337     (SaveSessionTest.testLayerProjection)
2338     (SaveSessionTest.testRasterLayer)
2339     (SaveSessionTest.testClassifiedLayer)
2340     (SaveSessionTest.test_dbf_table)
2341     (SaveSessionTest.test_joined_table): Update for new DTD
2342     (SaveSessionTest.test_joined_table): Add test for new join type
2343     attribute
2344    
2345 bh 1372 2003-07-04 Bernhard Herzog <[email protected]>
2346    
2347     * Thuban/Model/table.py (_find_dbf_column_names): New. Helper
2348     function for table_to_dbf
2349     (table_to_dbf): Deal with names longer than the 10 character limit
2350    
2351     * test/test_dbf_table.py (TestTableToDBF.test_table_to_dbf): Add
2352     doc-string
2353     (TestTableToDBF.test_table_to_dbf_long_col_names): New test for
2354     long column names
2355    
2356 bh 1365 2003-07-03 Bernhard Herzog <[email protected]>
2357    
2358 bh 1370 * Doc/manual/thuban-manual.xml: Fix the CVS Revision Tag syntax
2359    
2360     2003-07-03 Bernhard Herzog <[email protected]>
2361    
2362 bh 1368 * Doc/manual/thuban-manual.xml, Doc/manual/README: New. Skeleton
2363     for the Thuban manual and README with some basic information about
2364     the manual
2365    
2366     2003-07-03 Bernhard Herzog <[email protected]>
2367    
2368 bh 1365 * Thuban/Model/transientdb.py (TransientJoinedTable.__init__):
2369     Update doc-string
2370     (TransientJoinedTable.create): Do not modify the column objects of
2371     the input tables in place and copy all columns of the input tables
2372     into the joined table after all.
2373    
2374     * test/test_transientdb.py
2375     (TestTransientTable.test_transient_joined_table_same_column_name):
2376     Update to reflect the new behavior
2377     (TestTransientTable.test_transient_joined_table_with_equal_column_names):
2378     Update to reflect the new behavior
2379     (TestTransientTable.test_transient_joined_table_name_collisions_dont_modify_in_place):
2380     New test case for a bug which modified the column objects in place
2381    
2382 jonathan 1360 2003-07-02 Jonathan Coles <[email protected]>
2383 jonathan 1349
2384 jonathan 1360 * Thuban/Model/classgen.py (generate_singletons,
2385     generate_uniform_distribution, generate_quantiles,
2386 jonathan 1363 GenQuantiles0): Make sure maxValue isn't less than
2387     one, otherwise we could divide by zero.
2388    
2389     * test/test_classgen.py (ClassGenTest.doClassRangeTest,
2390     ClassGenTest.doClassSingleTest): Call doBoundsTest to
2391     check the end classification groups against the
2392     proper property values.
2393     (ClassGenTest.doBoundsTest): New. Checks the first and
2394     last classification groups to make sure their properties
2395     are the correct upper and lower bounds for a color ramp.
2396    
2397     2003-07-02 Jonathan Coles <[email protected]>
2398    
2399     * Thuban/Model/classgen.py (generate_singletons,
2400     generate_uniform_distribution, generate_quantiles,
2401 jonathan 1360 GenQuantiles0): The denominator was one to high when
2402     calculating the index for the ramp causing the index
2403     to never to reach one.
2404    
2405     2003-07-02 Jonathan Coles <[email protected]>
2406    
2407 jonathan 1358 Changed the singature of ClassGroupRange.__init__ and
2408     ClassGroupRange.SetRange() so that the min/max values are
2409     passed as a tuple. This makes a better calling scheme for
2410     when a Range object is passed instead.
2411    
2412     * Thuban/Model/classgen.py: Fixed parameters to
2413     ClassGroupRange constructor.
2414    
2415     * Thuban/Model/classification.py (ClassGroupRange.__init__):
2416     Consolidate the min/max parameters into a single _range which
2417     can either be a tuple or a Range object.
2418     (ClassGroupRange.SetRange): Consolidate the min/max parameters
2419     into a single _range which can either be a tuple or a Range object.
2420    
2421     * Thuban/Model/load.py (SessionLoader.start_clrange): Fix
2422     call to ClassGroupRange constructor to use a tuple.
2423    
2424     * Thuban/Model/layer.py (Layer.SetClassification): Switch
2425     the classification instance variable to the new class
2426     before calling _set_layer otherwise subscribers to a
2427     LAYER_CHANGED event will not see any difference.
2428    
2429     * test/test_classification.py: Fix tests of ClassGroupRange
2430     so that they use the new signature.
2431    
2432     * test/test_load.py: Fix use of ClassGroupRange so that it
2433     uses the new signature.
2434    
2435     * test/test_load_0_2.py: Fix use of ClassGroupRange so that it
2436     uses the new signature.
2437    
2438     * test/test_save.py: Fix use of ClassGroupRange so that it
2439     uses the new signature.
2440    
2441    
2442     2003-07-01 Jonathan Coles <[email protected]>
2443    
2444 jonathan 1349 * Thuban/Model/classgen.py: Fixes RTbug #1972, 1971.
2445     Import used objects/class from color.
2446     (generate_singletons): We don't
2447     need the numGroups parameter anymore because we are using
2448     the new ramps with GetProperties().
2449     (generate_uniform_distribution): Use new ramp method
2450     GetProperties().
2451     (generate_quantiles, GenQuantiles0): Use new ramp method
2452     GetProperties().
2453     (CustomRamp.SetNumGroups): Removed. The ramps now map
2454     a value from 0 to 1 to class properties so the number
2455     of groups is not needed ahead of time.
2456     (CustomRamp.next): Removed. CustomRamp does not support
2457     interation anymore.
2458     (CustomRamp.GetProperties): Returns a ClassGroupProperties
2459     object based on the index value from 0 to 1 that is
2460     passed to it.
2461     (GreyRamp, RedRamp, GreenRamp, BlueRamp, GreenToRedRamp):
2462     Made into instances of Monochromatic class instread of
2463     deriving from it.
2464     (HotToCold.SetNumGroups): Removed. See CustomRamp.
2465     (HotToCold.next): Removed. See CustomRamp.
2466    
2467     * Thuban/Model/classification.py: Fixes RTbug #1973, 1971.
2468     (Classification.SetField, Classification.SetFieldType):
2469     Replaced with SetFieldInfo.
2470     (Classification.SetFieldInfo): New. Does a better job of
2471     what SetField and SetFieldType used to do by combining
2472     their function since they should really always be done
2473     at the same time.
2474     (Classification.SetLayer): Renamed to _set_layer.
2475     (Classification._set_layer): Should only be called from
2476     Layer's SetClassification. This does not cause a recursive
2477     call as SetLayer did because we know that Layer knows about
2478     the classification.
2479    
2480     * Thuban/Model/color.py: Fixes RTbug #1971.
2481     (_Transparent): Renamed from Transparent so it doesn't
2482     conflict with the module variable.
2483     (Transparent, Black): Renamed from Color.Transparent,
2484     Color.Black so they are not class variables.
2485    
2486     * Thuban/Model/layer.py: Fixes RTbug #1971, 1973.
2487     (Layer.Destroy): We don't need to call SetClassification
2488     anymore to clear out the back reference in the classifcation
2489     to the layer. It's better to set it to None using _set_layer,
2490     and we won't be creating another clas object too.
2491     (Layer.SetClassification): Classification._set_layer is not
2492     recursive so remove all the locking variables. Also clean
2493     up the code so that it remains unchanged if something fails.
2494    
2495     * Thuban/Model/load.py: Fixes RTbug #1971.
2496     (SessionLoader.start_classification): Call
2497     Classification.SetFieldInfo().
2498    
2499     * Thuban/Model/save.py: Removed import of Color which wasn't
2500     being used.
2501    
2502     * Thuban/UI/classgen.py: Fixes RTbug #1972.
2503     (ClassGenDialog.__init__): Color ramps are now instances
2504     already so we don't need to create any new objects.
2505     (ClassGenDialog.OnOK): Check for numGroups is no longer
2506     necessary because we never use it.
2507    
2508     * Thuban/UI/classifier.py: Fixes RTbug #1971.
2509     (Classifier.__BuildClassification, Classifier.__SetGridTable):
2510     Call Classification.SetFieldInfo() instead of SetFieldType.
2511    
2512     * Thuban/UI/renderer.py: Fixes RTbug #1971.
2513    
2514     * Thuban/UI/view.py: Fixes RTbug #1974, 1971.
2515     (MapCanvas.__init__): Subscribe to the idle time event. Set
2516     background color to white.
2517     (MapCanvas.OnPaint): Set a flag indicating that we should
2518     render the map during idle time. If we already have a bitmap
2519     just draw it now.
2520     (MapCanvas.OnIdle): New. Render the map only during idle time.
2521     This also fixes a problem with the busy cursor under gtk.
2522    
2523     * test/test_classgen.py (ClassGenTest.test_generate_singletons):
2524     Fix calls to generate_singletons because the signature changed.
2525    
2526     * test/test_classification.py: Fix color references and
2527     change calls to Classification.[SetField|SetFieldType] to
2528     SetFieldInfo.
2529    
2530     * test/test_load.py: Fix color references.
2531    
2532     * test/test_load_0_2.py: Fix color references.
2533    
2534     * test/test_save.py (SaveSessionTest.testClassifiedLayer):
2535     Change calls to Classification.[SetField|SetFieldType] to
2536     SetFieldInfo.
2537    
2538 frank 1334 2003-07-01 Frank Koormann <[email protected]>
2539    
2540     MERGE from the greater-ms3 branch.
2541    
2542     * test/test_transientdb.py
2543     (TestTransientTable.test_transient_joined_table_with_equal_column_names):
2544     New. Test join of two tables with partly equal column names.
2545    
2546     * Thuban/Model/transientdb.py (TransientJoinedTable.create):
2547     If duplicates in left and right tables column names are found,
2548     append '_' (underscores) to the name until it is unique.
2549     Create always new internal names for the resulting table and reference
2550     columns in the join statement with <table>.<column>
2551    
2552 bh 1329 2003-07-01 Bernhard Herzog <[email protected]>
2553    
2554     * test/test_transientdb.py
2555     (TestTransientTable.test_transient_joined_table_same_column_name):
2556     New. Test whether joining on columns with the same names in both
2557     tables works.
2558 frank 1334
2559 bh 1329 * Thuban/Model/transientdb.py (TransientJoinedTable.create): Make
2560     sure to use the right internal names even when joining on field
2561     with the same names in both tables. Also, detect duplicate names
2562     in the joined table correctly.
2563    
2564 frank 1325 2003-07-01 Frank Koormann <[email protected]>
2565    
2566     * Thuban/UI/renderer.py (ExportRenderer.render_legend):
2567     Reverse List of layers to render in same order as in desktop legend.
2568    
2569 jonathan 1318 2003-06-30 Jonathan Coles <[email protected]>
2570    
2571 jonathan 1349 * Thuban/version.py (make_tuple): Takes a version string
2572     and splits it into a tuple of at most three integers.
2573     Used make_tuple() to make tuple versions of the version
2574     numbers.
2575    
2576     * Thuban/UI/about.py: Add Thuban email addresses.
2577    
2578     2003-06-30 Jonathan Coles <[email protected]>
2579    
2580 jonathan 1320 * Thuban/version.py: SQLite/PySQLite version dependencies
2581     were too high.
2582    
2583     2003-06-30 Jonathan Coles <[email protected]>
2584    
2585 jonathan 1318 * Thuban/version.py: Update version to 0.8.1
2586    
2587     * MANIFEST.in: Added Projections so that default.proj is
2588     included.
2589    
2590 jonathan 1312 2003-06-26 Jonathan Coles <[email protected]>
2591    
2592     New About box with lots more information including library
2593     versions and credits. More/better version checking before
2594     Thuban starts.
2595    
2596     * Thuban/UI/about.py: New. New About box that displays
2597     library version information and credits.
2598    
2599     * Thuban/version.py: Added new 'versions' dictionary which
2600     contains the verions of various libraries which are checked
2601     when the module loads.
2602     (verify_versions): Check all version numbers and returns
2603     a list of errors.
2604    
2605     * Thuban/UI/classifier.py (Classifier.__EnableButtons):
2606     Reset the status of the buttons as the situation warrants,
2607     but in a better more reliable way by not relying on the
2608     current status to determine what needs to change.
2609    
2610     * Thuban/UI/main.py (wxCHECK_VERSION): Removed. Not needed.
2611     (verify_versions): Remove most of the code since it is
2612     now in Thuban.version.verify_versions.o
2613    
2614     * Thuban/UI/mainwindow.py (MainWindow.About): Call new
2615     About box in Thuban.UI.about.
2616    
2617     * extensions/thuban/gdalwarp.cpp (get_gdal_version): New.
2618     Returns the version of gdal library being used as a string.
2619    
2620     * extensions/thuban/wxproj.cpp (check_version, check_version_gtk):
2621     Removed.
2622     (get_proj_version): Return the version of PROJ that the file
2623     was compiled with.
2624     (get_gtk_version): Return th version of GTK that the file
2625     was compiled with.
2626    
2627 jonathan 1304 2003-06-25 Jonathan Coles <[email protected]>
2628    
2629     * Thuban/UI/classifier.py (Classifier.EditSymbol): The parent
2630     of the SelectPropertiesDialog should be self so the window
2631     appears on top.
2632     (ClassGroupPropertiesCtrl.DoEdit): The parent
2633     of the SelectPropertiesDialog should be self so the window
2634     appears on top.
2635    
2636     * Thuban/UI/resource.py: Cleaned up how we determine file
2637     extensions.
2638     (GetImageResource): Return an wxImage from our Resources.
2639    
2640 jonathan 1299 2003-06-24 Jonathan Coles <[email protected]>
2641    
2642     * Thuban/UI/renderer.py (ExportRenderer.render_legend):
2643     Check that a layer has a classification before trying
2644     to get it. Raster layers don't have classifications.
2645    
2646 jonathan 1286 2003-06-23 Jonathan Coles <[email protected]>
2647 jonathan 1297
2648     * setup.py: Add Resources/XML to resource list.
2649    
2650     2003-06-23 Jonathan Coles <[email protected]>
2651 jonathan 1286
2652 jonathan 1297 * setup.cfg: Fix copyright dates
2653    
2654     2003-06-23 Jonathan Coles <[email protected]>
2655    
2656 jonathan 1294 * MANIFEST.in: Update with Resources/XML
2657    
2658     * setup.py: Don't include Locale resources yet as we don't
2659     have any and it causes problems building the distribution
2660     for Windows. Update version to 0.8.0.
2661    
2662     * Doc/thuban.dtd: Removed since it is now in Resources/XML.
2663    
2664     * Thuban/UI/mainwindow.py: Add blank line at the end because
2665     file was not being read correctly building the Windows
2666     distribution.
2667    
2668     2003-06-23 Jonathan Coles <[email protected]>
2669    
2670 jonathan 1289 * Thuban/UI/mainwindow.py (MainWindow.About): Fix text.
2671    
2672     * Thuban/version.py: Temporarily update longversion for
2673     the 0.8 release so that it doesn't have the cvs revision.
2674    
2675     2003-06-23 Jonathan Coles <[email protected]>
2676    
2677 jonathan 1286 * Thuban/UI/common.py (ThubanBeginBusyCursor): Call wxSafeYield
2678     to make sure that we don't create reentrant possibilities with
2679     wxYield.
2680    
2681     * Thuban/UI/view.py (MapCanvas.OnPaint): Call wxBeginBusyCursor()
2682     directly to avoid the wxSafeYield() call which generates an
2683     OnPaint event causing infinite recursion. Don't try to catch
2684     exception anymore. This was for before there were limits on map
2685     scaling.
2686    
2687 bh 1283 2003-06-23 Bernhard Herzog <[email protected]>
2688    
2689     Bug fix for RT #1961:
2690    
2691     * Thuban/Model/load.py (SessionLoader.start_derivedshapesource):
2692     Register DerivedShapestores with the session
2693    
2694     * Thuban/Model/session.py (Session.Tables): Make sure each table
2695     is only listed once.
2696    
2697     * test/test_load.py (TestJoinedTable.test): Add check_format call.
2698     Update file contents to match the one written out.
2699    
2700 bh 1281 2003-06-20 Bernhard Herzog <[email protected]>
2701    
2702     * test/xmlsupport.py (SaxEventLister.startElementNS)
2703     (SaxEventLister.endElementNS): Do not include the qname. Python
2704     2.2.1 and 2.2.2 and 2.2.3 differ in this regard. In 2.2.1 qname it
2705     is (presumably incorrectly) None, whereas it's a string with the
2706     element name in the later versions.
2707    
2708     * test/test_xmlsupport.py (TestEventList.test_even_list_simple)
2709     (TestEventList.test_even_list_namespace): Update tests to reflect
2710     the new behaviour
2711     (TestEventList.test_even_list_id_normalization): Fix doc-string
2712    
2713 jonathan 1272 2003-06-20 Jonathan Coles <[email protected]>
2714    
2715 jonathan 1279 * Thuban/Model/layer.py (BaseLayer.HasShapes): New. Overridden
2716     by deriving classes to determine if that layer supports shapes.
2717     (Layer): Override HasShapes and return true.
2718    
2719     * Thuban/UI/classgen.py: Use Thuban[Begin|End]BusyCursor()
2720     instead of a direct call to wx[Begin|End]CusyCursor().
2721     (GenUniquePanel._OnRetrieve): Set busy cursor while retrieving
2722     table data.
2723    
2724     * Thuban/UI/common.py (ThubanBeginBusyCursor, ThubanEndBusyCursor):
2725     New. Wrappers around the wxWindows functions that allow us to
2726     make additional calls such as wxYield which gives the native
2727     system a chance to update the cursor correctly.
2728    
2729     * Thuban/UI/tableview.py: Use Thuban[Begin|End]BusyCursor()
2730     instead of a direct call to wx[Begin|End]CusyCursor().
2731    
2732     * Thuban/UI/view.py: Use Thuban[Begin|End]BusyCursor()
2733     instead of a direct call to wx[Begin|End]CusyCursor().
2734     (MapCanvas.find_shape_at): Check if the current search layer
2735     support shapes, otherwise go on to the next layer.
2736    
2737     * test/test_layer.py: Add tests in each type of layer for
2738     HasClassification() and HasShapes()
2739    
2740     2003-06-20 Jonathan Coles <[email protected]>
2741    
2742 jonathan 1272 * Thuban/UI/view.py (MapCanvas.OnPaint): Call wxYield after
2743     turning on the busy cursor to allow the system to change the
2744     cursor before we begin painting. This fixes a problem that
2745     was occuring only under GTK. Fixes RTbug #1840.
2746    
2747 bh 1270 2003-06-20 Bernhard Herzog <[email protected]>
2748    
2749     * Resources/XML/thuban-0.8.dtd: New DTD for the new file format
2750     version.
2751    
2752     * Thuban/Model/save.py (sort_data_stores): New. Make topological
2753     sort of the data sources so they can be written with sources that
2754     data sources that depend on other data sources come after the
2755     sources they depend on.
2756     (SessionSaver.__init__): Add idmap instance variable to map from
2757     objects to the ids used in the file.
2758     (SessionSaver.get_id, SessionSaver.define_id)
2759     (SessionSaver.has_id): New. Methods to manage the idmap
2760     (SessionSaver.write): Use thuban-0.8.dtd
2761     (SessionSaver.write_session): Add a namespace on the session and
2762     write out the data sources before the maps.
2763     (SessionSaver.write_data_containers): New. Write the data
2764     containers.
2765     (SessionSaver.write_layer): Layer elements now refer to a
2766     shapestore and don't contain filenames anymore.
2767    
2768     * Thuban/Model/load.py (LoadError): Exception class to raise when
2769     errors in the files are discovered
2770     (SessionLoader.__init__): Define dispatchers for elements with a
2771     thuban-0.8 namespace too.
2772     (SessionLoader.check_attrs): New helper method to check and
2773     convert attributes
2774     (AttrDesc): New. Helper class for SessionLoader.check_attrs
2775     (SessionLoader.start_fileshapesource)
2776     (SessionLoader.start_derivedshapesource)
2777     (SessionLoader.start_filetable, SessionLoader.start_jointable):
2778     Handlers for the new elements in the new fileformat
2779     (SessionLoader.start_layer): Handle the shapestore attribute in
2780     addition to filename.
2781     (SessionLoader.start_table, SessionLoader.end_table): Removed.
2782     They were never used in the old formats and aren't needed for the
2783     new.
2784    
2785     * Thuban/Model/session.py (Session.DataContainers): New method to
2786     return all "data containers", i.e. shapestores and tables
2787    
2788     * test/xmlsupport.py (SaxEventLister.__init__)
2789     (SaxEventLister.startElementNS, sax_eventlist): Add support to
2790     normalize IDs.
2791    
2792     * test/test_xmlsupport.py
2793     (TestEventList.test_even_list_id_normalization): New test case for
2794     id normalization
2795    
2796     * test/test_load.py (LoadSessionTest.check_format): Use ID
2797     normalization
2798     (LoadSessionTest.thubanids, LoadSessionTest.thubanidrefs): New
2799     class atrributes used for ID normalization
2800     (TestSingleLayer, TestLayerVisibility, TestLabels.test)
2801     (TestLayerProjection.test, TestRasterLayer.test): Adapt to new
2802     file format
2803     (TestJoinedTable): New test for loading sessions with joined
2804     tables.
2805     (TestLoadError): New. Test whether missing required attributes
2806     cause a LoadError.
2807    
2808     * test/test_save.py (SaveSessionTest.thubanids)
2809     (SaveSessionTest.thubanidrefs): New class attributes for ID
2810     normalization in .thuban files.
2811     (SaveSessionTest.compare_xml): Use id-normalization.
2812     (SaveSessionTest.testEmptySession)
2813     (SaveSessionTest.testLayerProjection)
2814     (SaveSessionTest.testRasterLayer)
2815     (SaveSessionTest.testClassifiedLayer): Adapt to new file format.
2816     (SaveSessionTest.testLayerProjection): The filename used was the
2817     same as for testSingleLayer. Use a different one.
2818     (SaveSessionTest.test_dbf_table)
2819     (SaveSessionTest.test_joined_table): New test cases for saving the
2820     new data sources structures.
2821     (TestStoreSort, MockDataStore): Classes to test the sorting of the
2822     data stores for writing.
2823    
2824     * test/runtests.py: Add CVS keywords
2825    
2826 jonathan 1265 2003-06-20 Jonathan Coles <[email protected]>
2827    
2828 jonathan 1267 * test/test_session.py
2829     (UnreferencedTablesTests.test_unreferenced_tables_with_joins):
2830     Use the cultural_landmark-point.dbf file for the store so that
2831     the table rows and shape count match.
2832    
2833     2003-06-20 Jonathan Coles <[email protected]>
2834    
2835 jonathan 1265 * Thuban/Model/data.py (DerivedShapeStore.__init__): Raise
2836     an exception if the number of shapes is different from the
2837     number of rows in the table. Address RTbug #1933.
2838    
2839     * test/test_layer.py (TestLayer.test_derived_store): Add
2840     a test for the new exception in DerivedShapeStore.__init__.
2841    
2842     * test/support.py (FloatTestCase): Removed since there is
2843     already FloatComparisonMixin. Fixes RTbug #1954.
2844     (FloatComparisonMixin.assertFloatEqual): Include test for
2845     infinity that was part of FloatTestCase.
2846    
2847     * test/test_range.py (RangeTest): Inherit from
2848     support.FloatComparisonMixin now that we don't have
2849     support.FloatTestCase.
2850    
2851 bh 1256 2003-06-20 Bernhard Herzog <[email protected]>
2852    
2853 bh 1260 * test/test_save.py (SaxEventLister, sax_eventlist): Removed. Use
2854     the implementation in xmlsupport instead.
2855     (SaveSessionTest.compare_xml): sax_eventlist is now in xmlsupport
2856    
2857     * test/test_proj.py: Import sax_eventlist from xmlsupport instead
2858     of test_save
2859    
2860     2003-06-20 Bernhard Herzog <[email protected]>
2861    
2862 bh 1258 * test/test_load.py (LoadSessionTest.check_format): New helper
2863     method to make sure the test files we load might have been written
2864     by the current thuban version.
2865     (ClassificationTest.TestLayers, TestSingleLayer.test)
2866     (TestLayerVisibility.test, TestClassification.test)
2867     (TestLabels.test, TestLayerProjection.test, TestRasterLayer.test):
2868     Add check_format() calls and fix the thuban data to match the data
2869     that would be written by saving the session loaded from it.
2870    
2871     * test/xmlsupport.py (SaxEventLister, sax_eventlist): Copies of
2872     the same class and function in test_save.
2873    
2874     * test/test_xmlsupport.py (TestEventList): New. test cases for
2875     sax_eventlist
2876    
2877     2003-06-20 Bernhard Herzog <[email protected]>
2878    
2879 bh 1256 * Resources/XML/thuban.dtd: Add comment about which versions of
2880     Thuban are covered by this DTD
2881     (map): Fix content model for layers and raster layers. There can
2882     be any number or layers and raster layers in any order.
2883    
2884 jonathan 1254 2003-06-20 Jonathan Coles <[email protected]>
2885    
2886 jonathan 1265 This is mainly about fixing RTbug #1949.
2887    
2888 jonathan 1254 * Thuban/Model/classification.py: Remove "from __future__"
2889     import statement since python 2.2 is the earliest supported
2890     version.
2891    
2892     * Thuban/Model/proj.py (Projection.GetProjectedUnits): New.
2893     Currently returns PROJ_UNITS_METERS or PROJ_UNITS_DEGREES
2894     depending on the units this projection *forwards* into.
2895    
2896     * Thuban/Model/save.py (SessionSaver.write_classification):
2897     Remove unnecessary use of lambdas and nested functions.
2898    
2899     * Thuban/UI/legend.py (ScaleBarBitmap.__SetScale): Do scale
2900     adjustment here if the map projection uses degrees.
2901    
2902     * Thuban/UI/scalebar.py (ScaleBar.DrawScaleBar): Remove
2903     scale adjust code since it is now done before calling
2904     this method. Don't do anything if the map projection
2905     is None.
2906    
2907 bh 1244 2003-06-19 Bernhard Herzog <[email protected]>
2908    
2909 bh 1248 Move version specific load tests to their own file.
2910    
2911     * test/test_load.py: Expand the doc-string to explain a bit how to
2912     handle file format changes.
2913     (TestClassification.test): Update the docstring as this test is
2914     not about Thuban 0.2 anymore.
2915    
2916     * test/test_load_0_2.py: New file with the load tests for thuban
2917     files created with Thuban 0.2 and earlier.
2918    
2919     2003-06-19 Bernhard Herzog <[email protected]>
2920    
2921 bh 1246 Add XML validation to some of the tests. Validation will only be
2922     done if pyRXP is installed (http://reportlab.com/xml/pyrxp.html).
2923     To make the DTD available to the test cases it's moved into
2924     Resources/XML
2925    
2926     * Resources/XML/thuban.dtd: New. This is now the real Thuban DTD
2927     for versions up to and including 0.2. Two slight changes: added an
2928     encoding specification and fixed the comment which refered to
2929     GRASS, not Thuban
2930    
2931     * test/xmlsupport.py: New support module for tests involving XML.
2932     Currently there's a mix-in class for XML validation.
2933    
2934     * test/test_xmlsupport.py: New. Tests for the xmlsupport module
2935    
2936     * test/test_save.py (SaveSessionTest): Derive from ValidationTest
2937     so that we can validate the
2938     (SaveSessionTest.testEmptySession)
2939     (SaveSessionTest.testSingleLayer)
2940     (SaveSessionTest.testSingleLayer)
2941     (SaveSessionTest.testLayerProjection)
2942     (SaveSessionTest.testRasterLayer)
2943     (SaveSessionTest.testClassifiedLayer): Validate the generated XML
2944    
2945     * test/runtests.py (main): Call print_additional_summary instead
2946     of print_garbage_information
2947    
2948     * test/support.py (resource_dir): New function to return the
2949     "Resource" subdirectory
2950     (print_additional_summary): New function to combine several
2951     summary functions
2952     (run_tests): Use print_additional_summary instead of calling
2953     print_garbage_information directly
2954    
2955     2003-06-19 Bernhard Herzog <[email protected]>
2956    
2957 bh 1244 * Doc/thuban.dtd (classification): Correct the content model of
2958     the classification element.
2959     (projection): Add the "name" attribute
2960    
2961 frank 1242 2003-06-19 Frank Koormann <[email protected]>
2962    
2963     MERGE from the greater-ms3 branch.
2964    
2965     * Thuban/UI/scalebar.py (ScaleBar.DrawScaleBar): Apply conversion to
2966     scale if projection is latlong to get better estimate.
2967    
2968     Fix problem of hidden properties dialog under windows after double
2969     click on layer tree:
2970     The tree control always gets an Expanded / Collapsed event after
2971     the ItemActivated on double click, which raises the main window again. We add a second ItemActivated event to the queue, which simply
2972     raises the already displayed window.
2973    
2974     * Thuban/UI/legend.py (LegendTree.__init__): Instance variable
2975     raiseProperties initialized to prevent endless loops
2976     (LegendTree._OnItemActivated): Depending on self.raiseProperties
2977     simply raise the properties or open the dialog and issue a second
2978     event.
2979    
2980 jonathan 1235 2003-06-18 Jonathan Coles <[email protected]>
2981    
2982 jonathan 1239 * setup.py: Fix a few problems that occured under Windows.
2983    
2984     2003-06-18 Jonathan Coles <[email protected]>
2985    
2986 jonathan 1235 When Thuban loaded the map was redrawn twice because the
2987     legend was being opened after the mainwindow was created
2988     and not during its creation. This meant the map was drawn
2989     initially and then had to be redrawn when the legend
2990     caused the display to change. Now the legend is opened
2991     in the mainwindow constructor which resolves this issue.
2992    
2993     Also, although we were checking for the existence of
2994     gdal and gdalwarp modules, the gdalwarp extension was
2995     still being compiled (which may fail if the system doesn't
2996     have gdal installed). the build_ext command to setup.py
2997     now accepts the flags --with-gdal and --without-gdal.
2998     If --without-gdal is specified setup.py will try to
2999     use the gdal parameters specified by gdal-config. Under
3000     windows, those parameters have to be set in setup.py
3001     as with proj4 an wxWindows.
3002    
3003     * setup.py: Use a list instead of seperate variables for
3004     extension parameters so we can create a generic function
3005     that runs an appropriate *-config script.
3006     (run_cs_script): Renamed from run_wx_script and modified
3007     to accept a second argument which is a list of lists to
3008     be filled in by the values returned from running the command.
3009     (thuban_build_ext): New. Extends the build_ext command and
3010     provides the options --with-gdal/--without-gdal which then
3011     optionally includes the gdalwarp extension.
3012    
3013     * Thuban/Model/resource.py: First check if we can import
3014     the gdalwarp Thuban extension before checking for gdal.
3015     Also added some comments.
3016    
3017     * Thuban/UI/legend.py (ScaleBarBitmap.__SetScale): Check if
3018     the map is None which may be the case if none has been loaded
3019     yet.
3020    
3021     * Thuban/UI/main.py (main): Remove call to ShowLegend.
3022    
3023     * Thuban/UI/mainwindow.py (MainWindow.__init__): Call ShowLegend().
3024    
3025     * Thuban/UI/renderer.py: Check for gdal support before importing
3026     gdalwarp.
3027     (MapRenderer.render_map): Only try to optimize if we have gdal
3028     support otherwise nothing will get drawn.
3029    
3030 jonathan 1237 * Thuban/UI/view.py (MapCanvas.FitMapToWindow): This may be called
3031     during startup before a map has been created. Check if map is None
3032     before using it and do nothing if it is.
3033    
3034 jonathan 1224 2003-06-17 Jonathan Coles <[email protected]>
3035    
3036     Fix the problem with raster layers under Windows that caused
3037     Thuban to crash. The view should respond to layer projection
3038     changed events to update the display. Changes to a projection
3039     should not cause the map to be set to full extent.
3040    
3041     * Thuban/UI/view.py (MapCanvas.__init__): New instance variable
3042     current_map_proj to remember the current map projection so that
3043     when the projection changes we know what the previous projection
3044     was.
3045     (MapCanvas.SetMap): Unsubscribe and subscribe to
3046     LAYER_PROJECTION_CHANGED events.
3047     (MapCanvas.projection_changed): Split into two methods that respond
3048     to map and layer projection changes.
3049     (MapCanvas.map_projection_changed): New. Takes the current view and
3050     projects it using the new projection. This does not cause the
3051     map to be redrawn at full extent.
3052     (MapCanvas.layer_projection_changed): New. Cause a redraw which
3053     will draw each layer in its new projection.
3054    
3055     * extensions/thuban/bmpdataset.cpp (BMPDataset::Open): Call
3056     VSIFClose() not VSIFCloseL() to close the file. Fixes a crash
3057     under Windows.
3058    
3059     * extensions/thuban/gdalwarp.cpp (MFILENAME): Padding should be
3060     to twice sizeof(void*) because there are two digits for each
3061     hex byte.
3062    
3063 bh 1220 2003-06-16 Bernhard Herzog <[email protected]>
3064    
3065     Update to the layer interface: Direct access to the table,
3066     shapetable, shapefile and filename attributes is now actively
3067     deprecated by issuing deprecation warnings for all places where
3068     this happens.
3069    
3070     * Thuban/Model/layer.py (Layer.__getattr__): New. Implement access
3071     to the instance variables table, shapetable, shapefile and
3072     filename via __getattr__ so that we can issue a deprecation
3073     warning.
3074     (Layer.SetShapeStore): Don't set the deprecated instance variables
3075     any more
3076     (Layer.SetShapeStore): Don't use deprecated layer instance
3077     variables
3078     (Layer.Destroy): No need to explicitly remove the instance
3079     variables any more
3080     (Layer.GetFieldType, Layer.Shape): Don't use deprecated layer
3081     instance variables
3082    
3083     * Thuban/UI/classgen.py (ClassGenDialog.__init__)
3084     (GenUniformPanel._OnRetrieve, GenUniquePanel._OnRetrieve)
3085     (GenQuantilesPanel.GetList, GenQuantilesPanel.OnRetrieve): Don't
3086     use deprecated layer instance variables
3087    
3088     * Thuban/UI/classifier.py (Classifier.__init__): Don't use
3089     deprecated layer instance variables
3090    
3091     * Thuban/UI/identifyview.py (IdentifyListCtrl.selected_shape)
3092     (IdentifyGridCtrl.selected_shape): Don't set the deprecated layer
3093     instance variables
3094    
3095     * Thuban/UI/tableview.py (LayerTableGrid.select_shapes): Don't use
3096     deprecated layer instance variables
3097    
3098     * Thuban/UI/mainwindow.py (MainWindow.LayerShowTable): Don't use
3099     deprecated layer instance variables
3100    
3101     * Thuban/Model/save.py (SessionSaver.write_layer): Don't use
3102     deprecated layer instance variables
3103    
3104     * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer)
3105     (MapRenderer.polygon_render_param): Don't use deprecated layer instance
3106     variables
3107    
3108     * test/runtests.py (main): Turn Thuban's deprecation warnings into
3109     errors so that they're cought by the tests
3110    
3111     * test/test_load.py (TestSingleLayer.test): Don't use deprecated
3112     layer instance variables
3113    
3114 jonathan 1212 2003-06-16 Jonathan Coles <[email protected]>
3115    
3116     Fix a problem under Windows whereby if the user double-clicks on a
3117     layer in the legend that tree item will expand or collapse as well
3118     as open the layer properties dialog. The state of the tree item
3119     should not be affected.
3120    
3121     * Thuban/UI/legend.py (LegendTree.__init__): Add instance variable
3122     preventExpandCollapse and subscribe to expanding and collapsing
3123     events.
3124     (LegendTree.OnItemExpandCollapse): New. Responds to expanding and
3125     collapsing events and will veto the event if it has been triggered
3126     by the user double clicking on a layer.
3127     (LegendTree._OnItemActivated): Set preventExpandCollapse to indicate
3128     that an expanding/collapsing event should be vetoed.
3129    
3130 bh 1208 2003-06-13 Bernhard Herzog <[email protected]>
3131    
3132     * Thuban/UI/classifier.py (Classifier.OnClose)
3133     (Classifier.map_layers_removed)
3134     (Classifier.layer_shapestore_replaced): Unsubscribe the messages
3135     in OnClose and not in map_layers_removed or
3136     layer_shapestore_replaced to make sure it always happens when the
3137     dialog is closed
3138    
3139 jonathan 1201 2003-06-13 Jonathan Coles <[email protected]>
3140    
3141 jonathan 1203 This puts back a fix for Windows where a panel is needed so that
3142     the background of the table view appears correctly.
3143    
3144     * Thuban/UI/tableview.py (TableFrame.__init__): Add a panel
3145     object that can be used by derived classes to place any
3146     controls (including the grid) onto.
3147     (QueryTableFrame.__init__): Use the panel as the parent window
3148     for all the controls. Reparent the grid so that the panel is
3149     the parent. Call UpdateStatusText() to correctly initialize
3150     the status bar.
3151    
3152     2003-06-13 Jonathan Coles <[email protected]>
3153    
3154 jonathan 1201 * Thuban/UI/dialogs.py (ThubanFrame): New: a class that inherits
3155     from wxFrame (as opposed to wxDialog like the other classes)
3156     but otherwise behaves like the other classes. This is needed
3157     for the TableView which isn't really a dialog and needs to
3158     have a status bar and control buttons.
3159    
3160     * Thuban/UI/tableview.py (TableGrid.__init__): Create an
3161     instance variable to keep track of how many rows are selected.
3162     Subscribe once to the the events we are interested in.
3163     (ThubanGrid.OnRangeSelect): Only handle event if event handling
3164     hasn't been turned off.
3165     (ThubanGrid.OnSelectCell): Only handle event if event handling
3166     hasn't been turned off.
3167     (ThubanGrid.ToggleEventListeners): Rather than subscribe None
3168     as an event listener (which changes the event handler stack)
3169     simply set an instance variable to False. This is checked in
3170     the event handlers.
3171     (ThubanGrid.GetNumberSelected): Return the number of currently
3172     selected rows.
3173     (TableFrame): Inherit from ThubanFrame so we can have a
3174     status bar and control buttons.
3175     (QueryTableFrame.__init__): Create a status bar. Fixes RTbug #1942.
3176     Explicitly set which items are selected in the operator choice and
3177     action choice so there is always a valid selection. Fixes RTbug #1941.
3178     Subscribe to grid cell selection events so we can update the
3179     status bar.
3180     (QueryTableFrame.UpdateStatusText): Update the status bar with
3181     how many rows are in the grid, how many columns, and how many
3182     rows are selected.
3183     (QueryTableFrame.OnGridSelectRange, QueryTableFrame.OnGridSelectCell):
3184     Call UpdateStatusText when cells are (de)selected.
3185     (QueryTableFrame.OnQuery): Use the string value in the value
3186     combo if either the selected item index is 0 or if the string
3187     cannot be found in the predefined list (this happens if the
3188     user changes the text). Fixes RTbug #1940.
3189     Only turn off the grid event listeners if there a query comes
3190     back with a none empty list of ids. in the case that the list
3191     is empty this causes a grid.ClearSelection() call to actually
3192     clear the grid selection which causes the selected items in
3193     the map to be deselected. Fixes RTbug #1939.
3194    
3195     * test/test_save.py (XMLWriterTest.Encode): Check return values.
3196     Fixes RTbug #1851.
3197    
3198 bh 1195 2003-06-13 Bernhard Herzog <[email protected]>
3199    
3200     * Thuban/UI/identifyview.py (IdentifyView.__init__): Call
3201     self.selected_shape with the current selection to make sure the
3202     contents of the dialog are up to date when it's shown for the
3203     first time.
3204     The dialog used to work without this by luck. The recent fix to
3205     the connector module 'broke' a 'feature' the identify view was
3206     relying on, i.e that subscribing to a message in response to
3207     receiving a message of that type would mean that the new
3208     subscriber would also be called for the same message.
3209    
3210 jonathan 1169 2003-06-12 Jonathan Coles <[email protected]>
3211 jonathan 1175
3212 jonathan 1193 * extensions/thuban/gdalwarp.cpp: Removed debug printing as
3213     the image is rendered. Fixes RTbug #1937.
3214    
3215     2003-06-12 Jonathan Coles <[email protected]>
3216    
3217 jonathan 1191 * Thuban/Lib/fileutil.py: As is done under Windows, create the
3218 jonathan 1193 user directory if it doesn't exist on a posix system.
3219     Fixes RTbug #1815.
3220 jonathan 1191
3221     * Thuban/Model/resource.py (get_user_proj_files): Moved the
3222     called to get_application_dir here, so that the directory
3223     will only be called if this method is invoked.
3224    
3225     * Thuban/UI/projdialog.py (ProjFrame.__DoOnProjAvail): Clear
3226     the projfilepath if no projection is selected.
3227    
3228     2003-06-12 Jonathan Coles <[email protected]>
3229    
3230 jonathan 1182 * Thuban/UI/legend.py (ScaleBarBitmap.__SetScale): Don't draw
3231     the scalebar if the current map has no projection set.
3232    
3233     * Thuban/UI/projdialog.py (ProjFrame.__DoOnProjAvail): Set the
3234     projfilepath label to just the basename of the projection file
3235     rather than include the entire path.
3236    
3237     * Thuban/Model/resource.py: Fix missed proj functions that
3238     needed to be renamed.
3239    
3240     2003-06-12 Jonathan Coles <[email protected]>
3241    
3242 jonathan 1178 * Thuban/Model/classification.py: Removed assert statements that
3243     tested if the variable was an instance of Color.
3244    
3245     * Thuban/Model/color.py (Color): Remove commented code that isn't
3246     used.
3247     (Transparent): Renamed from NoColor. Doesn't inherit from Color.
3248     Fixes RTbug #1835.
3249     (Transparent.__eq__, Transparent.__ne, Transparent.__repr): New.
3250     Needed now that the class doesn't inherit from Color.
3251    
3252     2003-06-12 Jonathan Coles <[email protected]>
3253    
3254 jonathan 1175 * test/test_save.py (XMLWriterTest.testEncode): Explicitly
3255     check unicode strings.
3256    
3257     * test/test_layer.py: Check for existence of gdal.
3258    
3259     2003-06-12 Jonathan Coles <[email protected]>
3260 jonathan 1172
3261     * Thuban/Model/xmlreader.py: New. Contains the XMLReader class
3262     that was in load.py
3263 jonathan 1169
3264 jonathan 1172 * Thuban/Model/xmlwriter.py: New. Contains the XMLWriter class
3265     that was in save.py
3266    
3267     2003-06-12 Jonathan Coles <[email protected]>
3268    
3269 jonathan 1169 This is largely a collection of bug fixes. We also handle the
3270     case where gdal is not on the system. The XMLReader and XMLWriter
3271     classes were moved into there own files to resolve some circular
3272     import references and because they shouldn't really be in the
3273     file that is dediciated to reading/writing session files since
3274     they are also used elsewhere.
3275    
3276     * Thuban/Model/classgen.py: Renamed functions to follow the
3277     function_names_with_underscores style. Fixes RTbug #1903.
3278     (calculate_quantiles): Raise ValueError if 'percents' is invalid.
3279    
3280     * Thuban/Model/layer.py: Import gdal only if it available.
3281     (RasterLayer): Handle the case where the gdal library is unavailable.
3282     Addresses RTbug #1877.
3283    
3284     * Thuban/Model/load.py (XMLReader): Moved into seperate file
3285     xmlreader.py.
3286    
3287 jonathan 1172 2003-06-12 Jonathan Coles <[email protected]>
3288    
3289     This is largely a collection of bug fixes. We also handle the
3290     case where gdal is not on the system. The XMLReader and XMLWriter
3291     classes were moved into there own files to resolve some circular
3292     import references and because they shouldn't really be in the
3293     file that is dediciated to reading/writing session files since
3294     they are also used elsewhere.
3295    
3296     * Thuban/Model/classgen.py: Renamed functions to follow the
3297     function_names_with_underscores style. Fixes RTbug #1903.
3298     (calculate_quantiles): Raise ValueError if 'percents' is invalid.
3299    
3300     * Thuban/Model/layer.py: Import gdal only if it available.
3301     (RasterLayer): Handle the case where the gdal library is unavailable.
3302     Addresses RTbug #1877.
3303    
3304     * Thuban/Model/load.py (XMLReader): Moved into seperate file
3305     xmlreader.py.
3306    
3307 jonathan 1169 * Thuban/Model/save.py (escape, XMLWriter): Moved into seperate
3308     file xmlwriter.py.
3309    
3310     * Thuban/Model/resource.py: Renamed functions to following the
3311     function_names_with_underscores style.
3312     (has_gdal_support): New function that returns true if the gdal
3313     library is available. Addresses RTbug #1877.
3314    
3315     * Thuban/UI/application.py (ThubanApplication.OpenSession):
3316     Display a message box if the gdal library is not available, but
3317     only if there are any layers that would use it. Addresses RTbug #1877.
3318    
3319     * Thuban/UI/classgen.py: Use renamed projection resource functions.
3320     (GenUniformPanel.__CalcStepping): Fix a slight discrepency
3321     when using integers versus floats.
3322    
3323     * Thuban/UI/mainwindow.py (_has_gdal_support): New. Used to
3324     determine if the "Add Image Layer" menu option should be
3325     greyed out or not. Addresses RTbug #1877.
3326    
3327     * Thuban/UI/projdialog.py: Use renamed projection resource functions.
3328    
3329     * Thuban/UI/renderer.py (MapRenderer.render_map): Only try to
3330     optimize if a raster layer is visible. Fixes RTbug #1931.
3331     Only draw the raster layer if the gdal library is available.
3332     Addresses RTbug #1877.
3333    
3334     * test/test_classgen.py: Add tests for generate_singletons,
3335     generate_uniform_distribution, generate_quantiles. Fixes RTbug #1903.
3336     (test_calculate_quantiles): Fix some tests to catch the new
3337     ValueError that is raised.
3338    
3339     * test/test_proj.py: Use renamed projection resource functions.
3340    
3341     * test/test_save.py (SaveSessionTest.testClassifiedLayer): New
3342     test for saving classified layers. Fixes RTbug #1902.
3343     (XMLWriterTest): New. Tests the XMLWriter class. Fixes RTbug #1851.
3344    
3345 jan 1156 2003-06-12 Jan-Oliver Wagner <[email protected]>
3346    
3347     Fix for http://intevation.de/rt/webrt?serial_num=1900.
3348    
3349     * Thuban/UI/multiplechoicedialog.py: New. A multiple choice dialog.
3350    
3351     * Thuban/UI/mainwindow.py: import wxMultipleChoiceDialog from
3352     multiplechoicedialog.py rather than from the wxPython library.
3353    
3354 frank 1151 2003-06-11 Frank Koormann <[email protected]>
3355    
3356 frank 1152 * Thuban/Lib/fileutil.py (get_application_dir): Minor stability
3357     update.
3358    
3359     2003-06-11 Frank Koormann <[email protected]>
3360    
3361 frank 1151 * Thuban/Lib/fileutil.py (get_application_dir): New function to
3362     determine the absolute .thuban/thuban directory under
3363     "posix" (os.expanduser) and "nt" (read AppData registry key).
3364    
3365     * Thuban/Model/resource.py: Use get_application_dir
3366    
3367     * Thuban/UI/application.py (ThubanApplication.read_startup_files):
3368     Use get_application_dir.
3369    
3370 bh 1143 2003-06-10 Bernhard Herzog <[email protected]>
3371    
3372 bh 1147 * Thuban/UI/tableview.py (LayerTableFrame.__init__): Subscribe to
3373     the messages MAP_LAYERS_REMOVED messages
3374     (LayerTableFrame.OnClose): Unsubscribe from it.
3375     (LayerTableFrame.map_layers_removed): New. Receiver for
3376     MAP_LAYERS_REMOVED. Close the dialog when the layer whose the
3377     dialog is showing is removed.
3378    
3379     2003-06-10 Bernhard Herzog <[email protected]>
3380    
3381 bh 1145 * Thuban/Lib/connector.py (Connector.Issue): Iterate over a copy
3382     of the receivers list so that unsubscribing in a receiver doesn't
3383     modify it while iterating over it.
3384    
3385     * test/test_connector.py
3386     (ConnectorTest.test_disconnect_in_receiver): New. Test whether
3387     unsubscribing in a receiver works correctly. See docstring for
3388     details
3389    
3390     2003-06-10 Bernhard Herzog <[email protected]>
3391    
3392 bh 1143 * Thuban/Model/messages.py (LAYER_SHAPESTORE_REPLACED): New
3393     message.
3394    
3395     * Thuban/Model/layer.py (Layer.SetShapeStore): Send
3396     LAYER_SHAPESTORE_REPLACED when the shapestore changes. A
3397     LAYER_CHANGED will still be sent if the classification changes.
3398    
3399     * Thuban/UI/classifier.py (Classifier.__init__): Add the map as
3400     parameter so we can subscribe to some of its messages
3401     (Classifier.__init__): Subscribe to the map's MAP_LAYERS_REMOVED
3402     and the layer's LAYER_SHAPESTORE_REPLACED
3403     (Classifier.unsubscribe_messages): New. Unsubscribe from message
3404     subscribed to in __init__
3405     (Classifier.map_layers_removed)
3406     (Classifier.layer_shapestore_replaced): receivers for the messages
3407     subscribed to in __init__. Unsubscribe and close the dialog
3408    
3409     * Thuban/UI/mainwindow.py (MainWindow.OpenLayerProperties): Pass
3410     the map to the Classifier dialog
3411    
3412     * test/test_layer.py (SetShapeStoreTests): Derive from
3413     SubscriberMixin as well so we can test messages
3414     (SetShapeStoreTests.setUp): Subscribe to some of the layer's
3415     messages
3416     (SetShapeStoreTests.tearDown): Clear the messages again
3417     (SetShapeStoreTests.test_sanity): Expand the doc-string and check
3418     for the modified flag too
3419     (SetShapeStoreTests.test_set_shape_store_modified_flag): New test
3420     to check whether SetShapeStore sets the modified flag
3421     (SetShapeStoreTests.test_set_shape_store_different_field_name)
3422     (SetShapeStoreTests.test_set_shape_store_same_field)
3423     (SetShapeStoreTests.test_set_shape_store_same_field_different_type):
3424     Add tests for the messages. This checks both the new
3425     LAYER_SHAPESTORE_REPLACED and the older LAYER_CHANGED
3426    
3427 jan 1141 2003-06-06 Jan-Oliver Wagner <[email protected]>
3428    
3429     * Thuban/UI/mainwindow.py: Improved and partly added help texts for
3430     the menu items.
3431    
3432 frank 1134 2003-06-05 Frank Koormann <[email protected]>
3433    
3434 frank 1139 * Thuban/UI/identifyview.py (IdentifyView.__init__):
3435     Layout reimplemented without panel. Make life easier to fit the list
3436     in the dialog.
3437    
3438     2003-06-05 Frank Koormann <[email protected]>
3439    
3440 frank 1137 * Thuban/UI/projdialog.py (ProjFrame.__init__): Fill the projchoice
3441     once on initialisation (Former implementation resulted in multiple
3442     entries for each projection).
3443     (ProjFrame.__FillAvailList): selectProj as second optional parameter,
3444     if set, select the projection found under the specified name. This
3445     overwrites any other selection estimate.
3446     Removed projchoice filling from this method.
3447     (ProjFrame._OnSave, ProjFrame._OnAddToList):
3448     Updated call of ProjFrame.__FillAvailList
3449     (LCCPanel._DoLayout): Moved parameter controls in more common order.
3450    
3451     * Resources/Projections/defaults.proj: Extended defaults representing
3452     various common European projections.
3453    
3454     2003-06-05 Frank Koormann <[email protected]>
3455    
3456 frank 1134 * Thuban/UI/identifyview.py (IdentifyView.__init__):
3457     Use ListCtrl instead of GridCtrl
3458    
3459     * Thuban/Model/resource.py:
3460     Guess location of .thuban directory from tempdir parent directory.
3461    
3462     * Thuban/UI/application.py (ThubanApplication.read_startup_files):
3463     Guess location of .thuban directory from tempdir parent directory.
3464    
3465 bh 1130 2003-06-04 Bernhard Herzog <[email protected]>
3466    
3467     Do not cache the values returned by the tree widget's
3468     GetFirstChild and GetNextChild methods because it led to lots of
3469     segfaults. The new way requires more brute force but is more
3470     reliable.
3471    
3472     * Thuban/UI/legend.py (LegendTree.__init__): Remove instance
3473     variable layer2id
3474     (LegendTree.find_layer): New method to do with brute force what
3475     layer2id tried to accomplish
3476     (LegendTree._OnMsgLayerChanged)
3477     (LegendTree._OnMsgLayerTitleChanged, LegendTree.__ShowHideLayer):
3478     Use find_layer instead of layer2id
3479     (LegendTree.__RemoveLayer, LegendTree.__AddLayer): No need to
3480     update layer2id anymore
3481     (LegendTree._OnMsgMapLayersRemoved)
3482     (LegendTree._OnMsgMapLayersAdded): Get by without layer2id.
3483    
3484 tkoester 1128 2003-06-03 Thomas Koester <[email protected]>
3485    
3486     * Thuban/Model/classgen.py (GenQuantiles0): New function.
3487    
3488 bh 1120 2003-06-02 Bernhard Herzog <[email protected]>
3489    
3490 bh 1127 * Thuban/UI/mainwindow.py (layer_rename command, table_rename command):
3491     New commands.
3492     (main_menu): Add the new commands.
3493     (MainWindow.TableRename): New. Implementation of the table_rename
3494     command.
3495     (MainWindow.RenameLayer): New. Implementation of the layer_rename
3496     command.
3497    
3498     * Thuban/Model/session.py (Session.AddTable): call self.changed to
3499     set the modified flag
3500    
3501     * test/test_session.py (TestSessionSimple.test_add_table): Test
3502     whether the modified flag is set properly
3503    
3504     * Thuban/Model/base.py (TitledObject.SetTitle): Call changed
3505     instead of issue so that the modified flags get updated.
3506    
3507     * test/test_base.py (SomeTitledObject): Derive from Modifiable
3508     instead of Publisher to reflect reality better and to accomodate
3509     the fact that SetTitle now calls changed instead of issue
3510    
3511     2003-06-02 Bernhard Herzog <[email protected]>
3512    
3513     * Thuban/UI/classgen.py (GenQuantilesPanel.GetList): Resource
3514     acquisition has to happen before the try in a try-finally.
3515    
3516     2003-06-02 Bernhard Herzog <[email protected]>
3517    
3518 bh 1120 * Thuban/UI/legend.py (LegendTree._OnMsgMapLayersRemoved): It's
3519     possible that a layer is removed that is not currently selected in
3520     the legend so don't check for this.
3521    
3522 bh 1112 2003-05-30 Bernhard Herzog <[email protected]>
3523    
3524 bh 1118 * Thuban/Model/layer.py (Layer.Destroy): Set all instance
3525     variables to None that have direct or indirect references to
3526     shapefiles or dbf files to make sure that they do go away and the
3527     files are closed.
3528    
3529     2003-05-30 Bernhard Herzog <[email protected]>
3530    
3531 bh 1116 * Thuban/UI/legend.py (LegendTree.GetRootItem): Reset
3532     availImgListIndices when a new image list is created
3533    
3534     2003-05-30 Bernhard Herzog <[email protected]>
3535    
3536 bh 1114 * Thuban/UI/legend.py (LegendTree.__init__): New instance variable
3537     changing_selection to indicate whether the LegendTree code itself
3538     is currently changing the selection
3539     (LegendTree.normalize_selection): New method to normalize the
3540     selection by selecting the layer item even if the user clicked on
3541     the classification.
3542     (LegendTree._OnSelChanged): normalize the selection. This works
3543     around a bug in wx which doesn't keep track of the selection
3544     properly when subtrees are deleted.
3545    
3546     2003-05-30 Bernhard Herzog <[email protected]>
3547    
3548 bh 1112 * Thuban/UI/view.py (MapCanvas.set_view_transform): Limit the
3549     maximum and minimum scale factors.
3550    
3551     * test/test_classgen.py (ClassGenTest.test): Update to reflect the
3552     changes in classgen.py
3553    
3554 jonathan 1109 2003-05-30 Jonathan Coles <[email protected]>
3555    
3556     * Thuban/Model/classgen.py: Remove ClassGenerator class but make
3557     all the methods functions. Fixes RTBug #1903.
3558    
3559     * Thuban/Model/map.py (Map.TopLayer, Map.BottomLayer): Renamed
3560     to MoveLayerToTop and MoveLayerToBottom respectively. Fixes
3561     RTBug #1907.
3562    
3563     * Thuban/UI/classgen.py: Use classgen functions that were part
3564     of the ClassGenerator class. Put try/finally blocks around
3565     code that uses wxBeginBusyCursor()/wxEndBusyCursor(). Fixes
3566     RTBug #1904.
3567    
3568     * Thuban/UI/classifier.py: Remove unused import of ClassGenerator.
3569    
3570     * Thuban/UI/legend.py: The legend was cleared and repopulated any
3571     time something changed which caused some state to be lost such
3572     as which children were expanded or collapsed. Fixes RTBug #1901.
3573     (LegendTree._OnMsgMapLayersAdded): Add only new layers.
3574     (LegendTree.__OnMsgMapLayersRemoved): Remove layers that exist in
3575     the legend but not in the map.
3576     (LegendTree.__FillTree): Move main functionality out into smaller
3577     methods that can be used by other methods.
3578     (LegendTree.__FillTreeLayer): Reuse old slots in the image list
3579     if they are available.
3580     (LegendTree.DeleteAllItems): Renamed from __DeleteAllItems so
3581     that we override the wxTreeCtrl method. Iterate over children
3582     and call __RemoveLayer.
3583     (LegendTree.__AddLayer): New. Add a new layer to the legend.
3584     (LegendTree.__RemoveLayer): Remove a layer from the legend.
3585     (LegendTree.DeleteChildren): New, overrides wxTreeCtrl method.
3586     Should only be called with the id of a layer branch.
3587     (LegendTree.GetRootItem): New, overrides wxTreeCtrl method.
3588     Returns the root item or creates one if necessary.
3589    
3590     * Thuban/UI/renderer.py (MapRenderer.draw_raster_layer): Call
3591     ProjectRasterFile with tuple arguments instead of strings.
3592    
3593     * Thuban/UI/tableview.py (QueryTableFrame.OnQuery): Wrap code
3594     with try/finally. Fixes RTBug #1904.
3595    
3596     * Thuban/UI/view.py (MapCanvas.OnPaint): Wrap code
3597     with try/finally. Fixes RTBug #1904.
3598     (MapCanvas.FitSelectedToWindow): If a single point is selected
3599     simply center it on the display. Fixes RTBug #1849.
3600    
3601     * extensions/thuban/gdalwarp.cpp: Removed code that allowed gdalwarp
3602     to be compiled as a standalone app. Now the code can only be
3603     called from Python which simplifies the parameter passing.
3604     (ProjectRasterFile): Handle Python arguments. Remove code that
3605     checks for a destination dataset. Add more clean up code.
3606    
3607     * test/test_map.py (TestMapWithContents.test_raise_layer_top,
3608     TestMapWithContents.test_lower_layer_bottom):
3609     Test Map.MoveLayerToTop() and Map.MoveLayerToBottom() respectively.
3610     Fixes RTBug #1907.
3611    
3612     * Thuban/UI/mainwindow.py (MainWindow.ToggleLegend): Apply a full
3613     extent to the map when the legend is toggled. Fixes RTBug #1881.
3614    
3615 jan 1097 2003-05-29 Jan-Oliver Wagner <[email protected]>
3616    
3617     * Thuban/UI/tableview.py (LayerTableFrame.OnClose): Bug-fix: Now
3618     unsubscribes all that is subcribed in __init__.
3619    
3620 bh 1089 2003-05-28 Bernhard Herzog <[email protected]>
3621    
3622 bh 1095 * Thuban/UI/mainwindow.py (MainWindow.DuplicateLayer)
3623     (MainWindow.CanDuplicateLayer): New methods to implement the
3624     Layer/Duplicate command.
3625     (layer_duplicate command): New.
3626     (main_menu): Add layer_duplicate to the Layer menu.
3627    
3628     2003-05-28 Bernhard Herzog <[email protected]>
3629    
3630 bh 1093 * Thuban/UI/tableview.py (NullRenderer.Draw): New. Our own
3631     renderer so that NULL/None values get displayed differently (by a
3632     gray rectangle).
3633     (TableGrid.__init__): Override the default renderers
3634    
3635     2003-05-28 Bernhard Herzog <[email protected]>
3636    
3637 bh 1089 * Thuban/Model/layer.py (Layer.SetShapeStore): Set the
3638     classification to "None" if the type of the field has changed.
3639    
3640     * test/test_layer.py (SetShapeStoreTests): New. Class with a few
3641     test for the Layer.SetShapeStore method
3642    
3643 jan 1087 2003-05-28 Jan-Oliver Wagner <[email protected]>
3644 jan 1085
3645 jan 1087 * Thuban/Model/layer.py (Layer.TreeInfo): Fixed a bug (a layer
3646     does not necessarily have a filename).
3647    
3648     2003-05-28 Jan-Oliver Wagner <[email protected]>
3649    
3650 jan 1085 * Thuban/UI/mainwindow.py (MainWindow.TableClose, MainWindow.TableShow):
3651     sort the selection list for the dialog.
3652    
3653 frank 1083 2003-05-28 Frank Koormann <[email protected]>
3654    
3655     * extensions/thuban/wxproj.cpp
3656     (project_point): Removed cast to int for projected point coordinates.
3657     (shape_centroid): Return last point if all polygon vertices fall
3658     to one point.
3659    
3660 bh 1079 2003-05-28 Bernhard Herzog <[email protected]>
3661    
3662 bh 1081 * Thuban/UI/mainwindow.py (_can_unjoin): Add doc-string and cope
3663     with layers that don't have shapestores, i.e. raster layers.
3664    
3665     2003-05-28 Bernhard Herzog <[email protected]>
3666    
3667 bh 1079 * Thuban/Model/table.py (DBFTable.__init__): Omit the extension
3668     when determining the title from the filename.
3669    
3670     * test/test_dbf_table.py (TestDBFTable.test_title): Update to
3671     reflect changes in the way the title is derived from the filename
3672    
3673 frank 1077 2003-05-28 Frank Koormann <[email protected]>
3674    
3675     * Thuban/UI/mainwindow.py (MainWindow.TableShow):
3676     Added wxDEFAULT_DIALOG_STYLE to show table dialog styles.
3677    
3678 bh 1069 2003-05-27 Bernhard Herzog <[email protected]>
3679    
3680 bh 1075 * Thuban/UI/mainwindow.py (MainWindow.delegated_messages): Also
3681     delegate SelectedLayer.
3682     (MainWindow.LayerUnjoinTable): Implement.
3683     (_can_unjoin): New. Helper function for the sensitivity of the
3684     layer/unjoin command.
3685    
3686     * Thuban/Model/data.py (ShapefileStore.OrigShapeStore)
3687     (DerivedShapeStore.OrigShapeStore): New. Return the original
3688     shapestore. Used to figure out how to unjoin.
3689     (DerivedShapeStore.Shapefile): Fix a typo.
3690    
3691     2003-05-27 Bernhard Herzog <[email protected]>
3692    
3693 bh 1073 * Thuban/UI/join.py (JoinDialog): Extend to handle layer joins as
3694     well
3695     (JoinDialog.__init__): Use the layer parameter and only build the
3696     left choice when a layer is given
3697     (JoinDialog.OnJoin): Handle layer joins as well
3698     (JoinDialog.OnLeftTable, JoinDialog.OnRightTable): Handle the case
3699     that the user selects the "Select..." item. The sensitivitly
3700     updating is now in update_sensitivity
3701     (JoinDialog.y): New method to refactor the sensitivity update of
3702     the join button into its own method.
3703    
3704     * Thuban/UI/mainwindow.py (MainWindow.LayerJoinTable): Implement.
3705    
3706     2003-05-27 Bernhard Herzog <[email protected]>
3707    
3708 bh 1071 * Thuban/UI/mainwindow.py (table_close command): Make it sensitive
3709     iff there are unreferenced tables in the session
3710    
3711     2003-05-27 Bernhard Herzog <[email protected]>
3712    
3713 bh 1069 * Thuban/Model/messages.py (TABLE_REMOVED): New message.
3714    
3715     * Thuban/Model/session.py (Session.UnreferencedTables): New method
3716     to return tables that are not referenced by other tables or shape
3717     stores and can be removed.
3718     (Session.RemoveTable): Issue a TABLE_REMOVED message after
3719     removing the table
3720    
3721     * Thuban/UI/mainwindow.py: Remove unused imports
3722     (MainWindow.TableClose): Implement.
3723    
3724     * Thuban/UI/tableview.py (TableFrame.__init__): Subscribe to some
3725     messages so that the frame will be automatically closed when a new
3726     session is opened or the table is removed.
3727     (TableFrame.OnClose): Unsubscribe the Subscriptions made in
3728     __init__
3729     (TableFrame.close_on_session_replaced)
3730     (TableFrame.close_on_table_removed): New. Subscribers that close
3731     the window
3732    
3733     * test/test_session.py (TestSessionMessages.test_remove_table)
3734     (TestSessionSimple.test_remove_table): Move the test to
3735     TestSessionSimple and add test for the TABLE_REMOVED message
3736     (TestSessionBase.setUp): Also subscribe to TABLE_REMOVED
3737     (TestSessionSimple.test_unreferenced_tables) New. Test for the
3738     UnreferencedTables method.
3739     (UnreferencedTablesTests): New. Class with some more sophisticated
3740     tests for UnreferencedTables.
3741    
3742 frank 1065 2003-05-27 Frank Koormann <[email protected]>
3743    
3744 frank 1067 * Thuban/UI/tableview.py (QueryTableFrame.__init__): The "_S_election"
3745     display has some unwanted side effects. Removed again.
3746    
3747     2003-05-27 Frank Koormann <[email protected]>
3748    
3749 frank 1065 * Resources/Bitmaps/legend_icon_layer.xpm: New, icon for legend.
3750    
3751     * Thuban/UI/legend.py (LegendTree.__FillTree): Use "legend_icon_layer"
3752    
3753 jan 1062 2003-05-27 Jan-Oliver Wagner <[email protected]>
3754    
3755 bh 1069 * test/test_menu.py (MenuTest.test): Added test for
3756     Menu.RemoveItem().
3757 jan 1062
3758 bh 1069 * Thuban/UI/menu.py (Menu.RemoveItem): New. Remove an item from
3759     the menu.
3760 jan 1062
3761 frank 1059 2003-05-27 Frank Koormann <[email protected]>
3762    
3763     Nonmodal dialogs without parent (i.e. they can fall behind the main
3764     window)
3765    
3766     * Thuban/UI/mainwindow.py (MainWindow.OnClose): Explicitly destroy
3767     all dialogs in the dialogs dictionary and the canvas.
3768    
3769     * Thuban/UI/dialogs.py (NonModalNonParentDialog): New class, without
3770     parent, i.e. can fall behind other windows.
3771     (NonModalDialog.OnClose): Check is dialog is in mainwindow.dialog
3772     dictionary before removing it.
3773    
3774     * Thuban/UI/classifier.py: Dialog derived from NonModalNonParentDialog
3775    
3776     * Thuban/UI/projdialog.py: Dialog derived from NonModalNonParentDialog
3777     * Thuban/UI/tableview.py: Dialog derived from NonModalNonParentDialog
3778     * Thuban/UI/tree.py: Dialog derived from NonModalNonParentDialog
3779    
3780 bh 1053 2003-05-27 Bernhard Herzog <[email protected]>
3781    
3782 bh 1055 * Thuban/UI/mainwindow.py (MainWindow.ShowTableView): New. Open a
3783     tableview dialog
3784     (MainWindow.TableShow): Use ShowTableView to open the dialogs.
3785     Also, don't use the table's titles as the dialog names. The titles
3786     aren't guaranteed to be unique.
3787     (MainWindow.TableOpen): Open a table view dialog after opening the
3788     table
3789    
3790     2003-05-27 Bernhard Herzog <[email protected]>
3791    
3792 bh 1053 * Thuban/UI/mainwindow.py: Remove the Table/Hide menu item. Its
3793     effect can be achieved by simply closing the window showing the
3794     table.
3795     (MainWindow.TableHide): Removed.
3796     (main_menu): Removed "table_hide"
3797    
3798 frank 1051 2003-05-27 Frank Koormann <[email protected]>
3799    
3800     Fix legend tree display problems under Win32
3801    
3802     * Thuban/UI/legend.py: BMP_SIZE_W = 15
3803     (LegendTree.__FillTree): Display "legend_icon_map.xpm" with layer title.
3804     (LegendTree.__FillTreeLayer): Explicitely set SelectedImage.
3805    
3806     * Resources/Bitmaps/legend_icon_map.xpm: New icon for legend.
3807    
3808 jan 1048 2003-05-27 Jan-Oliver Wagner <[email protected]>
3809    
3810     * Thuban/UI/menu.py (Menu.InsertSeparator): Additional optional parameter
3811     'after' now allows to insert separators almost anywhere in the menu.
3812    
3813 frank 1046 2003-05-27 Frank Koormann <[email protected]>
3814    
3815     * Thuban/UI/tableview.py (QueryTableFrame.__init__): Underline the
3816     "S" of selection box label to hint on hot key (Alt-S). Works under
3817     Win32 but is ignored under GTK.
3818    
3819     2003-05-26 Frank Koormann <[email protected]>
3820    
3821     * Thuban/UI/projdialog.py (ProjFrame.__do_layout, ProjPanel._DoLayout):
3822     Center Choices.
3823    
3824 bh 1038 2003-05-26 Bernhard Herzog <[email protected]>
3825    
3826 bh 1044 Remove the Precision methods again. They're too DBF specific to be
3827     part of the table interface and they're only used in table_to_dbf
3828     anyway.
3829    
3830     * Thuban/Model/transientdb.py (TransientTableBase.Width):Use a
3831     fixed precision of 12 for doubles.
3832     (TransientTableBase.Precision): Removed
3833     (AutoTransientTable.Width): Delegate to self.table.
3834    
3835     * Thuban/Model/table.py (DBFTable.Precision)
3836     (MemoryTable.Precision): Removed.
3837     (MemoryTable.Width): Use a fixed precision of 12 for doubles.
3838     (table_to_dbf): Use a fixed precision of 12 for floats unless the
3839     column object specifies something else.
3840    
3841     * test/test_dbf_table.py (TestTableToDBF.test_table_to_dbf): New.
3842     test for table_to_dbf
3843    
3844     2003-05-26 Bernhard Herzog <[email protected]>
3845    
3846     * test/test_transientdb.py
3847     (TestTransientTable.run_iceland_political_tests): Fix a comment.
3848    
3849     2003-05-26 Bernhard Herzog <[email protected]>
3850    
3851 bh 1038 * Thuban/UI/mainwindow.py (MainWindow.TableOpen): Real
3852     implementation. Mark parts of the file format strings for
3853     localization.
3854    
3855     * Thuban/Model/session.py (Session.OpenTableFile): New. Open a dbf
3856     file and add the table to the tables managed by the session
3857    
3858 bh 1040 * test/test_session.py (TestSessionSimple.test_open_table_file):
3859     New. test case for OpenTableFile
3860    
3861 jan 1033 2003-05-26 Jan-Oliver Wagner <[email protected]>
3862    
3863 jan 1035 * Thuban/UI/controls.py, Thuban/UI/identifyview.py, Thuban/UI/join.py,
3864     Thuban/UI/labeldialog.py, Thuban/UI/mainwindow.py,
3865     Thuban/UI/proj4dialog.py, Thuban/UI/tableview.py, Thuban/UI/view.py:
3866     Replace the true/false of wxWindows by True/False of Python 2.2.1.
3867    
3868     2003-05-26 Jan-Oliver Wagner <[email protected]>
3869    
3870 bh 1038 * Thuban/UI/tableview.py (LayerTableFrame.__init__): If there is
3871     already a selection present, update the grid accordingly.
3872 jan 1033
3873     * Thuban/UI/mainwindow.py (MainWindow.TableShow): Make the dialog
3874     resizeable and increase its initial size.
3875    
3876 frank 1030 2003-05-26 Frank Koormann <[email protected]>
3877    
3878     Table export functionality
3879    
3880     * Thuban/Model/table.py (DBFTable.Width, MemoryTable.Width):
3881     Return width (in characters) for a column.
3882     (DBFTable.Precision, MemoryTable.Precision): Return decimal precision.
3883     (table_to_dbf): Write table to dbf file.
3884     (table_to_csv): Write table to csv file.
3885    
3886     * Thuban/Model/transientdb.py (TransientTableBase.Width,
3887     TransientTableBase.Precision): Return column width and precision.
3888    
3889     * Thuban/UI/tableview.py (QueryTableFrame.OnSaveAs): Call table_to_dbf
3890     or table_to_csv depending on file selection.
3891    
3892     * test/test_dbf_table.py:
3893     Test table_to_dbf (extension of former part of test).
3894    
3895     * test/test_csv_table.py:
3896     Test table_to_csv.
3897    
3898 jan 1021 2003-05-23 Jan-Oliver Wagner <[email protected]>
3899    
3900 jan 1024 * Thuban/UI/join.py (JoinDialog.OnJoin): Use _() for strings.
3901     Use QueryTableFrame instead of TableFrame.
3902 jan 1021
3903 jan 1024 * Thuban/UI/mainwindow.py (MainWindow.LayerShowTable): Prefix the
3904     table window with 'Layer Table:' instead of 'Table:'.
3905    
3906     2003-05-23 Jan-Oliver Wagner <[email protected]>
3907    
3908     Give all tables a title via mix-in TitledObject.LayerShowTable
3909    
3910 jan 1021 * Thuban/Model/base.py (TitledObject.SetTitle): Call method 'issue'
3911     only if it exists.
3912    
3913     * Thuban/Model/table.py (DBFTable, MemoryTable): mix-in TitledObject
3914     and call its init-method with a default title. Remove Title() method.
3915    
3916     * Thuban/Model/transientdb.py (TransientTable, TransientJoinedTable,
3917     AutoTransientTable): mix-in TitledObject and call its init-method with
3918     a default title. Remove Title() method.
3919    
3920 bh 1017 2003-05-23 Bernhard Herzog <[email protected]>
3921    
3922     * Thuban/Model/session.py (Session.AddShapeStore): Define
3923     AddShapeStore analogously to AddTable.
3924    
3925     * test/test_session.py (TestSessionSimple.test_add_shapestore):
3926     New. Test for AddShapeStore
3927    
3928 jan 1015 2003-05-23 Jan-Oliver Wagner <[email protected]>
3929    
3930     Introducing QueryTableFrame and a very coarse ShowTable implementation.
3931    
3932     * Thuban/UI/tableview.py (LayerTableFrame, QueryTableFrame): Split the
3933     class LayerTableFrame into two classes, LayerTableFrame and QueryTableFrame.
3934     The latter implements the selection GUI without dependency on a layer.
3935     LayerTableFrame now is derived from QueryTableFrame and connects
3936     to a layer.
3937    
3938     * Thuban/UI/mainwindow.py (MainWindow.TableShow): A very coarse
3939     implementation that still needs work.
3940    
3941     * Thuban/Model/layer.py (Layer.TreeInfo): Added filename.
3942    
3943 frank 1011 2003-05-22 Frank Koormann <[email protected]>
3944    
3945     * Thuban/Model/transientdb.py (TransientJoinedTable.__init__):
3946     Added "outer_join = False" as optional parameter.
3947     (TransientJoinedTable.create): If outer join is true, perform a
3948     "LEFT OUTER JOIN" instead of "JOIN", which preserves all records of
3949     the left table. Records not matching are filled with 0 / None.
3950    
3951     * Thuban/UI/join.py (JoinDialog.__init__): Checkbox for outer join.
3952     (JoinDialog.OnJoin): Consider outer join check box.
3953    
3954 bh 1006 2003-05-22 Bernhard Herzog <[email protected]>
3955    
3956 bh 1008 * Thuban/UI/join.py (JoinDialog.OnJoin): Use exc_info in a
3957     somewhat safer way. Storing the traceback in a local variable can
3958     lead to memory leaks
3959    
3960     2003-05-22 Bernhard Herzog <[email protected]>
3961    
3962 bh 1006 * Thuban/UI/join.py (JoinDialog.OnJoin): Make sure to really call
3963     the wxMessageDialog's Destroy() method.
3964    
3965 frank 1004 2003-05-22 Frank Koormann <[email protected]>
3966    
3967     * Thuban/UI/join.py (JoinDialog.__init__): Make use of
3968     TransientTable.Title()
3969    
3970     2003-05-22 Frank Koormann <[email protected]>
3971    
3972     Join Dialog, initial version.
3973    
3974     * Thuban/UI/mainwindow.py (MainWindow.TableJoin): Removed print.
3975    
3976     * Thuban/UI/join.py (JoinDialog): Functional implementation of
3977     former framework. Renamed Table1/Table2 to LeftTable/RightTable
3978     in all occurences.
3979    
3980     * Thuban/Model/transientdb.py (TransientJoinedTable.__doc__):
3981     Typo fixed.
3982    
3983 bh 995 2003-05-22 Bernhard Herzog <[email protected]>
3984    
3985 bh 999 Give the tables titles so that the GUI can display more meaningful
3986     names. For now the titles are fixed but depend on e.g. filenames
3987     or the titles of the joined tables.
3988    
3989     * Thuban/Model/transientdb.py (TransientTable.Title)
3990     (TransientJoinedTable.Title, AutoTransientTable.Title): New.
3991    
3992     * Thuban/Model/table.py (DBFTable.Title, MemoryTable.Title): New.
3993    
3994     * test/test_transientdb.py
3995     (TestTransientTable.test_auto_transient_table_title): New. Test
3996     for the Title method
3997     (TestTransientTable.test_transient_joined_table)
3998     (TestTransientTable.test_transient_table): Add test for the Title
3999     methods
4000    
4001     * test/test_memory_table.py (TestMemoryTable.test_title): New.
4002     Test for the Title method
4003    
4004     * test/test_dbf_table.py (TestDBFTable.test_title): New. Test for
4005     the Title method
4006    
4007     2003-05-22 Bernhard Herzog <[email protected]>
4008    
4009 bh 997 * test/test_layer.py (TestLayer.setUp, TestLayer.tearDown):
4010     Provide a better way to destroy the layers
4011     (TestLayer.test_base_layer, TestLayer.test_arc_layer)
4012     (TestLayer.test_point_layer, TestLayer.test_empty_layer)
4013     (TestLayer.test_polygon_layer, TestLayer.test_get_field_type): Use
4014     the new way to destroy the layers.
4015     (TestLayer.test_derived_store): New. Test for using a layer with a
4016     DerivedShapeStore
4017    
4018     * Thuban/Model/layer.py (Layer.SetShapeStore): Only set the
4019     filename if the shape store actually has one.
4020    
4021     2003-05-22 Bernhard Herzog <[email protected]>
4022    
4023 bh 995 * Thuban/Model/table.py (DBFTable.FileName): New. Accessor method
4024     for the filename
4025    
4026     * test/test_dbf_table.py (TestDBFTable.test_filename): New. Test
4027     for the FileName method
4028     (TestDBFTableWriting.test_write): Fix spelling of filename
4029    
4030 tkoester 993 2003-05-22 Thomas Koester <[email protected]>
4031    
4032     * Thuban/Model/range.py, test/test_range.py: Brought over new Range
4033     from SciParam that now really is immutable.
4034    
4035 frank 992 2003-05-22 Frank Koormann <[email protected]>
4036    
4037     Layer Top/Bottom placement added to legend.
4038    
4039     * Thuban/UI/legend.py
4040     (LegendPanel._OnMoveTop(), LayerPanel._OnMoveBottom): New, methods
4041     bound to tool events.
4042     (LegendTree.MoveCurrentItemTop(), LegendTree.MoveCurrentItemBottom):
4043     New, methods binding the event methods with the map methods.
4044    
4045     * Thuban/Model/map.py (Map.TopLayer(), Map.BottomLayer()): New, place
4046     layer at top/bottom of layer stack.
4047    
4048     * Resources/Bitmaps/top_layer.xpm: New button icon.
4049    
4050     * Resources/Bitmaps/bottom_layer.xpm: New button icon.
4051    
4052 bh 988 2003-05-22 Bernhard Herzog <[email protected]>
4053    
4054     * Thuban/Model/session.py (Session.RemoveTable): New method to
4055     remove tables
4056    
4057     * test/test_session.py (TestSessionSimple.test_remove_table): New.
4058     Test for RemoveTable
4059    
4060 tkoester 986 2003-05-22 Thomas Koester <[email protected]>
4061    
4062     * Thuban/Model/classgen.py: Added short module doc string and CVS id.
4063     (ClassGenerator.GenUniformDistribution): Use new Range __init__, too.
4064    
4065 bh 983 2003-05-22 Bernhard Herzog <[email protected]>
4066    
4067 bh 985 Implement a way to discover dependencies between tables and
4068     shapestores.
4069    
4070     * Thuban/Model/transientdb.py (TransientTableBase.Dependencies)
4071     (TransientJoinedTable.Dependencies)
4072     (AutoTransientTable.SimpleQuery): New. Implement the dependencies
4073     interface
4074     (TransientJoinedTable.__init__): Keep tack of the original table
4075     objects in addition to the corresponding transient tables.
4076    
4077     * Thuban/Model/table.py (DBFTable.Dependencies)
4078     (MemoryTable.Dependencies): New. Implement the dependencies
4079     interface
4080    
4081     * Thuban/Model/data.py (ShapeTable): New. Helper class for
4082     ShapefileStore
4083     (ShapefileStore.__init__): Use ShapeTable instead of
4084     AutoTransientTable
4085     (ShapefileStore.Table, ShapefileStore.Shapefile): Add doc-strings
4086     (ShapefileStore.FileName, ShapefileStore.FileType): New. Accessor
4087     methods for filename and type
4088     (ShapefileStore.Dependencies): New. Implement the dependencies
4089     interface
4090     (DerivedShapeStore): New class to replace SimpleStore. The main
4091     difference to SimpleStore is that it depends not on a shapefile
4092     but another shapestore which expresses the dependencies a bit
4093     better
4094     (SimpleStore.__init__): Add deprecation warning.
4095    
4096     * test/test_dbf_table.py (TestDBFTable.test_dependencies): New.
4097     Test for the Dependencies method.
4098    
4099     * test/test_memory_table.py (TestMemoryTable.test_dependencies):
4100     New. Test for the Dependencies method.
4101    
4102     * test/test_transientdb.py
4103     (TestTransientTable.test_auto_transient_table_dependencies): New.
4104     Test for the Dependencies method.
4105     (TestTransientTable.test_transient_joined_table): Add test for the
4106     Dependencies method.
4107    
4108     * test/test_session.py (TestSessionSimple.setUp)
4109     (TestSessionSimple.tearDown): New. Implement a better way to
4110     destroy the sessions.
4111     (TestSessionSimple.test_initial_state)
4112     (TestSessionSimple.test_add_table): Bind session to self.session
4113     so that it's destroyed by tearDown
4114     (TestSessionSimple.test_open_shapefile): New. Test for
4115     OpenShapefile and the object it returns
4116    
4117     2003-05-22 Bernhard Herzog <[email protected]>
4118    
4119 bh 983 * Thuban/Model/session.py (Session.AddTable): New method to
4120     register tables with the session.
4121     (Session.Tables): Return the tables registered with AddTable too.
4122    
4123     * test/test_session.py (TestSessionSimple.test_add_table): New.
4124     Test case for the AddTable method
4125    
4126 frank 981 2003-05-22 Frank Koormann <[email protected]>
4127    
4128     UI polishing updates: Place main buttons (OK, Cancel, etc) in the
4129     lower right corner, center labels for selections, initialize controls
4130     in reasonable order for keyboard navigation.
4131    
4132     * Thuban/UI/projdialog.py (ProjFrame.__init__, ProjFrame.__doLayout)
4133     (ProjFrame.__DoOnProjAvail): Determine position of current projection
4134     using the wxListBox.FindString() method. Still a problem (#1886)
4135    
4136     * Thuban/UI/classifier.py
4137     (Classifier.__init__, SelectPropertiesDialog.__init__)
4138    
4139     * Thuban/UI/classgen.py (ClassGenDialog.__init__,
4140     (ClassGenDialog.__DoOnGenTypeSelect): Moved initialization of the
4141     different classification types from here to __init__.
4142     (GenUniquePanel.__init__): Set the column width of the first field
4143     in the Field ListCtrl to the full width.
4144    
4145     * Thuban/UI/tableview.py (LayerTableFrame.__init__): Rename 'Save As'
4146     Button to 'Export'. Center Buttons in Selection Box, set Focus to
4147     Grid.
4148     (LayerTableFrame.OnKeyDown()): New, bound to the grid with EVT_KEY_DOWN,
4149     changes focus to the Selection when pressing "Alt-S".
4150    
4151     * Thuban/UI/legend.py (LegendTree.__SetVisibilityStyle): Only gray out
4152     the text if not visible. The italic font sometimes exceeds the
4153     rendering area.
4154    
4155 jonathan 972 2003-05-21 Jonathan Coles <[email protected]>
4156 jonathan 971
4157 jonathan 975 * Thuban/UI/dock.py (DockFrame): Rename references to _OnClose
4158     to OnClose so that Thuban closes correctly.
4159    
4160     * Thuban/UI/mainwindow.py (MainWindow.OnClose): Call
4161     DockFrame.OnClose, not DockFrame._OnClose.
4162    
4163     2003-05-21 Jonathan Coles <[email protected]>
4164    
4165 jonathan 971 * Thuban/Model/classgen.py (ClassGenerator.GenQuantiles): Remove
4166     references to 'inf' and use new Range __init__ to pass floats
4167     directly rather than converting them to strings first.
4168     Fixes RTBug #1876.
4169    
4170     * Thuban/Model/classification.py (ClassGroupRange.SetRange):
4171     Use new Range ___init__ to pass floats.
4172    
4173     * Thuban/Model/layer.py (RasterLayer.__init__): Test if the
4174     filename is a valid image file. Throw IOError otherwise.
4175    
4176     * Thuban/Model/range.py: Brought over new Range from SciParam that
4177     is immutable and has an __init__ which can accept floats.
4178    
4179     * Thuban/UI/mainwindow.py (MainWindow.AddLayer): Move OpenShapefile
4180     into try block. AddLayer doesn't throw any exceptions anymore.
4181     (MainWindow.AddRasterLayer): Move constructor of RasterLayer into
4182     try block.
4183    
4184     * Thuban/UI/projdialog.py (GeoPanel.__init__): Put Degrees as
4185     the first item in choices. Fixes RTBug #1882.
4186    
4187     * Thuban/UI/renderer.py (MapRenderer.render_map): Check if scale
4188     has gone to 0 which is a serious problem. abort.
4189     (MapRenderer.draw_raster_layer): Catch IOError seperately and
4190     print the error from GDAL.
4191    
4192     * Thuban/UI/tableview.py (TableGrid.__init__): Call
4193     ToggleEventListeners to turn on listening.
4194     (TableGrid.ToggleEventListeners): New. Turns event listening on
4195     and off so as to prevent excessive messages.
4196     (LayerTableFrame.OnQuery): Use TableGrid.ToggleEventListeners
4197     to suppress excessive messages when selecting many rows.
4198     Fixes RTBug #1880.
4199    
4200     * Thuban/UI/view.py: Added checks against if scale == 0. This
4201     is a serious problem that can occur when an image without
4202     geo data is loading and causes the map projection bounds to
4203     go to infinity. Right now, the solution is to simply try
4204     to recover.
4205    
4206     * extensions/thuban/cpl_mfile.cpp (MFILEClose): Make sure
4207     to set the MFILEReceiver attributes even if the data is NULL.
4208    
4209     * extensions/thuban/gdalwarp.cpp: Improved the error handling
4210     and passed GDAL messages back up to the Python layer. Also
4211     tried to fix some memory leaks that were present in the original
4212     utility but didn't matter because the program aborted.
4213    
4214     * test/test_range.py: Copied over tests from SciParam. Removed
4215     tests against importing. Fixes RTBug #1867.
4216    
4217 bh 958 2003-05-21 Bernhard Herzog <[email protected]>
4218    
4219     * test/test_load.py: Remove unused imports and restructure the
4220     test code
4221     (LoadSessionTest): Split into one class for each test and turn
4222     LoadSessionTest itself into the base class for all such session
4223     tests.
4224     (ClassificationTest): New base class for load tests that test
4225     classifications
4226     (TestSingleLayer, TestLayerVisibility, TestClassification)
4227     (TestLabels, TestLayerProjection, TestRasterLayer): New classes
4228     for the individual tests
4229    
4230     * test/support.py (FileLoadTestCase.filename): New base class for
4231     file loading tests
4232    
4233 jan 955 2003-05-21 Jan-Oliver Wagner <[email protected]>
4234    
4235     * Resources/Projections/defaults.proj: Renamed 'Universal Transverse
4236     Mercator' to 'UTM Zone 32' as a more convenient example.
4237     Added 'Gauss Krueger Zone 6'.
4238    
4239     * Data/iceland_sample_raster.thuban: political polygon now
4240     filled transparent to have the raster image visible at once.
4241    
4242 frank 952 2003-05-21 Frank Koormann <[email protected]>
4243    
4244     * Thuban/UI/mainwindow.py (MainWindow): Renamed _OnClose() back to
4245     OnClose() to keep in sync with extensions. Internally Thuban
4246     still uses "underscored" names.
4247    
4248 jonathan 949 2003-05-20 Jonathan Coles <[email protected]>
4249    
4250     This puts back Raster layer support. These layers support projections
4251     through the GDAL library. Currently, the CVS version is being used.
4252     There are no Debian packages available although this may change soon.
4253     A GDAL driver was extended to support writing to memory rather to
4254     files.
4255    
4256     There is still some work that needs to be done, such as some error
4257     handling when loading invalid images or when there is a problem
4258     projecting the image. This putback simply checks in the majority
4259     of the work.
4260    
4261     * setup.py: Add gdalwarp library extension.
4262    
4263     * Thuban/Model/layer.py (BaseLayer.HasClassification): New.
4264     Defaults to False, but can be overridden by subclasses if they
4265     support classification.
4266     (RasterLayer): New. Defines a new layer that represents an
4267     image.
4268    
4269     * Thuban/Model/load.py (SessionLoader.__init__): Add rasterlayer
4270     tag handler.
4271     (SessionLoader.start_layer): Encode the filename.
4272     (SessionLoader.start_rasterlayer, SessionLoader.end_rasterlayer):
4273     New. Supports reading a rasterlayer tag.
4274    
4275     * Thuban/Model/map.py (Map.BoundingBox): Fix typo in comment.
4276    
4277     * Thuban/Model/save.py (XMLWriter.encode): Don't assume that we
4278     get a string in Latin1. If we get such as string convert it to
4279     unicode first, otherwise leave if alone before encoding.
4280     (SessionSaver.write_layer): Add support for writing both Layers
4281     and RasterLayers.
4282    
4283     * Thuban/Model/transientdb.py (AutoTransientTable.SimpleQuery):
4284     The right argument may not be a string, it could also be a Column.
4285    
4286     * Thuban/UI/application.py (ThubanApplication.CreateMainWindow):
4287     Make initial window size 600x400. Fixes RTBug #1872.
4288    
4289     * Thuban/UI/classifier.py (Classifier.__init__): Rearrange how
4290     the dialog is constructed so that we can support layers that
4291     do not have classifications.
4292     (Classifier._OnTry): Only build a classification if the layer
4293     supports one.
4294    
4295     * Thuban/UI/legend.py: Change all checks that a layer is an
4296     instance of Layer into checks against BaseLayer.
4297     (LegendTree.__FillTreeLayer): Only add children to a branch if
4298     the layer supports classification.
4299    
4300     * Thuban/UI/mainwindow.py (MainWindow.NewSession,
4301     MainWindow.OpenSession): Don't proceed with an action if the
4302     user chooses Cancel when they are asked to save changes.
4303     (MainWindow.AddRasterLayer): New. Open a dialog to allow the
4304     user to select an image file. Create a new RasterLayer and add
4305     it to the map.
4306    
4307     * Thuban/UI/renderer.py (MapRenderer.render_map): Add support
4308     for rendering RasterLayer layers.
4309     (MapRenderer.draw_raster_layer): Actually method that calls
4310     the GDALWarp python wrapper and constructs an image from the
4311     data returned.
4312    
4313     * Thuban/UI/tableview.py (LayerTableFrame.__init__): Change the
4314     Choices symbols to match those used in the table query method.
4315     Replace deprecated method calls on table with new method names.
4316    
4317     * Thuban/UI/view.py (MapCanvas.set_view_transform): Try to limit
4318     how small the scale can get. This still needs more testing.
4319    
4320     * extensions/thuban/bmpdataset.cpp: New, but copied from GDAL.
4321     Provides a driver to output in .bmp format.
4322    
4323     * extensions/thuban/cpl_mfile.cpp, extensions/thuban/cpl_mfile.h:
4324     New. Provides IO routines which write to memory, rather than a file.
4325    
4326     * extensions/thuban/gdalwarp.cpp: New, but basically a direct copy
4327     of the gdalwarp utility provided in GDAL. Added function calls
4328     that can be accessed from python.
4329    
4330     * Data/iceland_sample_raster.thuban: New. Sample file that uses
4331     a raster layer.
4332    
4333     * Data/iceland/island.tfw, Data/iceland/island.tif: New. Raster
4334     layer image data.
4335    
4336     * Doc/thuban.dtd: Added rasterlayer attribute definition.
4337    
4338     * test/test_layer.py, test/test_load.py, test/test_save.py: Added
4339     tests associated with the raster layer code.
4340    
4341     * test/test_transientdb.py
4342     (TestTransientTable.test_auto_transient_table_query): Added a test
4343     for using a Column object as the "right" parameter to a query.
4344    
4345 frank 924 2003-05-19 Frank Koormann <[email protected]>
4346    
4347 frank 927 * Thuban/version.py (get_changelog_date):
4348     Catch exceptions if ChangeLog does not exist.
4349    
4350     * Thuban/UI/view.py (MapCanvas.Export): Bugfix
4351    
4352     2003-05-19 Frank Koormann <[email protected]>
4353    
4354 frank 924 Extended version information for Thuban
4355    
4356     * Thuban/version.py: New, version information for Thuban: Last
4357     modification date and last ChangeLog entry date.
4358    
4359     * Thuban/UI/mainwindow.py (MainWindow.About()): Extended version
4360     information: Display Thuban, wxPython and Python version.
4361    
4362 bh 919 2003-05-16 Bernhard Herzog <[email protected]>
4363    
4364 bh 921 * Thuban/Model/save.py: Remove some unused imports including the
4365     __future__ import for nested_scopes as Thuban relies on Python 2.2
4366     now.
4367     (XMLWriter.encode): Remove the special case for a None argument.
4368     In the saver encode is always called with a string argument.
4369    
4370     2003-05-16 Bernhard Herzog <[email protected]>
4371    
4372 bh 919 * Thuban/UI/__init__.py: Remove the work-around for the locale bug
4373     in wxPython (at least when usinvg wxGTK) prior to 2.4. The symptom
4374     of the bug was that e.g. float("1.2") would fail. Thuban now
4375     requires 2.4.x.
4376    
4377 frank 917 2003-05-16 Frank Koormann <[email protected]>
4378    
4379     Printing enhancement and WMF export (under Win32)
4380    
4381     * Thuban/UI/renderer.py (ExportRenderer): New, derived from
4382     ScreenRenderer. Renders Map, Legend and Scalebar for export.
4383     (PrinterRenderer): New, derived from ExportRenderer. Replaces the old
4384     PrintRender.
4385    
4386     * Thuban/UI/view.py (MapPrintout.__init__): Enhanced parameter set
4387     to fullfil information needed for PrinterRenderer.
4388     (MapCanvas.Export): New. Export Map (currently only to WMF on Win32).
4389     (MapCanvas.Print): Adapted to new MapPrintout.
4390     (OutputTransform): General calculations to transform from canvas
4391     coordinates to export/printing devices.
4392    
4393     * Thuban/UI/mainwindow.py (MainWindow.ExportMap()): New. Added also
4394     new method_command to call ExportMap, with platform dependency (only
4395     __WXMSW__)
4396    
4397     * Thuban/UI/scalebar.py (ScaleBar.DrawScaleBar): Position and Size
4398     of scalebar drawing area as new parameters.
4399    
4400     * Thuban/Model/scalebar.py (roundInterval): round long instead of int
4401    
4402     * Thuban/UI/legend.py (ScalebarBitmap.__SetScale):
4403     Update to extended scalebar.DrawScalebar header.
4404    
4405     * test/test_export.py: New, test Thuban.UI.view.OutputTransform()
4406    
4407     * test/test_scalebar.py: Made test executable as standalone.
4408    
4409 bh 908 2003-05-16 Bernhard Herzog <[email protected]>
4410    
4411     * Thuban/Model/table.py (Table): Remove this compatibility alias
4412     for DBFTable.
4413    
4414     * test/test_table.py: Import DBFTable as Table because that alias
4415     doesn't exist anymore.
4416    
4417     * Thuban/UI/classgen.py: Remove some unused imports
4418    
4419 jonathan 906 2003-05-14 Jonathan Coles <[email protected]>
4420    
4421     * Thuban/Model/classgen.py (ClassGenerator.GenSingletonsFromList):
4422     Fix docstring.
4423     (ClassGenerator.GenUniformDistribution): Fix spelling of method name.
4424     (ClassGenerator.GenQuantiles): Use the left/right brackets and min/max
4425     values of the supplied range to determine the beginning and end
4426     bounds of the generated classes.
4427    
4428     * Thuban/Model/range.py (Range.number_re): Now accepts floats that
4429     do not have a leading 0 (.5 is now accepted as well as 0.5).
4430    
4431     * Thuban/UI/classgen.py (ClassGenDialog.OnOK): Fix name of method
4432     call to ClassGenerator.GenUniformDistribution.
4433    
4434     * Thuban/UI/projdialog.py (ProjFrame.__do_layout): Fix Windows
4435     layout bug with the 'Projection' label.
4436    
4437     * test/support.py (FloatTestCase): New. Needed for the Range tests.
4438    
4439     * test/test_range.py: New. Imported from SciParam.
4440    
4441 jonathan 897 2003-05-12 Jonathan Coles <[email protected]>
4442    
4443 jonathan 899 * Thuban/UI/classgen.py (GenQuantilesPanel.GetList): Replace call
4444     to table.UniqueValues() with calls that retrieve all the values
4445     from the table. This will need to be replaced by a method on table
4446     which can simply return the list (perhaps more efficiently).
4447    
4448     2003-05-12 Jonathan Coles <[email protected]>
4449    
4450 jonathan 897 The return value of ClassGenerator.CalculateQuantiles has changed.
4451     Refer to the documentation for details.
4452    
4453     * test/test_classgen.py: Modified Quantile tests to use the
4454     new return values.
4455    
4456     * Thuban/Model/classgen.py
4457     (ClassGenerator.GenQuantiles): Add comments describing the parameters,
4458     use new return values from CalculateQuantiles to produce the correct
4459     range bounds in the Classification.
4460     (ClassGenerator.CalculateQuantiles): Add more comments describing
4461     the return values and parameters. Make minor adjustments to improve
4462     the legibility of the code. Fix problem with adjusted not being set
4463     in most cases.
4464    
4465 frank 893 2003-05-12 Frank Koormann <[email protected]>
4466    
4467     * Thuban/Model/save.py (XMLWriter.encode()): Explicite call to unicode
4468     and latin1. Fixes #1851 finally.
4469    
4470 jonathan 889 2003-05-09 Jonathan Coles <[email protected]>
4471    
4472 jonathan 897 * test/test_classgen.py: New. Tests the Quantile algorithm.
4473    
4474     * Thuban/Model/classgen.py (ClassGenerator.CalculateQuantiles):
4475     Clean up debugging statement, add comments, fix a small bug in the
4476     returned adjusted percentiles.
4477    
4478     2003-05-09 Jonathan Coles <[email protected]>
4479    
4480 jonathan 889 Introduces Range class from SciParam into the ClassGroupRange class,
4481     and such ranges can now be saved and loaded from disk.
4482    
4483     Quantiles are now available in the Classification Generator.
4484    
4485     Initial support for building Queries on a table. Doesn't do anything
4486     but run some tests.
4487    
4488     * Thuban/Model/classification.py: Explicit imports.
4489     (ClassGroupRange): Use the Range class to store the underlying
4490     range information. The interface remains the same, except for
4491     GetRange(), and you can also supply a Range object as the min
4492     parameter to SetRange or __init__.
4493    
4494     * Thuban/Model/load.py (XMLReader.encode): New. Encodes the given
4495     string appropriately for use in Thuban. Fixes RTbug #1851.
4496     (SessionLoader.end_projection): Handle the context of the
4497     projection tag a bit better by looking at what objects are not
4498     None. There was an assumption that a projection tag for a map
4499     could occur before any layers.
4500     (SessionLoader.start_clrange): Provide backward compatibility for
4501     reading min/max values as well as the new range parameter.
4502    
4503     * Thuban/Model/map.py: Explicit imports.
4504    
4505     * Thuban/Model/resource.py: Import _.
4506     (ProjFileSaver.write): write header using projfile.dtd.
4507    
4508     * Thuban/Model/save.py: Explicit imports.
4509     (XMLWriter.encode): New. Encode the given string from a format
4510     used by Thuban into UTF-8. Fixes RTbug #1851.
4511    
4512     * Thuban/UI/classgen.py: Explicit imports.
4513     (ClassGenDialog.__init__): Clean up the code and add support
4514     for Quantiles.
4515     (ClassGenDialog.OnOK): Add support for Quantiles.
4516     (GenQuantilesPanel): New. Input panel for Quantiles.
4517     (ClassGenerator, CustomRamp, MonochromaticRamp, GreyRamp, RedRamp,
4518     GreenRamp, BlueRamp, HotToColdRamp): Move to Thuban/Model/classgen.py
4519    
4520     * Thuban/Model/classgen.py: New. Contains all the classes named above.
4521    
4522     * Thuban/UI/classifier.py: Explicit imports.
4523     (ClassTable.GetValueAsCust, ClassTable.__ParseInput,
4524     ClassTable.SetValueAsCustom): Reworked to use new Range class.
4525    
4526     * Thuban/UI/legend.py: Explicit imports.
4527    
4528     * Thuban/UI/mainwindow.py: Add support for the Join Dialog. Added
4529     a Table menu and associated method calls.
4530     (MainWindow.choose_color): Removed. No longer needed.
4531    
4532     * Thuban/UI/projdialog.py (ProjFrame.__VerifyButtons): Save button
4533     should be disabled if no projection is selected in the available
4534     list.
4535    
4536     * Thuban/UI/renderer.py: Explicit imports.
4537    
4538     * Thuban/UI/tableview.py (TableGrid.OnRangeSelect): Fix some issues
4539     with correctly selecting the rows and issuing the right events.
4540     Be sure to call Skip() to allow the grid to do some of its own
4541     handling which allows the rows to actually be selected.
4542     (LayerTableGrid.select_shapes): Rename from select_shape. Supports
4543     selecting multiple shapes.
4544     (LayerTableFrame): Support for building Queries.
4545     (LayerTableFrame.select_shapes): Allow multiple shapes to be selected.
4546    
4547     * Thuban/UI/tree.py: Explicit imports.
4548    
4549     * Thuban/UI/view.py (MapCanvas): Delegate "SelectedShapes" so the
4550     table view can call it.
4551    
4552     * test/test_classification.py: Explicit imports.
4553     (TestClassification.test_ClassGroupRange): Fix test for new
4554     Range class.
4555    
4556     * Doc/thuban.dtd: Add range parameter for clrange.
4557    
4558     * Thuban/Model/range.py: Taken from SciParam. Used as the underlying
4559     object in ClassGroupRange, and also uesd for inputting ranges in
4560     the classifer table and elsewhere.
4561    
4562     * Thuban/UI/join.py: New. Initial Join dialog. No real functionality
4563     yet.
4564    
4565 frank 872 2003-05-09 Frank Koormann <[email protected]>
4566    
4567     * Thuban/UI/scalebar.py (DrawScaleBar): Draw only if interval > 0.0.
4568    
4569 frank 860 2003-05-08 Frank Koormann <[email protected]>
4570    
4571 frank 870 Coding style updates
4572    
4573     * test/test_scalebar.py: Replaced tab indentation by spaces.
4574    
4575     * Thuban/UI/scalebar.py: Explicit imports.
4576    
4577     2003-05-08 Frank Koormann <[email protected]>
4578    
4579 frank 867 * Thuban/UI/scalebar.py
4580     (ScaleBar.DrawScalebar): Format string bug fixed.
4581    
4582     2003-05-08 Frank Koormann <[email protected]>
4583    
4584 frank 865 Reorganization of scalebar component (no wx in Thuban/Model)
4585    
4586     * Thuban/Model/scalebar.py: Rendering moved to Thuban/UI/scalebar.py
4587     (deriveInterval):
4588     Calculate scalebar interval and unit which fits in width for scale.
4589     (roundInterval): Round float.
4590    
4591     * Thuban/UI/scalebar.py (ScaleBar): Scalebar rendering
4592    
4593     * test/test_scalebar.py: Test for Thuban/Model/scalebar.py methods.
4594    
4595     * Thuban/UI/legend.py: Import Thuban.UI.scalebar
4596    
4597     2003-05-08 Frank Koormann <[email protected]>
4598    
4599 frank 860 * Thuban/UI/legend.py (ScalebarBitmap.SetCanvas):
4600     Initialize ScaleBar with canvas.map
4601    
4602     * Thuban/Model/scalebar.py (ScaleBar.roundInterval()): New,
4603     round intervals to display smarter lengths
4604     (ScaleBar.DrawScalebar): Draw Scalebar only if the map contains a
4605     layer. If the maps has no projection applied grey the scalebar.
4606    
4607 frank 857 2003-05-07 Frank Koormann <[email protected]>
4608    
4609     Basic Scalebar features added.
4610    
4611     * Thuban/Model/scalebar.py (ScaleBar): New, scalebar rendering.
4612    
4613     * Thuban/UI/legend.py (LegendPanel): Added scalebar bitmap
4614     (ScaleBarBitmap): New, links the scalebar bitmap with view messages
4615     and the renderer.
4616    
4617     * Thuban/UI/view.py (MapCanvas.set_view_transform): Issue SCALE_CHANGED.
4618    
4619     * Thuban/UI/messages.py: SCALE_CHANGED added.
4620    
4621 bh 850 2003-05-07 Bernhard Herzog <[email protected]>
4622    
4623 bh 852 * Thuban/Model/session.py (Session.__init__): New instance
4624     variable shapestores to hold a list of all open shapestore objects
4625     (Session.ShapeStores): New. Accessor method for the shapestores
4626     list.
4627     (Session._add_shapestore, Session._clean_weak_store_refs): New.
4628     Internal methods to maintain the shapestores list.
4629     (Session.Tables): New. Return all tables open in the session.
4630     (Session.OpenShapefile): Insert the new ShapeStore into the
4631     shapestores list.
4632    
4633     * test/test_session.py (TestSessionSimple.test_initial_state): Add
4634     tests for ShapeStores and Tables
4635     (TestSessionWithContent.test_shape_stores)
4636     (TestSessionWithContent.test_tables): New. Test cases for
4637     ShapeStores and Tables
4638    
4639     2003-05-07 Bernhard Herzog <[email protected]>
4640    
4641 bh 850 * Thuban/Model/transientdb.py (TransientTableBase.ReadRowAsDict):
4642     Add comments about the optimizations used.
4643     (AutoTransientTable.ReadValue, TransientTableBase.ReadValue): New.
4644     Implement the ReadValue table interface method.
4645    
4646     * test/test_transientdb.py
4647     (TestTransientTable.run_iceland_political_tests)
4648     (TestTransientTable.test_transient_joined_table): Add tests for
4649     ReadValue
4650    
4651 frank 848 2003-05-07 Frank Koormann <[email protected]>
4652    
4653     * Resources/Bitmaps/fulllayerextent.xpm,
4654     Resources/Bitmaps/fullselextent.xpm: Replaced the place holders with
4655     new icons.
4656    
4657 bh 840 2003-05-06 Bernhard Herzog <[email protected]>
4658    
4659 bh 846 * Thuban/Model/transientdb.py (AutoTransientTable.SimpleQuery):
4660     New. Simply delegate to the transient table's version.
4661    
4662     * test/test_transientdb.py
4663     (TestTransientTable.test_auto_transient_table_query): New. Test
4664     case for AutoTransientTable's SimpleQuery
4665    
4666     2003-05-06 Bernhard Herzog <[email protected]>
4667    
4668 bh 843 * Thuban/Model/transientdb.py (TransientTableBase.SimpleQuery):
4669     Implement a simple query method for the query dialog
4670     (TransientTableBase.create): Add an INTEGER PRIMARY KEY that holds
4671     the row index or shapeid.
4672     (TransientTable.create): Insert the right value of the row index
4673     (TransientJoinedTable.create): Copy the row index of the left
4674     table to the joined result table
4675    
4676     * test/test_transientdb.py
4677     (TestTransientTable.test_transient_table_read_twice): Fix
4678     doc-string
4679     (TestTransientTable.test_transient_table_query): New. Test for the
4680     SimpleQuery method
4681    
4682     2003-05-06 Bernhard Herzog <[email protected]>
4683    
4684 bh 840 Convert all table users to use the new table interface. This only
4685     covers Thuban itself, not GREAT-ER or other applications built on
4686     Thuban yet, so the compatibility interface stays in place for the
4687     time being but it now issues DeprecationWarnings.
4688    
4689     Finally, the new Table interface has a new method, HasColumn.
4690    
4691     * Thuban/Model/table.py (OldTableInterfaceMixin): All methods
4692     issue deprecation warnings when they're. The warnings refer to the
4693     caller of the method.
4694     (OldTableInterfaceMixin.__deprecation_warning): New. Helper method
4695     for the deprecation warnings
4696    
4697     * test/test_table.py: Ignore the deprecation warnings for the old
4698     table in the tests in this module. The purpose of the tests is to
4699     test the old interface, after all.
4700    
4701     * test/test_transientdb.py
4702     (TestTransientTable.run_iceland_political_tests): Use the
4703     constants for the types. Add a test for HasColumn
4704     (TestTransientTable.test_transient_joined_table): Adapt to new
4705     table interface. Add a test for HasColumn
4706     (TestTransientTable.test_transient_table_read_twice): Adapt to new
4707     table interface
4708    
4709     * Thuban/UI/tableview.py (DataTable.SetTable, DataTable.GetValue):
4710     Adapt to new table interface
4711    
4712     * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Adapt to
4713     new table interface
4714    
4715     * Thuban/UI/controls.py (RecordListCtrl.fill_list)
4716     (RecordTable.SetTable): Adapt to new table interface
4717    
4718     * Thuban/UI/classifier.py (Classifier.__init__)
4719     (Classifier.__init__): Adapt to new table interface
4720    
4721     * Thuban/UI/classgen.py (ClassGenDialog.__init__)
4722     (GenUniformPanel._OnRetrieve, GenUniquePanel._OnRetrieve): Adapt
4723     to new table interface
4724    
4725     * Thuban/Model/transientdb.py (TransientTableBase.HasColumn)
4726     (AutoTransientTable.HasColumn): Implement the new table interface
4727     method
4728     (AutoTransientTable.ReadRowAsDict, AutoTransientTable.ValueRange)
4729     (AutoTransientTable.UniqueValues): Adapt to new table interface
4730    
4731     * Thuban/Model/layer.py (Layer.SetShapeStore, Layer.GetFieldType):
4732     Adapt to new table interface
4733    
4734     * test/test_layer.py (TestLayer.open_shapefile): Helper method to
4735     simplify opening shapefiles a bit easier.
4736     (TestLayer.test_arc_layer, TestLayer.test_polygon_layer)
4737     (TestLayer.test_point_layer): Use the new helper method
4738     (TestLayer.test_get_field_type): New. Test for the GetFieldType
4739     method
4740    
4741     * test/test_dbf_table.py (TestDBFTable.test_has_column): Test for
4742     the new table method
4743    
4744     * test/test_memory_table.py (TestMemoryTable.test_has_column):
4745     Test for the new table method HasColumn
4746    
4747 jonathan 833 2003-05-06 Jonathan Coles <[email protected]>
4748    
4749     Addresses the "Selection Extent" wish of RTbug #1787.
4750    
4751     * Resources/Bitmaps/fulllayerextent.xpm,
4752     Resources/Bitmaps/fullselextent.xpm: Bitmaps for layer and selection
4753     extent. These are just place holders for the real bitmaps.
4754    
4755     * Thuban/Model/layer.py (Shape): Since a Shape is immutable only
4756     calculate the bounding box once (the first time compute_bbox() is
4757     called).
4758     (Layer.ShapesBoundingBox): New. Given a list of shape ids, return
4759     the bounding box for the shapes in lat/long coordinates.
4760    
4761     * Thuban/UI/mainwindow.py: Added new "Full selection extent" menu
4762     option.
4763     (MainWindow.has_selected_shapes): New. Returns true if there are
4764     any selected shapes.
4765     (MainWindow.FullSelectionExtent): New. Calls
4766     MapCanvas.FitSelectedToWindow() when the user selects the menu option.
4767     (_has_selected_shapes): New. Returns true if there are any
4768     selected shapes.
4769    
4770     * Thuban/UI/selection.py (Selection.HasSelectedShapes): New. Returns
4771     true if there are any selected shapes.
4772    
4773     * Thuban/UI/view.py (MapCanvas): Added delegated method
4774     HasSelectedShapes.
4775     (MapCanvas.FitSelectedToWindow): New. Centers and scales any selected
4776     shapes on the canvas using the map projection (if any).
4777    
4778     * test/test_layer.py (TestLayer.test_arc_layer): Add some tests
4779     for Layer.ShapesBoundingBox().
4780    
4781 bh 826 2003-05-06 Bernhard Herzog <[email protected]>
4782    
4783     * Resources/Projections/defaults.proj: Fix spelling of Mercator
4784    
4785 jonathan 823 2003-05-05 Jonathan Coles <[email protected]>
4786    
4787     Addresses the "Full Layer Extent" wish of RTbug #1787.
4788    
4789     * Resources/Projections/defaults.proj: Added UK National Grid.
4790    
4791     * Thuban/UI/mainwindow.py: Added new "Full layer extent" menu option.
4792     (MainWindow.FullLayerExtent): New. Calls MapCanvas.FitLayerToWindow()
4793     when the user selects the menu option.
4794    
4795     * Thuban/UI/view.py (MapCanvas.FitLayerToWindow): New. Centers and
4796     scales the given layer on the canvas using the map projection.
4797    
4798 bh 819 2003-05-05 Bernhard Herzog <[email protected]>
4799    
4800     Convert the table implementations to a new table interface. All
4801     tables use a common mixin class to provide backwards compatibility
4802     until all table users have been updated.
4803    
4804     * Thuban/Model/table.py (OldTableInterfaceMixin): Mixin class to
4805     provide backwards compatibility for table classes implementing the
4806     new interface
4807     (DBFTable, MemoryTable): Implement the new table interface. Use
4808     OldTableInterfaceMixin as base for compatibility
4809     (DBFColumn, MemoryColumn): New. Column description for DBFTable
4810     and MemoryTable resp.
4811    
4812     * test/test_dbf_table.py: New. Test cases for the DBFTable with
4813     the new table interface.
4814    
4815     * test/test_memory_table.py: New. Test cases for the MemoryTable
4816     with the new table interface.
4817    
4818     * test/test_table.py: Document the all tests in this file as only
4819     for backwards compatibility. The equivalent tests for the new
4820     interface are in test_memory_table.py and test_dbf_table.py
4821     (MemoryTableTest.test_read): field_info should be returning tuples
4822     with four items
4823     (MemoryTableTest.test_write): Make doc-string a more precise.
4824    
4825     * Thuban/Model/transientdb.py (TransientTableBase): Convert to new
4826     table interface. Derive from from OldTableInterfaceMixin for
4827     compatibility.
4828     (TransientTableBase.create): New intance variable column_map to
4829     map from names and indices to column objects
4830     (TransientTable.create): Use the new table interface of the input
4831     table
4832     (AutoTransientTable): Convert to new table interface. Derive from
4833     from OldTableInterfaceMixin for compatibility.
4834     (AutoTransientTable.write_record): Removed. It's not implemented
4835     yet and we still have to decide how to handle writing with the new
4836     table and data framework.
4837    
4838     * test/test_transientdb.py
4839     (TestTransientTable.run_iceland_political_tests)
4840     (TestTransientTable.test_transient_joined_table): Use the new
4841     table interface
4842    
4843 jonathan 817 2003-05-05 Jonathan Coles <[email protected]>
4844    
4845     This is namely a collection of UI updates to improve user interactivity.
4846     Tabbing between controls now exists and you can use ESC to close dialog
4847     boxes; ENTER will active the default button.
4848    
4849     * Thuban/UI/classgen.py (ClassGenDialog.__init__): Rearrange the
4850     order that the controls are created so that tabbing works correctly.
4851     (ClassGenDialog.OnOK): Renamed from _OnGenerate() so that the
4852     wxDialog can handle the default button correctly.
4853     (ClassGenDialog.OnCancel): Renamed from _OnCloseBtn() for the
4854     same reasons as for OnOK.
4855     (GenUniformPanel._OnRetrieve): Call wxBeginBusyCursor/wxEndBusyCursor
4856     when we ask the table for the maximum/minimum values of a field
4857     which could take a very long time.
4858    
4859     * Thuban/UI/classifier.py (Classifier.__init__): Rearrange the
4860     order that the controls are created so that tabbing works correctly.
4861     (SelectPropertiesDialog.__init__): Rearrange the order that the
4862     controls are created so that tabbing works correctly.
4863    
4864     * Thuban/UI/dialogs.py: Copied NonModalDialog box and changed it
4865     to derive from a wxDialog but behave like the original implementation
4866     which was derived from a wxFrame. wxDialog provides useful key
4867     handling functionality like ESC calling OnCancel and ENTER calling
4868     OnOK which is lost with wxFrame.
4869    
4870     * Thuban/UI/mainwindow.py: Add "..." to menu items that will open
4871     new dialogs.
4872    
4873     * Thuban/UI/projdialog.py (ProjFrame.__init__): Rearrange the
4874     order that the controls are created so that tabbing works correctly.
4875     (ProjFrame.OnApply): Renamed from _OnTry() to use wxDialog behaviour.
4876     (ProjFrame.OnOK): Renamed from _OnOK() to use wxDialog behaviour.
4877     (ProjFrame.OnCancel): Renamed from _OnClose() to use wxDialog behaviour.
4878     (ProjPanel.__init__): Add "Airy" to the list of ellipsoids so we
4879     can provide the "UK National Grid" as a default projection.
4880     (UTMPanel.__init__): Rearrange the order that the controls are
4881     created so that tabbing works correctly.
4882    
4883 bh 809 2003-05-05 Bernhard Herzog <[email protected]>
4884    
4885 bh 811 * extensions/thuban/wxproj.cpp: Fix some of the comments.
4886     (project_point): If a map projection but no layer projection is
4887     given, convert degrees to radians before applying the map
4888     projection.
4889    
4890 bh 809 * Thuban/UI/tableview.py (TableGrid.disallow_messages)
4891     (TableGrid.allow_messages): New methods to make it possible to
4892     inhibit message sending.
4893     (TableGrid.issue): Only send the message if not inhibited.
4894     (LayerTableGrid.select_shape): Use the new methods to make sure
4895     that no ROW_SELECTED message is sent while we're updating the
4896     selected rows to match the selected shapes.
4897    
4898 jan 807 2003-05-02 Jan-Oliver Wagner <[email protected]>
4899    
4900     Implementation of MemoryTable.
4901    
4902     * Thuban/Model/table.py (MemoryTable): New. Quite simple table
4903     implementation that operates on a list of tuples. All of the data
4904     are kept in the memory.
4905    
4906     * test/test_table.py (MemoryTableTest): New.
4907    
4908     * test/test_transientdb.py (SimpleTable): Removed.
4909     (TestTransientTable.test_transient_joined_table,
4910     (TestTransientTable.test_transient_table_read_twice): Replaced
4911     SimpleTable by MemoryTable.
4912    
4913 jonathan 793 2003-04-30 Jonathan Coles <[email protected]>
4914    
4915 jonathan 803 * Data/iceland_sample.thuban: Now contains correct projections
4916     for each of the layers.
4917    
4918     * Resources/Projections/defaults.proj: Geographic projection
4919     contains unit conversion parameter.
4920    
4921     2003-04-30 Jonathan Coles <[email protected]>
4922    
4923 jonathan 793 The most important part of this putback is the projection changes.
4924     It should now be possible to specify the projection that a layer
4925     is in and then specify a different projection for the map. The
4926     projection dialog has an extra parameter for a geographic projection
4927     which lets the user select if the input is in degrees or radians.
4928    
4929     * Thuban/Model/layer.py (Layer.ShapesInRegion): Fix docstring
4930     to say that the parameter is a tuple of unprojected
4931     points (which is what the callers to this method were assuming).
4932     Also, since the points are unprojected we need to projected them.
4933    
4934     * Thuban/UI/legend.py (LegendTree.MoveCurrentItemUp,
4935     LegendTree.MoveCurrentItemDown): If the layer or any of the layer's
4936     groups are selected, move the layer up/down. Fixes RTbug #1833.
4937    
4938     * Thuban/UI/mainwindow.py: Move menu item map_rename up.
4939    
4940     * Thuban/UI/projdialog.py (ProjFrame._OnSave): Add missing
4941     parameter in call to SetClientData.
4942     (GeoPanel): Add support for selecting the units that the
4943     source data is in (Radians or Degrees).
4944    
4945     * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Optimize
4946     the rendering loop by reducing the number of if's, removing the
4947     unnecessary try/except block, and checking if the old group
4948     is the same as the new one (which happens a lot if there is
4949     no classification, or lots of shapes are in the same group).
4950    
4951     * Thuban/UI/view.py (MapCanvas.OnPaint): Add a try/except block
4952     around the redraw routine to try to catch problems that the user
4953     may create by selecting invalid projections for the data set and
4954     map. Clears the display if there are any problems and prints the
4955     error.
4956     (MapCanvas.do_redraw): Use DC.Clear() instead of drawing a filled
4957     rectangle.
4958    
4959     * extensions/thuban/wxproj.cpp (project_point): First invert the
4960     supplied point (which should be in projected coordinates) using
4961     the layer's projection and then project the point using the
4962     map's projection.
4963     (project_points): Use project_point() to project each point.
4964    
4965 jan 792 2003-04-30 Jan-Oliver Wagner <[email protected]>
4966    
4967     * Thuban/Model/layer.py (Layer.SetShapeStore): Fixed a bug:
4968     don't set the Classification to None if the classfication field
4969     is None (ie only a DEFAULT).
4970    
4971 bh 786 2003-04-30 Bernhard Herzog <[email protected]>
4972    
4973 bh 790 * Thuban/UI/view.py: Fix some typos.
4974    
4975 bh 788 * Thuban/UI/mainwindow.py (MainWindow.identify_view_on_demand): Do
4976     not pop up the dialog if the selection becomes empty (this could
4977     happen if e.g. a new selection is opened while the identify tool
4978     is active and dialog had been closed)
4979    
4980     2003-04-30 Bernhard Herzog <[email protected]>
4981    
4982 bh 786 * Thuban/Model/transientdb.py (TransientTableBase.__init__): New
4983     instance variable read_record_last_result
4984     (TransientTableBase.read_record): Make sure reading the same
4985     record twice works. The implementation uses the new instance
4986     variable read_record_last_result
4987    
4988     * test/test_transientdb.py
4989     (TestTransientTable.test_transient_table_read_twice): New test
4990     case for the above bug-fix.
4991    
4992 jonathan 793 2003-04-29 Jonathan Coles <[email protected]>
4993    
4994     * Thuban/common.py: Removed. No longer needed Str2Num. RTbug #1832.
4995    
4996     * Thuban/UI/classgen.py: Remove all uses of Str2Num.
4997    
4998     * Thuban/UI/classifier.py: Remove all uses of Str2Num.
4999     (ClassTable.SetValueAsCustom): Rename keyword argument in
5000     ClassGroup* constructors to match argument name.
5001    
5002 bh 779 2003-04-29 Bernhard Herzog <[email protected]>
5003    
5004     * Thuban/Model/session.py (Session.Destroy): Explicitly close the
5005     transient DB if it exists to make sure it doesn't leave a journal
5006     file in the temp directory.
5007    
5008     * Thuban/Model/transientdb.py (TransientDatabase.close): Set
5009     self.conn to None after closing the connection to make sure it's
5010     not closed twice
5011    
5012 jonathan 767 2003-04-29 Jonathan Coles <[email protected]>
5013    
5014 jonathan 769 Add a visible parameter in the layer XML tag. The default value is
5015     "true". If anything other than "false" is specified we also assume
5016 jonathan 776 "true". Addresses RTbug #1025.
5017 jonathan 769
5018     * Doc/thuban.dtd: Add visible parameter to a layer.
5019    
5020     * Thuban/Model/layer.py (BaseLayer.__init__): Change default value
5021     of visible from 1 to True.
5022     (Layer.__init__): Change default value of visible from 1 to True.
5023    
5024     * Thuban/Model/load.py (SessionLoader.start_layer): Read visible
5025     parameter.
5026    
5027     * Thuban/Model/save.py (SessionSaver.write_layer): Save visible
5028     parameter.
5029    
5030     * test/test_load.py: Add new test data contents_test_visible.
5031     (LoadSessionTest.setUp): save test data.
5032     (LoadSessionTest.testLayerVisibility): Test if the visible flag
5033     is loaded correctly.
5034    
5035     * test/test_save.py (SaveSessionTest.testSingleLayer): Add test
5036     for saving an invisible layer.
5037    
5038     2003-04-29 Jonathan Coles <[email protected]>
5039    
5040 jonathan 767 * Thuban/UI/mainwindow.py (MainWindow.SetMap): Look up the
5041     legend dialog box and tell it to change its map to the one
5042     supplied to SetMap(). Fixes RTbug #1770.
5043    
5044 bh 764 2003-04-29 Bernhard Herzog <[email protected]>
5045    
5046 bh 766 Next step of table implementation. Introduce a transient database
5047     using SQLite that some of the data is copied to on demand. This
5048     allows us to do joins and other operations that require an index
5049     for good performance with reasonable efficiency. Thuban now needs
5050     SQLite 2.8.0 and pysqlite 0.4.1. Older versions may work but I
5051     haven't tested that.
5052    
5053     * Thuban/Model/transientdb.py: New. Transient database
5054     implementation.
5055    
5056     * test/test_transientdb.py: New. Tests for the transient DB
5057     classes.
5058    
5059     * Thuban/Model/session.py (AutoRemoveFile, AutoRemoveDir): New
5060     classes to help automatically remove temporary files and
5061     directories.
5062     (Session.__init__): New instance variables temp_dir for the
5063     temporary directory and transient_db for the SQLite database
5064     (Session.temp_directory): New. Create a temporary directory if not
5065     yet done and return its name. Use AutoRemoveDir to have it
5066     automatically deleted
5067     (Session.TransientDB): Instantiate the transient database if not
5068     done yet and return it.
5069    
5070     * Thuban/Model/data.py (ShapefileStore.__init__): Use an
5071     AutoTransientTable so that data is copied to the transient DB on
5072     demand.
5073     (SimpleStore): New class that simply combines a table and a
5074     shapefile
5075    
5076     * Thuban/Model/table.py (Table, DBFTable): Rename Table into
5077     DBFTable and update its doc-string to reflect the fact that this
5078     is only the table interface to a DBF file. Table is now an alias
5079     for DBFTable for temporary backwards compatibility.
5080    
5081     * Thuban/UI/application.py (ThubanApplication.OnExit): Make sure
5082     the last reference to the session goes away so that the temporary
5083     files are removed properly.
5084    
5085     * test/test_load.py (LoadSessionTest.tearDown): Remove the
5086     reference to the session to make sure the temporary files are
5087     removed.
5088    
5089     2003-04-29 Bernhard Herzog <[email protected]>
5090    
5091 bh 764 * Thuban/Model/load.py (XMLReader.__init__, XMLReader.read): Turn
5092     the __parser instance variable into a normal local variable in
5093     read. It's only used there and read will never be called more than
5094     once. Plus it introduces a reference cycle that keeps can keep the
5095     session object alive for a long time.
5096    
5097 jonathan 767 2003-04-29 Jonathan Coles <[email protected]>
5098 jonathan 735
5099 jonathan 762 * Thuban/Model/proj.py (Projection): Removed Set*() methods to make
5100     Projection an immutable item. Fixes RTbug #1825.
5101     (Projection.__init__): Initialize instance variables here.
5102     (ProjFile.Replace): New. Replace the given projection object with
5103     the new projection object. This solves the problem of needing the
5104     mutator Projection.SetProjection() in the ProjFrame class and
5105     allows a projection to change parameters without changing its
5106     location in the file.
5107    
5108     * Thuban/UI/mainwindow.py (MainWindow.SaveSessionAs): Dialog should
5109     be of type wxSAVE and should verify overwriting a file.
5110    
5111     * Thuban/UI/projdialog.py (ProjFrame._OnSave): Use the new
5112     ProjFile.Replace() method instead of the mutator
5113     Projection.SetProjection(). Also requires that we reassign the
5114     client data to the new projection.
5115    
5116     * test/test_proj.py (TestProjection.test): Test GetName() and
5117     GetAllParameters()
5118     (TestProjFile.test): Remove tests for Set*() methods. Add tests
5119     for Replace().
5120    
5121     2003-04-25 Jonathan Coles <[email protected]>
5122    
5123 jonathan 756 * Thuban/Model/save.py (SessionSaver.write_projection): Make sure
5124     to save the name of the projection.
5125    
5126     * test/test_save.py (SaveSessionTest.testLayerProjection): New
5127     test to verify layer projections are saved correctly.
5128    
5129     2003-04-25 Jonathan Coles <[email protected]>
5130    
5131 jonathan 753 * Thuban/Model/proj.py (Projection.SetName): Set the name
5132     to "Unknown" if name is None.
5133     (Projection.SetAllParameters): New. Set the projection's
5134     parameter list to the one supplied.
5135     (Projection.SetProjection): New. Set the projection's
5136     properties to those of the supplied Projection.
5137    
5138     * Thuban/UI/mainwindow.py (MainWindow.MapProjection): Set
5139     the dialog title to include the map's title.
5140     (MainWindow.LayerProjection): Set the dialog title to include
5141     the layer's title.
5142    
5143     * Thuban/UI/projdialog.py (ProjFrame.__ShowError): Consolidate
5144     error dialogs into a single method call.
5145     (ProjFrame.__VerifyButtons): Add more states to check.
5146     (ProjFrame.__GetProjection): Return the current state of an
5147     edited projection or None.
5148     (ProjFrame.__FillAvailList): Remove checks for states that
5149     shouldn't exist.
5150     (ProjFrame._OnNew): Clear all selected items and supply
5151     a projection panel if necessary.
5152    
5153     * test/test_proj.py (TestProjFile.test): Add tests for
5154     ProjFile.SetAllParameters, ProjFile.SetProjection,
5155     ProjFile.SetName.
5156    
5157     2003-04-25 Jonathan Coles <[email protected]>
5158    
5159 jonathan 748 * Thuban/UI/projdialog.py (ProjFrame.__FillAvailList): Now
5160     takes an optional argument to select the current projection.
5161     This does not guarantee that the item is visible due to
5162     limited wxWindows functionality. Fixes RTBug #1821.
5163    
5164     2003-04-25 Jonathan Coles <[email protected]>
5165    
5166 jonathan 743 * Thuban/Model/load.py (SessionLoader.start_projection): Remember
5167     the projection name and use it when constructing the Projection
5168     object.
5169    
5170     * Thuban/Model/proj.py (Projection.__init__): Change the default
5171     value for 'name' to None and then test if name is equal to None
5172     in the body of the constructor. This way the caller doesn't have to
5173     know what the default value should be. Namely, useful in load.py
5174     where we have to pick a default value if the 'name' parameter
5175     doesn't exist in the XML file.
5176    
5177     * test/test_load.py (LoadSessionTest.testLayerProjection): New.
5178     Tests a file where a layer has a projection.
5179    
5180     2003-04-25 Jonathan Coles <[email protected]>
5181    
5182 jonathan 735 * Thuban/Model/layer.py (Layer.TreeInfo): Add an item to the
5183     tree for projection information.
5184    
5185     * Thuban/Model/load.py (XMLReader.GetFilename): Renamed from
5186     XMLReader.GetFileName.
5187     (SessionLoader): Added support for loading projection tags that
5188     appear inside a layer.
5189    
5190     * Thuban/Model/proj.py (ProjFile): Document the class. Move
5191     back to using a list because the order of the projections in
5192     the file is important to maintain. Fixes RTbug #1817.
5193    
5194     * Thuban/Model/resource.py: Rename calls to ProjFile.GetFileName
5195     to ProjFile.GetFilename.
5196    
5197     * Thuban/Model/save.py (SessionSaver.write_layer): Save projection
5198     information.
5199    
5200     * Thuban/UI/projdialog.py (ProjFrame._OnAddToList): Renamed from
5201     ProjFrame._OnSaveAs. Removed old dead code from previous
5202     implementation.
5203     (ProjFrame._OnExport): Add support for exporting more than one
5204     projection to a single file.
5205     (ProjFrame.__FillAvailList): use string formatting (% operator)
5206     to build strings that are (partly) translated. Fixes RTbug #1818.
5207    
5208     * test/test_proj.py (TestProjFile.test): New. Tests the base ProjFile
5209     class.
5210    
5211 bh 734 2003-04-24 Bernhard Herzog <[email protected]>
5212    
5213     * po/es.po: Updated Spanish translation by Daniel Calvelo Aros
5214    
5215     * po/fr.po: New. French translation by Daniel Calvelo Aros
5216    
5217     * Thuban/UI/projdialog.py (ProjFrame._OnSaveAs): Don't translate
5218     empty strings.
5219    
5220 jonathan 735 2003-04-24 Jonathan Coles <[email protected]>
5221 jonathan 724
5222     * Thuban/Model/layer.py (Layer.GetProjection): New. Needed to
5223     implement the interface that the ProjFrame dialog expects.
5224    
5225     * Thuban/Model/proj.py (Projection.SetName): New. Allows the
5226     name of the projection to be changed.
5227     (ProjFile): Use a dictionary instead of a list so that removing
5228     projections is easier and we are sure about uniqueness.
5229     (ProjFile.Remove): Remove the given projection object.
5230    
5231     * Thuban/Model/resource.py (GetSystemProjFiles, GetUserProjFiles):
5232     Return a list with only one projection file instead of searching for
5233     any projection file. This simplifies many things if the user can
5234     only have one system file and one user file.
5235    
5236     * Thuban/UI/classgen.py: Change all references to
5237     genCombo to genChoice.
5238    
5239     * Thuban/UI/mainwindow.py: Add a Projection option under the
5240     layer menu.
5241     (MainWindow.LayerProjection): New. Open up a projection window
5242     for a layer.
5243    
5244     * Thuban/UI/projdialog.py: Large changes to how the dialog is
5245     laid out. Use three panels instead of one. One for the list of
5246     projections, one for the edit controls, and one for the buttons.
5247     Fixed resizing problems so that the dialog resizes correctly
5248     when the projection panel changes. Added import/export, save, and
5249     new buttons/functionality.
5250    
5251 bh 723 2003-04-24 Bernhard Herzog <[email protected]>
5252    
5253     First step towards table management. Introduce a simple data
5254     abstraction so that we replace the data a layer uses more easily
5255     in the next step.
5256    
5257     * Thuban/Model/data.py: New file with a simple data abstraction
5258     that bundles shapefile and dbffile into one object.
5259    
5260     * Thuban/Model/session.py (Session.OpenShapefile): New method to
5261     open shapefiles and return a shape store object
5262    
5263     * Thuban/Model/layer.py (Layer.__init__): Pass the data as a store
5264     object instead of a shapefile filename. This introduces a new
5265     instance variable store holding the datastore. For intermediate
5266     backwards compatibility keep the old instance variables.
5267     (open_shapefile): Removed. No longer needed with the shape store.
5268     (Layer.SetShapeStore, Layer.ShapeStore): New methods to set and
5269     get the shape store used by a layer.
5270     (Layer.Destroy): No need to explicitly destroy the shapefile or
5271     table anymore.
5272    
5273     * Thuban/UI/mainwindow.py (MainWindow.AddLayer)
5274     (MainWindow.AddLayer): Use the session's OpenShapefile method to
5275     open shapefiles
5276    
5277     * Thuban/Model/load.py (ProcessSession.start_layer): Use the
5278     session's OpenShapefile method to open shapefiles
5279    
5280     * test/test_classification.py
5281     (TestClassification.test_classification): Use the session's
5282     OpenShapefile method to open shapefiles and build the filename in
5283     a more platform independed way
5284    
5285     * test/test_layer.py (TestLayer.setUp, TestLayer.tearDown):
5286     Implement to have a session to use in the tests
5287     (TestLayer.test_arc_layer, TestLayer.test_polygon_layer)
5288     (TestLayer.test_point_layer, TestLayer.test_empty_layer): Use the
5289     session's OpenShapefile method to open shapefiles
5290     (TestLayerLegend.setUp): Instantiate a session so that we can use
5291     it to open shapefiles.
5292     (TestLayerLegend.tearDown): Make sure that all references to
5293     layers and session are removed otherwise we may get a resource
5294     leak
5295    
5296     * test/test_map.py (TestMapAddLayer.test_add_layer)
5297     (TestMapWithContents.setUp): Instantiate a session so that we can
5298     use it to open shapefiles.
5299     (TestMapWithContents.tearDown): Make sure that all references to
5300     layers, maps and sessions are removed otherwise we may get a
5301     resource leak
5302     ("__main__"): use support.run_tests() so that more info about
5303     uncollected garbage is printed
5304    
5305     * test/test_save.py (SaveSessionTest.testSingleLayer): Use the
5306     session's OpenShapefile method to open shapefiles
5307     ("__main__"): use support.run_tests() so that more info about
5308     uncollected garbage is printed
5309    
5310     * test/test_selection.py (TestSelection.tearDown): Make sure that
5311     all references to the session and the selection are removed
5312     otherwise we may get a resource leak
5313     (TestSelection.get_layer): Instantiate a session so that we can
5314     use it to open shapefiles.
5315     ("__main__"): use support.run_tests() so that more info about
5316     uncollected garbage is printed
5317    
5318     * test/test_session.py (TestSessionBase.tearDown)
5319     (TestSessionWithContent.tearDown): Make sure that all references
5320     to the session and layers are removed otherwise we may get a
5321     resource leak
5322     (TestSessionWithContent.setUp): Use the session's OpenShapefile
5323     method to open shapefiles
5324    
5325 jonathan 721 2003-04-24 Jonathan Coles <[email protected]>
5326    
5327     * Thuban/Model/load.py (XMLReader.read): Should have been checking
5328     if the file_or_filename object had the 'read' attribute.
5329    
5330 jonathan 715 2003-04-23 Jonathan Coles <[email protected]>
5331    
5332 jonathan 720 * Thuban/Model/resource.py: Fixes RTbug #1813.
5333     (ReadProjFile): Add documentation about which exceptions are raised.
5334     Always pass the exceptions up to the caller.
5335     (GetProjFiles): If the directory can't be read return an empty list.
5336     If any of the proj files can't be read skip that file and go
5337     on to the next one.
5338    
5339     * test/test_proj.py: Added test cases to handle nonexistent files,
5340     unreadable files, and files that don't parse correctly.
5341    
5342     2003-04-23 Jonathan Coles <[email protected]>
5343    
5344 jonathan 716 Projection dialog. Allows the user to select from a list
5345     of projection templates and optionally edit them and save new ones.
5346    
5347     * Thuban/UI/projdialog.py (ProjFrame): New. Main dialog.
5348     (ProjPanel): Base class for projection specific panels.
5349     (TMPanel): Projection panel for Transverse Mercartor.
5350     (UTMPanel): Projection panel for Universal Transverse Mercartor.
5351     (LCCPanel): Projection panel for Lambert Conic Conformal.
5352     (GeoPanel): Projetion panel for Geographic Projection.
5353    
5354     2003-04-23 Jonathan Coles <[email protected]>
5355    
5356 jonathan 715 * Thuban/Model/load.py (XMLReader): Renamed from XMLProcessor to
5357     promote symmetry. There now exists XMLReader and XMLWriter.
5358     (XMLReader.read): New. Call to read the given file descriptor or
5359     filename.
5360     (XMLReader.close): New. Make sure the file is closed.
5361     (XMLReader.GetFileName): New. Return just the file name that is being
5362     read from.
5363     (XMLReader.GetDirectory): New. Return just the directory of the file
5364     that is being read.
5365     (XMLReader.AddDispatchers): New. Take a dictionary which contains
5366     the names of functions to call as the XML tree is parsed.
5367     (XMLReader.startElementNS): Updated to use new dispatcher dictionary.
5368     (XMLReader.endElementNS): Updated to use new dispatcher dictionary.
5369     (SessionLoader): Removed class variables start_dispatcher and
5370     end_dispatcher since this functionality is now part of a class
5371     instance. Fixes RTbug #1808.
5372     (SessionLoader.__init__): Add dispatcher functions.
5373     (load_xmlfile): Code was moved into the XMLReader.read().
5374     (load_session): Use modified SessionLoader.
5375    
5376     * Thuban/Model/map.py (Map.GetProjection): New. Returns the
5377     map's projection.
5378    
5379     * Thuban/Model/proj.py (Projection.GetParameters): Renamed to
5380     GetAllParameters.
5381     (Projection.GetParameter): Returns the value for the given parameter.
5382    
5383     * Thuban/Model/resource.py: Use XMLReader and XMLWriter.
5384     (GetProjFiles): Renamed from GetProjections. Now returns a list
5385     of ProjFile objects.
5386     (GetSystemProjFiles): Renamed from GetSuppliedProjections. Returns
5387     a list of ProjFile objects whose files are not user defined.
5388     (GetUserProjFiles): Renamed from GetUserProjections. Returns a
5389     list of ProjFile objects whose files are user defined.
5390     (ProjFileReader): Extend new XMLReader.
5391    
5392     * Thuban/Model/save.py (XMLWriter): Renamed from XMLSaver to
5393     promote symmetry.
5394    
5395     * Thuban/UI/classgen.py (ClassGenDialog.__init__): Use a wxChoice
5396     control instead of a wxComboBox. wxChoice controls do not generate
5397     events as the uses highlights possible choices which fixes problems
5398     with resizing the dialog when the use selects an option.
5399    
5400     * Thuban/UI/classifier.py (Classifier.__init__): Use a wxChoice
5401     control instead of a wxComboBox.
5402    
5403     * Thuban/UI/mainwindow.py (MainWindow.Projection): Use new projection
5404     dialog.
5405    
5406     * test/test_proj.py (TestProjection.test): New tests for GetParameter
5407     method.
5408    
5409 bh 703 2003-04-22 Bernhard Herzog <[email protected]>
5410    
5411 bh 705 * Thuban/UI/mainwindow.py: Remove some unused imports and global
5412     constants
5413    
5414 bh 703 * Thuban/UI/identifyview.py (IdentifyListCtrl.selected_shape)
5415     (IdentifyGridCtrl.selected_shape): Use table, not shapetable.
5416    
5417 bh 700 2003-04-17 Bernhard Herzog <[email protected]>
5418    
5419 bh 701 * Thuban/Model/layer.py: Don't import LAYER_LEGEND_CHANGED.
5420     (Layer): Update doc-string since LAYER_LEGEND_CHANGED is not used
5421     anymore.
5422     (Layer.BoundingBox, Layer.GetFieldType, Layer.NumShapes)
5423     (Layer.ShapeType, Layer.Shape): No need to call
5424     self.open_shapefile since it's always called in __init__
5425    
5426 bh 700 * Thuban/UI/application.py (ThubanApplication.MainLoop): Removed.
5427     In wxPython 2.4 there's no need to extend MainLoop anymore since
5428     wxPython itself makes sure OnExit is called.
5429    
5430 jonathan 688 2003-04-16 Jonathan Coles <[email protected]>
5431    
5432 jonathan 693 Initial putback of projection management code. Includes new
5433     classes to read and write projection files. The current load
5434     and save classes were abstracted a bit so they could be reused.
5435     The Projection class was extended to provide new methods and
5436     have a name.
5437    
5438     * Thuban/Model/load.py (XMLProcessor): New. Contains all the
5439     general XML reading methods that were part of ProcessSession.
5440    
5441     * Thuban/Model/proj.py (Projection.__init__): Accepts an optional
5442     name.
5443     (ProjFile): New. Represents a file that contains projection
5444     information.
5445    
5446     * Thuban/Model/resource.py: New. Contains general utilities
5447     for read and writing projection files.
5448    
5449     * Thuban/Model/save.py (XMLSaver): New. Contains all the
5450     general XML writing methods that were part of SessionSaver.
5451     (SessionSaver): Renamed from Saver.
5452    
5453     * test/test_proj.py: New test cases for the projection
5454     file read and write functions.
5455    
5456     2003-04-16 Jonathan Coles <[email protected]>
5457    
5458 jonathan 688 * Thuban/Model/classification.py: Use repr() around values
5459     in the ClassGroup*.__repr__() methods so it is clearer when
5460     a value is a string and when it is a number.
5461    
5462     * test/test_load.py: Rework the classification test to test
5463     that we can load old files.
5464     (testLabels): Test a file where the groups have labels.
5465    
5466 bh 687 2003-04-16 Bernhard Herzog <[email protected]>
5467    
5468     Safer implementation of the performance enhancements of the
5469     low-level renderer:
5470    
5471     * extensions/thuban/wxproj.cpp (extract_projection)
5472     (extract_pointer): Rename extract_projection to extract_pointer
5473     and redefine its purpose to return the pointer stored in a CObject
5474     returned by the object's cobject method. Update all callers.
5475     (s_draw_info, free_draw_info, draw_polygon_init): Implement the
5476     handling of these low-level parameters so that each s_draw_info
5477     instance is handled as a CObject at python level that also
5478     contains real references to the actual python objects which
5479     contain the values in the struct. Add free_draw_info as the
5480     destructor.
5481     (draw_polygon_shape): Add the py_draw_info parameter which must a
5482     cobject containing an s_draw_info pointer.
5483    
5484     * Thuban/UI/renderer.py (MapRenderer.polygon_render_param): New
5485     method to instantiat the low-level render parameter
5486     (MapRenderer.draw_shape_layer): Use the new method. Remove some
5487     commented out code.
5488     (MapRenderer.draw_polygon_shape): Make the first parameter not the
5489     layer but the low-level render parameter
5490     (ScreenRenderer.draw_shape_layer): Use the low-level render
5491     parameter.
5492    
5493 jonathan 673 2003-04-15 Jonathan Coles <[email protected]>
5494    
5495 jonathan 680 * Thuban/Model/classification.py: Implemented __repr__ for
5496     the ClassGroup* classes to make debugging a bit easier.
5497     (ClassGroup.SetLabel): Check that the string is an instance
5498     of StringTypes not StringType. Accounts for Unicode strings.
5499    
5500     * Thuban/Model/color.py: Implemented __repr__ to make
5501     debugging a bit easier.
5502    
5503     * Thuban/Model/save.py (Saver.write_classification): Need to
5504     save the group label.
5505    
5506     * test/test_load.py (testClassification): New. Loads the
5507     iceland_sample_test.thuban file and checks if it was loaded
5508     correctly.
5509    
5510     2003-04-15 Jonathan Coles <[email protected]>
5511    
5512 jonathan 673 * extensions/thuban/wxproj.cpp (draw_polygon_init): New. Used
5513     to improve rendering performance by initializing the variables
5514     that are not change each time draw_polygon_shape() is called.
5515     The values are stored in a global struct draw_info.
5516     (draw_polygon_shape): Removed initialization code that is
5517     now in draw_polygon_init().
5518    
5519     * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Make
5520 jonathan 674 drawing initialization call to draw_polygon_init()
5521     (MapRenderer.draw_polygon_shape): Use new signature of
5522     draw_polygon_shape.
5523 jonathan 673
5524 jonathan 674 * Thuban/UI/classgen.py (GenUniformPanel): Fix spin control
5525     weirdness by setting the range to (1, maxint).
5526 jonathan 673
5527 jonathan 674 * Thuban/Model/classification.py (ClassGroupProperties): Make
5528     instance variables private and optimize comparison operator
5529     by first checking if the color references are the same.
5530     (ClassGroupSingleton): Make instance variables private.
5531     (ClassGroupRange): Make instance variables private.
5532 jonathan 673
5533 jonathan 674 * HOWTO-Release: Filled in missing steps for releasing packages.
5534    
5535 bh 672 2003-04-15 Bernhard Herzog <[email protected]>
5536    
5537     First stab at internationalized messages:
5538    
5539     * Thuban/__init__.py (_): Implement the translation function for
5540     real using the python gettext module.
5541    
5542     * Thuban/UI/classifier.py (ClassTable.GetRowLabelValue): Don't
5543     translate empty strings.
5544    
5545     * Thuban/UI/application.py (ThubanApplication.read_startup_files):
5546     Add a missing space to a warning message
5547    
5548     * po/README: New. Notes about the management of the translation
5549     files.
5550    
5551     * po/Makefile: New. Makefile to help manage the translation files.
5552    
5553     * po/es.po: New. Spanish translation by Daniel Calvelo Aros
5554    
5555     * MANIFEST.in: Include the *.mo files in Resources/Locale and the
5556     translations and support files in po/
5557    
5558     * setup.py (data_files): Add the *.mo files to the data_files too
5559    
5560     * README: Add note about the translations when building from CVS
5561    
5562 jonathan 669 2003-04-14 Jonathan Coles <[email protected]>
5563    
5564     * Thuban/UI/dock.py: Fixes some window resizing problems most
5565     noticable under windows. Always assume the button bitmaps will
5566     be there. Code clean up.
5567     (DockabelWindow.Dock, DockableWindow.UnDock): Force all the
5568     images for the dock/undock button to the same images.
5569     Work around for RTbug #1801.
5570    
5571     * Thuban/UI/legend.py (LegendPanel.__init__): The toolbar should
5572     be allowed to grow within the sizer. Fixes a bug under Windows
5573     where the toolbar wasn't being drawn.
5574    
5575 frank 664 2003-04-14 Frank Koormann <[email protected]>
5576    
5577     * Resources/Bitmaps/dock_12.xpm, Resources/Bitmaps/undock_12.xpm:
5578     Updated design to try to make the button functionality more
5579     transparent.
5580    
5581 jonathan 662 2003-04-14 Jonathan Coles <[email protected]>
5582    
5583     * Thuban/UI/legend.py (LegendPanel.__init__): Call Create() to
5584     finalize the intialization of the panel.
5585    
5586     * Thuban/UI/dock.py (DockPanel.Create): New. Finalizes the
5587     creation of the panel. Should be the last thing called in the
5588     initializer of a subclass.
5589    
5590     * Thuban/UI/classgen.py (ClassGenDialog.__init__): Actively
5591     set the current selections in the combo boxes. This is needed
5592     under Windows.
5593    
5594     * Thuban/UI/classifier.py (Classifier.__init__): Add a top
5595     level panel to the dialog so that the background colors are
5596     consistent under Windows.
5597    
5598 jonathan 646 2003-04-11 Jonathan Coles <[email protected]>
5599    
5600 jonathan 662 * Thuban/UI/classgen.py: Change color ramps to start at white
5601     not black.
5602    
5603     * Thuban/UI/legend.py: Enable/disable the legend buttons when
5604     the legend changes. Fixes RTbug #1793.
5605    
5606     * test/test_classification.py: Added test for copying of
5607     classifications.
5608    
5609     2003-04-11 Jonathan Coles <[email protected]>
5610    
5611 jonathan 647 * Thuban/UI/resource.py: New. Centralize the loading of resources
5612     such as bitmaps.
5613    
5614     * Thuban/UI/classgen.py (GenUniquePanel.__init__): Reordered buttons,
5615     added images to the move buttons, added 'reverse' button.
5616     (CustomRampPanel.__init__): Added images to the move buttons.
5617     (GreyRamp): New. Generates a ramp from white to black.
5618     (HotToColdRamp): New. Generates a ramp from cold to hot colors.
5619    
5620     * Thuban/UI/classifier.py: Refactored ID's from ID_CLASSIFY_* to
5621     ID_PROPERTY_*.
5622     (Classifier.__init__): Minor changes to the layout.
5623     (Classifier._OnTitleChanged): Listen for when the user edits the
5624     title and update the dialog's title and the layer's title.
5625    
5626     * Thuban/UI/dock.py: Use new bitmaps for the control buttons.
5627    
5628     * Thuban/UI/legend.py: Use new bitmaps for the control buttons.
5629     (LegendTree._OnMsgLayerTitleChanged): Change the displayed title
5630     if the layer's title changes.
5631    
5632     * Thuban/UI/mainwindow.py: Added new menu item and associated code
5633     to open a dialog to rename the map.
5634     (MainWindow): Use new resource class to import bitmaps.
5635    
5636     2003-04-11 Jonathan Coles <[email protected]>
5637    
5638 jonathan 646 * Resources/Bitmaps/close_12.xpm, Resources/Bitmaps/dock_12.xpm,
5639 jonathan 647 Resources/Bitmaps/group_use.xpm, Resources/Bitmaps/group_use_all.xpm,
5640     Resources/Bitmaps/group_use_none.xpm,
5641     Resources/Bitmaps/group_use_not.xpm,
5642     Resources/Bitmaps/hide_layer.xpm,
5643     Resources/Bitmaps/layer_properties.xpm,
5644     Resources/Bitmaps/lower_layer.xpm, Resources/Bitmaps/raise_layer.xpm,
5645     Resources/Bitmaps/show_layer.xpm, Resources/Bitmaps/undock_12.xpm:
5646     New.
5647 jonathan 646
5648 jonathan 636 2003-04-10 Jonathan Coles <[email protected]>
5649    
5650 jonathan 644 * Thuban/Model/classification.py: (ClassGroupRange.__init__):
5651     Should pass group to ClassGroup constructor.
5652    
5653     2003-04-10 Jonathan Coles <[email protected]>
5654    
5655 jonathan 636 * Thuban/Model/classification.py: (ClassGroup): Move all the common
5656     methods of the derived classes ([Set|Get]Properties(), __eq__, __ne__)
5657     here. Implement SetVisible(), IsVisible().
5658     (ClassGroup.__init__): Add group parameter which acts as a copy
5659     constructor.
5660    
5661     * Thuban/UI/classifier.py (ClassTable): Add a new column for the
5662     "Visible" check boxes.
5663     (Classifier): Rename the buttons and refactor the code to match
5664     the new labels.
5665    
5666     * Thuban/UI/legend.py: Classify button is now called "Properties".
5667     Refactored the code to change variable names.
5668     (LegendTree.__FillTreeLayer): Only list a group if it is visible.
5669    
5670     * Thuban/UI/mainwindow.py: MainWindow.OpenClassifier renamed to
5671     MainWindow.OpenLayerProperties. MainWindow.LayerEditProperties
5672     renamed to MainWindow.LayerEditProperties.
5673     (MainWindow.ToggleLegend): Don't include map name in legend title.
5674     (MainWindow.SetMap): Added the map name to the window title.
5675     (MainWindow.LayerFillColor, MainWindow.LayerTransparentFill,
5676     MainWindow.LayerOutlineColor, MainWindow.LayerNoOutline): Removed.
5677     Functionality is found in the layer properties dialog.
5678    
5679     * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Only
5680     draw visible groups.
5681    
5682 jonathan 626 2003-04-09 Jonathan Coles <[email protected]>
5683    
5684 jonathan 634 * Thuban/UI/classgen.py: Modifications to allow simple
5685     addition and selection of new color schemes.
5686     (MonochromaticRamp): New. Generates a ramp between two colors.
5687     (RedRamp): New. Generates a ramp of all red.
5688     (GreenRamp): New. Generates a ramp of all green.
5689     (BlueRamp): New. Generates a ramp of all blue.
5690    
5691     2003-04-09 Jonathan Coles <[email protected]>
5692    
5693 jonathan 626 * Thuban/Model/classification.py (Classification.__deepcopy__):
5694     Need to copy over field and fieldType attributes.
5695    
5696     * Thuban/Model/table.py (Table.field_range): New. Retrive the
5697     maximum and minimum values over the entire table for a given
5698     field.
5699     (Table.GetUniqueValues): New. Retrieve all the unique values
5700     in the table for a given field.
5701    
5702     * Thuban/UI/classgen.py: Renamed GenRangePanel to GenUniformPanel.
5703     (GenUniquePanel): New. Controls to allow the user to select
5704     which unique field values they would like in the classification.
5705     (CustomRampPanel): Code that was in ClassGenDialog that allows
5706     the user to select the properties for a custom ramp.
5707     (ClassGenerator.GenUniformDistribution): Was called GenerateRanges.
5708    
5709     * Thuban/UI/classifier.py: Removed a lot of debugging code.
5710     (Classifier._SetClassification): Callback method so that the
5711     class generator can set the classification in the grid.
5712     (ClassGroupPropertiesCtrl): New. Encapsulates the drawing and
5713     editing of a group properties class into a wxWindows control.
5714    
5715     * Thuban/UI/dock.py: It was decided that if the user closes
5716     a dockable window the window should simply hide itself. That
5717     way if the user wants to show the dock again it appears in the
5718     same place as it was when it was closed.
5719     (DockableWindow.Destroy): Call renamed method OnDockDestroy().
5720     (DockableWindow._OnButtonClose): Hide the window instead of
5721     destroying it.
5722     (DockableWindow._OnClose): Hide the window instead of
5723     destroying it.
5724    
5725     * Thuban/UI/legend.py (LegendTree): Use a private method to
5726     consistently set the font and style of the text. Fixes RTbug #1786.
5727    
5728     * Thuban/UI/mainwindow.py: Import just the Classifier class.
5729    
5730 bh 623 2003-04-07 Bernhard Herzog <[email protected]>
5731    
5732 bh 625 * Thuban/UI/mainwindow.py (main_menu): Move the toggle_legend item
5733     to the map module
5734    
5735     2003-04-07 Bernhard Herzog <[email protected]>
5736    
5737 bh 623 * Thuban/UI/mainwindow.py (MainWindow.ShowSessionTree): Removed in
5738     favor of ToggleSessionTree
5739     (MainWindow.ToggleSessionTree): New method to toggle visibility of
5740     the session tree.
5741     (MainWindow.SessionTreeShown): New method to return whether the
5742     session tree is currently shown.
5743     (MainWindow.ToggleLegend): New method to toggle visibility of the
5744     legend
5745     (MainWindow.ShowLegend): Implement in terms of ToggleLegend and
5746     LegendShown
5747     (MainWindow.LegendShown): New method to return whether the legend
5748     is currently shown.
5749     (_method_command): Add checked parameter so we can define check
5750     menu items
5751     (_has_tree_window_shown, _has_legend_shown): Use the appropriate
5752     mainwindow methods.
5753     (show_session_tree, show_legend commands): Removed.
5754     (toggle_session_tree, toggle_legend commands): New commands to
5755     toggle the visibility of the dialogs
5756    
5757 jonathan 612 2003-04-07 Jonathan Coles <[email protected]>
5758    
5759 jonathan 619 * Thuban/UI/classgen.py: Fix Windows problem.
5760    
5761     * Thuban/UI/dock.py: Fix Windows problem.
5762    
5763     * Thuban/UI/mainwindow.py: Use False instead of false.
5764     (MainWindow.ShowLegend): Remove unnecessary switch parameter.
5765    
5766     2003-04-07 Jonathan Coles <[email protected]>
5767    
5768 jonathan 612 Since we now say that the order of the groups in a classification
5769     matters, it makes sense to be able to manipulate that order. Most
5770     of the changes to Thuban/Model/classification.py are to that end.
5771    
5772     * Thuban/Model/classification.py (Classification.AppendGroup,
5773     Classification.InsertGroup, Classification.ReplaceGroup,
5774     Classification.RemoveGroup, Classification.GetGroup): Do as the
5775     names imply.
5776     (Classification.FindGroup): This was called GetGroup, but GetGroup
5777     takes an index, while FindGroup takes a value.
5778     (Classification.__deepcopy__): Copy all the groups, BUT NOT THE LAYER
5779     REFERENCE. Currently there is a cyclic reference between the layer
5780     and its classification. If the classification doesn't need to know
5781     its owning layer we can change this, since it may make sense to be
5782     able to use the same classification with different layers.
5783    
5784     * Thuban/Model/load.py: Use Classification.AppendGroup(), not AddGroup()
5785    
5786     * Thuban/UI/classgen.py: Use Classification.AppendGroup(),
5787     not AddGroup()
5788    
5789     * Thuban/UI/classifier.py: Now that we can depend on the order in
5790     a Classification and have methods to manipulate that order we don't
5791     need to use our own data structures in the grid. We can simply make
5792     the grid/table access the information they need from a copy of
5793     the classification object.
5794     (Classifier._OnCloseBtn): Event handler for when the user clicks
5795     'Close'. This is needed so if the user applies changes and then
5796     continues to change the table the user has the option of discarding
5797     the most recent changes and keeping what they applied.
5798    
5799     * Thuban/UI/mainwindow.py: Put "Show Legend" and "Show Session Tree"
5800     into the same group.
5801    
5802     * extensions/thuban/wxproj.cpp (check_version): If Thuban is compiled
5803     with a really old version of proj, PJ_VERSION won't even be defined.
5804     If it isn't defined then just compile so that the function always
5805     returns Py_False.
5806    
5807     * test/test_classification.py: Fix tests to use the renamed methods.
5808     Still need to write tests for the new methods.
5809    
5810 jonathan 601 2003-04-04 Jonathan Coles <[email protected]>
5811 jonathan 608
5812 jonathan 612 * Thuban/UI/classifier.py (Classifier.__SelectField): Move the
5813     call to SetSelection out of the method and before the call
5814     to __SelectField in __init__. This prevents a recursion of events
5815     when _OnFieldSelect is triggered by the user.
5816    
5817     2003-04-04 Jonathan Coles <[email protected]>
5818    
5819 jonathan 608 * Thuban/Model/classification.py: Rename Color.None to
5820     Color.Transparent.
5821     (ClassGroupProperties.SetLineColori, ClassGroupProperties.SetFill):
5822     Don't bother copying the color, since Colors are immutable.
5823    
5824     * Thuban/Model/color.py, Thuban/Model/layer.py, Thuban/Model/load.py,
5825     Thuban/UI/classifier.py, Thuban/UI/mainwindow.py,
5826     Thuban/UI/renderer.py, Thuban/UI/view.py:
5827     Rename Color.None to Color.Transparent.
5828    
5829     * test/test_classification.py, test/test_load.py: Rename Color.None
5830     to Color.Transparent.
5831    
5832     2003-04-04 Jonathan Coles <[email protected]>
5833 jonathan 603
5834     * Thuban/Model/classification.py: Fix assert calls.
5835     (ClassGroupProperties.SetLineColor, ClassGroupProperties.SetFill):
5836     Copy the color parameter rather than hold onto a reference.
5837 jonathan 601
5838 jonathan 603 * Thuban/Model/color.py (Color.__copy__, Color.__deepcopy): Copy
5839     the color object.
5840     (NoColor.__copy__, NoColor.__deepcopy): Return 'self' so that we
5841     are sure there exists only one refernce to Color.None in the system.
5842     This allows us to use 'is' rather than the comparision functions.
5843    
5844     * Thuban/Model/save.py: Fix assert calls.
5845    
5846     * Thuban/UI/classifier.py: Fix assert calls.
5847     (ClassGrid._OnCellDClick): Call up to the classifier to open the
5848     dialog to edit the groups properties.
5849     (ClassGrid._OnCellResize): Make sure that the scollbars are drawn
5850     correctly if a cell is resized.
5851     (ClassTable.SetClassification): New. Changes the classification
5852     that is in the table.
5853     (ClassTable.__SetRow): Allow groups to be prepended.
5854     (Classifier): New code for opening the EditProperties and
5855     GenerateRanges dialogs.
5856     (SelectPropertiesDialog.__GetColor): Only set the color in the
5857     color dialog if the current color is not None.
5858    
5859     * Thuban/UI/dock.py: Fix assert calls.
5860    
5861     * Thuban/UI/legend.py: Fix assert calls.
5862    
5863     * Thuban/UI/renderer.py: Fix assert calls.
5864    
5865     * Thuban/UI/classgen.py (ClassGenDialog): Dialog for generating
5866     classifications.
5867     (GenRangePanel): Panel specific to range generation.
5868     (GenSingletonPanel): Panel specific to singleton generation.
5869     (ClassGenerator): Class responsible for actually generating
5870     the classification from the data gathered in the dialog box.
5871     (PropertyRamp): Generates properties whose values range from
5872     a starting property to an ending property.
5873 jonathan 601
5874 bh 600 2003-04-03 Bernhard Herzog <[email protected]>
5875    
5876     * test/support.py (print_garbage_information): New function that
5877     prints information about still connected messages and memory
5878     leaks.
5879     (run_suite): Removed.
5880     (run_tests): New function for use as a replacement of
5881     unittest.main in the test_* files. This one calls
5882     print_garbage_information at the end.
5883    
5884     * test/runtests.py (main): Use support.print_garbage_information
5885    
5886     * test/test_layer.py: Use support.run_tests instead of
5887     unittest.main so we get memory leak information
5888     (TestLayer.test_arc_layer, TestLayer.test_polygon_layer)
5889     (TestLayer.test_point_layer, TestLayer.test_empty_layer)
5890     (TestLayerLegend.test_visibility): Call the layer's Destroy method
5891     to fix a memory leak.
5892    
5893     * test/test_classification.py: Use support.run_tests instead of
5894     unittest.main so we get memory leak information
5895     (TestClassification.test_classification): Call the layer's Destroy
5896     method to fix a memory leak.
5897    
5898 bh 591 2003-04-02 Bernhard Herzog <[email protected]>
5899    
5900 bh 595 * extensions/thuban/wxproj.cpp (check_version, check_version_gtk):
5901     Handle the reference counts of the return value and errors in
5902     PyArg_ParseTuple correctly.
5903    
5904 bh 593 * Thuban/UI/application.py (ThubanApplication.OpenSession): Make
5905     sure the filename is absolute to avoid problems when saving the
5906     session again
5907    
5908 bh 591 * Thuban/Model/table.py: Remove unnecessary import. Fix a typo.
5909    
5910 jonathan 587 2003-04-01 Jonathan Coles <[email protected]>
5911    
5912 jonathan 589 * Thuban/UI/renderer.py (MapRenderer.draw_point_shape): Check
5913 jonathan 587 that there actually are points in the returned list of points
5914     before trying to index into the list. The list may be empty if
5915     the shape is a Null Shape.
5916    
5917 bh 586 2003-04-01 Bernhard Herzog <[email protected]>
5918    
5919     * test/test_map.py: Don't use from <module> import *
5920    
5921 jonathan 581 2003-04-01 Jonathan Coles <[email protected]>
5922    
5923     * Thuban/Model/session.py: Use LAYER_CHANGED instead of
5924     LAYER_LEGEND_CHANGED
5925    
5926     * Thuban/UI/dock.py (DockableWindow._OnButtonClose): Call
5927     self.Destroy() to close the window after yesterday's changes.
5928    
5929     * test/test_map.py, test/test_session.py: Fix messages that
5930     are sent from maps and layers.
5931    
5932 jonathan 575 2003-03-31 Jonathan Coles <[email protected]>
5933    
5934     * Thuban/UI/classifier.py: Commented out some debugging statements.
5935     (ClassDataPreviewer.Draw): Draw rectangles for polygon layers per
5936     RTbug #1769.
5937    
5938     * Thuban/UI/dock.py (DockableWindow.UnDock): Restore size and
5939     position (although position doesn't work yet under GTK).
5940     (DockableWindow.Destroy): New. Called when the window must be
5941     closed. Namely needed when the DockFrame closes and must close
5942     its children.
5943     (DockFrame): Listen for EVT_CLOSE and destroy all children.
5944    
5945     * Thuban/UI/legend.py (LegendPanel.Destroy): New. Cleans up
5946     when then window is told to close.
5947     (LegendTree._OnMsgLayerChanged): Fixes a seg fault bug. See
5948     comment in source for more info.
5949    
5950     * Thuban/UI/main.py: Show the legend by default when Thuban starts.
5951    
5952     * Thuban/UI/mainwindow.py: Renamed OnClose to _OnClose for
5953     symmetry with other such methods.
5954     (MainWindow.ShowLegend): Show the legend docked by default.
5955    
5956 jonathan 569 2003-03-28 Jonathan Coles <[email protected]>
5957    
5958     * Thuban/UI/classifier.py: Support for highlighting a specific
5959     group within the grid when the classification dialog is opened.
5960     Also contains a lot of debugging printouts which will later
5961     be removed.
5962    
5963     * Thuban/UI/dock.py: Complete rework on the dock code so that
5964     that it is fairly removed from the rest of the Thuban application.
5965     It is easy to add new docks which the rest of the program having
5966     to be aware of them.
5967    
5968     * Thuban/UI/legend.py: Modifications to support selecting a
5969     specific group in the classification dialog. Changed how layers
5970     are drawn when the layer is visible/invisible.
5971    
5972     * Thuban/UI/mainwindow.py: Removed legend specific code and
5973     replaced it with calls to the new dock code.
5974    
5975     * Thuban/UI/renderer.py (MapRenderer.__init__): Added assert
5976     to check if scale > 0. Trying to track down a divide by zero.
5977    
5978 jonathan 557 2003-03-26 Jonathan Coles <[email protected]>
5979    
5980 jonathan 567 * Thuban/UI/legend.py: Removed unnecessary LegendDialog class.
5981     (LegendPanel): Removed _OnDock()/_OnUnDock() methods which are
5982     now part of DockableWindow.
5983     (LegendPanel.DoOnSelChanged): Select the current layer in the
5984     map.
5985     (LegendTree._OnSelChanged): Call LegendPanel.DoOnSelChanged()
5986     with the selected layer and/or group.
5987    
5988     2003-03-26 Jonathan Coles <[email protected]>
5989    
5990 jonathan 557 This putback contains the code for dockable windows. There is
5991     no support in wxWindows as of this date for windows that can
5992     attach themselves to other windows.
5993    
5994     The current model contains a DockableWindow which has a parent
5995     window for when it is detached and a dock window that it puts
5996     its contents in when it is docked. The contents of a DockableWindow
5997     must be a DockPanel. DockPanel itself derives from wxPanel.
5998    
5999     * Thuban/Model/layer.py (Layer.ClassChanged): Send a LAYER_CHANGED
6000     message, not a LAYER_LEGEND_CHANGED message.
6001    
6002     * Thuban/Model/map.py (Map): Forward LAYER_CHANGED messages.
6003    
6004     * Thuban/UI/classifier.py (Classifier.__init__): Use wxADJUST_MINSIZE
6005     as one of the style properties for the fieldTypeText item to
6006     be sure that its size is correct when the text changes.
6007    
6008     * Thuban/UI/dock.py: New. Classes for the DockPanel and
6009     DockableWindow.
6010    
6011     * Thuban/UI/legend.py: Added some more buttons and made the
6012     LegendPanel a DockPanel.
6013    
6014     * Thuban/UI/mainwindow.py: Added sash windows to the main window
6015     and supporting functions for manipulating the sashes.
6016     (MainWindow.ShowLegend): Create a DockableWindow with the
6017     LegendPanel as the contents.
6018    
6019     * Thuban/UI/messages.py: Added DOCKABLE_* messages
6020    
6021     * Thuban/UI/view.py (MapCanves.SetMap): Listen for LAYER_CHANGED,
6022     not LAYER_LEGEND_CHANGED, messages.
6023    
6024 jonathan 554 2003-03-25 Jonathan Coles <[email protected]>
6025    
6026     * setup.py: Added custom script bdist_rpm_build_script so that
6027     when the rpm is built the path to wx-config is correct.
6028    
6029     * setup.cfg: Added line saying to use the custom build script
6030    
6031 jonathan 552 2003-03-20 Jonathan Coles <[email protected]>
6032    
6033     Initial implementation of the Legend.
6034    
6035     * Thuban/UI/legend.py: New. Creates a window that shows the map's
6036     Legend information and allows the user to add/modify classifications
6037     and how the layers are drawn on the map.
6038    
6039     * setup.py: New command 'build_docs' which currently uses
6040     happydoc to generate html documentation for Thuban.
6041    
6042     * Thuban/Model/classification.py (ClassGroup.GetDisplayText): New.
6043     Returns a string which is appropriately describes the group.
6044    
6045     * Thuban/Model/layer.py (Layer.SetClassification): Generate a
6046     LAYER_CHANGED event instead of a LAYER_LEGEND_CHANGED event.
6047    
6048     * Thuban/Model/map.py (Map): Rename messages and use new, more
6049     specific, messages.
6050    
6051     * Thuban/Model/messages.py: New message to indicate that a layer's
6052     data has changed (LAYER_CHANGED). New map messages to indicate
6053     when layers have been added/removed/changed or if the stacking order
6054     of the layers has changed.
6055    
6056     * Thuban/Model/session.py: Rename and use new messages.
6057    
6058     * Thuban/UI/classifier.py: Remember if any changes have actually
6059     been applied so that if the dialog is cancelled without an application
6060     of changes we don't have to set a new classification.
6061     (ClassDataPreviewer): Pulled out the window specific code and put it
6062     ClassDataPreviewWindow. ClassDataPreviewer can then be used to draw
6063     symbols on any DC.
6064    
6065     * Thuban/UI/mainwindow.py: New code to open the legend.
6066    
6067     * Thuban/UI/view.py: Use new message names.
6068    
6069 jonathan 541 2003-03-19 Jonathan Coles <[email protected]>
6070    
6071     * Thuban/UI/main.py (verify_versions): New. Checks the versions
6072     of Python, wxPython, and some other libraries.
6073    
6074     * extensions/thuban/wxproj.cpp (check_version): Checks the given
6075     version against what wxproj was compiled with.
6076     (check_version_gtk): If wxproj was compiled with gtk then check
6077     the given version against the version of the gtk library
6078     currently being used.
6079    
6080 bh 538 2003-03-14 Bernhard Herzog <[email protected]>
6081    
6082     * test/test_command.py: Run the tests when the module is run as a
6083     script
6084    
6085     2003-03-14 Bernhard Herzog <[email protected]>
6086    
6087     Implement selection of multiple selected shapes in the same layer:
6088    
6089     - Introduce a new class to hold the selection. This basically
6090     replaces the interactor which was nothing more than the
6091     selection anyway. A major difference is of course that the new
6092     selection class supports multiple selected shapes in one layer
6093    
6094     - Move the object that represents the selection from the
6095     application to the canvas. The canvas is a better place than the
6096     application because the selection represents which shapes and
6097     layer of the map displayed by the canvas are selected and
6098     affects how the map is drawn.
6099    
6100     - Make the selection and its messages publicly available through
6101     the mainwindow.
6102    
6103     - The non-modal dialogs do not get a reference to the interactor
6104     anymore as they can simply refer to their parent, the
6105     mainwindow, for the what the interactor had to offer.
6106    
6107     * Thuban/UI/selection.py: New module with a class to represent the
6108     selection.
6109    
6110     * Thuban/UI/messages.py (SELECTED_TABLE, SELECTED_MAP): Remove
6111     these unused messages
6112    
6113     * Thuban/UI/application.py (ThubanApplication.OnInit)
6114     (ThubanApplication.OnExit, ThubanApplication.SetSession): The
6115     interactor is gone now.
6116     (ThubanApplication.CreateMainWindow): There is no interactor
6117     anymore so we pass None as the interactor argument for now for
6118     compatibility.
6119    
6120     * Thuban/UI/view.py (MapCanvas.delegated_messages)
6121     (MapCanvas.Subscribe, MapCanvas.Unsubscribe): In Subscribe and
6122     Unsubscribe, delegate messages according to the delegated_messages
6123     class variable.
6124     (MapCanvas.__getattr__, MapCanvas.delegated_methods): Get some
6125     attributes from instance variables as described with the
6126     delegated_methods class variable.
6127     (MapCanvas.__init__): New instance variable selection holding the
6128     current selection
6129     (MapCanvas.do_redraw): Deal with multiple selected shapes. Simply
6130     pass them on to the renderer
6131     (MapCanvas.SetMap): Clear the selection when a different map is
6132     selected.
6133     (MapCanvas.shape_selected): Simple force a complete redraw. The
6134     selection class now takes care of only issueing SHAPES_SELECTED
6135     messages when the set of selected shapes actually does change.
6136     (MapCanvas.SelectShapeAt): The selection is now managed in
6137     self.selection
6138    
6139     * Thuban/UI/mainwindow.py (MainWindow.delegated_messages)
6140     (MainWindow.Subscribe, MainWindow.Unsubscribe): In Subscribe and
6141     Unsubscribe, delegate messages according to the delegated_messages
6142     class variable.
6143     (MainWindow.delegated_methods, MainWindow.__getattr__): Get some
6144     attributes from instance variables as described with the
6145     delegated_methods class variable.
6146     (MainWindow.__init__): The interactor as ivar is gone. The
6147     parameter is still there for compatibility. The selection messages
6148     now come from the canvas.
6149     (MainWindow.current_layer, MainWindow.has_selected_layer):
6150     Delegate to the the canvas.
6151     (MainWindow.LayerShowTable, MainWindow.Classify)
6152     (MainWindow.identify_view_on_demand): The dialogs don't need the
6153     interactor parameter anymore.
6154    
6155     * Thuban/UI/tableview.py (TableFrame.__init__)
6156     (LayerTableFrame.__init__, LayerTableFrame.OnClose)
6157     (LayerTableFrame.row_selected): The interactor is gone. It's job
6158     from the dialog's point of view is now done by the mainwindow,
6159     i.e. the parent. Subscribe to SHAPES_SELECTED instead
6160     of SELECTED_SHAPE
6161    
6162     * Thuban/UI/dialogs.py (NonModalDialog.__init__): The interactor
6163     is gone. It's job from the dialog's point of view is now done by
6164     the mainwindow, i.e. the parent.
6165    
6166     * Thuban/UI/classifier.py (Classifier.__init__): The interactor is
6167     gone. It's job from the dialog's point of view is now done by the
6168     mainwindow, i.e. the parent.
6169    
6170     * Thuban/UI/tree.py (SessionTreeView.__init__): The interactor is
6171     gone. It's job from the dialog's point of view is now done by the
6172     mainwindow, i.e. the parent.
6173     (SessionTreeCtrl.__init__): New parameter mainwindow which is
6174     stored as self.mainwindow. The mainwindow is need so that the tree
6175     can still subscribe to the selection messages.
6176     (SessionTreeCtrl.__init__, SessionTreeCtrl.unsubscribe_all)
6177     (SessionTreeCtrl.update_tree, SessionTreeCtrl.OnSelChanged): The
6178     selection is now accessible through the mainwindow. Subscribe to
6179     SHAPES_SELECTED instead of SELECTED_SHAPE
6180    
6181     * Thuban/UI/identifyview.py (IdentifyView.__init__): Use the
6182     SHAPES_SELECTED message now.
6183     (IdentifyView.selected_shape): Now subscribed to SHAPES_SELECTED,
6184     so deal with multiple shapes
6185     (IdentifyView.__init__, IdentifyView.OnClose): The interactor is
6186     gone. It's job from the dialog's point of view is now done by the
6187     mainwindow, i.e. the parent.
6188    
6189     * Thuban/UI/controls.py (RecordListCtrl.fill_list): The second
6190     parameter is now a list of shape ids.
6191     (RecordTable.SetTable): The second parameter is now a list of
6192     indices.
6193    
6194     * Thuban/UI/renderer.py (ScreenRenderer.RenderMap): Rename the
6195     selected_shape parameter and ivar to selected_shapes. It's now a
6196     list of shape ids.
6197     (MapRenderer.draw_label_layer): Deal with multiple selected
6198     shapes. Rearrange the code a bit so that the setup and shape type
6199     distinctions are only executed once.
6200    
6201     * test/test_selection.py: Test cases for the selection class
6202    
6203 jonathan 527 2003-03-11 Jonathan Coles <[email protected]>
6204    
6205     * Thuban/Model/load.py: Temporary fix so that the xml reader
6206     doesn't cause Thuban to crash.
6207    
6208     * Thuban/Model/layer.py: Handle the cyclic references between
6209     a layer and its classification better, and be sure to disconnect
6210     the classification from the layer when the layer is destroyed
6211     so that we don't maintain a cyclic reference that may not be
6212     garbage collected.
6213    
6214     * Thuban/Model/classification.py: See comment for layer.py.
6215    
6216 jan 523 2003-03-12 Jan-Oliver Wagner <[email protected]>
6217    
6218     * HOWTO-Release: New. Information on the steps for releasing
6219     a new version of Thuban.
6220    
6221 jonathan 514 2003-03-11 Jonathan Coles <[email protected]>
6222    
6223     * Thuban/UI/classifier.py: Add normal border to SelectPropertiesDialog.
6224     Use True instead of true.
6225     (Classifier): Should have a single panel in which all the controls lie.
6226    
6227     * Thuban/UI/proj4dialog.py: Add normal border.
6228    
6229     * Thuban/UI/tree.py: Fixed problem with bad item images under Windows.
6230    
6231     * Thuban/UI/mainwindow.py: Use True instead of true.
6232    
6233     * setup.py: Update some definitions to use wxWindows2.4 files
6234    
6235     * Data/iceland_sample_class.thuban: Fixed file so that the
6236     field_type information is present.
6237    
6238 jonathan 490 2003-03-10 Jonathan Coles <[email protected]>
6239    
6240 jonathan 505 * Thuban/UI/classifier.py (Classifier.__init__): Make the
6241     field type label grow so that when the text changes the
6242     size is updated correctly. This may be a wxWindows bug.
6243    
6244     2003-03-10 Jonathan Coles <[email protected]>
6245    
6246 jonathan 499 * Thuban/UI/application.py: Changed SESSION_CHANGED to
6247     SESSION_REPLACED.
6248    
6249     * Thuban/UI/classifier.py: Wrap text with _().
6250     (ClassGrid.CreateTable): Set dimensions and size hints here,
6251     instead of in Reset, so we only set the size once.
6252    
6253     * Thuban/UI/dialogs.py: Don't need Shutdown(); just use Close()!
6254    
6255     * Thuban/UI/mainwindow.py (MainWindow.prepare_new_session):
6256     Call Close() instead of Shutdown().
6257    
6258     * Thuban/UI/messages.py: Changed SESSION_CHANGED to SESSION_REPLACED.
6259    
6260     * Thuban/UI/tree.py: Changed SESSION_CHANGED to SESSION_REPLACED.
6261     Go back to using OnClose() instead of Shutdown().
6262    
6263     2003-03-10 Jonathan Coles <[email protected]>
6264    
6265 jonathan 497 * Thuban/UI/classifier.py (Classifier): SelectField() needed
6266     to know the old field index as well as the new one.
6267    
6268     2003-03-10 Jonathan Coles <[email protected]>
6269    
6270 jonathan 495 * Thuban/UI/classifier.py (Classifier): Use __SelectField()
6271     to correctly set the table information and call this from
6272     __init__ and from _OnFieldSelect so that all the information
6273     is up to date when the dialog opens and when a field is changed.
6274    
6275     2003-03-10 Jonathan Coles <[email protected]>
6276    
6277 jonathan 490 * Thuban/Model/classification.py (Classification): Don't use
6278     layer's message function directly, use the ClassChanged() method
6279     when then classification changes. SetField/SetFieldType/SetLayer
6280     must keep the information about field name and field type in
6281     sync when an owning layer is set or removed.
6282    
6283     * Thuban/Model/layer.py: Added ClassChanged() so that the
6284     classification can tell the layer when its data has changed.
6285     (Layer.SetClassification): Accepts None as an arguement to
6286     remove the current classification and correctly handles
6287     adding a new classification.
6288    
6289     * Thuban/Model/load.py: Comment out print statement
6290    
6291     * test/test_classification.py, test/test_save.py: New and
6292     improved tests.
6293    
6294 jonathan 483 2003-03-07 Jonathan Coles <[email protected]>
6295    
6296     * Thuban/Model/classification.py: Implemented __copy__ and
6297     __deepcopy__ for ClassGroup* and ClassGroupProperites so
6298     they can easily be copied by the classifier dialog.
6299     (ClassGroupProperites.__init__): The default line color should
6300     have been Color.Black.
6301    
6302     * Thuban/UI/classifier.py: Setting and Getting table values now
6303     uses a consistent set of functions.
6304     (Classifier): Now non-modal. Has field type label which changes
6305     as the field changes. Keep track of buttons in a list so that
6306     we can enable/disable the buttons when the None field is selected.
6307     (SelectPropertiesDialog): Add buttons to make the colors transparent.
6308    
6309     * Thuban/UI/dialogs.py (NonModalDialog.Shutdown): New method which
6310     does what OnClose did, but can be called by the application to
6311     close a window. Needed when a session changes, and we have to
6312     close the classifier windows.
6313    
6314     * Thuban/UI/mainwindow.py (MainWindow.prepare_new_session):
6315     Shuts down open dialogs. Used when a new session is created
6316     or a session is opened.
6317     (MainWindow.SaveSession): Should only call application.SaveSession()
6318     if we don't call SaveSessionAs first.
6319     (MainWindow.Classify): Allow different classifier dialogs for
6320     different layers.
6321    
6322     * Thuban/UI/tree.py (SessionTreeView): Remove OnClose and let
6323     the parent class handle it. Add Shutdown() to unsubscibe from
6324     event notification and call the parent Shutdown(). This was
6325     necessary so the application can close the tree window.
6326    
6327 jonathan 478 2003-03-06 Jonathan Coles <[email protected]>
6328    
6329     * Thuban/Model/classification.py: Minor documentation changes,
6330     Addition of __eq__ and __ne__ methods.
6331     (Classification.SetLayer): prevent recursion between this method
6332     and Layer.SetClassification().
6333    
6334     * Thuban/Model/color.py: Addition of __eq__ and __ne__ methods.
6335    
6336     * Thuban/Model/layer.py (SetClassification): prevent recursion
6337     between this method and Classification.SetLayer().
6338    
6339     * test/test_classification.py, test/test_load.py,
6340     test/test_session.py: Fixed and added tests for the classification
6341     classes.
6342    
6343 bh 477 2003-03-06 Bernhard Herzog <[email protected]>
6344    
6345     * Thuban/UI/classifier.py (ClassGrid.__init__)
6346     (ClassGrid.CreateTable): Move the SetSelectionMode call to
6347     CreateTable because otherwise it triggers an assertion in
6348     wxPython/wxGTK 2.4.
6349    
6350 jonathan 459 2003-03-05 Jonathan Coles <[email protected]>
6351    
6352 jonathan 475 * Thuban/common.py: Move FIELDTYPE constants back to table.py.
6353 jonathan 471
6354 jonathan 475 * Thuban/Model/load.py: import FIELDTYPE constants from table.
6355 jonathan 471
6356 jonathan 475 * Thuban/UI/classifier.py: import FIELDTYPE constants from table.
6357 jonathan 471
6358 jonathan 475 * Thuban/Model/table.py: Put FIELDTYPE constants back.
6359 jonathan 471
6360     2003-03-05 Jonathan Coles <[email protected]>
6361    
6362 jonathan 459 * Thuban/UI/classifier.py: Added class documentation.
6363     Fixed RTbug #1713, #1714. Added Move[Up|Down] buttons.
6364     Store just the groups in the table and generate the other
6365     column information when it is requested. Add "None" field
6366     to pull-down to select no classification.
6367    
6368     * Thuban/common.py: Moved FIELDTYPE constants from table.py
6369     (Str2Num): Only catch ValueError exceptions.
6370    
6371     * Thuban/Model/classification.py: Class documentation. Renaming
6372     of methods with Stroke to Line. Groups are stored in a single
6373     list with the default as the first element. Groups are searched
6374     in the order they appear in the list.
6375    
6376     * Thuban/Model/color.py: Documentation.
6377    
6378     * Thuban/Model/layer.py (Layer): Add GetFieldType to retreive
6379     the kind of data represented by a field.
6380    
6381     * Thuban/Model/load.py (ProcessSession): Use proper string
6382     conversion function; fixes RTbug #1713.
6383    
6384     * Thuban/Model/save.py (Saver): Store field type information.
6385    
6386     * Thuban/Model/table.py: Put FIELDTYPE constants in common.py.
6387     (Table): Add field_info_by_name() to retrieve field information
6388     by specifying the field name, not the number.
6389    
6390     * Thuban/UI/mainwindow.py: Function name changes.
6391    
6392     * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Only
6393     get the layer classification once. Don't try to classify
6394     values when the field is None: just use the default properties.
6395    
6396     * Thuban/UI/view.py: Function name changes.
6397    
6398     * Doc/thuban.dtd: Add field_type attribute to a classification.
6399    
6400 bh 456 2003-03-04 Bernhard Herzog <[email protected]>
6401    
6402 bh 458 * Doc/thuban.dtd: Use correct syntax for optional attributes. Make
6403     the fill and stroke layer attributes optional with suitable
6404     default values. Add the stroke_width layer attribute. Use correct
6405     syntax for empty elements. Make the attribute list for labels
6406     refer to the label element.
6407    
6408     2003-03-04 Bernhard Herzog <[email protected]>
6409    
6410 bh 456 * setup.py (thuban_build_py.build): Add a comment about distutils in
6411     Python 2.3 containing some of the functionality we implement in
6412     setup.py ourselves.
6413    
6414     * Thuban/UI/classifier.py (ClassGrid.__init__): Set the table
6415     before the selection mode. Doing it the other way round triggers
6416     an assertion in wxWindows.
6417    
6418     * Thuban/Model/save.py (escape): Fix typo in doc-string
6419    
6420     * Thuban/Model/classification.py: Remove unnecessary wxPython
6421     import
6422    
6423 jonathan 448 2003-03-04 Jonathan Coles <[email protected]>
6424    
6425     * Thuban/Model/classification.py (ClassGroupRange.GetProperties):
6426     Parameter 'value' should default to None.
6427    
6428     * Thuban/UI/mainwindow.py: Use Layer.GetClassification() since
6429     the class attribute __classification is now private.
6430    
6431     * Thuban/UI/classifier.py (ClassGrid): Moved OnCellDClick() from
6432     Classifier to ClassGrid. Added support for removing selected rows,
6433     which including code for keeping track of when cells are selected,
6434     and deselected.
6435     (ClassTable): Support for added/removing rows. Fixed a problem
6436     with __ParseInput whereby it would not allow strings (only numbers)
6437     to be entered.
6438     (Classifier): Added button and supporting code for removing
6439     selected rows.
6440    
6441 jonathan 445 2003-02-27 Jonathan Coles <[email protected]>
6442 jonathan 434
6443     * Thuban/common.py: Moved color conversion functions into
6444     Thuban/UI/common.py.
6445     (Str2Num): Now converts the float (not the string) to a long/int
6446     so that an exception isn't thrown.
6447    
6448     * Thuban/UI/common.py: Common functions used in several UI modules
6449    
6450     * Thuban/Model/classification.py: Changed the class hierarchy
6451     so that a Classification consists of Groups which return
6452     Properties when a value matches a Group.
6453    
6454     * Thuban/Model/layer.py: Fixed name resolution problem.
6455    
6456     * Thuban/Model/load.py: Use new Classification and Group functions.
6457    
6458     * Thuban/Model/save.py (Saver.write_attribs): Fixes a test case
6459     failure.
6460     (Saver.write_classification): Use new Classification and Group
6461     functions.
6462    
6463     * Thuban/UI/classifier.py: Changes to use new Classification and Group
6464 jonathan 445 functions. Fix to create a tuple with a single value instead of
6465     simply returning the value.
6466 jonathan 434
6467     * Thuban/UI/renderer.py: Use new Classification and Group functions.
6468     Use common.py functions.
6469    
6470 jonathan 445 * Thuban/UI/tree.py: Use common.py functions.
6471 jonathan 447
6472     * test/test_classification.py: Use new Classification and Group
6473     classes.
6474 jonathan 434
6475 jonathan 426 2003-02-24 Jonathan Coles <[email protected]>
6476    
6477     * Thuban/common.py (Color2wxColour, wxColour2Color): Conversion
6478     functions from Thuban color objects to wxWindow colour objects.
6479    
6480     * Thuban/Model/classification.py (Classification): Renamed
6481     GetProperties() to GetClassData(). Used the new iterator
6482     in TreeInfo().
6483     (ClassIterator): Iterator implementation to iterate over the
6484     ClassData objects in a classification object.
6485    
6486     * Thuban/Model/save.py (Saver.write_classificaton): Uses
6487     the new iterator to save the classification information.
6488    
6489     * Thuban/UI/classifier.py (SelectPropertiesDialog): Support
6490     for changing the stroke and fill colors and previewing the
6491     changes.
6492    
6493     * Thuban/UI/mainwindow.py (MainWindow.OpenSession,
6494     MainWindow.SaveSessionAs): Text string changes so the dialogs
6495     have more meaningful titles.
6496    
6497     * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Change
6498     Classification method name from GetProperties to GetClassData.
6499    
6500     * Thuban/UI/view.py (MapCanvas.find_shape_at): Use method calls
6501     instead of accessing now non-existent class variables.
6502    
6503 bh 425 2003-02-24 Bernhard Herzog <[email protected]>
6504    
6505     * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Remove
6506     unneeded Shape() call. Rendering is substantially faster without
6507     it and it avoids some problems with broken shape files.
6508    
6509 frank 423 2003-02-20 Frank Koormann <[email protected]>
6510    
6511     Force minimal size of identify and label dialogs. The autosizing
6512     looked too ugly.
6513    
6514     * Thuban/UI/controls.py (RecordListCtrl): Set minimal width for columns.
6515     * Thuban/UI/labeldialog.py (LabelDialog.dialog_layout):
6516     Set size of listctrl.
6517     * Thuban/UI/identifyview.py (IdentifyView.__init__):
6518     Set size of dialog.
6519    
6520 jonathan 408 2003-02-19 Jonathan Coles <[email protected]>
6521    
6522     * test/test_classification.py, test/test_layer.py,
6523     test/test_load.py, test/test_map.py, test/test_session.py:
6524     Updated the tests to use the new functions that are in the
6525     respective classes.
6526    
6527     * Thuban/Model/classification.py (Classification):
6528     Uses the new ClassData* classes. Modification messages are
6529     passed up to the parent layer (if it exists).
6530     (ClassData): New class to encapsulate the common data in each
6531     classification property.
6532     (ClassDataDefault): Represents the Default class. data.
6533     (ClassDataPoint): Represents a single class. data point
6534     (ClassDataRange): Represents a class. range
6535     (ClassDataMap): Represents a class. map (unused).
6536    
6537     * Thuban/Model/color.py: Added Color.None to represent something
6538     with no color. Color.Black represents the color black.
6539     (NoColor): Helper class derived from Color to represent something
6540     with no color.
6541    
6542     * Thuban/Model/layer.py (Layer): Removed references to fill, stroke,
6543     stroke_width attributes. Made the 'classification' attribute private.
6544     New methods for setting/getting the classification.
6545    
6546     * Thuban/Model/load.py (ProcessSession): Use new methods on Layer
6547     to get the classifcation and use the new ClassData* classes to
6548     hold the classification data. Use Str2Num to convert numbers
6549     properly.
6550    
6551     * Thuban/Model/save.py (Saver): Use new Color and Classification
6552     methods
6553    
6554     * Thuban/UI/classifier.py (ClassGrid): New class to represent a
6555     custom grid.
6556     (ClassTable): Support for editing Values and Labels and for
6557     changing what type (point or range) of data is stored in each
6558     property based on how the user enters the data.
6559     (Classifier): Support for saving the new classifications and
6560     launching the dialog to edit a property.
6561     (SelectPropertiesDialog): New class for editing the visual
6562     properties of a classification (stroke color, width, and fill color)
6563     (ClassPreviewer): Took the Draw method from ClassRenderer and
6564     made most of it into this new class. Intend to use this class in
6565     the SelectPropertiesDialog for previewing changes.
6566    
6567     * Thuban/UI/renderer.py: Use new Color and Classification methods.
6568    
6569     * Thuban/UI/tree.py: Formatting changes.
6570    
6571     * Doc/thuban.dtd: Add 'label' element
6572    
6573     * Thuban/common.py: New. Contains common routines used throughout
6574     the code.
6575     (Str2Num): Takes a string and converts it to the "best" type of
6576     number.
6577    
6578 bh 405 2003-02-14 Bernhard Herzog <[email protected]>
6579    
6580     * Thuban/UI/view.py (MapCanvas.OnLeftUp): Make sure that the
6581     dragging flag is always set to 0 even when the tool implementation
6582     raises an exception
6583    
6584 bh 402 2003-02-11 Bernhard Herzog <[email protected]>
6585    
6586     * Thuban/UI/application.py (ThubanApplication.splash_screen): New
6587     method to create a splash screen.
6588     (ThubanApplication.ShowMainWindow): New. Show the main window.
6589     Needed so the splash screen can display the mainwindow
6590     (ThubanApplication.OnInit): Call the
6591     new splash_screen method to determine whether the application
6592     should display a splash screen. If it displays a splash screen do
6593     not immediately show the main window.
6594    
6595 jonathan 399 2003-02-11 Jonathan Coles <[email protected]>
6596    
6597     * Thuban/Model/classification.py: Added import line to fix
6598     feature conflicts between running on python2.2 and python2.1.
6599    
6600     * Thuban/UI/classifier.py (ClassTable): Didn't need to hang
6601     onto the clinfo parameter, so removed the deepcopy().
6602    
6603 jonathan 396 2003-02-10 Jonathan Coles <[email protected]>
6604    
6605 tkoester 403 * Thuban/Model/save.py (Saver.open_element, Saver.close_element):
6606 jonathan 396 Added element_open variable to track opening and closing of tags
6607     so that tags that don't span more than one line are closed with
6608     /> instead of </tag_name>. Use the GetDefault*() methods of
6609     the Classification class.
6610    
6611     * Thuban/Model/classification.py (Classificaton): Added set and
6612     get methods for the default data. The class also takes a layer
6613     reference so that modification messages can be sent. Fixed the
6614     methods to use the new ClassData class.
6615     (ClassData): New class to encapsulate the classification data
6616    
6617     * Thuban/Model/layer.py (Layer): Remove the
6618 tkoester 403 Set[Fill|Stroke|StrokeWidth]() methods. Code should call the
6619 jonathan 396 SetDefault*() methods on the layer's classification object.
6620 tkoester 403 (Layer.__init__): Use the new SetDefault*() methods in the
6621 jonathan 396 Classification class.
6622    
6623     * Thuban/Model/load.py (ProcessSession): Use the new ClassData
6624     object instead of a dictionary.
6625    
6626 tkoester 403 * Thuban/UI/classifier.py (ClassRenderer): New class to
6627 jonathan 396 draw the classifications in the dialog box's table.
6628     (Classifier): Modified to use the ClassRenderer class.
6629    
6630 tkoester 403 * Thuban/UI/mainwindow.py (MainWindow): Use the SetDefault*()
6631     methods of the Classification class.
6632 jonathan 396
6633     * Thuban/UI/renderer.py (MapRenderer): Use the Get*() methods
6634     of the ClassData class.
6635    
6636     * test/test_classification.py, test/test_layer.py,
6637     test/test_map.py, test/test_session.py: Fix the tests to work
6638     with the above code changes.
6639    
6640 jonathan 387 2003-02-03 Jonathan Coles <[email protected]>
6641    
6642     * Thuban/Model/classification.py (Classification): Added getNull()
6643     to return the NullData reference
6644    
6645     * Thuban/Model/layer.py (Layer.SetFill, Layer.SetStroke,
6646     Layer.SetStrokeWidth): Modified these functions to change the
6647     null data in the classification rather than keep these values
6648     directly in the Layer class. Menu options to change these values
6649     work again.
6650    
6651 jonathan 380 2003-01-28 Jonathan Coles <[email protected]>
6652    
6653 jonathan 384 * Thuban/UI/classifier.py (Classifier): Resolved merging conflicts.
6654 tkoester 403 Fixed crashing problem on some systems. Dialog box shows
6655 jonathan 380 classification data.
6656    
6657 jonathan 384 * Thuban/UI/tree.py (SessionTreeCtrl.add_items): Handle drawing
6658     Colors in the tree view.
6659    
6660     * Thuban/Model/layer.py (Layer.TreeInfo): Added a call to build
6661     the tree info for classifications. Commented out unnecessary lines.
6662    
6663     * Thuban/Model/classification.py (Classification.TreeInfo): New
6664     function to add information about the classification into the
6665     tree view.
6666    
6667 tkoester 403 2003-01-27 Jan-Oliver Wagner <[email protected]>
6668 jan 375
6669 tkoester 403 * Thuban/__init__.py (_): New.
6670 jan 375
6671     * Thuban/Model/classification.py, Thuban/Model/extension.py,
6672     Thuban/Model/layer.py, Thuban/Model/load.py, Thuban/Model/map.py,
6673 tkoester 403 Thuban/Model/session.py, Thuban/UI/application.py,
6674     Thuban/UI/classifier.py, Thuban/UI/context.py, Thuban/UI/controls.py,
6675     Thuban/UI/identifyview.py, Thuban/UI/labeldialog.py,
6676     Thuban/UI/mainwindow.py, Thuban/UI/menu.py, Thuban/UI/proj4dialog.py,
6677     Thuban/UI/renderer.py, Thuban/UI/tree.py, Thuban/Lib/connector.py,
6678     Thuban/Lib/fileutil.py: Replace user string by _() for i18n.
6679 jan 375
6680 jonathan 370 2003-01-27 Jonathan Coles <[email protected]>
6681    
6682 tkoester 403 * Thuban/Model/layer.py: Classification initialization calls.
6683 jonathan 370
6684 tkoester 403 * Thuban/Model/classification.py: Created class to encapsulate
6685     a layer classification. Supports specific data points and
6686     ranges.
6687 jonathan 370
6688 tkoester 403 * Thuban/Model/load.py: Added support for loading classification
6689     information.
6690 jonathan 370
6691 tkoester 403 * Thuban/Model/save.py: Added support for saving classification
6692     information.
6693 jonathan 370
6694 tkoester 403 * Thuban/UI/classifier.py: Initial class for a dialog box for
6695     specifying classification information.
6696 jonathan 370
6697 tkoester 403 * Thuban/UI/mainwindows.py: Support for opening the classifier
6698     dialog.
6699 jonathan 370
6700 tkoester 403 * Thuban/UI/renderer.py: Support for drawing a layer with the
6701     classification information.
6702 jonathan 370
6703 tkoester 403 * Data/iceland_sample_class.thuban: iceland_sample with
6704     classification data.
6705 jonathan 370
6706 tkoester 403 * test/test_classification: Tests for the Classification class.
6707 jonathan 370
6708 bh 359 2002-12-09 Bernhard Herzog <[email protected]>
6709    
6710 bh 361 * test/test_command.py: New. Tests for the command classes.
6711    
6712 bh 359 * Thuban/UI/command.py (ToolCommand): New class for tool commands.
6713     (Command.IsTool): New method to distinguish between command
6714     switching tools and other commands.
6715    
6716     * Thuban/UI/view.py (MapCanvas.SelectTool): New method to select
6717     the tool to avoid direct assignments to instance variables
6718     (MapCanvas.ZoomInTool, MapCanvas.ZoomOutTool, MapCanvas.PanTool)
6719     (MapCanvas.IdentifyTool, MapCanvas.LabelTool): Use SelectTool to
6720     change the tool
6721    
6722     * Thuban/UI/mainwindow.py (MainWindow.update_command_ui): If an
6723     active tool's command turns insensitive, disable the tool.
6724     (_tool_command): Use the new ToolCommand class
6725    
6726     * Examples/simple_extensions/simple_tool.py (simple_tool): Use the
6727     SelectTool method to change the tool
6728     (iconfile): Use the ToolCommand class
6729    
6730 bh 354 2002-12-03 Bernhard Herzog <[email protected]>
6731    
6732     * Thuban/UI/tree.py (SessionTreeCtrl.normalize_selection): Handle
6733     the case of selected items that are not children of Layers or Maps
6734     properly. Previously this bug would trigger an assertion in
6735     wxWindows.
6736    
6737 frank 352 2002-11-06 Frank Koormann <[email protected]>
6738    
6739 bh 354 * Thuban/UI/mainwindow.py: Altered the order of tools in the
6740     toolbar: First now are all navigation tools (Zoom In/Out, Pan,
6741     Full Extent).
6742 tkoester 403
6743 bh 349 2002-10-23 Bernhard Herzog <[email protected]>
6744    
6745     * setup.py (setup call): version now 0.1.3
6746    
6747     * MANIFEST.in: Add the files in test/
6748    
6749     * test/README: Add note about tests requiring the iceland data
6750    
6751     * Thuban/UI/mainwindow.py (MainWindow.About): Add 2002 to
6752     copyright notice.
6753    
6754 bh 344 2002-10-18 Bernhard Herzog <[email protected]>
6755    
6756     * test/test_map.py
6757     (TestMapWithContents.test_projected_bounding_box): Use an explicit
6758     epsilon.
6759    
6760     * test/support.py (FloatComparisonMixin.assertFloatEqual)
6761     (FloatComparisonMixin.assertFloatSeqEqual): give a more useful
6762     message if the assertion fails and don't return the return value
6763     of self.assert_. In assertFloatSeqEqual the return meant that not
6764     all items of the sequence were compared.
6765    
6766 bh 326 2002-09-20 Bernhard Herzog <[email protected]>
6767    
6768 bh 341 * test/test_fileutil.py: New. Test cases for Thuban.Lib.fileutil
6769    
6770     * Thuban/Lib/fileutil.py: Fixup some whitespace and typos
6771    
6772 bh 338 * test/test_map.py (TestMapWithContents.test_tree_info): Create
6773     the string with the bounding box on the fly because of platform
6774     differences in the way %g is handled.
6775    
6776     * test/test_layer.py (TestLayer.test_empty_layer): Create an empty
6777     DBFfile too because Thuban layers can't yet cope missing DBF
6778     files.
6779    
6780     2002-09-20 Bernhard Herzog <[email protected]>
6781    
6782 bh 326 * test/test_menu.py: Use initthuban instead of
6783     add_thuban_dir_to_path to initialize Thuban.
6784    
6785     * test/support.py (FloatComparisonMixin.assertFloatEqual): New.
6786     Mixin class for float comparisons
6787     (SubscriberMixin): New. Mixin class to test messages sent through
6788     the Connector class
6789    
6790     * test/README: Fix a typo and add the -v flag to the command for
6791     individual tests
6792    
6793 bh 335 * test/test_session.py: New. Test cases for Thuban.Model.session
6794    
6795     * test/test_proj.py: New. Test cases for Thuban.Model.proj
6796    
6797     * test/test_map.py: New. Test cases for Thuban.Model.map
6798    
6799     * test/test_layer.py: New. Test cases for Thuban.Model.layer
6800    
6801     * test/test_label.py: New. Test cases for Thuban.Model.label
6802    
6803     * test/test_connector.py: New. Test cases for Thuban.Lib.connector
6804    
6805     * test/test_color.py: New. Test cases for Thuban.Model.color
6806    
6807     * test/test_base.py: New. Test cases for Thuban.Model.base
6808    
6809 bh 322 2002-09-13 Bernhard Herzog <[email protected]>
6810    
6811     * Thuban/Model/session.py (Session.forwarded_channels): Forward
6812     the CHANGED channel too.
6813    
6814     * Thuban/Model/map.py (Map.forwarded_channels): Forward the
6815     CHANGED channel too.
6816     (Map.__init__): Call the Modifiable constructor as well.
6817    
6818     * Thuban/Model/base.py (Modifiable.UnsetModified): Issue a CHANGED
6819     event if the modified flag changes.
6820     (Modifiable.changed): Tweak the doc-string.
6821    
6822     * Thuban/UI/mainwindow.py (MainWindow.view_position_changed)
6823     (MainWindow.set_position_text): Put the code that puts the text
6824     with the mouse position into the status bar into the new method
6825     set_position_text so that it can overwritten in derived classes.
6826    
6827 bh 317 2002-09-12 Bernhard Herzog <[email protected]>
6828    
6829     * Thuban/UI/mainwindow.py (MainWindow.RunMessageBox): Center the
6830     message box on the main window.
6831    
6832 bh 313 2002-09-11 Bernhard Herzog <[email protected]>
6833    
6834     * Thuban/UI/mainwindow.py: Underline the 'x' in "Exit" instead of
6835     the 'E' because it's less likely to interfere with other menu
6836     entries.
6837 bh 315 (MainWindow.build_menu): remove an incorrect comment.
6838 bh 313
6839 bh 311 2002-09-10 Bernhard Herzog <[email protected]>
6840    
6841     * Thuban/UI/mainwindow.py (MainWindow.Map): New.
6842     (_tool_command): Add sensitive parameter
6843     (_has_visible_map): Sensitivity callback to tools and other
6844     commands that require a visible map. Use it in map_zoom_in_tool,
6845     map_zoom_out_tool, map_pan_tool, map_identify_tool, map_label_tool
6846     and map_full_extent
6847    
6848 bh 308 2002-09-06 Bernhard Herzog <[email protected]>
6849    
6850     * Thuban/UI/mainwindow.py (MainWindow.OnClose): Unsubscribe
6851     VIEW_POSITION
6852    
6853 tkoester 403 2002-09-04 Frank Koormann <[email protected]>
6854 frank 306
6855     * Resources/Bitmaps/fullextent.xpm: Updated Icon (removed "potatoe")
6856    
6857 bh 302 2002-09-02 Bernhard Herzog <[email protected]>
6858    
6859 bh 304 * Thuban/UI/view.py: Get rid of the idle redraw. This is done by
6860     wxWindows already and our implementation doesn't work correctly
6861     with wxGTK 2.3:
6862     (MapCanvas.__init__): Remove the instance variable
6863     (MapCanvas.OnPaint): Always call do_redraw when there's a map to
6864     be drawin
6865     (MapCanvas.OnIdle): Removed.
6866    
6867 bh 302 * Thuban/UI/view.py (MapCanvas.unprojected_rect_around_point): Add
6868     a parameter to determine the size of the rectangle.
6869     (MapCanvas.find_shape_at): Create the box around the point on a
6870     layer by layer basis and make the size depend on the shape type.
6871     This solves a problem with the selection of point shapes at the
6872     border of the layer's bounding box
6873    
6874 bh 292 2002-08-30 Bernhard Herzog <[email protected]>
6875    
6876 bh 300 * Thuban/UI/mainwindow.py (MainWindow.CanRemoveLayer): New method
6877     for the sensitivity of remove layer.
6878     (_can_remove_layer): New. Sensitivity callback for remove layer
6879     (Command layer_remove): Use _can_remove_layer
6880    
6881     * Thuban/Model/map.py (Map.CanRemoveLayer): New method to
6882     determine whether a given layer can be deleted.
6883    
6884 bh 297 * Thuban/UI/view.py (MapCanvas.__init__, MapCanvas.OnPaint)
6885     (MapCanvas.do_redraw): Get rid of the unused update_region
6886     instance variable
6887    
6888 bh 294 * Thuban/UI/view.py: Add/update some doc-strings.
6889    
6890 bh 292 * test/: new subdirectory with a bunch of unit tests.
6891    
6892     * test/README, test/test_table.py, test/test_save.py,
6893     test/test_menu.py, test/test_load.py: Initial set of tests and
6894     brief instructions on how to run them
6895    
6896 bh 287 2002-08-29 Bernhard Herzog <[email protected]>
6897    
6898 bh 291 * Thuban/UI/renderer.py (ScreenRenderer.draw_shape_layer): Handle
6899     arcs with multiple parts.
6900    
6901 bh 289 * Thuban/UI/view.py (ZoomInTool.MouseUp, ZoomOutTool.MouseUp):
6902     Handle degenrate rectangles.
6903    
6904 bh 287 * Thuban/Model/table.py: Make writing records work correctly:
6905     (Table.__init__): Keep track of whether the DBF is open for
6906     writing
6907     (Table.write_record): Open the DBF file for writing when necessary
6908    
6909 bh 285 2002-08-27 Bernhard Herzog <[email protected]>
6910    
6911     * Thuban/Model/table.py (Table.write_record, Table.__init__): Open
6912     dbf files only for reading by default. Use a new writable dbf
6913     object for writing.
6914    
6915 bh 278 2002-08-26 Bernhard Herzog <[email protected]>
6916    
6917 bh 282 * Thuban/UI/mainwindow.py: Refactor the context creation:
6918     (MainWindow.Context): New method to return a context
6919     (MainWindow.invoke_command, MainWindow.update_command_ui): Use the
6920     new method
6921    
6922 bh 278 * Thuban/UI/tableview.py (TableGrid, LayerTableGrid): Split the
6923     layer table specific code from TableGrid into LayerTableGrid
6924     (TableFrame, LayerTableFrame): Split the layer table specific code
6925     from TableFrame into LayerTableFrame
6926 bh 280 (LayerTableGrid.select_shape): Remove a debug print
6927 bh 278
6928     * Thuban/UI/mainwindow.py (MainWindow.LayerShowTable): Use the
6929     LayerTableFrame
6930    
6931 bh 277 2002-08-23 Bernhard Herzog <[email protected]>
6932    
6933     * Thuban/Model/layer.py (Layer.__init__): Make sure we have an
6934     absolute filename.
6935    
6936 bh 269 2002-08-22 Bernhard Herzog <[email protected]>
6937    
6938 bh 275 * Thuban/Model/table.py (Table.write_record): New method to write
6939     records.
6940 tkoester 403 (Table.__init__): Open the DBF file for writing too.
6941 bh 275
6942     * Thuban/UI/controls.py (RecordTable.SetValue): Write the value
6943     into the underlying table.
6944    
6945     * extensions/shapelib/shapefil.h (DBFCommit),
6946     extensions/shapelib/dbfopen.c (DBFCommit): New API function to
6947     commit any changes made to the DBF file.
6948    
6949 bh 271 * Thuban/UI/mainwindow.py (make_check_current_tool)
6950     (_tool_command): Put the code that generates the "checked"
6951     callback into a separate function so that we can reuse it
6952     elsewhere
6953    
6954 bh 269 * Thuban/Model/save.py (Saver): New class to handle serializing a
6955     session into an XML file. The main reason to introduce a class is
6956     that applications built on Thuban can derive from it so that they
6957     can save additional information in a session file.
6958     (save_session): Delegate almost all the work to the Saver class.
6959     Rename the filename argument to file because it may be a file like
6960     object now.
6961    
6962     * Thuban/Model/load.py: Get rid of the Python 1.5.2 compatibility
6963     code. Remove the little test code which would be executed when the
6964     module is run as a script which didn't work anymore since it can't
6965     import the other Thuban modules.
6966     (ProcessSession, load_session): Refactor the ProcessSession to
6967     have one method for each element start and end tag so that derived
6968     classes can easily override the processing of individual tags.
6969     Also, always parse with namespaces enabled because applications
6970     built on top of Thuban will likely use namespaces if they extend
6971     the session file format.
6972    
6973 bh 266 2002-08-21 Bernhard Herzog <[email protected]>
6974    
6975     * setup.py (ThubanInstall.run): Don't repr install_lib_orig
6976     because thubaninit_contents will do it for us.
6977    
6978 tkoester 403 2002-08-16 Jan-Oliver Wagner <[email protected]>
6979 jan 265
6980     * Thuban/UI/mainwindow.py: menu item 'show session tree' now disable if
6981     tree window already open
6982    
6983 bh 259 2002-08-15 Bernhard Herzog <[email protected]>
6984    
6985 bh 263 * Thuban/Model/layer.py (Layer.Destroy): Call the unboundd method
6986     with self.
6987    
6988     * Thuban/UI/view.py (MapCanvas.OnLeftUp): Only release the mouse
6989     when we have actually captured it.
6990    
6991 bh 259 * Thuban/Model/layer.py (Layer.Destroy): New. Explicitly close the
6992     shapefile and destroy the table.
6993    
6994     * Thuban/Model/table.py (Table.Destroy): New. Close the DBF file.
6995    
6996 bh 254 2002-08-14 Bernhard Herzog <[email protected]>
6997    
6998 bh 256 * Thuban/UI/controls.py (RecordTable.__init__): Remove the unused
6999     instance variable columns
7000     (RecordTable.GetTypeName): row and col may be negative in some
7001     cases.
7002    
7003 bh 254 * setup.py (InstallLocal.initialize_options)
7004     (InstallLocal.finalize_options, InstallLocal.user_options): New
7005     option create-init-file to build a thubaninit.py when running
7006     install_local
7007     (InstallLocal.run): Create the thubaninit.py module when requested
7008     (thubaninit_contents): Split the template into several parts and
7009     create a new function thubaninit_contents that creates the
7010     contents of a thubaninit module.
7011     (ThubanInstall.run): Use the new function to create the thubaninit
7012     module.
7013    
7014 bh 252 2002-07-30 Bernhard Herzog <[email protected]>
7015    
7016     * Thuban/UI/application.py (ThubanApplication.OnExit): Do some
7017     cleanup.
7018     (ThubanApplication.MainLoop): Extend to automatically call OnExit.
7019    
7020     * Thuban/Model/session.py (Session.Destroy): Don't bypass the
7021     direct base class' Destroy method.
7022    
7023     * Thuban/Model/map.py (Map.ClearLayers): New method to delete all
7024     layers.
7025     (Map.Destroy): Destroy the label_layer as well and call the
7026     inherited Desatroymethod first so that no more messages are
7027     issued.
7028     (Map.RaiseLayer, Map.LowerLayer): Only issue LAYERS_CHANGED
7029     message if the stacking order actually has changed. Add
7030     doc-strings.
7031     (Map.BoundingBox): Correct the doc-string.
7032     (Map.AddLayer, Map.RemoveLayer, Map.Layers, Map.HasLayers)
7033     (Map.ProjectedBoundingBox, Map.SetProjection): Add doc-strings.
7034    
7035     * Thuban/Model/label.py (LabelLayer.ClearLabels): New to delete
7036     all labels.
7037    
7038 bh 247 2002-07-29 Bernhard Herzog <[email protected]>
7039    
7040     * Thuban/Model/map.py (Map.subscribe_layer_channels)
7041     (Map.unsubscribe_layer_channels): Put the code that (un)subscribes
7042     to a layer's channels into separate methods.
7043     (Map.RemoveLayer, Map.AddLayer): Call the new methods
7044     (Map.Destroy): Unsubscribe from a layer's channels before
7045     destroying it.
7046    
7047     * Thuban/UI/view.py (MapCanvas.find_shape_at): Change the
7048     selected_layer parameter to searched_layer which is the layer to
7049     search in.
7050     (MapCanvas.SelectShapeAt): New parameter layer to restrict the
7051     search to that layer. Return the selected layer and shape.
7052    
7053     * Examples/simple_extensions/simple_tool.py (simple_tool): Fix a
7054     typo
7055    
7056 bh 238 2002-07-24 Bernhard Herzog <[email protected]>
7057    
7058 bh 243 * Thuban/UI/application.py (ThubanApplication.create_session):
7059     Extend the doc string.
7060     (ThubanApplication.subscribe_session)
7061     (ThubanApplication.unsubscribe_session): New methods to
7062     subscribe/unsubscribe to/from session channels.
7063     (ThubanApplication.SetSession): Call the new methods here.
7064     (ThubanApplication.maps_changed, ThubanApplication.set_map):
7065     Renamed set_map to maps_changed. Its now a subscriber for
7066     MAPS_CHANGED.
7067    
7068     * Thuban/UI/view.py (ZoomOutTool.MouseUp): Use the correct
7069     x-coordinate in case of simple clicks
7070    
7071     * Thuban/Model/base.py (Modifiable.changed): Apply the args tuple,
7072     don't pass it as a parameter
7073    
7074     * Thuban/Model/session.py (Session.RemoveMap): New
7075    
7076 bh 238 * Thuban/UI/mainwindow.py (MainWindow.__init__): Turn the initial
7077     window size into a parameter.
7078    
7079 bh 235 2002-07-23 Bernhard Herzog <[email protected]>
7080    
7081 bh 237 * Thuban/UI/menu.py (Menu.item_index): Also search for menus not
7082     just commands.
7083    
7084 bh 235 * Thuban/UI/mainwindow.py (MainWindow.__init__): Change the
7085     parameter list a bit to allow setting the window title and the
7086     initial message in the status bar. Update the callers.
7087    
7088     * Thuban/UI/application.py (ThubanApplication.OnInit)
7089     (ThubanApplication.CreateMainWindow): Put the mainwindow
7090     instantiation into a separate method so that it can be overridden
7091     by a subclass.
7092    
7093 bh 230 2002-07-19 Bernhard Herzog <[email protected]>
7094    
7095 bh 234 * Thuban/Model/session.py: Issue a CHANGED message every time
7096     another changed message is issued to make it easier to get
7097     notified of changes.
7098     (Session): Update the doc string
7099     (Session.forward): Issue changed-events as CHANGED as well.
7100     (Session.changed): Overwrite the inherited version to issue
7101     CHANGED events as well.
7102    
7103     * Thuban/UI/tree.py: We can now simply subscribe to the session's
7104     CHANGED channel to be informed of changes.
7105     (SessionTreeCtrl.session_channels): Not needed any longer.
7106 tkoester 403 (SessionTreeCtrl.unsubscribe_all, SessionTreeCtrl.session_changed):
7107 bh 234 Only have to (un)subscribe CHANGED
7108    
7109     * Thuban/Model/map.py (Map.TreeInfo): Deal better with empty maps.
7110    
7111 bh 230 * Thuban/UI/main.py, Thuban/UI/__init__.py: Move the work-around
7112     for the wxPython locale bug to __init__.py so that it's
7113     automatically executed by anybody using UI code from Thuban.
7114    
7115 bh 225 2002-07-18 Bernhard Herzog <[email protected]>
7116    
7117 bh 228 * Thuban/UI/main.py (main): app no longer needs to be global
7118    
7119     * Thuban/UI/mainwindow.py (MainWindow.__init__): Add application
7120     as parameter and store it in an instance variable
7121     (MainWindow.invoke_command, MainWindow.update_command_ui)
7122     (MainWindow.save_modified_session, MainWindow.NewSession)
7123     (MainWindow.OpenSession, MainWindow.SaveSession)
7124     (MainWindow.SaveSessionAs, MainWindow.ShowSessionTree): Use self's
7125     application object.
7126    
7127     * Thuban/UI/application.py (ThubanApplication.OnInit): Instantiate
7128     the main window with self.
7129    
7130 bh 225 * Thuban/UI/context.py: New module with the context class
7131    
7132     * Thuban/UI/command.py (Command): Update doc string.
7133    
7134     * Thuban/UI/mainwindow.py (MainWindow.invoke_command,
7135     MainWindow.update_command_ui): Pass an instance of the context
7136     class to the command's methods
7137     (check_current_tool, call_method): Handle the new context
7138     implementation
7139    
7140     * Examples/simple_extensions/simple_tool.py (simple_tool,
7141     check_simple_tool): Handle the new context implementation
7142    
7143     * Examples/simple_extensions/simple_command.py (simple_command):
7144     Handle the new context implementation. Update the comments about
7145     the context.
7146    
7147     * Thuban/UI/application.py (ThubanApplication.SetSession): Add
7148     doc-string
7149     (ThubanApplication.Session): New method to return the session
7150     object
7151    
7152     * Thuban/UI/tree.py (SessionTreeCtrl.update_tree): The
7153     interactor's selected_layer may not be a layer of the current
7154     session when the tree is updated while a new session is being set.
7155    
7156 bh 217 2002-07-17 Bernhard Herzog <[email protected]>
7157    
7158     * Thuban/UI/tree.py (color_string): Removed. No longer used.
7159     (SessionTreeCtrl.update_tree, SessionTreeCtrl.add_items): Split
7160     update_tree into update_tree and add_items. The tree now uses a
7161     more generic way to display the contents of the tree.
7162     (SessionTreeCtrl): Add a doc string explaining the TreeInfo method
7163    
7164     * Thuban/Model/layer.py (Layer.TreeInfo),
7165     Thuban/Model/extension.py (Extension.TreeInfo),
7166     Thuban/Model/map.py (Map.TreeInfo),
7167 tkoester 403 Thuban/Model/session.py (Session.TreeInfo):
7168 bh 217 Add TreeInfo methods to implement the new tree view update scheme
7169    
7170 bh 216 2002-07-16 Bernhard Herzog <[email protected]>
7171    
7172     * Thuban/UI/application.py: Don't use "import from" for the
7173     MainWindow. It can't always be resolved.
7174     (ThubanApplication.OnInit): change reference to MainWindow
7175     accordingly.
7176    
7177     * Thuban/UI/menu.py (Menu.SetItems): New method to replace a menu
7178     completely
7179    
7180 bh 213 2002-07-10 Bernhard Herzog <[email protected]>
7181    
7182     * setup.py (create_init_module): New configurable variable whose
7183     default depends on the platform we're running on.
7184     (ThubanInstall.initialize_options): Initialize
7185     self.create_init_module from the global create_init_module
7186     (ThubanInstall.user_options): indictate that the options
7187     create-init-module and init-module-dir have arguments.
7188    
7189     * setup.py: In the setup call change the version number to include
7190     cvs.
7191    
7192     * MANIFEST.in: Add the files in Examples
7193    
7194 bh 205 2002-07-09 Bernhard Herzog <[email protected]>
7195    
7196 bh 210 * setup.py: In the setup call, use the thuban homepage as the
7197     value of the url parameter.
7198    
7199 bh 208 * Examples: New subdirectory for examples.
7200    
7201     * Examples/simple_extensions/simple_tool.xpm,
7202     Examples/simple_extensions/simple_tool.py,
7203     Examples/simple_extensions/simple_command.py,
7204     Examples/simple_extensions/README: Simple examples showing how to
7205     add new commands and tools.
7206    
7207 bh 207 * setup.cfg (bdist_rpm): Add the default value for prefix and tell
7208     bdist_rpm that we also have an install script.
7209     (bdist_inno): Add 2002 to the copyright notice.
7210    
7211 bh 205 * setup.py: Create a file in python's site-packages directory to
7212     make installation of Thuban as a library easier.
7213     (ThubanInstall.user_options): Add two new options,
7214     create-init-module and init-module-dir
7215     (ThubanInstall.expand_with_pure_python_dirs): New method to expand
7216     filenames for installation in the default directories.
7217     (ThubanInstall.select_scheme, ThubanInstall.convert_paths): Extend
7218     the inherited methods to capture some filenames before they're
7219     transformed too much by distutils.
7220     (ThubanInstall.run): Create the init module if requested.
7221     (ThubanInstall.thuban_init_filename): New method to return the
7222     full name of the init module.
7223     (ThubanInstall.get_outputs): Append the filename of the init
7224     module.
7225    
7226 bh 202 2002-07-08 Bernhard Herzog <[email protected]>
7227    
7228 bh 205 * setup.py (thuban_bdist_rpm): Extend this version of bdist_rpm to
7229     handle the prefix properly which means that the default for the
7230     installation prefix should be /usr for RPMs and /usr/local when
7231     doing a normal source install.
7232     (bdist_rpm_install_script): Script to override the default install
7233     commands in the specfile generated by the bdist_rpm command.
7234     (thuban_bdist_rpm.user_options): Add a prefix option
7235     (thuban_bdist_rpm.initialize_options): Init the prefix option.
7236     Create the script files for the spec files as empty files here
7237     (thuban_bdist_rpm._make_spec_file): Override the inherited method
7238     to fill the script files with content.
7239    
7240 bh 202 * Thuban/Model/save.py (relative_filename): Wrapper around
7241     Thuban.Lib.fileutil.relative_filename that accepts an empty dir
7242     argument. save_session now automatically uses this version,
7243     solving a problem when saving to a relative filename.
7244    
7245     * setup.py: In the setup call, make sure that the library
7246     directories are under $prefix/lib not directly under $prefix.
7247    
7248 tkoester 403 2002-06-20 Jan-Oliver Wagner <[email protected]>
7249 jan 199
7250     * Thuban/Model/extension.py: new module to handle extension objects.
7251     * Thuban/Model/messages.py: new messages for extensions.
7252     * Thuban/Model/session.py (Session.Extensions, Session.HasExtensions,
7253     Session.AddExtension): new for handling extensions.
7254     Also some other minor changes to round up extension handling.
7255     * Thuban/UI/tree.py (SessionTreeCrtl:update_tree): Added visualization
7256     of Extension titles and title and names of its objects.
7257    
7258 bh 194 2002-05-29 Bernhard Herzog <[email protected]>
7259    
7260     * Thuban/UI/mainwindow.py (MainWindow.bind_command_events): Bind
7261 bh 202 the events for a command.
7262 bh 194 (MainWindow.add_toolbar_command, MainWindow.add_menu_command):
7263     Call bind_command_events to bind the events. add_toolbar_command
7264     can now bind events too so that it's possible to have commands
7265     that are only available through the toolbar.
7266     (MainWindow.init_ids): New instance variable events_bound to keep
7267     track of for which commands events have been bound.
7268    
7269 bh 190 2002-05-28 Bernhard Herzog <[email protected]>
7270    
7271     * Thuban/UI/menu.py: New module to build and manage menus.
7272    
7273     * Thuban/UI/mainwindow.py: Remove some unused imports.
7274     (MainWindow.__init__, main_menu): move the definition of the main
7275     menu from __init__ to the Menu instance main_menu.
7276     (MainWindow.build_menu_bar, MainWindow.build_menu): New methods to
7277     build the menu bar and sub-menus from a menu description.
7278    
7279     * Thuban/UI/application.py (ThubanApplication.OnInit): Read the
7280     startup file
7281     (ThubanApplication.read_startup_files): New method to run
7282     ~/.thuban/thubanstart.py
7283    
7284 bh 192 * Thuban/UI/mainwindow.py (MainWindow.__init__, main_toolbar):
7285     Move the toolbar definition to the Menu instance main_toolbar.
7286     (MainWindow.build_toolbar): New method to build the toolbar
7287     similar to the build_menu methods
7288    
7289 bh 184 2002-05-23 Bernhard Herzog <[email protected]>
7290    
7291 bh 186 * Thuban/UI/mainwindow.py (MainWindow.__init__): Fix spelling of
7292     layer_outline_color. Fix it in the definition of the command too.
7293    
7294 bh 184 * Thuban/UI/command.py (Command): Fix typo in doc string
7295    
7296 bh 182 2002-05-22 Bernhard Herzog <[email protected]>
7297    
7298     * Thuban/UI/mainwindow.py (MainWindow.RunMessageBox): Fix a typo
7299     in the docstring
7300    
7301 bh 175 2002-05-15 Bernhard Herzog <[email protected]>
7302    
7303 bh 180 * Thuban/Model/layer.py (Layer.open_shapefile): Set bbox to None
7304     when the shapefile is empty.
7305     (Layer.BoundingBox, Layer.LatLongBoundingBox): Both methods may
7306     now return None for empty shapefiles. Update doc-strings.
7307    
7308     * Thuban/Model/map.py (Map.BoundingBox): Add doc-string. Deal with
7309     the layer's bbox being None.
7310    
7311     * Thuban/UI/tree.py (SessionTreeCtrl.update_tree): Deal with the
7312     layer's bbox being None.
7313    
7314 bh 175 * Thuban/UI/view.py (MapCanvas.shape_selected): Only redraw when
7315     necessary.
7316     (MapCanvas.__init__): New instance variables, last_selected_layer
7317     and last_selected_shape to determine how the selection has
7318     changed.
7319    
7320     * Thuban/UI/tableview.py (TableGrid.__init__): Do not call
7321     AutoSizeColumns because it will cause a traversal of the entire
7322     table which for large .dbf files will take a very long time.
7323    
7324 bh 172 2002-05-14 Bernhard Herzog <[email protected]>
7325    
7326     * Thuban/Model/layer.py (Layer.open_shapefile): Choose a better
7327     maximum depth for the tree than shapelib does by default.
7328    
7329 bh 165 2002-05-10 Bernhard Herzog <[email protected]>
7330    
7331     * setup.py (py_modules): The shptree modules doesn't have a
7332     wrapper, so don't include it in the py_modules
7333    
7334 bh 163 2002-05-08 Bernhard Herzog <[email protected]>
7335    
7336     * extensions/shapelib/shptree.c (compare_ints): Make arguments
7337     const void * as in the qsort prototype
7338     (SHPTreeFindLikelyShapes): Remove some unused variables.
7339    
7340     * Thuban/UI/view.py (PanTool.MouseMove): Use the bitmap the view
7341     maintains to redraw the window during a drag.
7342     (MapCanvas.unprojected_rect_around_point): New method to determine
7343     a small region around a point for hit-testing.
7344     (MapCanvas.find_shape_at): Only test the shapes in a small region
7345     around the point.
7346    
7347     * setup.py: Increment the version to 0.1.2
7348    
7349     * Thuban/UI/tree.py (SessionTreeCtrl.unsubscribe_all): Remove a
7350     debug print and set session to None after unsubscribing
7351    
7352 bh 146 2002-05-07 Bernhard Herzog <[email protected]>
7353    
7354 bh 154 * Data/iceland_sample.session, Data/iceland_sample.thuban: Rename
7355     the file to have a .thuban extension.
7356    
7357 bh 152 * Thuban/UI/tree.py (session_channels): New class constant with
7358     all the session channels to subscribe to to update the tree
7359     (SessionTreeCtrl.session_changed): Remember the session so that we
7360     can unsubscribe properly. Use the new class constant to
7361     unsubscribe from the old session and subscribe to the new one.
7362     (SessionTreeCtrl.unsubscribe_all): New method to unsubscribe all
7363     subscriptions of the SessionTreeCtrl.
7364     (SessionTreeView.OnClose): Call the tree's unsubscribe_all method.
7365    
7366     * Thuban/UI/mainwindow.py (MainWindow.__init__): Add the "Show
7367     Session Tree" command to the file menu.
7368    
7369     * Thuban/UI/view.py (MapCanvas.do_redraw): Pass the entire bitmap
7370     as update_region to the renderer.
7371    
7372     * Thuban/UI/renderer.py
7373     (ScreenRenderer.layer_ids, ScreenRenderer.draw_shape_layer): The
7374     update box is now directly a tuple, not a wxRect anymore.
7375    
7376     * Thuban/Model/layer.py (Layer.ShapesInRegion): Remove some debug
7377     prints.
7378    
7379     2002-05-07 Bernhard Herzog <[email protected]>
7380    
7381 bh 146 * setup.py: Add the shptree extension module. See
7382     extensions/pyshapelib/ChangeLog for more details.
7383    
7384     * extensions/shapelib/shpopen.c, extensions/shapelib/shapefil.h,
7385     extensions/shapelib/dbfopen.c: Really update to the versions of
7386     shapelib 1.2.9. For some reason it wasn't really done on
7387     2002-04-11.
7388    
7389     * extensions/shapelib/shptree.c: Modified version of shptree.c of
7390     shapelib 1.2.9. The only real difference is the use of qsort
7391     instead of a bubble sort implementation
7392    
7393     * Thuban/Model/layer.py (Layer.__init__): New instance variable
7394     shapetree to hold the shapelib quadtree for the shapefile
7395     (Layer.open_shapefile): Create the quad tree.
7396     (Layer.ShapesInRegion): New method to return the ids of shapes in
7397     a given region using the quad tree.
7398    
7399     * extensions/thuban/wxproj.cpp (project_points): Fix some typos in
7400     comment
7401     (draw_polygon_shape): Accept both arcs and polygons.
7402     (initwxproj): Use the new PYSHAPELIB_IMPORT_API macro to import
7403     the api.
7404    
7405     * Thuban/UI/renderer.py (MapRenderer.layer_ids): New method to
7406     return the shape ids to be rendered in a given layer.
7407     (MapRenderer.draw_shape_layer): Call layer_ids to get the list of
7408     ids. Use draw_polygon_shape to draw arc shapes as well.
7409     (ScreenRenderer.RenderMap): New parameter for the rectangle that
7410     has to be updated
7411     (ScreenRenderer.layer_ids): Make use of the layer's quadtree by
7412     calling it's ShapesInRegion method.
7413    
7414     * Thuban/UI/view.py (MapCanvas.__init__): New instance variable
7415     update_region for the update region.
7416     (MapCanvas.OnPaint): Maintain the update region
7417     (MapCanvas.do_redraw): Pass the bounding box of the update_region
7418     to the renderer when drawing the bitmap. Reset the update_region.
7419    
7420 bh 129 2002-05-03 Bernhard Herzog <[email protected]>
7421    
7422 bh 131 * Thuban/UI/mainwindow.py (MainWindow.SaveSessionAs,
7423     MainWindow.OpenSession): Change the file extension of the session
7424     files to .thuban
7425    
7426 bh 129 * Thuban/Model/session.py (Session.AddMap, forwarded_channels):
7427     Move the map channels to be forwarded by the session into the
7428 bh 146 class constant with forwarded_channels. Also add
7429     LAYER_PROJECTION_CHANGED and LAYER_VISIBILITY_CHANGED to
7430     forwarded_channels
7431 bh 129
7432     * Thuban/Model/base.py (Modifiable.changed): Fix doc-string (a
7433     typo and some rewording).
7434    
7435 bh 126 2002-05-02 Bernhard Herzog <[email protected]>
7436    
7437     * Thuban/UI/view.py: Keep the temporary bitmap used during drawing
7438     around to speed up most redraws:
7439     (MapCanvas.__init__): New instance variable bitmap which holds the
7440     bitmap
7441     (MapCanvas.do_redraw): Redraw self.bitmap if necessary. Use
7442     self.bitmap to draw.
7443     (MapCanvas.full_redraw): New method to force a full redraw
7444     including the bitmap
7445     (MapCanvas.SetMap): Subscribe full_redraw instead of redraw to
7446     make sure the bitmap is redrawn.
7447     (MapCanvas.projection_changed, MapCanvas.set_view_transform,
7448     MapCanvas.shape_selected): Call full_redraw instead of readraw to
7449     make sure the bitmap is redrawn.
7450     (MapCanvas.OnSize): New method to handle size events so that the
7451     bitmap can be redrawn.
7452    
7453 bh 124 2002-04-29 Bernhard Herzog <[email protected]>
7454    
7455     * Thuban/UI/mainwindow.py (MainWindow.__init__): Subscribe to the
7456     canvas' VIEW_POSITION event
7457     (MainWindow.view_position_changed): Handler for VIEW_POSITION.
7458     Update the text in the status-bar accordingly.
7459    
7460     * Thuban/UI/view.py (MapCanvas): Derive from Publisher as well
7461     (MapCanvas.__del__): Implement because Publisher.__del__ has to be
7462     called.
7463     (MapCanvas.__init__): Bind EVT_LEAVE_WINDOW too. Initialize
7464     current_position
7465     (MapCanvas.set_current_position): New method to set
7466     current_position. Issue a VIEW_POSITION event
7467     (MapCanvas.CurrentPosition): New public method to return the value
7468     of current_position. Should be called when the VIEW_POSITION event
7469     is processed.
7470     (MapCanvas.OnLeftDown, MapCanvas.OnLeftUp, MapCanvas.OnMotion):
7471     Update the position.
7472     (MapCanvas.OnLeaveWindow): Set the position to None.
7473    
7474     * Thuban/UI/messages.py (VIEW_POSITION): New message for the
7475     position in the statusbar
7476    
7477 tkoester 403 2002-04-26 Frank Koormann <[email protected]>
7478 frank 120
7479     * Thuban/UI/mainwindow.py: AddLayer, Dialog title s/session/data
7480    
7481 tkoester 403 2002-04-24 Frank Koormann <[email protected]>
7482    
7483 frank 118 * Resources/Bitmaps/identify.xpm: shadow added
7484    
7485     * Resources/Bitmaps/fullextent.xpm: new
7486 jan 116
7487 tkoester 403 2002-04-22 Jan-Oliver Wagner <[email protected]>
7488 jan 116
7489 tkoester 403 * Thuban/UI/tree.py (update_tree): added test for None on map bounding
7490     box
7491 jan 114
7492 tkoester 403 2002-04-21 Jan-Oliver Wagner <[email protected]>
7493    
7494 jan 114 * Thuban/UI/proj4dialog.py (UTMProposeZoneDialog): new
7495    
7496     * Thuban/UI/tree.py (update_tree): added added map extent
7497    
7498     * Thuban/UI/mainwindow.py (_method_command): extended by parameter
7499 tkoester 403 icon; added map_full_extend as tool
7500 jan 114
7501 tkoester 403 2002-04-19 Jan-Oliver Wagner <[email protected]>
7502 jan 107
7503     * Thuban/UI/mainwindow.py (SaveSession): launch save as dialog for
7504     saving _new_ sessions
7505    
7506     * Thuban/Model/session.py (create_empty_session): new session
7507     don't have a filename (set to None)
7508    
7509     * Thuban/UI/tree.py (update_tree): added filename and modified flag
7510    
7511     * Thuban/Model/load.py (ProcessSession): convert projection
7512     parameters from unicode to regular string
7513    
7514     * Data/iceland_sample.session: Added UTM Zone 26 projection.
7515    
7516 bh 100 2002-04-11 Bernhard Herzog <[email protected]>
7517    
7518     * extensions/shapelib/shapefil.h, extensions/shapelib/shpopen.c,
7519     extensions/shapelib/dbfopen.c: Update to the versions of shapelib
7520     1.2.9
7521    
7522     * setup.py (Lib.wxproj extension): Don't link shpopen.c and put
7523     the pyshapelib directoy into the list of include dirs, so that
7524     pyshapelib_api.h can be found.
7525    
7526     * extensions/thuban/wxproj.cpp (pyshapelib_api): New variable that
7527     holds the pyshapelib C-API
7528     (draw_polygon_shape, point_in_polygon_shape, shape_centroid): Use
7529     pyshapelib_api to access the shapelib functions.
7530     (initwxproj): Import the c_api from the shapelib module and
7531     initialize pyshapelib_api.
7532    
7533 bh 89 2002-04-04 Bernhard Herzog <[email protected]>
7534    
7535 bh 91 * setup.py (thuban_bdist_rpm.initialize_options): Use
7536     initialize_options to create the scripts for the rpm.
7537    
7538 bh 89 * extensions/pyprojection/setup.py (PROJ4_PREFIX): Just use /
7539    
7540 bh 85 2002-04-03 Bernhard Herzog <[email protected]>
7541    
7542 bh 87 * setup.py: Increment version to 0.1.1
7543    
7544 bh 85 * Thuban/UI/mainwindow.py (MainWindow.__init__): Move the "Add
7545     Layer" and "Remove Layer" commands from the layer menu to the map
7546     menu
7547    
7548 bh 83 2002-02-15 Bernhard Herzog <[email protected]>
7549    
7550     * Thuban/Model/layer.py (Layer.Shape): list append only takes one
7551     argument (python <= 1.5.2 erroneously accepted multiuple
7552     arguments)
7553    
7554 bh 81 2002-02-04 Bernhard Herzog <[email protected]>
7555    
7556     * Thuban/UI/identifyview.py (IdentifyGridCtrl): New class to use a
7557     RecordGrid in the identifyview.
7558     (IdentifyView.__init__): Use IdentifyGridCtrl instead of
7559     IdentifyListCtrl. The grid allows editing of the values.
7560    
7561     * Thuban/UI/controls.py (RecordTable, RecordGridCtrl): New classes
7562     implementing a grid for a single row of a thuban table.
7563    
7564     * Thuban/UI/view.py (MapCanvas.SelectShapeAt): Search through all
7565     layers by default. Easier to use than the previous default of only
7566     searching through the select layer which meant that if no layer
7567     was selected, you couldn't select a shape.
7568    
7569     * Thuban/UI/tableview.py (TableGrid.__init__): Fix typo
7570    
7571     * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Honour the
7572     stroke_width attribute
7573    
7574     * Thuban/Model/save.py (save_session): Write the new stroke_width
7575     attribute
7576    
7577     * Thuban/Model/load.py (ProcessSession.startElement): Read the
7578     stroke_width attribute
7579    
7580     * Thuban/Model/layer.py (Layer.__init__): New parameter and
7581     instance variable stroke_width
7582     (Layer.SetStrokeWidth): Set the stroke_width.
7583    
7584 bh 72 2002-02-01 Bernhard Herzog <[email protected]>
7585    
7586     * extensions/thuban/wxproj.cpp (project_points): Fix two
7587     off-by-one errors in the last loop that joins the various parts
7588     together.
7589    
7590 bh 71 2002-01-14 Bernhard Herzog <[email protected]>
7591    
7592     * setup.py (data_dist.make_distribution): Fix some typos
7593    
7594 bh 70 2001-09-18 Bernhard Herzog <[email protected]>
7595    
7596     * README: Slight tweaking in preparation for the 0.1 release
7597    
7598     * setup.cfg: Add section for sdist to create both tgz and zip
7599     archives
7600    
7601     * setup.py: increase version number to 0.1
7602     (data_dist): New command class for data distribution
7603    
7604 bh 64 2001-09-14 Bernhard Herzog <[email protected]>
7605    
7606 bh 70 * Thuban/UI/identifyview.py (IdentifyListCtrl.selected_shape):
7607     Handle the case of no layer (i.e. layer is None) properly.
7608    
7609 tkoester 403 * Thuban/UI/proj4dialog.py (UTMDialog.__init__, Proj4Dialog.__init__):
7610 bh 70 Set the initial selection of the combo boxes to reflect the
7611     projection we're starting with in a way that works on windows,
7612     too.
7613    
7614 bh 64 * Thuban/Lib/connector.py (Connector.print_connections): Print the
7615     puiblisher's ids in hex to make it easier to compare them to the
7616     standard repr of python methods
7617    
7618     * Thuban/Model/map.py (Map.Destroy): Unsubscribe the label_layer
7619     messages
7620    
7621 bh 59 2001-09-13 Bernhard Herzog <[email protected]>
7622    
7623 bh 64 * Thuban/UI/tree.py (SessionTreeCtrl.OnSelChanged): Make sure to
7624     deselect the layer if no layer is selected
7625    
7626 bh 59 * Thuban/UI/view.py (MapCanvas.OnPaint): Only delay drawing to
7627     idle time when there actually is something to draw. If there's
7628     nothing to draw simply clear the window
7629     (MapCanvas.do_redraw): Call dc.EndDrawing and add some comments.
7630     (MapCanvas.SetMap): force a redraw in all cases because
7631     FitMapToWindow doesn't always do it.
7632     (MapCanvas.ZoomFactor): Add an optional parameter, center, to
7633     specify the point to move into the center of the window
7634     (ZoomOutTool.MouseUp, ZoomInTool.MouseUp): If the mouse wasn't
7635     dragged, zoon in/out by a factor of 2
7636 bh 64 (MapCanvas.find_shape_at): Iterate backwards (i.e. with decreasing
7637     index, i.e. reversed drawing order) so that objects appearing to
7638     be in from of others are selected first. This is probably mostly
7639     relevant for point shapes where the symbols used may overlap
7640 bh 59
7641     * Thuban/Model/session.py (create_empty_session): Unset the
7642     modified bit before returning it
7643    
7644     * Thuban/UI/mainwindow.py (MainWindow.NewSession): Use
7645     create_empty_session session to create the new, empty session.
7646    
7647     * Thuban/UI/mainwindow.py (MainWindow.__init__): Set the size of
7648     the tool bitmaps.
7649     (MainWindow.OnClose, MainWindow.save_modified_session): Separate
7650     the code that asks whether the session should be saved into the
7651     new method save_modified_session.
7652     (MainWindow.OpenSession, MainWindow.NewSession): Use the new
7653     method to save modified session here too.
7654    
7655 bh 55 2001-09-11 Bernhard Herzog <[email protected]>
7656    
7657     * setup.py (InnoIconItem): fix typo
7658    
7659     (thuban_bdist_inno.run):
7660     (bdist_inno.run): Move the decision not to create symlinks on
7661     non-nt platforms to thuban_bdist_inno and do it unconditinally
7662     since we never want to create the symlinks here
7663    
7664 bh 48 2001-09-10 Bernhard Herzog <[email protected]>
7665    
7666 bh 53 * Thuban/UI/mainwindow.py (MainWindow.IdentifyTool): Popup the
7667     identify view immediately
7668    
7669     * Thuban/UI/controls.py: New file with two classes RecordListCtrl
7670     and SelectableRecordListCtrl that implement the code shared by the
7671     identify view and the label dialog
7672    
7673     * Thuban/UI/identifyview.py (IdentifyListCtrl): Derive from the
7674     new class RecordListCtrl
7675    
7676     * Thuban/UI/labeldialog.py (LabelDialog.OnOK): Check whether the
7677     return value of GetValue is None instead of using it as a boolean
7678     directly so that Zero numbers are handled properly.
7679     (LabelListCtrl): Derive from the new class
7680     SelectableRecordListCtrl
7681    
7682 bh 48 * Thuban/UI/proj4dialog.py (Proj4Dialog.__init__):
7683     (Proj4Dialog.dialogLayout): Make the window resizable and set the
7684     size of the text control explicitly to make the sizers work on
7685     both Windows and X.
7686    
7687 bh 44 2001-09-07 Bernhard Herzog <[email protected]>
7688    
7689     * Thuban/UI/view.py (MapCanvas.find_shape_at):Add a new parameter
7690     that can limit the search to the currently selected layer.
7691     (MapCanvas.SelectShapeAt): Make sure that the currently selected
7692     layer stays selected even when no shape is found
7693 bh 46 (MapCanvas.FitRectToWindow): If the rect has zero with or zero
7694     height do nothing (avoids zero division errors)
7695 bh 44
7696 bh 32 2001-09-06 Bernhard Herzog <[email protected]>
7697    
7698 bh 42 * Thuban/UI/tree.py (SessionTreeCtrl, SessionTreeView.__init__):
7699     Correct the spelling of SessionTreeCtrl. dabbrev is too damn
7700     convenient :-)
7701     (SessionTreeCtrl.__init__, SessionTreeCtrl.update_tree): Introduce
7702     a new instvar layer_to_item to map layers to tree items
7703     (SessionTreeCtrl.layer_selected): Select the appropriate tree item
7704     to match the current selection in the interactor
7705    
7706 bh 40 * Thuban/UI/interactor.py (Interactor.SelectedLayer):
7707     (Interactor.HasSelectedLayer): New methods to query the current
7708     selection
7709    
7710     * Thuban/UI/mainwindow.py (MainWindow.current_layer):
7711     (MainWindow.has_selected_layer): Simply call the appropriate
7712     interactor method
7713    
7714     * Thuban/UI/mainwindow.py (MainWindow.__init__):
7715     (MainWindow.LayerShowTable):
7716     (MainWindow.identify_view_on_demand): Store the interactor in an
7717     instvar and use that reference instead of going through main.app
7718    
7719 tkoester 403 * Thuban/UI/mainwindow.py (MainWindow.ShowSessionTree):
7720     * Thuban/UI/application.py (ThubanApplication.OnInit):
7721 bh 40 * Thuban/UI/main.py (main): Create the session tree view in main
7722     with the new mainwindow method ShowSessionTree and not directly
7723     the application's OnInit method
7724    
7725     * Thuban/UI/tree.py (myTreeCtrlPanel):
7726     (SessioinTreeCtrl): Rename to SessioinTreeCtrl and turn it into a
7727     TreeCtrl isntead of a panel. This affects most method since we now
7728     refer to self instead of self.tree
7729     (SessionTreeView): New class implementing a non-modal dialog
7730     showing the session tree.
7731    
7732 bh 35 * Thuban/UI/mainwindow.py (MainWindow.LayerShowTable): Pass the
7733     layer to the tableview dialog.
7734    
7735     * Thuban/UI/tableview.py: Add some doc-strings
7736 tkoester 403 (TableGrid):
7737 bh 35 (TableGrid.OnRangeSelect):
7738     (TableGrid.OnSelectCell):
7739     (TableFrame.__init__):
7740     (TableFrame.row_selected):
7741     Selecting rows in the grid view now updates the selected shapes
7742     through the TableFrame. To achieve this we derive TableGrid from
7743     Publisher and introduce the message type ROW_SELECTED which the
7744     TableFrame subscribes to and which is issued by OnRangeSelect and
7745     OnSelectCell
7746    
7747     (DataTable.SelectRow): Removed because it's no longer needed in
7748     the row/shape selection scheme
7749    
7750 bh 32 * Thuban/UI/dialogs.py: New file implementing common classes for
7751     dialogs
7752    
7753     * Thuban/UI/tableview.py (TableGrid.__init__): Don't subscribe to
7754     the SELECTED_SHAPE message anymore. This is now handled by the
7755     parent.
7756     (TableGrid.select_shape): Only update the selection if the shape
7757     is not None.
7758     (TableFrame): Inherit from the new NonModalDialog class.
7759     (TableFrame.__init__, TableFrame.select_shape): Handle the
7760     SELECT_SHAPE message.
7761     (TableFrame.OnClose): Extend the inherited method to unsubscribe
7762     SELECT_SHAPE
7763    
7764     * Thuban/UI/mainwindow.py (MainWindow.init_dialogs):
7765     (MainWindow.add_dialog):
7766     (MainWindow.dialog_open):
7767     (MainWindow.remove_dialog):
7768     (MainWindow.get_open_dialog): New methods to maintain a dictionary
7769     of opened non-modal dialogs.
7770    
7771     (MainWindow.__init__): Initialize the new non-modal dictionary
7772     management code
7773     (MainWindow.LayerShowTable): maintain separate dialogs for each
7774     table using the non-modal dialog management code to only open a
7775     view once for each table.
7776    
7777     (MainWindow.IdentifyTool):
7778     (MainWindow.__init__):
7779     (MainWindow.identify_view_on_demand): Don't open the identify view
7780     in IdentifyTool anymore. This will be done automatically by the
7781     new method identify_view_on_demand which handles the
7782     SELECTED_SHAPE message so that the identify view will be opened on
7783     demand
7784    
7785     * Thuban/UI/identifyview.py (IdentifyListCtrl.__init__): Remove
7786     the interactor argument. The SELECTED_SHAPE message is now handled
7787     by the parent.
7788     (IdentifyView.__init__): Add the interactor argument so that we
7789     can handle the SELECTED_SHAPE message here
7790     (IdentifyView.selected_shape): New method to handle the
7791     SELECTED_SHAPE messages
7792    
7793     * Thuban/UI/identifyview.py (IdentifyView): Derive from the new
7794     NonModalDialog class
7795     (IdentifyView.OnClose): Extend the inherited version to
7796     unsubscribe SELECT_SHAPE
7797    
7798     * Thuban/Model/session.py (Session.UnsetModified): Remove debug prints
7799    
7800 bh 26 2001-09-05 Bernhard Herzog <[email protected]>
7801    
7802     * Thuban/UI/view.py (MapCanvas.__init__): New argument, interactor.
7803 tkoester 403
7804 bh 26 * Thuban/UI/mainwindow.py (MainWindow.__init__): New argument
7805     interactor to pass through to the MapCanvas
7806 tkoester 403
7807 bh 26 * Thuban/UI/application.py (ThubanApplication.OnInit): Use the new
7808     argument to the MainWindow constructor to get rid of the ugly hack
7809     that made main.app available early just so that the mapcanvas
7810     could access the interactor object.
7811    
7812 bh 19 2001-09-04 Bernhard Herzog <[email protected]>
7813    
7814 bh 22 * Thuban/UI/mainwindow.py (MainWindow.RunMessageBox): New method
7815     that runs a modal message box
7816     (MainWindow.OnClose): Use the new method
7817     (MainWindow.RemoveLayer): Just do nothing in case no layer is
7818     selected. The command should be grayed out anyway, so there's no
7819     need to pop up a message box.
7820     (MainWindow.AddLayer): Pop up a message box with an error message
7821     if the shape file can't be opened
7822    
7823     * Thuban/Model/layer.py (Layer.__init__): Open the shapefile
7824     immediately. This will cause an exception in case the file can't
7825     be opened and we can display an appropriate message.
7826    
7827 bh 19 * MANIFEST.in: Add extensions/pyprojection/LICENSE
7828    
7829     * setup.py (thuban_bdist_rpm): New class implementing a Thuban
7830     specific bdist_rpm command.
7831    
7832     * Thuban/UI/main.py: Catch ImportError exceptions when importing
7833     the locale module because it may not be available on some
7834     installations.
7835    
7836     * extensions/pyprojection/LICENSE: Copy of the license text in
7837     Projection.i. Having it in a separate file makes it easier to
7838     refer to license text in e.g. RPMs
7839    
7840 bh 18 2001-09-03 Bernhard Herzog <[email protected]>
7841    
7842 bh 19 * setup.py: use wx-config instead of wxgtk-config because it's
7843     more generic
7844    
7845     * setup.py (ThubanInstall.get_outputs): Add the symlink in
7846     <prefix>/bin to the outputs
7847     (ThubanInstall.link_file): New method to link files. We need this
7848     because the standard copy_files refuses to link non-existing
7849     files.
7850     (ThubanInstall.run): Remove the leading install root from the
7851     script filename if an install root was specified and use the new
7852     link_file method
7853 tkoester 403
7854 bh 18 * Thuban/UI/mainwindow.py (MainWindow.AddLayer): Fit the map to
7855     the window when the first layer is added to the map.
7856    
7857     * setup.py (ThubanInstall.run): Honor the build root (self.root)
7858     when linking thuban.py to <prefix>/bin
7859    
7860 bh 16 2001-08-31 Bernhard Herzog <[email protected]>
7861    
7862     * setup.py: In the setup call, the install parameters shouldn't
7863     have trailing slashes because distutils on non-posix platforms
7864     doesn't like that. The same applies to other directories like
7865     "Resources/Bitmaps"
7866    
7867     In the configuration section for nt, move the wxWindows directory
7868     optins into the part clearly marked as editable.
7869    
7870     (InstallLocal.initialize_options):
7871     (InstallLocal.user_options): remove the currently unused debug
7872     flag
7873     (thuban_build_py.find_all_modules): Add this method so that it
7874     works for our case of having packages and modules in one
7875     distribution as well.
7876     (ThubanInstall.initialize_options):
7877     (ThubanInstall.finalize_options):
7878     (ThubanInstall.user_options):
7879     (ThubanInstall.boolean_options): Add new options, do-symlink and
7880     extra files. Since these are the first ThubanInstall specific
7881     options, override user_options and boolean_options
7882     (ThubanInstall.run): Honor the new do-symlink and extra-files
7883     options.
7884     (ThubanInstall.get_outputs): Add to override the base-class's
7885     version and add the extra-files to the outputs
7886     (bdist_inno): New class for windows distributions with Inno Setup
7887     (InnoIconItem): Helper class for bdist_inno
7888     (thuban_bdist_inno): Thuban specific version of bdist_inno. Added
7889     this together with the appropriate parameters, to the setup call.
7890 tkoester 403
7891 bh 16 * setup.cfg (bdist_inno): added new section for the inno setup
7892     installer
7893    
7894     * Thuban/UI/tree.py (myTreeCtrlPanel.__init__): New inst var
7895     changing_selection to avoid recursive selection events when
7896     modifying the selection in response to a selection event.
7897     (myTreeCtrlPanel.normalize_selection): Set the new inst var when
7898     changing the tree's selection.
7899     (myTreeCtrlPanel.OnSelChanged): Only normalize the selection when
7900     we're not being called indirectly from normalize_selection.
7901    
7902     * Thuban/UI/mainwindow.py (MainWindow.update_command_ui): Call
7903     event.Check only if the command is actuall checkable.
7904     (MainWindow.__init__): Call the toolbar's Realize method to make
7905     sure that the items are actually shown
7906    
7907 bh 7 2001-08-28 Bernhard Herzog <[email protected]>
7908    
7909 bh 9 * setup.py: Fix some doc strings
7910    
7911 bh 7 * ChangeLog: started
7912    

Properties

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

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26