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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1707 - (hide annotations)
Wed Sep 3 08:31:50 2003 UTC (21 years, 6 months ago) by jan
Original Path: trunk/thuban/ChangeLog
File size: 283047 byte(s)
Fix/workaround for bug #2019:
https://intevation.de/rt/webrt?serial_num=2019

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

Properties

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

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26