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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1688 - (hide annotations)
Fri Aug 29 10:02:34 2003 UTC (21 years, 6 months ago) by bh
Original Path: trunk/thuban/ChangeLog
File size: 280654 byte(s)
update ChangeLog

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

Properties

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

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26