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

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

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

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

Legend:
Removed from v.762  
changed lines
  Added in v.2435

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26