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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1799 - (hide annotations)
Thu Oct 9 10:17:59 2003 UTC (21 years, 5 months ago) by bh
Original Path: trunk/thuban/ChangeLog
File size: 294339 byte(s)
update ChangeLog

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

Properties

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

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26