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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 2414 - (hide annotations)
Mon Nov 22 11:17:47 2004 UTC (20 years, 3 months ago) by bernhard
Original Path: trunk/thuban/ChangeLog
File size: 410300 byte(s)
Fixing #2698 (transparent polygons are not exported to svg file)

	* Extensions/svgexport/svgmapwriter.py:
	Added verbose variable and some logging depending on it.
	(class VirtualDC(XMLWriter)): Minor improvement in the polygon loop,
	because counting i is not necessary.
	(class Pen, class Brush): Added simple __str__ methods.
	(SVGRenderer.draw_polygone_shape): Fix #2698 (transparent polygons are
	not exported to svg file) Note: holes still unhandled.

	* Extensions/svgexport/test/test_svgmapwriter.py:
	        Made a baseclass TestWithDC for test needed a DC.
		Added tests for bug #2698 (transparent polygons are not
		exported to svg file):
		Testobjectexport.test_transparent_polygon()

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

Properties

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

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26