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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 2437 - (hide annotations)
Wed Dec 8 17:37:30 2004 UTC (20 years, 2 months ago) by silke
Original Path: trunk/thuban/ChangeLog
File size: 413267 byte(s)
Substituted ogr-method CloseRings because it is not available in all versions of ogr

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

Properties

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

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26