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

Legend:
Removed from v.803  
changed lines
  Added in v.2436

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26