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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1619 - (hide annotations)
Tue Aug 19 22:19:07 2003 UTC (21 years, 6 months ago) by jan
Original Path: trunk/thuban/ChangeLog
File size: 260718 byte(s)
Moved anything from extensions to libraries.

1 jan 1619 2003-08-19 Jan-Oliver Wagner <[email protected]>
2    
3     Moved anything from extensions to libraries.
4    
5     * libraries: New.
6    
7     * libraries/ pyprojection, pyshapelib, shapelib, thuban: New.
8    
9     * libraries/pyprojection/ LICENSE, MANIFEST.in, Projection.i,
10     Projection.py, Projection_wrap.c, setup.py, swighelp.txt: These files have
11     been moved here from thuban/extensions/pyprojection/
12     See there in the Attic for the older history.
13    
14     * libraries/pyshapelib/ COPYING, ChangeLog, NEWS, README, dbflib.i,
15     dbflib.py, dbflib_wrap.c, pyshapelib_api.h, pytest.py, setup.py,
16     shapelib.i, shapelib.py, shapelib_wrap.c, shptreemodule.c: These files
17     have been moved here from thuban/extensions/pyshapelib/
18     See there in the Attic for the older history.
19    
20     * libraries/shapelib/ dbfopen.c, shapefil.h, shpopen.c, shptree.c: These
21     files have been moved here from thuban/extensions/shapelib/
22     See there in the Attic for the older history.
23    
24     * libraries/thuban/ bmpdataset.cpp, cpl_mfile.cpp, cpl_mfile.h,
25     gdalwarp.cpp, wxproj.cpp: These files have been moved here from
26     thuban/extensions/thuban/
27     See there in the Attic for the older history.
28    
29     * MANIFEST.in, setup.cfg, setup.py: renamed extensions to libraries.
30    
31     * extensions/thuban/ bmpdataset.cpp, cpl_mfile.cpp, cpl_mfile.h,
32     gdalwarp.cpp, wxproj.cpp: Moved to libraries/thuban.
33    
34     * extensions/shapelib/ dbfopen.c, shapefil.h, shpopen.c, shptree.c:
35     Moved to libraries/shapelib.
36    
37     * extensions/pyshapelib/ COPYING, NEWS, dbflib.py, pytest.py,
38     shapelib.py, README, dbflib_wrap.c, setup.py, shapelib_wrap.c,
39     ChangeLog, dbflib.i, pyshapelib_api.h, shapelib.i, shptreemodule.c:
40     Moved to libraries/pyshapelib.
41    
42     * extensions/pyprojection/ MANIFEST.in, Projection.py, setup.py,
43     LICENSE, Projection.i, Projection_wrap.c, swighelp.txt:
44     Moved to libraries/pyprojection.
45    
46     * extensions/ pyprojection, pyshapelib, shapelib, thuban: Removed.
47    
48     * extensions: Removed.
49    
50 bh 1606 2003-08-19 Bernhard Herzog <[email protected]>
51    
52 bh 1609 * test/test_viewport.py (ViewPortTest): We don't use the
53     facilities of FileTestMixin so don't derive from it.
54     (TestViewportWithPostGIS): New class with tests for using a
55     viewport on a map with postgis layers.
56    
57     2003-08-19 Bernhard Herzog <[email protected]>
58    
59     Add the db connection management to the session.
60    
61     * Thuban/Model/session.py (Session.__init__): New instance
62     variable db_connections
63     (Session.AddDBConnection, Session.DBConnections)
64     (Session.HasDBConnections, Session.CanRemoveDBConnection)
65     (Session.RemoveDBConnection): New methods to manage and query the
66     db connections managed by the session
67     (Session.OpenDBShapeStore): New method to open a shapestore from a
68     db connection
69    
70     * Thuban/Model/messages.py (DBCONN_REMOVED, DBCONN_ADDED): New
71     messages for the db connection handling in the session
72    
73     * test/test_postgis_session.py: New. test cases for the session's
74     db connection handling with postgis connections
75    
76     2003-08-19 Bernhard Herzog <[email protected]>
77    
78 bh 1606 Add very basic postgis database support and the corresponding test
79     cases. The test cases require a PostgreSQL + postgis installation
80     but no existing database. The database will be created
81     automatically by the test cases
82    
83     * test/README: Add note about skipped tests and the requirements
84     of the postgis tests.
85    
86     * Thuban/Model/postgisdb.py: New. Basic postgis database support.
87    
88     * test/test_postgis_db.py: New. Test cases for the postgis
89     support.
90    
91     * Thuban/Model/wellknowntext.py: New. Parser for well-known-text
92     format
93    
94     * test/test_wellknowntext.py: New. Test cases for the
95     wellknowntext parser
96    
97     * test/postgissupport.py: New. Support module for tests involving
98     a postgis database.
99    
100     * test/support.py (execute_as_testsuite): Shut down the postmaster
101     if it's still running after the tests
102    
103     * Thuban/Model/data.py (RAW_WKT): New constant for raw data in
104     well known text format
105    
106 jan 1604 2003-08-19 Jan-Oliver Wagner <[email protected]>
107    
108     * Examples/simple_extensions/hello_world.py: New. Raises a Hello World
109     message dialog.
110    
111 bh 1600 2003-08-18 Bernhard Herzog <[email protected]>
112    
113 bh 1602 * test/support.py (ThubanTestResult.printErrors): Indent the
114     reason for the skips in the output to make it a bit more readable.
115     (execute_as_testsuite): New helper function to run a test suite
116     and print some more information.
117     (run_tests): Use execute_as_testsuite to run the tests
118    
119     * test/runtests.py (main): Use execute_as_testsuite to run the
120     tests
121    
122     2003-08-18 Bernhard Herzog <[email protected]>
123    
124 bh 1600 Fix some bugs in Thuban and the test suite that were uncovered by
125     changes introduced in Python 2.3:
126    
127     * Thuban/Model/table.py (DBFTable.__init__): Make sure the
128     filename is an absolute name
129    
130     * Thuban/Model/layer.py (RasterLayer.__init__): Make sure the
131     filename is an absolute name
132    
133     * test/test_save.py (SaveSessionTest.testRasterLayer): Use a
134     unique filename to save to and use the correct relative filename
135     in the expected output.
136     (SaveSessionTest.test_dbf_table): Use the correct relative
137     filename in the expected output.
138    
139     * test/test_layer.py (TestLayer.test_raster_layer): Update the
140     test to check whether the filename is absolute.
141    
142 jan 1596 2003-08-18 Jan-Oliver Wagner <[email protected]>
143    
144     * Thuban/UI/about.py (About.__init__): Added Silke Reimer.
145    
146 bh 1586 2003-08-15 Bernhard Herzog <[email protected]>
147    
148 bh 1594 Change the way shapes are returned by a shape store. The
149     ShapesInRegion method returns an iterator over actual shape
150     objects instead of a list of shape ids.
151    
152     * Thuban/Model/data.py (ShapefileShape.ShapeID): New. Return shape
153     id.
154     (ShapefileStore.ShapesInRegion): Return an iterator over the
155     shapes which yields shape objects instead of returning a list of
156     shape ids
157     (ShapefileStore.AllShapes): New. Return an iterator over all
158     shapes in the shape store
159     (DerivedShapeStore.AllShapes): New. Like in ShapefileStore
160    
161     * Thuban/Model/layer.py (Layer.ShapesInRegion): Update
162     doc-string.
163    
164     * Thuban/UI/baserenderer.py
165     (BaseRenderer.layer_ids, BaseRenderer.layer_shapes): Rename to
166     layer_shapes and make it return an iterator containg shapes
167     instead of a list of ids.
168     (BaseRenderer.draw_shape_layer): Update doc-string; Adapt to
169     layer_shapes() change
170    
171     * Thuban/UI/renderer.py (ScreenRenderer.layer_ids)
172     (ScreenRenderer.layer_shapes): Rename as in BaseRenderer
173    
174     * Thuban/UI/viewport.py (ViewPort._find_shape_in_layer): Adapt to
175     changes in the ShapesInRegion return value.
176     (ViewPort._get_hit_tester): Remove commented out code
177    
178     * test/mockgeo.py (SimpleShapeStore.ShapesInRegion): Adapt to the
179     new return value.
180     (SimpleShapeStore.AllShapes): New. Implement this method too.
181    
182     * test/test_layer.py (TestLayer.test_arc_layer)
183     (TestLayer.test_polygon_layer, TestLayer.test_point_layer)
184     (TestLayer.test_point_layer_with_projection)
185     (TestLayer.test_derived_store): Adapt to changes in the
186     ShapesInRegion return value.
187    
188     * test/test_shapefilestore.py
189     (TestShapefileStoreArc.test_shapes_in_region)
190     (TestShapefileStorePolygon.test_shapes_in_region)
191     (TestShapefileStorePoint.test_shapes_in_region): Adapt to changes
192     in the ShapesInRegion return value.
193     (TestShapefileStorePoint.test_all_shapes)
194     (TestShapefileStoreArc.test_shape_shapeid): New tests for the new
195     methods
196    
197     * test/test_derivedshapestore.py
198     (TestDerivedShapeStore.test_shapes_in_region): Adapt to changes in
199     the ShapesInRegion return value.
200     (TestDerivedShapeStore.test_all_shapes)
201     (TestDerivedShapeStore.test_shape_shapeid): New tests for the new
202     methods
203    
204     2003-08-15 Bernhard Herzog <[email protected]>
205    
206 bh 1592 Make the renderers deal correctly with raw vs. python level
207     representation of shape geometries
208    
209     * Thuban/UI/baserenderer.py (BaseRenderer.low_level_renderer):
210     Return a flag useraw in addition to the callable and the parameter
211     to indicate whether the callable can deal with the raw shape data
212     or uses the higher level python lists of coordinates. The callable
213     now should accept either the raw data or the return value of the
214     shape's Points() method.
215     (BaseRenderer.draw_shape_layer): Adapt to the low_level_renderer
216     change
217     (BaseRenderer.projected_points): Instead of the shape id use the
218     points list as parameter.
219     (BaseRenderer.draw_polygon_shape, BaseRenderer.draw_arc_shape)
220     (BaseRenderer.draw_point_shape): Adapt to projected_points()
221     change and accept the points list as parameter instead of the
222     shape id.
223    
224     * Thuban/UI/renderer.py (MapRenderer.low_level_renderer): Return
225     the useraw flag as required by the BaseRenderer
226     (ScreenRenderer.draw_shape_layer): Adapt to low-level renderer
227     changes.
228    
229     * test/test_baserenderer.py
230     (TestBaseRenderer.test_point_with_classification): New test for
231     rendering a map with classifications.
232    
233     2003-08-15 Bernhard Herzog <[email protected]>
234    
235 bh 1590 * Thuban/UI/viewport.py (ViewPort.find_shape_at)
236     (ViewPort._find_shape_in_layer, ViewPort._find_shape_in_layer)
237     (ViewPort._get_hit_tester, ViewPort.projected_points)
238     (ViewPort._hit_point, ViewPort._hit_arc, ViewPort._hit_polygon)
239     (ViewPort._find_label_at): Split the find_shape_at method into
240     several new methods and use the functions in the hit-test module.
241    
242     * Thuban/UI/hittest.py: New module with Python-level hit-testing
243     functions
244    
245     * test/test_hittest.py: New. Test for the new hittest module
246    
247     2003-08-15 Bernhard Herzog <[email protected]>
248    
249 bh 1588 * Thuban/Model/layer.py (Layer.ShapesInRegion): Apply the layer
250     projection to all corners of the bounding box to get a better
251     approximation of the projected bounding box
252    
253     * test/test_layer.py (TestLayer.test_point_layer_with_projection):
254     New. Test coordinate handling of a layer with a projection.
255     Catches the bug fixed in Layer.ShapesInRegion
256    
257     2003-08-15 Bernhard Herzog <[email protected]>
258    
259 bh 1586 Move some of the mock objects in test_baserenderer into their own
260     module so they can easily be used from other tests
261    
262     * test/mockgeo.py: New test helper module with some mock objects
263     for geometry related things like shapes, shapestores and
264     projections.
265    
266     * test/test_mockgeo.py: New. Tests for the new helper module
267    
268     * test/test_baserenderer.py: Some of the mock-objects are in
269     mockgeo now.
270    
271 jan 1584 2003-08-12 Jan-Oliver Wagner <[email protected]>
272    
273     * Thuban/UI/about.py (About.__init__): Added Björn Broscheit.
274    
275 bh 1580 2003-08-12 Bernhard Herzog <[email protected]>
276    
277 bh 1582 * po/de.po: New. German translations by Bjoern Broscheit
278    
279     2003-08-12 Bernhard Herzog <[email protected]>
280    
281 bh 1580 * Thuban/UI/projdialog.py (UnknownProjPanel._DoLayout): Translated
282     strings have to be one string literal.
283    
284 bh 1573 2003-08-11 Bernhard Herzog <[email protected]>
285    
286 bh 1578 * test/support.py (FloatComparisonMixin.assertPointListEquals):
287     New. This method was used in various derived classes, but it's
288     better to have it here.
289    
290     * test/test_shapefilestore.py
291     (ShapefileStoreTests.assertPointListEquals): Removed. It's now in
292     FloatComparisonMixin
293    
294     * test/test_layer.py (TestLayer.assertPointListEquals): Removed.
295     It's now in FloatComparisonMixin
296    
297     * test/test_derivedshapestore.py
298     (TestDerivedShapeStore.assertPointListEquals): Removed. It's now
299     in FloatComparisonMixin
300    
301     2003-08-11 Bernhard Herzog <[email protected]>
302    
303 bh 1573 * Thuban/UI/join.py (JoinDialog.OnJoin): Add missing space to
304     error message
305    
306 jan 1569 2003-08-08 Jan-Oliver Wagner <[email protected]>
307    
308 jan 1571 * Doc/manual/thuban-manual.xml: Now use authorgroup. Added revhistory
309     with version number.
310     Changed title to reflect version number of Thuban.
311    
312     2003-08-08 Jan-Oliver Wagner <[email protected]>
313    
314 jan 1569 * Thuban/UI/about.py (About.__init__): Reworked the hall of fame. Now
315     the list corresponds to the "About" web page.
316    
317 bh 1567 2003-08-08 Bernhard Herzog <[email protected]>
318    
319     * Thuban/UI/projdialog.py (UTMProposeZoneDialog.dialogLayout):
320     Make sure translated strings are recognized as one string literal.
321    
322     * Thuban/UI/proj4dialog.py (UTMProposeZoneDialog.dialogLayout):
323     Make sure translated strings are recognized as one string literal.
324    
325     * Thuban/UI/classgen.py (ClassGenDialog.OnOK): Make sure
326     translated strings are recognized as one string literal.
327    
328     * Thuban/UI/application.py (ThubanApplication.OpenSession): Make
329     sure translated strings are recognized as one string literal.
330    
331 bh 1556 2003-08-07 Bernhard Herzog <[email protected]>
332    
333 bh 1565 * Thuban/Model/data.py (DerivedShapeStore.RawShapeFormat): New.
334     Simply delegates to the original shapestore.
335    
336     * test/test_derivedshapestore.py
337     (TestDerivedShapeStore.test_raw_format): New. Test case for
338     DerivedShapeStore.RawShapeFormat
339    
340     2003-08-07 Bernhard Herzog <[email protected]>
341    
342 bh 1561 Add raw data interface to shape objects.
343    
344     * Thuban/Model/data.py (ShapefileShape, Shape): Rname the shape
345     class to ShapefileShape which now holds shapefile specific
346     information.
347     (ShapefileShape.compute_bbox): Simplified to not cache any
348     information. The way this method is used that shouldn't matter
349     performance wise.
350     (ShapefileShape.RawData): New. Return the shapeid which is the raw
351     data format for shapes from shapefiles.
352     (ShapefileStore.RawShapeFormat): New. Return the raw datatype used
353     in the shape objects returned by a shapestore. For a
354     ShapefileStore this is always RAW_SHAPEFILE.
355     (RAW_PYTHON, RAW_SHAPEFILE): Constants for the RawShapeFormat
356     method.
357    
358     * test/test_shapefilestore.py
359     (TestShapefileStore.test_raw_format): New test to test the raw
360     format feature of shapes.
361    
362 bh 1560 * Thuban/Model/layer.py: Remove the unused import of Shape from
363     data. It was only there for interface compatibility but it's not
364 bh 1561 used inside of Thuban and the generic Shape class has gone away.
365 bh 1560
366 bh 1563 * Thuban/UI/renderer.py (MapRenderer.low_level_renderer): Check
367     the raw data format and only use an optimized version of its a
368     shapefile.
369    
370 bh 1561 2003-08-07 Bernhard Herzog <[email protected]>
371    
372 bh 1559 * test/test_baserenderer.py (SimpleShape): Shape class for the
373     tests.
374     (SimpleShapeStore.Shape): Use SimpleShape instead of
375     Thuban.Model.data.Shape to make the tests independed of the coming
376     changes.
377    
378     2003-08-07 Bernhard Herzog <[email protected]>
379    
380 bh 1556 * test/support.py (SkipTest, ThubanTestResult, ThubanTestRunner)
381     (ThubanTestProgram): New classes that extend the respective
382     classes from unittest. These new version support skipping tests
383     under certain expected conditions. In the Thuban test suite we
384     uses this for tests that require the optional gdal support.
385     (run_tests): Use ThubanTestProgram instead of the unittest.main()
386    
387     * test/runtests.py (main): Use the new ThubanTestRunner instead of
388     the normal one from unittest
389    
390     * test/test_layer.py (TestLayer.test_raster_layer): If this test
391     is not run because gdal support isn't available report this to the
392     runner.
393    
394     * test/test_baserenderer.py
395     (TestBaseRenderer.test_raster_no_projection): Do not run this test
396     if gdal support isn't available and report this to the runner.
397    
398 bh 1553 2003-08-06 Bernhard Herzog <[email protected]>
399    
400     Rearrange the renderers a bit, partly in preparation for changes
401     required for the postgis merge, partly to make it more testable.
402     Also make the representation of coordinates in Shapes more
403     consistent.
404    
405     * Thuban/UI/renderer.py (MapRenderer): Most of the code/methods in
406     this class is now in BaseRenderer. This class is now practically
407     only a specialization of BaseRenderer for rendering to an actual
408     wx DC.
409     (ScreenRenderer.draw_shape_layer): Use self.low_level_renderer()
410     to get the shapetype specific rendering functions.
411    
412     * Thuban/UI/baserenderer.py: New file with the basic rendering
413     logic. The code in this file is completely independend of wx.
414     (BaseRenderer): Class with the basic rendering logic
415    
416     * test/test_baserenderer.py: New. Test cases for BaseRenderer
417    
418     * Thuban/UI/view.py (MapCanvas.__init__): New instance variable
419     error_on_redraw to guard agains endless loops and stack overflows
420     when there's a bug in the rendering code that raises exceptions.
421     (MapCanvas.OnIdle, MapCanvas._do_redraw): Split the actual
422     rendering into a separate method _do_redraw so that error handling
423     is a bit easier. When an exception occurs, set error_on_redraw to
424     true. When it's true on entry to OnIdle do nothing and return
425     immediately.
426    
427     * Thuban/Model/data.py (ShapefileStore.Shape): For consistency, a
428     Shape object will always have the coordinates as a list of list of
429     coordinate pairs (tuples).
430     (Shape.compute_bbox): Adapt to new representation.
431    
432     * Thuban/UI/viewport.py (ViewPort.find_shape_at)
433     (ViewPort.LabelShapeAt): Adapt to new coordinate representation in
434     Shape objects.
435    
436     * test/test_shapefilestore.py
437     (ShapefileStoreTests.assertFloatTuplesEqual)
438     (ShapefileStoreTests.assertPointListEquals): Rename to
439     assertPointListEquals and change purpose to checking equality of
440     the lists returned by Shape.Points().
441     (TestShapefileStoreArc.test_shape)
442     (TestShapefileStorePolygon.test_shape)
443     (TestShapefileStorePoint.test_shape): Use the new
444     assertPointListEquals instead of assertFloatTuplesEqual
445    
446     * test/test_layer.py (TestLayer.assertFloatTuplesEqual)
447     (TestLayer.assertPointListEquals): Rename to assertPointListEquals
448     and change purpose to checking equality of the lists returned by
449     Shape.Points().
450     (TestLayer.test_arc_layer, TestLayer.test_arc_layer)
451     (TestLayer.test_polygon_layer, TestLayer.test_point_layer)
452     (TestLayer.test_derived_store): Use the new assertPointListEquals
453     instead of assertFloatTuplesEqual
454    
455     * test/test_derivedshapestore.py
456     (TestDerivedShapeStore.assertFloatTuplesEqual)
457     (TestDerivedShapeStore.assertPointListEquals): Rename to
458     assertPointListEquals and change purpose to checking equality of
459     the lists returned by Shape.Points().
460     (TestDerivedShapeStore.test_shape): Use the new
461     assertPointListEquals instead of assertFloatTuplesEqual
462    
463 jan 1550 2003-08-06 Jan-Oliver Wagner <[email protected]>
464    
465     * Thuban/UI/projdialog.py (UTMPanel._OnPropose): Added test for
466     a bounding box. A dialog is raised in case, no bounding box
467     is found. This fixes bug #2043:
468     https://intevation.de/rt/webrt?serial_num=2043
469    
470 bh 1548 2003-08-05 Bernhard Herzog <[email protected]>
471    
472     * Thuban/Model/color.py (Color.__repr__): Make the repr of a color
473     object look like a Color instantiation. Formerly it looked like a
474     tuple.
475    
476     * test/test_color.py (TestColor.test_repr)
477     (TestColor.test_equality, TestColor.test_inequality): New. test
478     some more apects of the Color class
479     (TestTransparent.test_repr, TestTransparent.test_hex)
480     (TestTransparent.test_equality): New. Test cases for the
481     Transparent object.
482    
483 jan 1545 2003-08-04 Jan-Oliver Wagner <[email protected]>
484    
485     * Doc/manual/thuban-manual.xml: a number of small improvements.
486     The resulting file is the version submitted for GREAT-ER II.
487    
488 bh 1540 2003-08-01 Bernhard Herzog <[email protected]>
489    
490 bh 1543 * Thuban/UI/resource.py, Thuban/UI/projdialog.py,
491     Thuban/UI/join.py, Thuban/UI/classgen.py, Thuban/UI/about.py,
492     Thuban/Model/resource.py: Insert cvs keywords and doc-strings.
493    
494     * Thuban/UI/common.py: Insert cvs keywords and doc-strings.
495     (Color2wxColour, wxColour2Color, ThubanBeginBusyCursor)
496     (ThubanEndBusyCursor): Add doc-strings
497    
498     2003-08-01 Bernhard Herzog <[email protected]>
499    
500 bh 1540 First step towards PostGIS integration. More abstraction by movin
501     more code from the layer to the shapestore. More methods of the
502     layer are now simply delegated to the equivalent method of the
503     shapestore. The SHAPETYPE_* constants are now in data not in
504     layer.
505    
506     * Thuban/Model/data.py (SHAPETYPE_POLYGON, SHAPETYPE_ARC)
507     (SHAPETYPE_POINT, Shape): Move these constants and classes from
508     layer.py to data.py
509     (ShapefileStore.__init__): More Initialization for the new methods
510     and functionality.
511     (ShapefileStore.ShapeType, ShapefileStore.NumShapes)
512     (ShapefileStore.BoundingBox, ShapefileStore.ShapesInRegion)
513     (ShapefileStore.Shape): New methods that were formerly implemented
514     in the layer.
515     (DerivedShapeStore.Shape, DerivedShapeStore.ShapesInRegion)
516     (DerivedShapeStore.ShapeType, DerivedShapeStore.NumShapes)
517     (DerivedShapeStore.BoundingBox): New. DerivedShapeStore
518     equivalents of the new shape methods. These versions are simply
519     delegated to the original shapstore.
520    
521     * Thuban/Model/layer.py (SHAPETYPE_POLYGON, SHAPETYPE_ARC)
522     (SHAPETYPE_POINT, Shape): Removed. They're now in data.py
523     (Layer.SetShapeStore): Removed the initializatin of instance
524     variables that were needed for the stuff that's now in
525     ShapefileStore
526     (Layer.BoundingBox, Layer.NumShapes, Layer.ShapeType)
527     (Layer.Shape, Layer.ShapesInRegion): Simply delegate to the
528     shapestore.
529    
530     * Thuban/UI/classifier.py, Thuban/UI/renderer.py,
531     Thuban/UI/viewport.py: Import the SHAPETYPE_* constants from data
532     instead of layer.
533    
534     * test/test_shapefilestore.py: New. Tests for ShapefileStore.
535    
536     * test/test_derivedshapestore.py: New. Tests for DerivedShapeStore.
537    
538     * test/test_layer.py: Import the SHAPETYPE_* constants from data
539     instead of layer.
540     (TestLayer.test_derived_store): Remove the test for the exception
541     when instantiating the DerivedShapeStore with an incompatible
542     table which is now in test_derivedshapestore.py. Add some more
543     tests of the layer methods to determine whether they work for a
544     DerivedShapeStore as well.
545    
546 jonathan 1534 2003-07-31 Jonathan Coles <[email protected]>
547    
548     * Doc/manual/thuban-manual.xml: Fix the list of required packages
549     by just listing the name and where they can be found.
550    
551 frank 1532 2003-07-31 Frank Koormann <[email protected]>
552    
553     * Doc/manual/thuban-manual.xml:
554     Changed the screenshot elements to figure.
555     Changed some variablelist elements to itemizedlist.
556     Added section on GDAL formats.
557    
558 jonathan 1531 2003-07-31 Jonathan Coles <[email protected]>
559    
560     * Doc/manual/thuban-manual.xml: Added a few sentences about
561     the Fix Border Color option when generating classes.
562    
563 jonathan 1529 2003-07-30 Jonathan Coles <[email protected]>
564    
565     * Thuban/Model/classgen.py: Add docstrings. Rename specific
566     Ramp instances to use lower_case_style.
567    
568     * Thuban/UI/classgen.py: Use renamed Ramp instances.
569    
570     * Thuban/UI/classifier.py: Add docstrings.
571    
572     * Thuban/UI/dock.py: Add docstrings.
573    
574     * test/test_classgen.py: Use renamed Ramp instances.
575    
576 bh 1522 2003-07-30 Bernhard Herzog <[email protected]>
577    
578 bh 1524 * Thuban/Lib/connector.py (QueueingPublisher): Removed. This class
579     was never used in Thuban.
580    
581     2003-07-30 Bernhard Herzog <[email protected]>
582    
583 bh 1522 * Thuban/UI/join.py (JoinDialog.__init__): Use the table's Title()
584     method directly instead of going through the transient_table
585     method. This faster because transient_table may force the copy of
586     a DBF file into the transient database and setting a table's title
587     doesnm't affect the title of the associated transient table, so
588     this fixes RT #2042
589    
590     * Thuban/UI/main.py (__version__): Don't import the already
591     removed show_exception_dialog.
592    
593 jonathan 1517 2003-07-29 Jonathan Coles <[email protected]>
594    
595 jonathan 1519 * Thuban/UI/application.py (ThubanApplication.ShowExceptionDialog):
596     Put back this method and remove the equivalent function since we
597     are setting the exception hook from within this class (OnInit).
598    
599     2003-07-29 Jonathan Coles <[email protected]>
600    
601 jonathan 1517 * Doc/manual/images/5_2_custom_ramp.png,
602     Doc/manual/images/5_2_quantiles.png,
603     Doc/manual/images/5_2_uniform_dist.png,
604     Doc/manual/images/5_2_unique_values.png,
605     Doc/manual/images/8_int_error.png: New screen shots.
606    
607     * Doc/manual/thuban-manual.xml: Fixed typos and wording, clarified
608     some points, and added more screen shots.
609    
610 bh 1512 2003-07-29 Bernhard Herzog <[email protected]>
611    
612 bh 1516 * Thuban/Model/data.py: Remove the now unused import of warnings
613    
614     2003-07-29 Bernhard Herzog <[email protected]>
615    
616 bh 1514 * Thuban/Model/data.py (SimpleStore): Removed. This class has been
617     deprecated since before the 0.8 release and isn't used in Thuban
618     itself anymore.
619    
620 bh 1512 * Thuban/Model/transientdb.py: Remove some unnecessary imports
621    
622 jonathan 1503 2003-07-29 Jonathan Coles <[email protected]>
623 jonathan 1506
624     * Thuban/UI/application.py (ThubanApplication.OnInit): set the
625     python exception hook here so that we are sure to catch any
626     Thuban exception that happen during initialization.
627    
628     * Thuban/UI/main.py (main): Don't set the exception hook here,
629     it will get set in ThubanApplication.OnInit.
630    
631     2003-07-29 Jonathan Coles <[email protected]>
632 jonathan 1503
633     * Thuban/UI/application.py (ThubanApplication.ShowExceptionDialog):
634     Removed and called it show_exception_dialog() so that the exception
635     handler can be set before the class is created.
636    
637     * Thuban/UI/main.py (main): Install the exception handler before
638     a ThubanApplication is created.
639    
640 bh 1500 2003-07-29 Bernhard Herzog <[email protected]>
641    
642     * po/it.po: New. Italian translation by Maurizio Napolitano
643    
644     * po/ru.po: New. Russian translation by Alex Shevlakov
645    
646 frank 1497 2003-07-29 Frank Koormann <[email protected]>
647    
648 frank 1508 * Doc/manual/thuban-manual.xml: Extended section on supported
649     projections.
650    
651     2003-07-29 Frank Koormann <[email protected]>
652    
653 frank 1497 * Doc/manual/thuban-manual.xml: gaspell-checked.
654    
655 jonathan 1493 2003-07-29 Jonathan Coles <[email protected]>
656    
657 jonathan 1495 * Doc/manual/images/3_5_legend.png: Added border to improve look
658     on white background.
659    
660     2003-07-29 Jonathan Coles <[email protected]>
661    
662 jonathan 1493 * Doc/manual/thuban-manual.xml: Fixed grammar and typos. Added
663     descriptions for the legend toolbar.
664    
665     * Doc/manual/images/4_2_raster_layer_properties.png: Removed
666     cursor from dialog box.
667    
668     2003-07-28 Jonathan Coles <[email protected]>
669    
670     * Doc/manual/thuban-manual.xml: More screenshots and more chapters.
671    
672     * Doc/manual/images/2_4_session_tree.png,
673     Doc/manual/images/3_5_legend.png, Doc/manual/images/3_rename_map.png,
674     Doc/manual/images/4_2_layer_properties.png,
675     Doc/manual/images/4_2_raster_layer_properties.png,
676     Doc/manual/images/5_3_genclass.png,
677     Doc/manual/images/5_classification.png,
678     Doc/manual/images/6_projection.png,
679     Doc/manual/images/7_1_table_view.png,
680     Doc/manual/images/7_2_5_join.png: New screenshots.
681    
682     2003-07-24 Jonathan Coles <[email protected]>
683    
684     * Doc/manual/thuban-manual.xml: Chapter on Projection Management.
685    
686     2003-07-24 Jonathan Coles <[email protected]>
687    
688     * Doc/manual/thuban-manual.xml: Added EPS images and wrote
689     chapter on Layer Management.
690    
691     * Doc/manual/Makefile: New. Makefile to generate all formats for the
692     manual and images.
693    
694 bh 1483 2003-07-24 Bernhard Herzog <[email protected]>
695    
696     * Thuban/Model/range.py, Thuban/version.py: Remove the #! line as
697     it annoys lintian which warns about these files not being
698     executable. The #1 isn't necessary here since if you absolutely
699     must execute them you can always say "python <filename>".
700    
701     * Thuban/UI/renderer.py (ScreenRenderer.draw_shape_layer): Remove
702     superfluous code to set brush and pen for point shapes
703    
704     * Thuban/UI/viewport.py: Remove commented out code that wouldn't
705     belong in viewport anyway
706    
707 frank 1479 2003-07-24 Frank Koormann <[email protected]>
708    
709     * Doc/manual/thuban-manual.xml: Added section on table management.
710    
711 bh 1477 2003-07-24 Bernhard Herzog <[email protected]>
712    
713     * test/runtests.py (main): Recognize the long "verbose" option
714     correctly.
715    
716 jonathan 1470 2003-07-22 Jonathan Coles <[email protected]>
717    
718     * Doc/manual/thuban-manual.xml: Continue to write first revision
719     of the manual.
720    
721     * Thuban/UI/renderer.py (MapRenderer.render_map): Wrap method
722     with Begin/EndDrawing() calls to ensure we aren't doing to
723     many updates to the dc during rendering.
724     (ScreenRenderer.draw_shape_layer): self.draw_point_shape takes
725     a pen and brush argument so they need to be passed to the function.
726    
727     * Thuban/UI/viewport.py (ViewPort.calc_min_max_scales): New.
728     Calculates the minimum and maximum scale values. Factored out
729     of set_view_transform so that it could be used to zoom all the
730     way into a single point.
731     (ViewPort.set_view_transform): Call calc_min_max_scales().
732     (ViewPort.FitSelectedToWindow): Zoom to the maximum scale
733     if only a single point is selected.
734    
735     * Doc/manual/images/1_2_legend_close.png,
736     Doc/manual/images/1_2_legend_dock.png,
737     Doc/manual/images/1_2_mainwindow.png,
738     Doc/manual/images/1_2_mainwindow.ps,
739     Doc/manual/images/1_2_mainwindow.sk,
740     Doc/manual/images/3_2_fullextent.png,
741     Doc/manual/images/3_2_fulllayerextent.png,
742     Doc/manual/images/3_2_fullshapeextent.png,
743     Doc/manual/images/3_2_pan.png,
744     Doc/manual/images/3_2_zoomin.png,
745     Doc/manual/images/3_2_zoomout.png,
746     Doc/manual/images/3_3_identify.png,
747     Doc/manual/images/3_3_label.png,
748     Doc/manual/images/3_5_invisible.png,
749     Doc/manual/images/3_5_movedown.png,
750     Doc/manual/images/3_5_moveup.png,
751     Doc/manual/images/3_5_props.png,
752     Doc/manual/images/3_5_tobottom.png,
753     Doc/manual/images/3_5_totop.png,
754     Doc/manual/images/3_5_visible.png: New. Images for the documentation.
755    
756 bh 1451 2003-07-18 Bernhard Herzog <[email protected]>
757    
758 bh 1465 * Thuban/UI/messages.py (MAP_REPLACED): New message.
759    
760     * Thuban/UI/viewport.py (ViewPort.SetMap): Issue MAP_REPLACED
761     after the new map has been assigned
762    
763     * Thuban/UI/mainwindow.py (MainWindow.delegated_messages):
764     Delegate MAP_REPLACED to the canvas too
765     (MainWindow.prepare_new_session): Removed. Thanks to the new
766     MAP_REPLACED message it's no longer needed
767     (MainWindow.OpenSession, MainWindow.NewSession):
768     prepare_new_session has been removed.
769    
770     * Thuban/UI/classifier.py (Classifier.__init__): Subscribe to
771     MAP_REPLACED so that we can close the dialog if a new map is set.
772     (Classifier.unsubscribe_messages): Unsubscribe from MAP_REPLACED
773     (Classifier.map_replaced): Handle MAP_REPLACED by closing the
774     dialog
775    
776     * test/test_viewport.py (SimpleViewPortTest)
777     (SimpleViewPortTest.test_default_size): Add doc-strings
778     (ViewPortTest.setUp): Bind map to self.map so we can use it in
779     tests. Subscribe to MAP_REPLACED messages too.
780     (ViewPortTest.tearDown): No need to explicitly unsubscribe
781     (ViewPortTest.test_set_map): New test for the SetMap method.
782    
783     2003-07-18 Bernhard Herzog <[email protected]>
784    
785 bh 1463 * test/test_viewport.py (SimpleViewPortTest.test_default_size):
786     Move this test from ViewPortTest.setUp to this new separate test
787     case. setUp is not the place for the actual tests.
788     (ViewPortTest.test_inital_settings, ViewPortTest.setUp): Move some
789     more of the test from setUp to the new test test_inital_settings.
790     (ViewPortTest.test_win_to_proj, ViewPortTest.test_proj_to_win)
791     (ViewPortTest.test_proj_conv): Split test_proj_conv into
792     test_win_to_proj and test_proj_to_win and make the tests easier to
793     understand
794     (ViewPortTest.testFitRectToWindow, ViewPortTest.testZoomFactor)
795     (ViewPortTest.testZoomOutToRect, ViewPortTest.testTranslate)
796     (ViewPortTest.test_unprojected_rect_around_point)
797     (ViewPortTest.test_find_shape_at, ViewPortTest.testTools):
798     Reformat to increase readability.
799    
800     2003-07-18 Bernhard Herzog <[email protected]>
801    
802 bh 1461 * Thuban/UI/view.py (MapCanvas.OnLeftDown): Capture the mouse.
803    
804     2003-07-18 Bernhard Herzog <[email protected]>
805    
806 bh 1459 * test/runtests.py: The test suite can now be run without an X
807     connection. To make sure this remains true, remove the DISPLAY
808     environment variable so that an error occurs if the wxGTK is
809     imported accidentally
810    
811     2003-07-18 Bernhard Herzog <[email protected]>
812    
813 bh 1457 * Thuban/UI/viewport.py: Remove unused imports
814    
815     * Thuban/UI/view.py: Remove unused imports
816    
817     2003-07-18 Bernhard Herzog <[email protected]>
818    
819 bh 1455 * test/test_export.py Remove unused imports. The OutputTransform
820     function is now in viewport.py and is called output_transform
821     (TestScalebar.test_output_transform)
822     (TestScalebar.test_OutputTransform): Renamed to
823     test_output_transform and updated to use output_transform instead
824     of OutputTransform
825    
826     * Thuban/UI/view.py (OutputTransform): Moved to viewport.py and
827     renamed.
828     (MapCanvas.Export, MapPrintout.draw_on_dc): OutputTransform was
829     renamed to output_transform
830    
831     * Thuban/UI/viewport.py (OutputTransform, output_transform):
832     Rename to output_transform
833    
834     2003-07-18 Bernhard Herzog <[email protected]>
835    
836 bh 1453 * Thuban/Model/layer.py (Layer.__init__): Rename
837     classificationField to classificatin_column and init it here so
838     that it can be used in SetClassificationColumn
839     (Layer.GetClassificationColumn, Layer.GetClassificationField):
840     Rename to GetClassificationColumn.
841     (Layer.SetClassificationColumn, Layer.SetClassificationField):
842     Rename to SetClassificationColumn and issue a LAYER_CHANGED
843     message if the column changes.
844     (Layer._classification_changed, Layer.ClassChanged): Rename to
845     _classification_changed. Update the callers.
846     (Layer.SetShapeStore): Further field->column renames.
847    
848     * Thuban/Model/load.py (SessionLoader.start_classification)
849     (SessionLoader.start_clpoint): Updates because of
850     field->column method name changes in the Layer class
851    
852     * Thuban/Model/save.py (SessionSaver.write_classification): Updates
853     because of field->column method name changes in the Layer class
854    
855     * Thuban/UI/classifier.py (Classifier.__init__)
856     (Classifier._OnTry, Classifier._OnRevert): Updates because of
857     field->column method name changes in the Layer class
858    
859     * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Updates
860     because of field->column method name changes in the Layer class
861    
862     * Thuban/UI/viewport.py (ViewPort.find_shape_at): Updates because
863     of field->column method name changes in the Layer class
864    
865     * test/test_save.py (SaveSessionTest.testClassifiedLayer)
866     (SaveSessionTest.testClassifiedLayer): Update because of
867     field->column method name changes in the Layer class
868    
869     * test/test_layer.py (SetShapeStoreTests.setUp)
870     (SetShapeStoreTests.test_sanity): Update because of field->column
871     method name changes in the Layer class
872     (TestLayerModification.setUp): Subscribe to LAYER_CHANGED as well
873     (TestLayerModification.test_sanity)
874     (TestLayerModification.test_initial_settings): remove unsued code
875     and rename to test_sanity.
876     (TestLayerModification.test_set_classification): New test for
877     SetClassification and SetClassificationField.
878    
879     2003-07-18 Bernhard Herzog <[email protected]>
880    
881 bh 1451 * test/test_classgen.py (TestFixedRamp.test): Extend test to check
882     the non-fixed values as well. The old test would have accepted a
883     fixed ramp that only returnes the fixed properties
884    
885 jonathan 1449 2003-07-17 Jonathan Coles <[email protected]>
886    
887     * Doc/manual/mainwindow.png, Doc/manual/mainwindow.xcf: Screen
888     shots for the manual. The XCF file is the source image and
889     has additional layers to support changes.
890    
891     * Doc/manual/thuban-manual.xml: Wrote an initial Introduction.
892    
893     * Thuban/UI/classifier.py (Classifier.__BuildClassification):
894     Return both the new class and the field name.
895    
896     * Thuban/UI/mainwindow.py (MainWindow.ToggleLegend): Don't
897     fit the map to the window as this changes any zoom level that
898     the user may have set.
899    
900 jonathan 1442 2003-07-16 Jonathan Coles <[email protected]>
901    
902     * Thuban/Model/classgen.py (generate_singletons,
903     generate_uniform_distribution, generate_quantiles): Remove
904     fixes parameter, but maintain the same functionality by having
905     the calling function pass a FixedRamp object for the ramp.
906     (FixedRamp): New. Adapts a ramp to have fixed property values.
907    
908     * Thuban/Model/classification.py: Use new CLASS_CHANGED message.
909     (Classification): Inherit from Publisher.
910     (Classification.__init__): Remove the layer parameter.
911     Classifications no longer need to have a parent layer.
912     (Classification.GetField, Classification.GetFieldType,
913     Classification.SetFieldInfo): Removed. The field name is stored
914     in the layer, and the type can be retreived by calling
915     Layer.GetFieldType().
916     (Classification._set_layer, Classification.GetLayer): Removed.
917     Classifications no longer have a parent layer.
918    
919     * Thuban/Model/layer.py (Layer.Destroy): Unsubscribe from the
920     classification.
921     (Layer.SetShapeStore): Reset the classification first while
922     we still have the old shape store to work with.
923     (Layer.GetClassificationField, Layer.SetClassificationField):
924     New. Method for getting/setting the field to classify on.
925     (Layer.SetClassification): Simplified now that the layer
926     simply has to hold a reference to the classification and not
927     tell the classification who owns it.
928     Fixes RTbug #2023.
929    
930     * Thuban/Model/load.py (SessionLoader.start_classification):
931     Set the field name on the layer, not the classification.
932    
933     * Thuban/Model/messages.py: Add CLASS_CHANGED for when a
934     classification is modified.
935    
936     * Thuban/Model/save.py (SessionSaver.write_classification):
937     Get the field name and type from the layer.
938    
939     * Thuban/Model/table.py (table_to_dbf, table_to_csv): Renamed
940     parameter records to rows and add docstring. Fixes RTbug #1997.
941    
942     * Thuban/UI/classgen.py (ClassGenDialog.OnOK): Use a fixed
943     ramp when we need to fix certain values of a ramp rather than
944     using the old fixes parameter. Fixes RTbug #2024.
945    
946     * Thuban/UI/classifier.py (ClassGrid.CreateTable): Add fieldType
947     parameter.
948     (ClassTable.Reset): Add fieldType parameter and use it, rather
949     than asking the classification.
950     (Classifier.__init__): Remember the original class's field
951     and ask the layer for the field type, rather than the classification.
952     (Classifier.__SetGridTable): Retrieve the field and field type
953     for the table because they are not in the classification.
954     (Classifier._OnTry, Classifier._OnRevert): Set the classification
955     field on the layer in addition to the classification itself.
956    
957     * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Get the
958     classification field from layer.
959    
960     * Thuban/UI/viewport.py (ViewPort.find_shape_at): Get the
961     classification field from layer. Split up tests and remove
962     *-imports. Fixes RTbug #1992.
963    
964     * test/test_classgen.py (TestFixedRamp): Test for the FixedRamp class.
965    
966     * test/test_classification.py
967     (TestClassification.test_classification): Remove tests for methods
968     that no longer exist.
969    
970     * test/test_layer.py (SetShapeStoreTests.setUp): Classification
971     __init__ no longer has a field parameter, use SetClassificationField.
972     (SetShapeStoreTests.test_sanity): Use layer object to get class
973     field info.
974    
975     * test/test_save.py (SaveSessionTest.testClassifiedLayer): Use
976     SetClassificationField on layer to set class field info.
977    
978     * test/test_viewport.py: Renamed from test/test_view.py.
979    
980 jan 1424 2003-07-16 Jan-Oliver Wagner <[email protected]>
981    
982     * Doc/manual/thuban-manual.xml: Added authors and an initial
983     coarse structure.
984    
985 bh 1418 2003-07-15 Bernhard Herzog <[email protected]>
986    
987 bh 1422 * test/support.py (FloatComparisonMixin): This is a mix-in class
988     and therefore should not be derived from any other class.
989    
990     * test/test_range.py (RangeTest): FloatComparisonMixin is a
991     mix-in, so derive from TestCase as well.
992    
993     2003-07-15 Bernhard Herzog <[email protected]>
994    
995 bh 1420 * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Rework the
996     draw_func handling a bit to remove one layer of indirection. This
997     makes the renderer about 10% faster in the non-classifying case
998     and the code a bit cleaner
999     (MapRenderer.draw_point_shape): Add the pen and brush parameters
1000     and set them in the dc. Now the draw_point_shape method and
1001     wxproj's draw_polygon_shape function have basically the same
1002     signature so that both can be directly used as draw_func
1003    
1004     2003-07-15 Bernhard Herzog <[email protected]>
1005    
1006 bh 1418 * Thuban/Model/save.py (SessionSaver.write_classification): Encode
1007     string values (in addition to the labels) as UTF 8
1008    
1009     * Thuban/Model/load.py (SessionLoader.start_clpoint): Decode the
1010     values if the field type is string
1011    
1012     * test/test_save.py (SaveSessionTest.testClassifiedLayer): Test
1013     saving a session with non-ascii string classification values.
1014    
1015     * test/test_load.py (TestClassification.file_contents)
1016     (TestClassification.test): Check for non-ascii values in string
1017     classifications
1018    
1019 jonathan 1416 2003-07-14 Jonathan Coles <[email protected]>
1020    
1021     * test/test_view.py: New. Tests for ViewPort.
1022    
1023 frank 1409 2003-07-14 Frank Koormann <[email protected]>
1024    
1025     * Thuban/Model/load.py (SessionLoader.start_map): Encode map
1026     title to latin1. Fixes https://intevation.de/rt/webrt?serial_num=2013
1027    
1028 frank 1411 * test/test_load_0_8.py (TestUnicodeStrings): New, test load of
1029     unicode strings from session file: session title, map title and
1030     projection name.
1031    
1032 jonathan 1403 2003-07-10 Jonathan Coles <[email protected]>
1033    
1034 jonathan 1406 * Thuban/UI/viewport.py (Tool.MouseUp): Should have called
1035     drag_stop, not drag_move when the mouse is released.
1036    
1037     2003-07-10 Jonathan Coles <[email protected]>
1038    
1039 jonathan 1403 The most important part of this is the seperation of view.py into
1040     two pieces. viewport.py now has a class called ViewPort which
1041     contains all the non-wx parts of view.py and can therefore be
1042     tested. view.py contains only the wx-specific parts and is fairly
1043     simple.
1044    
1045     * Thuban/UI/view.py: Stripped out all non-wx functionality. Fixes
1046     RTTbug #1992.
1047     * Thuban/UI/viewport.py: New. Contains non-wx view functionality.
1048     RTTbug #1992.
1049    
1050     * Thuban/Model/classgen.py (generate_singletons,
1051     generate_uniform_distribution, generate_quantiles):
1052     Added 'fixes' parameter so that property attributes can
1053     be held constant over the generated classification groups.
1054     (CustomRamp.GetProperties): Remove unused variables.
1055    
1056     * Thuban/Model/map.py (Map.SetProjection): Send the old
1057     projection as an argument to listeners of the MAP_PROJECTION_CHANGED
1058     event.
1059    
1060     * Thuban/Model/table.py (table_to_dbf, table_to_csv): Added 'records'
1061     parameter which is a list of records that restricts which
1062     records are saved. Fixes RTbug #1997.
1063    
1064     * Thuban/UI/application.py (ThubanApplication.ShowExceptionDialog):
1065     Port exception dialog from GREAT-ER. Fixes RTbug #1993.
1066    
1067     * Thuban/UI/classgen.py (ClassGenDialog.__init__): Add controls
1068     to allow the user to fix line color/width on generated groups.
1069     (ClassGenDialog.OnOK): Use new 'fixes' parameter of the generate_*
1070     functions to optionally fix group properties.
1071    
1072     * Thuban/UI/main.py (main): Set exception hook to the
1073     ShowExceptionDialog. Fixes RTbug #1993.
1074    
1075     * Thuban/UI/mainwindow.py (MainWindow.ShowTableView): Raise
1076     the table window when it is selectd to be shown.
1077    
1078     * Thuban/UI/tableview.py (QueryTableFrame.__init__): Add an
1079     Export Selection button and move the export buttons underneath
1080     the table.
1081     (QueryTableFrame.UpdateStatusText): Added event argument so
1082     that it can respond to grid selection events. The status text
1083     is now updated even when the table is not associated with a
1084     layer as was previously assumed.
1085     (QueryTableFrame.OnGridSelectRange, OnGridSelectCell): Removed.
1086     UpdateStatusText responds to these events.
1087     (QueryTableFrame.OnSaveAs): Renamed to doExport.
1088     (QueryTableFrame.doExport): Helper function that saves the
1089     entire table, or selected rows, to a file.
1090     (QueryTableFrame.OnExport, QueryTableFrame.OnExportSel): New.
1091     Respond to export button events and call doExport.
1092    
1093     * extensions/thuban/gdalwarp.cpp (ProjectRasterFile): Make sure
1094     the function doesn't return NULL without first setting a Python
1095     Error.
1096    
1097     * test/runtests.py (main): Only print "Unknown option" for
1098     unsupported options.
1099    
1100     * test/support.py (FloatComparisonMixin.assertFloatEqual): Take
1101     optional epsilon argument to specify floating point accuracy.
1102     (FloatComparisonMixin.assertFloatSeqEqual): Call assertFloatEqual
1103     for each item test.
1104    
1105     * test/test_csv_table.py (TestCSVTable.test_table_to_cvs): Add
1106     tests for saving selected records.
1107    
1108     * test/test_dbf_table.py (TestTableToDBF.test_table_to_dbf): Add
1109     tests for saving selected records.
1110    
1111     * test/test_map.py (TestMapWithContents.test_set_projection):
1112     MAP_PROJECTION_CHANGED events send the old projection.
1113    
1114     * test/test_session.py
1115     (TestSessionWithContent.test_forward_map_projection):
1116     MAP_PROJECTION_CHANGED events send the old projection.
1117    
1118     * test/test_table.py (TableTest): Update tests to use non-deprecated
1119     functions.
1120    
1121 bh 1376 2003-07-08 Bernhard Herzog <[email protected]>
1122    
1123 bh 1382 * Thuban/Model/transientdb.py (TransientTableBase.Width): The type
1124     constants in the column objects are the standard ones defined in
1125     the table module.
1126    
1127     * test/test_transientdb.py
1128     (TestTransientTable.test_transienttable_to_dbf): New. Test whether
1129     exporting transient tables as DBF works. This should catch the bug
1130     just fixed in TransientTableBase.Width.
1131    
1132     2003-07-08 Bernhard Herzog <[email protected]>
1133    
1134 bh 1380 * Thuban/Model/classgen.py (CustomRamp.GetProperties): Compute the
1135     interpolated colors correctly.
1136    
1137     * test/test_classgen.py (TestCustomRamp.test_color_interpolation):
1138     New. Test case for the fix in classgen.py
1139    
1140     2003-07-08 Bernhard Herzog <[email protected]>
1141    
1142 bh 1378 * test/runtests.py (main): Make the default output less verbose
1143     and add a verbosity option (-v) to get the old output
1144    
1145     2003-07-08 Bernhard Herzog <[email protected]>
1146    
1147 bh 1376 * Resources/XML/thuban-0.9.dtd: New. This will become the DTD for
1148     0.9.
1149    
1150     * Thuban/Model/transientdb.py (TransientJoinedTable.JoinType):
1151     New. Return the join type
1152    
1153     * Thuban/Model/save.py (SessionSaver.write_session): Use new 0.9
1154     DTD
1155     (SessionSaver.write_data_containers): Save the join type for
1156     joined tables
1157    
1158     * Thuban/Model/load.py (SessionLoader.__init__): Add the new 0.9
1159     namespace
1160     (SessionLoader.start_jointable): Handle the jointype attribute
1161    
1162     * test/test_load_0_8.py: New. Effectively a copy of test_load.py
1163     as of Thuban 0.8. These are now tests to determine whether Thuban
1164     can still read files generated by Thuban 0.8
1165    
1166     * test/test_load.py (LoadSessionTest.dtd)
1167     (TestSingleLayer.file_contents)
1168     (TestLayerVisibility.file_contents, TestLabels.file_contents)
1169     (TestLayerProjection.file_contents)
1170     (TestRasterLayer.file_contents, TestJoinedTable.file_contents)
1171     (TestJoinedTable.file_contents)
1172     (TestLoadError.file_contents): Update for new DTD
1173     (TestJoinedTable.file_contents, TestJoinedTable.setUp): Add test
1174     for new join type attribute
1175    
1176     * test/test_save.py (SaveSessionTest.dtd)
1177     (SaveSessionTest.testEmptySession)
1178     (SaveSessionTest.testSingleLayer)
1179     (SaveSessionTest.testLayerProjection)
1180     (SaveSessionTest.testRasterLayer)
1181     (SaveSessionTest.testClassifiedLayer)
1182     (SaveSessionTest.test_dbf_table)
1183     (SaveSessionTest.test_joined_table): Update for new DTD
1184     (SaveSessionTest.test_joined_table): Add test for new join type
1185     attribute
1186    
1187 bh 1372 2003-07-04 Bernhard Herzog <[email protected]>
1188    
1189     * Thuban/Model/table.py (_find_dbf_column_names): New. Helper
1190     function for table_to_dbf
1191     (table_to_dbf): Deal with names longer than the 10 character limit
1192    
1193     * test/test_dbf_table.py (TestTableToDBF.test_table_to_dbf): Add
1194     doc-string
1195     (TestTableToDBF.test_table_to_dbf_long_col_names): New test for
1196     long column names
1197    
1198 bh 1365 2003-07-03 Bernhard Herzog <[email protected]>
1199    
1200 bh 1370 * Doc/manual/thuban-manual.xml: Fix the CVS Revision Tag syntax
1201    
1202     2003-07-03 Bernhard Herzog <[email protected]>
1203    
1204 bh 1368 * Doc/manual/thuban-manual.xml, Doc/manual/README: New. Skeleton
1205     for the Thuban manual and README with some basic information about
1206     the manual
1207    
1208     2003-07-03 Bernhard Herzog <[email protected]>
1209    
1210 bh 1365 * Thuban/Model/transientdb.py (TransientJoinedTable.__init__):
1211     Update doc-string
1212     (TransientJoinedTable.create): Do not modify the column objects of
1213     the input tables in place and copy all columns of the input tables
1214     into the joined table after all.
1215    
1216     * test/test_transientdb.py
1217     (TestTransientTable.test_transient_joined_table_same_column_name):
1218     Update to reflect the new behavior
1219     (TestTransientTable.test_transient_joined_table_with_equal_column_names):
1220     Update to reflect the new behavior
1221     (TestTransientTable.test_transient_joined_table_name_collisions_dont_modify_in_place):
1222     New test case for a bug which modified the column objects in place
1223    
1224 jonathan 1360 2003-07-02 Jonathan Coles <[email protected]>
1225 jonathan 1349
1226 jonathan 1360 * Thuban/Model/classgen.py (generate_singletons,
1227     generate_uniform_distribution, generate_quantiles,
1228 jonathan 1363 GenQuantiles0): Make sure maxValue isn't less than
1229     one, otherwise we could divide by zero.
1230    
1231     * test/test_classgen.py (ClassGenTest.doClassRangeTest,
1232     ClassGenTest.doClassSingleTest): Call doBoundsTest to
1233     check the end classification groups against the
1234     proper property values.
1235     (ClassGenTest.doBoundsTest): New. Checks the first and
1236     last classification groups to make sure their properties
1237     are the correct upper and lower bounds for a color ramp.
1238    
1239     2003-07-02 Jonathan Coles <[email protected]>
1240    
1241     * Thuban/Model/classgen.py (generate_singletons,
1242     generate_uniform_distribution, generate_quantiles,
1243 jonathan 1360 GenQuantiles0): The denominator was one to high when
1244     calculating the index for the ramp causing the index
1245     to never to reach one.
1246    
1247     2003-07-02 Jonathan Coles <[email protected]>
1248    
1249 jonathan 1358 Changed the singature of ClassGroupRange.__init__ and
1250     ClassGroupRange.SetRange() so that the min/max values are
1251     passed as a tuple. This makes a better calling scheme for
1252     when a Range object is passed instead.
1253    
1254     * Thuban/Model/classgen.py: Fixed parameters to
1255     ClassGroupRange constructor.
1256    
1257     * Thuban/Model/classification.py (ClassGroupRange.__init__):
1258     Consolidate the min/max parameters into a single _range which
1259     can either be a tuple or a Range object.
1260     (ClassGroupRange.SetRange): Consolidate the min/max parameters
1261     into a single _range which can either be a tuple or a Range object.
1262    
1263     * Thuban/Model/load.py (SessionLoader.start_clrange): Fix
1264     call to ClassGroupRange constructor to use a tuple.
1265    
1266     * Thuban/Model/layer.py (Layer.SetClassification): Switch
1267     the classification instance variable to the new class
1268     before calling _set_layer otherwise subscribers to a
1269     LAYER_CHANGED event will not see any difference.
1270    
1271     * test/test_classification.py: Fix tests of ClassGroupRange
1272     so that they use the new signature.
1273    
1274     * test/test_load.py: Fix use of ClassGroupRange so that it
1275     uses the new signature.
1276    
1277     * test/test_load_0_2.py: Fix use of ClassGroupRange so that it
1278     uses the new signature.
1279    
1280     * test/test_save.py: Fix use of ClassGroupRange so that it
1281     uses the new signature.
1282    
1283    
1284     2003-07-01 Jonathan Coles <[email protected]>
1285    
1286 jonathan 1349 * Thuban/Model/classgen.py: Fixes RTbug #1972, 1971.
1287     Import used objects/class from color.
1288     (generate_singletons): We don't
1289     need the numGroups parameter anymore because we are using
1290     the new ramps with GetProperties().
1291     (generate_uniform_distribution): Use new ramp method
1292     GetProperties().
1293     (generate_quantiles, GenQuantiles0): Use new ramp method
1294     GetProperties().
1295     (CustomRamp.SetNumGroups): Removed. The ramps now map
1296     a value from 0 to 1 to class properties so the number
1297     of groups is not needed ahead of time.
1298     (CustomRamp.next): Removed. CustomRamp does not support
1299     interation anymore.
1300     (CustomRamp.GetProperties): Returns a ClassGroupProperties
1301     object based on the index value from 0 to 1 that is
1302     passed to it.
1303     (GreyRamp, RedRamp, GreenRamp, BlueRamp, GreenToRedRamp):
1304     Made into instances of Monochromatic class instread of
1305     deriving from it.
1306     (HotToCold.SetNumGroups): Removed. See CustomRamp.
1307     (HotToCold.next): Removed. See CustomRamp.
1308    
1309     * Thuban/Model/classification.py: Fixes RTbug #1973, 1971.
1310     (Classification.SetField, Classification.SetFieldType):
1311     Replaced with SetFieldInfo.
1312     (Classification.SetFieldInfo): New. Does a better job of
1313     what SetField and SetFieldType used to do by combining
1314     their function since they should really always be done
1315     at the same time.
1316     (Classification.SetLayer): Renamed to _set_layer.
1317     (Classification._set_layer): Should only be called from
1318     Layer's SetClassification. This does not cause a recursive
1319     call as SetLayer did because we know that Layer knows about
1320     the classification.
1321    
1322     * Thuban/Model/color.py: Fixes RTbug #1971.
1323     (_Transparent): Renamed from Transparent so it doesn't
1324     conflict with the module variable.
1325     (Transparent, Black): Renamed from Color.Transparent,
1326     Color.Black so they are not class variables.
1327    
1328     * Thuban/Model/layer.py: Fixes RTbug #1971, 1973.
1329     (Layer.Destroy): We don't need to call SetClassification
1330     anymore to clear out the back reference in the classifcation
1331     to the layer. It's better to set it to None using _set_layer,
1332     and we won't be creating another clas object too.
1333     (Layer.SetClassification): Classification._set_layer is not
1334     recursive so remove all the locking variables. Also clean
1335     up the code so that it remains unchanged if something fails.
1336    
1337     * Thuban/Model/load.py: Fixes RTbug #1971.
1338     (SessionLoader.start_classification): Call
1339     Classification.SetFieldInfo().
1340    
1341     * Thuban/Model/save.py: Removed import of Color which wasn't
1342     being used.
1343    
1344     * Thuban/UI/classgen.py: Fixes RTbug #1972.
1345     (ClassGenDialog.__init__): Color ramps are now instances
1346     already so we don't need to create any new objects.
1347     (ClassGenDialog.OnOK): Check for numGroups is no longer
1348     necessary because we never use it.
1349    
1350     * Thuban/UI/classifier.py: Fixes RTbug #1971.
1351     (Classifier.__BuildClassification, Classifier.__SetGridTable):
1352     Call Classification.SetFieldInfo() instead of SetFieldType.
1353    
1354     * Thuban/UI/renderer.py: Fixes RTbug #1971.
1355    
1356     * Thuban/UI/view.py: Fixes RTbug #1974, 1971.
1357     (MapCanvas.__init__): Subscribe to the idle time event. Set
1358     background color to white.
1359     (MapCanvas.OnPaint): Set a flag indicating that we should
1360     render the map during idle time. If we already have a bitmap
1361     just draw it now.
1362     (MapCanvas.OnIdle): New. Render the map only during idle time.
1363     This also fixes a problem with the busy cursor under gtk.
1364    
1365     * test/test_classgen.py (ClassGenTest.test_generate_singletons):
1366     Fix calls to generate_singletons because the signature changed.
1367    
1368     * test/test_classification.py: Fix color references and
1369     change calls to Classification.[SetField|SetFieldType] to
1370     SetFieldInfo.
1371    
1372     * test/test_load.py: Fix color references.
1373    
1374     * test/test_load_0_2.py: Fix color references.
1375    
1376     * test/test_save.py (SaveSessionTest.testClassifiedLayer):
1377     Change calls to Classification.[SetField|SetFieldType] to
1378     SetFieldInfo.
1379    
1380 frank 1334 2003-07-01 Frank Koormann <[email protected]>
1381    
1382     MERGE from the greater-ms3 branch.
1383    
1384     * test/test_transientdb.py
1385     (TestTransientTable.test_transient_joined_table_with_equal_column_names):
1386     New. Test join of two tables with partly equal column names.
1387    
1388     * Thuban/Model/transientdb.py (TransientJoinedTable.create):
1389     If duplicates in left and right tables column names are found,
1390     append '_' (underscores) to the name until it is unique.
1391     Create always new internal names for the resulting table and reference
1392     columns in the join statement with <table>.<column>
1393    
1394 bh 1329 2003-07-01 Bernhard Herzog <[email protected]>
1395    
1396     * test/test_transientdb.py
1397     (TestTransientTable.test_transient_joined_table_same_column_name):
1398     New. Test whether joining on columns with the same names in both
1399     tables works.
1400 frank 1334
1401 bh 1329 * Thuban/Model/transientdb.py (TransientJoinedTable.create): Make
1402     sure to use the right internal names even when joining on field
1403     with the same names in both tables. Also, detect duplicate names
1404     in the joined table correctly.
1405    
1406 frank 1325 2003-07-01 Frank Koormann <[email protected]>
1407    
1408     * Thuban/UI/renderer.py (ExportRenderer.render_legend):
1409     Reverse List of layers to render in same order as in desktop legend.
1410    
1411 jonathan 1318 2003-06-30 Jonathan Coles <[email protected]>
1412    
1413 jonathan 1349 * Thuban/version.py (make_tuple): Takes a version string
1414     and splits it into a tuple of at most three integers.
1415     Used make_tuple() to make tuple versions of the version
1416     numbers.
1417    
1418     * Thuban/UI/about.py: Add Thuban email addresses.
1419    
1420     2003-06-30 Jonathan Coles <[email protected]>
1421    
1422 jonathan 1320 * Thuban/version.py: SQLite/PySQLite version dependencies
1423     were too high.
1424    
1425     2003-06-30 Jonathan Coles <[email protected]>
1426    
1427 jonathan 1318 * Thuban/version.py: Update version to 0.8.1
1428    
1429     * MANIFEST.in: Added Projections so that default.proj is
1430     included.
1431    
1432 jonathan 1312 2003-06-26 Jonathan Coles <[email protected]>
1433    
1434     New About box with lots more information including library
1435     versions and credits. More/better version checking before
1436     Thuban starts.
1437    
1438     * Thuban/UI/about.py: New. New About box that displays
1439     library version information and credits.
1440    
1441     * Thuban/version.py: Added new 'versions' dictionary which
1442     contains the verions of various libraries which are checked
1443     when the module loads.
1444     (verify_versions): Check all version numbers and returns
1445     a list of errors.
1446    
1447     * Thuban/UI/classifier.py (Classifier.__EnableButtons):
1448     Reset the status of the buttons as the situation warrants,
1449     but in a better more reliable way by not relying on the
1450     current status to determine what needs to change.
1451    
1452     * Thuban/UI/main.py (wxCHECK_VERSION): Removed. Not needed.
1453     (verify_versions): Remove most of the code since it is
1454     now in Thuban.version.verify_versions.o
1455    
1456     * Thuban/UI/mainwindow.py (MainWindow.About): Call new
1457     About box in Thuban.UI.about.
1458    
1459     * extensions/thuban/gdalwarp.cpp (get_gdal_version): New.
1460     Returns the version of gdal library being used as a string.
1461    
1462     * extensions/thuban/wxproj.cpp (check_version, check_version_gtk):
1463     Removed.
1464     (get_proj_version): Return the version of PROJ that the file
1465     was compiled with.
1466     (get_gtk_version): Return th version of GTK that the file
1467     was compiled with.
1468    
1469 jonathan 1304 2003-06-25 Jonathan Coles <[email protected]>
1470    
1471     * Thuban/UI/classifier.py (Classifier.EditSymbol): The parent
1472     of the SelectPropertiesDialog should be self so the window
1473     appears on top.
1474     (ClassGroupPropertiesCtrl.DoEdit): The parent
1475     of the SelectPropertiesDialog should be self so the window
1476     appears on top.
1477    
1478     * Thuban/UI/resource.py: Cleaned up how we determine file
1479     extensions.
1480     (GetImageResource): Return an wxImage from our Resources.
1481    
1482 jonathan 1299 2003-06-24 Jonathan Coles <[email protected]>
1483    
1484     * Thuban/UI/renderer.py (ExportRenderer.render_legend):
1485     Check that a layer has a classification before trying
1486     to get it. Raster layers don't have classifications.
1487    
1488 jonathan 1286 2003-06-23 Jonathan Coles <[email protected]>
1489 jonathan 1297
1490     * setup.py: Add Resources/XML to resource list.
1491    
1492     2003-06-23 Jonathan Coles <[email protected]>
1493 jonathan 1286
1494 jonathan 1297 * setup.cfg: Fix copyright dates
1495    
1496     2003-06-23 Jonathan Coles <[email protected]>
1497    
1498 jonathan 1294 * MANIFEST.in: Update with Resources/XML
1499    
1500     * setup.py: Don't include Locale resources yet as we don't
1501     have any and it causes problems building the distribution
1502     for Windows. Update version to 0.8.0.
1503    
1504     * Doc/thuban.dtd: Removed since it is now in Resources/XML.
1505    
1506     * Thuban/UI/mainwindow.py: Add blank line at the end because
1507     file was not being read correctly building the Windows
1508     distribution.
1509    
1510     2003-06-23 Jonathan Coles <[email protected]>
1511    
1512 jonathan 1289 * Thuban/UI/mainwindow.py (MainWindow.About): Fix text.
1513    
1514     * Thuban/version.py: Temporarily update longversion for
1515     the 0.8 release so that it doesn't have the cvs revision.
1516    
1517     2003-06-23 Jonathan Coles <[email protected]>
1518    
1519 jonathan 1286 * Thuban/UI/common.py (ThubanBeginBusyCursor): Call wxSafeYield
1520     to make sure that we don't create reentrant possibilities with
1521     wxYield.
1522    
1523     * Thuban/UI/view.py (MapCanvas.OnPaint): Call wxBeginBusyCursor()
1524     directly to avoid the wxSafeYield() call which generates an
1525     OnPaint event causing infinite recursion. Don't try to catch
1526     exception anymore. This was for before there were limits on map
1527     scaling.
1528    
1529 bh 1283 2003-06-23 Bernhard Herzog <[email protected]>
1530    
1531     Bug fix for RT #1961:
1532    
1533     * Thuban/Model/load.py (SessionLoader.start_derivedshapesource):
1534     Register DerivedShapestores with the session
1535    
1536     * Thuban/Model/session.py (Session.Tables): Make sure each table
1537     is only listed once.
1538    
1539     * test/test_load.py (TestJoinedTable.test): Add check_format call.
1540     Update file contents to match the one written out.
1541    
1542 bh 1281 2003-06-20 Bernhard Herzog <[email protected]>
1543    
1544     * test/xmlsupport.py (SaxEventLister.startElementNS)
1545     (SaxEventLister.endElementNS): Do not include the qname. Python
1546     2.2.1 and 2.2.2 and 2.2.3 differ in this regard. In 2.2.1 qname it
1547     is (presumably incorrectly) None, whereas it's a string with the
1548     element name in the later versions.
1549    
1550     * test/test_xmlsupport.py (TestEventList.test_even_list_simple)
1551     (TestEventList.test_even_list_namespace): Update tests to reflect
1552     the new behaviour
1553     (TestEventList.test_even_list_id_normalization): Fix doc-string
1554    
1555 jonathan 1272 2003-06-20 Jonathan Coles <[email protected]>
1556    
1557 jonathan 1279 * Thuban/Model/layer.py (BaseLayer.HasShapes): New. Overridden
1558     by deriving classes to determine if that layer supports shapes.
1559     (Layer): Override HasShapes and return true.
1560    
1561     * Thuban/UI/classgen.py: Use Thuban[Begin|End]BusyCursor()
1562     instead of a direct call to wx[Begin|End]CusyCursor().
1563     (GenUniquePanel._OnRetrieve): Set busy cursor while retrieving
1564     table data.
1565    
1566     * Thuban/UI/common.py (ThubanBeginBusyCursor, ThubanEndBusyCursor):
1567     New. Wrappers around the wxWindows functions that allow us to
1568     make additional calls such as wxYield which gives the native
1569     system a chance to update the cursor correctly.
1570    
1571     * Thuban/UI/tableview.py: Use Thuban[Begin|End]BusyCursor()
1572     instead of a direct call to wx[Begin|End]CusyCursor().
1573    
1574     * Thuban/UI/view.py: Use Thuban[Begin|End]BusyCursor()
1575     instead of a direct call to wx[Begin|End]CusyCursor().
1576     (MapCanvas.find_shape_at): Check if the current search layer
1577     support shapes, otherwise go on to the next layer.
1578    
1579     * test/test_layer.py: Add tests in each type of layer for
1580     HasClassification() and HasShapes()
1581    
1582     2003-06-20 Jonathan Coles <[email protected]>
1583    
1584 jonathan 1272 * Thuban/UI/view.py (MapCanvas.OnPaint): Call wxYield after
1585     turning on the busy cursor to allow the system to change the
1586     cursor before we begin painting. This fixes a problem that
1587     was occuring only under GTK. Fixes RTbug #1840.
1588    
1589 bh 1270 2003-06-20 Bernhard Herzog <[email protected]>
1590    
1591     * Resources/XML/thuban-0.8.dtd: New DTD for the new file format
1592     version.
1593    
1594     * Thuban/Model/save.py (sort_data_stores): New. Make topological
1595     sort of the data sources so they can be written with sources that
1596     data sources that depend on other data sources come after the
1597     sources they depend on.
1598     (SessionSaver.__init__): Add idmap instance variable to map from
1599     objects to the ids used in the file.
1600     (SessionSaver.get_id, SessionSaver.define_id)
1601     (SessionSaver.has_id): New. Methods to manage the idmap
1602     (SessionSaver.write): Use thuban-0.8.dtd
1603     (SessionSaver.write_session): Add a namespace on the session and
1604     write out the data sources before the maps.
1605     (SessionSaver.write_data_containers): New. Write the data
1606     containers.
1607     (SessionSaver.write_layer): Layer elements now refer to a
1608     shapestore and don't contain filenames anymore.
1609    
1610     * Thuban/Model/load.py (LoadError): Exception class to raise when
1611     errors in the files are discovered
1612     (SessionLoader.__init__): Define dispatchers for elements with a
1613     thuban-0.8 namespace too.
1614     (SessionLoader.check_attrs): New helper method to check and
1615     convert attributes
1616     (AttrDesc): New. Helper class for SessionLoader.check_attrs
1617     (SessionLoader.start_fileshapesource)
1618     (SessionLoader.start_derivedshapesource)
1619     (SessionLoader.start_filetable, SessionLoader.start_jointable):
1620     Handlers for the new elements in the new fileformat
1621     (SessionLoader.start_layer): Handle the shapestore attribute in
1622     addition to filename.
1623     (SessionLoader.start_table, SessionLoader.end_table): Removed.
1624     They were never used in the old formats and aren't needed for the
1625     new.
1626    
1627     * Thuban/Model/session.py (Session.DataContainers): New method to
1628     return all "data containers", i.e. shapestores and tables
1629    
1630     * test/xmlsupport.py (SaxEventLister.__init__)
1631     (SaxEventLister.startElementNS, sax_eventlist): Add support to
1632     normalize IDs.
1633    
1634     * test/test_xmlsupport.py
1635     (TestEventList.test_even_list_id_normalization): New test case for
1636     id normalization
1637    
1638     * test/test_load.py (LoadSessionTest.check_format): Use ID
1639     normalization
1640     (LoadSessionTest.thubanids, LoadSessionTest.thubanidrefs): New
1641     class atrributes used for ID normalization
1642     (TestSingleLayer, TestLayerVisibility, TestLabels.test)
1643     (TestLayerProjection.test, TestRasterLayer.test): Adapt to new
1644     file format
1645     (TestJoinedTable): New test for loading sessions with joined
1646     tables.
1647     (TestLoadError): New. Test whether missing required attributes
1648     cause a LoadError.
1649    
1650     * test/test_save.py (SaveSessionTest.thubanids)
1651     (SaveSessionTest.thubanidrefs): New class attributes for ID
1652     normalization in .thuban files.
1653     (SaveSessionTest.compare_xml): Use id-normalization.
1654     (SaveSessionTest.testEmptySession)
1655     (SaveSessionTest.testLayerProjection)
1656     (SaveSessionTest.testRasterLayer)
1657     (SaveSessionTest.testClassifiedLayer): Adapt to new file format.
1658     (SaveSessionTest.testLayerProjection): The filename used was the
1659     same as for testSingleLayer. Use a different one.
1660     (SaveSessionTest.test_dbf_table)
1661     (SaveSessionTest.test_joined_table): New test cases for saving the
1662     new data sources structures.
1663     (TestStoreSort, MockDataStore): Classes to test the sorting of the
1664     data stores for writing.
1665    
1666     * test/runtests.py: Add CVS keywords
1667    
1668 jonathan 1265 2003-06-20 Jonathan Coles <[email protected]>
1669    
1670 jonathan 1267 * test/test_session.py
1671     (UnreferencedTablesTests.test_unreferenced_tables_with_joins):
1672     Use the cultural_landmark-point.dbf file for the store so that
1673     the table rows and shape count match.
1674    
1675     2003-06-20 Jonathan Coles <[email protected]>
1676    
1677 jonathan 1265 * Thuban/Model/data.py (DerivedShapeStore.__init__): Raise
1678     an exception if the number of shapes is different from the
1679     number of rows in the table. Address RTbug #1933.
1680    
1681     * test/test_layer.py (TestLayer.test_derived_store): Add
1682     a test for the new exception in DerivedShapeStore.__init__.
1683    
1684     * test/support.py (FloatTestCase): Removed since there is
1685     already FloatComparisonMixin. Fixes RTbug #1954.
1686     (FloatComparisonMixin.assertFloatEqual): Include test for
1687     infinity that was part of FloatTestCase.
1688    
1689     * test/test_range.py (RangeTest): Inherit from
1690     support.FloatComparisonMixin now that we don't have
1691     support.FloatTestCase.
1692    
1693 bh 1256 2003-06-20 Bernhard Herzog <[email protected]>
1694    
1695 bh 1260 * test/test_save.py (SaxEventLister, sax_eventlist): Removed. Use
1696     the implementation in xmlsupport instead.
1697     (SaveSessionTest.compare_xml): sax_eventlist is now in xmlsupport
1698    
1699     * test/test_proj.py: Import sax_eventlist from xmlsupport instead
1700     of test_save
1701    
1702     2003-06-20 Bernhard Herzog <[email protected]>
1703    
1704 bh 1258 * test/test_load.py (LoadSessionTest.check_format): New helper
1705     method to make sure the test files we load might have been written
1706     by the current thuban version.
1707     (ClassificationTest.TestLayers, TestSingleLayer.test)
1708     (TestLayerVisibility.test, TestClassification.test)
1709     (TestLabels.test, TestLayerProjection.test, TestRasterLayer.test):
1710     Add check_format() calls and fix the thuban data to match the data
1711     that would be written by saving the session loaded from it.
1712    
1713     * test/xmlsupport.py (SaxEventLister, sax_eventlist): Copies of
1714     the same class and function in test_save.
1715    
1716     * test/test_xmlsupport.py (TestEventList): New. test cases for
1717     sax_eventlist
1718    
1719     2003-06-20 Bernhard Herzog <[email protected]>
1720    
1721 bh 1256 * Resources/XML/thuban.dtd: Add comment about which versions of
1722     Thuban are covered by this DTD
1723     (map): Fix content model for layers and raster layers. There can
1724     be any number or layers and raster layers in any order.
1725    
1726 jonathan 1254 2003-06-20 Jonathan Coles <[email protected]>
1727    
1728 jonathan 1265 This is mainly about fixing RTbug #1949.
1729    
1730 jonathan 1254 * Thuban/Model/classification.py: Remove "from __future__"
1731     import statement since python 2.2 is the earliest supported
1732     version.
1733    
1734     * Thuban/Model/proj.py (Projection.GetProjectedUnits): New.
1735     Currently returns PROJ_UNITS_METERS or PROJ_UNITS_DEGREES
1736     depending on the units this projection *forwards* into.
1737    
1738     * Thuban/Model/save.py (SessionSaver.write_classification):
1739     Remove unnecessary use of lambdas and nested functions.
1740    
1741     * Thuban/UI/legend.py (ScaleBarBitmap.__SetScale): Do scale
1742     adjustment here if the map projection uses degrees.
1743    
1744     * Thuban/UI/scalebar.py (ScaleBar.DrawScaleBar): Remove
1745     scale adjust code since it is now done before calling
1746     this method. Don't do anything if the map projection
1747     is None.
1748    
1749 bh 1244 2003-06-19 Bernhard Herzog <[email protected]>
1750    
1751 bh 1248 Move version specific load tests to their own file.
1752    
1753     * test/test_load.py: Expand the doc-string to explain a bit how to
1754     handle file format changes.
1755     (TestClassification.test): Update the docstring as this test is
1756     not about Thuban 0.2 anymore.
1757    
1758     * test/test_load_0_2.py: New file with the load tests for thuban
1759     files created with Thuban 0.2 and earlier.
1760    
1761     2003-06-19 Bernhard Herzog <[email protected]>
1762    
1763 bh 1246 Add XML validation to some of the tests. Validation will only be
1764     done if pyRXP is installed (http://reportlab.com/xml/pyrxp.html).
1765     To make the DTD available to the test cases it's moved into
1766     Resources/XML
1767    
1768     * Resources/XML/thuban.dtd: New. This is now the real Thuban DTD
1769     for versions up to and including 0.2. Two slight changes: added an
1770     encoding specification and fixed the comment which refered to
1771     GRASS, not Thuban
1772    
1773     * test/xmlsupport.py: New support module for tests involving XML.
1774     Currently there's a mix-in class for XML validation.
1775    
1776     * test/test_xmlsupport.py: New. Tests for the xmlsupport module
1777    
1778     * test/test_save.py (SaveSessionTest): Derive from ValidationTest
1779     so that we can validate the
1780     (SaveSessionTest.testEmptySession)
1781     (SaveSessionTest.testSingleLayer)
1782     (SaveSessionTest.testSingleLayer)
1783     (SaveSessionTest.testLayerProjection)
1784     (SaveSessionTest.testRasterLayer)
1785     (SaveSessionTest.testClassifiedLayer): Validate the generated XML
1786    
1787     * test/runtests.py (main): Call print_additional_summary instead
1788     of print_garbage_information
1789    
1790     * test/support.py (resource_dir): New function to return the
1791     "Resource" subdirectory
1792     (print_additional_summary): New function to combine several
1793     summary functions
1794     (run_tests): Use print_additional_summary instead of calling
1795     print_garbage_information directly
1796    
1797     2003-06-19 Bernhard Herzog <[email protected]>
1798    
1799 bh 1244 * Doc/thuban.dtd (classification): Correct the content model of
1800     the classification element.
1801     (projection): Add the "name" attribute
1802    
1803 frank 1242 2003-06-19 Frank Koormann <[email protected]>
1804    
1805     MERGE from the greater-ms3 branch.
1806    
1807     * Thuban/UI/scalebar.py (ScaleBar.DrawScaleBar): Apply conversion to
1808     scale if projection is latlong to get better estimate.
1809    
1810     Fix problem of hidden properties dialog under windows after double
1811     click on layer tree:
1812     The tree control always gets an Expanded / Collapsed event after
1813     the ItemActivated on double click, which raises the main window again. We add a second ItemActivated event to the queue, which simply
1814     raises the already displayed window.
1815    
1816     * Thuban/UI/legend.py (LegendTree.__init__): Instance variable
1817     raiseProperties initialized to prevent endless loops
1818     (LegendTree._OnItemActivated): Depending on self.raiseProperties
1819     simply raise the properties or open the dialog and issue a second
1820     event.
1821    
1822 jonathan 1235 2003-06-18 Jonathan Coles <[email protected]>
1823    
1824 jonathan 1239 * setup.py: Fix a few problems that occured under Windows.
1825    
1826     2003-06-18 Jonathan Coles <[email protected]>
1827    
1828 jonathan 1235 When Thuban loaded the map was redrawn twice because the
1829     legend was being opened after the mainwindow was created
1830     and not during its creation. This meant the map was drawn
1831     initially and then had to be redrawn when the legend
1832     caused the display to change. Now the legend is opened
1833     in the mainwindow constructor which resolves this issue.
1834    
1835     Also, although we were checking for the existence of
1836     gdal and gdalwarp modules, the gdalwarp extension was
1837     still being compiled (which may fail if the system doesn't
1838     have gdal installed). the build_ext command to setup.py
1839     now accepts the flags --with-gdal and --without-gdal.
1840     If --without-gdal is specified setup.py will try to
1841     use the gdal parameters specified by gdal-config. Under
1842     windows, those parameters have to be set in setup.py
1843     as with proj4 an wxWindows.
1844    
1845     * setup.py: Use a list instead of seperate variables for
1846     extension parameters so we can create a generic function
1847     that runs an appropriate *-config script.
1848     (run_cs_script): Renamed from run_wx_script and modified
1849     to accept a second argument which is a list of lists to
1850     be filled in by the values returned from running the command.
1851     (thuban_build_ext): New. Extends the build_ext command and
1852     provides the options --with-gdal/--without-gdal which then
1853     optionally includes the gdalwarp extension.
1854    
1855     * Thuban/Model/resource.py: First check if we can import
1856     the gdalwarp Thuban extension before checking for gdal.
1857     Also added some comments.
1858    
1859     * Thuban/UI/legend.py (ScaleBarBitmap.__SetScale): Check if
1860     the map is None which may be the case if none has been loaded
1861     yet.
1862    
1863     * Thuban/UI/main.py (main): Remove call to ShowLegend.
1864    
1865     * Thuban/UI/mainwindow.py (MainWindow.__init__): Call ShowLegend().
1866    
1867     * Thuban/UI/renderer.py: Check for gdal support before importing
1868     gdalwarp.
1869     (MapRenderer.render_map): Only try to optimize if we have gdal
1870     support otherwise nothing will get drawn.
1871    
1872 jonathan 1237 * Thuban/UI/view.py (MapCanvas.FitMapToWindow): This may be called
1873     during startup before a map has been created. Check if map is None
1874     before using it and do nothing if it is.
1875    
1876 jonathan 1224 2003-06-17 Jonathan Coles <[email protected]>
1877    
1878     Fix the problem with raster layers under Windows that caused
1879     Thuban to crash. The view should respond to layer projection
1880     changed events to update the display. Changes to a projection
1881     should not cause the map to be set to full extent.
1882    
1883     * Thuban/UI/view.py (MapCanvas.__init__): New instance variable
1884     current_map_proj to remember the current map projection so that
1885     when the projection changes we know what the previous projection
1886     was.
1887     (MapCanvas.SetMap): Unsubscribe and subscribe to
1888     LAYER_PROJECTION_CHANGED events.
1889     (MapCanvas.projection_changed): Split into two methods that respond
1890     to map and layer projection changes.
1891     (MapCanvas.map_projection_changed): New. Takes the current view and
1892     projects it using the new projection. This does not cause the
1893     map to be redrawn at full extent.
1894     (MapCanvas.layer_projection_changed): New. Cause a redraw which
1895     will draw each layer in its new projection.
1896    
1897     * extensions/thuban/bmpdataset.cpp (BMPDataset::Open): Call
1898     VSIFClose() not VSIFCloseL() to close the file. Fixes a crash
1899     under Windows.
1900    
1901     * extensions/thuban/gdalwarp.cpp (MFILENAME): Padding should be
1902     to twice sizeof(void*) because there are two digits for each
1903     hex byte.
1904    
1905 bh 1220 2003-06-16 Bernhard Herzog <[email protected]>
1906    
1907     Update to the layer interface: Direct access to the table,
1908     shapetable, shapefile and filename attributes is now actively
1909     deprecated by issuing deprecation warnings for all places where
1910     this happens.
1911    
1912     * Thuban/Model/layer.py (Layer.__getattr__): New. Implement access
1913     to the instance variables table, shapetable, shapefile and
1914     filename via __getattr__ so that we can issue a deprecation
1915     warning.
1916     (Layer.SetShapeStore): Don't set the deprecated instance variables
1917     any more
1918     (Layer.SetShapeStore): Don't use deprecated layer instance
1919     variables
1920     (Layer.Destroy): No need to explicitly remove the instance
1921     variables any more
1922     (Layer.GetFieldType, Layer.Shape): Don't use deprecated layer
1923     instance variables
1924    
1925     * Thuban/UI/classgen.py (ClassGenDialog.__init__)
1926     (GenUniformPanel._OnRetrieve, GenUniquePanel._OnRetrieve)
1927     (GenQuantilesPanel.GetList, GenQuantilesPanel.OnRetrieve): Don't
1928     use deprecated layer instance variables
1929    
1930     * Thuban/UI/classifier.py (Classifier.__init__): Don't use
1931     deprecated layer instance variables
1932    
1933     * Thuban/UI/identifyview.py (IdentifyListCtrl.selected_shape)
1934     (IdentifyGridCtrl.selected_shape): Don't set the deprecated layer
1935     instance variables
1936    
1937     * Thuban/UI/tableview.py (LayerTableGrid.select_shapes): Don't use
1938     deprecated layer instance variables
1939    
1940     * Thuban/UI/mainwindow.py (MainWindow.LayerShowTable): Don't use
1941     deprecated layer instance variables
1942    
1943     * Thuban/Model/save.py (SessionSaver.write_layer): Don't use
1944     deprecated layer instance variables
1945    
1946     * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer)
1947     (MapRenderer.polygon_render_param): Don't use deprecated layer instance
1948     variables
1949    
1950     * test/runtests.py (main): Turn Thuban's deprecation warnings into
1951     errors so that they're cought by the tests
1952    
1953     * test/test_load.py (TestSingleLayer.test): Don't use deprecated
1954     layer instance variables
1955    
1956 jonathan 1212 2003-06-16 Jonathan Coles <[email protected]>
1957    
1958     Fix a problem under Windows whereby if the user double-clicks on a
1959     layer in the legend that tree item will expand or collapse as well
1960     as open the layer properties dialog. The state of the tree item
1961     should not be affected.
1962    
1963     * Thuban/UI/legend.py (LegendTree.__init__): Add instance variable
1964     preventExpandCollapse and subscribe to expanding and collapsing
1965     events.
1966     (LegendTree.OnItemExpandCollapse): New. Responds to expanding and
1967     collapsing events and will veto the event if it has been triggered
1968     by the user double clicking on a layer.
1969     (LegendTree._OnItemActivated): Set preventExpandCollapse to indicate
1970     that an expanding/collapsing event should be vetoed.
1971    
1972 bh 1208 2003-06-13 Bernhard Herzog <[email protected]>
1973    
1974     * Thuban/UI/classifier.py (Classifier.OnClose)
1975     (Classifier.map_layers_removed)
1976     (Classifier.layer_shapestore_replaced): Unsubscribe the messages
1977     in OnClose and not in map_layers_removed or
1978     layer_shapestore_replaced to make sure it always happens when the
1979     dialog is closed
1980    
1981 jonathan 1201 2003-06-13 Jonathan Coles <[email protected]>
1982    
1983 jonathan 1203 This puts back a fix for Windows where a panel is needed so that
1984     the background of the table view appears correctly.
1985    
1986     * Thuban/UI/tableview.py (TableFrame.__init__): Add a panel
1987     object that can be used by derived classes to place any
1988     controls (including the grid) onto.
1989     (QueryTableFrame.__init__): Use the panel as the parent window
1990     for all the controls. Reparent the grid so that the panel is
1991     the parent. Call UpdateStatusText() to correctly initialize
1992     the status bar.
1993    
1994     2003-06-13 Jonathan Coles <[email protected]>
1995    
1996 jonathan 1201 * Thuban/UI/dialogs.py (ThubanFrame): New: a class that inherits
1997     from wxFrame (as opposed to wxDialog like the other classes)
1998     but otherwise behaves like the other classes. This is needed
1999     for the TableView which isn't really a dialog and needs to
2000     have a status bar and control buttons.
2001    
2002     * Thuban/UI/tableview.py (TableGrid.__init__): Create an
2003     instance variable to keep track of how many rows are selected.
2004     Subscribe once to the the events we are interested in.
2005     (ThubanGrid.OnRangeSelect): Only handle event if event handling
2006     hasn't been turned off.
2007     (ThubanGrid.OnSelectCell): Only handle event if event handling
2008     hasn't been turned off.
2009     (ThubanGrid.ToggleEventListeners): Rather than subscribe None
2010     as an event listener (which changes the event handler stack)
2011     simply set an instance variable to False. This is checked in
2012     the event handlers.
2013     (ThubanGrid.GetNumberSelected): Return the number of currently
2014     selected rows.
2015     (TableFrame): Inherit from ThubanFrame so we can have a
2016     status bar and control buttons.
2017     (QueryTableFrame.__init__): Create a status bar. Fixes RTbug #1942.
2018     Explicitly set which items are selected in the operator choice and
2019     action choice so there is always a valid selection. Fixes RTbug #1941.
2020     Subscribe to grid cell selection events so we can update the
2021     status bar.
2022     (QueryTableFrame.UpdateStatusText): Update the status bar with
2023     how many rows are in the grid, how many columns, and how many
2024     rows are selected.
2025     (QueryTableFrame.OnGridSelectRange, QueryTableFrame.OnGridSelectCell):
2026     Call UpdateStatusText when cells are (de)selected.
2027     (QueryTableFrame.OnQuery): Use the string value in the value
2028     combo if either the selected item index is 0 or if the string
2029     cannot be found in the predefined list (this happens if the
2030     user changes the text). Fixes RTbug #1940.
2031     Only turn off the grid event listeners if there a query comes
2032     back with a none empty list of ids. in the case that the list
2033     is empty this causes a grid.ClearSelection() call to actually
2034     clear the grid selection which causes the selected items in
2035     the map to be deselected. Fixes RTbug #1939.
2036    
2037     * test/test_save.py (XMLWriterTest.Encode): Check return values.
2038     Fixes RTbug #1851.
2039    
2040 bh 1195 2003-06-13 Bernhard Herzog <[email protected]>
2041    
2042     * Thuban/UI/identifyview.py (IdentifyView.__init__): Call
2043     self.selected_shape with the current selection to make sure the
2044     contents of the dialog are up to date when it's shown for the
2045     first time.
2046     The dialog used to work without this by luck. The recent fix to
2047     the connector module 'broke' a 'feature' the identify view was
2048     relying on, i.e that subscribing to a message in response to
2049     receiving a message of that type would mean that the new
2050     subscriber would also be called for the same message.
2051    
2052 jonathan 1169 2003-06-12 Jonathan Coles <[email protected]>
2053 jonathan 1175
2054 jonathan 1193 * extensions/thuban/gdalwarp.cpp: Removed debug printing as
2055     the image is rendered. Fixes RTbug #1937.
2056    
2057     2003-06-12 Jonathan Coles <[email protected]>
2058    
2059 jonathan 1191 * Thuban/Lib/fileutil.py: As is done under Windows, create the
2060 jonathan 1193 user directory if it doesn't exist on a posix system.
2061     Fixes RTbug #1815.
2062 jonathan 1191
2063     * Thuban/Model/resource.py (get_user_proj_files): Moved the
2064     called to get_application_dir here, so that the directory
2065     will only be called if this method is invoked.
2066    
2067     * Thuban/UI/projdialog.py (ProjFrame.__DoOnProjAvail): Clear
2068     the projfilepath if no projection is selected.
2069    
2070     2003-06-12 Jonathan Coles <[email protected]>
2071    
2072 jonathan 1182 * Thuban/UI/legend.py (ScaleBarBitmap.__SetScale): Don't draw
2073     the scalebar if the current map has no projection set.
2074    
2075     * Thuban/UI/projdialog.py (ProjFrame.__DoOnProjAvail): Set the
2076     projfilepath label to just the basename of the projection file
2077     rather than include the entire path.
2078    
2079     * Thuban/Model/resource.py: Fix missed proj functions that
2080     needed to be renamed.
2081    
2082     2003-06-12 Jonathan Coles <[email protected]>
2083    
2084 jonathan 1178 * Thuban/Model/classification.py: Removed assert statements that
2085     tested if the variable was an instance of Color.
2086    
2087     * Thuban/Model/color.py (Color): Remove commented code that isn't
2088     used.
2089     (Transparent): Renamed from NoColor. Doesn't inherit from Color.
2090     Fixes RTbug #1835.
2091     (Transparent.__eq__, Transparent.__ne, Transparent.__repr): New.
2092     Needed now that the class doesn't inherit from Color.
2093    
2094     2003-06-12 Jonathan Coles <[email protected]>
2095    
2096 jonathan 1175 * test/test_save.py (XMLWriterTest.testEncode): Explicitly
2097     check unicode strings.
2098    
2099     * test/test_layer.py: Check for existence of gdal.
2100    
2101     2003-06-12 Jonathan Coles <[email protected]>
2102 jonathan 1172
2103     * Thuban/Model/xmlreader.py: New. Contains the XMLReader class
2104     that was in load.py
2105 jonathan 1169
2106 jonathan 1172 * Thuban/Model/xmlwriter.py: New. Contains the XMLWriter class
2107     that was in save.py
2108    
2109     2003-06-12 Jonathan Coles <[email protected]>
2110    
2111 jonathan 1169 This is largely a collection of bug fixes. We also handle the
2112     case where gdal is not on the system. The XMLReader and XMLWriter
2113     classes were moved into there own files to resolve some circular
2114     import references and because they shouldn't really be in the
2115     file that is dediciated to reading/writing session files since
2116     they are also used elsewhere.
2117    
2118     * Thuban/Model/classgen.py: Renamed functions to follow the
2119     function_names_with_underscores style. Fixes RTbug #1903.
2120     (calculate_quantiles): Raise ValueError if 'percents' is invalid.
2121    
2122     * Thuban/Model/layer.py: Import gdal only if it available.
2123     (RasterLayer): Handle the case where the gdal library is unavailable.
2124     Addresses RTbug #1877.
2125    
2126     * Thuban/Model/load.py (XMLReader): Moved into seperate file
2127     xmlreader.py.
2128    
2129 jonathan 1172 2003-06-12 Jonathan Coles <[email protected]>
2130    
2131     This is largely a collection of bug fixes. We also handle the
2132     case where gdal is not on the system. The XMLReader and XMLWriter
2133     classes were moved into there own files to resolve some circular
2134     import references and because they shouldn't really be in the
2135     file that is dediciated to reading/writing session files since
2136     they are also used elsewhere.
2137    
2138     * Thuban/Model/classgen.py: Renamed functions to follow the
2139     function_names_with_underscores style. Fixes RTbug #1903.
2140     (calculate_quantiles): Raise ValueError if 'percents' is invalid.
2141    
2142     * Thuban/Model/layer.py: Import gdal only if it available.
2143     (RasterLayer): Handle the case where the gdal library is unavailable.
2144     Addresses RTbug #1877.
2145    
2146     * Thuban/Model/load.py (XMLReader): Moved into seperate file
2147     xmlreader.py.
2148    
2149 jonathan 1169 * Thuban/Model/save.py (escape, XMLWriter): Moved into seperate
2150     file xmlwriter.py.
2151    
2152     * Thuban/Model/resource.py: Renamed functions to following the
2153     function_names_with_underscores style.
2154     (has_gdal_support): New function that returns true if the gdal
2155     library is available. Addresses RTbug #1877.
2156    
2157     * Thuban/UI/application.py (ThubanApplication.OpenSession):
2158     Display a message box if the gdal library is not available, but
2159     only if there are any layers that would use it. Addresses RTbug #1877.
2160    
2161     * Thuban/UI/classgen.py: Use renamed projection resource functions.
2162     (GenUniformPanel.__CalcStepping): Fix a slight discrepency
2163     when using integers versus floats.
2164    
2165     * Thuban/UI/mainwindow.py (_has_gdal_support): New. Used to
2166     determine if the "Add Image Layer" menu option should be
2167     greyed out or not. Addresses RTbug #1877.
2168    
2169     * Thuban/UI/projdialog.py: Use renamed projection resource functions.
2170    
2171     * Thuban/UI/renderer.py (MapRenderer.render_map): Only try to
2172     optimize if a raster layer is visible. Fixes RTbug #1931.
2173     Only draw the raster layer if the gdal library is available.
2174     Addresses RTbug #1877.
2175    
2176     * test/test_classgen.py: Add tests for generate_singletons,
2177     generate_uniform_distribution, generate_quantiles. Fixes RTbug #1903.
2178     (test_calculate_quantiles): Fix some tests to catch the new
2179     ValueError that is raised.
2180    
2181     * test/test_proj.py: Use renamed projection resource functions.
2182    
2183     * test/test_save.py (SaveSessionTest.testClassifiedLayer): New
2184     test for saving classified layers. Fixes RTbug #1902.
2185     (XMLWriterTest): New. Tests the XMLWriter class. Fixes RTbug #1851.
2186    
2187 jan 1156 2003-06-12 Jan-Oliver Wagner <[email protected]>
2188    
2189     Fix for http://intevation.de/rt/webrt?serial_num=1900.
2190    
2191     * Thuban/UI/multiplechoicedialog.py: New. A multiple choice dialog.
2192    
2193     * Thuban/UI/mainwindow.py: import wxMultipleChoiceDialog from
2194     multiplechoicedialog.py rather than from the wxPython library.
2195    
2196 frank 1151 2003-06-11 Frank Koormann <[email protected]>
2197    
2198 frank 1152 * Thuban/Lib/fileutil.py (get_application_dir): Minor stability
2199     update.
2200    
2201     2003-06-11 Frank Koormann <[email protected]>
2202    
2203 frank 1151 * Thuban/Lib/fileutil.py (get_application_dir): New function to
2204     determine the absolute .thuban/thuban directory under
2205     "posix" (os.expanduser) and "nt" (read AppData registry key).
2206    
2207     * Thuban/Model/resource.py: Use get_application_dir
2208    
2209     * Thuban/UI/application.py (ThubanApplication.read_startup_files):
2210     Use get_application_dir.
2211    
2212 bh 1143 2003-06-10 Bernhard Herzog <[email protected]>
2213    
2214 bh 1147 * Thuban/UI/tableview.py (LayerTableFrame.__init__): Subscribe to
2215     the messages MAP_LAYERS_REMOVED messages
2216     (LayerTableFrame.OnClose): Unsubscribe from it.
2217     (LayerTableFrame.map_layers_removed): New. Receiver for
2218     MAP_LAYERS_REMOVED. Close the dialog when the layer whose the
2219     dialog is showing is removed.
2220    
2221     2003-06-10 Bernhard Herzog <[email protected]>
2222    
2223 bh 1145 * Thuban/Lib/connector.py (Connector.Issue): Iterate over a copy
2224     of the receivers list so that unsubscribing in a receiver doesn't
2225     modify it while iterating over it.
2226    
2227     * test/test_connector.py
2228     (ConnectorTest.test_disconnect_in_receiver): New. Test whether
2229     unsubscribing in a receiver works correctly. See docstring for
2230     details
2231    
2232     2003-06-10 Bernhard Herzog <[email protected]>
2233    
2234 bh 1143 * Thuban/Model/messages.py (LAYER_SHAPESTORE_REPLACED): New
2235     message.
2236    
2237     * Thuban/Model/layer.py (Layer.SetShapeStore): Send
2238     LAYER_SHAPESTORE_REPLACED when the shapestore changes. A
2239     LAYER_CHANGED will still be sent if the classification changes.
2240    
2241     * Thuban/UI/classifier.py (Classifier.__init__): Add the map as
2242     parameter so we can subscribe to some of its messages
2243     (Classifier.__init__): Subscribe to the map's MAP_LAYERS_REMOVED
2244     and the layer's LAYER_SHAPESTORE_REPLACED
2245     (Classifier.unsubscribe_messages): New. Unsubscribe from message
2246     subscribed to in __init__
2247     (Classifier.map_layers_removed)
2248     (Classifier.layer_shapestore_replaced): receivers for the messages
2249     subscribed to in __init__. Unsubscribe and close the dialog
2250    
2251     * Thuban/UI/mainwindow.py (MainWindow.OpenLayerProperties): Pass
2252     the map to the Classifier dialog
2253    
2254     * test/test_layer.py (SetShapeStoreTests): Derive from
2255     SubscriberMixin as well so we can test messages
2256     (SetShapeStoreTests.setUp): Subscribe to some of the layer's
2257     messages
2258     (SetShapeStoreTests.tearDown): Clear the messages again
2259     (SetShapeStoreTests.test_sanity): Expand the doc-string and check
2260     for the modified flag too
2261     (SetShapeStoreTests.test_set_shape_store_modified_flag): New test
2262     to check whether SetShapeStore sets the modified flag
2263     (SetShapeStoreTests.test_set_shape_store_different_field_name)
2264     (SetShapeStoreTests.test_set_shape_store_same_field)
2265     (SetShapeStoreTests.test_set_shape_store_same_field_different_type):
2266     Add tests for the messages. This checks both the new
2267     LAYER_SHAPESTORE_REPLACED and the older LAYER_CHANGED
2268    
2269 jan 1141 2003-06-06 Jan-Oliver Wagner <[email protected]>
2270    
2271     * Thuban/UI/mainwindow.py: Improved and partly added help texts for
2272     the menu items.
2273    
2274 frank 1134 2003-06-05 Frank Koormann <[email protected]>
2275    
2276 frank 1139 * Thuban/UI/identifyview.py (IdentifyView.__init__):
2277     Layout reimplemented without panel. Make life easier to fit the list
2278     in the dialog.
2279    
2280     2003-06-05 Frank Koormann <[email protected]>
2281    
2282 frank 1137 * Thuban/UI/projdialog.py (ProjFrame.__init__): Fill the projchoice
2283     once on initialisation (Former implementation resulted in multiple
2284     entries for each projection).
2285     (ProjFrame.__FillAvailList): selectProj as second optional parameter,
2286     if set, select the projection found under the specified name. This
2287     overwrites any other selection estimate.
2288     Removed projchoice filling from this method.
2289     (ProjFrame._OnSave, ProjFrame._OnAddToList):
2290     Updated call of ProjFrame.__FillAvailList
2291     (LCCPanel._DoLayout): Moved parameter controls in more common order.
2292    
2293     * Resources/Projections/defaults.proj: Extended defaults representing
2294     various common European projections.
2295    
2296     2003-06-05 Frank Koormann <[email protected]>
2297    
2298 frank 1134 * Thuban/UI/identifyview.py (IdentifyView.__init__):
2299     Use ListCtrl instead of GridCtrl
2300    
2301     * Thuban/Model/resource.py:
2302     Guess location of .thuban directory from tempdir parent directory.
2303    
2304     * Thuban/UI/application.py (ThubanApplication.read_startup_files):
2305     Guess location of .thuban directory from tempdir parent directory.
2306    
2307 bh 1130 2003-06-04 Bernhard Herzog <[email protected]>
2308    
2309     Do not cache the values returned by the tree widget's
2310     GetFirstChild and GetNextChild methods because it led to lots of
2311     segfaults. The new way requires more brute force but is more
2312     reliable.
2313    
2314     * Thuban/UI/legend.py (LegendTree.__init__): Remove instance
2315     variable layer2id
2316     (LegendTree.find_layer): New method to do with brute force what
2317     layer2id tried to accomplish
2318     (LegendTree._OnMsgLayerChanged)
2319     (LegendTree._OnMsgLayerTitleChanged, LegendTree.__ShowHideLayer):
2320     Use find_layer instead of layer2id
2321     (LegendTree.__RemoveLayer, LegendTree.__AddLayer): No need to
2322     update layer2id anymore
2323     (LegendTree._OnMsgMapLayersRemoved)
2324     (LegendTree._OnMsgMapLayersAdded): Get by without layer2id.
2325    
2326 tkoester 1128 2003-06-03 Thomas Koester <[email protected]>
2327    
2328     * Thuban/Model/classgen.py (GenQuantiles0): New function.
2329    
2330 bh 1120 2003-06-02 Bernhard Herzog <[email protected]>
2331    
2332 bh 1127 * Thuban/UI/mainwindow.py (layer_rename command, table_rename command):
2333     New commands.
2334     (main_menu): Add the new commands.
2335     (MainWindow.TableRename): New. Implementation of the table_rename
2336     command.
2337     (MainWindow.RenameLayer): New. Implementation of the layer_rename
2338     command.
2339    
2340     * Thuban/Model/session.py (Session.AddTable): call self.changed to
2341     set the modified flag
2342    
2343     * test/test_session.py (TestSessionSimple.test_add_table): Test
2344     whether the modified flag is set properly
2345    
2346     * Thuban/Model/base.py (TitledObject.SetTitle): Call changed
2347     instead of issue so that the modified flags get updated.
2348    
2349     * test/test_base.py (SomeTitledObject): Derive from Modifiable
2350     instead of Publisher to reflect reality better and to accomodate
2351     the fact that SetTitle now calls changed instead of issue
2352    
2353     2003-06-02 Bernhard Herzog <[email protected]>
2354    
2355     * Thuban/UI/classgen.py (GenQuantilesPanel.GetList): Resource
2356     acquisition has to happen before the try in a try-finally.
2357    
2358     2003-06-02 Bernhard Herzog <[email protected]>
2359    
2360 bh 1120 * Thuban/UI/legend.py (LegendTree._OnMsgMapLayersRemoved): It's
2361     possible that a layer is removed that is not currently selected in
2362     the legend so don't check for this.
2363    
2364 bh 1112 2003-05-30 Bernhard Herzog <[email protected]>
2365    
2366 bh 1118 * Thuban/Model/layer.py (Layer.Destroy): Set all instance
2367     variables to None that have direct or indirect references to
2368     shapefiles or dbf files to make sure that they do go away and the
2369     files are closed.
2370    
2371     2003-05-30 Bernhard Herzog <[email protected]>
2372    
2373 bh 1116 * Thuban/UI/legend.py (LegendTree.GetRootItem): Reset
2374     availImgListIndices when a new image list is created
2375    
2376     2003-05-30 Bernhard Herzog <[email protected]>
2377    
2378 bh 1114 * Thuban/UI/legend.py (LegendTree.__init__): New instance variable
2379     changing_selection to indicate whether the LegendTree code itself
2380     is currently changing the selection
2381     (LegendTree.normalize_selection): New method to normalize the
2382     selection by selecting the layer item even if the user clicked on
2383     the classification.
2384     (LegendTree._OnSelChanged): normalize the selection. This works
2385     around a bug in wx which doesn't keep track of the selection
2386     properly when subtrees are deleted.
2387    
2388     2003-05-30 Bernhard Herzog <[email protected]>
2389    
2390 bh 1112 * Thuban/UI/view.py (MapCanvas.set_view_transform): Limit the
2391     maximum and minimum scale factors.
2392    
2393     * test/test_classgen.py (ClassGenTest.test): Update to reflect the
2394     changes in classgen.py
2395    
2396 jonathan 1109 2003-05-30 Jonathan Coles <[email protected]>
2397    
2398     * Thuban/Model/classgen.py: Remove ClassGenerator class but make
2399     all the methods functions. Fixes RTBug #1903.
2400    
2401     * Thuban/Model/map.py (Map.TopLayer, Map.BottomLayer): Renamed
2402     to MoveLayerToTop and MoveLayerToBottom respectively. Fixes
2403     RTBug #1907.
2404    
2405     * Thuban/UI/classgen.py: Use classgen functions that were part
2406     of the ClassGenerator class. Put try/finally blocks around
2407     code that uses wxBeginBusyCursor()/wxEndBusyCursor(). Fixes
2408     RTBug #1904.
2409    
2410     * Thuban/UI/classifier.py: Remove unused import of ClassGenerator.
2411    
2412     * Thuban/UI/legend.py: The legend was cleared and repopulated any
2413     time something changed which caused some state to be lost such
2414     as which children were expanded or collapsed. Fixes RTBug #1901.
2415     (LegendTree._OnMsgMapLayersAdded): Add only new layers.
2416     (LegendTree.__OnMsgMapLayersRemoved): Remove layers that exist in
2417     the legend but not in the map.
2418     (LegendTree.__FillTree): Move main functionality out into smaller
2419     methods that can be used by other methods.
2420     (LegendTree.__FillTreeLayer): Reuse old slots in the image list
2421     if they are available.
2422     (LegendTree.DeleteAllItems): Renamed from __DeleteAllItems so
2423     that we override the wxTreeCtrl method. Iterate over children
2424     and call __RemoveLayer.
2425     (LegendTree.__AddLayer): New. Add a new layer to the legend.
2426     (LegendTree.__RemoveLayer): Remove a layer from the legend.
2427     (LegendTree.DeleteChildren): New, overrides wxTreeCtrl method.
2428     Should only be called with the id of a layer branch.
2429     (LegendTree.GetRootItem): New, overrides wxTreeCtrl method.
2430     Returns the root item or creates one if necessary.
2431    
2432     * Thuban/UI/renderer.py (MapRenderer.draw_raster_layer): Call
2433     ProjectRasterFile with tuple arguments instead of strings.
2434    
2435     * Thuban/UI/tableview.py (QueryTableFrame.OnQuery): Wrap code
2436     with try/finally. Fixes RTBug #1904.
2437    
2438     * Thuban/UI/view.py (MapCanvas.OnPaint): Wrap code
2439     with try/finally. Fixes RTBug #1904.
2440     (MapCanvas.FitSelectedToWindow): If a single point is selected
2441     simply center it on the display. Fixes RTBug #1849.
2442    
2443     * extensions/thuban/gdalwarp.cpp: Removed code that allowed gdalwarp
2444     to be compiled as a standalone app. Now the code can only be
2445     called from Python which simplifies the parameter passing.
2446     (ProjectRasterFile): Handle Python arguments. Remove code that
2447     checks for a destination dataset. Add more clean up code.
2448    
2449     * test/test_map.py (TestMapWithContents.test_raise_layer_top,
2450     TestMapWithContents.test_lower_layer_bottom):
2451     Test Map.MoveLayerToTop() and Map.MoveLayerToBottom() respectively.
2452     Fixes RTBug #1907.
2453    
2454     * Thuban/UI/mainwindow.py (MainWindow.ToggleLegend): Apply a full
2455     extent to the map when the legend is toggled. Fixes RTBug #1881.
2456    
2457 jan 1097 2003-05-29 Jan-Oliver Wagner <[email protected]>
2458    
2459     * Thuban/UI/tableview.py (LayerTableFrame.OnClose): Bug-fix: Now
2460     unsubscribes all that is subcribed in __init__.
2461    
2462 bh 1089 2003-05-28 Bernhard Herzog <[email protected]>
2463    
2464 bh 1095 * Thuban/UI/mainwindow.py (MainWindow.DuplicateLayer)
2465     (MainWindow.CanDuplicateLayer): New methods to implement the
2466     Layer/Duplicate command.
2467     (layer_duplicate command): New.
2468     (main_menu): Add layer_duplicate to the Layer menu.
2469    
2470     2003-05-28 Bernhard Herzog <[email protected]>
2471    
2472 bh 1093 * Thuban/UI/tableview.py (NullRenderer.Draw): New. Our own
2473     renderer so that NULL/None values get displayed differently (by a
2474     gray rectangle).
2475     (TableGrid.__init__): Override the default renderers
2476    
2477     2003-05-28 Bernhard Herzog <[email protected]>
2478    
2479 bh 1089 * Thuban/Model/layer.py (Layer.SetShapeStore): Set the
2480     classification to "None" if the type of the field has changed.
2481    
2482     * test/test_layer.py (SetShapeStoreTests): New. Class with a few
2483     test for the Layer.SetShapeStore method
2484    
2485 jan 1087 2003-05-28 Jan-Oliver Wagner <[email protected]>
2486 jan 1085
2487 jan 1087 * Thuban/Model/layer.py (Layer.TreeInfo): Fixed a bug (a layer
2488     does not necessarily have a filename).
2489    
2490     2003-05-28 Jan-Oliver Wagner <[email protected]>
2491    
2492 jan 1085 * Thuban/UI/mainwindow.py (MainWindow.TableClose, MainWindow.TableShow):
2493     sort the selection list for the dialog.
2494    
2495 frank 1083 2003-05-28 Frank Koormann <[email protected]>
2496    
2497     * extensions/thuban/wxproj.cpp
2498     (project_point): Removed cast to int for projected point coordinates.
2499     (shape_centroid): Return last point if all polygon vertices fall
2500     to one point.
2501    
2502 bh 1079 2003-05-28 Bernhard Herzog <[email protected]>
2503    
2504 bh 1081 * Thuban/UI/mainwindow.py (_can_unjoin): Add doc-string and cope
2505     with layers that don't have shapestores, i.e. raster layers.
2506    
2507     2003-05-28 Bernhard Herzog <[email protected]>
2508    
2509 bh 1079 * Thuban/Model/table.py (DBFTable.__init__): Omit the extension
2510     when determining the title from the filename.
2511    
2512     * test/test_dbf_table.py (TestDBFTable.test_title): Update to
2513     reflect changes in the way the title is derived from the filename
2514    
2515 frank 1077 2003-05-28 Frank Koormann <[email protected]>
2516    
2517     * Thuban/UI/mainwindow.py (MainWindow.TableShow):
2518     Added wxDEFAULT_DIALOG_STYLE to show table dialog styles.
2519    
2520 bh 1069 2003-05-27 Bernhard Herzog <[email protected]>
2521    
2522 bh 1075 * Thuban/UI/mainwindow.py (MainWindow.delegated_messages): Also
2523     delegate SelectedLayer.
2524     (MainWindow.LayerUnjoinTable): Implement.
2525     (_can_unjoin): New. Helper function for the sensitivity of the
2526     layer/unjoin command.
2527    
2528     * Thuban/Model/data.py (ShapefileStore.OrigShapeStore)
2529     (DerivedShapeStore.OrigShapeStore): New. Return the original
2530     shapestore. Used to figure out how to unjoin.
2531     (DerivedShapeStore.Shapefile): Fix a typo.
2532    
2533     2003-05-27 Bernhard Herzog <[email protected]>
2534    
2535 bh 1073 * Thuban/UI/join.py (JoinDialog): Extend to handle layer joins as
2536     well
2537     (JoinDialog.__init__): Use the layer parameter and only build the
2538     left choice when a layer is given
2539     (JoinDialog.OnJoin): Handle layer joins as well
2540     (JoinDialog.OnLeftTable, JoinDialog.OnRightTable): Handle the case
2541     that the user selects the "Select..." item. The sensitivitly
2542     updating is now in update_sensitivity
2543     (JoinDialog.y): New method to refactor the sensitivity update of
2544     the join button into its own method.
2545    
2546     * Thuban/UI/mainwindow.py (MainWindow.LayerJoinTable): Implement.
2547    
2548     2003-05-27 Bernhard Herzog <[email protected]>
2549    
2550 bh 1071 * Thuban/UI/mainwindow.py (table_close command): Make it sensitive
2551     iff there are unreferenced tables in the session
2552    
2553     2003-05-27 Bernhard Herzog <[email protected]>
2554    
2555 bh 1069 * Thuban/Model/messages.py (TABLE_REMOVED): New message.
2556    
2557     * Thuban/Model/session.py (Session.UnreferencedTables): New method
2558     to return tables that are not referenced by other tables or shape
2559     stores and can be removed.
2560     (Session.RemoveTable): Issue a TABLE_REMOVED message after
2561     removing the table
2562    
2563     * Thuban/UI/mainwindow.py: Remove unused imports
2564     (MainWindow.TableClose): Implement.
2565    
2566     * Thuban/UI/tableview.py (TableFrame.__init__): Subscribe to some
2567     messages so that the frame will be automatically closed when a new
2568     session is opened or the table is removed.
2569     (TableFrame.OnClose): Unsubscribe the Subscriptions made in
2570     __init__
2571     (TableFrame.close_on_session_replaced)
2572     (TableFrame.close_on_table_removed): New. Subscribers that close
2573     the window
2574    
2575     * test/test_session.py (TestSessionMessages.test_remove_table)
2576     (TestSessionSimple.test_remove_table): Move the test to
2577     TestSessionSimple and add test for the TABLE_REMOVED message
2578     (TestSessionBase.setUp): Also subscribe to TABLE_REMOVED
2579     (TestSessionSimple.test_unreferenced_tables) New. Test for the
2580     UnreferencedTables method.
2581     (UnreferencedTablesTests): New. Class with some more sophisticated
2582     tests for UnreferencedTables.
2583    
2584 frank 1065 2003-05-27 Frank Koormann <[email protected]>
2585    
2586 frank 1067 * Thuban/UI/tableview.py (QueryTableFrame.__init__): The "_S_election"
2587     display has some unwanted side effects. Removed again.
2588    
2589     2003-05-27 Frank Koormann <[email protected]>
2590    
2591 frank 1065 * Resources/Bitmaps/legend_icon_layer.xpm: New, icon for legend.
2592    
2593     * Thuban/UI/legend.py (LegendTree.__FillTree): Use "legend_icon_layer"
2594    
2595 jan 1062 2003-05-27 Jan-Oliver Wagner <[email protected]>
2596    
2597 bh 1069 * test/test_menu.py (MenuTest.test): Added test for
2598     Menu.RemoveItem().
2599 jan 1062
2600 bh 1069 * Thuban/UI/menu.py (Menu.RemoveItem): New. Remove an item from
2601     the menu.
2602 jan 1062
2603 frank 1059 2003-05-27 Frank Koormann <[email protected]>
2604    
2605     Nonmodal dialogs without parent (i.e. they can fall behind the main
2606     window)
2607    
2608     * Thuban/UI/mainwindow.py (MainWindow.OnClose): Explicitly destroy
2609     all dialogs in the dialogs dictionary and the canvas.
2610    
2611     * Thuban/UI/dialogs.py (NonModalNonParentDialog): New class, without
2612     parent, i.e. can fall behind other windows.
2613     (NonModalDialog.OnClose): Check is dialog is in mainwindow.dialog
2614     dictionary before removing it.
2615    
2616     * Thuban/UI/classifier.py: Dialog derived from NonModalNonParentDialog
2617    
2618     * Thuban/UI/projdialog.py: Dialog derived from NonModalNonParentDialog
2619     * Thuban/UI/tableview.py: Dialog derived from NonModalNonParentDialog
2620     * Thuban/UI/tree.py: Dialog derived from NonModalNonParentDialog
2621    
2622 bh 1053 2003-05-27 Bernhard Herzog <[email protected]>
2623    
2624 bh 1055 * Thuban/UI/mainwindow.py (MainWindow.ShowTableView): New. Open a
2625     tableview dialog
2626     (MainWindow.TableShow): Use ShowTableView to open the dialogs.
2627     Also, don't use the table's titles as the dialog names. The titles
2628     aren't guaranteed to be unique.
2629     (MainWindow.TableOpen): Open a table view dialog after opening the
2630     table
2631    
2632     2003-05-27 Bernhard Herzog <[email protected]>
2633    
2634 bh 1053 * Thuban/UI/mainwindow.py: Remove the Table/Hide menu item. Its
2635     effect can be achieved by simply closing the window showing the
2636     table.
2637     (MainWindow.TableHide): Removed.
2638     (main_menu): Removed "table_hide"
2639    
2640 frank 1051 2003-05-27 Frank Koormann <[email protected]>
2641    
2642     Fix legend tree display problems under Win32
2643    
2644     * Thuban/UI/legend.py: BMP_SIZE_W = 15
2645     (LegendTree.__FillTree): Display "legend_icon_map.xpm" with layer title.
2646     (LegendTree.__FillTreeLayer): Explicitely set SelectedImage.
2647    
2648     * Resources/Bitmaps/legend_icon_map.xpm: New icon for legend.
2649    
2650 jan 1048 2003-05-27 Jan-Oliver Wagner <[email protected]>
2651    
2652     * Thuban/UI/menu.py (Menu.InsertSeparator): Additional optional parameter
2653     'after' now allows to insert separators almost anywhere in the menu.
2654    
2655 frank 1046 2003-05-27 Frank Koormann <[email protected]>
2656    
2657     * Thuban/UI/tableview.py (QueryTableFrame.__init__): Underline the
2658     "S" of selection box label to hint on hot key (Alt-S). Works under
2659     Win32 but is ignored under GTK.
2660    
2661     2003-05-26 Frank Koormann <[email protected]>
2662    
2663     * Thuban/UI/projdialog.py (ProjFrame.__do_layout, ProjPanel._DoLayout):
2664     Center Choices.
2665    
2666 bh 1038 2003-05-26 Bernhard Herzog <[email protected]>
2667    
2668 bh 1044 Remove the Precision methods again. They're too DBF specific to be
2669     part of the table interface and they're only used in table_to_dbf
2670     anyway.
2671    
2672     * Thuban/Model/transientdb.py (TransientTableBase.Width):Use a
2673     fixed precision of 12 for doubles.
2674     (TransientTableBase.Precision): Removed
2675     (AutoTransientTable.Width): Delegate to self.table.
2676    
2677     * Thuban/Model/table.py (DBFTable.Precision)
2678     (MemoryTable.Precision): Removed.
2679     (MemoryTable.Width): Use a fixed precision of 12 for doubles.
2680     (table_to_dbf): Use a fixed precision of 12 for floats unless the
2681     column object specifies something else.
2682    
2683     * test/test_dbf_table.py (TestTableToDBF.test_table_to_dbf): New.
2684     test for table_to_dbf
2685    
2686     2003-05-26 Bernhard Herzog <[email protected]>
2687    
2688     * test/test_transientdb.py
2689     (TestTransientTable.run_iceland_political_tests): Fix a comment.
2690    
2691     2003-05-26 Bernhard Herzog <[email protected]>
2692    
2693 bh 1038 * Thuban/UI/mainwindow.py (MainWindow.TableOpen): Real
2694     implementation. Mark parts of the file format strings for
2695     localization.
2696    
2697     * Thuban/Model/session.py (Session.OpenTableFile): New. Open a dbf
2698     file and add the table to the tables managed by the session
2699    
2700 bh 1040 * test/test_session.py (TestSessionSimple.test_open_table_file):
2701     New. test case for OpenTableFile
2702    
2703 jan 1033 2003-05-26 Jan-Oliver Wagner <[email protected]>
2704    
2705 jan 1035 * Thuban/UI/controls.py, Thuban/UI/identifyview.py, Thuban/UI/join.py,
2706     Thuban/UI/labeldialog.py, Thuban/UI/mainwindow.py,
2707     Thuban/UI/proj4dialog.py, Thuban/UI/tableview.py, Thuban/UI/view.py:
2708     Replace the true/false of wxWindows by True/False of Python 2.2.1.
2709    
2710     2003-05-26 Jan-Oliver Wagner <[email protected]>
2711    
2712 bh 1038 * Thuban/UI/tableview.py (LayerTableFrame.__init__): If there is
2713     already a selection present, update the grid accordingly.
2714 jan 1033
2715     * Thuban/UI/mainwindow.py (MainWindow.TableShow): Make the dialog
2716     resizeable and increase its initial size.
2717    
2718 frank 1030 2003-05-26 Frank Koormann <[email protected]>
2719    
2720     Table export functionality
2721    
2722     * Thuban/Model/table.py (DBFTable.Width, MemoryTable.Width):
2723     Return width (in characters) for a column.
2724     (DBFTable.Precision, MemoryTable.Precision): Return decimal precision.
2725     (table_to_dbf): Write table to dbf file.
2726     (table_to_csv): Write table to csv file.
2727    
2728     * Thuban/Model/transientdb.py (TransientTableBase.Width,
2729     TransientTableBase.Precision): Return column width and precision.
2730    
2731     * Thuban/UI/tableview.py (QueryTableFrame.OnSaveAs): Call table_to_dbf
2732     or table_to_csv depending on file selection.
2733    
2734     * test/test_dbf_table.py:
2735     Test table_to_dbf (extension of former part of test).
2736    
2737     * test/test_csv_table.py:
2738     Test table_to_csv.
2739    
2740 jan 1021 2003-05-23 Jan-Oliver Wagner <[email protected]>
2741    
2742 jan 1024 * Thuban/UI/join.py (JoinDialog.OnJoin): Use _() for strings.
2743     Use QueryTableFrame instead of TableFrame.
2744 jan 1021
2745 jan 1024 * Thuban/UI/mainwindow.py (MainWindow.LayerShowTable): Prefix the
2746     table window with 'Layer Table:' instead of 'Table:'.
2747    
2748     2003-05-23 Jan-Oliver Wagner <[email protected]>
2749    
2750     Give all tables a title via mix-in TitledObject.LayerShowTable
2751    
2752 jan 1021 * Thuban/Model/base.py (TitledObject.SetTitle): Call method 'issue'
2753     only if it exists.
2754    
2755     * Thuban/Model/table.py (DBFTable, MemoryTable): mix-in TitledObject
2756     and call its init-method with a default title. Remove Title() method.
2757    
2758     * Thuban/Model/transientdb.py (TransientTable, TransientJoinedTable,
2759     AutoTransientTable): mix-in TitledObject and call its init-method with
2760     a default title. Remove Title() method.
2761    
2762 bh 1017 2003-05-23 Bernhard Herzog <[email protected]>
2763    
2764     * Thuban/Model/session.py (Session.AddShapeStore): Define
2765     AddShapeStore analogously to AddTable.
2766    
2767     * test/test_session.py (TestSessionSimple.test_add_shapestore):
2768     New. Test for AddShapeStore
2769    
2770 jan 1015 2003-05-23 Jan-Oliver Wagner <[email protected]>
2771    
2772     Introducing QueryTableFrame and a very coarse ShowTable implementation.
2773    
2774     * Thuban/UI/tableview.py (LayerTableFrame, QueryTableFrame): Split the
2775     class LayerTableFrame into two classes, LayerTableFrame and QueryTableFrame.
2776     The latter implements the selection GUI without dependency on a layer.
2777     LayerTableFrame now is derived from QueryTableFrame and connects
2778     to a layer.
2779    
2780     * Thuban/UI/mainwindow.py (MainWindow.TableShow): A very coarse
2781     implementation that still needs work.
2782    
2783     * Thuban/Model/layer.py (Layer.TreeInfo): Added filename.
2784    
2785 frank 1011 2003-05-22 Frank Koormann <[email protected]>
2786    
2787     * Thuban/Model/transientdb.py (TransientJoinedTable.__init__):
2788     Added "outer_join = False" as optional parameter.
2789     (TransientJoinedTable.create): If outer join is true, perform a
2790     "LEFT OUTER JOIN" instead of "JOIN", which preserves all records of
2791     the left table. Records not matching are filled with 0 / None.
2792    
2793     * Thuban/UI/join.py (JoinDialog.__init__): Checkbox for outer join.
2794     (JoinDialog.OnJoin): Consider outer join check box.
2795    
2796 bh 1006 2003-05-22 Bernhard Herzog <[email protected]>
2797    
2798 bh 1008 * Thuban/UI/join.py (JoinDialog.OnJoin): Use exc_info in a
2799     somewhat safer way. Storing the traceback in a local variable can
2800     lead to memory leaks
2801    
2802     2003-05-22 Bernhard Herzog <[email protected]>
2803    
2804 bh 1006 * Thuban/UI/join.py (JoinDialog.OnJoin): Make sure to really call
2805     the wxMessageDialog's Destroy() method.
2806    
2807 frank 1004 2003-05-22 Frank Koormann <[email protected]>
2808    
2809     * Thuban/UI/join.py (JoinDialog.__init__): Make use of
2810     TransientTable.Title()
2811    
2812     2003-05-22 Frank Koormann <[email protected]>
2813    
2814     Join Dialog, initial version.
2815    
2816     * Thuban/UI/mainwindow.py (MainWindow.TableJoin): Removed print.
2817    
2818     * Thuban/UI/join.py (JoinDialog): Functional implementation of
2819     former framework. Renamed Table1/Table2 to LeftTable/RightTable
2820     in all occurences.
2821    
2822     * Thuban/Model/transientdb.py (TransientJoinedTable.__doc__):
2823     Typo fixed.
2824    
2825 bh 995 2003-05-22 Bernhard Herzog <[email protected]>
2826    
2827 bh 999 Give the tables titles so that the GUI can display more meaningful
2828     names. For now the titles are fixed but depend on e.g. filenames
2829     or the titles of the joined tables.
2830    
2831     * Thuban/Model/transientdb.py (TransientTable.Title)
2832     (TransientJoinedTable.Title, AutoTransientTable.Title): New.
2833    
2834     * Thuban/Model/table.py (DBFTable.Title, MemoryTable.Title): New.
2835    
2836     * test/test_transientdb.py
2837     (TestTransientTable.test_auto_transient_table_title): New. Test
2838     for the Title method
2839     (TestTransientTable.test_transient_joined_table)
2840     (TestTransientTable.test_transient_table): Add test for the Title
2841     methods
2842    
2843     * test/test_memory_table.py (TestMemoryTable.test_title): New.
2844     Test for the Title method
2845    
2846     * test/test_dbf_table.py (TestDBFTable.test_title): New. Test for
2847     the Title method
2848    
2849     2003-05-22 Bernhard Herzog <[email protected]>
2850    
2851 bh 997 * test/test_layer.py (TestLayer.setUp, TestLayer.tearDown):
2852     Provide a better way to destroy the layers
2853     (TestLayer.test_base_layer, TestLayer.test_arc_layer)
2854     (TestLayer.test_point_layer, TestLayer.test_empty_layer)
2855     (TestLayer.test_polygon_layer, TestLayer.test_get_field_type): Use
2856     the new way to destroy the layers.
2857     (TestLayer.test_derived_store): New. Test for using a layer with a
2858     DerivedShapeStore
2859    
2860     * Thuban/Model/layer.py (Layer.SetShapeStore): Only set the
2861     filename if the shape store actually has one.
2862    
2863     2003-05-22 Bernhard Herzog <[email protected]>
2864    
2865 bh 995 * Thuban/Model/table.py (DBFTable.FileName): New. Accessor method
2866     for the filename
2867    
2868     * test/test_dbf_table.py (TestDBFTable.test_filename): New. Test
2869     for the FileName method
2870     (TestDBFTableWriting.test_write): Fix spelling of filename
2871    
2872 tkoester 993 2003-05-22 Thomas Koester <[email protected]>
2873    
2874     * Thuban/Model/range.py, test/test_range.py: Brought over new Range
2875     from SciParam that now really is immutable.
2876    
2877 frank 992 2003-05-22 Frank Koormann <[email protected]>
2878    
2879     Layer Top/Bottom placement added to legend.
2880    
2881     * Thuban/UI/legend.py
2882     (LegendPanel._OnMoveTop(), LayerPanel._OnMoveBottom): New, methods
2883     bound to tool events.
2884     (LegendTree.MoveCurrentItemTop(), LegendTree.MoveCurrentItemBottom):
2885     New, methods binding the event methods with the map methods.
2886    
2887     * Thuban/Model/map.py (Map.TopLayer(), Map.BottomLayer()): New, place
2888     layer at top/bottom of layer stack.
2889    
2890     * Resources/Bitmaps/top_layer.xpm: New button icon.
2891    
2892     * Resources/Bitmaps/bottom_layer.xpm: New button icon.
2893    
2894 bh 988 2003-05-22 Bernhard Herzog <[email protected]>
2895    
2896     * Thuban/Model/session.py (Session.RemoveTable): New method to
2897     remove tables
2898    
2899     * test/test_session.py (TestSessionSimple.test_remove_table): New.
2900     Test for RemoveTable
2901    
2902 tkoester 986 2003-05-22 Thomas Koester <[email protected]>
2903    
2904     * Thuban/Model/classgen.py: Added short module doc string and CVS id.
2905     (ClassGenerator.GenUniformDistribution): Use new Range __init__, too.
2906    
2907 bh 983 2003-05-22 Bernhard Herzog <[email protected]>
2908    
2909 bh 985 Implement a way to discover dependencies between tables and
2910     shapestores.
2911    
2912     * Thuban/Model/transientdb.py (TransientTableBase.Dependencies)
2913     (TransientJoinedTable.Dependencies)
2914     (AutoTransientTable.SimpleQuery): New. Implement the dependencies
2915     interface
2916     (TransientJoinedTable.__init__): Keep tack of the original table
2917     objects in addition to the corresponding transient tables.
2918    
2919     * Thuban/Model/table.py (DBFTable.Dependencies)
2920     (MemoryTable.Dependencies): New. Implement the dependencies
2921     interface
2922    
2923     * Thuban/Model/data.py (ShapeTable): New. Helper class for
2924     ShapefileStore
2925     (ShapefileStore.__init__): Use ShapeTable instead of
2926     AutoTransientTable
2927     (ShapefileStore.Table, ShapefileStore.Shapefile): Add doc-strings
2928     (ShapefileStore.FileName, ShapefileStore.FileType): New. Accessor
2929     methods for filename and type
2930     (ShapefileStore.Dependencies): New. Implement the dependencies
2931     interface
2932     (DerivedShapeStore): New class to replace SimpleStore. The main
2933     difference to SimpleStore is that it depends not on a shapefile
2934     but another shapestore which expresses the dependencies a bit
2935     better
2936     (SimpleStore.__init__): Add deprecation warning.
2937    
2938     * test/test_dbf_table.py (TestDBFTable.test_dependencies): New.
2939     Test for the Dependencies method.
2940    
2941     * test/test_memory_table.py (TestMemoryTable.test_dependencies):
2942     New. Test for the Dependencies method.
2943    
2944     * test/test_transientdb.py
2945     (TestTransientTable.test_auto_transient_table_dependencies): New.
2946     Test for the Dependencies method.
2947     (TestTransientTable.test_transient_joined_table): Add test for the
2948     Dependencies method.
2949    
2950     * test/test_session.py (TestSessionSimple.setUp)
2951     (TestSessionSimple.tearDown): New. Implement a better way to
2952     destroy the sessions.
2953     (TestSessionSimple.test_initial_state)
2954     (TestSessionSimple.test_add_table): Bind session to self.session
2955     so that it's destroyed by tearDown
2956     (TestSessionSimple.test_open_shapefile): New. Test for
2957     OpenShapefile and the object it returns
2958    
2959     2003-05-22 Bernhard Herzog <[email protected]>
2960    
2961 bh 983 * Thuban/Model/session.py (Session.AddTable): New method to
2962     register tables with the session.
2963     (Session.Tables): Return the tables registered with AddTable too.
2964    
2965     * test/test_session.py (TestSessionSimple.test_add_table): New.
2966     Test case for the AddTable method
2967    
2968 frank 981 2003-05-22 Frank Koormann <[email protected]>
2969    
2970     UI polishing updates: Place main buttons (OK, Cancel, etc) in the
2971     lower right corner, center labels for selections, initialize controls
2972     in reasonable order for keyboard navigation.
2973    
2974     * Thuban/UI/projdialog.py (ProjFrame.__init__, ProjFrame.__doLayout)
2975     (ProjFrame.__DoOnProjAvail): Determine position of current projection
2976     using the wxListBox.FindString() method. Still a problem (#1886)
2977    
2978     * Thuban/UI/classifier.py
2979     (Classifier.__init__, SelectPropertiesDialog.__init__)
2980    
2981     * Thuban/UI/classgen.py (ClassGenDialog.__init__,
2982     (ClassGenDialog.__DoOnGenTypeSelect): Moved initialization of the
2983     different classification types from here to __init__.
2984     (GenUniquePanel.__init__): Set the column width of the first field
2985     in the Field ListCtrl to the full width.
2986    
2987     * Thuban/UI/tableview.py (LayerTableFrame.__init__): Rename 'Save As'
2988     Button to 'Export'. Center Buttons in Selection Box, set Focus to
2989     Grid.
2990     (LayerTableFrame.OnKeyDown()): New, bound to the grid with EVT_KEY_DOWN,
2991     changes focus to the Selection when pressing "Alt-S".
2992    
2993     * Thuban/UI/legend.py (LegendTree.__SetVisibilityStyle): Only gray out
2994     the text if not visible. The italic font sometimes exceeds the
2995     rendering area.
2996    
2997 jonathan 972 2003-05-21 Jonathan Coles <[email protected]>
2998 jonathan 971
2999 jonathan 975 * Thuban/UI/dock.py (DockFrame): Rename references to _OnClose
3000     to OnClose so that Thuban closes correctly.
3001    
3002     * Thuban/UI/mainwindow.py (MainWindow.OnClose): Call
3003     DockFrame.OnClose, not DockFrame._OnClose.
3004    
3005     2003-05-21 Jonathan Coles <[email protected]>
3006    
3007 jonathan 971 * Thuban/Model/classgen.py (ClassGenerator.GenQuantiles): Remove
3008     references to 'inf' and use new Range __init__ to pass floats
3009     directly rather than converting them to strings first.
3010     Fixes RTBug #1876.
3011    
3012     * Thuban/Model/classification.py (ClassGroupRange.SetRange):
3013     Use new Range ___init__ to pass floats.
3014    
3015     * Thuban/Model/layer.py (RasterLayer.__init__): Test if the
3016     filename is a valid image file. Throw IOError otherwise.
3017    
3018     * Thuban/Model/range.py: Brought over new Range from SciParam that
3019     is immutable and has an __init__ which can accept floats.
3020    
3021     * Thuban/UI/mainwindow.py (MainWindow.AddLayer): Move OpenShapefile
3022     into try block. AddLayer doesn't throw any exceptions anymore.
3023     (MainWindow.AddRasterLayer): Move constructor of RasterLayer into
3024     try block.
3025    
3026     * Thuban/UI/projdialog.py (GeoPanel.__init__): Put Degrees as
3027     the first item in choices. Fixes RTBug #1882.
3028    
3029     * Thuban/UI/renderer.py (MapRenderer.render_map): Check if scale
3030     has gone to 0 which is a serious problem. abort.
3031     (MapRenderer.draw_raster_layer): Catch IOError seperately and
3032     print the error from GDAL.
3033    
3034     * Thuban/UI/tableview.py (TableGrid.__init__): Call
3035     ToggleEventListeners to turn on listening.
3036     (TableGrid.ToggleEventListeners): New. Turns event listening on
3037     and off so as to prevent excessive messages.
3038     (LayerTableFrame.OnQuery): Use TableGrid.ToggleEventListeners
3039     to suppress excessive messages when selecting many rows.
3040     Fixes RTBug #1880.
3041    
3042     * Thuban/UI/view.py: Added checks against if scale == 0. This
3043     is a serious problem that can occur when an image without
3044     geo data is loading and causes the map projection bounds to
3045     go to infinity. Right now, the solution is to simply try
3046     to recover.
3047    
3048     * extensions/thuban/cpl_mfile.cpp (MFILEClose): Make sure
3049     to set the MFILEReceiver attributes even if the data is NULL.
3050    
3051     * extensions/thuban/gdalwarp.cpp: Improved the error handling
3052     and passed GDAL messages back up to the Python layer. Also
3053     tried to fix some memory leaks that were present in the original
3054     utility but didn't matter because the program aborted.
3055    
3056     * test/test_range.py: Copied over tests from SciParam. Removed
3057     tests against importing. Fixes RTBug #1867.
3058    
3059 bh 958 2003-05-21 Bernhard Herzog <[email protected]>
3060    
3061     * test/test_load.py: Remove unused imports and restructure the
3062     test code
3063     (LoadSessionTest): Split into one class for each test and turn
3064     LoadSessionTest itself into the base class for all such session
3065     tests.
3066     (ClassificationTest): New base class for load tests that test
3067     classifications
3068     (TestSingleLayer, TestLayerVisibility, TestClassification)
3069     (TestLabels, TestLayerProjection, TestRasterLayer): New classes
3070     for the individual tests
3071    
3072     * test/support.py (FileLoadTestCase.filename): New base class for
3073     file loading tests
3074    
3075 jan 955 2003-05-21 Jan-Oliver Wagner <[email protected]>
3076    
3077     * Resources/Projections/defaults.proj: Renamed 'Universal Transverse
3078     Mercator' to 'UTM Zone 32' as a more convenient example.
3079     Added 'Gauss Krueger Zone 6'.
3080    
3081     * Data/iceland_sample_raster.thuban: political polygon now
3082     filled transparent to have the raster image visible at once.
3083    
3084 frank 952 2003-05-21 Frank Koormann <[email protected]>
3085    
3086     * Thuban/UI/mainwindow.py (MainWindow): Renamed _OnClose() back to
3087     OnClose() to keep in sync with extensions. Internally Thuban
3088     still uses "underscored" names.
3089    
3090 jonathan 949 2003-05-20 Jonathan Coles <[email protected]>
3091    
3092     This puts back Raster layer support. These layers support projections
3093     through the GDAL library. Currently, the CVS version is being used.
3094     There are no Debian packages available although this may change soon.
3095     A GDAL driver was extended to support writing to memory rather to
3096     files.
3097    
3098     There is still some work that needs to be done, such as some error
3099     handling when loading invalid images or when there is a problem
3100     projecting the image. This putback simply checks in the majority
3101     of the work.
3102    
3103     * setup.py: Add gdalwarp library extension.
3104    
3105     * Thuban/Model/layer.py (BaseLayer.HasClassification): New.
3106     Defaults to False, but can be overridden by subclasses if they
3107     support classification.
3108     (RasterLayer): New. Defines a new layer that represents an
3109     image.
3110    
3111     * Thuban/Model/load.py (SessionLoader.__init__): Add rasterlayer
3112     tag handler.
3113     (SessionLoader.start_layer): Encode the filename.
3114     (SessionLoader.start_rasterlayer, SessionLoader.end_rasterlayer):
3115     New. Supports reading a rasterlayer tag.
3116    
3117     * Thuban/Model/map.py (Map.BoundingBox): Fix typo in comment.
3118    
3119     * Thuban/Model/save.py (XMLWriter.encode): Don't assume that we
3120     get a string in Latin1. If we get such as string convert it to
3121     unicode first, otherwise leave if alone before encoding.
3122     (SessionSaver.write_layer): Add support for writing both Layers
3123     and RasterLayers.
3124    
3125     * Thuban/Model/transientdb.py (AutoTransientTable.SimpleQuery):
3126     The right argument may not be a string, it could also be a Column.
3127    
3128     * Thuban/UI/application.py (ThubanApplication.CreateMainWindow):
3129     Make initial window size 600x400. Fixes RTBug #1872.
3130    
3131     * Thuban/UI/classifier.py (Classifier.__init__): Rearrange how
3132     the dialog is constructed so that we can support layers that
3133     do not have classifications.
3134     (Classifier._OnTry): Only build a classification if the layer
3135     supports one.
3136    
3137     * Thuban/UI/legend.py: Change all checks that a layer is an
3138     instance of Layer into checks against BaseLayer.
3139     (LegendTree.__FillTreeLayer): Only add children to a branch if
3140     the layer supports classification.
3141    
3142     * Thuban/UI/mainwindow.py (MainWindow.NewSession,
3143     MainWindow.OpenSession): Don't proceed with an action if the
3144     user chooses Cancel when they are asked to save changes.
3145     (MainWindow.AddRasterLayer): New. Open a dialog to allow the
3146     user to select an image file. Create a new RasterLayer and add
3147     it to the map.
3148    
3149     * Thuban/UI/renderer.py (MapRenderer.render_map): Add support
3150     for rendering RasterLayer layers.
3151     (MapRenderer.draw_raster_layer): Actually method that calls
3152     the GDALWarp python wrapper and constructs an image from the
3153     data returned.
3154    
3155     * Thuban/UI/tableview.py (LayerTableFrame.__init__): Change the
3156     Choices symbols to match those used in the table query method.
3157     Replace deprecated method calls on table with new method names.
3158    
3159     * Thuban/UI/view.py (MapCanvas.set_view_transform): Try to limit
3160     how small the scale can get. This still needs more testing.
3161    
3162     * extensions/thuban/bmpdataset.cpp: New, but copied from GDAL.
3163     Provides a driver to output in .bmp format.
3164    
3165     * extensions/thuban/cpl_mfile.cpp, extensions/thuban/cpl_mfile.h:
3166     New. Provides IO routines which write to memory, rather than a file.
3167    
3168     * extensions/thuban/gdalwarp.cpp: New, but basically a direct copy
3169     of the gdalwarp utility provided in GDAL. Added function calls
3170     that can be accessed from python.
3171    
3172     * Data/iceland_sample_raster.thuban: New. Sample file that uses
3173     a raster layer.
3174    
3175     * Data/iceland/island.tfw, Data/iceland/island.tif: New. Raster
3176     layer image data.
3177    
3178     * Doc/thuban.dtd: Added rasterlayer attribute definition.
3179    
3180     * test/test_layer.py, test/test_load.py, test/test_save.py: Added
3181     tests associated with the raster layer code.
3182    
3183     * test/test_transientdb.py
3184     (TestTransientTable.test_auto_transient_table_query): Added a test
3185     for using a Column object as the "right" parameter to a query.
3186    
3187 frank 924 2003-05-19 Frank Koormann <[email protected]>
3188    
3189 frank 927 * Thuban/version.py (get_changelog_date):
3190     Catch exceptions if ChangeLog does not exist.
3191    
3192     * Thuban/UI/view.py (MapCanvas.Export): Bugfix
3193    
3194     2003-05-19 Frank Koormann <[email protected]>
3195    
3196 frank 924 Extended version information for Thuban
3197    
3198     * Thuban/version.py: New, version information for Thuban: Last
3199     modification date and last ChangeLog entry date.
3200    
3201     * Thuban/UI/mainwindow.py (MainWindow.About()): Extended version
3202     information: Display Thuban, wxPython and Python version.
3203    
3204 bh 919 2003-05-16 Bernhard Herzog <[email protected]>
3205    
3206 bh 921 * Thuban/Model/save.py: Remove some unused imports including the
3207     __future__ import for nested_scopes as Thuban relies on Python 2.2
3208     now.
3209     (XMLWriter.encode): Remove the special case for a None argument.
3210     In the saver encode is always called with a string argument.
3211    
3212     2003-05-16 Bernhard Herzog <[email protected]>
3213    
3214 bh 919 * Thuban/UI/__init__.py: Remove the work-around for the locale bug
3215     in wxPython (at least when usinvg wxGTK) prior to 2.4. The symptom
3216     of the bug was that e.g. float("1.2") would fail. Thuban now
3217     requires 2.4.x.
3218    
3219 frank 917 2003-05-16 Frank Koormann <[email protected]>
3220    
3221     Printing enhancement and WMF export (under Win32)
3222    
3223     * Thuban/UI/renderer.py (ExportRenderer): New, derived from
3224     ScreenRenderer. Renders Map, Legend and Scalebar for export.
3225     (PrinterRenderer): New, derived from ExportRenderer. Replaces the old
3226     PrintRender.
3227    
3228     * Thuban/UI/view.py (MapPrintout.__init__): Enhanced parameter set
3229     to fullfil information needed for PrinterRenderer.
3230     (MapCanvas.Export): New. Export Map (currently only to WMF on Win32).
3231     (MapCanvas.Print): Adapted to new MapPrintout.
3232     (OutputTransform): General calculations to transform from canvas
3233     coordinates to export/printing devices.
3234    
3235     * Thuban/UI/mainwindow.py (MainWindow.ExportMap()): New. Added also
3236     new method_command to call ExportMap, with platform dependency (only
3237     __WXMSW__)
3238    
3239     * Thuban/UI/scalebar.py (ScaleBar.DrawScaleBar): Position and Size
3240     of scalebar drawing area as new parameters.
3241    
3242     * Thuban/Model/scalebar.py (roundInterval): round long instead of int
3243    
3244     * Thuban/UI/legend.py (ScalebarBitmap.__SetScale):
3245     Update to extended scalebar.DrawScalebar header.
3246    
3247     * test/test_export.py: New, test Thuban.UI.view.OutputTransform()
3248    
3249     * test/test_scalebar.py: Made test executable as standalone.
3250    
3251 bh 908 2003-05-16 Bernhard Herzog <[email protected]>
3252    
3253     * Thuban/Model/table.py (Table): Remove this compatibility alias
3254     for DBFTable.
3255    
3256     * test/test_table.py: Import DBFTable as Table because that alias
3257     doesn't exist anymore.
3258    
3259     * Thuban/UI/classgen.py: Remove some unused imports
3260    
3261 jonathan 906 2003-05-14 Jonathan Coles <[email protected]>
3262    
3263     * Thuban/Model/classgen.py (ClassGenerator.GenSingletonsFromList):
3264     Fix docstring.
3265     (ClassGenerator.GenUniformDistribution): Fix spelling of method name.
3266     (ClassGenerator.GenQuantiles): Use the left/right brackets and min/max
3267     values of the supplied range to determine the beginning and end
3268     bounds of the generated classes.
3269    
3270     * Thuban/Model/range.py (Range.number_re): Now accepts floats that
3271     do not have a leading 0 (.5 is now accepted as well as 0.5).
3272    
3273     * Thuban/UI/classgen.py (ClassGenDialog.OnOK): Fix name of method
3274     call to ClassGenerator.GenUniformDistribution.
3275    
3276     * Thuban/UI/projdialog.py (ProjFrame.__do_layout): Fix Windows
3277     layout bug with the 'Projection' label.
3278    
3279     * test/support.py (FloatTestCase): New. Needed for the Range tests.
3280    
3281     * test/test_range.py: New. Imported from SciParam.
3282    
3283 jonathan 897 2003-05-12 Jonathan Coles <[email protected]>
3284    
3285 jonathan 899 * Thuban/UI/classgen.py (GenQuantilesPanel.GetList): Replace call
3286     to table.UniqueValues() with calls that retrieve all the values
3287     from the table. This will need to be replaced by a method on table
3288     which can simply return the list (perhaps more efficiently).
3289    
3290     2003-05-12 Jonathan Coles <[email protected]>
3291    
3292 jonathan 897 The return value of ClassGenerator.CalculateQuantiles has changed.
3293     Refer to the documentation for details.
3294    
3295     * test/test_classgen.py: Modified Quantile tests to use the
3296     new return values.
3297    
3298     * Thuban/Model/classgen.py
3299     (ClassGenerator.GenQuantiles): Add comments describing the parameters,
3300     use new return values from CalculateQuantiles to produce the correct
3301     range bounds in the Classification.
3302     (ClassGenerator.CalculateQuantiles): Add more comments describing
3303     the return values and parameters. Make minor adjustments to improve
3304     the legibility of the code. Fix problem with adjusted not being set
3305     in most cases.
3306    
3307 frank 893 2003-05-12 Frank Koormann <[email protected]>
3308    
3309     * Thuban/Model/save.py (XMLWriter.encode()): Explicite call to unicode
3310     and latin1. Fixes #1851 finally.
3311    
3312 jonathan 889 2003-05-09 Jonathan Coles <[email protected]>
3313    
3314 jonathan 897 * test/test_classgen.py: New. Tests the Quantile algorithm.
3315    
3316     * Thuban/Model/classgen.py (ClassGenerator.CalculateQuantiles):
3317     Clean up debugging statement, add comments, fix a small bug in the
3318     returned adjusted percentiles.
3319    
3320     2003-05-09 Jonathan Coles <[email protected]>
3321    
3322 jonathan 889 Introduces Range class from SciParam into the ClassGroupRange class,
3323     and such ranges can now be saved and loaded from disk.
3324    
3325     Quantiles are now available in the Classification Generator.
3326    
3327     Initial support for building Queries on a table. Doesn't do anything
3328     but run some tests.
3329    
3330     * Thuban/Model/classification.py: Explicit imports.
3331     (ClassGroupRange): Use the Range class to store the underlying
3332     range information. The interface remains the same, except for
3333     GetRange(), and you can also supply a Range object as the min
3334     parameter to SetRange or __init__.
3335    
3336     * Thuban/Model/load.py (XMLReader.encode): New. Encodes the given
3337     string appropriately for use in Thuban. Fixes RTbug #1851.
3338     (SessionLoader.end_projection): Handle the context of the
3339     projection tag a bit better by looking at what objects are not
3340     None. There was an assumption that a projection tag for a map
3341     could occur before any layers.
3342     (SessionLoader.start_clrange): Provide backward compatibility for
3343     reading min/max values as well as the new range parameter.
3344    
3345     * Thuban/Model/map.py: Explicit imports.
3346    
3347     * Thuban/Model/resource.py: Import _.
3348     (ProjFileSaver.write): write header using projfile.dtd.
3349    
3350     * Thuban/Model/save.py: Explicit imports.
3351     (XMLWriter.encode): New. Encode the given string from a format
3352     used by Thuban into UTF-8. Fixes RTbug #1851.
3353    
3354     * Thuban/UI/classgen.py: Explicit imports.
3355     (ClassGenDialog.__init__): Clean up the code and add support
3356     for Quantiles.
3357     (ClassGenDialog.OnOK): Add support for Quantiles.
3358     (GenQuantilesPanel): New. Input panel for Quantiles.
3359     (ClassGenerator, CustomRamp, MonochromaticRamp, GreyRamp, RedRamp,
3360     GreenRamp, BlueRamp, HotToColdRamp): Move to Thuban/Model/classgen.py
3361    
3362     * Thuban/Model/classgen.py: New. Contains all the classes named above.
3363    
3364     * Thuban/UI/classifier.py: Explicit imports.
3365     (ClassTable.GetValueAsCust, ClassTable.__ParseInput,
3366     ClassTable.SetValueAsCustom): Reworked to use new Range class.
3367    
3368     * Thuban/UI/legend.py: Explicit imports.
3369    
3370     * Thuban/UI/mainwindow.py: Add support for the Join Dialog. Added
3371     a Table menu and associated method calls.
3372     (MainWindow.choose_color): Removed. No longer needed.
3373    
3374     * Thuban/UI/projdialog.py (ProjFrame.__VerifyButtons): Save button
3375     should be disabled if no projection is selected in the available
3376     list.
3377    
3378     * Thuban/UI/renderer.py: Explicit imports.
3379    
3380     * Thuban/UI/tableview.py (TableGrid.OnRangeSelect): Fix some issues
3381     with correctly selecting the rows and issuing the right events.
3382     Be sure to call Skip() to allow the grid to do some of its own
3383     handling which allows the rows to actually be selected.
3384     (LayerTableGrid.select_shapes): Rename from select_shape. Supports
3385     selecting multiple shapes.
3386     (LayerTableFrame): Support for building Queries.
3387     (LayerTableFrame.select_shapes): Allow multiple shapes to be selected.
3388    
3389     * Thuban/UI/tree.py: Explicit imports.
3390    
3391     * Thuban/UI/view.py (MapCanvas): Delegate "SelectedShapes" so the
3392     table view can call it.
3393    
3394     * test/test_classification.py: Explicit imports.
3395     (TestClassification.test_ClassGroupRange): Fix test for new
3396     Range class.
3397    
3398     * Doc/thuban.dtd: Add range parameter for clrange.
3399    
3400     * Thuban/Model/range.py: Taken from SciParam. Used as the underlying
3401     object in ClassGroupRange, and also uesd for inputting ranges in
3402     the classifer table and elsewhere.
3403    
3404     * Thuban/UI/join.py: New. Initial Join dialog. No real functionality
3405     yet.
3406    
3407 frank 872 2003-05-09 Frank Koormann <[email protected]>
3408    
3409     * Thuban/UI/scalebar.py (DrawScaleBar): Draw only if interval > 0.0.
3410    
3411 frank 860 2003-05-08 Frank Koormann <[email protected]>
3412    
3413 frank 870 Coding style updates
3414    
3415     * test/test_scalebar.py: Replaced tab indentation by spaces.
3416    
3417     * Thuban/UI/scalebar.py: Explicit imports.
3418    
3419     2003-05-08 Frank Koormann <[email protected]>
3420    
3421 frank 867 * Thuban/UI/scalebar.py
3422     (ScaleBar.DrawScalebar): Format string bug fixed.
3423    
3424     2003-05-08 Frank Koormann <[email protected]>
3425    
3426 frank 865 Reorganization of scalebar component (no wx in Thuban/Model)
3427    
3428     * Thuban/Model/scalebar.py: Rendering moved to Thuban/UI/scalebar.py
3429     (deriveInterval):
3430     Calculate scalebar interval and unit which fits in width for scale.
3431     (roundInterval): Round float.
3432    
3433     * Thuban/UI/scalebar.py (ScaleBar): Scalebar rendering
3434    
3435     * test/test_scalebar.py: Test for Thuban/Model/scalebar.py methods.
3436    
3437     * Thuban/UI/legend.py: Import Thuban.UI.scalebar
3438    
3439     2003-05-08 Frank Koormann <[email protected]>
3440    
3441 frank 860 * Thuban/UI/legend.py (ScalebarBitmap.SetCanvas):
3442     Initialize ScaleBar with canvas.map
3443    
3444     * Thuban/Model/scalebar.py (ScaleBar.roundInterval()): New,
3445     round intervals to display smarter lengths
3446     (ScaleBar.DrawScalebar): Draw Scalebar only if the map contains a
3447     layer. If the maps has no projection applied grey the scalebar.
3448    
3449 frank 857 2003-05-07 Frank Koormann <[email protected]>
3450    
3451     Basic Scalebar features added.
3452    
3453     * Thuban/Model/scalebar.py (ScaleBar): New, scalebar rendering.
3454    
3455     * Thuban/UI/legend.py (LegendPanel): Added scalebar bitmap
3456     (ScaleBarBitmap): New, links the scalebar bitmap with view messages
3457     and the renderer.
3458    
3459     * Thuban/UI/view.py (MapCanvas.set_view_transform): Issue SCALE_CHANGED.
3460    
3461     * Thuban/UI/messages.py: SCALE_CHANGED added.
3462    
3463 bh 850 2003-05-07 Bernhard Herzog <[email protected]>
3464    
3465 bh 852 * Thuban/Model/session.py (Session.__init__): New instance
3466     variable shapestores to hold a list of all open shapestore objects
3467     (Session.ShapeStores): New. Accessor method for the shapestores
3468     list.
3469     (Session._add_shapestore, Session._clean_weak_store_refs): New.
3470     Internal methods to maintain the shapestores list.
3471     (Session.Tables): New. Return all tables open in the session.
3472     (Session.OpenShapefile): Insert the new ShapeStore into the
3473     shapestores list.
3474    
3475     * test/test_session.py (TestSessionSimple.test_initial_state): Add
3476     tests for ShapeStores and Tables
3477     (TestSessionWithContent.test_shape_stores)
3478     (TestSessionWithContent.test_tables): New. Test cases for
3479     ShapeStores and Tables
3480    
3481     2003-05-07 Bernhard Herzog <[email protected]>
3482    
3483 bh 850 * Thuban/Model/transientdb.py (TransientTableBase.ReadRowAsDict):
3484     Add comments about the optimizations used.
3485     (AutoTransientTable.ReadValue, TransientTableBase.ReadValue): New.
3486     Implement the ReadValue table interface method.
3487    
3488     * test/test_transientdb.py
3489     (TestTransientTable.run_iceland_political_tests)
3490     (TestTransientTable.test_transient_joined_table): Add tests for
3491     ReadValue
3492    
3493 frank 848 2003-05-07 Frank Koormann <[email protected]>
3494    
3495     * Resources/Bitmaps/fulllayerextent.xpm,
3496     Resources/Bitmaps/fullselextent.xpm: Replaced the place holders with
3497     new icons.
3498    
3499 bh 840 2003-05-06 Bernhard Herzog <[email protected]>
3500    
3501 bh 846 * Thuban/Model/transientdb.py (AutoTransientTable.SimpleQuery):
3502     New. Simply delegate to the transient table's version.
3503    
3504     * test/test_transientdb.py
3505     (TestTransientTable.test_auto_transient_table_query): New. Test
3506     case for AutoTransientTable's SimpleQuery
3507    
3508     2003-05-06 Bernhard Herzog <[email protected]>
3509    
3510 bh 843 * Thuban/Model/transientdb.py (TransientTableBase.SimpleQuery):
3511     Implement a simple query method for the query dialog
3512     (TransientTableBase.create): Add an INTEGER PRIMARY KEY that holds
3513     the row index or shapeid.
3514     (TransientTable.create): Insert the right value of the row index
3515     (TransientJoinedTable.create): Copy the row index of the left
3516     table to the joined result table
3517    
3518     * test/test_transientdb.py
3519     (TestTransientTable.test_transient_table_read_twice): Fix
3520     doc-string
3521     (TestTransientTable.test_transient_table_query): New. Test for the
3522     SimpleQuery method
3523    
3524     2003-05-06 Bernhard Herzog <[email protected]>
3525    
3526 bh 840 Convert all table users to use the new table interface. This only
3527     covers Thuban itself, not GREAT-ER or other applications built on
3528     Thuban yet, so the compatibility interface stays in place for the
3529     time being but it now issues DeprecationWarnings.
3530    
3531     Finally, the new Table interface has a new method, HasColumn.
3532    
3533     * Thuban/Model/table.py (OldTableInterfaceMixin): All methods
3534     issue deprecation warnings when they're. The warnings refer to the
3535     caller of the method.
3536     (OldTableInterfaceMixin.__deprecation_warning): New. Helper method
3537     for the deprecation warnings
3538    
3539     * test/test_table.py: Ignore the deprecation warnings for the old
3540     table in the tests in this module. The purpose of the tests is to
3541     test the old interface, after all.
3542    
3543     * test/test_transientdb.py
3544     (TestTransientTable.run_iceland_political_tests): Use the
3545     constants for the types. Add a test for HasColumn
3546     (TestTransientTable.test_transient_joined_table): Adapt to new
3547     table interface. Add a test for HasColumn
3548     (TestTransientTable.test_transient_table_read_twice): Adapt to new
3549     table interface
3550    
3551     * Thuban/UI/tableview.py (DataTable.SetTable, DataTable.GetValue):
3552     Adapt to new table interface
3553    
3554     * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Adapt to
3555     new table interface
3556    
3557     * Thuban/UI/controls.py (RecordListCtrl.fill_list)
3558     (RecordTable.SetTable): Adapt to new table interface
3559    
3560     * Thuban/UI/classifier.py (Classifier.__init__)
3561     (Classifier.__init__): Adapt to new table interface
3562    
3563     * Thuban/UI/classgen.py (ClassGenDialog.__init__)
3564     (GenUniformPanel._OnRetrieve, GenUniquePanel._OnRetrieve): Adapt
3565     to new table interface
3566    
3567     * Thuban/Model/transientdb.py (TransientTableBase.HasColumn)
3568     (AutoTransientTable.HasColumn): Implement the new table interface
3569     method
3570     (AutoTransientTable.ReadRowAsDict, AutoTransientTable.ValueRange)
3571     (AutoTransientTable.UniqueValues): Adapt to new table interface
3572    
3573     * Thuban/Model/layer.py (Layer.SetShapeStore, Layer.GetFieldType):
3574     Adapt to new table interface
3575    
3576     * test/test_layer.py (TestLayer.open_shapefile): Helper method to
3577     simplify opening shapefiles a bit easier.
3578     (TestLayer.test_arc_layer, TestLayer.test_polygon_layer)
3579     (TestLayer.test_point_layer): Use the new helper method
3580     (TestLayer.test_get_field_type): New. Test for the GetFieldType
3581     method
3582    
3583     * test/test_dbf_table.py (TestDBFTable.test_has_column): Test for
3584     the new table method
3585    
3586     * test/test_memory_table.py (TestMemoryTable.test_has_column):
3587     Test for the new table method HasColumn
3588    
3589 jonathan 833 2003-05-06 Jonathan Coles <[email protected]>
3590    
3591     Addresses the "Selection Extent" wish of RTbug #1787.
3592    
3593     * Resources/Bitmaps/fulllayerextent.xpm,
3594     Resources/Bitmaps/fullselextent.xpm: Bitmaps for layer and selection
3595     extent. These are just place holders for the real bitmaps.
3596    
3597     * Thuban/Model/layer.py (Shape): Since a Shape is immutable only
3598     calculate the bounding box once (the first time compute_bbox() is
3599     called).
3600     (Layer.ShapesBoundingBox): New. Given a list of shape ids, return
3601     the bounding box for the shapes in lat/long coordinates.
3602    
3603     * Thuban/UI/mainwindow.py: Added new "Full selection extent" menu
3604     option.
3605     (MainWindow.has_selected_shapes): New. Returns true if there are
3606     any selected shapes.
3607     (MainWindow.FullSelectionExtent): New. Calls
3608     MapCanvas.FitSelectedToWindow() when the user selects the menu option.
3609     (_has_selected_shapes): New. Returns true if there are any
3610     selected shapes.
3611    
3612     * Thuban/UI/selection.py (Selection.HasSelectedShapes): New. Returns
3613     true if there are any selected shapes.
3614    
3615     * Thuban/UI/view.py (MapCanvas): Added delegated method
3616     HasSelectedShapes.
3617     (MapCanvas.FitSelectedToWindow): New. Centers and scales any selected
3618     shapes on the canvas using the map projection (if any).
3619    
3620     * test/test_layer.py (TestLayer.test_arc_layer): Add some tests
3621     for Layer.ShapesBoundingBox().
3622    
3623 bh 826 2003-05-06 Bernhard Herzog <[email protected]>
3624    
3625     * Resources/Projections/defaults.proj: Fix spelling of Mercator
3626    
3627 jonathan 823 2003-05-05 Jonathan Coles <[email protected]>
3628    
3629     Addresses the "Full Layer Extent" wish of RTbug #1787.
3630    
3631     * Resources/Projections/defaults.proj: Added UK National Grid.
3632    
3633     * Thuban/UI/mainwindow.py: Added new "Full layer extent" menu option.
3634     (MainWindow.FullLayerExtent): New. Calls MapCanvas.FitLayerToWindow()
3635     when the user selects the menu option.
3636    
3637     * Thuban/UI/view.py (MapCanvas.FitLayerToWindow): New. Centers and
3638     scales the given layer on the canvas using the map projection.
3639    
3640 bh 819 2003-05-05 Bernhard Herzog <[email protected]>
3641    
3642     Convert the table implementations to a new table interface. All
3643     tables use a common mixin class to provide backwards compatibility
3644     until all table users have been updated.
3645    
3646     * Thuban/Model/table.py (OldTableInterfaceMixin): Mixin class to
3647     provide backwards compatibility for table classes implementing the
3648     new interface
3649     (DBFTable, MemoryTable): Implement the new table interface. Use
3650     OldTableInterfaceMixin as base for compatibility
3651     (DBFColumn, MemoryColumn): New. Column description for DBFTable
3652     and MemoryTable resp.
3653    
3654     * test/test_dbf_table.py: New. Test cases for the DBFTable with
3655     the new table interface.
3656    
3657     * test/test_memory_table.py: New. Test cases for the MemoryTable
3658     with the new table interface.
3659    
3660     * test/test_table.py: Document the all tests in this file as only
3661     for backwards compatibility. The equivalent tests for the new
3662     interface are in test_memory_table.py and test_dbf_table.py
3663     (MemoryTableTest.test_read): field_info should be returning tuples
3664     with four items
3665     (MemoryTableTest.test_write): Make doc-string a more precise.
3666    
3667     * Thuban/Model/transientdb.py (TransientTableBase): Convert to new
3668     table interface. Derive from from OldTableInterfaceMixin for
3669     compatibility.
3670     (TransientTableBase.create): New intance variable column_map to
3671     map from names and indices to column objects
3672     (TransientTable.create): Use the new table interface of the input
3673     table
3674     (AutoTransientTable): Convert to new table interface. Derive from
3675     from OldTableInterfaceMixin for compatibility.
3676     (AutoTransientTable.write_record): Removed. It's not implemented
3677     yet and we still have to decide how to handle writing with the new
3678     table and data framework.
3679    
3680     * test/test_transientdb.py
3681     (TestTransientTable.run_iceland_political_tests)
3682     (TestTransientTable.test_transient_joined_table): Use the new
3683     table interface
3684    
3685 jonathan 817 2003-05-05 Jonathan Coles <[email protected]>
3686    
3687     This is namely a collection of UI updates to improve user interactivity.
3688     Tabbing between controls now exists and you can use ESC to close dialog
3689     boxes; ENTER will active the default button.
3690    
3691     * Thuban/UI/classgen.py (ClassGenDialog.__init__): Rearrange the
3692     order that the controls are created so that tabbing works correctly.
3693     (ClassGenDialog.OnOK): Renamed from _OnGenerate() so that the
3694     wxDialog can handle the default button correctly.
3695     (ClassGenDialog.OnCancel): Renamed from _OnCloseBtn() for the
3696     same reasons as for OnOK.
3697     (GenUniformPanel._OnRetrieve): Call wxBeginBusyCursor/wxEndBusyCursor
3698     when we ask the table for the maximum/minimum values of a field
3699     which could take a very long time.
3700    
3701     * Thuban/UI/classifier.py (Classifier.__init__): Rearrange the
3702     order that the controls are created so that tabbing works correctly.
3703     (SelectPropertiesDialog.__init__): Rearrange the order that the
3704     controls are created so that tabbing works correctly.
3705    
3706     * Thuban/UI/dialogs.py: Copied NonModalDialog box and changed it
3707     to derive from a wxDialog but behave like the original implementation
3708     which was derived from a wxFrame. wxDialog provides useful key
3709     handling functionality like ESC calling OnCancel and ENTER calling
3710     OnOK which is lost with wxFrame.
3711    
3712     * Thuban/UI/mainwindow.py: Add "..." to menu items that will open
3713     new dialogs.
3714    
3715     * Thuban/UI/projdialog.py (ProjFrame.__init__): Rearrange the
3716     order that the controls are created so that tabbing works correctly.
3717     (ProjFrame.OnApply): Renamed from _OnTry() to use wxDialog behaviour.
3718     (ProjFrame.OnOK): Renamed from _OnOK() to use wxDialog behaviour.
3719     (ProjFrame.OnCancel): Renamed from _OnClose() to use wxDialog behaviour.
3720     (ProjPanel.__init__): Add "Airy" to the list of ellipsoids so we
3721     can provide the "UK National Grid" as a default projection.
3722     (UTMPanel.__init__): Rearrange the order that the controls are
3723     created so that tabbing works correctly.
3724    
3725 bh 809 2003-05-05 Bernhard Herzog <[email protected]>
3726    
3727 bh 811 * extensions/thuban/wxproj.cpp: Fix some of the comments.
3728     (project_point): If a map projection but no layer projection is
3729     given, convert degrees to radians before applying the map
3730     projection.
3731    
3732 bh 809 * Thuban/UI/tableview.py (TableGrid.disallow_messages)
3733     (TableGrid.allow_messages): New methods to make it possible to
3734     inhibit message sending.
3735     (TableGrid.issue): Only send the message if not inhibited.
3736     (LayerTableGrid.select_shape): Use the new methods to make sure
3737     that no ROW_SELECTED message is sent while we're updating the
3738     selected rows to match the selected shapes.
3739    
3740 jan 807 2003-05-02 Jan-Oliver Wagner <[email protected]>
3741    
3742     Implementation of MemoryTable.
3743    
3744     * Thuban/Model/table.py (MemoryTable): New. Quite simple table
3745     implementation that operates on a list of tuples. All of the data
3746     are kept in the memory.
3747    
3748     * test/test_table.py (MemoryTableTest): New.
3749    
3750     * test/test_transientdb.py (SimpleTable): Removed.
3751     (TestTransientTable.test_transient_joined_table,
3752     (TestTransientTable.test_transient_table_read_twice): Replaced
3753     SimpleTable by MemoryTable.
3754    
3755 jonathan 793 2003-04-30 Jonathan Coles <[email protected]>
3756    
3757 jonathan 803 * Data/iceland_sample.thuban: Now contains correct projections
3758     for each of the layers.
3759    
3760     * Resources/Projections/defaults.proj: Geographic projection
3761     contains unit conversion parameter.
3762    
3763     2003-04-30 Jonathan Coles <[email protected]>
3764    
3765 jonathan 793 The most important part of this putback is the projection changes.
3766     It should now be possible to specify the projection that a layer
3767     is in and then specify a different projection for the map. The
3768     projection dialog has an extra parameter for a geographic projection
3769     which lets the user select if the input is in degrees or radians.
3770    
3771     * Thuban/Model/layer.py (Layer.ShapesInRegion): Fix docstring
3772     to say that the parameter is a tuple of unprojected
3773     points (which is what the callers to this method were assuming).
3774     Also, since the points are unprojected we need to projected them.
3775    
3776     * Thuban/UI/legend.py (LegendTree.MoveCurrentItemUp,
3777     LegendTree.MoveCurrentItemDown): If the layer or any of the layer's
3778     groups are selected, move the layer up/down. Fixes RTbug #1833.
3779    
3780     * Thuban/UI/mainwindow.py: Move menu item map_rename up.
3781    
3782     * Thuban/UI/projdialog.py (ProjFrame._OnSave): Add missing
3783     parameter in call to SetClientData.
3784     (GeoPanel): Add support for selecting the units that the
3785     source data is in (Radians or Degrees).
3786    
3787     * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Optimize
3788     the rendering loop by reducing the number of if's, removing the
3789     unnecessary try/except block, and checking if the old group
3790     is the same as the new one (which happens a lot if there is
3791     no classification, or lots of shapes are in the same group).
3792    
3793     * Thuban/UI/view.py (MapCanvas.OnPaint): Add a try/except block
3794     around the redraw routine to try to catch problems that the user
3795     may create by selecting invalid projections for the data set and
3796     map. Clears the display if there are any problems and prints the
3797     error.
3798     (MapCanvas.do_redraw): Use DC.Clear() instead of drawing a filled
3799     rectangle.
3800    
3801     * extensions/thuban/wxproj.cpp (project_point): First invert the
3802     supplied point (which should be in projected coordinates) using
3803     the layer's projection and then project the point using the
3804     map's projection.
3805     (project_points): Use project_point() to project each point.
3806    
3807 jan 792 2003-04-30 Jan-Oliver Wagner <[email protected]>
3808    
3809     * Thuban/Model/layer.py (Layer.SetShapeStore): Fixed a bug:
3810     don't set the Classification to None if the classfication field
3811     is None (ie only a DEFAULT).
3812    
3813 bh 786 2003-04-30 Bernhard Herzog <[email protected]>
3814    
3815 bh 790 * Thuban/UI/view.py: Fix some typos.
3816    
3817 bh 788 * Thuban/UI/mainwindow.py (MainWindow.identify_view_on_demand): Do
3818     not pop up the dialog if the selection becomes empty (this could
3819     happen if e.g. a new selection is opened while the identify tool
3820     is active and dialog had been closed)
3821    
3822     2003-04-30 Bernhard Herzog <[email protected]>
3823    
3824 bh 786 * Thuban/Model/transientdb.py (TransientTableBase.__init__): New
3825     instance variable read_record_last_result
3826     (TransientTableBase.read_record): Make sure reading the same
3827     record twice works. The implementation uses the new instance
3828     variable read_record_last_result
3829    
3830     * test/test_transientdb.py
3831     (TestTransientTable.test_transient_table_read_twice): New test
3832     case for the above bug-fix.
3833    
3834 jonathan 793 2003-04-29 Jonathan Coles <[email protected]>
3835    
3836     * Thuban/common.py: Removed. No longer needed Str2Num. RTbug #1832.
3837    
3838     * Thuban/UI/classgen.py: Remove all uses of Str2Num.
3839    
3840     * Thuban/UI/classifier.py: Remove all uses of Str2Num.
3841     (ClassTable.SetValueAsCustom): Rename keyword argument in
3842     ClassGroup* constructors to match argument name.
3843    
3844 bh 779 2003-04-29 Bernhard Herzog <[email protected]>
3845    
3846     * Thuban/Model/session.py (Session.Destroy): Explicitly close the
3847     transient DB if it exists to make sure it doesn't leave a journal
3848     file in the temp directory.
3849    
3850     * Thuban/Model/transientdb.py (TransientDatabase.close): Set
3851     self.conn to None after closing the connection to make sure it's
3852     not closed twice
3853    
3854 jonathan 767 2003-04-29 Jonathan Coles <[email protected]>
3855    
3856 jonathan 769 Add a visible parameter in the layer XML tag. The default value is
3857     "true". If anything other than "false" is specified we also assume
3858 jonathan 776 "true". Addresses RTbug #1025.
3859 jonathan 769
3860     * Doc/thuban.dtd: Add visible parameter to a layer.
3861    
3862     * Thuban/Model/layer.py (BaseLayer.__init__): Change default value
3863     of visible from 1 to True.
3864     (Layer.__init__): Change default value of visible from 1 to True.
3865    
3866     * Thuban/Model/load.py (SessionLoader.start_layer): Read visible
3867     parameter.
3868    
3869     * Thuban/Model/save.py (SessionSaver.write_layer): Save visible
3870     parameter.
3871    
3872     * test/test_load.py: Add new test data contents_test_visible.
3873     (LoadSessionTest.setUp): save test data.
3874     (LoadSessionTest.testLayerVisibility): Test if the visible flag
3875     is loaded correctly.
3876    
3877     * test/test_save.py (SaveSessionTest.testSingleLayer): Add test
3878     for saving an invisible layer.
3879    
3880     2003-04-29 Jonathan Coles <[email protected]>
3881    
3882 jonathan 767 * Thuban/UI/mainwindow.py (MainWindow.SetMap): Look up the
3883     legend dialog box and tell it to change its map to the one
3884     supplied to SetMap(). Fixes RTbug #1770.
3885    
3886 bh 764 2003-04-29 Bernhard Herzog <[email protected]>
3887    
3888 bh 766 Next step of table implementation. Introduce a transient database
3889     using SQLite that some of the data is copied to on demand. This
3890     allows us to do joins and other operations that require an index
3891     for good performance with reasonable efficiency. Thuban now needs
3892     SQLite 2.8.0 and pysqlite 0.4.1. Older versions may work but I
3893     haven't tested that.
3894    
3895     * Thuban/Model/transientdb.py: New. Transient database
3896     implementation.
3897    
3898     * test/test_transientdb.py: New. Tests for the transient DB
3899     classes.
3900    
3901     * Thuban/Model/session.py (AutoRemoveFile, AutoRemoveDir): New
3902     classes to help automatically remove temporary files and
3903     directories.
3904     (Session.__init__): New instance variables temp_dir for the
3905     temporary directory and transient_db for the SQLite database
3906     (Session.temp_directory): New. Create a temporary directory if not
3907     yet done and return its name. Use AutoRemoveDir to have it
3908     automatically deleted
3909     (Session.TransientDB): Instantiate the transient database if not
3910     done yet and return it.
3911    
3912     * Thuban/Model/data.py (ShapefileStore.__init__): Use an
3913     AutoTransientTable so that data is copied to the transient DB on
3914     demand.
3915     (SimpleStore): New class that simply combines a table and a
3916     shapefile
3917    
3918     * Thuban/Model/table.py (Table, DBFTable): Rename Table into
3919     DBFTable and update its doc-string to reflect the fact that this
3920     is only the table interface to a DBF file. Table is now an alias
3921     for DBFTable for temporary backwards compatibility.
3922    
3923     * Thuban/UI/application.py (ThubanApplication.OnExit): Make sure
3924     the last reference to the session goes away so that the temporary
3925     files are removed properly.
3926    
3927     * test/test_load.py (LoadSessionTest.tearDown): Remove the
3928     reference to the session to make sure the temporary files are
3929     removed.
3930    
3931     2003-04-29 Bernhard Herzog <[email protected]>
3932    
3933 bh 764 * Thuban/Model/load.py (XMLReader.__init__, XMLReader.read): Turn
3934     the __parser instance variable into a normal local variable in
3935     read. It's only used there and read will never be called more than
3936     once. Plus it introduces a reference cycle that keeps can keep the
3937     session object alive for a long time.
3938    
3939 jonathan 767 2003-04-29 Jonathan Coles <[email protected]>
3940 jonathan 735
3941 jonathan 762 * Thuban/Model/proj.py (Projection): Removed Set*() methods to make
3942     Projection an immutable item. Fixes RTbug #1825.
3943     (Projection.__init__): Initialize instance variables here.
3944     (ProjFile.Replace): New. Replace the given projection object with
3945     the new projection object. This solves the problem of needing the
3946     mutator Projection.SetProjection() in the ProjFrame class and
3947     allows a projection to change parameters without changing its
3948     location in the file.
3949    
3950     * Thuban/UI/mainwindow.py (MainWindow.SaveSessionAs): Dialog should
3951     be of type wxSAVE and should verify overwriting a file.
3952    
3953     * Thuban/UI/projdialog.py (ProjFrame._OnSave): Use the new
3954     ProjFile.Replace() method instead of the mutator
3955     Projection.SetProjection(). Also requires that we reassign the
3956     client data to the new projection.
3957    
3958     * test/test_proj.py (TestProjection.test): Test GetName() and
3959     GetAllParameters()
3960     (TestProjFile.test): Remove tests for Set*() methods. Add tests
3961     for Replace().
3962    
3963     2003-04-25 Jonathan Coles <[email protected]>
3964    
3965 jonathan 756 * Thuban/Model/save.py (SessionSaver.write_projection): Make sure
3966     to save the name of the projection.
3967    
3968     * test/test_save.py (SaveSessionTest.testLayerProjection): New
3969     test to verify layer projections are saved correctly.
3970    
3971     2003-04-25 Jonathan Coles <[email protected]>
3972    
3973 jonathan 753 * Thuban/Model/proj.py (Projection.SetName): Set the name
3974     to "Unknown" if name is None.
3975     (Projection.SetAllParameters): New. Set the projection's
3976     parameter list to the one supplied.
3977     (Projection.SetProjection): New. Set the projection's
3978     properties to those of the supplied Projection.
3979    
3980     * Thuban/UI/mainwindow.py (MainWindow.MapProjection): Set
3981     the dialog title to include the map's title.
3982     (MainWindow.LayerProjection): Set the dialog title to include
3983     the layer's title.
3984    
3985     * Thuban/UI/projdialog.py (ProjFrame.__ShowError): Consolidate
3986     error dialogs into a single method call.
3987     (ProjFrame.__VerifyButtons): Add more states to check.
3988     (ProjFrame.__GetProjection): Return the current state of an
3989     edited projection or None.
3990     (ProjFrame.__FillAvailList): Remove checks for states that
3991     shouldn't exist.
3992     (ProjFrame._OnNew): Clear all selected items and supply
3993     a projection panel if necessary.
3994    
3995     * test/test_proj.py (TestProjFile.test): Add tests for
3996     ProjFile.SetAllParameters, ProjFile.SetProjection,
3997     ProjFile.SetName.
3998    
3999     2003-04-25 Jonathan Coles <[email protected]>
4000    
4001 jonathan 748 * Thuban/UI/projdialog.py (ProjFrame.__FillAvailList): Now
4002     takes an optional argument to select the current projection.
4003     This does not guarantee that the item is visible due to
4004     limited wxWindows functionality. Fixes RTBug #1821.
4005    
4006     2003-04-25 Jonathan Coles <[email protected]>
4007    
4008 jonathan 743 * Thuban/Model/load.py (SessionLoader.start_projection): Remember
4009     the projection name and use it when constructing the Projection
4010     object.
4011    
4012     * Thuban/Model/proj.py (Projection.__init__): Change the default
4013     value for 'name' to None and then test if name is equal to None
4014     in the body of the constructor. This way the caller doesn't have to
4015     know what the default value should be. Namely, useful in load.py
4016     where we have to pick a default value if the 'name' parameter
4017     doesn't exist in the XML file.
4018    
4019     * test/test_load.py (LoadSessionTest.testLayerProjection): New.
4020     Tests a file where a layer has a projection.
4021    
4022     2003-04-25 Jonathan Coles <[email protected]>
4023    
4024 jonathan 735 * Thuban/Model/layer.py (Layer.TreeInfo): Add an item to the
4025     tree for projection information.
4026    
4027     * Thuban/Model/load.py (XMLReader.GetFilename): Renamed from
4028     XMLReader.GetFileName.
4029     (SessionLoader): Added support for loading projection tags that
4030     appear inside a layer.
4031    
4032     * Thuban/Model/proj.py (ProjFile): Document the class. Move
4033     back to using a list because the order of the projections in
4034     the file is important to maintain. Fixes RTbug #1817.
4035    
4036     * Thuban/Model/resource.py: Rename calls to ProjFile.GetFileName
4037     to ProjFile.GetFilename.
4038    
4039     * Thuban/Model/save.py (SessionSaver.write_layer): Save projection
4040     information.
4041    
4042     * Thuban/UI/projdialog.py (ProjFrame._OnAddToList): Renamed from
4043     ProjFrame._OnSaveAs. Removed old dead code from previous
4044     implementation.
4045     (ProjFrame._OnExport): Add support for exporting more than one
4046     projection to a single file.
4047     (ProjFrame.__FillAvailList): use string formatting (% operator)
4048     to build strings that are (partly) translated. Fixes RTbug #1818.
4049    
4050     * test/test_proj.py (TestProjFile.test): New. Tests the base ProjFile
4051     class.
4052    
4053 bh 734 2003-04-24 Bernhard Herzog <[email protected]>
4054    
4055     * po/es.po: Updated Spanish translation by Daniel Calvelo Aros
4056    
4057     * po/fr.po: New. French translation by Daniel Calvelo Aros
4058    
4059     * Thuban/UI/projdialog.py (ProjFrame._OnSaveAs): Don't translate
4060     empty strings.
4061    
4062 jonathan 735 2003-04-24 Jonathan Coles <[email protected]>
4063 jonathan 724
4064     * Thuban/Model/layer.py (Layer.GetProjection): New. Needed to
4065     implement the interface that the ProjFrame dialog expects.
4066    
4067     * Thuban/Model/proj.py (Projection.SetName): New. Allows the
4068     name of the projection to be changed.
4069     (ProjFile): Use a dictionary instead of a list so that removing
4070     projections is easier and we are sure about uniqueness.
4071     (ProjFile.Remove): Remove the given projection object.
4072    
4073     * Thuban/Model/resource.py (GetSystemProjFiles, GetUserProjFiles):
4074     Return a list with only one projection file instead of searching for
4075     any projection file. This simplifies many things if the user can
4076     only have one system file and one user file.
4077    
4078     * Thuban/UI/classgen.py: Change all references to
4079     genCombo to genChoice.
4080    
4081     * Thuban/UI/mainwindow.py: Add a Projection option under the
4082     layer menu.
4083     (MainWindow.LayerProjection): New. Open up a projection window
4084     for a layer.
4085    
4086     * Thuban/UI/projdialog.py: Large changes to how the dialog is
4087     laid out. Use three panels instead of one. One for the list of
4088     projections, one for the edit controls, and one for the buttons.
4089     Fixed resizing problems so that the dialog resizes correctly
4090     when the projection panel changes. Added import/export, save, and
4091     new buttons/functionality.
4092    
4093 bh 723 2003-04-24 Bernhard Herzog <[email protected]>
4094    
4095     First step towards table management. Introduce a simple data
4096     abstraction so that we replace the data a layer uses more easily
4097     in the next step.
4098    
4099     * Thuban/Model/data.py: New file with a simple data abstraction
4100     that bundles shapefile and dbffile into one object.
4101    
4102     * Thuban/Model/session.py (Session.OpenShapefile): New method to
4103     open shapefiles and return a shape store object
4104    
4105     * Thuban/Model/layer.py (Layer.__init__): Pass the data as a store
4106     object instead of a shapefile filename. This introduces a new
4107     instance variable store holding the datastore. For intermediate
4108     backwards compatibility keep the old instance variables.
4109     (open_shapefile): Removed. No longer needed with the shape store.
4110     (Layer.SetShapeStore, Layer.ShapeStore): New methods to set and
4111     get the shape store used by a layer.
4112     (Layer.Destroy): No need to explicitly destroy the shapefile or
4113     table anymore.
4114    
4115     * Thuban/UI/mainwindow.py (MainWindow.AddLayer)
4116     (MainWindow.AddLayer): Use the session's OpenShapefile method to
4117     open shapefiles
4118    
4119     * Thuban/Model/load.py (ProcessSession.start_layer): Use the
4120     session's OpenShapefile method to open shapefiles
4121    
4122     * test/test_classification.py
4123     (TestClassification.test_classification): Use the session's
4124     OpenShapefile method to open shapefiles and build the filename in
4125     a more platform independed way
4126    
4127     * test/test_layer.py (TestLayer.setUp, TestLayer.tearDown):
4128     Implement to have a session to use in the tests
4129     (TestLayer.test_arc_layer, TestLayer.test_polygon_layer)
4130     (TestLayer.test_point_layer, TestLayer.test_empty_layer): Use the
4131     session's OpenShapefile method to open shapefiles
4132     (TestLayerLegend.setUp): Instantiate a session so that we can use
4133     it to open shapefiles.
4134     (TestLayerLegend.tearDown): Make sure that all references to
4135     layers and session are removed otherwise we may get a resource
4136     leak
4137    
4138     * test/test_map.py (TestMapAddLayer.test_add_layer)
4139     (TestMapWithContents.setUp): Instantiate a session so that we can
4140     use it to open shapefiles.
4141     (TestMapWithContents.tearDown): Make sure that all references to
4142     layers, maps and sessions are removed otherwise we may get a
4143     resource leak
4144     ("__main__"): use support.run_tests() so that more info about
4145     uncollected garbage is printed
4146    
4147     * test/test_save.py (SaveSessionTest.testSingleLayer): Use the
4148     session's OpenShapefile method to open shapefiles
4149     ("__main__"): use support.run_tests() so that more info about
4150     uncollected garbage is printed
4151    
4152     * test/test_selection.py (TestSelection.tearDown): Make sure that
4153     all references to the session and the selection are removed
4154     otherwise we may get a resource leak
4155     (TestSelection.get_layer): Instantiate a session so that we can
4156     use it to open shapefiles.
4157     ("__main__"): use support.run_tests() so that more info about
4158     uncollected garbage is printed
4159    
4160     * test/test_session.py (TestSessionBase.tearDown)
4161     (TestSessionWithContent.tearDown): Make sure that all references
4162     to the session and layers are removed otherwise we may get a
4163     resource leak
4164     (TestSessionWithContent.setUp): Use the session's OpenShapefile
4165     method to open shapefiles
4166    
4167 jonathan 721 2003-04-24 Jonathan Coles <[email protected]>
4168    
4169     * Thuban/Model/load.py (XMLReader.read): Should have been checking
4170     if the file_or_filename object had the 'read' attribute.
4171    
4172 jonathan 715 2003-04-23 Jonathan Coles <[email protected]>
4173    
4174 jonathan 720 * Thuban/Model/resource.py: Fixes RTbug #1813.
4175     (ReadProjFile): Add documentation about which exceptions are raised.
4176     Always pass the exceptions up to the caller.
4177     (GetProjFiles): If the directory can't be read return an empty list.
4178     If any of the proj files can't be read skip that file and go
4179     on to the next one.
4180    
4181     * test/test_proj.py: Added test cases to handle nonexistent files,
4182     unreadable files, and files that don't parse correctly.
4183    
4184     2003-04-23 Jonathan Coles <[email protected]>
4185    
4186 jonathan 716 Projection dialog. Allows the user to select from a list
4187     of projection templates and optionally edit them and save new ones.
4188    
4189     * Thuban/UI/projdialog.py (ProjFrame): New. Main dialog.
4190     (ProjPanel): Base class for projection specific panels.
4191     (TMPanel): Projection panel for Transverse Mercartor.
4192     (UTMPanel): Projection panel for Universal Transverse Mercartor.
4193     (LCCPanel): Projection panel for Lambert Conic Conformal.
4194     (GeoPanel): Projetion panel for Geographic Projection.
4195    
4196     2003-04-23 Jonathan Coles <[email protected]>
4197    
4198 jonathan 715 * Thuban/Model/load.py (XMLReader): Renamed from XMLProcessor to
4199     promote symmetry. There now exists XMLReader and XMLWriter.
4200     (XMLReader.read): New. Call to read the given file descriptor or
4201     filename.
4202     (XMLReader.close): New. Make sure the file is closed.
4203     (XMLReader.GetFileName): New. Return just the file name that is being
4204     read from.
4205     (XMLReader.GetDirectory): New. Return just the directory of the file
4206     that is being read.
4207     (XMLReader.AddDispatchers): New. Take a dictionary which contains
4208     the names of functions to call as the XML tree is parsed.
4209     (XMLReader.startElementNS): Updated to use new dispatcher dictionary.
4210     (XMLReader.endElementNS): Updated to use new dispatcher dictionary.
4211     (SessionLoader): Removed class variables start_dispatcher and
4212     end_dispatcher since this functionality is now part of a class
4213     instance. Fixes RTbug #1808.
4214     (SessionLoader.__init__): Add dispatcher functions.
4215     (load_xmlfile): Code was moved into the XMLReader.read().
4216     (load_session): Use modified SessionLoader.
4217    
4218     * Thuban/Model/map.py (Map.GetProjection): New. Returns the
4219     map's projection.
4220    
4221     * Thuban/Model/proj.py (Projection.GetParameters): Renamed to
4222     GetAllParameters.
4223     (Projection.GetParameter): Returns the value for the given parameter.
4224    
4225     * Thuban/Model/resource.py: Use XMLReader and XMLWriter.
4226     (GetProjFiles): Renamed from GetProjections. Now returns a list
4227     of ProjFile objects.
4228     (GetSystemProjFiles): Renamed from GetSuppliedProjections. Returns
4229     a list of ProjFile objects whose files are not user defined.
4230     (GetUserProjFiles): Renamed from GetUserProjections. Returns a
4231     list of ProjFile objects whose files are user defined.
4232     (ProjFileReader): Extend new XMLReader.
4233    
4234     * Thuban/Model/save.py (XMLWriter): Renamed from XMLSaver to
4235     promote symmetry.
4236    
4237     * Thuban/UI/classgen.py (ClassGenDialog.__init__): Use a wxChoice
4238     control instead of a wxComboBox. wxChoice controls do not generate
4239     events as the uses highlights possible choices which fixes problems
4240     with resizing the dialog when the use selects an option.
4241    
4242     * Thuban/UI/classifier.py (Classifier.__init__): Use a wxChoice
4243     control instead of a wxComboBox.
4244    
4245     * Thuban/UI/mainwindow.py (MainWindow.Projection): Use new projection
4246     dialog.
4247    
4248     * test/test_proj.py (TestProjection.test): New tests for GetParameter
4249     method.
4250    
4251 bh 703 2003-04-22 Bernhard Herzog <[email protected]>
4252    
4253 bh 705 * Thuban/UI/mainwindow.py: Remove some unused imports and global
4254     constants
4255    
4256 bh 703 * Thuban/UI/identifyview.py (IdentifyListCtrl.selected_shape)
4257     (IdentifyGridCtrl.selected_shape): Use table, not shapetable.
4258    
4259 bh 700 2003-04-17 Bernhard Herzog <[email protected]>
4260    
4261 bh 701 * Thuban/Model/layer.py: Don't import LAYER_LEGEND_CHANGED.
4262     (Layer): Update doc-string since LAYER_LEGEND_CHANGED is not used
4263     anymore.
4264     (Layer.BoundingBox, Layer.GetFieldType, Layer.NumShapes)
4265     (Layer.ShapeType, Layer.Shape): No need to call
4266     self.open_shapefile since it's always called in __init__
4267    
4268 bh 700 * Thuban/UI/application.py (ThubanApplication.MainLoop): Removed.
4269     In wxPython 2.4 there's no need to extend MainLoop anymore since
4270     wxPython itself makes sure OnExit is called.
4271    
4272 jonathan 688 2003-04-16 Jonathan Coles <[email protected]>
4273    
4274 jonathan 693 Initial putback of projection management code. Includes new
4275     classes to read and write projection files. The current load
4276     and save classes were abstracted a bit so they could be reused.
4277     The Projection class was extended to provide new methods and
4278     have a name.
4279    
4280     * Thuban/Model/load.py (XMLProcessor): New. Contains all the
4281     general XML reading methods that were part of ProcessSession.
4282    
4283     * Thuban/Model/proj.py (Projection.__init__): Accepts an optional
4284     name.
4285     (ProjFile): New. Represents a file that contains projection
4286     information.
4287    
4288     * Thuban/Model/resource.py: New. Contains general utilities
4289     for read and writing projection files.
4290    
4291     * Thuban/Model/save.py (XMLSaver): New. Contains all the
4292     general XML writing methods that were part of SessionSaver.
4293     (SessionSaver): Renamed from Saver.
4294    
4295     * test/test_proj.py: New test cases for the projection
4296     file read and write functions.
4297    
4298     2003-04-16 Jonathan Coles <[email protected]>
4299    
4300 jonathan 688 * Thuban/Model/classification.py: Use repr() around values
4301     in the ClassGroup*.__repr__() methods so it is clearer when
4302     a value is a string and when it is a number.
4303    
4304     * test/test_load.py: Rework the classification test to test
4305     that we can load old files.
4306     (testLabels): Test a file where the groups have labels.
4307    
4308 bh 687 2003-04-16 Bernhard Herzog <[email protected]>
4309    
4310     Safer implementation of the performance enhancements of the
4311     low-level renderer:
4312    
4313     * extensions/thuban/wxproj.cpp (extract_projection)
4314     (extract_pointer): Rename extract_projection to extract_pointer
4315     and redefine its purpose to return the pointer stored in a CObject
4316     returned by the object's cobject method. Update all callers.
4317     (s_draw_info, free_draw_info, draw_polygon_init): Implement the
4318     handling of these low-level parameters so that each s_draw_info
4319     instance is handled as a CObject at python level that also
4320     contains real references to the actual python objects which
4321     contain the values in the struct. Add free_draw_info as the
4322     destructor.
4323     (draw_polygon_shape): Add the py_draw_info parameter which must a
4324     cobject containing an s_draw_info pointer.
4325    
4326     * Thuban/UI/renderer.py (MapRenderer.polygon_render_param): New
4327     method to instantiat the low-level render parameter
4328     (MapRenderer.draw_shape_layer): Use the new method. Remove some
4329     commented out code.
4330     (MapRenderer.draw_polygon_shape): Make the first parameter not the
4331     layer but the low-level render parameter
4332     (ScreenRenderer.draw_shape_layer): Use the low-level render
4333     parameter.
4334    
4335 jonathan 673 2003-04-15 Jonathan Coles <[email protected]>
4336    
4337 jonathan 680 * Thuban/Model/classification.py: Implemented __repr__ for
4338     the ClassGroup* classes to make debugging a bit easier.
4339     (ClassGroup.SetLabel): Check that the string is an instance
4340     of StringTypes not StringType. Accounts for Unicode strings.
4341    
4342     * Thuban/Model/color.py: Implemented __repr__ to make
4343     debugging a bit easier.
4344    
4345     * Thuban/Model/save.py (Saver.write_classification): Need to
4346     save the group label.
4347    
4348     * test/test_load.py (testClassification): New. Loads the
4349     iceland_sample_test.thuban file and checks if it was loaded
4350     correctly.
4351    
4352     2003-04-15 Jonathan Coles <[email protected]>
4353    
4354 jonathan 673 * extensions/thuban/wxproj.cpp (draw_polygon_init): New. Used
4355     to improve rendering performance by initializing the variables
4356     that are not change each time draw_polygon_shape() is called.
4357     The values are stored in a global struct draw_info.
4358     (draw_polygon_shape): Removed initialization code that is
4359     now in draw_polygon_init().
4360    
4361     * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Make
4362 jonathan 674 drawing initialization call to draw_polygon_init()
4363     (MapRenderer.draw_polygon_shape): Use new signature of
4364     draw_polygon_shape.
4365 jonathan 673
4366 jonathan 674 * Thuban/UI/classgen.py (GenUniformPanel): Fix spin control
4367     weirdness by setting the range to (1, maxint).
4368 jonathan 673
4369 jonathan 674 * Thuban/Model/classification.py (ClassGroupProperties): Make
4370     instance variables private and optimize comparison operator
4371     by first checking if the color references are the same.
4372     (ClassGroupSingleton): Make instance variables private.
4373     (ClassGroupRange): Make instance variables private.
4374 jonathan 673
4375 jonathan 674 * HOWTO-Release: Filled in missing steps for releasing packages.
4376    
4377 bh 672 2003-04-15 Bernhard Herzog <[email protected]>
4378    
4379     First stab at internationalized messages:
4380    
4381     * Thuban/__init__.py (_): Implement the translation function for
4382     real using the python gettext module.
4383    
4384     * Thuban/UI/classifier.py (ClassTable.GetRowLabelValue): Don't
4385     translate empty strings.
4386    
4387     * Thuban/UI/application.py (ThubanApplication.read_startup_files):
4388     Add a missing space to a warning message
4389    
4390     * po/README: New. Notes about the management of the translation
4391     files.
4392    
4393     * po/Makefile: New. Makefile to help manage the translation files.
4394    
4395     * po/es.po: New. Spanish translation by Daniel Calvelo Aros
4396    
4397     * MANIFEST.in: Include the *.mo files in Resources/Locale and the
4398     translations and support files in po/
4399    
4400     * setup.py (data_files): Add the *.mo files to the data_files too
4401    
4402     * README: Add note about the translations when building from CVS
4403    
4404 jonathan 669 2003-04-14 Jonathan Coles <[email protected]>
4405    
4406     * Thuban/UI/dock.py: Fixes some window resizing problems most
4407     noticable under windows. Always assume the button bitmaps will
4408     be there. Code clean up.
4409     (DockabelWindow.Dock, DockableWindow.UnDock): Force all the
4410     images for the dock/undock button to the same images.
4411     Work around for RTbug #1801.
4412    
4413     * Thuban/UI/legend.py (LegendPanel.__init__): The toolbar should
4414     be allowed to grow within the sizer. Fixes a bug under Windows
4415     where the toolbar wasn't being drawn.
4416    
4417 frank 664 2003-04-14 Frank Koormann <[email protected]>
4418    
4419     * Resources/Bitmaps/dock_12.xpm, Resources/Bitmaps/undock_12.xpm:
4420     Updated design to try to make the button functionality more
4421     transparent.
4422    
4423 jonathan 662 2003-04-14 Jonathan Coles <[email protected]>
4424    
4425     * Thuban/UI/legend.py (LegendPanel.__init__): Call Create() to
4426     finalize the intialization of the panel.
4427    
4428     * Thuban/UI/dock.py (DockPanel.Create): New. Finalizes the
4429     creation of the panel. Should be the last thing called in the
4430     initializer of a subclass.
4431    
4432     * Thuban/UI/classgen.py (ClassGenDialog.__init__): Actively
4433     set the current selections in the combo boxes. This is needed
4434     under Windows.
4435    
4436     * Thuban/UI/classifier.py (Classifier.__init__): Add a top
4437     level panel to the dialog so that the background colors are
4438     consistent under Windows.
4439    
4440 jonathan 646 2003-04-11 Jonathan Coles <[email protected]>
4441    
4442 jonathan 662 * Thuban/UI/classgen.py: Change color ramps to start at white
4443     not black.
4444    
4445     * Thuban/UI/legend.py: Enable/disable the legend buttons when
4446     the legend changes. Fixes RTbug #1793.
4447    
4448     * test/test_classification.py: Added test for copying of
4449     classifications.
4450    
4451     2003-04-11 Jonathan Coles <[email protected]>
4452    
4453 jonathan 647 * Thuban/UI/resource.py: New. Centralize the loading of resources
4454     such as bitmaps.
4455    
4456     * Thuban/UI/classgen.py (GenUniquePanel.__init__): Reordered buttons,
4457     added images to the move buttons, added 'reverse' button.
4458     (CustomRampPanel.__init__): Added images to the move buttons.
4459     (GreyRamp): New. Generates a ramp from white to black.
4460     (HotToColdRamp): New. Generates a ramp from cold to hot colors.
4461    
4462     * Thuban/UI/classifier.py: Refactored ID's from ID_CLASSIFY_* to
4463     ID_PROPERTY_*.
4464     (Classifier.__init__): Minor changes to the layout.
4465     (Classifier._OnTitleChanged): Listen for when the user edits the
4466     title and update the dialog's title and the layer's title.
4467    
4468     * Thuban/UI/dock.py: Use new bitmaps for the control buttons.
4469    
4470     * Thuban/UI/legend.py: Use new bitmaps for the control buttons.
4471     (LegendTree._OnMsgLayerTitleChanged): Change the displayed title
4472     if the layer's title changes.
4473    
4474     * Thuban/UI/mainwindow.py: Added new menu item and associated code
4475     to open a dialog to rename the map.
4476     (MainWindow): Use new resource class to import bitmaps.
4477    
4478     2003-04-11 Jonathan Coles <[email protected]>
4479    
4480 jonathan 646 * Resources/Bitmaps/close_12.xpm, Resources/Bitmaps/dock_12.xpm,
4481 jonathan 647 Resources/Bitmaps/group_use.xpm, Resources/Bitmaps/group_use_all.xpm,
4482     Resources/Bitmaps/group_use_none.xpm,
4483     Resources/Bitmaps/group_use_not.xpm,
4484     Resources/Bitmaps/hide_layer.xpm,
4485     Resources/Bitmaps/layer_properties.xpm,
4486     Resources/Bitmaps/lower_layer.xpm, Resources/Bitmaps/raise_layer.xpm,
4487     Resources/Bitmaps/show_layer.xpm, Resources/Bitmaps/undock_12.xpm:
4488     New.
4489 jonathan 646
4490 jonathan 636 2003-04-10 Jonathan Coles <[email protected]>
4491    
4492 jonathan 644 * Thuban/Model/classification.py: (ClassGroupRange.__init__):
4493     Should pass group to ClassGroup constructor.
4494    
4495     2003-04-10 Jonathan Coles <[email protected]>
4496    
4497 jonathan 636 * Thuban/Model/classification.py: (ClassGroup): Move all the common
4498     methods of the derived classes ([Set|Get]Properties(), __eq__, __ne__)
4499     here. Implement SetVisible(), IsVisible().
4500     (ClassGroup.__init__): Add group parameter which acts as a copy
4501     constructor.
4502    
4503     * Thuban/UI/classifier.py (ClassTable): Add a new column for the
4504     "Visible" check boxes.
4505     (Classifier): Rename the buttons and refactor the code to match
4506     the new labels.
4507    
4508     * Thuban/UI/legend.py: Classify button is now called "Properties".
4509     Refactored the code to change variable names.
4510     (LegendTree.__FillTreeLayer): Only list a group if it is visible.
4511    
4512     * Thuban/UI/mainwindow.py: MainWindow.OpenClassifier renamed to
4513     MainWindow.OpenLayerProperties. MainWindow.LayerEditProperties
4514     renamed to MainWindow.LayerEditProperties.
4515     (MainWindow.ToggleLegend): Don't include map name in legend title.
4516     (MainWindow.SetMap): Added the map name to the window title.
4517     (MainWindow.LayerFillColor, MainWindow.LayerTransparentFill,
4518     MainWindow.LayerOutlineColor, MainWindow.LayerNoOutline): Removed.
4519     Functionality is found in the layer properties dialog.
4520    
4521     * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Only
4522     draw visible groups.
4523    
4524 jonathan 626 2003-04-09 Jonathan Coles <[email protected]>
4525    
4526 jonathan 634 * Thuban/UI/classgen.py: Modifications to allow simple
4527     addition and selection of new color schemes.
4528     (MonochromaticRamp): New. Generates a ramp between two colors.
4529     (RedRamp): New. Generates a ramp of all red.
4530     (GreenRamp): New. Generates a ramp of all green.
4531     (BlueRamp): New. Generates a ramp of all blue.
4532    
4533     2003-04-09 Jonathan Coles <[email protected]>
4534    
4535 jonathan 626 * Thuban/Model/classification.py (Classification.__deepcopy__):
4536     Need to copy over field and fieldType attributes.
4537    
4538     * Thuban/Model/table.py (Table.field_range): New. Retrive the
4539     maximum and minimum values over the entire table for a given
4540     field.
4541     (Table.GetUniqueValues): New. Retrieve all the unique values
4542     in the table for a given field.
4543    
4544     * Thuban/UI/classgen.py: Renamed GenRangePanel to GenUniformPanel.
4545     (GenUniquePanel): New. Controls to allow the user to select
4546     which unique field values they would like in the classification.
4547     (CustomRampPanel): Code that was in ClassGenDialog that allows
4548     the user to select the properties for a custom ramp.
4549     (ClassGenerator.GenUniformDistribution): Was called GenerateRanges.
4550    
4551     * Thuban/UI/classifier.py: Removed a lot of debugging code.
4552     (Classifier._SetClassification): Callback method so that the
4553     class generator can set the classification in the grid.
4554     (ClassGroupPropertiesCtrl): New. Encapsulates the drawing and
4555     editing of a group properties class into a wxWindows control.
4556    
4557     * Thuban/UI/dock.py: It was decided that if the user closes
4558     a dockable window the window should simply hide itself. That
4559     way if the user wants to show the dock again it appears in the
4560     same place as it was when it was closed.
4561     (DockableWindow.Destroy): Call renamed method OnDockDestroy().
4562     (DockableWindow._OnButtonClose): Hide the window instead of
4563     destroying it.
4564     (DockableWindow._OnClose): Hide the window instead of
4565     destroying it.
4566    
4567     * Thuban/UI/legend.py (LegendTree): Use a private method to
4568     consistently set the font and style of the text. Fixes RTbug #1786.
4569    
4570     * Thuban/UI/mainwindow.py: Import just the Classifier class.
4571    
4572 bh 623 2003-04-07 Bernhard Herzog <[email protected]>
4573    
4574 bh 625 * Thuban/UI/mainwindow.py (main_menu): Move the toggle_legend item
4575     to the map module
4576    
4577     2003-04-07 Bernhard Herzog <[email protected]>
4578    
4579 bh 623 * Thuban/UI/mainwindow.py (MainWindow.ShowSessionTree): Removed in
4580     favor of ToggleSessionTree
4581     (MainWindow.ToggleSessionTree): New method to toggle visibility of
4582     the session tree.
4583     (MainWindow.SessionTreeShown): New method to return whether the
4584     session tree is currently shown.
4585     (MainWindow.ToggleLegend): New method to toggle visibility of the
4586     legend
4587     (MainWindow.ShowLegend): Implement in terms of ToggleLegend and
4588     LegendShown
4589     (MainWindow.LegendShown): New method to return whether the legend
4590     is currently shown.
4591     (_method_command): Add checked parameter so we can define check
4592     menu items
4593     (_has_tree_window_shown, _has_legend_shown): Use the appropriate
4594     mainwindow methods.
4595     (show_session_tree, show_legend commands): Removed.
4596     (toggle_session_tree, toggle_legend commands): New commands to
4597     toggle the visibility of the dialogs
4598    
4599 jonathan 612 2003-04-07 Jonathan Coles <[email protected]>
4600    
4601 jonathan 619 * Thuban/UI/classgen.py: Fix Windows problem.
4602    
4603     * Thuban/UI/dock.py: Fix Windows problem.
4604    
4605     * Thuban/UI/mainwindow.py: Use False instead of false.
4606     (MainWindow.ShowLegend): Remove unnecessary switch parameter.
4607    
4608     2003-04-07 Jonathan Coles <[email protected]>
4609    
4610 jonathan 612 Since we now say that the order of the groups in a classification
4611     matters, it makes sense to be able to manipulate that order. Most
4612     of the changes to Thuban/Model/classification.py are to that end.
4613    
4614     * Thuban/Model/classification.py (Classification.AppendGroup,
4615     Classification.InsertGroup, Classification.ReplaceGroup,
4616     Classification.RemoveGroup, Classification.GetGroup): Do as the
4617     names imply.
4618     (Classification.FindGroup): This was called GetGroup, but GetGroup
4619     takes an index, while FindGroup takes a value.
4620     (Classification.__deepcopy__): Copy all the groups, BUT NOT THE LAYER
4621     REFERENCE. Currently there is a cyclic reference between the layer
4622     and its classification. If the classification doesn't need to know
4623     its owning layer we can change this, since it may make sense to be
4624     able to use the same classification with different layers.
4625    
4626     * Thuban/Model/load.py: Use Classification.AppendGroup(), not AddGroup()
4627    
4628     * Thuban/UI/classgen.py: Use Classification.AppendGroup(),
4629     not AddGroup()
4630    
4631     * Thuban/UI/classifier.py: Now that we can depend on the order in
4632     a Classification and have methods to manipulate that order we don't
4633     need to use our own data structures in the grid. We can simply make
4634     the grid/table access the information they need from a copy of
4635     the classification object.
4636     (Classifier._OnCloseBtn): Event handler for when the user clicks
4637     'Close'. This is needed so if the user applies changes and then
4638     continues to change the table the user has the option of discarding
4639     the most recent changes and keeping what they applied.
4640    
4641     * Thuban/UI/mainwindow.py: Put "Show Legend" and "Show Session Tree"
4642     into the same group.
4643    
4644     * extensions/thuban/wxproj.cpp (check_version): If Thuban is compiled
4645     with a really old version of proj, PJ_VERSION won't even be defined.
4646     If it isn't defined then just compile so that the function always
4647     returns Py_False.
4648    
4649     * test/test_classification.py: Fix tests to use the renamed methods.
4650     Still need to write tests for the new methods.
4651    
4652 jonathan 601 2003-04-04 Jonathan Coles <[email protected]>
4653 jonathan 608
4654 jonathan 612 * Thuban/UI/classifier.py (Classifier.__SelectField): Move the
4655     call to SetSelection out of the method and before the call
4656     to __SelectField in __init__. This prevents a recursion of events
4657     when _OnFieldSelect is triggered by the user.
4658    
4659     2003-04-04 Jonathan Coles <[email protected]>
4660    
4661 jonathan 608 * Thuban/Model/classification.py: Rename Color.None to
4662     Color.Transparent.
4663     (ClassGroupProperties.SetLineColori, ClassGroupProperties.SetFill):
4664     Don't bother copying the color, since Colors are immutable.
4665    
4666     * Thuban/Model/color.py, Thuban/Model/layer.py, Thuban/Model/load.py,
4667     Thuban/UI/classifier.py, Thuban/UI/mainwindow.py,
4668     Thuban/UI/renderer.py, Thuban/UI/view.py:
4669     Rename Color.None to Color.Transparent.
4670    
4671     * test/test_classification.py, test/test_load.py: Rename Color.None
4672     to Color.Transparent.
4673    
4674     2003-04-04 Jonathan Coles <[email protected]>
4675 jonathan 603
4676     * Thuban/Model/classification.py: Fix assert calls.
4677     (ClassGroupProperties.SetLineColor, ClassGroupProperties.SetFill):
4678     Copy the color parameter rather than hold onto a reference.
4679 jonathan 601
4680 jonathan 603 * Thuban/Model/color.py (Color.__copy__, Color.__deepcopy): Copy
4681     the color object.
4682     (NoColor.__copy__, NoColor.__deepcopy): Return 'self' so that we
4683     are sure there exists only one refernce to Color.None in the system.
4684     This allows us to use 'is' rather than the comparision functions.
4685    
4686     * Thuban/Model/save.py: Fix assert calls.
4687    
4688     * Thuban/UI/classifier.py: Fix assert calls.
4689     (ClassGrid._OnCellDClick): Call up to the classifier to open the
4690     dialog to edit the groups properties.
4691     (ClassGrid._OnCellResize): Make sure that the scollbars are drawn
4692     correctly if a cell is resized.
4693     (ClassTable.SetClassification): New. Changes the classification
4694     that is in the table.
4695     (ClassTable.__SetRow): Allow groups to be prepended.
4696     (Classifier): New code for opening the EditProperties and
4697     GenerateRanges dialogs.
4698     (SelectPropertiesDialog.__GetColor): Only set the color in the
4699     color dialog if the current color is not None.
4700    
4701     * Thuban/UI/dock.py: Fix assert calls.
4702    
4703     * Thuban/UI/legend.py: Fix assert calls.
4704    
4705     * Thuban/UI/renderer.py: Fix assert calls.
4706    
4707     * Thuban/UI/classgen.py (ClassGenDialog): Dialog for generating
4708     classifications.
4709     (GenRangePanel): Panel specific to range generation.
4710     (GenSingletonPanel): Panel specific to singleton generation.
4711     (ClassGenerator): Class responsible for actually generating
4712     the classification from the data gathered in the dialog box.
4713     (PropertyRamp): Generates properties whose values range from
4714     a starting property to an ending property.
4715 jonathan 601
4716 bh 600 2003-04-03 Bernhard Herzog <[email protected]>
4717    
4718     * test/support.py (print_garbage_information): New function that
4719     prints information about still connected messages and memory
4720     leaks.
4721     (run_suite): Removed.
4722     (run_tests): New function for use as a replacement of
4723     unittest.main in the test_* files. This one calls
4724     print_garbage_information at the end.
4725    
4726     * test/runtests.py (main): Use support.print_garbage_information
4727    
4728     * test/test_layer.py: Use support.run_tests instead of
4729     unittest.main so we get memory leak information
4730     (TestLayer.test_arc_layer, TestLayer.test_polygon_layer)
4731     (TestLayer.test_point_layer, TestLayer.test_empty_layer)
4732     (TestLayerLegend.test_visibility): Call the layer's Destroy method
4733     to fix a memory leak.
4734    
4735     * test/test_classification.py: Use support.run_tests instead of
4736     unittest.main so we get memory leak information
4737     (TestClassification.test_classification): Call the layer's Destroy
4738     method to fix a memory leak.
4739    
4740 bh 591 2003-04-02 Bernhard Herzog <[email protected]>
4741    
4742 bh 595 * extensions/thuban/wxproj.cpp (check_version, check_version_gtk):
4743     Handle the reference counts of the return value and errors in
4744     PyArg_ParseTuple correctly.
4745    
4746 bh 593 * Thuban/UI/application.py (ThubanApplication.OpenSession): Make
4747     sure the filename is absolute to avoid problems when saving the
4748     session again
4749    
4750 bh 591 * Thuban/Model/table.py: Remove unnecessary import. Fix a typo.
4751    
4752 jonathan 587 2003-04-01 Jonathan Coles <[email protected]>
4753    
4754 jonathan 589 * Thuban/UI/renderer.py (MapRenderer.draw_point_shape): Check
4755 jonathan 587 that there actually are points in the returned list of points
4756     before trying to index into the list. The list may be empty if
4757     the shape is a Null Shape.
4758    
4759 bh 586 2003-04-01 Bernhard Herzog <[email protected]>
4760    
4761     * test/test_map.py: Don't use from <module> import *
4762    
4763 jonathan 581 2003-04-01 Jonathan Coles <[email protected]>
4764    
4765     * Thuban/Model/session.py: Use LAYER_CHANGED instead of
4766     LAYER_LEGEND_CHANGED
4767    
4768     * Thuban/UI/dock.py (DockableWindow._OnButtonClose): Call
4769     self.Destroy() to close the window after yesterday's changes.
4770    
4771     * test/test_map.py, test/test_session.py: Fix messages that
4772     are sent from maps and layers.
4773    
4774 jonathan 575 2003-03-31 Jonathan Coles <[email protected]>
4775    
4776     * Thuban/UI/classifier.py: Commented out some debugging statements.
4777     (ClassDataPreviewer.Draw): Draw rectangles for polygon layers per
4778     RTbug #1769.
4779    
4780     * Thuban/UI/dock.py (DockableWindow.UnDock): Restore size and
4781     position (although position doesn't work yet under GTK).
4782     (DockableWindow.Destroy): New. Called when the window must be
4783     closed. Namely needed when the DockFrame closes and must close
4784     its children.
4785     (DockFrame): Listen for EVT_CLOSE and destroy all children.
4786    
4787     * Thuban/UI/legend.py (LegendPanel.Destroy): New. Cleans up
4788     when then window is told to close.
4789     (LegendTree._OnMsgLayerChanged): Fixes a seg fault bug. See
4790     comment in source for more info.
4791    
4792     * Thuban/UI/main.py: Show the legend by default when Thuban starts.
4793    
4794     * Thuban/UI/mainwindow.py: Renamed OnClose to _OnClose for
4795     symmetry with other such methods.
4796     (MainWindow.ShowLegend): Show the legend docked by default.
4797    
4798 jonathan 569 2003-03-28 Jonathan Coles <[email protected]>
4799    
4800     * Thuban/UI/classifier.py: Support for highlighting a specific
4801     group within the grid when the classification dialog is opened.
4802     Also contains a lot of debugging printouts which will later
4803     be removed.
4804    
4805     * Thuban/UI/dock.py: Complete rework on the dock code so that
4806     that it is fairly removed from the rest of the Thuban application.
4807     It is easy to add new docks which the rest of the program having
4808     to be aware of them.
4809    
4810     * Thuban/UI/legend.py: Modifications to support selecting a
4811     specific group in the classification dialog. Changed how layers
4812     are drawn when the layer is visible/invisible.
4813    
4814     * Thuban/UI/mainwindow.py: Removed legend specific code and
4815     replaced it with calls to the new dock code.
4816    
4817     * Thuban/UI/renderer.py (MapRenderer.__init__): Added assert
4818     to check if scale > 0. Trying to track down a divide by zero.
4819    
4820 jonathan 557 2003-03-26 Jonathan Coles <[email protected]>
4821    
4822 jonathan 567 * Thuban/UI/legend.py: Removed unnecessary LegendDialog class.
4823     (LegendPanel): Removed _OnDock()/_OnUnDock() methods which are
4824     now part of DockableWindow.
4825     (LegendPanel.DoOnSelChanged): Select the current layer in the
4826     map.
4827     (LegendTree._OnSelChanged): Call LegendPanel.DoOnSelChanged()
4828     with the selected layer and/or group.
4829    
4830     2003-03-26 Jonathan Coles <[email protected]>
4831    
4832 jonathan 557 This putback contains the code for dockable windows. There is
4833     no support in wxWindows as of this date for windows that can
4834     attach themselves to other windows.
4835    
4836     The current model contains a DockableWindow which has a parent
4837     window for when it is detached and a dock window that it puts
4838     its contents in when it is docked. The contents of a DockableWindow
4839     must be a DockPanel. DockPanel itself derives from wxPanel.
4840    
4841     * Thuban/Model/layer.py (Layer.ClassChanged): Send a LAYER_CHANGED
4842     message, not a LAYER_LEGEND_CHANGED message.
4843    
4844     * Thuban/Model/map.py (Map): Forward LAYER_CHANGED messages.
4845    
4846     * Thuban/UI/classifier.py (Classifier.__init__): Use wxADJUST_MINSIZE
4847     as one of the style properties for the fieldTypeText item to
4848     be sure that its size is correct when the text changes.
4849    
4850     * Thuban/UI/dock.py: New. Classes for the DockPanel and
4851     DockableWindow.
4852    
4853     * Thuban/UI/legend.py: Added some more buttons and made the
4854     LegendPanel a DockPanel.
4855    
4856     * Thuban/UI/mainwindow.py: Added sash windows to the main window
4857     and supporting functions for manipulating the sashes.
4858     (MainWindow.ShowLegend): Create a DockableWindow with the
4859     LegendPanel as the contents.
4860    
4861     * Thuban/UI/messages.py: Added DOCKABLE_* messages
4862    
4863     * Thuban/UI/view.py (MapCanves.SetMap): Listen for LAYER_CHANGED,
4864     not LAYER_LEGEND_CHANGED, messages.
4865    
4866 jonathan 554 2003-03-25 Jonathan Coles <[email protected]>
4867    
4868     * setup.py: Added custom script bdist_rpm_build_script so that
4869     when the rpm is built the path to wx-config is correct.
4870    
4871     * setup.cfg: Added line saying to use the custom build script
4872    
4873 jonathan 552 2003-03-20 Jonathan Coles <[email protected]>
4874    
4875     Initial implementation of the Legend.
4876    
4877     * Thuban/UI/legend.py: New. Creates a window that shows the map's
4878     Legend information and allows the user to add/modify classifications
4879     and how the layers are drawn on the map.
4880    
4881     * setup.py: New command 'build_docs' which currently uses
4882     happydoc to generate html documentation for Thuban.
4883    
4884     * Thuban/Model/classification.py (ClassGroup.GetDisplayText): New.
4885     Returns a string which is appropriately describes the group.
4886    
4887     * Thuban/Model/layer.py (Layer.SetClassification): Generate a
4888     LAYER_CHANGED event instead of a LAYER_LEGEND_CHANGED event.
4889    
4890     * Thuban/Model/map.py (Map): Rename messages and use new, more
4891     specific, messages.
4892    
4893     * Thuban/Model/messages.py: New message to indicate that a layer's
4894     data has changed (LAYER_CHANGED). New map messages to indicate
4895     when layers have been added/removed/changed or if the stacking order
4896     of the layers has changed.
4897    
4898     * Thuban/Model/session.py: Rename and use new messages.
4899    
4900     * Thuban/UI/classifier.py: Remember if any changes have actually
4901     been applied so that if the dialog is cancelled without an application
4902     of changes we don't have to set a new classification.
4903     (ClassDataPreviewer): Pulled out the window specific code and put it
4904     ClassDataPreviewWindow. ClassDataPreviewer can then be used to draw
4905     symbols on any DC.
4906    
4907     * Thuban/UI/mainwindow.py: New code to open the legend.
4908    
4909     * Thuban/UI/view.py: Use new message names.
4910    
4911 jonathan 541 2003-03-19 Jonathan Coles <[email protected]>
4912    
4913     * Thuban/UI/main.py (verify_versions): New. Checks the versions
4914     of Python, wxPython, and some other libraries.
4915    
4916     * extensions/thuban/wxproj.cpp (check_version): Checks the given
4917     version against what wxproj was compiled with.
4918     (check_version_gtk): If wxproj was compiled with gtk then check
4919     the given version against the version of the gtk library
4920     currently being used.
4921    
4922 bh 538 2003-03-14 Bernhard Herzog <[email protected]>
4923    
4924     * test/test_command.py: Run the tests when the module is run as a
4925     script
4926    
4927     2003-03-14 Bernhard Herzog <[email protected]>
4928    
4929     Implement selection of multiple selected shapes in the same layer:
4930    
4931     - Introduce a new class to hold the selection. This basically
4932     replaces the interactor which was nothing more than the
4933     selection anyway. A major difference is of course that the new
4934     selection class supports multiple selected shapes in one layer
4935    
4936     - Move the object that represents the selection from the
4937     application to the canvas. The canvas is a better place than the
4938     application because the selection represents which shapes and
4939     layer of the map displayed by the canvas are selected and
4940     affects how the map is drawn.
4941    
4942     - Make the selection and its messages publicly available through
4943     the mainwindow.
4944    
4945     - The non-modal dialogs do not get a reference to the interactor
4946     anymore as they can simply refer to their parent, the
4947     mainwindow, for the what the interactor had to offer.
4948    
4949     * Thuban/UI/selection.py: New module with a class to represent the
4950     selection.
4951    
4952     * Thuban/UI/messages.py (SELECTED_TABLE, SELECTED_MAP): Remove
4953     these unused messages
4954    
4955     * Thuban/UI/application.py (ThubanApplication.OnInit)
4956     (ThubanApplication.OnExit, ThubanApplication.SetSession): The
4957     interactor is gone now.
4958     (ThubanApplication.CreateMainWindow): There is no interactor
4959     anymore so we pass None as the interactor argument for now for
4960     compatibility.
4961    
4962     * Thuban/UI/view.py (MapCanvas.delegated_messages)
4963     (MapCanvas.Subscribe, MapCanvas.Unsubscribe): In Subscribe and
4964     Unsubscribe, delegate messages according to the delegated_messages
4965     class variable.
4966     (MapCanvas.__getattr__, MapCanvas.delegated_methods): Get some
4967     attributes from instance variables as described with the
4968     delegated_methods class variable.
4969     (MapCanvas.__init__): New instance variable selection holding the
4970     current selection
4971     (MapCanvas.do_redraw): Deal with multiple selected shapes. Simply
4972     pass them on to the renderer
4973     (MapCanvas.SetMap): Clear the selection when a different map is
4974     selected.
4975     (MapCanvas.shape_selected): Simple force a complete redraw. The
4976     selection class now takes care of only issueing SHAPES_SELECTED
4977     messages when the set of selected shapes actually does change.
4978     (MapCanvas.SelectShapeAt): The selection is now managed in
4979     self.selection
4980    
4981     * Thuban/UI/mainwindow.py (MainWindow.delegated_messages)
4982     (MainWindow.Subscribe, MainWindow.Unsubscribe): In Subscribe and
4983     Unsubscribe, delegate messages according to the delegated_messages
4984     class variable.
4985     (MainWindow.delegated_methods, MainWindow.__getattr__): Get some
4986     attributes from instance variables as described with the
4987     delegated_methods class variable.
4988     (MainWindow.__init__): The interactor as ivar is gone. The
4989     parameter is still there for compatibility. The selection messages
4990     now come from the canvas.
4991     (MainWindow.current_layer, MainWindow.has_selected_layer):
4992     Delegate to the the canvas.
4993     (MainWindow.LayerShowTable, MainWindow.Classify)
4994     (MainWindow.identify_view_on_demand): The dialogs don't need the
4995     interactor parameter anymore.
4996    
4997     * Thuban/UI/tableview.py (TableFrame.__init__)
4998     (LayerTableFrame.__init__, LayerTableFrame.OnClose)
4999     (LayerTableFrame.row_selected): The interactor is gone. It's job
5000     from the dialog's point of view is now done by the mainwindow,
5001     i.e. the parent. Subscribe to SHAPES_SELECTED instead
5002     of SELECTED_SHAPE
5003    
5004     * Thuban/UI/dialogs.py (NonModalDialog.__init__): The interactor
5005     is gone. It's job from the dialog's point of view is now done by
5006     the mainwindow, i.e. the parent.
5007    
5008     * Thuban/UI/classifier.py (Classifier.__init__): The interactor is
5009     gone. It's job from the dialog's point of view is now done by the
5010     mainwindow, i.e. the parent.
5011    
5012     * Thuban/UI/tree.py (SessionTreeView.__init__): The interactor is
5013     gone. It's job from the dialog's point of view is now done by the
5014     mainwindow, i.e. the parent.
5015     (SessionTreeCtrl.__init__): New parameter mainwindow which is
5016     stored as self.mainwindow. The mainwindow is need so that the tree
5017     can still subscribe to the selection messages.
5018     (SessionTreeCtrl.__init__, SessionTreeCtrl.unsubscribe_all)
5019     (SessionTreeCtrl.update_tree, SessionTreeCtrl.OnSelChanged): The
5020     selection is now accessible through the mainwindow. Subscribe to
5021     SHAPES_SELECTED instead of SELECTED_SHAPE
5022    
5023     * Thuban/UI/identifyview.py (IdentifyView.__init__): Use the
5024     SHAPES_SELECTED message now.
5025     (IdentifyView.selected_shape): Now subscribed to SHAPES_SELECTED,
5026     so deal with multiple shapes
5027     (IdentifyView.__init__, IdentifyView.OnClose): The interactor is
5028     gone. It's job from the dialog's point of view is now done by the
5029     mainwindow, i.e. the parent.
5030    
5031     * Thuban/UI/controls.py (RecordListCtrl.fill_list): The second
5032     parameter is now a list of shape ids.
5033     (RecordTable.SetTable): The second parameter is now a list of
5034     indices.
5035    
5036     * Thuban/UI/renderer.py (ScreenRenderer.RenderMap): Rename the
5037     selected_shape parameter and ivar to selected_shapes. It's now a
5038     list of shape ids.
5039     (MapRenderer.draw_label_layer): Deal with multiple selected
5040     shapes. Rearrange the code a bit so that the setup and shape type
5041     distinctions are only executed once.
5042    
5043     * test/test_selection.py: Test cases for the selection class
5044    
5045 jonathan 527 2003-03-11 Jonathan Coles <[email protected]>
5046    
5047     * Thuban/Model/load.py: Temporary fix so that the xml reader
5048     doesn't cause Thuban to crash.
5049    
5050     * Thuban/Model/layer.py: Handle the cyclic references between
5051     a layer and its classification better, and be sure to disconnect
5052     the classification from the layer when the layer is destroyed
5053     so that we don't maintain a cyclic reference that may not be
5054     garbage collected.
5055    
5056     * Thuban/Model/classification.py: See comment for layer.py.
5057    
5058 jan 523 2003-03-12 Jan-Oliver Wagner <[email protected]>
5059    
5060     * HOWTO-Release: New. Information on the steps for releasing
5061     a new version of Thuban.
5062    
5063 jonathan 514 2003-03-11 Jonathan Coles <[email protected]>
5064    
5065     * Thuban/UI/classifier.py: Add normal border to SelectPropertiesDialog.
5066     Use True instead of true.
5067     (Classifier): Should have a single panel in which all the controls lie.
5068    
5069     * Thuban/UI/proj4dialog.py: Add normal border.
5070    
5071     * Thuban/UI/tree.py: Fixed problem with bad item images under Windows.
5072    
5073     * Thuban/UI/mainwindow.py: Use True instead of true.
5074    
5075     * setup.py: Update some definitions to use wxWindows2.4 files
5076    
5077     * Data/iceland_sample_class.thuban: Fixed file so that the
5078     field_type information is present.
5079    
5080 jonathan 490 2003-03-10 Jonathan Coles <[email protected]>
5081    
5082 jonathan 505 * Thuban/UI/classifier.py (Classifier.__init__): Make the
5083     field type label grow so that when the text changes the
5084     size is updated correctly. This may be a wxWindows bug.
5085    
5086     2003-03-10 Jonathan Coles <[email protected]>
5087    
5088 jonathan 499 * Thuban/UI/application.py: Changed SESSION_CHANGED to
5089     SESSION_REPLACED.
5090    
5091     * Thuban/UI/classifier.py: Wrap text with _().
5092     (ClassGrid.CreateTable): Set dimensions and size hints here,
5093     instead of in Reset, so we only set the size once.
5094    
5095     * Thuban/UI/dialogs.py: Don't need Shutdown(); just use Close()!
5096    
5097     * Thuban/UI/mainwindow.py (MainWindow.prepare_new_session):
5098     Call Close() instead of Shutdown().
5099    
5100     * Thuban/UI/messages.py: Changed SESSION_CHANGED to SESSION_REPLACED.
5101    
5102     * Thuban/UI/tree.py: Changed SESSION_CHANGED to SESSION_REPLACED.
5103     Go back to using OnClose() instead of Shutdown().
5104    
5105     2003-03-10 Jonathan Coles <[email protected]>
5106    
5107 jonathan 497 * Thuban/UI/classifier.py (Classifier): SelectField() needed
5108     to know the old field index as well as the new one.
5109    
5110     2003-03-10 Jonathan Coles <[email protected]>
5111    
5112 jonathan 495 * Thuban/UI/classifier.py (Classifier): Use __SelectField()
5113     to correctly set the table information and call this from
5114     __init__ and from _OnFieldSelect so that all the information
5115     is up to date when the dialog opens and when a field is changed.
5116    
5117     2003-03-10 Jonathan Coles <[email protected]>
5118    
5119 jonathan 490 * Thuban/Model/classification.py (Classification): Don't use
5120     layer's message function directly, use the ClassChanged() method
5121     when then classification changes. SetField/SetFieldType/SetLayer
5122     must keep the information about field name and field type in
5123     sync when an owning layer is set or removed.
5124    
5125     * Thuban/Model/layer.py: Added ClassChanged() so that the
5126     classification can tell the layer when its data has changed.
5127     (Layer.SetClassification): Accepts None as an arguement to
5128     remove the current classification and correctly handles
5129     adding a new classification.
5130    
5131     * Thuban/Model/load.py: Comment out print statement
5132    
5133     * test/test_classification.py, test/test_save.py: New and
5134     improved tests.
5135    
5136 jonathan 483 2003-03-07 Jonathan Coles <[email protected]>
5137    
5138     * Thuban/Model/classification.py: Implemented __copy__ and
5139     __deepcopy__ for ClassGroup* and ClassGroupProperites so
5140     they can easily be copied by the classifier dialog.
5141     (ClassGroupProperites.__init__): The default line color should
5142     have been Color.Black.
5143    
5144     * Thuban/UI/classifier.py: Setting and Getting table values now
5145     uses a consistent set of functions.
5146     (Classifier): Now non-modal. Has field type label which changes
5147     as the field changes. Keep track of buttons in a list so that
5148     we can enable/disable the buttons when the None field is selected.
5149     (SelectPropertiesDialog): Add buttons to make the colors transparent.
5150    
5151     * Thuban/UI/dialogs.py (NonModalDialog.Shutdown): New method which
5152     does what OnClose did, but can be called by the application to
5153     close a window. Needed when a session changes, and we have to
5154     close the classifier windows.
5155    
5156     * Thuban/UI/mainwindow.py (MainWindow.prepare_new_session):
5157     Shuts down open dialogs. Used when a new session is created
5158     or a session is opened.
5159     (MainWindow.SaveSession): Should only call application.SaveSession()
5160     if we don't call SaveSessionAs first.
5161     (MainWindow.Classify): Allow different classifier dialogs for
5162     different layers.
5163    
5164     * Thuban/UI/tree.py (SessionTreeView): Remove OnClose and let
5165     the parent class handle it. Add Shutdown() to unsubscibe from
5166     event notification and call the parent Shutdown(). This was
5167     necessary so the application can close the tree window.
5168    
5169 jonathan 478 2003-03-06 Jonathan Coles <[email protected]>
5170    
5171     * Thuban/Model/classification.py: Minor documentation changes,
5172     Addition of __eq__ and __ne__ methods.
5173     (Classification.SetLayer): prevent recursion between this method
5174     and Layer.SetClassification().
5175    
5176     * Thuban/Model/color.py: Addition of __eq__ and __ne__ methods.
5177    
5178     * Thuban/Model/layer.py (SetClassification): prevent recursion
5179     between this method and Classification.SetLayer().
5180    
5181     * test/test_classification.py, test/test_load.py,
5182     test/test_session.py: Fixed and added tests for the classification
5183     classes.
5184    
5185 bh 477 2003-03-06 Bernhard Herzog <[email protected]>
5186    
5187     * Thuban/UI/classifier.py (ClassGrid.__init__)
5188     (ClassGrid.CreateTable): Move the SetSelectionMode call to
5189     CreateTable because otherwise it triggers an assertion in
5190     wxPython/wxGTK 2.4.
5191    
5192 jonathan 459 2003-03-05 Jonathan Coles <[email protected]>
5193    
5194 jonathan 475 * Thuban/common.py: Move FIELDTYPE constants back to table.py.
5195 jonathan 471
5196 jonathan 475 * Thuban/Model/load.py: import FIELDTYPE constants from table.
5197 jonathan 471
5198 jonathan 475 * Thuban/UI/classifier.py: import FIELDTYPE constants from table.
5199 jonathan 471
5200 jonathan 475 * Thuban/Model/table.py: Put FIELDTYPE constants back.
5201 jonathan 471
5202     2003-03-05 Jonathan Coles <[email protected]>
5203    
5204 jonathan 459 * Thuban/UI/classifier.py: Added class documentation.
5205     Fixed RTbug #1713, #1714. Added Move[Up|Down] buttons.
5206     Store just the groups in the table and generate the other
5207     column information when it is requested. Add "None" field
5208     to pull-down to select no classification.
5209    
5210     * Thuban/common.py: Moved FIELDTYPE constants from table.py
5211     (Str2Num): Only catch ValueError exceptions.
5212    
5213     * Thuban/Model/classification.py: Class documentation. Renaming
5214     of methods with Stroke to Line. Groups are stored in a single
5215     list with the default as the first element. Groups are searched
5216     in the order they appear in the list.
5217    
5218     * Thuban/Model/color.py: Documentation.
5219    
5220     * Thuban/Model/layer.py (Layer): Add GetFieldType to retreive
5221     the kind of data represented by a field.
5222    
5223     * Thuban/Model/load.py (ProcessSession): Use proper string
5224     conversion function; fixes RTbug #1713.
5225    
5226     * Thuban/Model/save.py (Saver): Store field type information.
5227    
5228     * Thuban/Model/table.py: Put FIELDTYPE constants in common.py.
5229     (Table): Add field_info_by_name() to retrieve field information
5230     by specifying the field name, not the number.
5231    
5232     * Thuban/UI/mainwindow.py: Function name changes.
5233    
5234     * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Only
5235     get the layer classification once. Don't try to classify
5236     values when the field is None: just use the default properties.
5237    
5238     * Thuban/UI/view.py: Function name changes.
5239    
5240     * Doc/thuban.dtd: Add field_type attribute to a classification.
5241    
5242 bh 456 2003-03-04 Bernhard Herzog <[email protected]>
5243    
5244 bh 458 * Doc/thuban.dtd: Use correct syntax for optional attributes. Make
5245     the fill and stroke layer attributes optional with suitable
5246     default values. Add the stroke_width layer attribute. Use correct
5247     syntax for empty elements. Make the attribute list for labels
5248     refer to the label element.
5249    
5250     2003-03-04 Bernhard Herzog <[email protected]>
5251    
5252 bh 456 * setup.py (thuban_build_py.build): Add a comment about distutils in
5253     Python 2.3 containing some of the functionality we implement in
5254     setup.py ourselves.
5255    
5256     * Thuban/UI/classifier.py (ClassGrid.__init__): Set the table
5257     before the selection mode. Doing it the other way round triggers
5258     an assertion in wxWindows.
5259    
5260     * Thuban/Model/save.py (escape): Fix typo in doc-string
5261    
5262     * Thuban/Model/classification.py: Remove unnecessary wxPython
5263     import
5264    
5265 jonathan 448 2003-03-04 Jonathan Coles <[email protected]>
5266    
5267     * Thuban/Model/classification.py (ClassGroupRange.GetProperties):
5268     Parameter 'value' should default to None.
5269    
5270     * Thuban/UI/mainwindow.py: Use Layer.GetClassification() since
5271     the class attribute __classification is now private.
5272    
5273     * Thuban/UI/classifier.py (ClassGrid): Moved OnCellDClick() from
5274     Classifier to ClassGrid. Added support for removing selected rows,
5275     which including code for keeping track of when cells are selected,
5276     and deselected.
5277     (ClassTable): Support for added/removing rows. Fixed a problem
5278     with __ParseInput whereby it would not allow strings (only numbers)
5279     to be entered.
5280     (Classifier): Added button and supporting code for removing
5281     selected rows.
5282    
5283 jonathan 445 2003-02-27 Jonathan Coles <[email protected]>
5284 jonathan 434
5285     * Thuban/common.py: Moved color conversion functions into
5286     Thuban/UI/common.py.
5287     (Str2Num): Now converts the float (not the string) to a long/int
5288     so that an exception isn't thrown.
5289    
5290     * Thuban/UI/common.py: Common functions used in several UI modules
5291    
5292     * Thuban/Model/classification.py: Changed the class hierarchy
5293     so that a Classification consists of Groups which return
5294     Properties when a value matches a Group.
5295    
5296     * Thuban/Model/layer.py: Fixed name resolution problem.
5297    
5298     * Thuban/Model/load.py: Use new Classification and Group functions.
5299    
5300     * Thuban/Model/save.py (Saver.write_attribs): Fixes a test case
5301     failure.
5302     (Saver.write_classification): Use new Classification and Group
5303     functions.
5304    
5305     * Thuban/UI/classifier.py: Changes to use new Classification and Group
5306 jonathan 445 functions. Fix to create a tuple with a single value instead of
5307     simply returning the value.
5308 jonathan 434
5309     * Thuban/UI/renderer.py: Use new Classification and Group functions.
5310     Use common.py functions.
5311    
5312 jonathan 445 * Thuban/UI/tree.py: Use common.py functions.
5313 jonathan 447
5314     * test/test_classification.py: Use new Classification and Group
5315     classes.
5316 jonathan 434
5317 jonathan 426 2003-02-24 Jonathan Coles <[email protected]>
5318    
5319     * Thuban/common.py (Color2wxColour, wxColour2Color): Conversion
5320     functions from Thuban color objects to wxWindow colour objects.
5321    
5322     * Thuban/Model/classification.py (Classification): Renamed
5323     GetProperties() to GetClassData(). Used the new iterator
5324     in TreeInfo().
5325     (ClassIterator): Iterator implementation to iterate over the
5326     ClassData objects in a classification object.
5327    
5328     * Thuban/Model/save.py (Saver.write_classificaton): Uses
5329     the new iterator to save the classification information.
5330    
5331     * Thuban/UI/classifier.py (SelectPropertiesDialog): Support
5332     for changing the stroke and fill colors and previewing the
5333     changes.
5334    
5335     * Thuban/UI/mainwindow.py (MainWindow.OpenSession,
5336     MainWindow.SaveSessionAs): Text string changes so the dialogs
5337     have more meaningful titles.
5338    
5339     * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Change
5340     Classification method name from GetProperties to GetClassData.
5341    
5342     * Thuban/UI/view.py (MapCanvas.find_shape_at): Use method calls
5343     instead of accessing now non-existent class variables.
5344    
5345 bh 425 2003-02-24 Bernhard Herzog <[email protected]>
5346    
5347     * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Remove
5348     unneeded Shape() call. Rendering is substantially faster without
5349     it and it avoids some problems with broken shape files.
5350    
5351 frank 423 2003-02-20 Frank Koormann <[email protected]>
5352    
5353     Force minimal size of identify and label dialogs. The autosizing
5354     looked too ugly.
5355    
5356     * Thuban/UI/controls.py (RecordListCtrl): Set minimal width for columns.
5357     * Thuban/UI/labeldialog.py (LabelDialog.dialog_layout):
5358     Set size of listctrl.
5359     * Thuban/UI/identifyview.py (IdentifyView.__init__):
5360     Set size of dialog.
5361    
5362 jonathan 408 2003-02-19 Jonathan Coles <[email protected]>
5363    
5364     * test/test_classification.py, test/test_layer.py,
5365     test/test_load.py, test/test_map.py, test/test_session.py:
5366     Updated the tests to use the new functions that are in the
5367     respective classes.
5368    
5369     * Thuban/Model/classification.py (Classification):
5370     Uses the new ClassData* classes. Modification messages are
5371     passed up to the parent layer (if it exists).
5372     (ClassData): New class to encapsulate the common data in each
5373     classification property.
5374     (ClassDataDefault): Represents the Default class. data.
5375     (ClassDataPoint): Represents a single class. data point
5376     (ClassDataRange): Represents a class. range
5377     (ClassDataMap): Represents a class. map (unused).
5378    
5379     * Thuban/Model/color.py: Added Color.None to represent something
5380     with no color. Color.Black represents the color black.
5381     (NoColor): Helper class derived from Color to represent something
5382     with no color.
5383    
5384     * Thuban/Model/layer.py (Layer): Removed references to fill, stroke,
5385     stroke_width attributes. Made the 'classification' attribute private.
5386     New methods for setting/getting the classification.
5387    
5388     * Thuban/Model/load.py (ProcessSession): Use new methods on Layer
5389     to get the classifcation and use the new ClassData* classes to
5390     hold the classification data. Use Str2Num to convert numbers
5391     properly.
5392    
5393     * Thuban/Model/save.py (Saver): Use new Color and Classification
5394     methods
5395    
5396     * Thuban/UI/classifier.py (ClassGrid): New class to represent a
5397     custom grid.
5398     (ClassTable): Support for editing Values and Labels and for
5399     changing what type (point or range) of data is stored in each
5400     property based on how the user enters the data.
5401     (Classifier): Support for saving the new classifications and
5402     launching the dialog to edit a property.
5403     (SelectPropertiesDialog): New class for editing the visual
5404     properties of a classification (stroke color, width, and fill color)
5405     (ClassPreviewer): Took the Draw method from ClassRenderer and
5406     made most of it into this new class. Intend to use this class in
5407     the SelectPropertiesDialog for previewing changes.
5408    
5409     * Thuban/UI/renderer.py: Use new Color and Classification methods.
5410    
5411     * Thuban/UI/tree.py: Formatting changes.
5412    
5413     * Doc/thuban.dtd: Add 'label' element
5414    
5415     * Thuban/common.py: New. Contains common routines used throughout
5416     the code.
5417     (Str2Num): Takes a string and converts it to the "best" type of
5418     number.
5419    
5420 bh 405 2003-02-14 Bernhard Herzog <[email protected]>
5421    
5422     * Thuban/UI/view.py (MapCanvas.OnLeftUp): Make sure that the
5423     dragging flag is always set to 0 even when the tool implementation
5424     raises an exception
5425    
5426 bh 402 2003-02-11 Bernhard Herzog <[email protected]>
5427    
5428     * Thuban/UI/application.py (ThubanApplication.splash_screen): New
5429     method to create a splash screen.
5430     (ThubanApplication.ShowMainWindow): New. Show the main window.
5431     Needed so the splash screen can display the mainwindow
5432     (ThubanApplication.OnInit): Call the
5433     new splash_screen method to determine whether the application
5434     should display a splash screen. If it displays a splash screen do
5435     not immediately show the main window.
5436    
5437 jonathan 399 2003-02-11 Jonathan Coles <[email protected]>
5438    
5439     * Thuban/Model/classification.py: Added import line to fix
5440     feature conflicts between running on python2.2 and python2.1.
5441    
5442     * Thuban/UI/classifier.py (ClassTable): Didn't need to hang
5443     onto the clinfo parameter, so removed the deepcopy().
5444    
5445 jonathan 396 2003-02-10 Jonathan Coles <[email protected]>
5446    
5447 tkoester 403 * Thuban/Model/save.py (Saver.open_element, Saver.close_element):
5448 jonathan 396 Added element_open variable to track opening and closing of tags
5449     so that tags that don't span more than one line are closed with
5450     /> instead of </tag_name>. Use the GetDefault*() methods of
5451     the Classification class.
5452    
5453     * Thuban/Model/classification.py (Classificaton): Added set and
5454     get methods for the default data. The class also takes a layer
5455     reference so that modification messages can be sent. Fixed the
5456     methods to use the new ClassData class.
5457     (ClassData): New class to encapsulate the classification data
5458    
5459     * Thuban/Model/layer.py (Layer): Remove the
5460 tkoester 403 Set[Fill|Stroke|StrokeWidth]() methods. Code should call the
5461 jonathan 396 SetDefault*() methods on the layer's classification object.
5462 tkoester 403 (Layer.__init__): Use the new SetDefault*() methods in the
5463 jonathan 396 Classification class.
5464    
5465     * Thuban/Model/load.py (ProcessSession): Use the new ClassData
5466     object instead of a dictionary.
5467    
5468 tkoester 403 * Thuban/UI/classifier.py (ClassRenderer): New class to
5469 jonathan 396 draw the classifications in the dialog box's table.
5470     (Classifier): Modified to use the ClassRenderer class.
5471    
5472 tkoester 403 * Thuban/UI/mainwindow.py (MainWindow): Use the SetDefault*()
5473     methods of the Classification class.
5474 jonathan 396
5475     * Thuban/UI/renderer.py (MapRenderer): Use the Get*() methods
5476     of the ClassData class.
5477    
5478     * test/test_classification.py, test/test_layer.py,
5479     test/test_map.py, test/test_session.py: Fix the tests to work
5480     with the above code changes.
5481    
5482 jonathan 387 2003-02-03 Jonathan Coles <[email protected]>
5483    
5484     * Thuban/Model/classification.py (Classification): Added getNull()
5485     to return the NullData reference
5486    
5487     * Thuban/Model/layer.py (Layer.SetFill, Layer.SetStroke,
5488     Layer.SetStrokeWidth): Modified these functions to change the
5489     null data in the classification rather than keep these values
5490     directly in the Layer class. Menu options to change these values
5491     work again.
5492    
5493 jonathan 380 2003-01-28 Jonathan Coles <[email protected]>
5494    
5495 jonathan 384 * Thuban/UI/classifier.py (Classifier): Resolved merging conflicts.
5496 tkoester 403 Fixed crashing problem on some systems. Dialog box shows
5497 jonathan 380 classification data.
5498    
5499 jonathan 384 * Thuban/UI/tree.py (SessionTreeCtrl.add_items): Handle drawing
5500     Colors in the tree view.
5501    
5502     * Thuban/Model/layer.py (Layer.TreeInfo): Added a call to build
5503     the tree info for classifications. Commented out unnecessary lines.
5504    
5505     * Thuban/Model/classification.py (Classification.TreeInfo): New
5506     function to add information about the classification into the
5507     tree view.
5508    
5509 tkoester 403 2003-01-27 Jan-Oliver Wagner <[email protected]>
5510 jan 375
5511 tkoester 403 * Thuban/__init__.py (_): New.
5512 jan 375
5513     * Thuban/Model/classification.py, Thuban/Model/extension.py,
5514     Thuban/Model/layer.py, Thuban/Model/load.py, Thuban/Model/map.py,
5515 tkoester 403 Thuban/Model/session.py, Thuban/UI/application.py,
5516     Thuban/UI/classifier.py, Thuban/UI/context.py, Thuban/UI/controls.py,
5517     Thuban/UI/identifyview.py, Thuban/UI/labeldialog.py,
5518     Thuban/UI/mainwindow.py, Thuban/UI/menu.py, Thuban/UI/proj4dialog.py,
5519     Thuban/UI/renderer.py, Thuban/UI/tree.py, Thuban/Lib/connector.py,
5520     Thuban/Lib/fileutil.py: Replace user string by _() for i18n.
5521 jan 375
5522 jonathan 370 2003-01-27 Jonathan Coles <[email protected]>
5523    
5524 tkoester 403 * Thuban/Model/layer.py: Classification initialization calls.
5525 jonathan 370
5526 tkoester 403 * Thuban/Model/classification.py: Created class to encapsulate
5527     a layer classification. Supports specific data points and
5528     ranges.
5529 jonathan 370
5530 tkoester 403 * Thuban/Model/load.py: Added support for loading classification
5531     information.
5532 jonathan 370
5533 tkoester 403 * Thuban/Model/save.py: Added support for saving classification
5534     information.
5535 jonathan 370
5536 tkoester 403 * Thuban/UI/classifier.py: Initial class for a dialog box for
5537     specifying classification information.
5538 jonathan 370
5539 tkoester 403 * Thuban/UI/mainwindows.py: Support for opening the classifier
5540     dialog.
5541 jonathan 370
5542 tkoester 403 * Thuban/UI/renderer.py: Support for drawing a layer with the
5543     classification information.
5544 jonathan 370
5545 tkoester 403 * Data/iceland_sample_class.thuban: iceland_sample with
5546     classification data.
5547 jonathan 370
5548 tkoester 403 * test/test_classification: Tests for the Classification class.
5549 jonathan 370
5550 bh 359 2002-12-09 Bernhard Herzog <[email protected]>
5551    
5552 bh 361 * test/test_command.py: New. Tests for the command classes.
5553    
5554 bh 359 * Thuban/UI/command.py (ToolCommand): New class for tool commands.
5555     (Command.IsTool): New method to distinguish between command
5556     switching tools and other commands.
5557    
5558     * Thuban/UI/view.py (MapCanvas.SelectTool): New method to select
5559     the tool to avoid direct assignments to instance variables
5560     (MapCanvas.ZoomInTool, MapCanvas.ZoomOutTool, MapCanvas.PanTool)
5561     (MapCanvas.IdentifyTool, MapCanvas.LabelTool): Use SelectTool to
5562     change the tool
5563    
5564     * Thuban/UI/mainwindow.py (MainWindow.update_command_ui): If an
5565     active tool's command turns insensitive, disable the tool.
5566     (_tool_command): Use the new ToolCommand class
5567    
5568     * Examples/simple_extensions/simple_tool.py (simple_tool): Use the
5569     SelectTool method to change the tool
5570     (iconfile): Use the ToolCommand class
5571    
5572 bh 354 2002-12-03 Bernhard Herzog <[email protected]>
5573    
5574     * Thuban/UI/tree.py (SessionTreeCtrl.normalize_selection): Handle
5575     the case of selected items that are not children of Layers or Maps
5576     properly. Previously this bug would trigger an assertion in
5577     wxWindows.
5578    
5579 frank 352 2002-11-06 Frank Koormann <[email protected]>
5580    
5581 bh 354 * Thuban/UI/mainwindow.py: Altered the order of tools in the
5582     toolbar: First now are all navigation tools (Zoom In/Out, Pan,
5583     Full Extent).
5584 tkoester 403
5585 bh 349 2002-10-23 Bernhard Herzog <[email protected]>
5586    
5587     * setup.py (setup call): version now 0.1.3
5588    
5589     * MANIFEST.in: Add the files in test/
5590    
5591     * test/README: Add note about tests requiring the iceland data
5592    
5593     * Thuban/UI/mainwindow.py (MainWindow.About): Add 2002 to
5594     copyright notice.
5595    
5596 bh 344 2002-10-18 Bernhard Herzog <[email protected]>
5597    
5598     * test/test_map.py
5599     (TestMapWithContents.test_projected_bounding_box): Use an explicit
5600     epsilon.
5601    
5602     * test/support.py (FloatComparisonMixin.assertFloatEqual)
5603     (FloatComparisonMixin.assertFloatSeqEqual): give a more useful
5604     message if the assertion fails and don't return the return value
5605     of self.assert_. In assertFloatSeqEqual the return meant that not
5606     all items of the sequence were compared.
5607    
5608 bh 326 2002-09-20 Bernhard Herzog <[email protected]>
5609    
5610 bh 341 * test/test_fileutil.py: New. Test cases for Thuban.Lib.fileutil
5611    
5612     * Thuban/Lib/fileutil.py: Fixup some whitespace and typos
5613    
5614 bh 338 * test/test_map.py (TestMapWithContents.test_tree_info): Create
5615     the string with the bounding box on the fly because of platform
5616     differences in the way %g is handled.
5617    
5618     * test/test_layer.py (TestLayer.test_empty_layer): Create an empty
5619     DBFfile too because Thuban layers can't yet cope missing DBF
5620     files.
5621    
5622     2002-09-20 Bernhard Herzog <[email protected]>
5623    
5624 bh 326 * test/test_menu.py: Use initthuban instead of
5625     add_thuban_dir_to_path to initialize Thuban.
5626    
5627     * test/support.py (FloatComparisonMixin.assertFloatEqual): New.
5628     Mixin class for float comparisons
5629     (SubscriberMixin): New. Mixin class to test messages sent through
5630     the Connector class
5631    
5632     * test/README: Fix a typo and add the -v flag to the command for
5633     individual tests
5634    
5635 bh 335 * test/test_session.py: New. Test cases for Thuban.Model.session
5636    
5637     * test/test_proj.py: New. Test cases for Thuban.Model.proj
5638    
5639     * test/test_map.py: New. Test cases for Thuban.Model.map
5640    
5641     * test/test_layer.py: New. Test cases for Thuban.Model.layer
5642    
5643     * test/test_label.py: New. Test cases for Thuban.Model.label
5644    
5645     * test/test_connector.py: New. Test cases for Thuban.Lib.connector
5646    
5647     * test/test_color.py: New. Test cases for Thuban.Model.color
5648    
5649     * test/test_base.py: New. Test cases for Thuban.Model.base
5650    
5651 bh 322 2002-09-13 Bernhard Herzog <[email protected]>
5652    
5653     * Thuban/Model/session.py (Session.forwarded_channels): Forward
5654     the CHANGED channel too.
5655    
5656     * Thuban/Model/map.py (Map.forwarded_channels): Forward the
5657     CHANGED channel too.
5658     (Map.__init__): Call the Modifiable constructor as well.
5659    
5660     * Thuban/Model/base.py (Modifiable.UnsetModified): Issue a CHANGED
5661     event if the modified flag changes.
5662     (Modifiable.changed): Tweak the doc-string.
5663    
5664     * Thuban/UI/mainwindow.py (MainWindow.view_position_changed)
5665     (MainWindow.set_position_text): Put the code that puts the text
5666     with the mouse position into the status bar into the new method
5667     set_position_text so that it can overwritten in derived classes.
5668    
5669 bh 317 2002-09-12 Bernhard Herzog <[email protected]>
5670    
5671     * Thuban/UI/mainwindow.py (MainWindow.RunMessageBox): Center the
5672     message box on the main window.
5673    
5674 bh 313 2002-09-11 Bernhard Herzog <[email protected]>
5675    
5676     * Thuban/UI/mainwindow.py: Underline the 'x' in "Exit" instead of
5677     the 'E' because it's less likely to interfere with other menu
5678     entries.
5679 bh 315 (MainWindow.build_menu): remove an incorrect comment.
5680 bh 313
5681 bh 311 2002-09-10 Bernhard Herzog <[email protected]>
5682    
5683     * Thuban/UI/mainwindow.py (MainWindow.Map): New.
5684     (_tool_command): Add sensitive parameter
5685     (_has_visible_map): Sensitivity callback to tools and other
5686     commands that require a visible map. Use it in map_zoom_in_tool,
5687     map_zoom_out_tool, map_pan_tool, map_identify_tool, map_label_tool
5688     and map_full_extent
5689    
5690 bh 308 2002-09-06 Bernhard Herzog <[email protected]>
5691    
5692     * Thuban/UI/mainwindow.py (MainWindow.OnClose): Unsubscribe
5693     VIEW_POSITION
5694    
5695 tkoester 403 2002-09-04 Frank Koormann <[email protected]>
5696 frank 306
5697     * Resources/Bitmaps/fullextent.xpm: Updated Icon (removed "potatoe")
5698    
5699 bh 302 2002-09-02 Bernhard Herzog <[email protected]>
5700    
5701 bh 304 * Thuban/UI/view.py: Get rid of the idle redraw. This is done by
5702     wxWindows already and our implementation doesn't work correctly
5703     with wxGTK 2.3:
5704     (MapCanvas.__init__): Remove the instance variable
5705     (MapCanvas.OnPaint): Always call do_redraw when there's a map to
5706     be drawin
5707     (MapCanvas.OnIdle): Removed.
5708    
5709 bh 302 * Thuban/UI/view.py (MapCanvas.unprojected_rect_around_point): Add
5710     a parameter to determine the size of the rectangle.
5711     (MapCanvas.find_shape_at): Create the box around the point on a
5712     layer by layer basis and make the size depend on the shape type.
5713     This solves a problem with the selection of point shapes at the
5714     border of the layer's bounding box
5715    
5716 bh 292 2002-08-30 Bernhard Herzog <[email protected]>
5717    
5718 bh 300 * Thuban/UI/mainwindow.py (MainWindow.CanRemoveLayer): New method
5719     for the sensitivity of remove layer.
5720     (_can_remove_layer): New. Sensitivity callback for remove layer
5721     (Command layer_remove): Use _can_remove_layer
5722    
5723     * Thuban/Model/map.py (Map.CanRemoveLayer): New method to
5724     determine whether a given layer can be deleted.
5725    
5726 bh 297 * Thuban/UI/view.py (MapCanvas.__init__, MapCanvas.OnPaint)
5727     (MapCanvas.do_redraw): Get rid of the unused update_region
5728     instance variable
5729    
5730 bh 294 * Thuban/UI/view.py: Add/update some doc-strings.
5731    
5732 bh 292 * test/: new subdirectory with a bunch of unit tests.
5733    
5734     * test/README, test/test_table.py, test/test_save.py,
5735     test/test_menu.py, test/test_load.py: Initial set of tests and
5736     brief instructions on how to run them
5737    
5738 bh 287 2002-08-29 Bernhard Herzog <[email protected]>
5739    
5740 bh 291 * Thuban/UI/renderer.py (ScreenRenderer.draw_shape_layer): Handle
5741     arcs with multiple parts.
5742    
5743 bh 289 * Thuban/UI/view.py (ZoomInTool.MouseUp, ZoomOutTool.MouseUp):
5744     Handle degenrate rectangles.
5745    
5746 bh 287 * Thuban/Model/table.py: Make writing records work correctly:
5747     (Table.__init__): Keep track of whether the DBF is open for
5748     writing
5749     (Table.write_record): Open the DBF file for writing when necessary
5750    
5751 bh 285 2002-08-27 Bernhard Herzog <[email protected]>
5752    
5753     * Thuban/Model/table.py (Table.write_record, Table.__init__): Open
5754     dbf files only for reading by default. Use a new writable dbf
5755     object for writing.
5756    
5757 bh 278 2002-08-26 Bernhard Herzog <[email protected]>
5758    
5759 bh 282 * Thuban/UI/mainwindow.py: Refactor the context creation:
5760     (MainWindow.Context): New method to return a context
5761     (MainWindow.invoke_command, MainWindow.update_command_ui): Use the
5762     new method
5763    
5764 bh 278 * Thuban/UI/tableview.py (TableGrid, LayerTableGrid): Split the
5765     layer table specific code from TableGrid into LayerTableGrid
5766     (TableFrame, LayerTableFrame): Split the layer table specific code
5767     from TableFrame into LayerTableFrame
5768 bh 280 (LayerTableGrid.select_shape): Remove a debug print
5769 bh 278
5770     * Thuban/UI/mainwindow.py (MainWindow.LayerShowTable): Use the
5771     LayerTableFrame
5772    
5773 bh 277 2002-08-23 Bernhard Herzog <[email protected]>
5774    
5775     * Thuban/Model/layer.py (Layer.__init__): Make sure we have an
5776     absolute filename.
5777    
5778 bh 269 2002-08-22 Bernhard Herzog <[email protected]>
5779    
5780 bh 275 * Thuban/Model/table.py (Table.write_record): New method to write
5781     records.
5782 tkoester 403 (Table.__init__): Open the DBF file for writing too.
5783 bh 275
5784     * Thuban/UI/controls.py (RecordTable.SetValue): Write the value
5785     into the underlying table.
5786    
5787     * extensions/shapelib/shapefil.h (DBFCommit),
5788     extensions/shapelib/dbfopen.c (DBFCommit): New API function to
5789     commit any changes made to the DBF file.
5790    
5791 bh 271 * Thuban/UI/mainwindow.py (make_check_current_tool)
5792     (_tool_command): Put the code that generates the "checked"
5793     callback into a separate function so that we can reuse it
5794     elsewhere
5795    
5796 bh 269 * Thuban/Model/save.py (Saver): New class to handle serializing a
5797     session into an XML file. The main reason to introduce a class is
5798     that applications built on Thuban can derive from it so that they
5799     can save additional information in a session file.
5800     (save_session): Delegate almost all the work to the Saver class.
5801     Rename the filename argument to file because it may be a file like
5802     object now.
5803    
5804     * Thuban/Model/load.py: Get rid of the Python 1.5.2 compatibility
5805     code. Remove the little test code which would be executed when the
5806     module is run as a script which didn't work anymore since it can't
5807     import the other Thuban modules.
5808     (ProcessSession, load_session): Refactor the ProcessSession to
5809     have one method for each element start and end tag so that derived
5810     classes can easily override the processing of individual tags.
5811     Also, always parse with namespaces enabled because applications
5812     built on top of Thuban will likely use namespaces if they extend
5813     the session file format.
5814    
5815 bh 266 2002-08-21 Bernhard Herzog <[email protected]>
5816    
5817     * setup.py (ThubanInstall.run): Don't repr install_lib_orig
5818     because thubaninit_contents will do it for us.
5819    
5820 tkoester 403 2002-08-16 Jan-Oliver Wagner <[email protected]>
5821 jan 265
5822     * Thuban/UI/mainwindow.py: menu item 'show session tree' now disable if
5823     tree window already open
5824    
5825 bh 259 2002-08-15 Bernhard Herzog <[email protected]>
5826    
5827 bh 263 * Thuban/Model/layer.py (Layer.Destroy): Call the unboundd method
5828     with self.
5829    
5830     * Thuban/UI/view.py (MapCanvas.OnLeftUp): Only release the mouse
5831     when we have actually captured it.
5832    
5833 bh 259 * Thuban/Model/layer.py (Layer.Destroy): New. Explicitly close the
5834     shapefile and destroy the table.
5835    
5836     * Thuban/Model/table.py (Table.Destroy): New. Close the DBF file.
5837    
5838 bh 254 2002-08-14 Bernhard Herzog <[email protected]>
5839    
5840 bh 256 * Thuban/UI/controls.py (RecordTable.__init__): Remove the unused
5841     instance variable columns
5842     (RecordTable.GetTypeName): row and col may be negative in some
5843     cases.
5844    
5845 bh 254 * setup.py (InstallLocal.initialize_options)
5846     (InstallLocal.finalize_options, InstallLocal.user_options): New
5847     option create-init-file to build a thubaninit.py when running
5848     install_local
5849     (InstallLocal.run): Create the thubaninit.py module when requested
5850     (thubaninit_contents): Split the template into several parts and
5851     create a new function thubaninit_contents that creates the
5852     contents of a thubaninit module.
5853     (ThubanInstall.run): Use the new function to create the thubaninit
5854     module.
5855    
5856 bh 252 2002-07-30 Bernhard Herzog <[email protected]>
5857    
5858     * Thuban/UI/application.py (ThubanApplication.OnExit): Do some
5859     cleanup.
5860     (ThubanApplication.MainLoop): Extend to automatically call OnExit.
5861    
5862     * Thuban/Model/session.py (Session.Destroy): Don't bypass the
5863     direct base class' Destroy method.
5864    
5865     * Thuban/Model/map.py (Map.ClearLayers): New method to delete all
5866     layers.
5867     (Map.Destroy): Destroy the label_layer as well and call the
5868     inherited Desatroymethod first so that no more messages are
5869     issued.
5870     (Map.RaiseLayer, Map.LowerLayer): Only issue LAYERS_CHANGED
5871     message if the stacking order actually has changed. Add
5872     doc-strings.
5873     (Map.BoundingBox): Correct the doc-string.
5874     (Map.AddLayer, Map.RemoveLayer, Map.Layers, Map.HasLayers)
5875     (Map.ProjectedBoundingBox, Map.SetProjection): Add doc-strings.
5876    
5877     * Thuban/Model/label.py (LabelLayer.ClearLabels): New to delete
5878     all labels.
5879    
5880 bh 247 2002-07-29 Bernhard Herzog <[email protected]>
5881    
5882     * Thuban/Model/map.py (Map.subscribe_layer_channels)
5883     (Map.unsubscribe_layer_channels): Put the code that (un)subscribes
5884     to a layer's channels into separate methods.
5885     (Map.RemoveLayer, Map.AddLayer): Call the new methods
5886     (Map.Destroy): Unsubscribe from a layer's channels before
5887     destroying it.
5888    
5889     * Thuban/UI/view.py (MapCanvas.find_shape_at): Change the
5890     selected_layer parameter to searched_layer which is the layer to
5891     search in.
5892     (MapCanvas.SelectShapeAt): New parameter layer to restrict the
5893     search to that layer. Return the selected layer and shape.
5894    
5895     * Examples/simple_extensions/simple_tool.py (simple_tool): Fix a
5896     typo
5897    
5898 bh 238 2002-07-24 Bernhard Herzog <[email protected]>
5899    
5900 bh 243 * Thuban/UI/application.py (ThubanApplication.create_session):
5901     Extend the doc string.
5902     (ThubanApplication.subscribe_session)
5903     (ThubanApplication.unsubscribe_session): New methods to
5904     subscribe/unsubscribe to/from session channels.
5905     (ThubanApplication.SetSession): Call the new methods here.
5906     (ThubanApplication.maps_changed, ThubanApplication.set_map):
5907     Renamed set_map to maps_changed. Its now a subscriber for
5908     MAPS_CHANGED.
5909    
5910     * Thuban/UI/view.py (ZoomOutTool.MouseUp): Use the correct
5911     x-coordinate in case of simple clicks
5912    
5913     * Thuban/Model/base.py (Modifiable.changed): Apply the args tuple,
5914     don't pass it as a parameter
5915    
5916     * Thuban/Model/session.py (Session.RemoveMap): New
5917    
5918 bh 238 * Thuban/UI/mainwindow.py (MainWindow.__init__): Turn the initial
5919     window size into a parameter.
5920    
5921 bh 235 2002-07-23 Bernhard Herzog <[email protected]>
5922    
5923 bh 237 * Thuban/UI/menu.py (Menu.item_index): Also search for menus not
5924     just commands.
5925    
5926 bh 235 * Thuban/UI/mainwindow.py (MainWindow.__init__): Change the
5927     parameter list a bit to allow setting the window title and the
5928     initial message in the status bar. Update the callers.
5929    
5930     * Thuban/UI/application.py (ThubanApplication.OnInit)
5931     (ThubanApplication.CreateMainWindow): Put the mainwindow
5932     instantiation into a separate method so that it can be overridden
5933     by a subclass.
5934    
5935 bh 230 2002-07-19 Bernhard Herzog <[email protected]>
5936    
5937 bh 234 * Thuban/Model/session.py: Issue a CHANGED message every time
5938     another changed message is issued to make it easier to get
5939     notified of changes.
5940     (Session): Update the doc string
5941     (Session.forward): Issue changed-events as CHANGED as well.
5942     (Session.changed): Overwrite the inherited version to issue
5943     CHANGED events as well.
5944    
5945     * Thuban/UI/tree.py: We can now simply subscribe to the session's
5946     CHANGED channel to be informed of changes.
5947     (SessionTreeCtrl.session_channels): Not needed any longer.
5948 tkoester 403 (SessionTreeCtrl.unsubscribe_all, SessionTreeCtrl.session_changed):
5949 bh 234 Only have to (un)subscribe CHANGED
5950    
5951     * Thuban/Model/map.py (Map.TreeInfo): Deal better with empty maps.
5952    
5953 bh 230 * Thuban/UI/main.py, Thuban/UI/__init__.py: Move the work-around
5954     for the wxPython locale bug to __init__.py so that it's
5955     automatically executed by anybody using UI code from Thuban.
5956    
5957 bh 225 2002-07-18 Bernhard Herzog <[email protected]>
5958    
5959 bh 228 * Thuban/UI/main.py (main): app no longer needs to be global
5960    
5961     * Thuban/UI/mainwindow.py (MainWindow.__init__): Add application
5962     as parameter and store it in an instance variable
5963     (MainWindow.invoke_command, MainWindow.update_command_ui)
5964     (MainWindow.save_modified_session, MainWindow.NewSession)
5965     (MainWindow.OpenSession, MainWindow.SaveSession)
5966     (MainWindow.SaveSessionAs, MainWindow.ShowSessionTree): Use self's
5967     application object.
5968    
5969     * Thuban/UI/application.py (ThubanApplication.OnInit): Instantiate
5970     the main window with self.
5971    
5972 bh 225 * Thuban/UI/context.py: New module with the context class
5973    
5974     * Thuban/UI/command.py (Command): Update doc string.
5975    
5976     * Thuban/UI/mainwindow.py (MainWindow.invoke_command,
5977     MainWindow.update_command_ui): Pass an instance of the context
5978     class to the command's methods
5979     (check_current_tool, call_method): Handle the new context
5980     implementation
5981    
5982     * Examples/simple_extensions/simple_tool.py (simple_tool,
5983     check_simple_tool): Handle the new context implementation
5984    
5985     * Examples/simple_extensions/simple_command.py (simple_command):
5986     Handle the new context implementation. Update the comments about
5987     the context.
5988    
5989     * Thuban/UI/application.py (ThubanApplication.SetSession): Add
5990     doc-string
5991     (ThubanApplication.Session): New method to return the session
5992     object
5993    
5994     * Thuban/UI/tree.py (SessionTreeCtrl.update_tree): The
5995     interactor's selected_layer may not be a layer of the current
5996     session when the tree is updated while a new session is being set.
5997    
5998 bh 217 2002-07-17 Bernhard Herzog <[email protected]>
5999    
6000     * Thuban/UI/tree.py (color_string): Removed. No longer used.
6001     (SessionTreeCtrl.update_tree, SessionTreeCtrl.add_items): Split
6002     update_tree into update_tree and add_items. The tree now uses a
6003     more generic way to display the contents of the tree.
6004     (SessionTreeCtrl): Add a doc string explaining the TreeInfo method
6005    
6006     * Thuban/Model/layer.py (Layer.TreeInfo),
6007     Thuban/Model/extension.py (Extension.TreeInfo),
6008     Thuban/Model/map.py (Map.TreeInfo),
6009 tkoester 403 Thuban/Model/session.py (Session.TreeInfo):
6010 bh 217 Add TreeInfo methods to implement the new tree view update scheme
6011    
6012 bh 216 2002-07-16 Bernhard Herzog <[email protected]>
6013    
6014     * Thuban/UI/application.py: Don't use "import from" for the
6015     MainWindow. It can't always be resolved.
6016     (ThubanApplication.OnInit): change reference to MainWindow
6017     accordingly.
6018    
6019     * Thuban/UI/menu.py (Menu.SetItems): New method to replace a menu
6020     completely
6021    
6022 bh 213 2002-07-10 Bernhard Herzog <[email protected]>
6023    
6024     * setup.py (create_init_module): New configurable variable whose
6025     default depends on the platform we're running on.
6026     (ThubanInstall.initialize_options): Initialize
6027     self.create_init_module from the global create_init_module
6028     (ThubanInstall.user_options): indictate that the options
6029     create-init-module and init-module-dir have arguments.
6030    
6031     * setup.py: In the setup call change the version number to include
6032     cvs.
6033    
6034     * MANIFEST.in: Add the files in Examples
6035    
6036 bh 205 2002-07-09 Bernhard Herzog <[email protected]>
6037    
6038 bh 210 * setup.py: In the setup call, use the thuban homepage as the
6039     value of the url parameter.
6040    
6041 bh 208 * Examples: New subdirectory for examples.
6042    
6043     * Examples/simple_extensions/simple_tool.xpm,
6044     Examples/simple_extensions/simple_tool.py,
6045     Examples/simple_extensions/simple_command.py,
6046     Examples/simple_extensions/README: Simple examples showing how to
6047     add new commands and tools.
6048    
6049 bh 207 * setup.cfg (bdist_rpm): Add the default value for prefix and tell
6050     bdist_rpm that we also have an install script.
6051     (bdist_inno): Add 2002 to the copyright notice.
6052    
6053 bh 205 * setup.py: Create a file in python's site-packages directory to
6054     make installation of Thuban as a library easier.
6055     (ThubanInstall.user_options): Add two new options,
6056     create-init-module and init-module-dir
6057     (ThubanInstall.expand_with_pure_python_dirs): New method to expand
6058     filenames for installation in the default directories.
6059     (ThubanInstall.select_scheme, ThubanInstall.convert_paths): Extend
6060     the inherited methods to capture some filenames before they're
6061     transformed too much by distutils.
6062     (ThubanInstall.run): Create the init module if requested.
6063     (ThubanInstall.thuban_init_filename): New method to return the
6064     full name of the init module.
6065     (ThubanInstall.get_outputs): Append the filename of the init
6066     module.
6067    
6068 bh 202 2002-07-08 Bernhard Herzog <[email protected]>
6069    
6070 bh 205 * setup.py (thuban_bdist_rpm): Extend this version of bdist_rpm to
6071     handle the prefix properly which means that the default for the
6072     installation prefix should be /usr for RPMs and /usr/local when
6073     doing a normal source install.
6074     (bdist_rpm_install_script): Script to override the default install
6075     commands in the specfile generated by the bdist_rpm command.
6076     (thuban_bdist_rpm.user_options): Add a prefix option
6077     (thuban_bdist_rpm.initialize_options): Init the prefix option.
6078     Create the script files for the spec files as empty files here
6079     (thuban_bdist_rpm._make_spec_file): Override the inherited method
6080     to fill the script files with content.
6081    
6082 bh 202 * Thuban/Model/save.py (relative_filename): Wrapper around
6083     Thuban.Lib.fileutil.relative_filename that accepts an empty dir
6084     argument. save_session now automatically uses this version,
6085     solving a problem when saving to a relative filename.
6086    
6087     * setup.py: In the setup call, make sure that the library
6088     directories are under $prefix/lib not directly under $prefix.
6089    
6090 tkoester 403 2002-06-20 Jan-Oliver Wagner <[email protected]>
6091 jan 199
6092     * Thuban/Model/extension.py: new module to handle extension objects.
6093     * Thuban/Model/messages.py: new messages for extensions.
6094     * Thuban/Model/session.py (Session.Extensions, Session.HasExtensions,
6095     Session.AddExtension): new for handling extensions.
6096     Also some other minor changes to round up extension handling.
6097     * Thuban/UI/tree.py (SessionTreeCrtl:update_tree): Added visualization
6098     of Extension titles and title and names of its objects.
6099    
6100 bh 194 2002-05-29 Bernhard Herzog <[email protected]>
6101    
6102     * Thuban/UI/mainwindow.py (MainWindow.bind_command_events): Bind
6103 bh 202 the events for a command.
6104 bh 194 (MainWindow.add_toolbar_command, MainWindow.add_menu_command):
6105     Call bind_command_events to bind the events. add_toolbar_command
6106     can now bind events too so that it's possible to have commands
6107     that are only available through the toolbar.
6108     (MainWindow.init_ids): New instance variable events_bound to keep
6109     track of for which commands events have been bound.
6110    
6111 bh 190 2002-05-28 Bernhard Herzog <[email protected]>
6112    
6113     * Thuban/UI/menu.py: New module to build and manage menus.
6114    
6115     * Thuban/UI/mainwindow.py: Remove some unused imports.
6116     (MainWindow.__init__, main_menu): move the definition of the main
6117     menu from __init__ to the Menu instance main_menu.
6118     (MainWindow.build_menu_bar, MainWindow.build_menu): New methods to
6119     build the menu bar and sub-menus from a menu description.
6120    
6121     * Thuban/UI/application.py (ThubanApplication.OnInit): Read the
6122     startup file
6123     (ThubanApplication.read_startup_files): New method to run
6124     ~/.thuban/thubanstart.py
6125    
6126 bh 192 * Thuban/UI/mainwindow.py (MainWindow.__init__, main_toolbar):
6127     Move the toolbar definition to the Menu instance main_toolbar.
6128     (MainWindow.build_toolbar): New method to build the toolbar
6129     similar to the build_menu methods
6130    
6131 bh 184 2002-05-23 Bernhard Herzog <[email protected]>
6132    
6133 bh 186 * Thuban/UI/mainwindow.py (MainWindow.__init__): Fix spelling of
6134     layer_outline_color. Fix it in the definition of the command too.
6135    
6136 bh 184 * Thuban/UI/command.py (Command): Fix typo in doc string
6137    
6138 bh 182 2002-05-22 Bernhard Herzog <[email protected]>
6139    
6140     * Thuban/UI/mainwindow.py (MainWindow.RunMessageBox): Fix a typo
6141     in the docstring
6142    
6143 bh 175 2002-05-15 Bernhard Herzog <[email protected]>
6144    
6145 bh 180 * Thuban/Model/layer.py (Layer.open_shapefile): Set bbox to None
6146     when the shapefile is empty.
6147     (Layer.BoundingBox, Layer.LatLongBoundingBox): Both methods may
6148     now return None for empty shapefiles. Update doc-strings.
6149    
6150     * Thuban/Model/map.py (Map.BoundingBox): Add doc-string. Deal with
6151     the layer's bbox being None.
6152    
6153     * Thuban/UI/tree.py (SessionTreeCtrl.update_tree): Deal with the
6154     layer's bbox being None.
6155    
6156 bh 175 * Thuban/UI/view.py (MapCanvas.shape_selected): Only redraw when
6157     necessary.
6158     (MapCanvas.__init__): New instance variables, last_selected_layer
6159     and last_selected_shape to determine how the selection has
6160     changed.
6161    
6162     * Thuban/UI/tableview.py (TableGrid.__init__): Do not call
6163     AutoSizeColumns because it will cause a traversal of the entire
6164     table which for large .dbf files will take a very long time.
6165    
6166 bh 172 2002-05-14 Bernhard Herzog <[email protected]>
6167    
6168     * Thuban/Model/layer.py (Layer.open_shapefile): Choose a better
6169     maximum depth for the tree than shapelib does by default.
6170    
6171 bh 165 2002-05-10 Bernhard Herzog <[email protected]>
6172    
6173     * setup.py (py_modules): The shptree modules doesn't have a
6174     wrapper, so don't include it in the py_modules
6175    
6176 bh 163 2002-05-08 Bernhard Herzog <[email protected]>
6177    
6178     * extensions/shapelib/shptree.c (compare_ints): Make arguments
6179     const void * as in the qsort prototype
6180     (SHPTreeFindLikelyShapes): Remove some unused variables.
6181    
6182     * Thuban/UI/view.py (PanTool.MouseMove): Use the bitmap the view
6183     maintains to redraw the window during a drag.
6184     (MapCanvas.unprojected_rect_around_point): New method to determine
6185     a small region around a point for hit-testing.
6186     (MapCanvas.find_shape_at): Only test the shapes in a small region
6187     around the point.
6188    
6189     * setup.py: Increment the version to 0.1.2
6190    
6191     * Thuban/UI/tree.py (SessionTreeCtrl.unsubscribe_all): Remove a
6192     debug print and set session to None after unsubscribing
6193    
6194 bh 146 2002-05-07 Bernhard Herzog <[email protected]>
6195    
6196 bh 154 * Data/iceland_sample.session, Data/iceland_sample.thuban: Rename
6197     the file to have a .thuban extension.
6198    
6199 bh 152 * Thuban/UI/tree.py (session_channels): New class constant with
6200     all the session channels to subscribe to to update the tree
6201     (SessionTreeCtrl.session_changed): Remember the session so that we
6202     can unsubscribe properly. Use the new class constant to
6203     unsubscribe from the old session and subscribe to the new one.
6204     (SessionTreeCtrl.unsubscribe_all): New method to unsubscribe all
6205     subscriptions of the SessionTreeCtrl.
6206     (SessionTreeView.OnClose): Call the tree's unsubscribe_all method.
6207    
6208     * Thuban/UI/mainwindow.py (MainWindow.__init__): Add the "Show
6209     Session Tree" command to the file menu.
6210    
6211     * Thuban/UI/view.py (MapCanvas.do_redraw): Pass the entire bitmap
6212     as update_region to the renderer.
6213    
6214     * Thuban/UI/renderer.py
6215     (ScreenRenderer.layer_ids, ScreenRenderer.draw_shape_layer): The
6216     update box is now directly a tuple, not a wxRect anymore.
6217    
6218     * Thuban/Model/layer.py (Layer.ShapesInRegion): Remove some debug
6219     prints.
6220    
6221     2002-05-07 Bernhard Herzog <[email protected]>
6222    
6223 bh 146 * setup.py: Add the shptree extension module. See
6224     extensions/pyshapelib/ChangeLog for more details.
6225    
6226     * extensions/shapelib/shpopen.c, extensions/shapelib/shapefil.h,
6227     extensions/shapelib/dbfopen.c: Really update to the versions of
6228     shapelib 1.2.9. For some reason it wasn't really done on
6229     2002-04-11.
6230    
6231     * extensions/shapelib/shptree.c: Modified version of shptree.c of
6232     shapelib 1.2.9. The only real difference is the use of qsort
6233     instead of a bubble sort implementation
6234    
6235     * Thuban/Model/layer.py (Layer.__init__): New instance variable
6236     shapetree to hold the shapelib quadtree for the shapefile
6237     (Layer.open_shapefile): Create the quad tree.
6238     (Layer.ShapesInRegion): New method to return the ids of shapes in
6239     a given region using the quad tree.
6240    
6241     * extensions/thuban/wxproj.cpp (project_points): Fix some typos in
6242     comment
6243     (draw_polygon_shape): Accept both arcs and polygons.
6244     (initwxproj): Use the new PYSHAPELIB_IMPORT_API macro to import
6245     the api.
6246    
6247     * Thuban/UI/renderer.py (MapRenderer.layer_ids): New method to
6248     return the shape ids to be rendered in a given layer.
6249     (MapRenderer.draw_shape_layer): Call layer_ids to get the list of
6250     ids. Use draw_polygon_shape to draw arc shapes as well.
6251     (ScreenRenderer.RenderMap): New parameter for the rectangle that
6252     has to be updated
6253     (ScreenRenderer.layer_ids): Make use of the layer's quadtree by
6254     calling it's ShapesInRegion method.
6255    
6256     * Thuban/UI/view.py (MapCanvas.__init__): New instance variable
6257     update_region for the update region.
6258     (MapCanvas.OnPaint): Maintain the update region
6259     (MapCanvas.do_redraw): Pass the bounding box of the update_region
6260     to the renderer when drawing the bitmap. Reset the update_region.
6261    
6262 bh 129 2002-05-03 Bernhard Herzog <[email protected]>
6263    
6264 bh 131 * Thuban/UI/mainwindow.py (MainWindow.SaveSessionAs,
6265     MainWindow.OpenSession): Change the file extension of the session
6266     files to .thuban
6267    
6268 bh 129 * Thuban/Model/session.py (Session.AddMap, forwarded_channels):
6269     Move the map channels to be forwarded by the session into the
6270 bh 146 class constant with forwarded_channels. Also add
6271     LAYER_PROJECTION_CHANGED and LAYER_VISIBILITY_CHANGED to
6272     forwarded_channels
6273 bh 129
6274     * Thuban/Model/base.py (Modifiable.changed): Fix doc-string (a
6275     typo and some rewording).
6276    
6277 bh 126 2002-05-02 Bernhard Herzog <[email protected]>
6278    
6279     * Thuban/UI/view.py: Keep the temporary bitmap used during drawing
6280     around to speed up most redraws:
6281     (MapCanvas.__init__): New instance variable bitmap which holds the
6282     bitmap
6283     (MapCanvas.do_redraw): Redraw self.bitmap if necessary. Use
6284     self.bitmap to draw.
6285     (MapCanvas.full_redraw): New method to force a full redraw
6286     including the bitmap
6287     (MapCanvas.SetMap): Subscribe full_redraw instead of redraw to
6288     make sure the bitmap is redrawn.
6289     (MapCanvas.projection_changed, MapCanvas.set_view_transform,
6290     MapCanvas.shape_selected): Call full_redraw instead of readraw to
6291     make sure the bitmap is redrawn.
6292     (MapCanvas.OnSize): New method to handle size events so that the
6293     bitmap can be redrawn.
6294    
6295 bh 124 2002-04-29 Bernhard Herzog <[email protected]>
6296    
6297     * Thuban/UI/mainwindow.py (MainWindow.__init__): Subscribe to the
6298     canvas' VIEW_POSITION event
6299     (MainWindow.view_position_changed): Handler for VIEW_POSITION.
6300     Update the text in the status-bar accordingly.
6301    
6302     * Thuban/UI/view.py (MapCanvas): Derive from Publisher as well
6303     (MapCanvas.__del__): Implement because Publisher.__del__ has to be
6304     called.
6305     (MapCanvas.__init__): Bind EVT_LEAVE_WINDOW too. Initialize
6306     current_position
6307     (MapCanvas.set_current_position): New method to set
6308     current_position. Issue a VIEW_POSITION event
6309     (MapCanvas.CurrentPosition): New public method to return the value
6310     of current_position. Should be called when the VIEW_POSITION event
6311     is processed.
6312     (MapCanvas.OnLeftDown, MapCanvas.OnLeftUp, MapCanvas.OnMotion):
6313     Update the position.
6314     (MapCanvas.OnLeaveWindow): Set the position to None.
6315    
6316     * Thuban/UI/messages.py (VIEW_POSITION): New message for the
6317     position in the statusbar
6318    
6319 tkoester 403 2002-04-26 Frank Koormann <[email protected]>
6320 frank 120
6321     * Thuban/UI/mainwindow.py: AddLayer, Dialog title s/session/data
6322    
6323 tkoester 403 2002-04-24 Frank Koormann <[email protected]>
6324    
6325 frank 118 * Resources/Bitmaps/identify.xpm: shadow added
6326    
6327     * Resources/Bitmaps/fullextent.xpm: new
6328 jan 116
6329 tkoester 403 2002-04-22 Jan-Oliver Wagner <[email protected]>
6330 jan 116
6331 tkoester 403 * Thuban/UI/tree.py (update_tree): added test for None on map bounding
6332     box
6333 jan 114
6334 tkoester 403 2002-04-21 Jan-Oliver Wagner <[email protected]>
6335    
6336 jan 114 * Thuban/UI/proj4dialog.py (UTMProposeZoneDialog): new
6337    
6338     * Thuban/UI/tree.py (update_tree): added added map extent
6339    
6340     * Thuban/UI/mainwindow.py (_method_command): extended by parameter
6341 tkoester 403 icon; added map_full_extend as tool
6342 jan 114
6343 tkoester 403 2002-04-19 Jan-Oliver Wagner <[email protected]>
6344 jan 107
6345     * Thuban/UI/mainwindow.py (SaveSession): launch save as dialog for
6346     saving _new_ sessions
6347    
6348     * Thuban/Model/session.py (create_empty_session): new session
6349     don't have a filename (set to None)
6350    
6351     * Thuban/UI/tree.py (update_tree): added filename and modified flag
6352    
6353     * Thuban/Model/load.py (ProcessSession): convert projection
6354     parameters from unicode to regular string
6355    
6356     * Data/iceland_sample.session: Added UTM Zone 26 projection.
6357    
6358 bh 100 2002-04-11 Bernhard Herzog <[email protected]>
6359    
6360     * extensions/shapelib/shapefil.h, extensions/shapelib/shpopen.c,
6361     extensions/shapelib/dbfopen.c: Update to the versions of shapelib
6362     1.2.9
6363    
6364     * setup.py (Lib.wxproj extension): Don't link shpopen.c and put
6365     the pyshapelib directoy into the list of include dirs, so that
6366     pyshapelib_api.h can be found.
6367    
6368     * extensions/thuban/wxproj.cpp (pyshapelib_api): New variable that
6369     holds the pyshapelib C-API
6370     (draw_polygon_shape, point_in_polygon_shape, shape_centroid): Use
6371     pyshapelib_api to access the shapelib functions.
6372     (initwxproj): Import the c_api from the shapelib module and
6373     initialize pyshapelib_api.
6374    
6375 bh 89 2002-04-04 Bernhard Herzog <[email protected]>
6376    
6377 bh 91 * setup.py (thuban_bdist_rpm.initialize_options): Use
6378     initialize_options to create the scripts for the rpm.
6379    
6380 bh 89 * extensions/pyprojection/setup.py (PROJ4_PREFIX): Just use /
6381    
6382 bh 85 2002-04-03 Bernhard Herzog <[email protected]>
6383    
6384 bh 87 * setup.py: Increment version to 0.1.1
6385    
6386 bh 85 * Thuban/UI/mainwindow.py (MainWindow.__init__): Move the "Add
6387     Layer" and "Remove Layer" commands from the layer menu to the map
6388     menu
6389    
6390 bh 83 2002-02-15 Bernhard Herzog <[email protected]>
6391    
6392     * Thuban/Model/layer.py (Layer.Shape): list append only takes one
6393     argument (python <= 1.5.2 erroneously accepted multiuple
6394     arguments)
6395    
6396 bh 81 2002-02-04 Bernhard Herzog <[email protected]>
6397    
6398     * Thuban/UI/identifyview.py (IdentifyGridCtrl): New class to use a
6399     RecordGrid in the identifyview.
6400     (IdentifyView.__init__): Use IdentifyGridCtrl instead of
6401     IdentifyListCtrl. The grid allows editing of the values.
6402    
6403     * Thuban/UI/controls.py (RecordTable, RecordGridCtrl): New classes
6404     implementing a grid for a single row of a thuban table.
6405    
6406     * Thuban/UI/view.py (MapCanvas.SelectShapeAt): Search through all
6407     layers by default. Easier to use than the previous default of only
6408     searching through the select layer which meant that if no layer
6409     was selected, you couldn't select a shape.
6410    
6411     * Thuban/UI/tableview.py (TableGrid.__init__): Fix typo
6412    
6413     * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Honour the
6414     stroke_width attribute
6415    
6416     * Thuban/Model/save.py (save_session): Write the new stroke_width
6417     attribute
6418    
6419     * Thuban/Model/load.py (ProcessSession.startElement): Read the
6420     stroke_width attribute
6421    
6422     * Thuban/Model/layer.py (Layer.__init__): New parameter and
6423     instance variable stroke_width
6424     (Layer.SetStrokeWidth): Set the stroke_width.
6425    
6426 bh 72 2002-02-01 Bernhard Herzog <[email protected]>
6427    
6428     * extensions/thuban/wxproj.cpp (project_points): Fix two
6429     off-by-one errors in the last loop that joins the various parts
6430     together.
6431    
6432 bh 71 2002-01-14 Bernhard Herzog <[email protected]>
6433    
6434     * setup.py (data_dist.make_distribution): Fix some typos
6435    
6436 bh 70 2001-09-18 Bernhard Herzog <[email protected]>
6437    
6438     * README: Slight tweaking in preparation for the 0.1 release
6439    
6440     * setup.cfg: Add section for sdist to create both tgz and zip
6441     archives
6442    
6443     * setup.py: increase version number to 0.1
6444     (data_dist): New command class for data distribution
6445    
6446 bh 64 2001-09-14 Bernhard Herzog <[email protected]>
6447    
6448 bh 70 * Thuban/UI/identifyview.py (IdentifyListCtrl.selected_shape):
6449     Handle the case of no layer (i.e. layer is None) properly.
6450    
6451 tkoester 403 * Thuban/UI/proj4dialog.py (UTMDialog.__init__, Proj4Dialog.__init__):
6452 bh 70 Set the initial selection of the combo boxes to reflect the
6453     projection we're starting with in a way that works on windows,
6454     too.
6455    
6456 bh 64 * Thuban/Lib/connector.py (Connector.print_connections): Print the
6457     puiblisher's ids in hex to make it easier to compare them to the
6458     standard repr of python methods
6459    
6460     * Thuban/Model/map.py (Map.Destroy): Unsubscribe the label_layer
6461     messages
6462    
6463 bh 59 2001-09-13 Bernhard Herzog <[email protected]>
6464    
6465 bh 64 * Thuban/UI/tree.py (SessionTreeCtrl.OnSelChanged): Make sure to
6466     deselect the layer if no layer is selected
6467    
6468 bh 59 * Thuban/UI/view.py (MapCanvas.OnPaint): Only delay drawing to
6469     idle time when there actually is something to draw. If there's
6470     nothing to draw simply clear the window
6471     (MapCanvas.do_redraw): Call dc.EndDrawing and add some comments.
6472     (MapCanvas.SetMap): force a redraw in all cases because
6473     FitMapToWindow doesn't always do it.
6474     (MapCanvas.ZoomFactor): Add an optional parameter, center, to
6475     specify the point to move into the center of the window
6476     (ZoomOutTool.MouseUp, ZoomInTool.MouseUp): If the mouse wasn't
6477     dragged, zoon in/out by a factor of 2
6478 bh 64 (MapCanvas.find_shape_at): Iterate backwards (i.e. with decreasing
6479     index, i.e. reversed drawing order) so that objects appearing to
6480     be in from of others are selected first. This is probably mostly
6481     relevant for point shapes where the symbols used may overlap
6482 bh 59
6483     * Thuban/Model/session.py (create_empty_session): Unset the
6484     modified bit before returning it
6485    
6486     * Thuban/UI/mainwindow.py (MainWindow.NewSession): Use
6487     create_empty_session session to create the new, empty session.
6488    
6489     * Thuban/UI/mainwindow.py (MainWindow.__init__): Set the size of
6490     the tool bitmaps.
6491     (MainWindow.OnClose, MainWindow.save_modified_session): Separate
6492     the code that asks whether the session should be saved into the
6493     new method save_modified_session.
6494     (MainWindow.OpenSession, MainWindow.NewSession): Use the new
6495     method to save modified session here too.
6496    
6497 bh 55 2001-09-11 Bernhard Herzog <[email protected]>
6498    
6499     * setup.py (InnoIconItem): fix typo
6500    
6501     (thuban_bdist_inno.run):
6502     (bdist_inno.run): Move the decision not to create symlinks on
6503     non-nt platforms to thuban_bdist_inno and do it unconditinally
6504     since we never want to create the symlinks here
6505    
6506 bh 48 2001-09-10 Bernhard Herzog <[email protected]>
6507    
6508 bh 53 * Thuban/UI/mainwindow.py (MainWindow.IdentifyTool): Popup the
6509     identify view immediately
6510    
6511     * Thuban/UI/controls.py: New file with two classes RecordListCtrl
6512     and SelectableRecordListCtrl that implement the code shared by the
6513     identify view and the label dialog
6514    
6515     * Thuban/UI/identifyview.py (IdentifyListCtrl): Derive from the
6516     new class RecordListCtrl
6517    
6518     * Thuban/UI/labeldialog.py (LabelDialog.OnOK): Check whether the
6519     return value of GetValue is None instead of using it as a boolean
6520     directly so that Zero numbers are handled properly.
6521     (LabelListCtrl): Derive from the new class
6522     SelectableRecordListCtrl
6523    
6524 bh 48 * Thuban/UI/proj4dialog.py (Proj4Dialog.__init__):
6525     (Proj4Dialog.dialogLayout): Make the window resizable and set the
6526     size of the text control explicitly to make the sizers work on
6527     both Windows and X.
6528    
6529 bh 44 2001-09-07 Bernhard Herzog <[email protected]>
6530    
6531     * Thuban/UI/view.py (MapCanvas.find_shape_at):Add a new parameter
6532     that can limit the search to the currently selected layer.
6533     (MapCanvas.SelectShapeAt): Make sure that the currently selected
6534     layer stays selected even when no shape is found
6535 bh 46 (MapCanvas.FitRectToWindow): If the rect has zero with or zero
6536     height do nothing (avoids zero division errors)
6537 bh 44
6538 bh 32 2001-09-06 Bernhard Herzog <[email protected]>
6539    
6540 bh 42 * Thuban/UI/tree.py (SessionTreeCtrl, SessionTreeView.__init__):
6541     Correct the spelling of SessionTreeCtrl. dabbrev is too damn
6542     convenient :-)
6543     (SessionTreeCtrl.__init__, SessionTreeCtrl.update_tree): Introduce
6544     a new instvar layer_to_item to map layers to tree items
6545     (SessionTreeCtrl.layer_selected): Select the appropriate tree item
6546     to match the current selection in the interactor
6547    
6548 bh 40 * Thuban/UI/interactor.py (Interactor.SelectedLayer):
6549     (Interactor.HasSelectedLayer): New methods to query the current
6550     selection
6551    
6552     * Thuban/UI/mainwindow.py (MainWindow.current_layer):
6553     (MainWindow.has_selected_layer): Simply call the appropriate
6554     interactor method
6555    
6556     * Thuban/UI/mainwindow.py (MainWindow.__init__):
6557     (MainWindow.LayerShowTable):
6558     (MainWindow.identify_view_on_demand): Store the interactor in an
6559     instvar and use that reference instead of going through main.app
6560    
6561 tkoester 403 * Thuban/UI/mainwindow.py (MainWindow.ShowSessionTree):
6562     * Thuban/UI/application.py (ThubanApplication.OnInit):
6563 bh 40 * Thuban/UI/main.py (main): Create the session tree view in main
6564     with the new mainwindow method ShowSessionTree and not directly
6565     the application's OnInit method
6566    
6567     * Thuban/UI/tree.py (myTreeCtrlPanel):
6568     (SessioinTreeCtrl): Rename to SessioinTreeCtrl and turn it into a
6569     TreeCtrl isntead of a panel. This affects most method since we now
6570     refer to self instead of self.tree
6571     (SessionTreeView): New class implementing a non-modal dialog
6572     showing the session tree.
6573    
6574 bh 35 * Thuban/UI/mainwindow.py (MainWindow.LayerShowTable): Pass the
6575     layer to the tableview dialog.
6576    
6577     * Thuban/UI/tableview.py: Add some doc-strings
6578 tkoester 403 (TableGrid):
6579 bh 35 (TableGrid.OnRangeSelect):
6580     (TableGrid.OnSelectCell):
6581     (TableFrame.__init__):
6582     (TableFrame.row_selected):
6583     Selecting rows in the grid view now updates the selected shapes
6584     through the TableFrame. To achieve this we derive TableGrid from
6585     Publisher and introduce the message type ROW_SELECTED which the
6586     TableFrame subscribes to and which is issued by OnRangeSelect and
6587     OnSelectCell
6588    
6589     (DataTable.SelectRow): Removed because it's no longer needed in
6590     the row/shape selection scheme
6591    
6592 bh 32 * Thuban/UI/dialogs.py: New file implementing common classes for
6593     dialogs
6594    
6595     * Thuban/UI/tableview.py (TableGrid.__init__): Don't subscribe to
6596     the SELECTED_SHAPE message anymore. This is now handled by the
6597     parent.
6598     (TableGrid.select_shape): Only update the selection if the shape
6599     is not None.
6600     (TableFrame): Inherit from the new NonModalDialog class.
6601     (TableFrame.__init__, TableFrame.select_shape): Handle the
6602     SELECT_SHAPE message.
6603     (TableFrame.OnClose): Extend the inherited method to unsubscribe
6604     SELECT_SHAPE
6605    
6606     * Thuban/UI/mainwindow.py (MainWindow.init_dialogs):
6607     (MainWindow.add_dialog):
6608     (MainWindow.dialog_open):
6609     (MainWindow.remove_dialog):
6610     (MainWindow.get_open_dialog): New methods to maintain a dictionary
6611     of opened non-modal dialogs.
6612    
6613     (MainWindow.__init__): Initialize the new non-modal dictionary
6614     management code
6615     (MainWindow.LayerShowTable): maintain separate dialogs for each
6616     table using the non-modal dialog management code to only open a
6617     view once for each table.
6618    
6619     (MainWindow.IdentifyTool):
6620     (MainWindow.__init__):
6621     (MainWindow.identify_view_on_demand): Don't open the identify view
6622     in IdentifyTool anymore. This will be done automatically by the
6623     new method identify_view_on_demand which handles the
6624     SELECTED_SHAPE message so that the identify view will be opened on
6625     demand
6626    
6627     * Thuban/UI/identifyview.py (IdentifyListCtrl.__init__): Remove
6628     the interactor argument. The SELECTED_SHAPE message is now handled
6629     by the parent.
6630     (IdentifyView.__init__): Add the interactor argument so that we
6631     can handle the SELECTED_SHAPE message here
6632     (IdentifyView.selected_shape): New method to handle the
6633     SELECTED_SHAPE messages
6634    
6635     * Thuban/UI/identifyview.py (IdentifyView): Derive from the new
6636     NonModalDialog class
6637     (IdentifyView.OnClose): Extend the inherited version to
6638     unsubscribe SELECT_SHAPE
6639    
6640     * Thuban/Model/session.py (Session.UnsetModified): Remove debug prints
6641    
6642 bh 26 2001-09-05 Bernhard Herzog <[email protected]>
6643    
6644     * Thuban/UI/view.py (MapCanvas.__init__): New argument, interactor.
6645 tkoester 403
6646 bh 26 * Thuban/UI/mainwindow.py (MainWindow.__init__): New argument
6647     interactor to pass through to the MapCanvas
6648 tkoester 403
6649 bh 26 * Thuban/UI/application.py (ThubanApplication.OnInit): Use the new
6650     argument to the MainWindow constructor to get rid of the ugly hack
6651     that made main.app available early just so that the mapcanvas
6652     could access the interactor object.
6653    
6654 bh 19 2001-09-04 Bernhard Herzog <[email protected]>
6655    
6656 bh 22 * Thuban/UI/mainwindow.py (MainWindow.RunMessageBox): New method
6657     that runs a modal message box
6658     (MainWindow.OnClose): Use the new method
6659     (MainWindow.RemoveLayer): Just do nothing in case no layer is
6660     selected. The command should be grayed out anyway, so there's no
6661     need to pop up a message box.
6662     (MainWindow.AddLayer): Pop up a message box with an error message
6663     if the shape file can't be opened
6664    
6665     * Thuban/Model/layer.py (Layer.__init__): Open the shapefile
6666     immediately. This will cause an exception in case the file can't
6667     be opened and we can display an appropriate message.
6668    
6669 bh 19 * MANIFEST.in: Add extensions/pyprojection/LICENSE
6670    
6671     * setup.py (thuban_bdist_rpm): New class implementing a Thuban
6672     specific bdist_rpm command.
6673    
6674     * Thuban/UI/main.py: Catch ImportError exceptions when importing
6675     the locale module because it may not be available on some
6676     installations.
6677    
6678     * extensions/pyprojection/LICENSE: Copy of the license text in
6679     Projection.i. Having it in a separate file makes it easier to
6680     refer to license text in e.g. RPMs
6681    
6682 bh 18 2001-09-03 Bernhard Herzog <[email protected]>
6683    
6684 bh 19 * setup.py: use wx-config instead of wxgtk-config because it's
6685     more generic
6686    
6687     * setup.py (ThubanInstall.get_outputs): Add the symlink in
6688     <prefix>/bin to the outputs
6689     (ThubanInstall.link_file): New method to link files. We need this
6690     because the standard copy_files refuses to link non-existing
6691     files.
6692     (ThubanInstall.run): Remove the leading install root from the
6693     script filename if an install root was specified and use the new
6694     link_file method
6695 tkoester 403
6696 bh 18 * Thuban/UI/mainwindow.py (MainWindow.AddLayer): Fit the map to
6697     the window when the first layer is added to the map.
6698    
6699     * setup.py (ThubanInstall.run): Honor the build root (self.root)
6700     when linking thuban.py to <prefix>/bin
6701    
6702 bh 16 2001-08-31 Bernhard Herzog <[email protected]>
6703    
6704     * setup.py: In the setup call, the install parameters shouldn't
6705     have trailing slashes because distutils on non-posix platforms
6706     doesn't like that. The same applies to other directories like
6707     "Resources/Bitmaps"
6708    
6709     In the configuration section for nt, move the wxWindows directory
6710     optins into the part clearly marked as editable.
6711    
6712     (InstallLocal.initialize_options):
6713     (InstallLocal.user_options): remove the currently unused debug
6714     flag
6715     (thuban_build_py.find_all_modules): Add this method so that it
6716     works for our case of having packages and modules in one
6717     distribution as well.
6718     (ThubanInstall.initialize_options):
6719     (ThubanInstall.finalize_options):
6720     (ThubanInstall.user_options):
6721     (ThubanInstall.boolean_options): Add new options, do-symlink and
6722     extra files. Since these are the first ThubanInstall specific
6723     options, override user_options and boolean_options
6724     (ThubanInstall.run): Honor the new do-symlink and extra-files
6725     options.
6726     (ThubanInstall.get_outputs): Add to override the base-class's
6727     version and add the extra-files to the outputs
6728     (bdist_inno): New class for windows distributions with Inno Setup
6729     (InnoIconItem): Helper class for bdist_inno
6730     (thuban_bdist_inno): Thuban specific version of bdist_inno. Added
6731     this together with the appropriate parameters, to the setup call.
6732 tkoester 403
6733 bh 16 * setup.cfg (bdist_inno): added new section for the inno setup
6734     installer
6735    
6736     * Thuban/UI/tree.py (myTreeCtrlPanel.__init__): New inst var
6737     changing_selection to avoid recursive selection events when
6738     modifying the selection in response to a selection event.
6739     (myTreeCtrlPanel.normalize_selection): Set the new inst var when
6740     changing the tree's selection.
6741     (myTreeCtrlPanel.OnSelChanged): Only normalize the selection when
6742     we're not being called indirectly from normalize_selection.
6743    
6744     * Thuban/UI/mainwindow.py (MainWindow.update_command_ui): Call
6745     event.Check only if the command is actuall checkable.
6746     (MainWindow.__init__): Call the toolbar's Realize method to make
6747     sure that the items are actually shown
6748    
6749 bh 7 2001-08-28 Bernhard Herzog <[email protected]>
6750    
6751 bh 9 * setup.py: Fix some doc strings
6752    
6753 bh 7 * ChangeLog: started
6754    

Properties

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

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26