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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1690 - (hide annotations)
Fri Aug 29 10:04:50 2003 UTC (21 years, 6 months ago) by jan
Original Path: trunk/thuban/ChangeLog
File size: 280768 byte(s)
updated to manual version to 1.0pre2.

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

Properties

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

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26