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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 2368 - (hide annotations)
Fri Oct 1 18:29:54 2004 UTC (20 years, 5 months ago) by joey
Original Path: trunk/thuban/ChangeLog
File size: 402535 byte(s)
Updated the changelog file to reflect the recent work

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

Properties

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

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26