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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1801 - (hide annotations)
Thu Oct 9 12:47:56 2003 UTC (21 years, 5 months ago) by jan
Original Path: trunk/thuban/ChangeLog
File size: 294575 byte(s)
added create_epsg, the first devtool

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

Properties

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

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26