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

Legend:
Removed from v.311  
changed lines
  Added in v.2425

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26