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

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

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

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

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

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26