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

Legend:
Removed from v.1097  
changed lines
  Added in v.2444

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26