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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1760 - (hide annotations)
Fri Sep 26 18:36:12 2003 UTC (21 years, 5 months ago) by bh
Original Path: trunk/thuban/ChangeLog
File size: 287900 byte(s)
update ChangeLog

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

Properties

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

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26