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

Legend:
Removed from v.514  
changed lines
  Added in v.1775

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26