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

Legend:
Removed from v.766  
changed lines
  Added in v.2388

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26