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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1641 - (hide annotations)
Fri Aug 22 18:25:09 2003 UTC (21 years, 6 months ago) by bh
Original Path: trunk/thuban/ChangeLog
File size: 266961 byte(s)
update ChangeLog

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

Properties

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

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26