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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 2388 - (hide annotations)
Mon Nov 15 16:27:41 2004 UTC (20 years, 3 months ago) by bernhard
Original Path: trunk/thuban/ChangeLog
File size: 406118 byte(s)
* Extensions/svgexport/: Minor improvements to doc strings.

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

Properties

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

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26