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

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

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26