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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1792 - (hide annotations)
Wed Oct 8 14:48:12 2003 UTC (21 years, 5 months ago) by jan
Original Path: trunk/thuban/ChangeLog
File size: 293625 byte(s)
a small bug-fix

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

Properties

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

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26