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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1840 - (hide annotations)
Tue Oct 21 09:59:00 2003 UTC (21 years, 4 months ago) by bh
Original Path: trunk/thuban/ChangeLog
File size: 303266 byte(s)
update ChangeLog

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

Properties

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

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26