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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 2444 - (hide annotations)
Sat Dec 11 02:25:36 2004 UTC (20 years, 2 months ago) by bernhard
Original Path: trunk/thuban/ChangeLog
File size: 414854 byte(s)
	Made sure that newlines are inserted in the svg path d attributes
	to raise the chance that the line length will be below 255 characters,
	as recommended by REC SVG 1.1 in section 8.3.1.

	* Extensions/svgexport/svgmapwriter.py(DrawPolygon):
	Adding \n before L's and changed whitespace handling.

	* Extensions/svgexport/test/test_svgmapwriter.py:
	Adapted tests to new whitespace handling of DrawPolygon.

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

Properties

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

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26