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

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

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

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

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

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26