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

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

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26