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

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

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26