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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1810 - (hide annotations)
Fri Oct 10 17:00:23 2003 UTC (21 years, 4 months ago) by bh
Original Path: trunk/thuban/ChangeLog
File size: 296406 byte(s)
update ChangeLog

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

Properties

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

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26