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

Legend:
Removed from v.55  
changed lines
  Added in v.2407

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26