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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1735 - (hide annotations)
Mon Sep 22 12:26:33 2003 UTC (21 years, 5 months ago) by jan
Original Path: trunk/thuban/ChangeLog
File size: 285606 byte(s)
Small improvement of APR import.

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

Properties

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

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26