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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 2435 - (hide annotations)
Tue Dec 7 16:44:51 2004 UTC (20 years, 3 months ago) by nhueffme
Original Path: trunk/thuban/ChangeLog
File size: 412939 byte(s)
Adding a new extension to read shapefiles with ogr. It is planned to add other
vector formats.

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

Properties

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

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26