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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 2344 - (hide annotations)
Tue Sep 21 21:30:36 2004 UTC (20 years, 5 months ago) by bernhard
Original Path: trunk/thuban/ChangeLog
File size: 398866 byte(s)
Improved the svgexport to only use unique ids. Will issues
an error message dialoge when two layer names are the same.
ShapeIDs are now added with a dash within the svg ids.

* Extensions/svgexport/svgmapwriter.py (SVGMapWriterError): New.
* Extensions/svgexport/test/test_svgmapwriter.py: Added imports
(TestSVGRenderer): New test class with test_make_in() and
test_check_for_layer_name_clash()
* Extensions/svgexport/svgmapwriter.py (SVGRenderer): Fixed __init__()
and draw_shape_layer_incrementally() to not use a baseid twice,
satisfying test_check_for_layer_name_clash()
(VirtualDC.make_id): Use a dash between baseit and id, satisfies
test_make_in().
* Extensions/svexport/svgsaver.py: Import SVGMapWriterError, wxOK
and wxICON_HAND.
(write_to_svg): Put dc and rendering in a try statement and on
catching SVGmapWriterError notify the user and delete the target file.
-------------------------------------------------------------------

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

Properties

Name Value
svn:eol-style native
svn:keywords Author Date Id Revision

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26