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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 2459 - (hide annotations)
Wed Dec 15 11:12:11 2004 UTC (20 years, 2 months ago) by bh
Original Path: trunk/thuban/ChangeLog
File size: 418620 byte(s)
(PostgreSQLServer.is_running): Fix typo
in the doc string and rephrase it a little.

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

Properties

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

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26