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

Legend:
Removed from v.55  
changed lines
  Added in v.1716

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26