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

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

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 766 by bh, Tue Apr 29 12:42:27 2003 UTC revision 1688 by bh, Fri Aug 29 10:02:34 2003 UTC
# Line 1  Line 1 
1    2003-08-29  Bernhard Herzog  <[email protected]>
2    
3            Add some missing parameters to projections. Proj complains about
4            them on windows but for some reason not on Linux.
5    
6            * test/test_save.py (SaveSessionTest.testLayerProjection): Add
7            missing required projection parameters
8    
9            * test/test_proj.py (TestProjFile.test): Add missing required
10            projection parameters
11    
12            * test/test_load_0_8.py (TestLayerProjection.file_contents)
13            (TestLayerProjection.test): Add missing required projection
14            parameters and tests for them
15    
16            * test/test_load.py (TestLayerProjection.file_contents)
17            (TestLayerProjection.test): Add missing required projection
18            parameters and tests for them
19    
20            * test/test_layer.py (TestLayer.test_base_layer): Add missing
21            required projection parameters
22    
23    2003-08-29  Bernhard Herzog  <[email protected]>
24    
25            * libraries/pyprojection/Projection.i: Use pj_get_errno_ref to
26            access the pj_errno because directly accessing pj_errno doesn't
27            work on windows if the proj library is in a DLL
28    
29            * libraries/pyprojection/Projection_wrap.c: Update from Projection.i
30    
31    2003-08-28  Bernhard Herzog  <[email protected]>
32    
33            * test/test_proj.py: Import things from Thuban after calling
34            initthuban
35    
36            * test/test_load.py (LoadSessionTest.filenames): New class
37            variable with the filename attributes to normalize
38            (LoadSessionTest.check_format): Pass self.filenames to
39            sax_eventlist to normalize the filename attributes
40    
41            * test/xmlsupport.py: Add cvs keywords
42            (SaxEventLister.__init__): New parameter filenames which indicates
43            attributes that contain filenames
44            (SaxEventLister.startElementNS): Normalize the filename attributes
45            with os.path.normpath
46            (sax_eventlist): New parameter filenames to pass through to
47            SaxEventLister
48    
49            * test/test_derivedshapestore.py: Make this file callable as a
50            program to execute the tests
51            (TestDerivedShapeStoreExceptions.test_table_with_wrong_size): Bind
52            the session to self.session so that it gets destroyed properly
53    
54            * test/test_layer.py (TestLayer.tearDown): Call the session's
55            Destroy method
56    
57            * test/test_map.py (TestMapBase.tearDown): Destroy self.session
58            too if it exists
59            (TestMapAddLayer.test_add_layer): Bind the session to self.session
60            so that it gets destroyed properly
61    
62            * test/postgissupport.py (reason_for_not_running_tests): Add a
63            test for the existence of popen2.Popen4.
64    
65            * test/test_save.py (SaveSessionTest.tearDown): New. Provide a
66            reliable way to destroy the sessions created in the test cases
67            (SaveSessionTest.test_dbf_table): Bind the session to self.session
68            so that it gets destroyed properly
69            (SaveSessionTest.testLayerProjection): Bind the session to
70            self.session so that it gets destroyed properly
71    
72            * test/test_session.py (UnreferencedTablesTests.tearDown): Make
73            sure that the session is destroyed properly
74    
75            * test/test_shapefilestore.py: Make this callable as a program to
76            execute the tests
77    
78            * test/test_scalebar.py: Remove unnecessary import of _ from
79            Thuban
80    
81            * test/support.py (print_garbage_information): Call initthuban
82            here because it may be called indirectly from test cases that test
83            test support modules which do not use anything from thuban itself
84            (ThubanTestProgram.runTests): Remove unnecessary debug print
85    
86    2003-08-28  Bernhard Herzog  <[email protected]>
87    
88            * Thuban/version.py (longversion): Update to 0.9
89    
90            * Thuban/UI/mainwindow.py: Remove some unused imports
91    
92            * README: Add section about required additional software. Add date
93            and revision CVS keywords
94    
95            * HOWTO-Release: Add item about the translations. Add date and
96            revision CVs keywords and change formatting to match README a bit
97            better
98    
99            * po/de.po: Update for 0.9
100    
101            * test/README: Tweak the wording a little because many tests are
102            not really unittest.
103    
104    2003-08-27  Bernhard Herzog  <[email protected]>
105    
106            As preparation for the 0.9 release, switch thuban files to a
107            non-dev namespace
108    
109            * Thuban/Model/save.py (SessionSaver.write_session): Write files
110            with the http://thuban.intevation.org/dtds/thuban-0.9.dtd
111            namespace
112    
113            * Thuban/Model/load.py (SessionLoader.__init__): Accept the
114            http://thuban.intevation.org/dtds/thuban-0.9.dtd namespace too
115    
116            * test/test_save.py (SaveSessionTest.dtd)
117            (SaveSessionTest.testEmptySession)
118            (SaveSessionTest.testSingleLayer)
119            (SaveSessionTest.testLayerProjection)
120            (SaveSessionTest.testRasterLayer)
121            (SaveSessionTest.testClassifiedLayer)
122            (SaveSessionTest.test_dbf_table)
123            (SaveSessionTest.test_joined_table)
124            (SaveSessionTest.test_save_postgis): Update for new namespace
125    
126            * test/test_load.py (LoadSessionTest.dtd, TestSingleLayer)
127            (TestLayerVisibility.file_contents, TestLabels.file_contents)
128            (TestLayerProjection.file_contents)
129            (TestRasterLayer.file_contents, TestJoinedTable.file_contents)
130            (TestPostGISLayer.file_contents)
131            (TestPostGISLayerPassword.file_contents)
132            (TestLoadError.file_contents, TestLoadError.test): Update for new
133            namespace
134    
135    2003-08-27  Bernhard Herzog  <[email protected]>
136    
137            Make the table interface distinguish between row ids (an integer
138            that uniquely identifies a row) and row ordinals (a simple row
139            count from 0 to NumRows() - 1)
140    
141            * Thuban/Model/postgisdb.py (PostGISTable.RowIdToOrdinal)
142            (PostGISTable.RowOrdinalToId): New methods to conver between row
143            ids and row ordinals
144            (PostGISTable.ReadRowAsDict, PostGISTable.ReadValue): New keyword
145            parameter row_is_ordinal to indicate whether the row parameter is
146            the row id or the ordinal
147    
148            * Thuban/Model/transientdb.py (TransientTableBase.RowIdToOrdinal)
149            (TransientTableBase.RowOrdinalToId)
150            (AutoTransientTable.RowIdToOrdinal)
151            (AutoTransientTable.RowOrdinalToId): Same new methods as in
152            PostGISTable.
153            (TransientTableBase.ReadRowAsDict, TransientTableBase.ReadValue)
154            (AutoTransientTable.ReadRowAsDict, AutoTransientTable.ReadValue):
155            Same new parameter as in PostGISTable.
156    
157            * Thuban/Model/table.py (DBFTable.RowIdToOrdinal)
158            (DBFTable.RowOrdinalToId, MemoryTable.RowIdToOrdinal)
159            (MemoryTable.RowOrdinalToId): Same new methods as in PostGISTable.
160            (DBFTable.ReadValue, DBFTable.ReadRowAsDict)
161            (MemoryTable.ReadValue, MemoryTable.ReadRowAsDict): Same new
162            parameter as in PostGISTable.
163    
164            * Thuban/UI/tableview.py (DataTable.RowIdToOrdinal)
165            (DataTable.RowOrdinalToId): New methods to convert between row ids
166            and row ordinals.
167            (TableGrid.SelectRowById): New method to select a row based on its
168            ID as opposed to its ordinal
169            (DataTable.GetValue, TableGrid.OnRangeSelect)
170            (TableGrid.OnSelectCell, LayerTableGrid.select_shapes)
171            (QueryTableFrame.OnQuery, QueryTableFrame.get_selected)
172            (LayerTableFrame.__init__): Convert between row ids and row
173            ordinals as appropriate
174    
175            * test/postgissupport.py (PostGISDatabase.__init__): Add
176            doc-string.
177            (PostGISDatabase.initdb): The optional third item in a tuple in
178            tables is now a (key, value) list with additional arguments to
179            pass to upload_shapefile
180            (upload_shapefile): New parameter gid_offset to allow gids that
181            are not the same as the shapeids in the shapefile
182            (PostgreSQLServer.get_default_static_data_db): Use the new
183            gid_offset to make the gids in landmarks 1000 higher than the
184            shapeids in the shapefile
185    
186            * test/test_viewport.py
187            (TestViewportWithPostGIS.test_find_shape_at_point): Adapt to the
188            new shapeids in the landmarks table
189    
190            * test/test_transientdb.py
191            (TestTransientTable.run_iceland_political_tests)
192            (TestTransientTable.test_transient_joined_table): Add tests for
193            the new table methods and new keywords arguments.
194    
195            * test/test_postgis_db.py
196            (TestPostGISTable.test_read_row_as_dict_row_count_mode)
197            (TestPostGISTable.test_read_value_row_count_mode)
198            (TestPostGISTable.test_row_id_to_ordinal)
199            (TestPostGISTable.test_row_oridnal_to_id): New test for the new
200            table methods and the new arguments
201            (TestPostGISShapestorePoint.test_shapes_in_region)
202            (TestPostGISShapestorePoint.test_shape_raw_data)
203            (TestPostGISShapestorePoint.test_shape_points)
204            (TestPostGISShapestorePoint.test_shape_shapeid)
205            (TestPostGISShapestorePoint.test_all_shapes)
206            (TestPostGISTable.test_simple_query)
207            (TestPostGISTable.test_simple_query)
208            (TestPostGISTable.test_simple_query)
209            (TestPostGISTable.test_read_value)
210            (TestPostGISTable.test_read_row_as_dict): Adapt to the new
211            shapeids in the landmarks table
212    
213            * test/test_memory_table.py
214            (TestMemoryTable.test_read_row_as_dict_row_count_mode)
215            (TestMemoryTable.test_read_value_row_count_mode)
216            (TestMemoryTable.test_row_id_to_ordinal)
217            (TestMemoryTable.test_row_oridnal_to_id): New test for the new
218            table methods and the new arguments
219    
220            * test/test_dbf_table.py
221            (TestDBFTable.test_read_row_as_dict_row_count_mode)
222            (TestDBFTable.test_read_value_row_count_mode)
223            (TestDBFTable.test_row_id_to_ordinal)
224            (TestDBFTable.test_row_oridnal_to_id): New test for the new table
225            methods and the new arguments
226    
227    2003-08-26  Bernhard Herzog  <[email protected]>
228    
229            * Thuban/Model/postgisdb.py (PostGISShapeStore.BoundingBox): Use a
230            more postgis specific but much faster method to get the bounding
231            box
232    
233    2003-08-26  Bernhard Herzog  <[email protected]>
234    
235            * Thuban/Model/postgisdb.py (PostGISTable.Title)
236            (PostGISShapeStore.AllShapes): Add these missing methods.
237            (PostGISShapeStore.ShapesInRegion): No need to raise
238            StopIteration. We can simply return
239    
240            * test/test_postgis_db.py (TestPostGISTable.test_title)
241            (TestPostGISShapestorePoint.test_all_shapes): New tests for the
242            new methods
243    
244    2003-08-25  Bernhard Herzog  <[email protected]>
245    
246            * Thuban/Model/postgisdb.py (shapetype_map): Add MUTLIPOLYGON.
247    
248            * test/test_postgis_db.py (PolygonTests): New class containing
249            those tests from TestPostGISShapestorePolygon that can also be
250            used to test MUTLIPOLYGON tables
251            (TestPostGISShapestorePolygon): Most tests are now in PolygonTests
252            so derive from that
253            (TestPostGISShapestoreMultiPolygon): New class with tests for
254            MUTLIPOLYGON tables
255    
256            * test/postgissupport.py (PostGISDatabase.initdb): Allow the
257            tables argument to have tuples with three items to override the
258            WKT type used.
259            (PostgreSQLServer.get_default_static_data_db): Use the above to
260            create a polygon table with MUTLIPOLYGONs
261            (point_to_wkt, coords_to_point, polygon_to_wkt, coords_to_polygon)
262            (arc_to_wkt, coords_to_multilinestring): Rename from *_to_wkt to
263            coords_to*
264            (coords_to_multipolygon): New. Convert to MUTLIPOLYGON
265            (wkt_converter): New. Map WKT types to converters
266            (upload_shapefile): New parameter force_wkt_type to use a
267            different WKT type than the default
268    
269    2003-08-25  Bernhard Herzog  <[email protected]>
270    
271            * Thuban/UI/application.py
272            (ThubanApplication.run_db_param_dialog): New. Suitable as a
273            db_connection_callback. Main difference is that the dialog run
274            from this method doesn't have a parent so it can be used even when
275            there is no main window
276            (ThubanApplication.OpenSession): Use self.run_db_param_dialog if
277            no db_connection_callback was given. This way the dialog pops up
278            even when the .thuban file was given as a command line parameter.
279    
280    2003-08-25  Bernhard Herzog  <[email protected]>
281    
282            * Thuban/UI/view.py (MapCanvas.OnLeftUp): Release the the mouse
283            before calling MouseLeftUp. MouseLeftUp may pop up modal dialogs
284            which leads to an effectively frozen X session because the user
285            can only interact with the dialog but the mouse is still grabbed
286            by the canvas.
287            Also, call the tool's Hide method before MouseLeftUp because
288            MouseLeftUp may change the tool's coordinates.
289    
290    2003-08-25  Bernhard Herzog  <[email protected]>
291    
292            * Thuban/UI/application.py (ThubanApplication.OpenSession): Catch
293            LoadCancelled exceptions and handle them by returning immediately.
294    
295    2003-08-25  Bernhard Herzog  <[email protected]>
296    
297            GUI part of loading sessions with postgis connections which may
298            require user interaction to get passwords or updated parameters
299    
300            * Thuban/UI/dbdialog.py (DBDialog): Reimplement to make it look a
301            bit nucer and be more generic.
302            (DBFrame.OnAdd): Adapt to new DBDialog interface
303    
304            * Thuban/UI/application.py (ThubanApplication.OpenSession): New
305            optional parameter db_connection_callback which is passed to
306            load_session.
307    
308            * Thuban/UI/mainwindow.py (MainWindow.run_db_param_dialog): New.
309            Suitable as a db_connection_callback
310            (MainWindow.OpenSession): Use self.run_db_param_dialog as the
311            db_connection_callback of the application's OpenSession method
312    
313    
314    2003-08-25  Bernhard Herzog  <[email protected]>
315    
316            Basic loading of sessions containing postgis connections:
317    
318            * Thuban/Model/load.py (LoadError): Add doc-string
319            (LoadCancelled): New exception class to indicate a cancelled load
320            (SessionLoader.__init__): Add the db_connection_callback parameter
321            which will be used by the loader to get updated parameters and a
322            password for a database connection
323            (SessionLoader.__init__): Add the new XML elements to the
324            dispatchers dictionary
325            (SessionLoader.check_attrs): Two new conversions, ascii to convert
326            to a byte-string object and idref as a generic id reference
327            (SessionLoader.start_dbconnection)
328            (SessionLoader.start_dbshapesource): New. Handlers for the new XML
329            elements
330            (load_session): Add the db_connection_callback to pass through the
331            SessionLoader
332    
333            * test/test_load.py (TestPostGISLayer, TestPostGISLayerPassword):
334            New classes to test loading of sessions with postgis database
335            connections.
336    
337    2003-08-25  Bernhard Herzog  <[email protected]>
338    
339            * Thuban/UI/mainwindow.py (__ThubanVersion__): Remove this and
340            replace it and the comment with __BuildDate__ by the Source: and
341            Id: cvs keywords as used in the other files.
342    
343    2003-08-25  Bernhard Herzog  <[email protected]>
344    
345            * Thuban/Model/load.py (SessionLoader.check_attrs): Raise a
346            LoadError when a required attribute is missing. The code used to
347            be commented out for some reason, but probably should have been
348            active.
349    
350            * test/test_load.py (TestLoadError.test): Test the message in the
351            LoadError too to make sure it really is about the missing
352            attribute
353    
354    2003-08-22  Bernhard Herzog  <[email protected]>
355    
356            * test/test_save.py (SaveSessionTest.test_dbf_table)
357            (SaveSessionTest.test_joined_table): Add XML validation tests.
358    
359    2003-08-22  Bernhard Herzog  <[email protected]>
360    
361            Implement saving a session with a postgis connection
362    
363            * Resources/XML/thuban-0.9.dtd (dbconnection, dbshapesource) New
364            elements for database connections and shapestores using db
365            connections
366            (session): Add the dbconnections to the content model
367    
368            * Thuban/Model/save.py (SessionSaver.write_db_connections): New.
369            Write the db connections
370            (SessionSaver.write_session): Call write_db_connections to write
371            the connection before the data sources
372            (SessionSaver.write_data_containers): Handle postgis shapestores
373    
374            * test/test_save.py (SaveSessionTest.thubanids)
375            (SaveSessionTest.thubanidrefs): Update for new DTD
376            (SaveSessionTest.test_save_postgis): New. Test saving a session
377            with postgis connections
378    
379            * Thuban/Model/postgisdb.py (PostGISTable.DBConnection)
380            (PostGISTable.TableName): New accessor methods for the connection
381            and table name
382    
383            * test/test_postgis_db.py (TestPostGISTable.test_dbconn)
384            (TestPostGISTable.test_dbname): New methods to test the new
385            PostGISConnection methods
386    
387    2003-08-22  Bernhard Herzog  <[email protected]>
388    
389            * Thuban/Model/postgisdb.py (ConnectionError): New exception class
390            for exceptions occurring when establishing a Database connection
391            (PostGISConnection.connect): Catch psycopg.OperationalError during
392            connects and raise ConnectionError.
393    
394            * test/test_postgis_db.py (TestPostgisDBExceptions): New class for
395            tests for database exceptions
396    
397    2003-08-22  Bernhard Herzog  <[email protected]>
398    
399            Prepare the test suite for tests with required authentication
400    
401            * test/postgissupport.py (PostgreSQLServer.__init__): Add instance
402            variables with two predefined users/passwords, one for the admin
403            and one for a non-privileged user.
404            (PostgreSQLServer.createdb): Pass the admin name to initdb and add
405            the non-privileged user to the database and set the admin password
406            (PostgreSQLServer.wait_for_postmaster): Use the admin user name.
407            Better error reporting
408            (PostgreSQLServer.connection_params)
409            (PostgreSQLServer.connection_string): New methods to return
410            information about how to connect to the server
411            (PostgreSQLServer.execute_sql): New. Convenience method to execute
412            SQL statements
413            (PostgreSQLServer.require_authentication): Toggle whether the
414            server requires authentication
415            (PostgreSQLServer.create_user, PostgreSQLServer.alter_user): New.
416            Add or alter users
417            (PostGISDatabase.initdb): Pass the admin name one the
418            subprocesses' command lines. Grant select rights on
419            geometry_columns to everybody.
420            (upload_shapefile): Use the admin name and password when
421            connecting. Grant select rights on the new table to everybody.
422    
423            * test/test_viewport.py (TestViewportWithPostGIS.setUp): Use the
424            server's new methods to get the connection parameters.
425    
426            * test/test_postgis_session.py (TestSessionWithPostGIS.setUp)
427            (TestSessionWithPostGIS.test_remove_dbconn_exception): Use the
428            server's new methods to get the connection parameters.
429    
430            * test/test_postgis_db.py
431            (TestPostGISConnection.test_gis_tables_empty)
432            (TestPostGISConnection.test_gis_tables_non_empty)
433            (PostGISStaticTests.setUp): Use the server's new methods to get
434            the connection parameters.
435    
436    2003-08-22  Bernhard Herzog  <[email protected]>
437    
438            * Thuban/UI/about.py (About.__init__): Add the psycopg version.
439    
440            * Thuban/version.py: Add psycopg version
441    
442            * Thuban/Model/postgisdb.py (psycopg_version): New. Return the
443            version of the psycopg module
444    
445    2003-08-22  Bernhard Herzog  <[email protected]>
446    
447            * Thuban/UI/dbdialog.py (DBPwdDlg): Removed because it's not used.
448            (DBFrame.OnEdit): Removed because it's not used and wouldn't work
449            at the moment. The functionality should probably be implemented
450            some time, though.
451            (DBFrame.OnRemove): Display a message if the connection can't be
452            removed because it's still in use.
453    
454    2003-08-22  Jan-Oliver Wagner <[email protected]>
455    
456            * Thuban/UI/about.py (About.__init__): split up the huge about
457            text into elements/lists for easier translation. This fixes bug
458            https://intevation.de/rt/webrt?serial_num=2058
459            Also, made some forgotten string available for the i18n.
460    
461    2003-08-21  Bernhard Herzog  <[email protected]>
462    
463            Make postgis support really optional including insensitive menu
464            items.
465    
466            * Thuban/Model/postgisdb.py (has_postgis_support): New. Return
467            whether the postgis is supported.
468    
469            * Thuban/UI/dbdialog.py: Put the psycopg import into try..except
470            to make postgis support optional
471    
472            * Thuban/UI/mainwindow.py (_has_postgis_support): New. Context
473            version of Thuban.Model.postgisdb.has_postgis_support
474            (database_management command): Make it only sensitive if postgis
475            is supported.
476    
477    2003-08-21  Jan-Oliver Wagner <[email protected]>
478    
479            * Doc/manual/thuban-manual.xml: Added CVS revision for rev-history.
480            (section Adding and Removing Layers): Added text and described
481            multi-selection.
482            (chapter Extensions): New.
483    
484    2003-08-21  Jan-Oliver Wagner <[email protected]>
485    
486            * Thuban/UI/mainwindow.py (MainWindow.AddLayer): Changed dialog
487            settings to allow multiple files to load into the map.
488            Also reduced selection to *.shp as a default.
489    
490    2003-08-20  Bernhard Herzog  <[email protected]>
491    
492            Add dialogs and commands to open database connections and add
493            database layers.
494    
495            * Thuban/UI/mainwindow.py (MainWindow.DatabaseManagement): New
496            method to open the database connection management dialog
497            (MainWindow.AddDBLayer): New method to add a layer from a database
498            (_has_dbconnections): New helper function to use for sensitivity
499            (database_management command, layer_add_db command): New commands
500            that call the above new methods.
501            (main_menu): Add the new commands to the menu.
502    
503            * Thuban/Model/postgisdb.py (PostGISConnection.__init__)
504            (PostGISConnection.connect): Establish the actual connection in a
505            separate method and call it in __init__. This makes it easier to
506            override the behavior in test cases
507            (PostGISConnection.BriefDescription): New method to return a brief
508            description for use in dialogs.
509    
510            * test/test_postgis_db.py (NonConnection): DB connection that
511            doesn't actually connect
512            (TestBriefDescription): New class with tests for the new
513            BriefDescription method
514    
515    2003-08-19  Jan-Oliver Wagner <[email protected]>
516    
517            Moved anything from extensions to libraries.
518    
519            * libraries: New.
520    
521            * libraries/ pyprojection, pyshapelib, shapelib, thuban: New.
522    
523            * libraries/pyprojection/ LICENSE, MANIFEST.in, Projection.i,
524            Projection.py, Projection_wrap.c, setup.py, swighelp.txt: These files have
525            been moved here from thuban/extensions/pyprojection/
526            See there in the Attic for the older history.
527    
528            * libraries/pyshapelib/ COPYING, ChangeLog, NEWS, README, dbflib.i,
529            dbflib.py, dbflib_wrap.c, pyshapelib_api.h, pytest.py, setup.py,
530            shapelib.i, shapelib.py, shapelib_wrap.c, shptreemodule.c: These files
531            have been moved here from thuban/extensions/pyshapelib/
532            See there in the Attic for the older history.
533    
534            * libraries/shapelib/ dbfopen.c, shapefil.h, shpopen.c, shptree.c: These
535            files have been moved here from thuban/extensions/shapelib/
536            See there in the Attic for the older history.
537    
538            * libraries/thuban/ bmpdataset.cpp, cpl_mfile.cpp, cpl_mfile.h,
539            gdalwarp.cpp, wxproj.cpp: These files have been moved here from
540            thuban/extensions/thuban/
541            See there in the Attic for the older history.
542    
543            * MANIFEST.in, setup.cfg, setup.py: renamed extensions to libraries.
544    
545            * extensions/thuban/ bmpdataset.cpp, cpl_mfile.cpp, cpl_mfile.h,
546            gdalwarp.cpp, wxproj.cpp: Moved to libraries/thuban.
547    
548            * extensions/shapelib/ dbfopen.c, shapefil.h, shpopen.c, shptree.c:
549            Moved to libraries/shapelib.
550    
551            * extensions/pyshapelib/ COPYING, NEWS, dbflib.py, pytest.py,
552            shapelib.py, README, dbflib_wrap.c, setup.py, shapelib_wrap.c,
553            ChangeLog, dbflib.i, pyshapelib_api.h, shapelib.i, shptreemodule.c:
554            Moved to libraries/pyshapelib.
555    
556            * extensions/pyprojection/ MANIFEST.in, Projection.py, setup.py,
557            LICENSE, Projection.i, Projection_wrap.c, swighelp.txt:
558            Moved to libraries/pyprojection.
559    
560            * extensions/ pyprojection, pyshapelib, shapelib, thuban: Removed.
561    
562            * extensions: Removed.
563    
564    2003-08-19  Bernhard Herzog  <[email protected]>
565    
566            * test/test_viewport.py (ViewPortTest): We don't use the
567            facilities of FileTestMixin so don't derive from it.
568            (TestViewportWithPostGIS): New class with tests for using a
569            viewport on a map with postgis layers.
570    
571    2003-08-19  Bernhard Herzog  <[email protected]>
572    
573            Add the db connection management to the session.
574    
575            * Thuban/Model/session.py (Session.__init__): New instance
576            variable db_connections
577            (Session.AddDBConnection, Session.DBConnections)
578            (Session.HasDBConnections, Session.CanRemoveDBConnection)
579            (Session.RemoveDBConnection): New methods to manage and query the
580            db connections managed by the session
581            (Session.OpenDBShapeStore): New method to open a shapestore from a
582            db connection
583    
584            * Thuban/Model/messages.py (DBCONN_REMOVED, DBCONN_ADDED): New
585            messages for the db connection handling in the session
586    
587            * test/test_postgis_session.py: New. test cases for the session's
588            db connection handling with postgis connections
589    
590    2003-08-19  Bernhard Herzog  <[email protected]>
591    
592            Add very basic postgis database support and the corresponding test
593            cases. The test cases require a PostgreSQL + postgis installation
594            but no existing database. The database will be created
595            automatically by the test cases
596    
597            * test/README: Add note about skipped tests and the requirements
598            of the postgis tests.
599    
600            * Thuban/Model/postgisdb.py: New. Basic postgis database support.
601    
602            * test/test_postgis_db.py: New. Test cases for the postgis
603            support.
604    
605            * Thuban/Model/wellknowntext.py: New. Parser for well-known-text
606            format
607    
608            * test/test_wellknowntext.py: New. Test cases for the
609            wellknowntext parser
610    
611            * test/postgissupport.py: New. Support module for tests involving
612            a postgis database.
613    
614            * test/support.py (execute_as_testsuite): Shut down the postmaster
615            if it's still running after the tests
616    
617            * Thuban/Model/data.py (RAW_WKT): New constant for raw data in
618            well known text format
619    
620    2003-08-19  Jan-Oliver Wagner <[email protected]>
621    
622            * Examples/simple_extensions/hello_world.py: New. Raises a Hello World
623            message dialog.
624    
625    2003-08-18  Bernhard Herzog  <[email protected]>
626    
627            * test/support.py (ThubanTestResult.printErrors): Indent the
628            reason for the skips in the output to make it a bit more readable.
629            (execute_as_testsuite): New helper function to run a test suite
630            and print some more information.
631            (run_tests): Use execute_as_testsuite to run the tests
632    
633            * test/runtests.py (main): Use execute_as_testsuite to run the
634            tests
635    
636    2003-08-18  Bernhard Herzog  <[email protected]>
637    
638            Fix some bugs in Thuban and the test suite that were uncovered by
639            changes introduced in Python 2.3:
640    
641            * Thuban/Model/table.py (DBFTable.__init__): Make sure the
642            filename is an absolute name
643    
644            * Thuban/Model/layer.py (RasterLayer.__init__): Make sure the
645            filename is an absolute name
646    
647            * test/test_save.py (SaveSessionTest.testRasterLayer): Use a
648            unique filename to save to and use the correct relative filename
649            in the expected output.
650            (SaveSessionTest.test_dbf_table): Use the correct relative
651            filename in the expected output.
652    
653            * test/test_layer.py (TestLayer.test_raster_layer): Update the
654            test to check whether the filename is absolute.
655    
656    2003-08-18  Jan-Oliver Wagner <[email protected]>
657    
658            * Thuban/UI/about.py (About.__init__): Added Silke Reimer.
659    
660    2003-08-15  Bernhard Herzog  <[email protected]>
661    
662            Change the way shapes are returned by a shape store. The
663            ShapesInRegion method returns an iterator over actual shape
664            objects instead of a list of shape ids.
665    
666            * Thuban/Model/data.py (ShapefileShape.ShapeID): New. Return shape
667            id.
668            (ShapefileStore.ShapesInRegion): Return an iterator over the
669            shapes which yields shape objects instead of returning a list of
670            shape ids
671            (ShapefileStore.AllShapes): New. Return an iterator over all
672            shapes in the shape store
673            (DerivedShapeStore.AllShapes): New. Like in ShapefileStore
674    
675            * Thuban/Model/layer.py (Layer.ShapesInRegion): Update
676            doc-string.
677    
678            * Thuban/UI/baserenderer.py
679            (BaseRenderer.layer_ids, BaseRenderer.layer_shapes): Rename to
680            layer_shapes and make it return an iterator containg shapes
681            instead of a list of ids.
682            (BaseRenderer.draw_shape_layer): Update doc-string; Adapt to
683            layer_shapes() change
684    
685            * Thuban/UI/renderer.py (ScreenRenderer.layer_ids)
686            (ScreenRenderer.layer_shapes): Rename as in BaseRenderer
687    
688            * Thuban/UI/viewport.py (ViewPort._find_shape_in_layer): Adapt to
689            changes in the ShapesInRegion return value.
690            (ViewPort._get_hit_tester): Remove commented out code
691    
692            * test/mockgeo.py (SimpleShapeStore.ShapesInRegion): Adapt to the
693            new return value.
694            (SimpleShapeStore.AllShapes): New. Implement this method too.
695    
696            * test/test_layer.py (TestLayer.test_arc_layer)
697            (TestLayer.test_polygon_layer, TestLayer.test_point_layer)
698            (TestLayer.test_point_layer_with_projection)
699            (TestLayer.test_derived_store): Adapt to changes in the
700            ShapesInRegion return value.
701    
702            * test/test_shapefilestore.py
703            (TestShapefileStoreArc.test_shapes_in_region)
704            (TestShapefileStorePolygon.test_shapes_in_region)
705            (TestShapefileStorePoint.test_shapes_in_region): Adapt to changes
706            in the ShapesInRegion return value.
707            (TestShapefileStorePoint.test_all_shapes)
708            (TestShapefileStoreArc.test_shape_shapeid): New tests for the new
709            methods
710    
711            * test/test_derivedshapestore.py
712            (TestDerivedShapeStore.test_shapes_in_region): Adapt to changes in
713            the ShapesInRegion return value.
714            (TestDerivedShapeStore.test_all_shapes)
715            (TestDerivedShapeStore.test_shape_shapeid): New tests for the new
716            methods
717    
718    2003-08-15  Bernhard Herzog  <[email protected]>
719    
720            Make the renderers deal correctly with raw vs. python level
721            representation of shape geometries
722    
723            * Thuban/UI/baserenderer.py (BaseRenderer.low_level_renderer):
724            Return a flag useraw in addition to the callable and the parameter
725            to indicate whether the callable can deal with the raw shape data
726            or uses the higher level python lists of coordinates. The callable
727            now should accept either the raw data or the return value of the
728            shape's Points() method.
729            (BaseRenderer.draw_shape_layer): Adapt to the low_level_renderer
730            change
731            (BaseRenderer.projected_points): Instead of the shape id use the
732            points list as parameter.
733            (BaseRenderer.draw_polygon_shape, BaseRenderer.draw_arc_shape)
734            (BaseRenderer.draw_point_shape): Adapt to projected_points()
735            change and accept the points list as parameter instead of the
736            shape id.
737    
738            * Thuban/UI/renderer.py (MapRenderer.low_level_renderer): Return
739            the useraw flag as required by the BaseRenderer
740            (ScreenRenderer.draw_shape_layer): Adapt to low-level renderer
741            changes.
742    
743            * test/test_baserenderer.py
744            (TestBaseRenderer.test_point_with_classification): New test for
745            rendering a map with classifications.
746    
747    2003-08-15  Bernhard Herzog  <[email protected]>
748    
749            * Thuban/UI/viewport.py (ViewPort.find_shape_at)
750            (ViewPort._find_shape_in_layer, ViewPort._find_shape_in_layer)
751            (ViewPort._get_hit_tester, ViewPort.projected_points)
752            (ViewPort._hit_point, ViewPort._hit_arc, ViewPort._hit_polygon)
753            (ViewPort._find_label_at): Split the find_shape_at method into
754            several new methods and use the functions in the hit-test module.
755    
756            * Thuban/UI/hittest.py: New module with Python-level hit-testing
757            functions
758    
759            * test/test_hittest.py: New. Test for the new hittest module
760    
761    2003-08-15  Bernhard Herzog  <[email protected]>
762    
763            * Thuban/Model/layer.py (Layer.ShapesInRegion): Apply the layer
764            projection to all corners of the bounding box to get a better
765            approximation of the projected bounding box
766    
767            * test/test_layer.py (TestLayer.test_point_layer_with_projection):
768            New. Test coordinate handling of a layer with a projection.
769            Catches the bug fixed in Layer.ShapesInRegion
770    
771    2003-08-15  Bernhard Herzog  <[email protected]>
772    
773            Move some of the mock objects in test_baserenderer into their own
774            module so they can easily be used from other tests
775    
776            * test/mockgeo.py: New test helper module with some mock objects
777            for geometry related things like shapes, shapestores and
778            projections.
779    
780            * test/test_mockgeo.py: New. Tests for the new helper module
781    
782            * test/test_baserenderer.py: Some of the mock-objects are in
783            mockgeo now.
784    
785    2003-08-12  Jan-Oliver Wagner <[email protected]>
786    
787            * Thuban/UI/about.py (About.__init__): Added Bj�rn Broscheit.
788    
789    2003-08-12  Bernhard Herzog  <[email protected]>
790    
791            * po/de.po: New. German translations by Bjoern Broscheit
792    
793    2003-08-12  Bernhard Herzog  <[email protected]>
794    
795            * Thuban/UI/projdialog.py (UnknownProjPanel._DoLayout): Translated
796            strings have to be one string literal.
797    
798    2003-08-11  Bernhard Herzog  <[email protected]>
799    
800            * test/support.py (FloatComparisonMixin.assertPointListEquals):
801            New. This method was used in various derived classes, but it's
802            better to have it here.
803    
804            * test/test_shapefilestore.py
805            (ShapefileStoreTests.assertPointListEquals): Removed. It's now in
806            FloatComparisonMixin
807    
808            * test/test_layer.py (TestLayer.assertPointListEquals): Removed.
809            It's now in FloatComparisonMixin
810    
811            * test/test_derivedshapestore.py
812            (TestDerivedShapeStore.assertPointListEquals): Removed. It's now
813            in FloatComparisonMixin
814    
815    2003-08-11  Bernhard Herzog  <[email protected]>
816    
817            * Thuban/UI/join.py (JoinDialog.OnJoin): Add missing space to
818            error message
819    
820    2003-08-08  Jan-Oliver Wagner <[email protected]>
821    
822            * Doc/manual/thuban-manual.xml: Now use authorgroup. Added revhistory
823            with version number.
824            Changed title to reflect version number of Thuban.
825    
826    2003-08-08  Jan-Oliver Wagner <[email protected]>
827    
828            * Thuban/UI/about.py (About.__init__): Reworked the hall of fame. Now
829            the list corresponds to the "About" web page.
830    
831    2003-08-08  Bernhard Herzog  <[email protected]>
832    
833            * Thuban/UI/projdialog.py (UTMProposeZoneDialog.dialogLayout):
834            Make sure translated strings are recognized as one string literal.
835    
836            * Thuban/UI/proj4dialog.py (UTMProposeZoneDialog.dialogLayout):
837            Make sure translated strings are recognized as one string literal.
838    
839            * Thuban/UI/classgen.py (ClassGenDialog.OnOK): Make sure
840            translated strings are recognized as one string literal.
841    
842            * Thuban/UI/application.py (ThubanApplication.OpenSession): Make
843            sure translated strings are recognized as one string literal.
844    
845    2003-08-07  Bernhard Herzog  <[email protected]>
846    
847            * Thuban/Model/data.py (DerivedShapeStore.RawShapeFormat): New.
848            Simply delegates to the original shapestore.
849    
850            * test/test_derivedshapestore.py
851            (TestDerivedShapeStore.test_raw_format): New. Test case for
852            DerivedShapeStore.RawShapeFormat
853    
854    2003-08-07  Bernhard Herzog  <[email protected]>
855    
856            Add raw data interface to shape objects.
857    
858            * Thuban/Model/data.py (ShapefileShape, Shape): Rname the shape
859            class to ShapefileShape which now holds shapefile specific
860            information.
861            (ShapefileShape.compute_bbox): Simplified to not cache any
862            information. The way this method is used that shouldn't matter
863            performance wise.
864            (ShapefileShape.RawData): New. Return the shapeid which is the raw
865            data format for shapes from shapefiles.
866            (ShapefileStore.RawShapeFormat): New. Return the raw datatype used
867            in the shape objects returned by a shapestore. For a
868            ShapefileStore this is always RAW_SHAPEFILE.
869            (RAW_PYTHON, RAW_SHAPEFILE): Constants for the RawShapeFormat
870            method.
871    
872            * test/test_shapefilestore.py
873            (TestShapefileStore.test_raw_format): New test to test the raw
874            format feature of shapes.
875    
876            * Thuban/Model/layer.py: Remove the unused import of Shape from
877            data. It was only there for interface compatibility but it's not
878            used inside of Thuban and the generic Shape class has gone away.
879    
880            * Thuban/UI/renderer.py (MapRenderer.low_level_renderer): Check
881            the raw data format and only use an optimized version of its a
882            shapefile.
883    
884    2003-08-07  Bernhard Herzog  <[email protected]>
885    
886            * test/test_baserenderer.py (SimpleShape): Shape class for the
887            tests.
888            (SimpleShapeStore.Shape): Use SimpleShape instead of
889            Thuban.Model.data.Shape to make the tests independed of the coming
890            changes.
891    
892    2003-08-07  Bernhard Herzog  <[email protected]>
893    
894            * test/support.py (SkipTest, ThubanTestResult, ThubanTestRunner)
895            (ThubanTestProgram): New classes that extend the respective
896            classes from unittest. These new version support skipping tests
897            under certain expected conditions. In the Thuban test suite we
898            uses this for tests that require the optional gdal support.
899            (run_tests): Use ThubanTestProgram instead of the unittest.main()
900    
901            * test/runtests.py (main): Use the new ThubanTestRunner instead of
902            the normal one from unittest
903    
904            * test/test_layer.py (TestLayer.test_raster_layer): If this test
905            is not run because gdal support isn't available report this to the
906            runner.
907    
908            * test/test_baserenderer.py
909            (TestBaseRenderer.test_raster_no_projection): Do not run this test
910            if gdal support isn't available and report this to the runner.
911    
912    2003-08-06  Bernhard Herzog  <[email protected]>
913    
914            Rearrange the renderers a bit, partly in preparation for changes
915            required for the postgis merge, partly to make it more testable.
916            Also make the representation of coordinates in Shapes more
917            consistent.
918    
919            * Thuban/UI/renderer.py (MapRenderer): Most of the code/methods in
920            this class is now in BaseRenderer. This class is now practically
921            only a specialization of BaseRenderer for rendering to an actual
922            wx DC.
923            (ScreenRenderer.draw_shape_layer): Use self.low_level_renderer()
924            to get the shapetype specific rendering functions.
925    
926            * Thuban/UI/baserenderer.py: New file with the basic rendering
927            logic. The code in this file is completely independend of wx.
928            (BaseRenderer): Class with the basic rendering logic
929    
930            * test/test_baserenderer.py: New. Test cases for BaseRenderer
931    
932            * Thuban/UI/view.py (MapCanvas.__init__): New instance variable
933            error_on_redraw to guard agains endless loops and stack overflows
934            when there's a bug in the rendering code that raises exceptions.
935            (MapCanvas.OnIdle, MapCanvas._do_redraw): Split the actual
936            rendering into a separate method _do_redraw so that error handling
937            is a bit easier. When an exception occurs, set error_on_redraw to
938            true. When it's true on entry to OnIdle do nothing and return
939            immediately.
940    
941            * Thuban/Model/data.py (ShapefileStore.Shape): For consistency, a
942            Shape object will always have the coordinates as a list of list of
943            coordinate pairs (tuples).
944            (Shape.compute_bbox): Adapt to new representation.
945    
946            * Thuban/UI/viewport.py (ViewPort.find_shape_at)
947            (ViewPort.LabelShapeAt): Adapt to new coordinate representation in
948            Shape objects.
949    
950            * test/test_shapefilestore.py
951            (ShapefileStoreTests.assertFloatTuplesEqual)
952            (ShapefileStoreTests.assertPointListEquals): Rename to
953            assertPointListEquals and change purpose to checking equality of
954            the lists returned by Shape.Points().
955            (TestShapefileStoreArc.test_shape)
956            (TestShapefileStorePolygon.test_shape)
957            (TestShapefileStorePoint.test_shape): Use the new
958            assertPointListEquals instead of assertFloatTuplesEqual
959    
960            * test/test_layer.py (TestLayer.assertFloatTuplesEqual)
961            (TestLayer.assertPointListEquals): Rename to assertPointListEquals
962            and change purpose to checking equality of the lists returned by
963            Shape.Points().
964            (TestLayer.test_arc_layer, TestLayer.test_arc_layer)
965            (TestLayer.test_polygon_layer, TestLayer.test_point_layer)
966            (TestLayer.test_derived_store): Use the new assertPointListEquals
967            instead of assertFloatTuplesEqual
968    
969            * test/test_derivedshapestore.py
970            (TestDerivedShapeStore.assertFloatTuplesEqual)
971            (TestDerivedShapeStore.assertPointListEquals): Rename to
972            assertPointListEquals and change purpose to checking equality of
973            the lists returned by Shape.Points().
974            (TestDerivedShapeStore.test_shape): Use the new
975            assertPointListEquals instead of assertFloatTuplesEqual
976    
977    2003-08-06  Jan-Oliver Wagner <[email protected]>
978    
979            * Thuban/UI/projdialog.py (UTMPanel._OnPropose): Added test for
980            a bounding box. A dialog is raised in case, no bounding box
981            is found. This fixes bug #2043:
982            https://intevation.de/rt/webrt?serial_num=2043
983    
984    2003-08-05  Bernhard Herzog  <[email protected]>
985    
986            * Thuban/Model/color.py (Color.__repr__): Make the repr of a color
987            object look like a Color instantiation. Formerly it looked like a
988            tuple.
989    
990            * test/test_color.py (TestColor.test_repr)
991            (TestColor.test_equality, TestColor.test_inequality): New. test
992            some more apects of the Color class
993            (TestTransparent.test_repr, TestTransparent.test_hex)
994            (TestTransparent.test_equality): New. Test cases for the
995            Transparent object.
996    
997    2003-08-04  Jan-Oliver Wagner <[email protected]>
998    
999            * Doc/manual/thuban-manual.xml: a number of small improvements.
1000            The resulting file is the version submitted for GREAT-ER II.
1001    
1002    2003-08-01  Bernhard Herzog  <[email protected]>
1003    
1004            * Thuban/UI/resource.py, Thuban/UI/projdialog.py,
1005            Thuban/UI/join.py, Thuban/UI/classgen.py, Thuban/UI/about.py,
1006            Thuban/Model/resource.py: Insert cvs keywords and doc-strings.
1007    
1008            * Thuban/UI/common.py: Insert cvs keywords and doc-strings.
1009            (Color2wxColour, wxColour2Color, ThubanBeginBusyCursor)
1010            (ThubanEndBusyCursor): Add doc-strings
1011    
1012    2003-08-01  Bernhard Herzog  <[email protected]>
1013    
1014            First step towards PostGIS integration. More abstraction by movin
1015            more code from the layer to the shapestore. More methods of the
1016            layer are now simply delegated to the equivalent method of the
1017            shapestore. The SHAPETYPE_* constants are now in data not in
1018            layer.
1019    
1020            * Thuban/Model/data.py (SHAPETYPE_POLYGON, SHAPETYPE_ARC)
1021            (SHAPETYPE_POINT, Shape): Move these constants and classes from
1022            layer.py to data.py
1023            (ShapefileStore.__init__): More Initialization for the new methods
1024            and functionality.
1025            (ShapefileStore.ShapeType, ShapefileStore.NumShapes)
1026            (ShapefileStore.BoundingBox, ShapefileStore.ShapesInRegion)
1027            (ShapefileStore.Shape): New methods that were formerly implemented
1028            in the layer.
1029            (DerivedShapeStore.Shape, DerivedShapeStore.ShapesInRegion)
1030            (DerivedShapeStore.ShapeType, DerivedShapeStore.NumShapes)
1031            (DerivedShapeStore.BoundingBox): New. DerivedShapeStore
1032            equivalents of the new shape methods. These versions are simply
1033            delegated to the original shapstore.
1034    
1035            * Thuban/Model/layer.py (SHAPETYPE_POLYGON, SHAPETYPE_ARC)
1036            (SHAPETYPE_POINT, Shape): Removed. They're now in data.py
1037            (Layer.SetShapeStore): Removed the initializatin of instance
1038            variables that were needed for the stuff that's now in
1039            ShapefileStore
1040            (Layer.BoundingBox, Layer.NumShapes, Layer.ShapeType)
1041            (Layer.Shape, Layer.ShapesInRegion): Simply delegate to the
1042            shapestore.
1043    
1044            * Thuban/UI/classifier.py, Thuban/UI/renderer.py,
1045            Thuban/UI/viewport.py: Import the SHAPETYPE_* constants from data
1046            instead of layer.
1047    
1048            * test/test_shapefilestore.py: New. Tests for ShapefileStore.
1049    
1050            * test/test_derivedshapestore.py: New. Tests for DerivedShapeStore.
1051    
1052            * test/test_layer.py: Import the SHAPETYPE_* constants from data
1053            instead of layer.
1054            (TestLayer.test_derived_store): Remove the test for the exception
1055            when instantiating the DerivedShapeStore with an incompatible
1056            table which is now in test_derivedshapestore.py. Add some more
1057            tests of the layer methods to determine whether they work for a
1058            DerivedShapeStore as well.
1059    
1060    2003-07-31  Jonathan Coles   <[email protected]>
1061    
1062            * Doc/manual/thuban-manual.xml: Fix the list of required packages
1063            by just listing the name and where they can be found.
1064    
1065    2003-07-31  Frank Koormann   <[email protected]>
1066    
1067            * Doc/manual/thuban-manual.xml:
1068            Changed the screenshot elements to figure.
1069            Changed some variablelist elements to itemizedlist.
1070            Added section on GDAL formats.
1071    
1072    2003-07-31  Jonathan Coles   <[email protected]>
1073    
1074            * Doc/manual/thuban-manual.xml: Added a few sentences about
1075            the Fix Border Color option when generating classes.
1076    
1077    2003-07-30  Jonathan Coles   <[email protected]>
1078    
1079            * Thuban/Model/classgen.py: Add docstrings. Rename specific
1080            Ramp instances to use lower_case_style.
1081    
1082            * Thuban/UI/classgen.py: Use renamed Ramp instances.
1083            
1084            * Thuban/UI/classifier.py: Add docstrings.
1085    
1086            * Thuban/UI/dock.py: Add docstrings.
1087    
1088            * test/test_classgen.py: Use renamed Ramp instances.
1089    
1090    2003-07-30  Bernhard Herzog  <[email protected]>
1091    
1092            * Thuban/Lib/connector.py (QueueingPublisher): Removed. This class
1093            was never used in Thuban.
1094    
1095    2003-07-30  Bernhard Herzog  <[email protected]>
1096    
1097            * Thuban/UI/join.py (JoinDialog.__init__): Use the table's Title()
1098            method directly instead of going through the transient_table
1099            method. This faster because transient_table may force the copy of
1100            a DBF file into the transient database and setting a table's title
1101            doesnm't affect the title of the associated transient table, so
1102            this fixes RT #2042
1103    
1104            * Thuban/UI/main.py (__version__): Don't import the already
1105            removed show_exception_dialog.
1106    
1107    2003-07-29  Jonathan Coles   <[email protected]>
1108    
1109            * Thuban/UI/application.py (ThubanApplication.ShowExceptionDialog):
1110            Put back this method and remove the equivalent function since we
1111            are setting the exception hook from within this class (OnInit).
1112    
1113    2003-07-29  Jonathan Coles   <[email protected]>
1114    
1115            * Doc/manual/images/5_2_custom_ramp.png,
1116            Doc/manual/images/5_2_quantiles.png,
1117            Doc/manual/images/5_2_uniform_dist.png,
1118            Doc/manual/images/5_2_unique_values.png,
1119            Doc/manual/images/8_int_error.png: New screen shots.
1120    
1121            * Doc/manual/thuban-manual.xml: Fixed typos and wording, clarified
1122            some points, and added more screen shots.
1123    
1124    2003-07-29  Bernhard Herzog  <[email protected]>
1125    
1126            * Thuban/Model/data.py: Remove the now unused import of warnings
1127    
1128    2003-07-29  Bernhard Herzog  <[email protected]>
1129    
1130            * Thuban/Model/data.py (SimpleStore): Removed. This class has been
1131            deprecated since before the 0.8 release and isn't used in Thuban
1132            itself anymore.
1133    
1134            * Thuban/Model/transientdb.py: Remove some unnecessary imports
1135    
1136    2003-07-29  Jonathan Coles   <[email protected]>
1137    
1138            * Thuban/UI/application.py (ThubanApplication.OnInit): set the
1139            python exception hook here so that we are sure to catch any
1140            Thuban exception that happen during initialization.
1141    
1142            * Thuban/UI/main.py (main): Don't set the exception hook here,
1143            it will get set in ThubanApplication.OnInit.
1144    
1145    2003-07-29  Jonathan Coles   <[email protected]>
1146                                                                                
1147            * Thuban/UI/application.py (ThubanApplication.ShowExceptionDialog):
1148            Removed and called it show_exception_dialog() so that the exception
1149            handler can be set before the class is created.
1150                                                                                
1151            * Thuban/UI/main.py (main): Install the exception handler before
1152            a ThubanApplication is created.
1153                                                                                    
1154    2003-07-29  Bernhard Herzog  <[email protected]>
1155    
1156            * po/it.po: New. Italian translation by Maurizio Napolitano
1157    
1158            * po/ru.po: New. Russian translation by Alex Shevlakov
1159    
1160    2003-07-29  Frank Koormann   <[email protected]>
1161    
1162            * Doc/manual/thuban-manual.xml: Extended section on supported
1163            projections.
1164            
1165    2003-07-29  Frank Koormann   <[email protected]>
1166    
1167            * Doc/manual/thuban-manual.xml: gaspell-checked.
1168    
1169    2003-07-29  Jonathan Coles   <[email protected]>
1170    
1171            * Doc/manual/images/3_5_legend.png: Added border to improve look
1172            on white background.
1173    
1174    2003-07-29  Jonathan Coles   <[email protected]>
1175    
1176            * Doc/manual/thuban-manual.xml: Fixed grammar and typos. Added
1177            descriptions for the legend toolbar.
1178    
1179            * Doc/manual/images/4_2_raster_layer_properties.png: Removed
1180            cursor from dialog box.
1181    
1182    2003-07-28  Jonathan Coles   <[email protected]>
1183    
1184            * Doc/manual/thuban-manual.xml: More screenshots and more chapters.
1185    
1186            * Doc/manual/images/2_4_session_tree.png,
1187            Doc/manual/images/3_5_legend.png, Doc/manual/images/3_rename_map.png,
1188            Doc/manual/images/4_2_layer_properties.png,
1189            Doc/manual/images/4_2_raster_layer_properties.png,
1190            Doc/manual/images/5_3_genclass.png,
1191            Doc/manual/images/5_classification.png,
1192            Doc/manual/images/6_projection.png,
1193            Doc/manual/images/7_1_table_view.png,
1194            Doc/manual/images/7_2_5_join.png: New screenshots.
1195    
1196    2003-07-24  Jonathan Coles   <[email protected]>
1197    
1198            * Doc/manual/thuban-manual.xml: Chapter on Projection Management.
1199    
1200    2003-07-24  Jonathan Coles   <[email protected]>
1201    
1202            * Doc/manual/thuban-manual.xml: Added EPS images and wrote
1203            chapter on Layer Management.
1204    
1205            * Doc/manual/Makefile: New. Makefile to generate all formats for the
1206            manual and images.
1207    
1208    2003-07-24  Bernhard Herzog  <[email protected]>
1209    
1210            * Thuban/Model/range.py, Thuban/version.py: Remove the #! line as
1211            it annoys lintian which warns about these files not being
1212            executable. The #1 isn't necessary here since if you absolutely
1213            must execute them you can always say "python <filename>".
1214    
1215            * Thuban/UI/renderer.py (ScreenRenderer.draw_shape_layer): Remove
1216            superfluous code to set brush and pen for point shapes
1217    
1218            * Thuban/UI/viewport.py: Remove commented out code that wouldn't
1219            belong in viewport anyway
1220    
1221    2003-07-24  Frank Koormann   <[email protected]>
1222    
1223            * Doc/manual/thuban-manual.xml: Added section on table management.
1224    
1225    2003-07-24  Bernhard Herzog  <[email protected]>
1226    
1227            * test/runtests.py (main): Recognize the long "verbose" option
1228            correctly.
1229    
1230    2003-07-22  Jonathan Coles   <[email protected]>
1231    
1232            * Doc/manual/thuban-manual.xml: Continue to write first revision
1233            of the manual.
1234    
1235            * Thuban/UI/renderer.py (MapRenderer.render_map): Wrap method
1236            with Begin/EndDrawing() calls to ensure we aren't doing to
1237            many updates to the dc during rendering.
1238            (ScreenRenderer.draw_shape_layer): self.draw_point_shape takes
1239            a pen and brush argument so they need to be passed to the function.
1240    
1241            * Thuban/UI/viewport.py (ViewPort.calc_min_max_scales): New.
1242            Calculates the minimum and maximum scale values. Factored out
1243            of set_view_transform so that it could be used to zoom all the
1244            way into a single point.
1245            (ViewPort.set_view_transform): Call calc_min_max_scales().
1246            (ViewPort.FitSelectedToWindow): Zoom to the maximum scale
1247            if only a single point is selected.
1248    
1249            * Doc/manual/images/1_2_legend_close.png,
1250            Doc/manual/images/1_2_legend_dock.png,
1251            Doc/manual/images/1_2_mainwindow.png,
1252            Doc/manual/images/1_2_mainwindow.ps,
1253            Doc/manual/images/1_2_mainwindow.sk,
1254            Doc/manual/images/3_2_fullextent.png,
1255            Doc/manual/images/3_2_fulllayerextent.png,
1256            Doc/manual/images/3_2_fullshapeextent.png,
1257            Doc/manual/images/3_2_pan.png,
1258            Doc/manual/images/3_2_zoomin.png,
1259            Doc/manual/images/3_2_zoomout.png,
1260            Doc/manual/images/3_3_identify.png,
1261            Doc/manual/images/3_3_label.png,
1262            Doc/manual/images/3_5_invisible.png,
1263            Doc/manual/images/3_5_movedown.png,
1264            Doc/manual/images/3_5_moveup.png,
1265            Doc/manual/images/3_5_props.png,
1266            Doc/manual/images/3_5_tobottom.png,
1267            Doc/manual/images/3_5_totop.png,
1268            Doc/manual/images/3_5_visible.png: New. Images for the documentation.
1269    
1270    2003-07-18  Bernhard Herzog  <[email protected]>
1271    
1272            * Thuban/UI/messages.py (MAP_REPLACED): New message.
1273    
1274            * Thuban/UI/viewport.py (ViewPort.SetMap): Issue MAP_REPLACED
1275            after the new map has been assigned
1276    
1277            * Thuban/UI/mainwindow.py (MainWindow.delegated_messages):
1278            Delegate MAP_REPLACED to the canvas too
1279            (MainWindow.prepare_new_session): Removed. Thanks to the new
1280            MAP_REPLACED message it's no longer needed
1281            (MainWindow.OpenSession, MainWindow.NewSession):
1282            prepare_new_session has been removed.
1283    
1284            * Thuban/UI/classifier.py (Classifier.__init__): Subscribe to
1285            MAP_REPLACED so that we can close the dialog if a new map is set.
1286            (Classifier.unsubscribe_messages): Unsubscribe from MAP_REPLACED
1287            (Classifier.map_replaced): Handle MAP_REPLACED by closing the
1288            dialog
1289    
1290            * test/test_viewport.py (SimpleViewPortTest)
1291            (SimpleViewPortTest.test_default_size): Add doc-strings
1292            (ViewPortTest.setUp): Bind map to self.map so we can use it in
1293            tests. Subscribe to MAP_REPLACED messages too.
1294            (ViewPortTest.tearDown): No need to explicitly unsubscribe
1295            (ViewPortTest.test_set_map): New test for the SetMap method.
1296    
1297    2003-07-18  Bernhard Herzog  <[email protected]>
1298    
1299            * test/test_viewport.py (SimpleViewPortTest.test_default_size):
1300            Move this test from ViewPortTest.setUp to this new separate test
1301            case. setUp is not the place for the actual tests.
1302            (ViewPortTest.test_inital_settings, ViewPortTest.setUp): Move some
1303            more of the test from setUp to the new test test_inital_settings.
1304            (ViewPortTest.test_win_to_proj, ViewPortTest.test_proj_to_win)
1305            (ViewPortTest.test_proj_conv): Split test_proj_conv into
1306            test_win_to_proj and test_proj_to_win and make the tests easier to
1307            understand
1308            (ViewPortTest.testFitRectToWindow, ViewPortTest.testZoomFactor)
1309            (ViewPortTest.testZoomOutToRect, ViewPortTest.testTranslate)
1310            (ViewPortTest.test_unprojected_rect_around_point)
1311            (ViewPortTest.test_find_shape_at, ViewPortTest.testTools):
1312            Reformat to increase readability.
1313    
1314    2003-07-18  Bernhard Herzog  <[email protected]>
1315    
1316            * Thuban/UI/view.py (MapCanvas.OnLeftDown): Capture the mouse.
1317    
1318    2003-07-18  Bernhard Herzog  <[email protected]>
1319    
1320            * test/runtests.py: The test suite can now be run without an X
1321            connection. To make sure this remains true, remove the DISPLAY
1322            environment variable so that an error occurs if the wxGTK is
1323            imported accidentally
1324    
1325    2003-07-18  Bernhard Herzog  <[email protected]>
1326    
1327            * Thuban/UI/viewport.py: Remove unused imports
1328    
1329            * Thuban/UI/view.py: Remove unused imports
1330    
1331    2003-07-18  Bernhard Herzog  <[email protected]>
1332    
1333            * test/test_export.py Remove unused imports. The OutputTransform
1334            function is now in viewport.py and is called output_transform
1335            (TestScalebar.test_output_transform)
1336            (TestScalebar.test_OutputTransform): Renamed to
1337            test_output_transform and updated to use output_transform instead
1338            of OutputTransform
1339    
1340            * Thuban/UI/view.py (OutputTransform): Moved to viewport.py and
1341            renamed.
1342            (MapCanvas.Export, MapPrintout.draw_on_dc): OutputTransform was
1343            renamed to output_transform
1344    
1345            * Thuban/UI/viewport.py (OutputTransform, output_transform):
1346            Rename to output_transform
1347    
1348    2003-07-18  Bernhard Herzog  <[email protected]>
1349    
1350            * Thuban/Model/layer.py (Layer.__init__): Rename
1351            classificationField to classificatin_column and init it here so
1352            that it can be used in SetClassificationColumn
1353            (Layer.GetClassificationColumn, Layer.GetClassificationField):
1354            Rename to GetClassificationColumn.
1355            (Layer.SetClassificationColumn, Layer.SetClassificationField):
1356            Rename to SetClassificationColumn and issue a LAYER_CHANGED
1357            message if the column changes.
1358            (Layer._classification_changed, Layer.ClassChanged): Rename to
1359            _classification_changed. Update the callers.
1360            (Layer.SetShapeStore): Further field->column renames.
1361    
1362            * Thuban/Model/load.py (SessionLoader.start_classification)
1363            (SessionLoader.start_clpoint): Updates because of
1364            field->column method name changes in the Layer class
1365    
1366            * Thuban/Model/save.py (SessionSaver.write_classification): Updates
1367            because of field->column method name changes in the Layer class
1368    
1369            * Thuban/UI/classifier.py (Classifier.__init__)
1370            (Classifier._OnTry, Classifier._OnRevert): Updates because of
1371            field->column method name changes in the Layer class
1372    
1373            * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Updates
1374            because of field->column method name changes in the Layer class
1375    
1376            * Thuban/UI/viewport.py (ViewPort.find_shape_at): Updates because
1377            of field->column method name changes in the Layer class
1378    
1379            * test/test_save.py (SaveSessionTest.testClassifiedLayer)
1380            (SaveSessionTest.testClassifiedLayer): Update because of
1381            field->column method name changes in the Layer class
1382    
1383            * test/test_layer.py (SetShapeStoreTests.setUp)
1384            (SetShapeStoreTests.test_sanity): Update because of field->column
1385            method name changes in the Layer class
1386            (TestLayerModification.setUp): Subscribe to LAYER_CHANGED as well
1387            (TestLayerModification.test_sanity)
1388            (TestLayerModification.test_initial_settings): remove unsued code
1389            and rename to test_sanity.
1390            (TestLayerModification.test_set_classification): New test for
1391            SetClassification and SetClassificationField.
1392    
1393    2003-07-18  Bernhard Herzog  <[email protected]>
1394    
1395            * test/test_classgen.py (TestFixedRamp.test): Extend test to check
1396            the non-fixed values as well. The old test would have accepted a
1397            fixed ramp that only returnes the fixed properties
1398    
1399    2003-07-17  Jonathan Coles   <[email protected]>
1400    
1401            * Doc/manual/mainwindow.png, Doc/manual/mainwindow.xcf: Screen
1402            shots for the manual. The XCF file is the source image and
1403            has additional layers to support changes.
1404    
1405            * Doc/manual/thuban-manual.xml: Wrote an initial Introduction.
1406    
1407            * Thuban/UI/classifier.py (Classifier.__BuildClassification):
1408            Return both the new class and the field name.
1409    
1410            * Thuban/UI/mainwindow.py (MainWindow.ToggleLegend): Don't
1411            fit the map to the window as this changes any zoom level that
1412            the user may have set.
1413    
1414    2003-07-16  Jonathan Coles   <[email protected]>
1415    
1416            * Thuban/Model/classgen.py (generate_singletons,
1417            generate_uniform_distribution, generate_quantiles): Remove
1418            fixes parameter, but maintain the same functionality by having
1419            the calling function pass a FixedRamp object for the ramp.
1420            (FixedRamp): New. Adapts a ramp to have fixed property values.
1421    
1422            * Thuban/Model/classification.py: Use new CLASS_CHANGED message.
1423            (Classification): Inherit from Publisher.
1424            (Classification.__init__): Remove the layer parameter.
1425            Classifications no longer need to have a parent layer.
1426            (Classification.GetField, Classification.GetFieldType,
1427            Classification.SetFieldInfo): Removed. The field name is stored
1428            in the layer, and the type can be retreived by calling
1429            Layer.GetFieldType().
1430            (Classification._set_layer, Classification.GetLayer): Removed.
1431            Classifications no longer have a parent layer.
1432    
1433            * Thuban/Model/layer.py (Layer.Destroy): Unsubscribe from the
1434            classification.
1435            (Layer.SetShapeStore): Reset the classification first while
1436            we still have the old shape store to work with.
1437            (Layer.GetClassificationField, Layer.SetClassificationField):
1438            New. Method for getting/setting the field to classify on.
1439            (Layer.SetClassification): Simplified now that the layer
1440            simply has to hold a reference to the classification and not
1441            tell the classification who owns it.
1442            Fixes RTbug #2023.
1443    
1444            * Thuban/Model/load.py (SessionLoader.start_classification):
1445            Set the field name on the layer, not the classification.
1446    
1447            * Thuban/Model/messages.py: Add CLASS_CHANGED for when a
1448            classification is modified.
1449    
1450            * Thuban/Model/save.py (SessionSaver.write_classification):
1451            Get the field name and type from the layer.
1452    
1453            * Thuban/Model/table.py (table_to_dbf, table_to_csv): Renamed
1454            parameter records to rows and add docstring. Fixes RTbug #1997.
1455    
1456            * Thuban/UI/classgen.py (ClassGenDialog.OnOK): Use a fixed
1457            ramp when we need to fix certain values of a ramp rather than
1458            using the old fixes parameter. Fixes RTbug #2024.
1459    
1460            * Thuban/UI/classifier.py (ClassGrid.CreateTable): Add fieldType
1461            parameter.
1462            (ClassTable.Reset): Add fieldType parameter and use it, rather
1463            than asking the classification.
1464            (Classifier.__init__): Remember the original class's field
1465            and ask the layer for the field type, rather than the classification.
1466            (Classifier.__SetGridTable): Retrieve the field and field type
1467            for the table because they are not in the classification.
1468            (Classifier._OnTry, Classifier._OnRevert): Set the classification
1469            field on the layer in addition to the classification itself.
1470    
1471            * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Get the
1472            classification field from layer.
1473    
1474            * Thuban/UI/viewport.py (ViewPort.find_shape_at): Get the
1475            classification field from layer. Split up tests and remove
1476            *-imports. Fixes RTbug #1992.
1477    
1478            * test/test_classgen.py (TestFixedRamp): Test for the FixedRamp class.
1479    
1480            * test/test_classification.py
1481            (TestClassification.test_classification): Remove tests for methods
1482            that no longer exist.
1483    
1484            * test/test_layer.py (SetShapeStoreTests.setUp): Classification
1485            __init__ no longer has a field parameter, use SetClassificationField.
1486            (SetShapeStoreTests.test_sanity): Use layer object to get class
1487            field info.
1488    
1489            * test/test_save.py (SaveSessionTest.testClassifiedLayer): Use
1490            SetClassificationField on layer to set class field info.
1491    
1492            * test/test_viewport.py: Renamed from test/test_view.py.
1493    
1494    2003-07-16  Jan-Oliver Wagner <[email protected]>
1495    
1496            * Doc/manual/thuban-manual.xml: Added authors and an initial
1497            coarse structure.
1498    
1499    2003-07-15  Bernhard Herzog  <[email protected]>
1500    
1501            * test/support.py (FloatComparisonMixin): This is a mix-in class
1502            and therefore should not be derived from any other class.
1503    
1504            * test/test_range.py (RangeTest): FloatComparisonMixin is a
1505            mix-in, so derive from TestCase as well.
1506    
1507    2003-07-15  Bernhard Herzog  <[email protected]>
1508    
1509            * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Rework the
1510            draw_func handling a bit to remove one layer of indirection. This
1511            makes the renderer about 10% faster in the non-classifying case
1512            and the code a bit cleaner
1513            (MapRenderer.draw_point_shape): Add the pen and brush parameters
1514            and set them in the dc. Now the draw_point_shape method and
1515            wxproj's draw_polygon_shape function have basically the same
1516            signature so that both can be directly used as draw_func
1517    
1518    2003-07-15  Bernhard Herzog  <[email protected]>
1519    
1520            * Thuban/Model/save.py (SessionSaver.write_classification): Encode
1521            string values (in addition to the labels) as UTF 8
1522    
1523            * Thuban/Model/load.py (SessionLoader.start_clpoint): Decode the
1524            values if the field type is string
1525    
1526            * test/test_save.py (SaveSessionTest.testClassifiedLayer): Test
1527            saving a session with non-ascii string classification values.
1528    
1529            * test/test_load.py (TestClassification.file_contents)
1530            (TestClassification.test): Check for non-ascii values in string
1531            classifications
1532    
1533    2003-07-14  Jonathan Coles   <[email protected]>
1534    
1535            * test/test_view.py: New. Tests for ViewPort.
1536    
1537    2003-07-14  Frank Koormann   <[email protected]>
1538    
1539            * Thuban/Model/load.py (SessionLoader.start_map): Encode map
1540            title to latin1.  Fixes https://intevation.de/rt/webrt?serial_num=2013
1541    
1542            * test/test_load_0_8.py (TestUnicodeStrings): New, test load of
1543            unicode strings from session file: session title, map title and
1544            projection name.
1545            
1546    2003-07-10  Jonathan Coles   <[email protected]>
1547    
1548            * Thuban/UI/viewport.py (Tool.MouseUp): Should have called
1549            drag_stop, not drag_move when the mouse is released.
1550    
1551    2003-07-10  Jonathan Coles   <[email protected]>
1552    
1553            The most important part of this is the seperation of view.py into
1554            two pieces. viewport.py now has a class called ViewPort which
1555            contains all the non-wx parts of view.py and can therefore be
1556            tested. view.py contains only the wx-specific parts and is fairly
1557            simple.
1558    
1559            * Thuban/UI/view.py: Stripped out all non-wx functionality. Fixes
1560            RTTbug #1992.
1561            * Thuban/UI/viewport.py: New. Contains non-wx view functionality.
1562            RTTbug #1992.
1563    
1564            * Thuban/Model/classgen.py (generate_singletons,
1565            generate_uniform_distribution, generate_quantiles):
1566            Added 'fixes' parameter so that property attributes can
1567            be held constant over the generated classification groups.
1568            (CustomRamp.GetProperties): Remove unused variables.
1569    
1570            * Thuban/Model/map.py (Map.SetProjection): Send the old
1571            projection as an argument to listeners of the MAP_PROJECTION_CHANGED
1572            event.
1573    
1574            * Thuban/Model/table.py (table_to_dbf, table_to_csv): Added 'records'
1575            parameter which is a list of records that restricts which
1576            records are saved. Fixes RTbug #1997.
1577    
1578            * Thuban/UI/application.py (ThubanApplication.ShowExceptionDialog):
1579            Port exception dialog from GREAT-ER. Fixes RTbug #1993.
1580    
1581            * Thuban/UI/classgen.py (ClassGenDialog.__init__): Add controls
1582            to allow the user to fix line color/width on generated groups.
1583            (ClassGenDialog.OnOK): Use new 'fixes' parameter of the generate_*
1584            functions to optionally fix group properties.
1585    
1586            * Thuban/UI/main.py (main): Set exception hook to the
1587            ShowExceptionDialog. Fixes RTbug #1993.
1588    
1589            * Thuban/UI/mainwindow.py (MainWindow.ShowTableView): Raise
1590            the table window when it is selectd to be shown.
1591    
1592            * Thuban/UI/tableview.py (QueryTableFrame.__init__): Add an
1593            Export Selection button and move the export buttons underneath
1594            the table.
1595            (QueryTableFrame.UpdateStatusText): Added event argument so
1596            that it can respond to grid selection events. The status text
1597            is now updated even when the table is not associated with a
1598            layer as was previously assumed.
1599            (QueryTableFrame.OnGridSelectRange, OnGridSelectCell): Removed.
1600            UpdateStatusText responds to these events.
1601            (QueryTableFrame.OnSaveAs): Renamed to doExport.
1602            (QueryTableFrame.doExport): Helper function that saves the
1603            entire table, or selected rows, to a file.
1604            (QueryTableFrame.OnExport, QueryTableFrame.OnExportSel): New.
1605            Respond to export button events and call doExport.
1606    
1607            * extensions/thuban/gdalwarp.cpp (ProjectRasterFile): Make sure
1608            the function doesn't return NULL without first setting a Python
1609            Error.
1610    
1611            * test/runtests.py (main): Only print "Unknown option" for
1612            unsupported options.
1613    
1614            * test/support.py (FloatComparisonMixin.assertFloatEqual): Take
1615            optional epsilon argument to specify floating point accuracy.
1616            (FloatComparisonMixin.assertFloatSeqEqual): Call assertFloatEqual
1617            for each item test.
1618    
1619            * test/test_csv_table.py (TestCSVTable.test_table_to_cvs): Add
1620            tests for saving selected records.
1621    
1622            * test/test_dbf_table.py (TestTableToDBF.test_table_to_dbf): Add
1623            tests for saving selected records.
1624    
1625            * test/test_map.py (TestMapWithContents.test_set_projection):
1626            MAP_PROJECTION_CHANGED events send the old projection.
1627    
1628            * test/test_session.py
1629            (TestSessionWithContent.test_forward_map_projection):
1630            MAP_PROJECTION_CHANGED events send the old projection.
1631    
1632            * test/test_table.py (TableTest): Update tests to use non-deprecated
1633            functions.
1634    
1635    2003-07-08  Bernhard Herzog  <[email protected]>
1636    
1637            * Thuban/Model/transientdb.py (TransientTableBase.Width): The type
1638            constants in the column objects are the standard ones defined in
1639            the table module.
1640    
1641            * test/test_transientdb.py
1642            (TestTransientTable.test_transienttable_to_dbf): New. Test whether
1643            exporting transient tables as DBF works. This should catch the bug
1644            just fixed in TransientTableBase.Width.
1645    
1646    2003-07-08  Bernhard Herzog  <[email protected]>
1647    
1648            * Thuban/Model/classgen.py (CustomRamp.GetProperties): Compute the
1649            interpolated colors correctly.
1650    
1651            * test/test_classgen.py (TestCustomRamp.test_color_interpolation):
1652            New. Test case for the fix in classgen.py
1653    
1654    2003-07-08  Bernhard Herzog  <[email protected]>
1655    
1656            * test/runtests.py (main): Make the default output less verbose
1657            and add a verbosity option (-v) to get the old output
1658    
1659    2003-07-08  Bernhard Herzog  <[email protected]>
1660    
1661            * Resources/XML/thuban-0.9.dtd: New. This will become the DTD for
1662            0.9.
1663    
1664            * Thuban/Model/transientdb.py (TransientJoinedTable.JoinType):
1665            New. Return the join type
1666    
1667            * Thuban/Model/save.py (SessionSaver.write_session): Use new 0.9
1668            DTD
1669            (SessionSaver.write_data_containers): Save the join type for
1670            joined tables
1671    
1672            * Thuban/Model/load.py (SessionLoader.__init__): Add the new 0.9
1673            namespace
1674            (SessionLoader.start_jointable): Handle the jointype attribute
1675    
1676            * test/test_load_0_8.py: New. Effectively a copy of test_load.py
1677            as of Thuban 0.8. These are now tests to determine whether Thuban
1678            can still read files generated by Thuban 0.8
1679    
1680            * test/test_load.py (LoadSessionTest.dtd)
1681            (TestSingleLayer.file_contents)
1682            (TestLayerVisibility.file_contents, TestLabels.file_contents)
1683            (TestLayerProjection.file_contents)
1684            (TestRasterLayer.file_contents, TestJoinedTable.file_contents)
1685            (TestJoinedTable.file_contents)
1686            (TestLoadError.file_contents): Update for new DTD
1687            (TestJoinedTable.file_contents, TestJoinedTable.setUp): Add test
1688            for new join type attribute
1689    
1690            * test/test_save.py (SaveSessionTest.dtd)
1691            (SaveSessionTest.testEmptySession)
1692            (SaveSessionTest.testSingleLayer)
1693            (SaveSessionTest.testLayerProjection)
1694            (SaveSessionTest.testRasterLayer)
1695            (SaveSessionTest.testClassifiedLayer)
1696            (SaveSessionTest.test_dbf_table)
1697            (SaveSessionTest.test_joined_table): Update for new DTD
1698            (SaveSessionTest.test_joined_table): Add test for new join type
1699            attribute
1700    
1701    2003-07-04  Bernhard Herzog  <[email protected]>
1702    
1703            * Thuban/Model/table.py (_find_dbf_column_names): New. Helper
1704            function for table_to_dbf
1705            (table_to_dbf): Deal with names longer than the 10 character limit
1706    
1707            * test/test_dbf_table.py (TestTableToDBF.test_table_to_dbf): Add
1708            doc-string
1709            (TestTableToDBF.test_table_to_dbf_long_col_names): New test for
1710            long column names
1711    
1712    2003-07-03  Bernhard Herzog  <[email protected]>
1713    
1714            * Doc/manual/thuban-manual.xml: Fix the CVS Revision Tag syntax
1715    
1716    2003-07-03  Bernhard Herzog  <[email protected]>
1717    
1718            * Doc/manual/thuban-manual.xml, Doc/manual/README: New. Skeleton
1719            for the Thuban manual and README with some basic information about
1720            the manual
1721    
1722    2003-07-03  Bernhard Herzog  <[email protected]>
1723    
1724            * Thuban/Model/transientdb.py (TransientJoinedTable.__init__):
1725            Update doc-string
1726            (TransientJoinedTable.create): Do not modify the column objects of
1727            the input tables in place and copy all columns of the input tables
1728            into the joined table after all.
1729    
1730            * test/test_transientdb.py
1731            (TestTransientTable.test_transient_joined_table_same_column_name):
1732            Update to reflect the new behavior
1733            (TestTransientTable.test_transient_joined_table_with_equal_column_names):
1734            Update to reflect the new behavior
1735            (TestTransientTable.test_transient_joined_table_name_collisions_dont_modify_in_place):
1736            New test case for a bug which modified the column objects in place
1737    
1738    2003-07-02  Jonathan Coles   <[email protected]>
1739    
1740            * Thuban/Model/classgen.py (generate_singletons,
1741            generate_uniform_distribution, generate_quantiles,
1742            GenQuantiles0): Make sure maxValue isn't less than
1743            one, otherwise we could divide by zero.
1744    
1745            * test/test_classgen.py (ClassGenTest.doClassRangeTest,
1746            ClassGenTest.doClassSingleTest): Call doBoundsTest to
1747            check the end classification groups against the
1748            proper property values.
1749            (ClassGenTest.doBoundsTest): New. Checks the first and
1750            last classification groups to make sure their properties
1751            are the correct upper and lower bounds for a color ramp.
1752    
1753    2003-07-02  Jonathan Coles   <[email protected]>
1754    
1755            * Thuban/Model/classgen.py (generate_singletons,
1756            generate_uniform_distribution, generate_quantiles,
1757            GenQuantiles0): The denominator was one to high when
1758            calculating the index for the ramp causing the index
1759            to never to reach one.
1760    
1761    2003-07-02  Jonathan Coles   <[email protected]>
1762    
1763            Changed the singature of ClassGroupRange.__init__ and
1764            ClassGroupRange.SetRange() so that the min/max values are
1765            passed as a tuple. This makes a better calling scheme for
1766            when a Range object is passed instead.
1767    
1768            * Thuban/Model/classgen.py: Fixed parameters to
1769            ClassGroupRange constructor.
1770    
1771            * Thuban/Model/classification.py (ClassGroupRange.__init__):
1772            Consolidate the min/max parameters into a single _range which
1773            can either be a tuple or a Range object.
1774            (ClassGroupRange.SetRange): Consolidate the min/max parameters
1775            into a single _range which can either be a tuple or a Range object.
1776    
1777            * Thuban/Model/load.py (SessionLoader.start_clrange): Fix
1778            call to ClassGroupRange constructor to use a tuple.
1779    
1780            * Thuban/Model/layer.py (Layer.SetClassification): Switch
1781            the classification instance variable to the new class
1782            before calling _set_layer otherwise subscribers to a
1783            LAYER_CHANGED event will not see any difference.
1784    
1785            * test/test_classification.py: Fix tests of ClassGroupRange
1786            so that they use the new signature.
1787    
1788            * test/test_load.py: Fix use of ClassGroupRange so that it
1789            uses the new signature.
1790    
1791            * test/test_load_0_2.py: Fix use of ClassGroupRange so that it
1792            uses the new signature.
1793    
1794            * test/test_save.py: Fix use of ClassGroupRange so that it
1795            uses the new signature.
1796    
1797    
1798    2003-07-01  Jonathan Coles   <[email protected]>
1799    
1800            * Thuban/Model/classgen.py: Fixes RTbug #1972, 1971.
1801            Import used objects/class from color.
1802            (generate_singletons): We don't
1803            need the numGroups parameter anymore because we are using
1804            the new ramps with GetProperties().
1805            (generate_uniform_distribution): Use new ramp method
1806            GetProperties().
1807            (generate_quantiles, GenQuantiles0): Use new ramp method
1808            GetProperties().
1809            (CustomRamp.SetNumGroups): Removed. The ramps now map
1810            a value from 0 to 1 to class properties so the number
1811            of groups is not needed ahead of time.
1812            (CustomRamp.next): Removed. CustomRamp does not support
1813            interation anymore.
1814            (CustomRamp.GetProperties): Returns a ClassGroupProperties
1815            object based on the index value from 0 to 1 that is
1816            passed to it.
1817            (GreyRamp, RedRamp, GreenRamp, BlueRamp, GreenToRedRamp):
1818            Made into instances of Monochromatic class instread of
1819            deriving from it.
1820            (HotToCold.SetNumGroups): Removed. See CustomRamp.
1821            (HotToCold.next): Removed. See CustomRamp.
1822    
1823            * Thuban/Model/classification.py: Fixes RTbug #1973, 1971.
1824            (Classification.SetField, Classification.SetFieldType):
1825            Replaced with SetFieldInfo.
1826            (Classification.SetFieldInfo): New. Does a better job of
1827            what SetField and SetFieldType used to do by combining
1828            their function since they should really always be done
1829            at the same time.
1830            (Classification.SetLayer): Renamed to _set_layer.
1831            (Classification._set_layer): Should only be called from
1832            Layer's SetClassification. This does not cause a recursive
1833            call as SetLayer did because we know that Layer knows about
1834            the classification.
1835    
1836            * Thuban/Model/color.py: Fixes RTbug #1971.
1837            (_Transparent): Renamed from Transparent so it doesn't
1838            conflict with the module variable.
1839            (Transparent, Black): Renamed from Color.Transparent,
1840            Color.Black so they are not class variables.
1841    
1842            * Thuban/Model/layer.py: Fixes RTbug #1971, 1973.
1843            (Layer.Destroy): We don't need to call SetClassification
1844            anymore to clear out the back reference in the classifcation
1845            to the layer. It's better to set it to None using _set_layer,
1846            and we won't be creating another clas object too.
1847            (Layer.SetClassification): Classification._set_layer is not
1848            recursive so remove all the locking variables. Also clean
1849            up the code so that it remains unchanged if something fails.
1850    
1851            * Thuban/Model/load.py: Fixes RTbug #1971.
1852            (SessionLoader.start_classification): Call
1853            Classification.SetFieldInfo().
1854    
1855            * Thuban/Model/save.py: Removed import of Color which wasn't
1856            being used.
1857    
1858            * Thuban/UI/classgen.py: Fixes RTbug #1972.
1859            (ClassGenDialog.__init__): Color ramps are now instances
1860            already so we don't need to create any new objects.
1861            (ClassGenDialog.OnOK): Check for numGroups is no longer
1862            necessary because we never use it.
1863    
1864            * Thuban/UI/classifier.py: Fixes RTbug #1971.
1865            (Classifier.__BuildClassification, Classifier.__SetGridTable):
1866            Call Classification.SetFieldInfo() instead of SetFieldType.
1867    
1868            * Thuban/UI/renderer.py: Fixes RTbug #1971.
1869    
1870            * Thuban/UI/view.py: Fixes RTbug #1974, 1971.
1871            (MapCanvas.__init__): Subscribe to the idle time event. Set
1872            background color to white.
1873            (MapCanvas.OnPaint): Set a flag indicating that we should
1874            render the map during idle time. If we already have a bitmap
1875            just draw it now.
1876            (MapCanvas.OnIdle): New. Render the map only during idle time.
1877            This also fixes a problem with the busy cursor under gtk.
1878    
1879            * test/test_classgen.py (ClassGenTest.test_generate_singletons):
1880            Fix calls to generate_singletons because the signature changed.
1881    
1882            * test/test_classification.py: Fix color references and
1883            change calls to Classification.[SetField|SetFieldType] to
1884            SetFieldInfo.
1885    
1886            * test/test_load.py: Fix color references.
1887    
1888            * test/test_load_0_2.py: Fix color references.
1889    
1890            * test/test_save.py (SaveSessionTest.testClassifiedLayer):
1891            Change calls to Classification.[SetField|SetFieldType] to
1892            SetFieldInfo.
1893    
1894    2003-07-01  Frank Koormann   <[email protected]>
1895    
1896            MERGE from the greater-ms3 branch.
1897    
1898            * test/test_transientdb.py
1899            (TestTransientTable.test_transient_joined_table_with_equal_column_names):
1900            New. Test join of two tables with partly equal column names.
1901    
1902            * Thuban/Model/transientdb.py (TransientJoinedTable.create):
1903            If duplicates in left and right tables column names are found,
1904            append '_' (underscores) to the name until it is unique.
1905            Create always new internal names for the resulting table and reference
1906            columns in the join statement with <table>.<column>
1907    
1908    2003-07-01  Bernhard Herzog  <[email protected]>
1909    
1910            * test/test_transientdb.py
1911            (TestTransientTable.test_transient_joined_table_same_column_name):
1912            New. Test whether joining on columns with the same names in both
1913            tables works.
1914            
1915            * Thuban/Model/transientdb.py (TransientJoinedTable.create): Make
1916            sure to use the right internal names even when joining on field
1917            with the same names in both tables. Also, detect duplicate names
1918            in the joined table correctly.
1919    
1920    2003-07-01  Frank Koormann   <[email protected]>
1921    
1922            * Thuban/UI/renderer.py (ExportRenderer.render_legend):
1923            Reverse List of layers to render in same order as in desktop legend.
1924    
1925    2003-06-30  Jonathan Coles   <[email protected]>
1926    
1927            * Thuban/version.py (make_tuple): Takes a version string
1928            and splits it into a tuple of at most three integers.
1929            Used make_tuple() to make tuple versions of the version
1930            numbers.
1931    
1932            * Thuban/UI/about.py: Add Thuban email addresses.
1933    
1934    2003-06-30  Jonathan Coles   <[email protected]>
1935    
1936            * Thuban/version.py: SQLite/PySQLite version dependencies
1937            were too high.
1938    
1939    2003-06-30  Jonathan Coles   <[email protected]>
1940    
1941            * Thuban/version.py: Update version to 0.8.1
1942            
1943            * MANIFEST.in: Added Projections so that default.proj is
1944            included.
1945    
1946    2003-06-26  Jonathan Coles   <[email protected]>
1947    
1948            New About box with lots more information including library
1949            versions and credits. More/better version checking before
1950            Thuban starts.
1951    
1952            * Thuban/UI/about.py: New. New About box that displays
1953            library version information and credits.
1954    
1955            * Thuban/version.py: Added new 'versions' dictionary which
1956            contains the verions of various libraries which are checked
1957            when the module loads.
1958            (verify_versions): Check all version numbers and returns
1959            a list of errors.
1960    
1961            * Thuban/UI/classifier.py (Classifier.__EnableButtons):
1962            Reset the status of the buttons as the situation warrants,
1963            but in a better more reliable way by not relying on the
1964            current status to determine what needs to change.
1965    
1966            * Thuban/UI/main.py (wxCHECK_VERSION): Removed. Not needed.
1967            (verify_versions): Remove most of the code since it is
1968            now in Thuban.version.verify_versions.o
1969    
1970            * Thuban/UI/mainwindow.py (MainWindow.About): Call new
1971            About box in Thuban.UI.about.
1972    
1973            * extensions/thuban/gdalwarp.cpp (get_gdal_version): New.
1974            Returns the version of gdal library being used as a string.
1975    
1976            * extensions/thuban/wxproj.cpp (check_version, check_version_gtk):
1977            Removed.
1978            (get_proj_version): Return the version of PROJ that the file
1979            was compiled with.
1980            (get_gtk_version): Return th version of GTK that the file
1981            was compiled with.
1982    
1983    2003-06-25  Jonathan Coles   <[email protected]>
1984    
1985            * Thuban/UI/classifier.py (Classifier.EditSymbol): The parent
1986            of the SelectPropertiesDialog should be self so the window
1987            appears on top.
1988            (ClassGroupPropertiesCtrl.DoEdit): The parent
1989            of the SelectPropertiesDialog should be self so the window
1990            appears on top.
1991    
1992            * Thuban/UI/resource.py: Cleaned up how we determine file
1993            extensions.
1994            (GetImageResource): Return an wxImage from our Resources.
1995    
1996    2003-06-24  Jonathan Coles   <[email protected]>
1997    
1998            * Thuban/UI/renderer.py (ExportRenderer.render_legend):
1999            Check that a layer has a classification before trying
2000            to get it. Raster layers don't have classifications.
2001    
2002    2003-06-23  Jonathan Coles   <[email protected]>
2003            
2004            * setup.py: Add Resources/XML to resource list.
2005        
2006    2003-06-23  Jonathan Coles   <[email protected]>
2007    
2008            * setup.cfg: Fix copyright dates
2009        
2010    2003-06-23  Jonathan Coles   <[email protected]>
2011    
2012            * MANIFEST.in: Update with Resources/XML
2013    
2014            * setup.py: Don't include Locale resources yet as we don't
2015            have any and it causes problems building the distribution
2016            for Windows. Update version to 0.8.0.
2017    
2018            * Doc/thuban.dtd: Removed since it is now in Resources/XML.
2019    
2020            * Thuban/UI/mainwindow.py: Add blank line at the end because
2021            file was not being read correctly building the Windows
2022            distribution.
2023    
2024    2003-06-23  Jonathan Coles   <[email protected]>
2025    
2026            * Thuban/UI/mainwindow.py (MainWindow.About): Fix text.
2027    
2028            * Thuban/version.py: Temporarily update longversion for
2029            the 0.8 release so that it doesn't have the cvs revision.
2030    
2031    2003-06-23  Jonathan Coles   <[email protected]>
2032    
2033            * Thuban/UI/common.py (ThubanBeginBusyCursor): Call wxSafeYield
2034            to make sure that we don't create reentrant possibilities with
2035            wxYield.
2036    
2037            * Thuban/UI/view.py (MapCanvas.OnPaint): Call wxBeginBusyCursor()
2038            directly to avoid the wxSafeYield() call which generates an
2039            OnPaint event causing infinite recursion. Don't try to catch
2040            exception anymore. This was for before there were limits on map
2041            scaling.
2042    
2043    2003-06-23  Bernhard Herzog  <[email protected]>
2044    
2045            Bug fix for RT #1961:
2046    
2047            * Thuban/Model/load.py (SessionLoader.start_derivedshapesource):
2048            Register DerivedShapestores with the session
2049    
2050            * Thuban/Model/session.py (Session.Tables): Make sure each table
2051            is only listed once.
2052    
2053            * test/test_load.py (TestJoinedTable.test): Add check_format call.
2054            Update file contents to match the one written out.
2055    
2056    2003-06-20  Bernhard Herzog  <[email protected]>
2057    
2058            * test/xmlsupport.py (SaxEventLister.startElementNS)
2059            (SaxEventLister.endElementNS): Do not include the qname. Python
2060            2.2.1 and 2.2.2 and 2.2.3 differ in this regard. In 2.2.1 qname it
2061            is (presumably incorrectly) None, whereas it's a string with the
2062            element name in the later versions.
2063    
2064            * test/test_xmlsupport.py (TestEventList.test_even_list_simple)
2065            (TestEventList.test_even_list_namespace): Update tests to reflect
2066            the new behaviour
2067            (TestEventList.test_even_list_id_normalization): Fix doc-string
2068    
2069    2003-06-20  Jonathan Coles   <[email protected]>
2070    
2071            * Thuban/Model/layer.py (BaseLayer.HasShapes): New. Overridden
2072            by deriving classes to determine if that layer supports shapes.
2073            (Layer): Override HasShapes and return true.
2074    
2075            * Thuban/UI/classgen.py: Use Thuban[Begin|End]BusyCursor()
2076            instead of a direct call to wx[Begin|End]CusyCursor().
2077            (GenUniquePanel._OnRetrieve): Set busy cursor while retrieving
2078            table data.
2079    
2080            * Thuban/UI/common.py (ThubanBeginBusyCursor, ThubanEndBusyCursor):
2081            New. Wrappers around the wxWindows functions that allow us to
2082            make additional calls such as wxYield which gives the native
2083            system a chance to update the cursor correctly.
2084    
2085            * Thuban/UI/tableview.py: Use Thuban[Begin|End]BusyCursor()
2086            instead of a direct call to wx[Begin|End]CusyCursor().
2087    
2088            * Thuban/UI/view.py: Use Thuban[Begin|End]BusyCursor()
2089            instead of a direct call to wx[Begin|End]CusyCursor().
2090            (MapCanvas.find_shape_at): Check if the current search layer
2091            support shapes, otherwise go on to the next layer.
2092    
2093            * test/test_layer.py: Add tests in each type of layer for
2094            HasClassification() and HasShapes()
2095    
2096    2003-06-20  Jonathan Coles   <[email protected]>
2097    
2098            * Thuban/UI/view.py (MapCanvas.OnPaint): Call wxYield after
2099            turning on the busy cursor to allow the system to change the
2100            cursor before we begin painting. This fixes a problem that
2101            was occuring only under GTK. Fixes RTbug #1840.
2102    
2103    2003-06-20  Bernhard Herzog  <[email protected]>
2104    
2105            * Resources/XML/thuban-0.8.dtd: New DTD for the new file format
2106            version.
2107    
2108            * Thuban/Model/save.py (sort_data_stores): New. Make topological
2109            sort of the data sources so they can be written with sources that
2110            data sources that depend on other data sources come after the
2111            sources they depend on.
2112            (SessionSaver.__init__): Add idmap instance variable to map from
2113            objects to the ids used in the file.
2114            (SessionSaver.get_id, SessionSaver.define_id)
2115            (SessionSaver.has_id): New. Methods to manage the idmap
2116            (SessionSaver.write): Use thuban-0.8.dtd
2117            (SessionSaver.write_session): Add a namespace on the session and
2118            write out the data sources before the maps.
2119            (SessionSaver.write_data_containers): New. Write the data
2120            containers.
2121            (SessionSaver.write_layer): Layer elements now refer to a
2122            shapestore and don't contain filenames anymore.
2123    
2124            * Thuban/Model/load.py (LoadError): Exception class to raise when
2125            errors in the files are discovered
2126            (SessionLoader.__init__): Define dispatchers for elements with a
2127            thuban-0.8 namespace too.
2128            (SessionLoader.check_attrs): New helper method to check and
2129            convert attributes
2130            (AttrDesc): New. Helper class for SessionLoader.check_attrs
2131            (SessionLoader.start_fileshapesource)
2132            (SessionLoader.start_derivedshapesource)
2133            (SessionLoader.start_filetable, SessionLoader.start_jointable):
2134            Handlers for the new elements in the new fileformat
2135            (SessionLoader.start_layer): Handle the shapestore attribute in
2136            addition to filename.
2137            (SessionLoader.start_table, SessionLoader.end_table): Removed.
2138            They were never used in the old formats and aren't needed for the
2139            new.
2140    
2141            * Thuban/Model/session.py (Session.DataContainers): New method to
2142            return all "data containers", i.e. shapestores and tables
2143    
2144            * test/xmlsupport.py (SaxEventLister.__init__)
2145            (SaxEventLister.startElementNS, sax_eventlist): Add support to
2146            normalize IDs.
2147    
2148            * test/test_xmlsupport.py
2149            (TestEventList.test_even_list_id_normalization): New test case for
2150            id normalization
2151    
2152            * test/test_load.py (LoadSessionTest.check_format): Use ID
2153            normalization
2154            (LoadSessionTest.thubanids, LoadSessionTest.thubanidrefs): New
2155            class atrributes used for ID normalization
2156            (TestSingleLayer, TestLayerVisibility, TestLabels.test)
2157            (TestLayerProjection.test, TestRasterLayer.test): Adapt to new
2158            file format
2159            (TestJoinedTable): New test for loading sessions with joined
2160            tables.
2161            (TestLoadError): New. Test whether missing required attributes
2162            cause a LoadError.
2163    
2164            * test/test_save.py (SaveSessionTest.thubanids)
2165            (SaveSessionTest.thubanidrefs): New class attributes for ID
2166            normalization in .thuban files.
2167            (SaveSessionTest.compare_xml): Use id-normalization.
2168            (SaveSessionTest.testEmptySession)
2169            (SaveSessionTest.testLayerProjection)
2170            (SaveSessionTest.testRasterLayer)
2171            (SaveSessionTest.testClassifiedLayer): Adapt to new file format.
2172            (SaveSessionTest.testLayerProjection): The filename used was the
2173            same as for testSingleLayer. Use a different one.
2174            (SaveSessionTest.test_dbf_table)
2175            (SaveSessionTest.test_joined_table): New test cases for saving the
2176            new data sources structures.
2177            (TestStoreSort, MockDataStore): Classes to test the sorting of the
2178            data stores for writing.
2179    
2180            * test/runtests.py: Add CVS keywords
2181    
2182    2003-06-20  Jonathan Coles   <[email protected]>
2183    
2184            * test/test_session.py
2185            (UnreferencedTablesTests.test_unreferenced_tables_with_joins):
2186            Use the cultural_landmark-point.dbf file for the store so that
2187            the table rows and shape count match.
2188    
2189    2003-06-20  Jonathan Coles   <[email protected]>
2190    
2191            * Thuban/Model/data.py (DerivedShapeStore.__init__): Raise
2192            an exception if the number of shapes is different from the
2193            number of rows in the table. Address RTbug #1933.
2194    
2195            * test/test_layer.py (TestLayer.test_derived_store): Add
2196            a test for the new exception in DerivedShapeStore.__init__.
2197    
2198            * test/support.py (FloatTestCase): Removed since there is
2199            already FloatComparisonMixin. Fixes RTbug #1954.
2200            (FloatComparisonMixin.assertFloatEqual): Include test for
2201            infinity that was part of FloatTestCase.
2202    
2203            * test/test_range.py (RangeTest): Inherit from
2204            support.FloatComparisonMixin now that we don't have
2205            support.FloatTestCase.
2206    
2207    2003-06-20  Bernhard Herzog  <[email protected]>
2208    
2209            * test/test_save.py (SaxEventLister, sax_eventlist): Removed. Use
2210            the implementation in xmlsupport instead.
2211            (SaveSessionTest.compare_xml): sax_eventlist is now in xmlsupport
2212    
2213            * test/test_proj.py: Import sax_eventlist from xmlsupport instead
2214            of test_save
2215    
2216    2003-06-20  Bernhard Herzog  <[email protected]>
2217    
2218            * test/test_load.py (LoadSessionTest.check_format): New helper
2219            method to make sure the test files we load might have been written
2220            by the current thuban version.
2221            (ClassificationTest.TestLayers, TestSingleLayer.test)
2222            (TestLayerVisibility.test, TestClassification.test)
2223            (TestLabels.test, TestLayerProjection.test, TestRasterLayer.test):
2224            Add check_format() calls and fix the thuban data to match the data
2225            that would be written by saving the session loaded from it.
2226    
2227            * test/xmlsupport.py (SaxEventLister, sax_eventlist): Copies of
2228            the same class and function in test_save.
2229    
2230            * test/test_xmlsupport.py (TestEventList): New. test cases for
2231            sax_eventlist
2232    
2233    2003-06-20  Bernhard Herzog  <[email protected]>
2234    
2235            * Resources/XML/thuban.dtd: Add comment about which versions of
2236            Thuban are covered by this DTD
2237            (map): Fix content model for layers and raster layers. There can
2238            be any number or layers and raster layers in any order.
2239    
2240    2003-06-20  Jonathan Coles   <[email protected]>
2241    
2242            This is mainly about fixing RTbug #1949.
2243    
2244            * Thuban/Model/classification.py: Remove "from __future__"
2245            import statement since python 2.2 is the earliest supported
2246            version.
2247    
2248            * Thuban/Model/proj.py (Projection.GetProjectedUnits): New.
2249            Currently returns PROJ_UNITS_METERS or PROJ_UNITS_DEGREES
2250            depending on the units this projection *forwards* into.
2251    
2252            * Thuban/Model/save.py (SessionSaver.write_classification):
2253            Remove unnecessary use of lambdas and nested functions.
2254    
2255            * Thuban/UI/legend.py (ScaleBarBitmap.__SetScale): Do scale
2256            adjustment here if the map projection uses degrees.
2257    
2258            * Thuban/UI/scalebar.py (ScaleBar.DrawScaleBar): Remove
2259            scale adjust code since it is now done before calling
2260            this method. Don't do anything if the map projection
2261            is None.
2262    
2263    2003-06-19  Bernhard Herzog  <[email protected]>
2264    
2265            Move version specific load tests to their own file.
2266    
2267            * test/test_load.py: Expand the doc-string to explain a bit how to
2268            handle file format changes.
2269            (TestClassification.test): Update the docstring as this test is
2270            not about Thuban 0.2 anymore.
2271    
2272            * test/test_load_0_2.py: New file with the load tests for thuban
2273            files created with Thuban 0.2 and earlier.
2274    
2275    2003-06-19  Bernhard Herzog  <[email protected]>
2276    
2277            Add XML validation to some of the tests. Validation will only be
2278            done if pyRXP is installed (http://reportlab.com/xml/pyrxp.html).
2279            To make the DTD available to the test cases it's moved into
2280            Resources/XML
2281    
2282            * Resources/XML/thuban.dtd: New. This is now the real Thuban DTD
2283            for versions up to and including 0.2. Two slight changes: added an
2284            encoding specification and fixed the comment which refered to
2285            GRASS, not Thuban
2286    
2287            * test/xmlsupport.py: New support module for tests involving XML.
2288            Currently there's a mix-in class for XML validation.
2289    
2290            * test/test_xmlsupport.py: New. Tests for the xmlsupport module
2291    
2292            * test/test_save.py (SaveSessionTest): Derive from ValidationTest
2293            so that we can validate the
2294            (SaveSessionTest.testEmptySession)
2295            (SaveSessionTest.testSingleLayer)
2296            (SaveSessionTest.testSingleLayer)
2297            (SaveSessionTest.testLayerProjection)
2298            (SaveSessionTest.testRasterLayer)
2299            (SaveSessionTest.testClassifiedLayer): Validate the generated XML
2300    
2301            * test/runtests.py (main): Call print_additional_summary instead
2302            of print_garbage_information
2303    
2304            * test/support.py (resource_dir): New function to return the
2305            "Resource" subdirectory
2306            (print_additional_summary): New function to combine several
2307            summary functions
2308            (run_tests): Use print_additional_summary instead of calling
2309            print_garbage_information directly
2310    
2311    2003-06-19  Bernhard Herzog  <[email protected]>
2312    
2313            * Doc/thuban.dtd (classification): Correct the content model of
2314            the classification element.
2315            (projection): Add the "name" attribute
2316    
2317    2003-06-19  Frank Koormann   <[email protected]>
2318    
2319            MERGE from the greater-ms3 branch.
2320    
2321            * Thuban/UI/scalebar.py (ScaleBar.DrawScaleBar): Apply conversion to
2322            scale if projection is latlong to get better estimate.
2323    
2324            Fix problem of hidden properties dialog under windows after double
2325            click on layer tree:
2326            The tree control always gets an Expanded / Collapsed event after
2327            the ItemActivated  on double click, which raises the main window again.         We add a second ItemActivated event to the queue, which simply
2328            raises the already displayed window.
2329    
2330            * Thuban/UI/legend.py (LegendTree.__init__): Instance variable
2331            raiseProperties initialized to prevent endless loops
2332            (LegendTree._OnItemActivated): Depending on self.raiseProperties
2333            simply raise the properties or open the dialog and issue a second
2334            event.
2335    
2336    2003-06-18  Jonathan Coles   <[email protected]>
2337    
2338            * setup.py: Fix a few problems that occured under Windows.
2339    
2340    2003-06-18  Jonathan Coles   <[email protected]>
2341    
2342            When Thuban loaded the map was redrawn twice because the
2343            legend was being opened after the mainwindow was created
2344            and not during its creation. This meant the map was drawn
2345            initially and then had to be redrawn when the legend
2346            caused the display to change. Now the legend is opened
2347            in the mainwindow constructor which resolves this issue.
2348    
2349            Also, although we were checking for the existence of
2350            gdal and gdalwarp modules, the gdalwarp extension was
2351            still being compiled (which may fail if the system doesn't
2352            have gdal installed). the build_ext command to setup.py
2353            now accepts the flags --with-gdal and --without-gdal.
2354            If --without-gdal is specified setup.py will try to
2355            use the gdal parameters specified by gdal-config. Under
2356            windows, those parameters have to be set in setup.py
2357            as with proj4 an wxWindows.
2358    
2359            * setup.py: Use a list instead of seperate variables for
2360            extension parameters so we can create a generic function
2361            that runs an appropriate *-config script.
2362            (run_cs_script): Renamed from run_wx_script and modified
2363            to accept a second argument which is a list of lists to
2364            be filled in by the values returned from running the command.
2365            (thuban_build_ext): New. Extends the build_ext command and
2366            provides the options --with-gdal/--without-gdal which then
2367            optionally includes the gdalwarp extension.
2368    
2369            * Thuban/Model/resource.py: First check if we can import
2370            the gdalwarp Thuban extension before checking for gdal.
2371            Also added some comments.
2372            
2373            * Thuban/UI/legend.py (ScaleBarBitmap.__SetScale): Check if
2374            the map is None which may be the case if none has been loaded
2375            yet.
2376    
2377            * Thuban/UI/main.py (main): Remove call to ShowLegend.
2378    
2379            * Thuban/UI/mainwindow.py (MainWindow.__init__): Call ShowLegend().
2380    
2381            * Thuban/UI/renderer.py: Check for gdal support before importing
2382            gdalwarp.
2383            (MapRenderer.render_map): Only try to optimize if we have gdal
2384            support otherwise nothing will get drawn.
2385    
2386            * Thuban/UI/view.py (MapCanvas.FitMapToWindow): This may be called
2387            during startup before a map has been created. Check if map is None
2388            before using it and do nothing if it is.
2389    
2390    2003-06-17  Jonathan Coles   <[email protected]>
2391    
2392            Fix the problem with raster layers under Windows that caused
2393            Thuban to crash. The view should respond to layer projection
2394            changed events to update the display. Changes to a projection
2395            should not cause the map to be set to full extent.
2396            
2397            * Thuban/UI/view.py (MapCanvas.__init__): New instance variable
2398            current_map_proj to remember the current map projection so that
2399            when the projection changes we know what the previous projection
2400            was.
2401            (MapCanvas.SetMap): Unsubscribe and subscribe to
2402            LAYER_PROJECTION_CHANGED events.
2403            (MapCanvas.projection_changed): Split into two methods that respond
2404            to map and layer projection changes.
2405            (MapCanvas.map_projection_changed): New. Takes the current view and
2406            projects it using the new projection. This does not cause the
2407            map to be redrawn at full extent.
2408            (MapCanvas.layer_projection_changed): New. Cause a redraw which
2409            will draw each layer in its new projection.
2410            
2411            * extensions/thuban/bmpdataset.cpp (BMPDataset::Open): Call
2412            VSIFClose() not VSIFCloseL() to close the file. Fixes a crash
2413            under Windows.
2414            
2415            * extensions/thuban/gdalwarp.cpp (MFILENAME): Padding should be
2416            to twice sizeof(void*) because there are two digits for each
2417            hex byte.
2418    
2419    2003-06-16  Bernhard Herzog  <[email protected]>
2420    
2421            Update to the layer interface: Direct access to the table,
2422            shapetable, shapefile and filename attributes is now actively
2423            deprecated by issuing deprecation warnings for all places where
2424            this happens.
2425    
2426            * Thuban/Model/layer.py (Layer.__getattr__): New. Implement access
2427            to the instance variables table, shapetable, shapefile and
2428            filename via __getattr__ so that we can issue a deprecation
2429            warning.
2430            (Layer.SetShapeStore): Don't set the deprecated instance variables
2431            any more
2432            (Layer.SetShapeStore): Don't use deprecated layer instance
2433            variables
2434            (Layer.Destroy): No need to explicitly remove the instance
2435            variables any more
2436            (Layer.GetFieldType, Layer.Shape): Don't use deprecated layer
2437            instance variables
2438    
2439            * Thuban/UI/classgen.py (ClassGenDialog.__init__)
2440            (GenUniformPanel._OnRetrieve, GenUniquePanel._OnRetrieve)
2441            (GenQuantilesPanel.GetList, GenQuantilesPanel.OnRetrieve): Don't
2442            use deprecated layer instance variables
2443    
2444            * Thuban/UI/classifier.py (Classifier.__init__): Don't use
2445            deprecated layer instance variables
2446    
2447            * Thuban/UI/identifyview.py (IdentifyListCtrl.selected_shape)
2448            (IdentifyGridCtrl.selected_shape): Don't set the deprecated layer
2449            instance variables
2450    
2451            * Thuban/UI/tableview.py (LayerTableGrid.select_shapes): Don't use
2452            deprecated layer instance variables
2453    
2454            * Thuban/UI/mainwindow.py (MainWindow.LayerShowTable): Don't use
2455            deprecated layer instance variables
2456    
2457            * Thuban/Model/save.py (SessionSaver.write_layer): Don't use
2458            deprecated layer instance variables
2459    
2460            * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer)
2461            (MapRenderer.polygon_render_param): Don't use deprecated layer instance
2462            variables
2463    
2464            * test/runtests.py (main): Turn Thuban's deprecation warnings into
2465            errors so that they're cought by the tests
2466    
2467            * test/test_load.py (TestSingleLayer.test): Don't use deprecated
2468            layer instance variables
2469    
2470    2003-06-16  Jonathan Coles   <[email protected]>
2471    
2472            Fix a problem under Windows whereby if the user double-clicks on a
2473            layer in the legend that tree item will expand or collapse as well
2474            as open the layer properties dialog. The state of the tree item
2475            should not be affected.
2476    
2477            * Thuban/UI/legend.py (LegendTree.__init__): Add instance variable
2478            preventExpandCollapse and subscribe to expanding and collapsing
2479            events.
2480            (LegendTree.OnItemExpandCollapse): New. Responds to expanding and
2481            collapsing events and will veto the event if it has been triggered
2482            by the user double clicking on a layer.
2483            (LegendTree._OnItemActivated): Set preventExpandCollapse to indicate
2484            that an expanding/collapsing event should be vetoed.
2485    
2486    2003-06-13  Bernhard Herzog  <[email protected]>
2487    
2488            * Thuban/UI/classifier.py (Classifier.OnClose)
2489            (Classifier.map_layers_removed)
2490            (Classifier.layer_shapestore_replaced): Unsubscribe the messages
2491            in OnClose and not in map_layers_removed or
2492            layer_shapestore_replaced to make sure it always happens when the
2493            dialog is closed
2494    
2495    2003-06-13  Jonathan Coles   <[email protected]>
2496    
2497            This puts back a fix for Windows where a panel is needed so that
2498            the background of the table view appears correctly.
2499    
2500            * Thuban/UI/tableview.py (TableFrame.__init__): Add a panel
2501            object that can be used by derived classes to place any
2502            controls (including the grid) onto.
2503            (QueryTableFrame.__init__): Use the panel as the parent window
2504            for all the controls. Reparent the grid so that the panel is
2505            the parent. Call UpdateStatusText() to correctly initialize
2506            the status bar.
2507    
2508    2003-06-13  Jonathan Coles   <[email protected]>
2509    
2510            * Thuban/UI/dialogs.py (ThubanFrame): New: a class that inherits
2511            from wxFrame (as opposed to wxDialog like the other classes)
2512            but otherwise behaves like the other classes. This is needed
2513            for the TableView which isn't really a dialog and needs to
2514            have a status bar and control buttons.
2515    
2516            * Thuban/UI/tableview.py (TableGrid.__init__): Create an
2517            instance variable to keep track of how many rows are selected.
2518            Subscribe once to the the events we are interested in.
2519            (ThubanGrid.OnRangeSelect): Only handle event if event handling
2520            hasn't been turned off.
2521            (ThubanGrid.OnSelectCell): Only handle event if event handling
2522            hasn't been turned off.
2523            (ThubanGrid.ToggleEventListeners): Rather than subscribe None
2524            as an event listener (which changes the event handler stack)
2525            simply set an instance variable to False. This is checked in
2526            the event handlers.
2527            (ThubanGrid.GetNumberSelected): Return the number of currently
2528            selected rows.
2529            (TableFrame): Inherit from ThubanFrame so we can have a
2530            status bar and control buttons.
2531            (QueryTableFrame.__init__): Create a status bar. Fixes RTbug #1942.
2532            Explicitly set which items are selected in the operator choice and
2533            action choice so there is always a valid selection. Fixes RTbug #1941.
2534            Subscribe to grid cell selection events so we can update the
2535            status bar.
2536            (QueryTableFrame.UpdateStatusText): Update the status bar with
2537            how many rows are in the grid, how many columns, and how many
2538            rows are selected.
2539            (QueryTableFrame.OnGridSelectRange, QueryTableFrame.OnGridSelectCell):
2540            Call UpdateStatusText when cells are (de)selected.
2541            (QueryTableFrame.OnQuery): Use the string value in the value
2542            combo if either the selected item index is 0 or if the string
2543            cannot be found in the predefined list (this happens if the
2544            user changes the text). Fixes RTbug #1940.
2545            Only turn off the grid event listeners if there a query comes
2546            back with a none empty list of ids. in the case that the list
2547            is empty this causes a grid.ClearSelection() call to actually
2548            clear the grid selection which causes the selected items in
2549            the map to be deselected. Fixes RTbug #1939.
2550    
2551            * test/test_save.py (XMLWriterTest.Encode): Check return values.
2552            Fixes RTbug #1851.
2553    
2554    2003-06-13  Bernhard Herzog  <[email protected]>
2555    
2556            * Thuban/UI/identifyview.py (IdentifyView.__init__): Call
2557            self.selected_shape with the current selection to make sure the
2558            contents of the dialog are up to date when it's shown for the
2559            first time.
2560            The dialog used to work without this by luck. The recent fix to
2561            the connector module 'broke' a 'feature' the identify view was
2562            relying on, i.e that subscribing to a message in response to
2563            receiving a message of that type would mean that the new
2564            subscriber would also be called for the same message.
2565            
2566    2003-06-12  Jonathan Coles   <[email protected]>
2567    
2568            * extensions/thuban/gdalwarp.cpp: Removed debug printing as
2569            the image is rendered. Fixes RTbug #1937.
2570    
2571    2003-06-12  Jonathan Coles   <[email protected]>
2572    
2573            * Thuban/Lib/fileutil.py: As is done under Windows, create the
2574            user directory if it doesn't exist on a posix system.
2575            Fixes RTbug #1815.
2576    
2577            * Thuban/Model/resource.py (get_user_proj_files): Moved the
2578            called to get_application_dir here, so that the directory
2579            will only be called if this method is invoked.
2580    
2581            * Thuban/UI/projdialog.py (ProjFrame.__DoOnProjAvail): Clear
2582            the projfilepath if no projection is selected.
2583    
2584    2003-06-12  Jonathan Coles   <[email protected]>
2585    
2586            * Thuban/UI/legend.py (ScaleBarBitmap.__SetScale): Don't draw
2587            the scalebar if the current map has no projection set.
2588    
2589            * Thuban/UI/projdialog.py (ProjFrame.__DoOnProjAvail): Set the
2590            projfilepath label to just the basename of the projection file
2591            rather than include the entire path.
2592    
2593            * Thuban/Model/resource.py: Fix missed proj functions that
2594            needed to be renamed.
2595    
2596    2003-06-12  Jonathan Coles   <[email protected]>
2597    
2598            * Thuban/Model/classification.py: Removed assert statements that
2599            tested if the variable was an instance of Color.
2600    
2601            * Thuban/Model/color.py (Color): Remove commented code that isn't
2602            used.
2603            (Transparent): Renamed from NoColor. Doesn't inherit from Color.
2604            Fixes RTbug #1835.
2605            (Transparent.__eq__, Transparent.__ne, Transparent.__repr): New.
2606            Needed now that the class doesn't inherit from Color.
2607    
2608    2003-06-12  Jonathan Coles   <[email protected]>
2609    
2610            * test/test_save.py (XMLWriterTest.testEncode): Explicitly
2611            check unicode strings.
2612    
2613            * test/test_layer.py: Check for existence of gdal.
2614    
2615    2003-06-12  Jonathan Coles   <[email protected]>
2616        
2617            * Thuban/Model/xmlreader.py: New. Contains the XMLReader class
2618            that was in load.py
2619    
2620            * Thuban/Model/xmlwriter.py: New. Contains the XMLWriter class
2621            that was in save.py
2622    
2623    2003-06-12  Jonathan Coles   <[email protected]>
2624    
2625            This is largely a collection of bug fixes. We also handle the
2626            case where gdal is not on the system. The XMLReader and XMLWriter
2627            classes were moved into there own files to resolve some circular
2628            import references and because they shouldn't really be in the
2629            file that is dediciated to reading/writing session files since
2630            they are also used elsewhere.
2631    
2632            * Thuban/Model/classgen.py: Renamed functions to follow the
2633            function_names_with_underscores style. Fixes RTbug #1903.
2634            (calculate_quantiles): Raise ValueError if 'percents' is invalid.
2635    
2636            * Thuban/Model/layer.py: Import gdal only if it available.
2637            (RasterLayer): Handle the case where the gdal library is unavailable.
2638            Addresses RTbug #1877.
2639    
2640            * Thuban/Model/load.py (XMLReader): Moved into seperate file
2641            xmlreader.py.
2642    
2643    2003-06-12  Jonathan Coles   <[email protected]>
2644    
2645            This is largely a collection of bug fixes. We also handle the
2646            case where gdal is not on the system. The XMLReader and XMLWriter
2647            classes were moved into there own files to resolve some circular
2648            import references and because they shouldn't really be in the
2649            file that is dediciated to reading/writing session files since
2650            they are also used elsewhere.
2651    
2652            * Thuban/Model/classgen.py: Renamed functions to follow the
2653            function_names_with_underscores style. Fixes RTbug #1903.
2654            (calculate_quantiles): Raise ValueError if 'percents' is invalid.
2655    
2656            * Thuban/Model/layer.py: Import gdal only if it available.
2657            (RasterLayer): Handle the case where the gdal library is unavailable.
2658            Addresses RTbug #1877.
2659    
2660            * Thuban/Model/load.py (XMLReader): Moved into seperate file
2661            xmlreader.py.
2662    
2663            * Thuban/Model/save.py (escape, XMLWriter): Moved into seperate
2664            file xmlwriter.py.
2665    
2666            * Thuban/Model/resource.py: Renamed functions to following the
2667            function_names_with_underscores style.
2668            (has_gdal_support): New function that returns true if the gdal
2669            library is available. Addresses RTbug #1877.
2670    
2671            * Thuban/UI/application.py (ThubanApplication.OpenSession):
2672            Display a message box if the gdal library is not available, but
2673            only if there are any layers that would use it. Addresses RTbug #1877.
2674    
2675            * Thuban/UI/classgen.py: Use renamed projection resource functions.
2676            (GenUniformPanel.__CalcStepping): Fix a slight discrepency
2677            when using integers versus floats.
2678    
2679            * Thuban/UI/mainwindow.py (_has_gdal_support): New. Used to
2680            determine if the "Add Image Layer" menu option should be
2681            greyed out or not. Addresses RTbug #1877.
2682    
2683            * Thuban/UI/projdialog.py: Use renamed projection resource functions.
2684    
2685            * Thuban/UI/renderer.py (MapRenderer.render_map): Only try to
2686            optimize if a raster layer is visible. Fixes RTbug #1931.
2687            Only draw the raster layer if the gdal library is available.
2688            Addresses RTbug #1877.
2689    
2690            * test/test_classgen.py: Add tests for generate_singletons,
2691            generate_uniform_distribution, generate_quantiles. Fixes RTbug #1903.
2692            (test_calculate_quantiles): Fix some tests to catch the new
2693            ValueError that is raised.
2694    
2695            * test/test_proj.py: Use renamed projection resource functions.
2696    
2697            * test/test_save.py (SaveSessionTest.testClassifiedLayer): New
2698            test for saving classified layers. Fixes RTbug #1902.
2699            (XMLWriterTest): New. Tests the XMLWriter class. Fixes RTbug #1851.
2700    
2701    2003-06-12  Jan-Oliver Wagner <[email protected]>
2702    
2703            Fix for http://intevation.de/rt/webrt?serial_num=1900.
2704    
2705            * Thuban/UI/multiplechoicedialog.py: New. A multiple choice dialog.
2706    
2707            * Thuban/UI/mainwindow.py: import wxMultipleChoiceDialog from
2708            multiplechoicedialog.py rather than from the wxPython library.
2709    
2710    2003-06-11  Frank Koormann  <[email protected]>
2711    
2712            * Thuban/Lib/fileutil.py (get_application_dir): Minor stability
2713            update.
2714    
2715    2003-06-11  Frank Koormann  <[email protected]>
2716    
2717            * Thuban/Lib/fileutil.py (get_application_dir): New function to
2718            determine the absolute .thuban/thuban directory under
2719            "posix" (os.expanduser) and "nt" (read AppData registry key).
2720    
2721            * Thuban/Model/resource.py: Use get_application_dir
2722    
2723            * Thuban/UI/application.py (ThubanApplication.read_startup_files):
2724            Use get_application_dir.
2725    
2726    2003-06-10  Bernhard Herzog  <[email protected]>
2727    
2728            * Thuban/UI/tableview.py (LayerTableFrame.__init__): Subscribe to
2729            the messages MAP_LAYERS_REMOVED messages
2730            (LayerTableFrame.OnClose): Unsubscribe from it.
2731            (LayerTableFrame.map_layers_removed): New. Receiver for
2732            MAP_LAYERS_REMOVED. Close the dialog when the layer whose the
2733            dialog is showing is removed.
2734    
2735    2003-06-10  Bernhard Herzog  <[email protected]>
2736    
2737            * Thuban/Lib/connector.py (Connector.Issue): Iterate over a copy
2738            of the receivers list so that unsubscribing in a receiver doesn't
2739            modify it while iterating over it.
2740    
2741            * test/test_connector.py
2742            (ConnectorTest.test_disconnect_in_receiver): New. Test whether
2743            unsubscribing in a receiver works correctly. See docstring for
2744            details
2745    
2746    2003-06-10  Bernhard Herzog  <[email protected]>
2747    
2748            * Thuban/Model/messages.py (LAYER_SHAPESTORE_REPLACED): New
2749            message.
2750    
2751            * Thuban/Model/layer.py (Layer.SetShapeStore): Send
2752            LAYER_SHAPESTORE_REPLACED when the shapestore changes. A
2753            LAYER_CHANGED will still be sent if the classification changes.
2754    
2755            * Thuban/UI/classifier.py (Classifier.__init__): Add the map as
2756            parameter so we can subscribe to some of its messages
2757            (Classifier.__init__): Subscribe to the map's MAP_LAYERS_REMOVED
2758            and the layer's LAYER_SHAPESTORE_REPLACED
2759            (Classifier.unsubscribe_messages): New. Unsubscribe from message
2760            subscribed to in __init__
2761            (Classifier.map_layers_removed)
2762            (Classifier.layer_shapestore_replaced): receivers for the messages
2763            subscribed to in __init__. Unsubscribe and close the dialog
2764    
2765            * Thuban/UI/mainwindow.py (MainWindow.OpenLayerProperties): Pass
2766            the map to the Classifier dialog
2767    
2768            * test/test_layer.py (SetShapeStoreTests): Derive from
2769            SubscriberMixin as well so we can test messages
2770            (SetShapeStoreTests.setUp): Subscribe to some of the layer's
2771            messages
2772            (SetShapeStoreTests.tearDown): Clear the messages again
2773            (SetShapeStoreTests.test_sanity): Expand the doc-string and check
2774            for the modified flag too
2775            (SetShapeStoreTests.test_set_shape_store_modified_flag): New test
2776            to check whether SetShapeStore sets the modified flag
2777            (SetShapeStoreTests.test_set_shape_store_different_field_name)
2778            (SetShapeStoreTests.test_set_shape_store_same_field)
2779            (SetShapeStoreTests.test_set_shape_store_same_field_different_type):
2780            Add tests for the messages. This checks both the new
2781            LAYER_SHAPESTORE_REPLACED and the older LAYER_CHANGED
2782    
2783    2003-06-06  Jan-Oliver Wagner <[email protected]>
2784    
2785            * Thuban/UI/mainwindow.py: Improved and partly added help texts for
2786            the menu items.
2787    
2788    2003-06-05  Frank Koormann  <[email protected]>
2789    
2790            * Thuban/UI/identifyview.py (IdentifyView.__init__):
2791            Layout reimplemented without panel. Make life easier to fit the list
2792            in the dialog.
2793    
2794    2003-06-05  Frank Koormann  <[email protected]>
2795    
2796            * Thuban/UI/projdialog.py (ProjFrame.__init__): Fill the projchoice
2797            once on initialisation (Former implementation resulted in multiple
2798            entries for each projection).
2799            (ProjFrame.__FillAvailList): selectProj as second optional parameter,
2800            if set, select the projection found under the specified name. This
2801            overwrites any other selection estimate.
2802            Removed projchoice filling from this method.
2803            (ProjFrame._OnSave, ProjFrame._OnAddToList):
2804            Updated call of ProjFrame.__FillAvailList
2805            (LCCPanel._DoLayout): Moved parameter controls in more common order.
2806    
2807            * Resources/Projections/defaults.proj: Extended defaults representing
2808            various common European projections.
2809    
2810    2003-06-05  Frank Koormann  <[email protected]>
2811    
2812            * Thuban/UI/identifyview.py (IdentifyView.__init__):
2813            Use ListCtrl instead of GridCtrl
2814    
2815            * Thuban/Model/resource.py:
2816            Guess location of .thuban directory from tempdir parent directory.
2817    
2818            * Thuban/UI/application.py (ThubanApplication.read_startup_files):
2819            Guess location of .thuban directory from tempdir parent directory.
2820    
2821    2003-06-04  Bernhard Herzog  <[email protected]>
2822    
2823            Do not cache the values returned by the tree widget's
2824            GetFirstChild and GetNextChild methods because it led to lots of
2825            segfaults. The new way requires more brute force but is more
2826            reliable.
2827    
2828            * Thuban/UI/legend.py (LegendTree.__init__): Remove instance
2829            variable layer2id
2830            (LegendTree.find_layer): New method to do with brute force what
2831            layer2id tried to accomplish
2832            (LegendTree._OnMsgLayerChanged)
2833            (LegendTree._OnMsgLayerTitleChanged, LegendTree.__ShowHideLayer):
2834            Use find_layer instead of layer2id
2835            (LegendTree.__RemoveLayer, LegendTree.__AddLayer): No need to
2836            update layer2id anymore
2837            (LegendTree._OnMsgMapLayersRemoved)
2838            (LegendTree._OnMsgMapLayersAdded): Get by without layer2id.
2839    
2840    2003-06-03  Thomas Koester  <[email protected]>
2841    
2842            * Thuban/Model/classgen.py (GenQuantiles0): New function.
2843    
2844    2003-06-02  Bernhard Herzog  <[email protected]>
2845    
2846            * Thuban/UI/mainwindow.py (layer_rename command, table_rename command):
2847            New commands.
2848            (main_menu): Add the new commands.
2849            (MainWindow.TableRename): New. Implementation of the table_rename
2850            command.
2851            (MainWindow.RenameLayer): New. Implementation of the layer_rename
2852            command.
2853    
2854            * Thuban/Model/session.py (Session.AddTable): call self.changed to
2855            set the modified flag
2856    
2857            * test/test_session.py (TestSessionSimple.test_add_table): Test
2858            whether the modified flag is set properly
2859    
2860            * Thuban/Model/base.py (TitledObject.SetTitle): Call changed
2861            instead of issue so that the modified flags get updated.
2862    
2863            * test/test_base.py (SomeTitledObject): Derive from Modifiable
2864            instead of Publisher to reflect reality better and to accomodate
2865            the fact that SetTitle now calls changed instead of issue
2866    
2867    2003-06-02  Bernhard Herzog  <[email protected]>
2868    
2869            * Thuban/UI/classgen.py (GenQuantilesPanel.GetList): Resource
2870            acquisition has to happen before the try in a try-finally.
2871    
2872    2003-06-02  Bernhard Herzog  <[email protected]>
2873    
2874            * Thuban/UI/legend.py (LegendTree._OnMsgMapLayersRemoved): It's
2875            possible that a layer is removed that is not currently selected in
2876            the legend so don't check for this.
2877    
2878    2003-05-30  Bernhard Herzog  <[email protected]>
2879    
2880            * Thuban/Model/layer.py (Layer.Destroy): Set all instance
2881            variables to None that have direct or indirect references to
2882            shapefiles or dbf files to make sure that they do go away and the
2883            files are closed.
2884    
2885    2003-05-30  Bernhard Herzog  <[email protected]>
2886    
2887            * Thuban/UI/legend.py (LegendTree.GetRootItem): Reset
2888            availImgListIndices when a new image list is created
2889            
2890    2003-05-30  Bernhard Herzog  <[email protected]>
2891    
2892            * Thuban/UI/legend.py (LegendTree.__init__): New instance variable
2893            changing_selection to indicate whether the LegendTree code itself
2894            is currently changing the selection
2895            (LegendTree.normalize_selection): New method to normalize the
2896            selection by selecting the layer item even if the user clicked on
2897            the classification.
2898            (LegendTree._OnSelChanged): normalize the selection. This works
2899            around a bug in wx which doesn't keep track of the selection
2900            properly when subtrees are deleted.
2901    
2902    2003-05-30  Bernhard Herzog  <[email protected]>
2903    
2904            * Thuban/UI/view.py (MapCanvas.set_view_transform): Limit the
2905            maximum and minimum scale factors.
2906    
2907            * test/test_classgen.py (ClassGenTest.test): Update to reflect the
2908            changes in classgen.py
2909    
2910    2003-05-30  Jonathan Coles   <[email protected]>
2911    
2912            * Thuban/Model/classgen.py: Remove ClassGenerator class but make
2913            all the methods functions. Fixes RTBug #1903.
2914    
2915            * Thuban/Model/map.py (Map.TopLayer, Map.BottomLayer): Renamed
2916            to MoveLayerToTop and MoveLayerToBottom respectively. Fixes
2917            RTBug #1907.
2918    
2919            * Thuban/UI/classgen.py: Use classgen functions that were part
2920            of the ClassGenerator class. Put try/finally blocks around
2921            code that uses wxBeginBusyCursor()/wxEndBusyCursor(). Fixes
2922            RTBug #1904.
2923    
2924            * Thuban/UI/classifier.py: Remove unused import of ClassGenerator.
2925    
2926            * Thuban/UI/legend.py: The legend was cleared and repopulated any
2927            time something changed which caused some state to be lost such
2928            as which children were expanded or collapsed. Fixes RTBug #1901.
2929            (LegendTree._OnMsgMapLayersAdded): Add only new layers.
2930            (LegendTree.__OnMsgMapLayersRemoved): Remove layers that exist in
2931            the legend but not in the map.
2932            (LegendTree.__FillTree): Move main functionality out into smaller
2933            methods that can be used by other methods.
2934            (LegendTree.__FillTreeLayer): Reuse old slots in the image list
2935            if they are available.
2936            (LegendTree.DeleteAllItems): Renamed from __DeleteAllItems so
2937            that we override the wxTreeCtrl method. Iterate over children
2938            and call __RemoveLayer.
2939            (LegendTree.__AddLayer): New. Add a new layer to the legend.
2940            (LegendTree.__RemoveLayer): Remove a layer from the legend.
2941            (LegendTree.DeleteChildren): New, overrides wxTreeCtrl method.
2942            Should only be called with the id of a layer branch.
2943            (LegendTree.GetRootItem): New, overrides wxTreeCtrl method.
2944            Returns the root item or creates one if necessary.
2945    
2946            * Thuban/UI/renderer.py (MapRenderer.draw_raster_layer): Call
2947            ProjectRasterFile with tuple arguments instead of strings.
2948    
2949            * Thuban/UI/tableview.py (QueryTableFrame.OnQuery): Wrap code
2950            with try/finally. Fixes RTBug #1904.
2951    
2952            * Thuban/UI/view.py (MapCanvas.OnPaint): Wrap code
2953            with try/finally. Fixes RTBug #1904.
2954            (MapCanvas.FitSelectedToWindow): If a single point is selected
2955            simply center it on the display. Fixes RTBug #1849.
2956    
2957            * extensions/thuban/gdalwarp.cpp: Removed code that allowed gdalwarp
2958            to be compiled as a standalone app. Now the code can only be
2959            called from Python which simplifies the parameter passing.
2960            (ProjectRasterFile): Handle Python arguments. Remove code that
2961            checks for a destination dataset. Add more clean up code.
2962    
2963            * test/test_map.py (TestMapWithContents.test_raise_layer_top,
2964            TestMapWithContents.test_lower_layer_bottom):
2965            Test Map.MoveLayerToTop() and Map.MoveLayerToBottom() respectively.
2966            Fixes RTBug #1907.
2967    
2968            * Thuban/UI/mainwindow.py (MainWindow.ToggleLegend): Apply a full
2969            extent to the map when the legend is toggled. Fixes RTBug #1881.
2970    
2971    2003-05-29  Jan-Oliver Wagner <[email protected]>
2972    
2973            * Thuban/UI/tableview.py (LayerTableFrame.OnClose): Bug-fix: Now
2974            unsubscribes all that is subcribed in __init__.
2975    
2976    2003-05-28  Bernhard Herzog  <[email protected]>
2977    
2978            * Thuban/UI/mainwindow.py (MainWindow.DuplicateLayer)
2979            (MainWindow.CanDuplicateLayer): New methods to implement the
2980            Layer/Duplicate command.
2981            (layer_duplicate command): New.
2982            (main_menu): Add layer_duplicate to the Layer menu.
2983    
2984    2003-05-28  Bernhard Herzog  <[email protected]>
2985    
2986            * Thuban/UI/tableview.py (NullRenderer.Draw): New. Our own
2987            renderer so that NULL/None values get displayed differently (by a
2988            gray rectangle).
2989            (TableGrid.__init__): Override the default renderers
2990    
2991    2003-05-28  Bernhard Herzog  <[email protected]>
2992    
2993            * Thuban/Model/layer.py (Layer.SetShapeStore): Set the
2994            classification to "None" if the type of the field has changed.
2995    
2996            * test/test_layer.py (SetShapeStoreTests): New. Class with a few
2997            test for the Layer.SetShapeStore method
2998    
2999    2003-05-28  Jan-Oliver Wagner <[email protected]>
3000    
3001            * Thuban/Model/layer.py (Layer.TreeInfo): Fixed a bug (a layer
3002            does not necessarily have a filename).
3003    
3004    2003-05-28  Jan-Oliver Wagner <[email protected]>
3005    
3006            * Thuban/UI/mainwindow.py (MainWindow.TableClose, MainWindow.TableShow):
3007            sort the selection list for the dialog.
3008    
3009    2003-05-28  Frank Koormann  <[email protected]>
3010    
3011            * extensions/thuban/wxproj.cpp
3012            (project_point): Removed cast to int for projected point coordinates.
3013            (shape_centroid): Return last point if all polygon vertices fall
3014            to one point.
3015    
3016    2003-05-28  Bernhard Herzog  <[email protected]>
3017    
3018            * Thuban/UI/mainwindow.py (_can_unjoin): Add doc-string and cope
3019            with layers that don't have shapestores, i.e. raster layers.
3020    
3021    2003-05-28  Bernhard Herzog  <[email protected]>
3022    
3023            * Thuban/Model/table.py (DBFTable.__init__): Omit the extension
3024            when determining the title from the filename.
3025    
3026            * test/test_dbf_table.py (TestDBFTable.test_title): Update to
3027            reflect changes in the way the title is derived from the filename
3028    
3029    2003-05-28  Frank Koormann  <[email protected]>
3030    
3031            * Thuban/UI/mainwindow.py (MainWindow.TableShow):
3032            Added wxDEFAULT_DIALOG_STYLE to show table dialog styles.
3033    
3034    2003-05-27  Bernhard Herzog  <[email protected]>
3035    
3036            * Thuban/UI/mainwindow.py (MainWindow.delegated_messages): Also
3037            delegate SelectedLayer.
3038            (MainWindow.LayerUnjoinTable): Implement.
3039            (_can_unjoin): New. Helper function for the sensitivity of the
3040            layer/unjoin command.
3041    
3042            * Thuban/Model/data.py (ShapefileStore.OrigShapeStore)
3043            (DerivedShapeStore.OrigShapeStore): New. Return the original
3044            shapestore. Used to figure out how to unjoin.
3045            (DerivedShapeStore.Shapefile): Fix a typo.
3046    
3047    2003-05-27  Bernhard Herzog  <[email protected]>
3048    
3049            * Thuban/UI/join.py (JoinDialog): Extend to handle layer joins as
3050            well
3051            (JoinDialog.__init__): Use the layer parameter and only build the
3052            left choice when a layer is given
3053            (JoinDialog.OnJoin): Handle layer joins as well
3054            (JoinDialog.OnLeftTable, JoinDialog.OnRightTable): Handle the case
3055            that the user selects the "Select..." item. The sensitivitly
3056            updating is now in update_sensitivity
3057            (JoinDialog.y): New method to refactor the sensitivity update of
3058            the join button into its own method.
3059    
3060            * Thuban/UI/mainwindow.py (MainWindow.LayerJoinTable): Implement.
3061    
3062    2003-05-27  Bernhard Herzog  <[email protected]>
3063    
3064            * Thuban/UI/mainwindow.py (table_close command): Make it sensitive
3065            iff there are unreferenced tables in the session
3066    
3067    2003-05-27  Bernhard Herzog  <[email protected]>
3068    
3069            * Thuban/Model/messages.py (TABLE_REMOVED): New message.
3070    
3071            * Thuban/Model/session.py (Session.UnreferencedTables): New method
3072            to return tables that are not referenced by other tables or shape
3073            stores and can be removed.
3074            (Session.RemoveTable): Issue a TABLE_REMOVED message after
3075            removing the table
3076    
3077            * Thuban/UI/mainwindow.py: Remove unused imports
3078            (MainWindow.TableClose): Implement.
3079    
3080            * Thuban/UI/tableview.py (TableFrame.__init__): Subscribe to some
3081            messages so that the frame will be automatically closed when a new
3082            session is opened or the table is removed.
3083            (TableFrame.OnClose): Unsubscribe the Subscriptions made in
3084            __init__
3085            (TableFrame.close_on_session_replaced)
3086            (TableFrame.close_on_table_removed): New. Subscribers that close
3087            the window
3088    
3089            * test/test_session.py (TestSessionMessages.test_remove_table)
3090            (TestSessionSimple.test_remove_table): Move the test to
3091            TestSessionSimple and add test for the TABLE_REMOVED message
3092            (TestSessionBase.setUp): Also subscribe to TABLE_REMOVED
3093            (TestSessionSimple.test_unreferenced_tables) New. Test for the
3094            UnreferencedTables method.
3095            (UnreferencedTablesTests): New. Class with some more sophisticated
3096            tests for UnreferencedTables.
3097    
3098    2003-05-27  Frank Koormann  <[email protected]>
3099    
3100            * Thuban/UI/tableview.py (QueryTableFrame.__init__): The "_S_election"
3101            display has some unwanted side effects. Removed again.
3102    
3103    2003-05-27  Frank Koormann  <[email protected]>
3104    
3105            * Resources/Bitmaps/legend_icon_layer.xpm: New, icon for legend.
3106    
3107            * Thuban/UI/legend.py (LegendTree.__FillTree): Use "legend_icon_layer"
3108    
3109    2003-05-27  Jan-Oliver Wagner <[email protected]>
3110    
3111            * test/test_menu.py (MenuTest.test): Added test for
3112            Menu.RemoveItem().
3113    
3114            * Thuban/UI/menu.py (Menu.RemoveItem): New. Remove an item from
3115            the menu.
3116    
3117    2003-05-27  Frank Koormann  <[email protected]>
3118            
3119            Nonmodal dialogs without parent (i.e. they can fall behind the main
3120            window)
3121    
3122            * Thuban/UI/mainwindow.py (MainWindow.OnClose): Explicitly destroy
3123            all dialogs in the dialogs dictionary and the canvas.
3124    
3125            * Thuban/UI/dialogs.py (NonModalNonParentDialog): New class, without
3126            parent, i.e. can fall behind other windows.
3127            (NonModalDialog.OnClose): Check is dialog is in mainwindow.dialog
3128            dictionary before removing it.
3129    
3130            * Thuban/UI/classifier.py: Dialog derived from NonModalNonParentDialog
3131    
3132            * Thuban/UI/projdialog.py: Dialog derived from NonModalNonParentDialog
3133            * Thuban/UI/tableview.py: Dialog derived from NonModalNonParentDialog
3134            * Thuban/UI/tree.py: Dialog derived from NonModalNonParentDialog
3135    
3136    2003-05-27  Bernhard Herzog  <[email protected]>
3137    
3138            * Thuban/UI/mainwindow.py (MainWindow.ShowTableView): New. Open a
3139            tableview dialog
3140            (MainWindow.TableShow): Use ShowTableView to open the dialogs.
3141            Also, don't use the table's titles as the dialog names. The titles
3142            aren't guaranteed to be unique.
3143            (MainWindow.TableOpen): Open a table view dialog after opening the
3144            table
3145    
3146    2003-05-27  Bernhard Herzog  <[email protected]>
3147    
3148            * Thuban/UI/mainwindow.py: Remove the Table/Hide menu item. Its
3149            effect can be achieved by simply closing the window showing the
3150            table.
3151            (MainWindow.TableHide): Removed.
3152            (main_menu): Removed "table_hide"
3153    
3154    2003-05-27  Frank Koormann  <[email protected]>
3155    
3156            Fix legend tree display problems under Win32
3157    
3158            * Thuban/UI/legend.py:  BMP_SIZE_W = 15
3159            (LegendTree.__FillTree): Display "legend_icon_map.xpm" with layer title.
3160            (LegendTree.__FillTreeLayer): Explicitely set SelectedImage.
3161    
3162            * Resources/Bitmaps/legend_icon_map.xpm: New icon for legend.
3163    
3164    2003-05-27  Jan-Oliver Wagner <[email protected]>
3165    
3166            * Thuban/UI/menu.py (Menu.InsertSeparator): Additional optional parameter
3167            'after' now allows to insert separators almost anywhere in the menu.
3168    
3169    2003-05-27  Frank Koormann  <[email protected]>
3170    
3171            * Thuban/UI/tableview.py (QueryTableFrame.__init__): Underline the
3172            "S" of selection box label to hint on hot key (Alt-S). Works under
3173            Win32 but is ignored under GTK.
3174    
3175    2003-05-26  Frank Koormann  <[email protected]>
3176    
3177            * Thuban/UI/projdialog.py (ProjFrame.__do_layout, ProjPanel._DoLayout):
3178            Center Choices.
3179    
3180    2003-05-26  Bernhard Herzog  <[email protected]>
3181    
3182            Remove the Precision methods again. They're too DBF specific to be
3183            part of the table interface and they're only used in table_to_dbf
3184            anyway.
3185            
3186            * Thuban/Model/transientdb.py (TransientTableBase.Width):Use a
3187            fixed precision of 12 for doubles.
3188            (TransientTableBase.Precision): Removed
3189            (AutoTransientTable.Width): Delegate to self.table.
3190    
3191            * Thuban/Model/table.py (DBFTable.Precision)
3192            (MemoryTable.Precision): Removed.
3193            (MemoryTable.Width): Use a fixed precision of 12 for doubles.
3194            (table_to_dbf): Use a fixed precision of 12 for floats unless the
3195            column object specifies something else.
3196    
3197            * test/test_dbf_table.py (TestTableToDBF.test_table_to_dbf): New.
3198            test for table_to_dbf
3199    
3200    2003-05-26  Bernhard Herzog  <[email protected]>
3201    
3202            * test/test_transientdb.py
3203            (TestTransientTable.run_iceland_political_tests): Fix a comment.
3204    
3205    2003-05-26  Bernhard Herzog  <[email protected]>
3206    
3207            * Thuban/UI/mainwindow.py (MainWindow.TableOpen): Real
3208            implementation. Mark parts of the file format strings for
3209            localization.
3210    
3211            * Thuban/Model/session.py (Session.OpenTableFile): New. Open a dbf
3212            file and add the table to the tables managed by the session
3213    
3214            * test/test_session.py (TestSessionSimple.test_open_table_file):
3215            New. test case for OpenTableFile
3216    
3217    2003-05-26  Jan-Oliver Wagner <[email protected]>
3218    
3219            * Thuban/UI/controls.py, Thuban/UI/identifyview.py, Thuban/UI/join.py,
3220            Thuban/UI/labeldialog.py, Thuban/UI/mainwindow.py,
3221            Thuban/UI/proj4dialog.py, Thuban/UI/tableview.py, Thuban/UI/view.py:
3222            Replace the true/false of wxWindows by True/False of Python 2.2.1.
3223    
3224    2003-05-26  Jan-Oliver Wagner <[email protected]>
3225    
3226            * Thuban/UI/tableview.py (LayerTableFrame.__init__): If there is
3227            already a selection present, update the grid accordingly.
3228    
3229            * Thuban/UI/mainwindow.py (MainWindow.TableShow): Make the dialog
3230            resizeable and increase its initial size.
3231    
3232    2003-05-26  Frank Koormann  <[email protected]>
3233    
3234            Table export functionality
3235    
3236            * Thuban/Model/table.py (DBFTable.Width, MemoryTable.Width):
3237            Return width (in characters) for a column.
3238            (DBFTable.Precision, MemoryTable.Precision): Return decimal precision.
3239            (table_to_dbf): Write table to dbf file.
3240            (table_to_csv): Write table to csv file.
3241    
3242            * Thuban/Model/transientdb.py (TransientTableBase.Width,
3243            TransientTableBase.Precision): Return column width and precision.
3244    
3245            * Thuban/UI/tableview.py (QueryTableFrame.OnSaveAs): Call table_to_dbf
3246            or table_to_csv depending on file selection.
3247    
3248            * test/test_dbf_table.py:
3249            Test table_to_dbf (extension of former part of test).
3250    
3251            * test/test_csv_table.py:
3252            Test table_to_csv.
3253    
3254    2003-05-23  Jan-Oliver Wagner <[email protected]>
3255    
3256            * Thuban/UI/join.py (JoinDialog.OnJoin): Use _() for strings.
3257            Use QueryTableFrame instead of TableFrame.
3258    
3259            * Thuban/UI/mainwindow.py (MainWindow.LayerShowTable): Prefix the
3260            table window with 'Layer Table:' instead of 'Table:'.
3261    
3262    2003-05-23  Jan-Oliver Wagner <[email protected]>
3263    
3264            Give all tables a title via mix-in TitledObject.LayerShowTable
3265    
3266            * Thuban/Model/base.py (TitledObject.SetTitle): Call method 'issue'
3267            only if it exists.
3268    
3269            * Thuban/Model/table.py (DBFTable, MemoryTable): mix-in TitledObject
3270            and call its init-method with a default title. Remove Title() method.
3271    
3272            * Thuban/Model/transientdb.py (TransientTable, TransientJoinedTable,
3273            AutoTransientTable): mix-in TitledObject and call its init-method with
3274            a default title. Remove Title() method.
3275    
3276    2003-05-23  Bernhard Herzog  <[email protected]>
3277    
3278            * Thuban/Model/session.py (Session.AddShapeStore): Define
3279            AddShapeStore analogously to AddTable.
3280    
3281            * test/test_session.py (TestSessionSimple.test_add_shapestore):
3282            New. Test for AddShapeStore
3283    
3284    2003-05-23  Jan-Oliver Wagner <[email protected]>
3285    
3286            Introducing QueryTableFrame and a very coarse ShowTable implementation.
3287    
3288            * Thuban/UI/tableview.py (LayerTableFrame, QueryTableFrame): Split the
3289            class LayerTableFrame into two classes, LayerTableFrame and QueryTableFrame.
3290            The latter implements the selection GUI without dependency on a layer.
3291            LayerTableFrame now is derived from QueryTableFrame and connects
3292            to a layer.
3293    
3294            * Thuban/UI/mainwindow.py (MainWindow.TableShow): A very coarse
3295            implementation that still needs work.
3296    
3297            * Thuban/Model/layer.py (Layer.TreeInfo): Added filename.
3298    
3299    2003-05-22  Frank Koormann  <[email protected]>
3300    
3301            * Thuban/Model/transientdb.py (TransientJoinedTable.__init__):
3302            Added "outer_join = False" as optional parameter.
3303            (TransientJoinedTable.create): If outer join is true, perform a
3304            "LEFT OUTER JOIN" instead of "JOIN", which preserves all records of
3305            the left table. Records not matching are filled with 0 / None.
3306    
3307            * Thuban/UI/join.py (JoinDialog.__init__): Checkbox for outer join.
3308            (JoinDialog.OnJoin): Consider outer join check box.
3309    
3310    2003-05-22  Bernhard Herzog  <[email protected]>
3311    
3312            * Thuban/UI/join.py (JoinDialog.OnJoin): Use exc_info in a
3313            somewhat safer way. Storing the traceback in a local variable can
3314            lead to memory leaks
3315    
3316    2003-05-22  Bernhard Herzog  <[email protected]>
3317    
3318            * Thuban/UI/join.py (JoinDialog.OnJoin): Make sure to really call
3319            the wxMessageDialog's Destroy() method.
3320    
3321    2003-05-22  Frank Koormann  <[email protected]>
3322    
3323            * Thuban/UI/join.py (JoinDialog.__init__): Make use of
3324            TransientTable.Title()
3325    
3326    2003-05-22  Frank Koormann  <[email protected]>
3327    
3328            Join Dialog, initial version.
3329    
3330            * Thuban/UI/mainwindow.py (MainWindow.TableJoin): Removed print.
3331    
3332            * Thuban/UI/join.py (JoinDialog): Functional implementation of
3333            former framework. Renamed Table1/Table2 to LeftTable/RightTable
3334            in all occurences.
3335    
3336            * Thuban/Model/transientdb.py (TransientJoinedTable.__doc__):
3337            Typo fixed.
3338    
3339    2003-05-22  Bernhard Herzog  <[email protected]>
3340    
3341            Give the tables titles so that the GUI can display more meaningful
3342            names. For now the titles are fixed but depend on e.g. filenames
3343            or the titles of the joined tables.
3344    
3345            * Thuban/Model/transientdb.py (TransientTable.Title)
3346            (TransientJoinedTable.Title, AutoTransientTable.Title): New.
3347    
3348            * Thuban/Model/table.py (DBFTable.Title, MemoryTable.Title): New.
3349    
3350            * test/test_transientdb.py
3351            (TestTransientTable.test_auto_transient_table_title): New. Test
3352            for the Title method
3353            (TestTransientTable.test_transient_joined_table)
3354            (TestTransientTable.test_transient_table): Add test for the Title
3355            methods
3356    
3357            * test/test_memory_table.py (TestMemoryTable.test_title): New.
3358            Test for the Title method
3359    
3360            * test/test_dbf_table.py (TestDBFTable.test_title): New. Test for
3361            the Title method
3362    
3363    2003-05-22  Bernhard Herzog  <[email protected]>
3364    
3365            * test/test_layer.py (TestLayer.setUp, TestLayer.tearDown):
3366            Provide a better way to destroy the layers
3367            (TestLayer.test_base_layer, TestLayer.test_arc_layer)
3368            (TestLayer.test_point_layer, TestLayer.test_empty_layer)
3369            (TestLayer.test_polygon_layer, TestLayer.test_get_field_type): Use
3370            the new way to destroy the layers.
3371            (TestLayer.test_derived_store): New. Test for using a layer with a
3372            DerivedShapeStore
3373    
3374            * Thuban/Model/layer.py (Layer.SetShapeStore): Only set the
3375            filename if the shape store actually has one.
3376    
3377    2003-05-22  Bernhard Herzog  <[email protected]>
3378    
3379            * Thuban/Model/table.py (DBFTable.FileName): New. Accessor method
3380            for the filename
3381    
3382            * test/test_dbf_table.py (TestDBFTable.test_filename): New. Test
3383            for the FileName method
3384            (TestDBFTableWriting.test_write): Fix spelling of filename
3385    
3386    2003-05-22  Thomas Koester  <[email protected]>
3387    
3388            * Thuban/Model/range.py, test/test_range.py: Brought over new Range
3389            from SciParam that now really is immutable.
3390    
3391    2003-05-22  Frank Koormann  <[email protected]>
3392    
3393            Layer Top/Bottom placement added to legend.
3394    
3395            * Thuban/UI/legend.py
3396            (LegendPanel._OnMoveTop(), LayerPanel._OnMoveBottom): New, methods
3397            bound to tool events.
3398            (LegendTree.MoveCurrentItemTop(), LegendTree.MoveCurrentItemBottom):
3399            New, methods binding the event methods with the map methods.
3400    
3401            * Thuban/Model/map.py (Map.TopLayer(), Map.BottomLayer()): New, place
3402            layer at top/bottom of layer stack.
3403    
3404            * Resources/Bitmaps/top_layer.xpm: New button icon.
3405    
3406            * Resources/Bitmaps/bottom_layer.xpm: New button icon.
3407    
3408    2003-05-22  Bernhard Herzog  <[email protected]>
3409    
3410            * Thuban/Model/session.py (Session.RemoveTable): New method to
3411            remove tables
3412    
3413            * test/test_session.py (TestSessionSimple.test_remove_table): New.
3414            Test for RemoveTable
3415    
3416    2003-05-22  Thomas Koester  <[email protected]>
3417    
3418            * Thuban/Model/classgen.py: Added short module doc string and CVS id.
3419            (ClassGenerator.GenUniformDistribution): Use new Range __init__, too.
3420    
3421    2003-05-22  Bernhard Herzog  <[email protected]>
3422    
3423            Implement a way to discover dependencies between tables and
3424            shapestores.
3425    
3426            * Thuban/Model/transientdb.py (TransientTableBase.Dependencies)
3427            (TransientJoinedTable.Dependencies)
3428            (AutoTransientTable.SimpleQuery): New. Implement the dependencies
3429            interface
3430            (TransientJoinedTable.__init__): Keep tack of the original table
3431            objects in addition to the corresponding transient tables.
3432    
3433            * Thuban/Model/table.py (DBFTable.Dependencies)
3434            (MemoryTable.Dependencies): New. Implement the dependencies
3435            interface
3436    
3437            * Thuban/Model/data.py (ShapeTable): New. Helper class for
3438            ShapefileStore
3439            (ShapefileStore.__init__): Use ShapeTable instead of
3440            AutoTransientTable
3441            (ShapefileStore.Table, ShapefileStore.Shapefile): Add doc-strings
3442            (ShapefileStore.FileName, ShapefileStore.FileType): New. Accessor
3443            methods for filename and type
3444            (ShapefileStore.Dependencies): New. Implement the dependencies
3445            interface
3446            (DerivedShapeStore): New class to replace SimpleStore. The main
3447            difference to SimpleStore is that it depends not on a shapefile
3448            but another shapestore which expresses the dependencies a bit
3449            better
3450            (SimpleStore.__init__): Add deprecation warning.
3451    
3452            * test/test_dbf_table.py (TestDBFTable.test_dependencies): New.
3453            Test for the Dependencies method.
3454    
3455            * test/test_memory_table.py (TestMemoryTable.test_dependencies):
3456            New. Test for the Dependencies method.
3457    
3458            * test/test_transientdb.py
3459            (TestTransientTable.test_auto_transient_table_dependencies): New.
3460            Test for the Dependencies method.
3461            (TestTransientTable.test_transient_joined_table): Add test for the
3462            Dependencies method.
3463    
3464            * test/test_session.py (TestSessionSimple.setUp)
3465            (TestSessionSimple.tearDown): New. Implement a better way to
3466            destroy the sessions.
3467            (TestSessionSimple.test_initial_state)
3468            (TestSessionSimple.test_add_table): Bind session to self.session
3469            so that it's destroyed by tearDown
3470            (TestSessionSimple.test_open_shapefile): New. Test for
3471            OpenShapefile and the object it returns
3472    
3473    2003-05-22  Bernhard Herzog  <[email protected]>
3474    
3475            * Thuban/Model/session.py (Session.AddTable): New method to
3476            register tables with the session.
3477            (Session.Tables): Return the tables registered with AddTable too.
3478    
3479            * test/test_session.py (TestSessionSimple.test_add_table): New.
3480            Test case for the AddTable method
3481    
3482    2003-05-22  Frank Koormann  <[email protected]>
3483    
3484            UI polishing updates: Place main buttons (OK, Cancel, etc) in the
3485            lower right corner, center labels for selections, initialize controls
3486            in reasonable order for keyboard navigation.
3487    
3488            * Thuban/UI/projdialog.py (ProjFrame.__init__, ProjFrame.__doLayout)
3489            (ProjFrame.__DoOnProjAvail): Determine position of current projection
3490            using the wxListBox.FindString() method. Still a problem (#1886)
3491    
3492            * Thuban/UI/classifier.py
3493            (Classifier.__init__, SelectPropertiesDialog.__init__)
3494    
3495            * Thuban/UI/classgen.py (ClassGenDialog.__init__,
3496            (ClassGenDialog.__DoOnGenTypeSelect): Moved initialization of the
3497            different classification types from here to __init__.
3498            (GenUniquePanel.__init__): Set the column width of the first field
3499            in the Field ListCtrl to the full width.
3500    
3501            * Thuban/UI/tableview.py (LayerTableFrame.__init__): Rename 'Save As'
3502            Button to 'Export'. Center Buttons in Selection Box, set Focus to
3503            Grid.
3504            (LayerTableFrame.OnKeyDown()): New, bound to the grid with EVT_KEY_DOWN,
3505            changes focus to the Selection when pressing "Alt-S".
3506    
3507            * Thuban/UI/legend.py (LegendTree.__SetVisibilityStyle): Only gray out
3508            the text if not visible. The italic font sometimes exceeds the
3509            rendering area.
3510    
3511    2003-05-21  Jonathan Coles   <[email protected]>
3512    
3513            * Thuban/UI/dock.py (DockFrame): Rename references to _OnClose
3514            to OnClose so that Thuban closes correctly.
3515    
3516            * Thuban/UI/mainwindow.py (MainWindow.OnClose): Call
3517            DockFrame.OnClose, not DockFrame._OnClose.
3518    
3519    2003-05-21  Jonathan Coles   <[email protected]>
3520    
3521            * Thuban/Model/classgen.py (ClassGenerator.GenQuantiles): Remove
3522            references to 'inf' and use new Range __init__ to pass floats
3523            directly rather than converting them to strings first.
3524            Fixes RTBug #1876.
3525    
3526            * Thuban/Model/classification.py (ClassGroupRange.SetRange):
3527            Use new Range ___init__ to pass floats.
3528    
3529            * Thuban/Model/layer.py (RasterLayer.__init__): Test if the
3530            filename is a valid image file. Throw IOError otherwise.
3531    
3532            * Thuban/Model/range.py: Brought over new Range from SciParam that
3533            is immutable and has an __init__ which can accept floats.
3534    
3535            * Thuban/UI/mainwindow.py (MainWindow.AddLayer): Move OpenShapefile
3536            into try block. AddLayer doesn't throw any exceptions anymore.
3537            (MainWindow.AddRasterLayer): Move constructor of RasterLayer into
3538            try block.
3539    
3540            * Thuban/UI/projdialog.py (GeoPanel.__init__): Put Degrees as
3541            the first item in choices. Fixes RTBug #1882.
3542    
3543            * Thuban/UI/renderer.py (MapRenderer.render_map): Check if scale
3544            has gone to 0 which is a serious problem. abort.
3545            (MapRenderer.draw_raster_layer): Catch IOError seperately and
3546            print the error from GDAL.
3547    
3548            * Thuban/UI/tableview.py (TableGrid.__init__): Call
3549            ToggleEventListeners to turn on listening.
3550            (TableGrid.ToggleEventListeners): New. Turns event listening on
3551            and off so as to prevent excessive messages.
3552            (LayerTableFrame.OnQuery): Use TableGrid.ToggleEventListeners
3553            to suppress excessive messages when selecting many rows.
3554            Fixes RTBug #1880.
3555    
3556            * Thuban/UI/view.py: Added checks against if scale == 0. This
3557            is a serious problem that can occur when an image without
3558            geo data is loading and causes the map projection bounds to
3559            go to infinity. Right now, the solution is to simply try
3560            to recover.
3561    
3562            * extensions/thuban/cpl_mfile.cpp (MFILEClose): Make sure
3563            to set the MFILEReceiver attributes even if the data is NULL.
3564    
3565            * extensions/thuban/gdalwarp.cpp: Improved the error handling
3566            and passed GDAL messages back up to the Python layer. Also
3567            tried to fix some memory leaks that were present in the original
3568            utility but didn't matter because the program aborted.
3569    
3570            * test/test_range.py: Copied over tests from SciParam. Removed
3571            tests against importing. Fixes RTBug #1867.
3572    
3573    2003-05-21  Bernhard Herzog  <[email protected]>
3574    
3575            * test/test_load.py: Remove unused imports and restructure the
3576            test code
3577            (LoadSessionTest): Split into one class for each test and turn
3578            LoadSessionTest itself into the base class for all such session
3579            tests.
3580            (ClassificationTest): New base class for load tests that test
3581            classifications
3582            (TestSingleLayer, TestLayerVisibility, TestClassification)
3583            (TestLabels, TestLayerProjection, TestRasterLayer): New classes
3584            for the individual tests
3585    
3586            * test/support.py (FileLoadTestCase.filename): New base class for
3587            file loading tests
3588    
3589    2003-05-21  Jan-Oliver Wagner <[email protected]>
3590    
3591            * Resources/Projections/defaults.proj: Renamed 'Universal Transverse
3592            Mercator' to 'UTM Zone 32' as a more convenient example.
3593            Added 'Gauss Krueger Zone 6'.
3594    
3595            * Data/iceland_sample_raster.thuban: political polygon now
3596            filled transparent to have the raster image visible at once.
3597    
3598    2003-05-21  Frank Koormann  <[email protected]>
3599    
3600            * Thuban/UI/mainwindow.py (MainWindow): Renamed _OnClose() back to
3601            OnClose() to keep in sync with extensions. Internally Thuban
3602            still uses "underscored" names.
3603    
3604    2003-05-20  Jonathan Coles   <[email protected]>
3605    
3606            This puts back Raster layer support. These layers support projections
3607            through the GDAL library. Currently, the CVS version is being used.
3608            There are no Debian packages available although this may change soon.
3609            A GDAL driver was extended to support writing to memory rather to
3610            files.
3611    
3612            There is still some work that needs to be done, such as some error
3613            handling when loading invalid images or when there is a problem
3614            projecting the image. This putback simply checks in the majority
3615            of the work.
3616    
3617            * setup.py: Add gdalwarp library extension.
3618    
3619            * Thuban/Model/layer.py (BaseLayer.HasClassification): New.
3620            Defaults to False, but can be overridden by subclasses if they
3621            support classification.
3622            (RasterLayer): New. Defines a new layer that represents an
3623            image.
3624    
3625            * Thuban/Model/load.py (SessionLoader.__init__): Add rasterlayer
3626            tag handler.
3627            (SessionLoader.start_layer): Encode the filename.
3628            (SessionLoader.start_rasterlayer, SessionLoader.end_rasterlayer):
3629            New. Supports reading a rasterlayer tag.
3630    
3631            * Thuban/Model/map.py (Map.BoundingBox): Fix typo in comment.
3632    
3633            * Thuban/Model/save.py (XMLWriter.encode): Don't assume that we
3634            get a string in Latin1. If we get such as string convert it to
3635            unicode first, otherwise leave if alone before encoding.
3636            (SessionSaver.write_layer): Add support for writing both Layers
3637            and RasterLayers.
3638    
3639            * Thuban/Model/transientdb.py (AutoTransientTable.SimpleQuery):
3640            The right argument may not be a string, it could also be a Column.
3641    
3642            * Thuban/UI/application.py (ThubanApplication.CreateMainWindow):
3643            Make initial window size 600x400. Fixes RTBug #1872.
3644    
3645            * Thuban/UI/classifier.py (Classifier.__init__): Rearrange how
3646            the dialog is constructed so that we can support layers that
3647            do not have classifications.
3648            (Classifier._OnTry): Only build a classification if the layer
3649            supports one.
3650    
3651            * Thuban/UI/legend.py: Change all checks that a layer is an
3652            instance of Layer into checks against BaseLayer.
3653            (LegendTree.__FillTreeLayer): Only add children to a branch if
3654            the layer supports classification.
3655    
3656            * Thuban/UI/mainwindow.py (MainWindow.NewSession,
3657            MainWindow.OpenSession): Don't proceed with an action if the
3658            user chooses Cancel when they are asked to save changes.
3659            (MainWindow.AddRasterLayer): New. Open a dialog to allow the
3660            user to select an image file. Create a new RasterLayer and add
3661            it to the map.
3662    
3663            * Thuban/UI/renderer.py (MapRenderer.render_map): Add support
3664            for rendering RasterLayer layers.
3665            (MapRenderer.draw_raster_layer): Actually method that calls
3666            the GDALWarp python wrapper and constructs an image from the
3667            data returned.
3668    
3669            * Thuban/UI/tableview.py (LayerTableFrame.__init__): Change the
3670            Choices symbols to match those used in the table query method.
3671            Replace deprecated method calls on table with new method names.
3672    
3673            * Thuban/UI/view.py (MapCanvas.set_view_transform): Try to limit
3674            how small the scale can get. This still needs more testing.
3675    
3676            * extensions/thuban/bmpdataset.cpp: New, but copied from GDAL.
3677            Provides a driver to output in .bmp format.
3678    
3679            * extensions/thuban/cpl_mfile.cpp, extensions/thuban/cpl_mfile.h:
3680            New. Provides IO routines which write to memory, rather than a file.
3681    
3682            * extensions/thuban/gdalwarp.cpp: New, but basically a direct copy
3683            of the gdalwarp utility provided in GDAL. Added function calls
3684            that can be accessed from python.
3685    
3686            * Data/iceland_sample_raster.thuban: New. Sample file that uses
3687            a raster layer.
3688    
3689            * Data/iceland/island.tfw, Data/iceland/island.tif: New. Raster
3690            layer image data.
3691    
3692            * Doc/thuban.dtd: Added rasterlayer attribute definition.
3693    
3694            * test/test_layer.py, test/test_load.py, test/test_save.py: Added
3695            tests associated with the raster layer code.
3696    
3697            * test/test_transientdb.py
3698            (TestTransientTable.test_auto_transient_table_query): Added a test
3699            for using a Column object as the "right" parameter to a query.
3700    
3701    2003-05-19  Frank Koormann  <[email protected]>
3702    
3703            * Thuban/version.py (get_changelog_date):
3704            Catch exceptions if ChangeLog does not exist.
3705    
3706            * Thuban/UI/view.py (MapCanvas.Export): Bugfix
3707    
3708    2003-05-19  Frank Koormann  <[email protected]>
3709    
3710            Extended version information for Thuban
3711    
3712            * Thuban/version.py: New, version information for Thuban: Last
3713            modification date and last ChangeLog entry date.
3714    
3715            * Thuban/UI/mainwindow.py (MainWindow.About()): Extended version
3716            information: Display Thuban, wxPython and Python version.
3717    
3718    2003-05-16  Bernhard Herzog  <[email protected]>
3719    
3720            * Thuban/Model/save.py: Remove some unused imports including the
3721            __future__ import for nested_scopes as Thuban relies on Python 2.2
3722            now.
3723            (XMLWriter.encode): Remove the special case for a None argument.
3724            In the saver encode is always called with a string argument.
3725    
3726    2003-05-16  Bernhard Herzog  <[email protected]>
3727    
3728            * Thuban/UI/__init__.py: Remove the work-around for the locale bug
3729            in wxPython (at least when usinvg wxGTK) prior to 2.4. The symptom
3730            of the bug was that e.g. float("1.2") would fail. Thuban now
3731            requires 2.4.x.
3732            
3733    2003-05-16  Frank Koormann   <[email protected]>
3734    
3735            Printing enhancement and WMF export (under Win32)
3736    
3737            * Thuban/UI/renderer.py (ExportRenderer): New, derived from
3738            ScreenRenderer. Renders Map, Legend and Scalebar for export.
3739            (PrinterRenderer): New, derived from ExportRenderer. Replaces the old
3740            PrintRender.
3741    
3742            * Thuban/UI/view.py (MapPrintout.__init__): Enhanced parameter set
3743            to fullfil information needed for PrinterRenderer.
3744            (MapCanvas.Export): New. Export Map (currently only to WMF on Win32).
3745            (MapCanvas.Print): Adapted to new MapPrintout.
3746            (OutputTransform): General calculations to transform from canvas
3747            coordinates to export/printing devices.
3748    
3749            * Thuban/UI/mainwindow.py (MainWindow.ExportMap()): New. Added also
3750            new method_command to call ExportMap, with platform dependency (only
3751            __WXMSW__)
3752      
3753            * Thuban/UI/scalebar.py (ScaleBar.DrawScaleBar): Position and Size
3754            of scalebar drawing area as new parameters.
3755            
3756            * Thuban/Model/scalebar.py (roundInterval): round long instead of int
3757    
3758            * Thuban/UI/legend.py (ScalebarBitmap.__SetScale):
3759            Update to extended scalebar.DrawScalebar header.
3760    
3761            * test/test_export.py: New, test Thuban.UI.view.OutputTransform()
3762    
3763            * test/test_scalebar.py: Made test executable as standalone.
3764    
3765    2003-05-16  Bernhard Herzog  <[email protected]>
3766    
3767            * Thuban/Model/table.py (Table): Remove this compatibility alias
3768            for DBFTable.
3769    
3770            * test/test_table.py: Import DBFTable as Table because that alias
3771            doesn't exist anymore.
3772    
3773            * Thuban/UI/classgen.py: Remove some unused imports
3774    
3775    2003-05-14  Jonathan Coles   <[email protected]>
3776    
3777            * Thuban/Model/classgen.py (ClassGenerator.GenSingletonsFromList):
3778            Fix docstring.
3779            (ClassGenerator.GenUniformDistribution): Fix spelling of method name.
3780            (ClassGenerator.GenQuantiles): Use the left/right brackets and min/max
3781            values of the supplied range to determine the beginning and end
3782            bounds of the generated classes.
3783    
3784            * Thuban/Model/range.py (Range.number_re): Now accepts floats that
3785            do not have a leading 0 (.5 is now accepted as well as 0.5).
3786    
3787            * Thuban/UI/classgen.py (ClassGenDialog.OnOK): Fix name of method
3788            call to ClassGenerator.GenUniformDistribution.
3789    
3790            * Thuban/UI/projdialog.py (ProjFrame.__do_layout): Fix Windows
3791            layout bug with the 'Projection' label.
3792    
3793            * test/support.py (FloatTestCase): New. Needed for the Range tests.
3794    
3795            * test/test_range.py: New. Imported from SciParam.
3796    
3797    2003-05-12  Jonathan Coles   <[email protected]>
3798    
3799            * Thuban/UI/classgen.py (GenQuantilesPanel.GetList): Replace call
3800            to table.UniqueValues() with calls that retrieve all the values
3801            from the table. This will need to be replaced by a method on table
3802            which can simply return the list (perhaps more efficiently).
3803    
3804    2003-05-12  Jonathan Coles   <[email protected]>
3805    
3806            The return value of ClassGenerator.CalculateQuantiles has changed.
3807            Refer to the documentation for details.
3808    
3809            * test/test_classgen.py: Modified Quantile tests to use the
3810            new return values.
3811    
3812            * Thuban/Model/classgen.py
3813            (ClassGenerator.GenQuantiles): Add comments describing the parameters,
3814            use new return values from CalculateQuantiles to produce the correct
3815            range bounds in the Classification.
3816            (ClassGenerator.CalculateQuantiles): Add more comments describing
3817            the return values and parameters. Make minor adjustments to improve
3818            the legibility of the code. Fix problem with adjusted not being set
3819            in most cases.
3820    
3821    2003-05-12  Frank Koormann <[email protected]>
3822            
3823            * Thuban/Model/save.py (XMLWriter.encode()): Explicite call to unicode
3824            and latin1. Fixes #1851 finally.
3825    
3826    2003-05-09  Jonathan Coles   <[email protected]>
3827    
3828            * test/test_classgen.py: New. Tests the Quantile algorithm.
3829    
3830            * Thuban/Model/classgen.py (ClassGenerator.CalculateQuantiles):
3831            Clean up debugging statement, add comments, fix a small bug in the
3832            returned adjusted percentiles.
3833            
3834    2003-05-09  Jonathan Coles   <[email protected]>
3835    
3836            Introduces Range class from SciParam into the ClassGroupRange class,
3837            and such ranges can now be saved and loaded from disk.
3838    
3839            Quantiles are now available in the Classification Generator.
3840    
3841            Initial support for building Queries on a table. Doesn't do anything
3842            but run some tests.
3843    
3844            * Thuban/Model/classification.py: Explicit imports.
3845            (ClassGroupRange): Use the Range class to store the underlying
3846            range information. The interface remains the same, except for
3847            GetRange(), and you can also supply a Range object as the min
3848            parameter to SetRange or __init__.
3849    
3850            * Thuban/Model/load.py (XMLReader.encode): New. Encodes the given
3851            string appropriately for use in Thuban. Fixes RTbug #1851.
3852            (SessionLoader.end_projection): Handle the context of the
3853            projection tag a bit better by looking at what objects are not
3854            None. There was an assumption that a projection tag for a map
3855            could occur before any layers.
3856            (SessionLoader.start_clrange): Provide backward compatibility for
3857            reading min/max values as well as the new range parameter.
3858    
3859            * Thuban/Model/map.py: Explicit imports.
3860    
3861            * Thuban/Model/resource.py: Import _.
3862            (ProjFileSaver.write): write header using projfile.dtd.
3863    
3864            * Thuban/Model/save.py: Explicit imports.
3865            (XMLWriter.encode): New. Encode the given string from a format
3866            used by Thuban into UTF-8. Fixes RTbug #1851.
3867    
3868            * Thuban/UI/classgen.py: Explicit imports.
3869            (ClassGenDialog.__init__): Clean up the code and add support
3870            for Quantiles.
3871            (ClassGenDialog.OnOK): Add support for Quantiles.
3872            (GenQuantilesPanel): New. Input panel for Quantiles.
3873            (ClassGenerator, CustomRamp, MonochromaticRamp, GreyRamp, RedRamp,
3874            GreenRamp, BlueRamp, HotToColdRamp): Move to Thuban/Model/classgen.py
3875    
3876            * Thuban/Model/classgen.py: New. Contains all the classes named above.
3877    
3878            * Thuban/UI/classifier.py: Explicit imports.
3879            (ClassTable.GetValueAsCust, ClassTable.__ParseInput,
3880            ClassTable.SetValueAsCustom): Reworked to use new Range class.
3881    
3882            * Thuban/UI/legend.py: Explicit imports.
3883    
3884            * Thuban/UI/mainwindow.py: Add support for the Join Dialog. Added
3885            a Table menu and associated method calls.
3886            (MainWindow.choose_color): Removed. No longer needed.
3887    
3888            * Thuban/UI/projdialog.py (ProjFrame.__VerifyButtons): Save button
3889            should be disabled if no projection is selected in the available
3890            list.
3891    
3892            * Thuban/UI/renderer.py: Explicit imports.
3893    
3894            * Thuban/UI/tableview.py (TableGrid.OnRangeSelect): Fix some issues
3895            with correctly selecting the rows and issuing the right events.
3896            Be sure to call Skip() to allow the grid to do some of its own
3897            handling which allows the rows to actually be selected.
3898            (LayerTableGrid.select_shapes): Rename from select_shape. Supports
3899            selecting multiple shapes.
3900            (LayerTableFrame): Support for building Queries.
3901            (LayerTableFrame.select_shapes): Allow multiple shapes to be selected.
3902    
3903            * Thuban/UI/tree.py: Explicit imports.
3904    
3905            * Thuban/UI/view.py (MapCanvas): Delegate "SelectedShapes" so the
3906            table view can call it.
3907    
3908            * test/test_classification.py: Explicit imports.
3909            (TestClassification.test_ClassGroupRange): Fix test for new
3910            Range class.
3911    
3912            * Doc/thuban.dtd: Add range parameter for clrange.
3913    
3914            * Thuban/Model/range.py: Taken from SciParam. Used as the underlying
3915            object in ClassGroupRange, and also uesd for inputting ranges in
3916            the classifer table and elsewhere.
3917    
3918            * Thuban/UI/join.py: New. Initial Join dialog. No real functionality
3919            yet.
3920    
3921    2003-05-09  Frank Koormann <[email protected]>
3922    
3923            * Thuban/UI/scalebar.py (DrawScaleBar): Draw only if interval > 0.0.
3924    
3925    2003-05-08  Frank Koormann <[email protected]>
3926    
3927            Coding style updates
3928    
3929            * test/test_scalebar.py: Replaced tab indentation by spaces.
3930    
3931            * Thuban/UI/scalebar.py: Explicit imports.
3932    
3933    2003-05-08  Frank Koormann <[email protected]>
3934    
3935            * Thuban/UI/scalebar.py
3936            (ScaleBar.DrawScalebar): Format string bug fixed.
3937    
3938    2003-05-08  Frank Koormann <[email protected]>
3939    
3940            Reorganization of scalebar component (no wx in Thuban/Model)
3941    
3942            * Thuban/Model/scalebar.py: Rendering moved to Thuban/UI/scalebar.py
3943            (deriveInterval):
3944            Calculate scalebar interval and unit which fits in width for scale.
3945            (roundInterval): Round float.
3946    
3947            * Thuban/UI/scalebar.py (ScaleBar): Scalebar rendering
3948    
3949            * test/test_scalebar.py: Test for Thuban/Model/scalebar.py methods.
3950    
3951            * Thuban/UI/legend.py: Import Thuban.UI.scalebar
3952    
3953    2003-05-08  Frank Koormann <[email protected]>
3954    
3955            * Thuban/UI/legend.py (ScalebarBitmap.SetCanvas):
3956            Initialize ScaleBar with canvas.map
3957    
3958            * Thuban/Model/scalebar.py (ScaleBar.roundInterval()): New,
3959            round intervals to display smarter lengths
3960            (ScaleBar.DrawScalebar): Draw Scalebar only if the map contains a
3961            layer. If the maps has no projection applied grey the scalebar.
3962    
3963    2003-05-07  Frank Koormann <[email protected]>
3964            
3965            Basic Scalebar features added.
3966    
3967            * Thuban/Model/scalebar.py (ScaleBar): New, scalebar rendering.
3968    
3969            * Thuban/UI/legend.py (LegendPanel): Added scalebar bitmap
3970            (ScaleBarBitmap): New, links the scalebar bitmap with view messages
3971            and the renderer.
3972    
3973            * Thuban/UI/view.py (MapCanvas.set_view_transform): Issue SCALE_CHANGED.
3974    
3975            * Thuban/UI/messages.py: SCALE_CHANGED added.
3976    
3977    2003-05-07  Bernhard Herzog  <[email protected]>
3978    
3979            * Thuban/Model/session.py (Session.__init__): New instance
3980            variable shapestores to hold a list of all open shapestore objects
3981            (Session.ShapeStores): New. Accessor method for the shapestores
3982            list.
3983            (Session._add_shapestore, Session._clean_weak_store_refs): New.
3984            Internal methods to maintain the shapestores list.
3985            (Session.Tables): New. Return all tables open in the session.
3986            (Session.OpenShapefile): Insert the new ShapeStore into the
3987            shapestores list.
3988    
3989            * test/test_session.py (TestSessionSimple.test_initial_state): Add
3990            tests for ShapeStores and Tables
3991            (TestSessionWithContent.test_shape_stores)
3992            (TestSessionWithContent.test_tables): New. Test cases for
3993            ShapeStores and Tables
3994    
3995    2003-05-07  Bernhard Herzog  <[email protected]>
3996    
3997            * Thuban/Model/transientdb.py (TransientTableBase.ReadRowAsDict):
3998            Add comments about the optimizations used.
3999            (AutoTransientTable.ReadValue, TransientTableBase.ReadValue): New.
4000            Implement the ReadValue table interface method.
4001    
4002            * test/test_transientdb.py
4003            (TestTransientTable.run_iceland_political_tests)
4004            (TestTransientTable.test_transient_joined_table): Add tests for
4005            ReadValue
4006    
4007    2003-05-07  Frank Koormann <[email protected]>
4008    
4009            * Resources/Bitmaps/fulllayerextent.xpm,
4010            Resources/Bitmaps/fullselextent.xpm: Replaced the place holders with
4011            new icons.
4012    
4013    2003-05-06  Bernhard Herzog  <[email protected]>
4014    
4015            * Thuban/Model/transientdb.py (AutoTransientTable.SimpleQuery):
4016            New. Simply delegate to the transient table's version.
4017    
4018            * test/test_transientdb.py
4019            (TestTransientTable.test_auto_transient_table_query): New. Test
4020            case for AutoTransientTable's SimpleQuery
4021    
4022    2003-05-06  Bernhard Herzog  <[email protected]>
4023    
4024            * Thuban/Model/transientdb.py (TransientTableBase.SimpleQuery):
4025            Implement a simple query method for the query dialog
4026            (TransientTableBase.create): Add an INTEGER PRIMARY KEY that holds
4027            the row index or shapeid.
4028            (TransientTable.create): Insert the right value of the row index
4029            (TransientJoinedTable.create): Copy the row index of the left
4030            table to the joined result table
4031    
4032            * test/test_transientdb.py
4033            (TestTransientTable.test_transient_table_read_twice): Fix
4034            doc-string
4035            (TestTransientTable.test_transient_table_query): New. Test for the
4036            SimpleQuery method
4037    
4038    2003-05-06  Bernhard Herzog  <[email protected]>
4039    
4040            Convert all table users to use the new table interface. This only
4041            covers Thuban itself, not GREAT-ER or other applications built on
4042            Thuban yet, so the compatibility interface stays in place for the
4043            time being but it now issues DeprecationWarnings.
4044    
4045            Finally, the new Table interface has a new method, HasColumn.
4046    
4047            * Thuban/Model/table.py (OldTableInterfaceMixin): All methods
4048            issue deprecation warnings when they're. The warnings refer to the
4049            caller of the method.
4050            (OldTableInterfaceMixin.__deprecation_warning): New. Helper method
4051            for the deprecation warnings
4052    
4053            * test/test_table.py: Ignore the deprecation warnings for the old
4054            table in the tests in this module. The purpose of the tests is to
4055            test the old interface, after all.
4056    
4057            * test/test_transientdb.py
4058            (TestTransientTable.run_iceland_political_tests): Use the
4059            constants for the types. Add a test for HasColumn
4060            (TestTransientTable.test_transient_joined_table): Adapt to new
4061            table interface. Add a test for HasColumn
4062            (TestTransientTable.test_transient_table_read_twice): Adapt to new
4063            table interface
4064    
4065            * Thuban/UI/tableview.py (DataTable.SetTable, DataTable.GetValue):
4066            Adapt to new table interface
4067    
4068            * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Adapt to
4069            new table interface
4070    
4071            * Thuban/UI/controls.py (RecordListCtrl.fill_list)
4072            (RecordTable.SetTable): Adapt to new table interface
4073    
4074            * Thuban/UI/classifier.py (Classifier.__init__)
4075            (Classifier.__init__): Adapt to new table interface
4076    
4077            * Thuban/UI/classgen.py (ClassGenDialog.__init__)
4078            (GenUniformPanel._OnRetrieve, GenUniquePanel._OnRetrieve): Adapt
4079            to new table interface
4080    
4081            * Thuban/Model/transientdb.py (TransientTableBase.HasColumn)
4082            (AutoTransientTable.HasColumn): Implement the new table interface
4083            method
4084            (AutoTransientTable.ReadRowAsDict, AutoTransientTable.ValueRange)
4085            (AutoTransientTable.UniqueValues): Adapt to new table interface
4086    
4087            * Thuban/Model/layer.py (Layer.SetShapeStore, Layer.GetFieldType):
4088            Adapt to new table interface
4089    
4090            * test/test_layer.py (TestLayer.open_shapefile): Helper method to
4091            simplify opening shapefiles a bit easier.
4092            (TestLayer.test_arc_layer, TestLayer.test_polygon_layer)
4093            (TestLayer.test_point_layer): Use the new helper method
4094            (TestLayer.test_get_field_type): New. Test for the GetFieldType
4095            method
4096    
4097            * test/test_dbf_table.py (TestDBFTable.test_has_column): Test for
4098            the new table method
4099    
4100            * test/test_memory_table.py (TestMemoryTable.test_has_column):
4101            Test for the new table method HasColumn
4102    
4103    2003-05-06  Jonathan Coles   <[email protected]>
4104    
4105            Addresses the "Selection Extent" wish of RTbug #1787.
4106    
4107            * Resources/Bitmaps/fulllayerextent.xpm,
4108            Resources/Bitmaps/fullselextent.xpm: Bitmaps for layer and selection
4109            extent. These are just place holders for the real bitmaps.
4110    
4111            * Thuban/Model/layer.py (Shape): Since a Shape is immutable only
4112            calculate the bounding box once (the first time compute_bbox() is
4113            called).
4114            (Layer.ShapesBoundingBox): New. Given a list of shape ids, return
4115            the bounding box for the shapes in lat/long coordinates.
4116    
4117            * Thuban/UI/mainwindow.py: Added new "Full selection extent" menu
4118            option.
4119            (MainWindow.has_selected_shapes): New. Returns true if there are
4120            any selected shapes.
4121            (MainWindow.FullSelectionExtent): New. Calls
4122            MapCanvas.FitSelectedToWindow() when the user selects the menu option.
4123            (_has_selected_shapes): New. Returns true if there are any
4124            selected shapes.
4125    
4126            * Thuban/UI/selection.py (Selection.HasSelectedShapes): New. Returns
4127            true if there are any selected shapes.
4128    
4129            * Thuban/UI/view.py (MapCanvas): Added delegated method
4130            HasSelectedShapes.
4131            (MapCanvas.FitSelectedToWindow): New. Centers and scales any selected
4132            shapes on the canvas using the map projection (if any).
4133    
4134            * test/test_layer.py (TestLayer.test_arc_layer): Add some tests
4135            for Layer.ShapesBoundingBox().
4136    
4137    2003-05-06  Bernhard Herzog  <[email protected]>
4138    
4139            * Resources/Projections/defaults.proj: Fix spelling of Mercator
4140    
4141    2003-05-05  Jonathan Coles   <[email protected]>
4142    
4143            Addresses the "Full Layer Extent" wish of RTbug #1787.
4144    
4145            * Resources/Projections/defaults.proj: Added UK National Grid.
4146    
4147            * Thuban/UI/mainwindow.py: Added new "Full layer extent" menu option.
4148            (MainWindow.FullLayerExtent): New. Calls MapCanvas.FitLayerToWindow()
4149            when the user selects the menu option.
4150    
4151            * Thuban/UI/view.py (MapCanvas.FitLayerToWindow): New. Centers and
4152            scales the given layer on the canvas using the map projection.
4153    
4154    2003-05-05  Bernhard Herzog  <[email protected]>
4155    
4156            Convert the table implementations to a new table interface. All
4157            tables use a common mixin class to provide backwards compatibility
4158            until all table users have been updated.
4159    
4160            * Thuban/Model/table.py (OldTableInterfaceMixin): Mixin class to
4161            provide backwards compatibility for table classes implementing the
4162            new interface
4163            (DBFTable, MemoryTable): Implement the new table interface. Use
4164            OldTableInterfaceMixin as base for compatibility
4165            (DBFColumn, MemoryColumn): New. Column description for DBFTable
4166            and MemoryTable resp.
4167    
4168            * test/test_dbf_table.py: New. Test cases for the DBFTable with
4169            the new table interface.
4170    
4171            * test/test_memory_table.py: New. Test cases for the MemoryTable
4172            with the new table interface.
4173    
4174            * test/test_table.py: Document the all tests in this file as only
4175            for backwards compatibility. The equivalent tests for the new
4176            interface are in test_memory_table.py and test_dbf_table.py
4177            (MemoryTableTest.test_read): field_info should be returning tuples
4178            with four items
4179            (MemoryTableTest.test_write): Make doc-string a more precise.
4180    
4181            * Thuban/Model/transientdb.py (TransientTableBase): Convert to new
4182            table interface. Derive from from OldTableInterfaceMixin for
4183            compatibility.
4184            (TransientTableBase.create): New intance variable column_map to
4185            map from names and indices to column objects
4186            (TransientTable.create): Use the new table interface of the input
4187            table
4188            (AutoTransientTable): Convert to new table interface. Derive from
4189            from OldTableInterfaceMixin for compatibility.
4190            (AutoTransientTable.write_record): Removed. It's not implemented
4191            yet and we still have to decide how to handle writing with the new
4192            table and data framework.
4193    
4194            * test/test_transientdb.py
4195            (TestTransientTable.run_iceland_political_tests)
4196            (TestTransientTable.test_transient_joined_table): Use the new
4197            table interface
4198    
4199    2003-05-05  Jonathan Coles   <[email protected]>
4200    
4201            This is namely a collection of UI updates to improve user interactivity.
4202            Tabbing between controls now exists and you can use ESC to close dialog
4203            boxes; ENTER will active the default button.
4204    
4205            * Thuban/UI/classgen.py (ClassGenDialog.__init__): Rearrange the
4206            order that the controls are created so that tabbing works correctly.
4207            (ClassGenDialog.OnOK): Renamed from _OnGenerate() so that the
4208            wxDialog can handle the default button correctly.
4209            (ClassGenDialog.OnCancel): Renamed from _OnCloseBtn() for the
4210            same reasons as for OnOK.
4211            (GenUniformPanel._OnRetrieve): Call wxBeginBusyCursor/wxEndBusyCursor
4212            when we ask the table for the maximum/minimum values of a field
4213            which could take a very long time.
4214    
4215            * Thuban/UI/classifier.py (Classifier.__init__): Rearrange the
4216            order that the controls are created so that tabbing works correctly.
4217            (SelectPropertiesDialog.__init__): Rearrange the order that the
4218            controls are created so that tabbing works correctly.
4219    
4220            * Thuban/UI/dialogs.py: Copied NonModalDialog box and changed it
4221            to derive from a wxDialog but behave like the original implementation
4222            which was derived from a wxFrame. wxDialog provides useful key
4223            handling functionality like ESC calling OnCancel and ENTER calling
4224            OnOK which is lost with wxFrame.
4225    
4226            * Thuban/UI/mainwindow.py: Add "..." to menu items that will open
4227            new dialogs.
4228    
4229            * Thuban/UI/projdialog.py (ProjFrame.__init__): Rearrange the
4230            order that the controls are created so that tabbing works correctly.
4231            (ProjFrame.OnApply): Renamed from _OnTry() to use wxDialog behaviour.
4232            (ProjFrame.OnOK): Renamed from _OnOK() to use wxDialog behaviour.
4233            (ProjFrame.OnCancel): Renamed from _OnClose() to use wxDialog behaviour.
4234            (ProjPanel.__init__): Add "Airy" to the list of ellipsoids so we
4235            can provide the "UK National Grid" as a default projection.
4236            (UTMPanel.__init__): Rearrange the order that the controls are
4237            created so that tabbing works correctly.
4238    
4239    2003-05-05  Bernhard Herzog  <[email protected]>
4240    
4241            * extensions/thuban/wxproj.cpp: Fix some of the comments.
4242            (project_point): If a map projection but no layer projection is
4243            given, convert degrees to radians before applying the map
4244            projection.
4245    
4246            * Thuban/UI/tableview.py (TableGrid.disallow_messages)
4247            (TableGrid.allow_messages): New methods to make it possible to
4248            inhibit message sending.
4249            (TableGrid.issue): Only send the message if not inhibited.
4250            (LayerTableGrid.select_shape): Use the new methods to make sure
4251            that no ROW_SELECTED message is sent while we're updating the
4252            selected rows to match the selected shapes.
4253    
4254    2003-05-02  Jan-Oliver Wagner <[email protected]>
4255    
4256            Implementation of MemoryTable.
4257    
4258            * Thuban/Model/table.py (MemoryTable): New. Quite simple table
4259            implementation that operates on a list of tuples. All of the data
4260            are kept in the memory.
4261    
4262            * test/test_table.py (MemoryTableTest): New.
4263    
4264            * test/test_transientdb.py (SimpleTable): Removed.
4265            (TestTransientTable.test_transient_joined_table,
4266            (TestTransientTable.test_transient_table_read_twice): Replaced
4267            SimpleTable by MemoryTable.
4268    
4269    2003-04-30  Jonathan Coles   <[email protected]>
4270    
4271            * Data/iceland_sample.thuban: Now contains correct projections
4272            for each of the layers.
4273    
4274            * Resources/Projections/defaults.proj: Geographic projection
4275            contains unit conversion parameter.
4276    
4277    2003-04-30  Jonathan Coles   <[email protected]>
4278    
4279            The most important part of this putback is the projection changes.
4280            It should now be possible to specify the projection that a layer
4281            is in and then specify a different projection for the map. The
4282            projection dialog has an extra parameter for a geographic projection
4283            which lets the user select if the input is in degrees or radians.
4284    
4285            * Thuban/Model/layer.py (Layer.ShapesInRegion): Fix docstring
4286            to say that the parameter is a tuple of unprojected
4287            points (which is what the callers to this method were assuming).
4288            Also, since the points are unprojected we need to projected them.
4289    
4290            * Thuban/UI/legend.py (LegendTree.MoveCurrentItemUp,
4291            LegendTree.MoveCurrentItemDown): If the layer or any of the layer's
4292            groups are selected, move the layer up/down. Fixes RTbug #1833.
4293    
4294            * Thuban/UI/mainwindow.py: Move menu item map_rename up.
4295    
4296            * Thuban/UI/projdialog.py (ProjFrame._OnSave): Add missing
4297            parameter in call to SetClientData.
4298            (GeoPanel): Add support for selecting the units that the
4299            source data is in (Radians or Degrees).
4300    
4301            * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Optimize
4302            the rendering loop by reducing the number of if's, removing the
4303            unnecessary try/except block, and checking if the old group
4304            is the same as the new one (which happens a lot if there is
4305            no classification, or lots of shapes are in the same group).
4306    
4307            * Thuban/UI/view.py (MapCanvas.OnPaint): Add a try/except block
4308            around the redraw routine to try to catch problems that the user
4309            may create by selecting invalid projections for the data set and
4310            map. Clears the display if there are any problems and prints the
4311            error.
4312            (MapCanvas.do_redraw): Use DC.Clear() instead of drawing a filled
4313            rectangle.
4314    
4315            * extensions/thuban/wxproj.cpp (project_point): First invert the
4316            supplied point (which should be in projected coordinates) using
4317            the layer's projection and then project the point using the
4318            map's projection.
4319            (project_points): Use project_point() to project each point.
4320    
4321    2003-04-30  Jan-Oliver Wagner <[email protected]>
4322    
4323            * Thuban/Model/layer.py (Layer.SetShapeStore): Fixed a bug:
4324            don't set the Classification to None if the classfication field
4325            is None (ie only a DEFAULT).
4326    
4327    2003-04-30  Bernhard Herzog  <[email protected]>
4328    
4329            * Thuban/UI/view.py: Fix some typos.
4330    
4331            * Thuban/UI/mainwindow.py (MainWindow.identify_view_on_demand): Do
4332            not pop up the dialog if the selection becomes empty (this could
4333            happen if e.g. a new selection is opened while the identify tool
4334            is active and dialog had been closed)
4335    
4336    2003-04-30  Bernhard Herzog  <[email protected]>
4337    
4338            * Thuban/Model/transientdb.py (TransientTableBase.__init__): New
4339            instance variable read_record_last_result
4340            (TransientTableBase.read_record): Make sure reading the same
4341            record twice works. The implementation uses the new instance
4342            variable read_record_last_result
4343    
4344            * test/test_transientdb.py
4345            (TestTransientTable.test_transient_table_read_twice): New test
4346            case for the above bug-fix.
4347    
4348    2003-04-29  Jonathan Coles   <[email protected]>
4349    
4350            * Thuban/common.py: Removed. No longer needed Str2Num. RTbug #1832.
4351    
4352            * Thuban/UI/classgen.py: Remove all uses of Str2Num.
4353    
4354            * Thuban/UI/classifier.py: Remove all uses of Str2Num.
4355            (ClassTable.SetValueAsCustom): Rename keyword argument in
4356            ClassGroup* constructors to match argument name.
4357    
4358    2003-04-29  Bernhard Herzog  <[email protected]>
4359    
4360            * Thuban/Model/session.py (Session.Destroy): Explicitly close the
4361            transient DB if it exists to make sure it doesn't leave a journal
4362            file in the temp directory.
4363    
4364            * Thuban/Model/transientdb.py (TransientDatabase.close): Set
4365            self.conn to None after closing the connection to make sure it's
4366            not closed twice
4367    
4368    2003-04-29  Jonathan Coles   <[email protected]>
4369    
4370            Add a visible parameter in the layer XML tag. The default value is
4371            "true". If anything other than "false" is specified we also assume
4372            "true". Addresses RTbug #1025.
4373    
4374            * Doc/thuban.dtd: Add visible parameter to a layer.
4375    
4376            * Thuban/Model/layer.py (BaseLayer.__init__): Change default value
4377            of visible from 1 to True.
4378            (Layer.__init__): Change default value of visible from 1 to True.
4379    
4380            * Thuban/Model/load.py (SessionLoader.start_layer): Read visible
4381            parameter.
4382    
4383            * Thuban/Model/save.py (SessionSaver.write_layer): Save visible
4384            parameter.
4385    
4386            * test/test_load.py: Add new test data contents_test_visible.
4387            (LoadSessionTest.setUp): save test data.
4388            (LoadSessionTest.testLayerVisibility): Test if the visible flag
4389            is loaded correctly.
4390    
4391            * test/test_save.py (SaveSessionTest.testSingleLayer): Add test
4392            for saving an invisible layer.
4393    
4394    2003-04-29  Jonathan Coles   <[email protected]>
4395    
4396            * Thuban/UI/mainwindow.py (MainWindow.SetMap): Look up the
4397            legend dialog box and tell it to change its map to the one
4398            supplied to SetMap(). Fixes RTbug #1770.
4399    
4400  2003-04-29  Bernhard Herzog  <[email protected]>  2003-04-29  Bernhard Herzog  <[email protected]>
4401    
4402          Next step of table implementation. Introduce a transient database          Next step of table implementation. Introduce a transient database
# Line 51  Line 4450 
4450          once. Plus it introduces a reference cycle that keeps can keep the          once. Plus it introduces a reference cycle that keeps can keep the
4451          session object alive for a long time.          session object alive for a long time.
4452    
4453  2003-04-25  Jonathan Coles   <[email protected]>  2003-04-29  Jonathan Coles   <[email protected]>
4454    
4455          * Thuban/Model/proj.py (Projection): Removed Set*() methods to make          * Thuban/Model/proj.py (Projection): Removed Set*() methods to make
4456          Projection an immutable item. Fixes RTbug #1825.          Projection an immutable item. Fixes RTbug #1825.

Legend:
Removed from v.766  
changed lines
  Added in v.1688

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26