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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1849 - (hide annotations)
Tue Oct 21 11:07:09 2003 UTC (21 years, 4 months ago) by bh
Original Path: trunk/thuban/ChangeLog
File size: 305679 byte(s)
update ChangeLog

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

Properties

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

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26