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

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

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 766 by bh, Tue Apr 29 12:42:27 2003 UTC revision 1807 by bh, Fri Oct 10 10:36:43 2003 UTC
# Line 1  Line 1 
1    2003-10-10  Bernhard Herzog  <[email protected]>
2    
3            * Thuban/UI/projdialog.py (ProjFrame.build_dialog): New method
4            that contains all the setup for the dialog's widgets, layout and
5            event handling.
6            (__): Call build_dialog to build the dialog.
7            (ProjFrame.__set_properties, ProjFrame.__do_layout): Removed.
8            Their functionality is now in build_dialog
9            (ProjFrame.__VerifyButtons, ProjFrame.__VerifyButtons)
10            (ProjFrame.__DoOnProjAvail, ProjFrame.__DoOnProjAvail)
11            (ProjFrame.__DoOnProjChoice): Small updates due to slightly
12            different widget names and hierarchy introduced with build_dialog.
13    
14    2003-10-10  Bernhard Herzog  <[email protected]>
15    
16            * README: Fix typo.
17    
18    2003-10-09  Bernhard Herzog  <[email protected]>
19    
20            * Thuban/Model/proj.py (ProjFile.Add): Do not check whether the
21            projection is already in the list. This is *a lot* faster when
22            loading files with hundreds of projections since it saves a linear
23            search. OTOH this will allow adding the same projection to the
24            user.proj file multiple times in the projection dialog but we'll
25            deal with that later
26    
27    2003-10-09  Jan-Oliver Wagner <[email protected]>
28    
29            * devtools: New. Directory for developer tools that are not intended
30            for the regular user.
31    
32            * devtools/create_epsg.py: New. Convert the epsg file of proj into
33            a python .proj file.
34    
35    2003-10-09  Bernhard Herzog  <[email protected]>
36    
37            * test/test_proj.py
38            (TestProjection.test_get_parameter_without_equals_sign): New. Test
39            whether GetParameter handles parameters without "=" sign correctly
40    
41            * Thuban/Model/proj.py (Projection.GetParameter): Handle
42            parameters that do not contain a "=". Update the doc-string
43    
44    2003-10-08  Bernhard Herzog  <[email protected]>
45    
46            * Thuban/UI/projdialog.py (ProjFrame.__set_properties): Remove the
47            length limit on the projname text control
48    
49    2003-10-08  Bernhard Herzog  <[email protected]>
50    
51            * test/test_proj.py (TestProjection.test_get_projection_units_geo)
52            (TestProjection.test_get_projection_units_normal): New. Tests for
53            the Projection.GetProjectedUnits method
54    
55    2003-10-08  Jan-Oliver Wagner <[email protected]>
56    
57            * Thuban/Model/resource.py (get_user_proj_file): small bug-fix:
58            Added missing 'val' parameter.
59    
60    2003-10-08  Bernhard Herzog  <[email protected]>
61    
62            * Thuban/UI/projdialog.py (ProjFrame.__DoOnProjAvail): When the
63            projection type of the currently selected projection is not known,
64            i.e. there's no panel for it, use the UnknownProjPanel
65            (ProjFrame.__DoOnProjChoice, ProjFrame._show_proj_panel): Split
66            the actual replacing of the proj panel into the new method
67            _show_proj_panel.
68            (UnknownProjPanel): Add doc-string.
69            (UnknownProjPanel._DoLayout): Insert a newline into the text so
70            that the panel is not so wide.
71    
72    2003-10-08  Bernhard Herzog  <[email protected]>
73    
74            * Thuban/Model/resource.py (read_proj_file): Return the warnings
75            too. Update the doc-string
76            (get_proj_files): Removed. It wasn't used anywhere
77            (get_system_proj_files, get_system_proj_file): Rename to
78            get_system_proj_file and return the ProjFile object and not a list
79            of ProjFile objects. Update the callers.
80            (get_user_proj_files, get_user_proj_file): Rename to
81            get_user_proj_file return the ProjFile object and not a list of
82            ProjFile objects. Update the callers.
83            (ProjFileReader.__init__): New instance variable for the warnings.
84            Rename the __pf ivar to projfile. Update the methods referring to
85            __pf
86            (ProjFileReader.end_projection): Catch any errors raised when
87            instantiating the projection and record that as an error. The
88            projection will not be in the final ProjFile object.
89            (ProjFileReader.GetWarnings): New method to return the warnings.
90    
91            * Thuban/UI/projdialog.py (ProjFrame.show_warnings): New method to
92            show the warnings from the projfile reader
93            (ProjFrame._OnImport): Deal with any warnings returned by
94            read_proj_file
95            (ProjFrame.__FillAvailList): Deal with any warnings returned by
96            get_system_proj_file or get_user_proj_file.
97    
98            * test/test_proj.py (TestProjFile.doTestRead): Check the warnings.
99            (TestProjFileWithInvalidParameters.file_contents): New test cases
100            to test whether read_proj_file handles invalid projection
101            parameters correctly
102            (TestProjFile.test_get_system_proj_file): New. Simple test for
103            resource.get_system_proj_file
104    
105    2003-10-07  Bernhard Herzog  <[email protected]>
106    
107            * test/test_derivedshapestore.py
108            (TestDerivedShapeStoreExceptions.tearDown): Clear the session
109            properly so that the temporary directories get deleted correctly
110    
111    2003-10-06  Bernhard Herzog  <[email protected]>
112    
113            Handle the title changes in a proper MVC way.
114    
115            * Thuban/UI/mainwindow.py (MainWindow.__init__): Subscribe to the
116            canvas' TITLE_CHANGED messages
117            (MainWindow.update_title): New. Update the main window's title
118            (MainWindow.__SetTitle): Removed. Use update_title instead.
119            (MainWindow.SetMap): Use update_title instead of __SetTitle
120            (MainWindow.RenameMap): Do change the window title explicitly
121            here. That's handled in a proper MVC way now.
122            (MainWindow.title_changed): New. Subscriber for the TITLE_CHANGED
123            messages
124    
125            * Thuban/Lib/connector.py (Conduit): New class to help classes
126            that forward messages
127    
128            * Thuban/UI/viewport.py: Forward the map's TITLE_CHANGED messages
129            (ViewPort): Derive from Conduit instead of Publisher
130            (ViewPort.Subscribe, ViewPort.Unsubscribe): Use the new base class
131            when calling the inherited versions
132            (ViewPort._subscribe_map, ViewPort._unsubscribe_map): New helper
133            methods to subscribe and unsubscribe map messages
134            (ViewPort.SetMap, ViewPort.Destroy): Use the new helper methods to
135            handle the map subscriptions
136            (ViewPort.Map, ViewPort.map_projection_changed)
137            (ViewPort.layer_projection_changed): Add or update doc-strings
138    
139            * test/test_connector.py (TestPublisher.test_issue_simple): Fix
140            typo
141            (MyConduit): Helper class for the Conduit test.
142            (TestConduit): Test cases for Conduit
143    
144            * test/test_connector.py: Use support.run_tests as main.
145    
146            * test/test_viewport.py (ViewPortTest.setUp): Also subscribe to
147            the TITLE_CHANGED messages
148            (ViewPortTest.test_forwarding_title_changed): New test to check
149            whether the viewport forwards the map's TITLE_CHANGED messages
150            (TestViewportWithPostGIS.tearDown): Call the map's Destroy method
151            after the port's because the latter may require a still functional
152            map.
153    
154    2003-10-06  Bernhard Herzog  <[email protected]>
155    
156            * Thuban/UI/application.py (ThubanApplication.maps_changed): Add
157            doc-string
158    
159    2003-10-06  Bernhard Herzog  <[email protected]>
160    
161            * test/test_viewport.py (ViewPortTest.setUp)
162            (SimpleViewPortTest.test_init_with_size): Move the test for the
163            initial size as a constructor parameter from ViewPortTest.setUp
164            method to a new separate test in SimpleViewPortTest.
165    
166    2003-10-06  Bernhard Herzog  <[email protected]>
167    
168            * test/test_viewport.py (MockView): New class derived from
169            ViewPort with a mock implementation of GetTextExtent to be used in
170            the test cases
171            (ViewPortTest.setUp): Use MockView instead of ViewPort
172    
173            * Thuban/UI/viewport.py (ViewPort.GetTextExtent): Turn this method
174            into what would be a "pure virtual function" in C++: always raise
175            NotImplementedError. Mock implementations for test cases don't
176            belong into the real code
177    
178    2003-10-02  Bernhard Herzog  <[email protected]>
179    
180            * test/test_layer.py (TestLayer.test_empty_layer): Explicitly
181            close the dbf file we create so that it's contents have been
182            written properly.
183    
184            * libraries/shapelib/shptree.c, libraries/shapelib/shpopen.c,
185            libraries/shapelib/shapefil.h, libraries/shapelib/dbfopen.c:
186            Update to shapelib 1.2.10
187    
188    2003-10-01  Jan-Oliver Wagner <[email protected]>
189    
190            * Thuban/UI/tree.py, Thuban/UI/main.py: Remove the #! line as
191            it annoys lintian which warns about these files not being
192            executable. The #! isn't necessary here since if you absolutely
193            must execute them you can always say "python <filename>".
194    
195    2003-09-26  Bernhard Herzog  <[email protected]>
196    
197            * Thuban/Model/classgen.py (GenQuantiles0): Removed since it's
198            only used in GREAT-ER but not used in Thuban itself. When GREAT-ER
199            is ported to a newer the import will fail, so it should be noticed
200            immediately that this function is gone.
201            Fixes RT#1919
202    
203    2003-09-26  Bernhard Herzog  <[email protected]>
204    
205            Add a DTD for the projection files and make thuban write valid
206            projection files
207    
208            * Resources/XML/projfile.dtd: New. DTD for thuban's projection
209            files
210    
211            * Thuban/Model/resource.py (ProjFileSaver.write): Use
212            'projectionlist' as the name in the document type declaration so
213            that it matches the element type of the root element.
214    
215            * test/test_proj.py (sample_projfile, sample_projfile2): Use
216            'projectionlist' as the name in the document type declaration just
217            as it is done now in the files thuban would write
218            (sample_projfile, sample_projfile_data): Fix spelling of
219            "Mercator"
220            (TestProjFile.doTestWrite): Validate the written and the expected
221            XML data
222            (TestProjFile): Derive from ValidationTest so that we can run xml
223            validation tests
224    
225    2003-09-24  Bernhard Herzog  <[email protected]>
226    
227            * Thuban/UI/renderer.py (ExportRenderer.render_legend): Do not
228            modify the list returned by map.Layers() in place since it is the
229            actual list of layers used by the map.
230    
231    2003-09-23  Jan-Oliver Wagner <[email protected]>
232    
233            * Doc/manual/thuban-manual.xml: Added subsection to chapter
234            Extensions to describe the extensions coming with the Thuban
235            standard package (gns2shp and importAPR).
236    
237    2003-09-23  Bernhard Herzog  <[email protected]>
238    
239            * libraries/thuban/wxproj.cpp (project_point): if there's an
240            inverse but no forward projection, convert to degrees after
241            applying the inverse projection. Fixes RT#2096
242    
243            * test/test_wxproj.py: New. Test cases for wxproj.so. One test
244            implicitly tests for the fix to RT#2096
245    
246            * test/support.py (FloatComparisonMixin.assertFloatSeqEqual):
247            Check that the sequences have the same lengths
248    
249            * Resources/Projections/defaults.proj (Geographic projection): Use
250            a much more precise value for the to_meter attribute.
251    
252    2003-09-22  Bernhard Herzog  <[email protected]>
253    
254            * test/support.py (initthuban): Make sure to unset the LANG env.
255            var. so that tests that compare translated strings work. Solves RT
256            #2094
257    
258    2003-09-22  Jan-Oliver Wagner <[email protected]>
259    
260            Small improvement of APR import.
261    
262            * Extensions/importAPR/test/test_apr.py (aprTest.test_LClass):
263            Added tests for text-ranges.
264    
265            * Extensions/importAPR/apr.py (APR_LClass.GetThubanRange): Now
266            returns a string object if the range is based on text.
267    
268            * Extensions/importAPR/importAPR.py (import_apr_dialog): Unified
269            range retrieval.
270    
271    2003-09-22  Jan-Oliver Wagner <[email protected]>
272    
273            Initial version of the importAPR extension which is in
274            experimental state.
275    
276            * /Extensions/importAPR/, /Extensions/importAPR/samples/,
277            /Extensions/importAPR/test/: New directories.
278    
279            * /Extensions/importAPR/samples/README: New: Howto load the samples.
280    
281            * /Extensions/importAPR/samples/iceland.apr: New: A sample APR
282            file which refers to the Thuban Iceland demo data.
283    
284            * /Extensions/importAPR/test/README: New: Howto execute the tests.
285    
286            * /Extensions/importAPR/test/test_apr.py: New: Tests for APR classes.
287    
288            * /Extensions/importAPR/apr.py: New: Classes for ArcView Objects
289            as in '.apr'-files.
290    
291            * /Extensions/importAPR/odb.py: New: Classes for generic ArcView
292            ODB Objects as in '.apr', '.avl' and other files.
293    
294            * /Extensions/importAPR/__init__.py: New: Init to make this
295            directory a package.
296    
297            * /Extensions/importAPR/importAPR.py: New: Import a ArcView
298            project file (.apr) and convert it to Thuban.
299    
300    2003-09-22  Jan-Oliver Wagner <[email protected]>
301    
302            * Extensions/gns2shp.gns2shp.py: The main module of gns2shp.
303    
304    2003-09-19  Jan-Oliver Wagner <[email protected]>
305    
306            * Doc/manual/thuban-manual.xml: Extended section 'Installation'
307            with description on RPM installation and RPM binary package
308            creation.
309    
310    2003-09-18  Bernhard Herzog  <[email protected]>
311    
312            * setup.py (data_files): Only add the mo files if the Locales
313            directory actually exists, so that setup.py works with a fresh CVS
314            checkout
315    
316    2003-09-12  Jan-Oliver Wagner <[email protected]>
317    
318            * Examples/simple_extensions/simple_tool.py: bugfix: Tool is now
319            in viewport, not anymore in view
320    
321    2003-09-04  Jan-Oliver Wagner <[email protected]>
322    
323            Introducing first Extension (gns2shp).
324    
325            * Extensions, Extensions/gns2shp, Extensions/gns2shp/test: New.
326    
327            * Extensions/__init__.py: New. init to make this dir a package.
328    
329            * Extensions/gns2shp/__init__.py: New. init to make this dir a package.
330    
331            * Extensions/gns2shp/test/README: New. some info on this test directory.
332    
333            * Extensions/gns2shp/test/ls.txt: New. test data set (Liechtenstein).
334    
335            * Extensions/gns2shp/test/test_gns2shp.py: New. Test for correct creation
336            of Shapefile from GNS text file format
337    
338    2003-09-03  Jan-Oliver Wagner <[email protected]>
339    
340            Fix/workaround for bug #2019:
341            https://intevation.de/rt/webrt?serial_num=2019
342    
343            * Thuban/UI/identifyview.py (IdentifyView.ID_STOP): New.
344            (IdentifyView.__init__): Added another button that allows to
345            stop the identify mode.
346            (IdentifyView.OnStop): New. Stops the identify mode.
347    
348    2003-09-03  Jan-Oliver Wagner <[email protected]>
349    
350            Introducing a new exception dialog that allows to exit the
351            application immediately.
352            This fixes bug #2060: https://intevation.de/rt/webrt?serial_num=2060
353    
354            * Thuban/UI/exceptiondialog.py: New. A special exception dialog.
355    
356            * Thuban/UI/application.py (ThubanApplication.ShowExceptionDialog):
357            Made strings available to translations. Exchanged the simple
358            ScrolledMessageDialog by the new ExceptionDialog.
359    
360    2003-09-01  Bernhard Herzog  <[email protected]>
361    
362            * NEWS: New. Summary of changes and release notes.
363    
364            * MANIFEST.in: Add NEWS
365    
366    2003-09-01  Bernhard Herzog  <[email protected]>
367    
368            * MANIFEST.in: Correct the include statement for the mo-files and
369            include the documentation too.
370    
371            * setup.py (data_files): Add the .mo files
372            (setup call): Up to version 0.9.0
373    
374    2003-09-01  Bernhard Herzog  <[email protected]>
375    
376            * Thuban/UI/dbdialog.py (ChooseDBTableDialog.__init__): Change the
377            parameter list to just parent and session
378            (ChooseDBTableDialog.__set_properties): Removed. Setting the
379            selection of empty list boxes is not allowed (and produces C++
380            assertion errors) and the rest of the setup is better done in
381            __init__ anyway.
382            (ChooseDBTableDialog.OnCancel, ChooseDBTableDialog.OnOK)
383            (ChooseDBTableDialog.OnLBDClick, DBDialog.OnOK): Use the Python
384            builtins True/False for booleans to avoid warnings from wxPython
385    
386            * Thuban/UI/mainwindow.py (MainWindow.AddDBLayer): Adapt to new
387            ChooseDBTableDialog constructor parameters.
388    
389    2003-09-01  Bernhard Herzog  <[email protected]>
390    
391            * Thuban/Model/postgisdb.py
392            (PostGISTable): Extend doc-string
393            (PostGISTable._fetch_table_information): Set the column index
394            correctly, pretending ignored columns don't exist.
395    
396            * test/test_postgis_db.py (TestPostGISIgnoredColumns): New tests
397            for postgis tables with data types not yet supported by thuban.
398    
399    2003-08-29  Bernhard Herzog  <[email protected]>
400    
401            * HOWTO-Release: Tweak item about running the tests.
402    
403    2003-08-29  Jan-Oliver Wagner <[email protected]>
404    
405            * /Doc/manual/thuban-manual.xml: updated to version 1.0pre2.
406    
407    2003-08-29  Bernhard Herzog  <[email protected]>
408    
409            Add some missing parameters to projections. Proj complains about
410            them on windows but for some reason not on Linux.
411    
412            * test/test_save.py (SaveSessionTest.testLayerProjection): Add
413            missing required projection parameters
414    
415            * test/test_proj.py (TestProjFile.test): Add missing required
416            projection parameters
417    
418            * test/test_load_0_8.py (TestLayerProjection.file_contents)
419            (TestLayerProjection.test): Add missing required projection
420            parameters and tests for them
421    
422            * test/test_load.py (TestLayerProjection.file_contents)
423            (TestLayerProjection.test): Add missing required projection
424            parameters and tests for them
425    
426            * test/test_layer.py (TestLayer.test_base_layer): Add missing
427            required projection parameters
428    
429    2003-08-29  Bernhard Herzog  <[email protected]>
430    
431            * libraries/pyprojection/Projection.i: Use pj_get_errno_ref to
432            access the pj_errno because directly accessing pj_errno doesn't
433            work on windows if the proj library is in a DLL
434    
435            * libraries/pyprojection/Projection_wrap.c: Update from Projection.i
436    
437    2003-08-28  Bernhard Herzog  <[email protected]>
438    
439            * test/test_proj.py: Import things from Thuban after calling
440            initthuban
441    
442            * test/test_load.py (LoadSessionTest.filenames): New class
443            variable with the filename attributes to normalize
444            (LoadSessionTest.check_format): Pass self.filenames to
445            sax_eventlist to normalize the filename attributes
446    
447            * test/xmlsupport.py: Add cvs keywords
448            (SaxEventLister.__init__): New parameter filenames which indicates
449            attributes that contain filenames
450            (SaxEventLister.startElementNS): Normalize the filename attributes
451            with os.path.normpath
452            (sax_eventlist): New parameter filenames to pass through to
453            SaxEventLister
454    
455            * test/test_derivedshapestore.py: Make this file callable as a
456            program to execute the tests
457            (TestDerivedShapeStoreExceptions.test_table_with_wrong_size): Bind
458            the session to self.session so that it gets destroyed properly
459    
460            * test/test_layer.py (TestLayer.tearDown): Call the session's
461            Destroy method
462    
463            * test/test_map.py (TestMapBase.tearDown): Destroy self.session
464            too if it exists
465            (TestMapAddLayer.test_add_layer): Bind the session to self.session
466            so that it gets destroyed properly
467    
468            * test/postgissupport.py (reason_for_not_running_tests): Add a
469            test for the existence of popen2.Popen4.
470    
471            * test/test_save.py (SaveSessionTest.tearDown): New. Provide a
472            reliable way to destroy the sessions created in the test cases
473            (SaveSessionTest.test_dbf_table): Bind the session to self.session
474            so that it gets destroyed properly
475            (SaveSessionTest.testLayerProjection): Bind the session to
476            self.session so that it gets destroyed properly
477    
478            * test/test_session.py (UnreferencedTablesTests.tearDown): Make
479            sure that the session is destroyed properly
480    
481            * test/test_shapefilestore.py: Make this callable as a program to
482            execute the tests
483    
484            * test/test_scalebar.py: Remove unnecessary import of _ from
485            Thuban
486    
487            * test/support.py (print_garbage_information): Call initthuban
488            here because it may be called indirectly from test cases that test
489            test support modules which do not use anything from thuban itself
490            (ThubanTestProgram.runTests): Remove unnecessary debug print
491    
492    2003-08-28  Bernhard Herzog  <[email protected]>
493    
494            * Thuban/version.py (longversion): Update to 0.9
495    
496            * Thuban/UI/mainwindow.py: Remove some unused imports
497    
498            * README: Add section about required additional software. Add date
499            and revision CVS keywords
500    
501            * HOWTO-Release: Add item about the translations. Add date and
502            revision CVs keywords and change formatting to match README a bit
503            better
504    
505            * po/de.po: Update for 0.9
506    
507            * test/README: Tweak the wording a little because many tests are
508            not really unittest.
509    
510    2003-08-27  Bernhard Herzog  <[email protected]>
511    
512            As preparation for the 0.9 release, switch thuban files to a
513            non-dev namespace
514    
515            * Thuban/Model/save.py (SessionSaver.write_session): Write files
516            with the http://thuban.intevation.org/dtds/thuban-0.9.dtd
517            namespace
518    
519            * Thuban/Model/load.py (SessionLoader.__init__): Accept the
520            http://thuban.intevation.org/dtds/thuban-0.9.dtd namespace too
521    
522            * test/test_save.py (SaveSessionTest.dtd)
523            (SaveSessionTest.testEmptySession)
524            (SaveSessionTest.testSingleLayer)
525            (SaveSessionTest.testLayerProjection)
526            (SaveSessionTest.testRasterLayer)
527            (SaveSessionTest.testClassifiedLayer)
528            (SaveSessionTest.test_dbf_table)
529            (SaveSessionTest.test_joined_table)
530            (SaveSessionTest.test_save_postgis): Update for new namespace
531    
532            * test/test_load.py (LoadSessionTest.dtd, TestSingleLayer)
533            (TestLayerVisibility.file_contents, TestLabels.file_contents)
534            (TestLayerProjection.file_contents)
535            (TestRasterLayer.file_contents, TestJoinedTable.file_contents)
536            (TestPostGISLayer.file_contents)
537            (TestPostGISLayerPassword.file_contents)
538            (TestLoadError.file_contents, TestLoadError.test): Update for new
539            namespace
540    
541    2003-08-27  Bernhard Herzog  <[email protected]>
542    
543            Make the table interface distinguish between row ids (an integer
544            that uniquely identifies a row) and row ordinals (a simple row
545            count from 0 to NumRows() - 1)
546    
547            * Thuban/Model/postgisdb.py (PostGISTable.RowIdToOrdinal)
548            (PostGISTable.RowOrdinalToId): New methods to conver between row
549            ids and row ordinals
550            (PostGISTable.ReadRowAsDict, PostGISTable.ReadValue): New keyword
551            parameter row_is_ordinal to indicate whether the row parameter is
552            the row id or the ordinal
553    
554            * Thuban/Model/transientdb.py (TransientTableBase.RowIdToOrdinal)
555            (TransientTableBase.RowOrdinalToId)
556            (AutoTransientTable.RowIdToOrdinal)
557            (AutoTransientTable.RowOrdinalToId): Same new methods as in
558            PostGISTable.
559            (TransientTableBase.ReadRowAsDict, TransientTableBase.ReadValue)
560            (AutoTransientTable.ReadRowAsDict, AutoTransientTable.ReadValue):
561            Same new parameter as in PostGISTable.
562    
563            * Thuban/Model/table.py (DBFTable.RowIdToOrdinal)
564            (DBFTable.RowOrdinalToId, MemoryTable.RowIdToOrdinal)
565            (MemoryTable.RowOrdinalToId): Same new methods as in PostGISTable.
566            (DBFTable.ReadValue, DBFTable.ReadRowAsDict)
567            (MemoryTable.ReadValue, MemoryTable.ReadRowAsDict): Same new
568            parameter as in PostGISTable.
569    
570            * Thuban/UI/tableview.py (DataTable.RowIdToOrdinal)
571            (DataTable.RowOrdinalToId): New methods to convert between row ids
572            and row ordinals.
573            (TableGrid.SelectRowById): New method to select a row based on its
574            ID as opposed to its ordinal
575            (DataTable.GetValue, TableGrid.OnRangeSelect)
576            (TableGrid.OnSelectCell, LayerTableGrid.select_shapes)
577            (QueryTableFrame.OnQuery, QueryTableFrame.get_selected)
578            (LayerTableFrame.__init__): Convert between row ids and row
579            ordinals as appropriate
580    
581            * test/postgissupport.py (PostGISDatabase.__init__): Add
582            doc-string.
583            (PostGISDatabase.initdb): The optional third item in a tuple in
584            tables is now a (key, value) list with additional arguments to
585            pass to upload_shapefile
586            (upload_shapefile): New parameter gid_offset to allow gids that
587            are not the same as the shapeids in the shapefile
588            (PostgreSQLServer.get_default_static_data_db): Use the new
589            gid_offset to make the gids in landmarks 1000 higher than the
590            shapeids in the shapefile
591    
592            * test/test_viewport.py
593            (TestViewportWithPostGIS.test_find_shape_at_point): Adapt to the
594            new shapeids in the landmarks table
595    
596            * test/test_transientdb.py
597            (TestTransientTable.run_iceland_political_tests)
598            (TestTransientTable.test_transient_joined_table): Add tests for
599            the new table methods and new keywords arguments.
600    
601            * test/test_postgis_db.py
602            (TestPostGISTable.test_read_row_as_dict_row_count_mode)
603            (TestPostGISTable.test_read_value_row_count_mode)
604            (TestPostGISTable.test_row_id_to_ordinal)
605            (TestPostGISTable.test_row_oridnal_to_id): New test for the new
606            table methods and the new arguments
607            (TestPostGISShapestorePoint.test_shapes_in_region)
608            (TestPostGISShapestorePoint.test_shape_raw_data)
609            (TestPostGISShapestorePoint.test_shape_points)
610            (TestPostGISShapestorePoint.test_shape_shapeid)
611            (TestPostGISShapestorePoint.test_all_shapes)
612            (TestPostGISTable.test_simple_query)
613            (TestPostGISTable.test_simple_query)
614            (TestPostGISTable.test_simple_query)
615            (TestPostGISTable.test_read_value)
616            (TestPostGISTable.test_read_row_as_dict): Adapt to the new
617            shapeids in the landmarks table
618    
619            * test/test_memory_table.py
620            (TestMemoryTable.test_read_row_as_dict_row_count_mode)
621            (TestMemoryTable.test_read_value_row_count_mode)
622            (TestMemoryTable.test_row_id_to_ordinal)
623            (TestMemoryTable.test_row_oridnal_to_id): New test for the new
624            table methods and the new arguments
625    
626            * test/test_dbf_table.py
627            (TestDBFTable.test_read_row_as_dict_row_count_mode)
628            (TestDBFTable.test_read_value_row_count_mode)
629            (TestDBFTable.test_row_id_to_ordinal)
630            (TestDBFTable.test_row_oridnal_to_id): New test for the new table
631            methods and the new arguments
632    
633    2003-08-26  Bernhard Herzog  <[email protected]>
634    
635            * Thuban/Model/postgisdb.py (PostGISShapeStore.BoundingBox): Use a
636            more postgis specific but much faster method to get the bounding
637            box
638    
639    2003-08-26  Bernhard Herzog  <[email protected]>
640    
641            * Thuban/Model/postgisdb.py (PostGISTable.Title)
642            (PostGISShapeStore.AllShapes): Add these missing methods.
643            (PostGISShapeStore.ShapesInRegion): No need to raise
644            StopIteration. We can simply return
645    
646            * test/test_postgis_db.py (TestPostGISTable.test_title)
647            (TestPostGISShapestorePoint.test_all_shapes): New tests for the
648            new methods
649    
650    2003-08-25  Bernhard Herzog  <[email protected]>
651    
652            * Thuban/Model/postgisdb.py (shapetype_map): Add MUTLIPOLYGON.
653    
654            * test/test_postgis_db.py (PolygonTests): New class containing
655            those tests from TestPostGISShapestorePolygon that can also be
656            used to test MUTLIPOLYGON tables
657            (TestPostGISShapestorePolygon): Most tests are now in PolygonTests
658            so derive from that
659            (TestPostGISShapestoreMultiPolygon): New class with tests for
660            MUTLIPOLYGON tables
661    
662            * test/postgissupport.py (PostGISDatabase.initdb): Allow the
663            tables argument to have tuples with three items to override the
664            WKT type used.
665            (PostgreSQLServer.get_default_static_data_db): Use the above to
666            create a polygon table with MUTLIPOLYGONs
667            (point_to_wkt, coords_to_point, polygon_to_wkt, coords_to_polygon)
668            (arc_to_wkt, coords_to_multilinestring): Rename from *_to_wkt to
669            coords_to*
670            (coords_to_multipolygon): New. Convert to MUTLIPOLYGON
671            (wkt_converter): New. Map WKT types to converters
672            (upload_shapefile): New parameter force_wkt_type to use a
673            different WKT type than the default
674    
675    2003-08-25  Bernhard Herzog  <[email protected]>
676    
677            * Thuban/UI/application.py
678            (ThubanApplication.run_db_param_dialog): New. Suitable as a
679            db_connection_callback. Main difference is that the dialog run
680            from this method doesn't have a parent so it can be used even when
681            there is no main window
682            (ThubanApplication.OpenSession): Use self.run_db_param_dialog if
683            no db_connection_callback was given. This way the dialog pops up
684            even when the .thuban file was given as a command line parameter.
685    
686    2003-08-25  Bernhard Herzog  <[email protected]>
687    
688            * Thuban/UI/view.py (MapCanvas.OnLeftUp): Release the the mouse
689            before calling MouseLeftUp. MouseLeftUp may pop up modal dialogs
690            which leads to an effectively frozen X session because the user
691            can only interact with the dialog but the mouse is still grabbed
692            by the canvas.
693            Also, call the tool's Hide method before MouseLeftUp because
694            MouseLeftUp may change the tool's coordinates.
695    
696    2003-08-25  Bernhard Herzog  <[email protected]>
697    
698            * Thuban/UI/application.py (ThubanApplication.OpenSession): Catch
699            LoadCancelled exceptions and handle them by returning immediately.
700    
701    2003-08-25  Bernhard Herzog  <[email protected]>
702    
703            GUI part of loading sessions with postgis connections which may
704            require user interaction to get passwords or updated parameters
705    
706            * Thuban/UI/dbdialog.py (DBDialog): Reimplement to make it look a
707            bit nucer and be more generic.
708            (DBFrame.OnAdd): Adapt to new DBDialog interface
709    
710            * Thuban/UI/application.py (ThubanApplication.OpenSession): New
711            optional parameter db_connection_callback which is passed to
712            load_session.
713    
714            * Thuban/UI/mainwindow.py (MainWindow.run_db_param_dialog): New.
715            Suitable as a db_connection_callback
716            (MainWindow.OpenSession): Use self.run_db_param_dialog as the
717            db_connection_callback of the application's OpenSession method
718    
719    
720    2003-08-25  Bernhard Herzog  <[email protected]>
721    
722            Basic loading of sessions containing postgis connections:
723    
724            * Thuban/Model/load.py (LoadError): Add doc-string
725            (LoadCancelled): New exception class to indicate a cancelled load
726            (SessionLoader.__init__): Add the db_connection_callback parameter
727            which will be used by the loader to get updated parameters and a
728            password for a database connection
729            (SessionLoader.__init__): Add the new XML elements to the
730            dispatchers dictionary
731            (SessionLoader.check_attrs): Two new conversions, ascii to convert
732            to a byte-string object and idref as a generic id reference
733            (SessionLoader.start_dbconnection)
734            (SessionLoader.start_dbshapesource): New. Handlers for the new XML
735            elements
736            (load_session): Add the db_connection_callback to pass through the
737            SessionLoader
738    
739            * test/test_load.py (TestPostGISLayer, TestPostGISLayerPassword):
740            New classes to test loading of sessions with postgis database
741            connections.
742    
743    2003-08-25  Bernhard Herzog  <[email protected]>
744    
745            * Thuban/UI/mainwindow.py (__ThubanVersion__): Remove this and
746            replace it and the comment with __BuildDate__ by the Source: and
747            Id: cvs keywords as used in the other files.
748    
749    2003-08-25  Bernhard Herzog  <[email protected]>
750    
751            * Thuban/Model/load.py (SessionLoader.check_attrs): Raise a
752            LoadError when a required attribute is missing. The code used to
753            be commented out for some reason, but probably should have been
754            active.
755    
756            * test/test_load.py (TestLoadError.test): Test the message in the
757            LoadError too to make sure it really is about the missing
758            attribute
759    
760    2003-08-22  Bernhard Herzog  <[email protected]>
761    
762            * test/test_save.py (SaveSessionTest.test_dbf_table)
763            (SaveSessionTest.test_joined_table): Add XML validation tests.
764    
765    2003-08-22  Bernhard Herzog  <[email protected]>
766    
767            Implement saving a session with a postgis connection
768    
769            * Resources/XML/thuban-0.9.dtd (dbconnection, dbshapesource) New
770            elements for database connections and shapestores using db
771            connections
772            (session): Add the dbconnections to the content model
773    
774            * Thuban/Model/save.py (SessionSaver.write_db_connections): New.
775            Write the db connections
776            (SessionSaver.write_session): Call write_db_connections to write
777            the connection before the data sources
778            (SessionSaver.write_data_containers): Handle postgis shapestores
779    
780            * test/test_save.py (SaveSessionTest.thubanids)
781            (SaveSessionTest.thubanidrefs): Update for new DTD
782            (SaveSessionTest.test_save_postgis): New. Test saving a session
783            with postgis connections
784    
785            * Thuban/Model/postgisdb.py (PostGISTable.DBConnection)
786            (PostGISTable.TableName): New accessor methods for the connection
787            and table name
788    
789            * test/test_postgis_db.py (TestPostGISTable.test_dbconn)
790            (TestPostGISTable.test_dbname): New methods to test the new
791            PostGISConnection methods
792    
793    2003-08-22  Bernhard Herzog  <[email protected]>
794    
795            * Thuban/Model/postgisdb.py (ConnectionError): New exception class
796            for exceptions occurring when establishing a Database connection
797            (PostGISConnection.connect): Catch psycopg.OperationalError during
798            connects and raise ConnectionError.
799    
800            * test/test_postgis_db.py (TestPostgisDBExceptions): New class for
801            tests for database exceptions
802    
803    2003-08-22  Bernhard Herzog  <[email protected]>
804    
805            Prepare the test suite for tests with required authentication
806    
807            * test/postgissupport.py (PostgreSQLServer.__init__): Add instance
808            variables with two predefined users/passwords, one for the admin
809            and one for a non-privileged user.
810            (PostgreSQLServer.createdb): Pass the admin name to initdb and add
811            the non-privileged user to the database and set the admin password
812            (PostgreSQLServer.wait_for_postmaster): Use the admin user name.
813            Better error reporting
814            (PostgreSQLServer.connection_params)
815            (PostgreSQLServer.connection_string): New methods to return
816            information about how to connect to the server
817            (PostgreSQLServer.execute_sql): New. Convenience method to execute
818            SQL statements
819            (PostgreSQLServer.require_authentication): Toggle whether the
820            server requires authentication
821            (PostgreSQLServer.create_user, PostgreSQLServer.alter_user): New.
822            Add or alter users
823            (PostGISDatabase.initdb): Pass the admin name one the
824            subprocesses' command lines. Grant select rights on
825            geometry_columns to everybody.
826            (upload_shapefile): Use the admin name and password when
827            connecting. Grant select rights on the new table to everybody.
828    
829            * test/test_viewport.py (TestViewportWithPostGIS.setUp): Use the
830            server's new methods to get the connection parameters.
831    
832            * test/test_postgis_session.py (TestSessionWithPostGIS.setUp)
833            (TestSessionWithPostGIS.test_remove_dbconn_exception): Use the
834            server's new methods to get the connection parameters.
835    
836            * test/test_postgis_db.py
837            (TestPostGISConnection.test_gis_tables_empty)
838            (TestPostGISConnection.test_gis_tables_non_empty)
839            (PostGISStaticTests.setUp): Use the server's new methods to get
840            the connection parameters.
841    
842    2003-08-22  Bernhard Herzog  <[email protected]>
843    
844            * Thuban/UI/about.py (About.__init__): Add the psycopg version.
845    
846            * Thuban/version.py: Add psycopg version
847    
848            * Thuban/Model/postgisdb.py (psycopg_version): New. Return the
849            version of the psycopg module
850    
851    2003-08-22  Bernhard Herzog  <[email protected]>
852    
853            * Thuban/UI/dbdialog.py (DBPwdDlg): Removed because it's not used.
854            (DBFrame.OnEdit): Removed because it's not used and wouldn't work
855            at the moment. The functionality should probably be implemented
856            some time, though.
857            (DBFrame.OnRemove): Display a message if the connection can't be
858            removed because it's still in use.
859    
860    2003-08-22  Jan-Oliver Wagner <[email protected]>
861    
862            * Thuban/UI/about.py (About.__init__): split up the huge about
863            text into elements/lists for easier translation. This fixes bug
864            https://intevation.de/rt/webrt?serial_num=2058
865            Also, made some forgotten string available for the i18n.
866    
867    2003-08-21  Bernhard Herzog  <[email protected]>
868    
869            Make postgis support really optional including insensitive menu
870            items.
871    
872            * Thuban/Model/postgisdb.py (has_postgis_support): New. Return
873            whether the postgis is supported.
874    
875            * Thuban/UI/dbdialog.py: Put the psycopg import into try..except
876            to make postgis support optional
877    
878            * Thuban/UI/mainwindow.py (_has_postgis_support): New. Context
879            version of Thuban.Model.postgisdb.has_postgis_support
880            (database_management command): Make it only sensitive if postgis
881            is supported.
882    
883    2003-08-21  Jan-Oliver Wagner <[email protected]>
884    
885            * Doc/manual/thuban-manual.xml: Added CVS revision for rev-history.
886            (section Adding and Removing Layers): Added text and described
887            multi-selection.
888            (chapter Extensions): New.
889    
890    2003-08-21  Jan-Oliver Wagner <[email protected]>
891    
892            * Thuban/UI/mainwindow.py (MainWindow.AddLayer): Changed dialog
893            settings to allow multiple files to load into the map.
894            Also reduced selection to *.shp as a default.
895    
896    2003-08-20  Bernhard Herzog  <[email protected]>
897    
898            Add dialogs and commands to open database connections and add
899            database layers.
900    
901            * Thuban/UI/mainwindow.py (MainWindow.DatabaseManagement): New
902            method to open the database connection management dialog
903            (MainWindow.AddDBLayer): New method to add a layer from a database
904            (_has_dbconnections): New helper function to use for sensitivity
905            (database_management command, layer_add_db command): New commands
906            that call the above new methods.
907            (main_menu): Add the new commands to the menu.
908    
909            * Thuban/Model/postgisdb.py (PostGISConnection.__init__)
910            (PostGISConnection.connect): Establish the actual connection in a
911            separate method and call it in __init__. This makes it easier to
912            override the behavior in test cases
913            (PostGISConnection.BriefDescription): New method to return a brief
914            description for use in dialogs.
915    
916            * test/test_postgis_db.py (NonConnection): DB connection that
917            doesn't actually connect
918            (TestBriefDescription): New class with tests for the new
919            BriefDescription method
920    
921    2003-08-19  Jan-Oliver Wagner <[email protected]>
922    
923            Moved anything from extensions to libraries.
924    
925            * libraries: New.
926    
927            * libraries/ pyprojection, pyshapelib, shapelib, thuban: New.
928    
929            * libraries/pyprojection/ LICENSE, MANIFEST.in, Projection.i,
930            Projection.py, Projection_wrap.c, setup.py, swighelp.txt: These files have
931            been moved here from thuban/extensions/pyprojection/
932            See there in the Attic for the older history.
933    
934            * libraries/pyshapelib/ COPYING, ChangeLog, NEWS, README, dbflib.i,
935            dbflib.py, dbflib_wrap.c, pyshapelib_api.h, pytest.py, setup.py,
936            shapelib.i, shapelib.py, shapelib_wrap.c, shptreemodule.c: These files
937            have been moved here from thuban/extensions/pyshapelib/
938            See there in the Attic for the older history.
939    
940            * libraries/shapelib/ dbfopen.c, shapefil.h, shpopen.c, shptree.c: These
941            files have been moved here from thuban/extensions/shapelib/
942            See there in the Attic for the older history.
943    
944            * libraries/thuban/ bmpdataset.cpp, cpl_mfile.cpp, cpl_mfile.h,
945            gdalwarp.cpp, wxproj.cpp: These files have been moved here from
946            thuban/extensions/thuban/
947            See there in the Attic for the older history.
948    
949            * MANIFEST.in, setup.cfg, setup.py: renamed extensions to libraries.
950    
951            * extensions/thuban/ bmpdataset.cpp, cpl_mfile.cpp, cpl_mfile.h,
952            gdalwarp.cpp, wxproj.cpp: Moved to libraries/thuban.
953    
954            * extensions/shapelib/ dbfopen.c, shapefil.h, shpopen.c, shptree.c:
955            Moved to libraries/shapelib.
956    
957            * extensions/pyshapelib/ COPYING, NEWS, dbflib.py, pytest.py,
958            shapelib.py, README, dbflib_wrap.c, setup.py, shapelib_wrap.c,
959            ChangeLog, dbflib.i, pyshapelib_api.h, shapelib.i, shptreemodule.c:
960            Moved to libraries/pyshapelib.
961    
962            * extensions/pyprojection/ MANIFEST.in, Projection.py, setup.py,
963            LICENSE, Projection.i, Projection_wrap.c, swighelp.txt:
964            Moved to libraries/pyprojection.
965    
966            * extensions/ pyprojection, pyshapelib, shapelib, thuban: Removed.
967    
968            * extensions: Removed.
969    
970    2003-08-19  Bernhard Herzog  <[email protected]>
971    
972            * test/test_viewport.py (ViewPortTest): We don't use the
973            facilities of FileTestMixin so don't derive from it.
974            (TestViewportWithPostGIS): New class with tests for using a
975            viewport on a map with postgis layers.
976    
977    2003-08-19  Bernhard Herzog  <[email protected]>
978    
979            Add the db connection management to the session.
980    
981            * Thuban/Model/session.py (Session.__init__): New instance
982            variable db_connections
983            (Session.AddDBConnection, Session.DBConnections)
984            (Session.HasDBConnections, Session.CanRemoveDBConnection)
985            (Session.RemoveDBConnection): New methods to manage and query the
986            db connections managed by the session
987            (Session.OpenDBShapeStore): New method to open a shapestore from a
988            db connection
989    
990            * Thuban/Model/messages.py (DBCONN_REMOVED, DBCONN_ADDED): New
991            messages for the db connection handling in the session
992    
993            * test/test_postgis_session.py: New. test cases for the session's
994            db connection handling with postgis connections
995    
996    2003-08-19  Bernhard Herzog  <[email protected]>
997    
998            Add very basic postgis database support and the corresponding test
999            cases. The test cases require a PostgreSQL + postgis installation
1000            but no existing database. The database will be created
1001            automatically by the test cases
1002    
1003            * test/README: Add note about skipped tests and the requirements
1004            of the postgis tests.
1005    
1006            * Thuban/Model/postgisdb.py: New. Basic postgis database support.
1007    
1008            * test/test_postgis_db.py: New. Test cases for the postgis
1009            support.
1010    
1011            * Thuban/Model/wellknowntext.py: New. Parser for well-known-text
1012            format
1013    
1014            * test/test_wellknowntext.py: New. Test cases for the
1015            wellknowntext parser
1016    
1017            * test/postgissupport.py: New. Support module for tests involving
1018            a postgis database.
1019    
1020            * test/support.py (execute_as_testsuite): Shut down the postmaster
1021            if it's still running after the tests
1022    
1023            * Thuban/Model/data.py (RAW_WKT): New constant for raw data in
1024            well known text format
1025    
1026    2003-08-19  Jan-Oliver Wagner <[email protected]>
1027    
1028            * Examples/simple_extensions/hello_world.py: New. Raises a Hello World
1029            message dialog.
1030    
1031    2003-08-18  Bernhard Herzog  <[email protected]>
1032    
1033            * test/support.py (ThubanTestResult.printErrors): Indent the
1034            reason for the skips in the output to make it a bit more readable.
1035            (execute_as_testsuite): New helper function to run a test suite
1036            and print some more information.
1037            (run_tests): Use execute_as_testsuite to run the tests
1038    
1039            * test/runtests.py (main): Use execute_as_testsuite to run the
1040            tests
1041    
1042    2003-08-18  Bernhard Herzog  <[email protected]>
1043    
1044            Fix some bugs in Thuban and the test suite that were uncovered by
1045            changes introduced in Python 2.3:
1046    
1047            * Thuban/Model/table.py (DBFTable.__init__): Make sure the
1048            filename is an absolute name
1049    
1050            * Thuban/Model/layer.py (RasterLayer.__init__): Make sure the
1051            filename is an absolute name
1052    
1053            * test/test_save.py (SaveSessionTest.testRasterLayer): Use a
1054            unique filename to save to and use the correct relative filename
1055            in the expected output.
1056            (SaveSessionTest.test_dbf_table): Use the correct relative
1057            filename in the expected output.
1058    
1059            * test/test_layer.py (TestLayer.test_raster_layer): Update the
1060            test to check whether the filename is absolute.
1061    
1062    2003-08-18  Jan-Oliver Wagner <[email protected]>
1063    
1064            * Thuban/UI/about.py (About.__init__): Added Silke Reimer.
1065    
1066    2003-08-15  Bernhard Herzog  <[email protected]>
1067    
1068            Change the way shapes are returned by a shape store. The
1069            ShapesInRegion method returns an iterator over actual shape
1070            objects instead of a list of shape ids.
1071    
1072            * Thuban/Model/data.py (ShapefileShape.ShapeID): New. Return shape
1073            id.
1074            (ShapefileStore.ShapesInRegion): Return an iterator over the
1075            shapes which yields shape objects instead of returning a list of
1076            shape ids
1077            (ShapefileStore.AllShapes): New. Return an iterator over all
1078            shapes in the shape store
1079            (DerivedShapeStore.AllShapes): New. Like in ShapefileStore
1080    
1081            * Thuban/Model/layer.py (Layer.ShapesInRegion): Update
1082            doc-string.
1083    
1084            * Thuban/UI/baserenderer.py
1085            (BaseRenderer.layer_ids, BaseRenderer.layer_shapes): Rename to
1086            layer_shapes and make it return an iterator containg shapes
1087            instead of a list of ids.
1088            (BaseRenderer.draw_shape_layer): Update doc-string; Adapt to
1089            layer_shapes() change
1090    
1091            * Thuban/UI/renderer.py (ScreenRenderer.layer_ids)
1092            (ScreenRenderer.layer_shapes): Rename as in BaseRenderer
1093    
1094            * Thuban/UI/viewport.py (ViewPort._find_shape_in_layer): Adapt to
1095            changes in the ShapesInRegion return value.
1096            (ViewPort._get_hit_tester): Remove commented out code
1097    
1098            * test/mockgeo.py (SimpleShapeStore.ShapesInRegion): Adapt to the
1099            new return value.
1100            (SimpleShapeStore.AllShapes): New. Implement this method too.
1101    
1102            * test/test_layer.py (TestLayer.test_arc_layer)
1103            (TestLayer.test_polygon_layer, TestLayer.test_point_layer)
1104            (TestLayer.test_point_layer_with_projection)
1105            (TestLayer.test_derived_store): Adapt to changes in the
1106            ShapesInRegion return value.
1107    
1108            * test/test_shapefilestore.py
1109            (TestShapefileStoreArc.test_shapes_in_region)
1110            (TestShapefileStorePolygon.test_shapes_in_region)
1111            (TestShapefileStorePoint.test_shapes_in_region): Adapt to changes
1112            in the ShapesInRegion return value.
1113            (TestShapefileStorePoint.test_all_shapes)
1114            (TestShapefileStoreArc.test_shape_shapeid): New tests for the new
1115            methods
1116    
1117            * test/test_derivedshapestore.py
1118            (TestDerivedShapeStore.test_shapes_in_region): Adapt to changes in
1119            the ShapesInRegion return value.
1120            (TestDerivedShapeStore.test_all_shapes)
1121            (TestDerivedShapeStore.test_shape_shapeid): New tests for the new
1122            methods
1123    
1124    2003-08-15  Bernhard Herzog  <[email protected]>
1125    
1126            Make the renderers deal correctly with raw vs. python level
1127            representation of shape geometries
1128    
1129            * Thuban/UI/baserenderer.py (BaseRenderer.low_level_renderer):
1130            Return a flag useraw in addition to the callable and the parameter
1131            to indicate whether the callable can deal with the raw shape data
1132            or uses the higher level python lists of coordinates. The callable
1133            now should accept either the raw data or the return value of the
1134            shape's Points() method.
1135            (BaseRenderer.draw_shape_layer): Adapt to the low_level_renderer
1136            change
1137            (BaseRenderer.projected_points): Instead of the shape id use the
1138            points list as parameter.
1139            (BaseRenderer.draw_polygon_shape, BaseRenderer.draw_arc_shape)
1140            (BaseRenderer.draw_point_shape): Adapt to projected_points()
1141            change and accept the points list as parameter instead of the
1142            shape id.
1143    
1144            * Thuban/UI/renderer.py (MapRenderer.low_level_renderer): Return
1145            the useraw flag as required by the BaseRenderer
1146            (ScreenRenderer.draw_shape_layer): Adapt to low-level renderer
1147            changes.
1148    
1149            * test/test_baserenderer.py
1150            (TestBaseRenderer.test_point_with_classification): New test for
1151            rendering a map with classifications.
1152    
1153    2003-08-15  Bernhard Herzog  <[email protected]>
1154    
1155            * Thuban/UI/viewport.py (ViewPort.find_shape_at)
1156            (ViewPort._find_shape_in_layer, ViewPort._find_shape_in_layer)
1157            (ViewPort._get_hit_tester, ViewPort.projected_points)
1158            (ViewPort._hit_point, ViewPort._hit_arc, ViewPort._hit_polygon)
1159            (ViewPort._find_label_at): Split the find_shape_at method into
1160            several new methods and use the functions in the hit-test module.
1161    
1162            * Thuban/UI/hittest.py: New module with Python-level hit-testing
1163            functions
1164    
1165            * test/test_hittest.py: New. Test for the new hittest module
1166    
1167    2003-08-15  Bernhard Herzog  <[email protected]>
1168    
1169            * Thuban/Model/layer.py (Layer.ShapesInRegion): Apply the layer
1170            projection to all corners of the bounding box to get a better
1171            approximation of the projected bounding box
1172    
1173            * test/test_layer.py (TestLayer.test_point_layer_with_projection):
1174            New. Test coordinate handling of a layer with a projection.
1175            Catches the bug fixed in Layer.ShapesInRegion
1176    
1177    2003-08-15  Bernhard Herzog  <[email protected]>
1178    
1179            Move some of the mock objects in test_baserenderer into their own
1180            module so they can easily be used from other tests
1181    
1182            * test/mockgeo.py: New test helper module with some mock objects
1183            for geometry related things like shapes, shapestores and
1184            projections.
1185    
1186            * test/test_mockgeo.py: New. Tests for the new helper module
1187    
1188            * test/test_baserenderer.py: Some of the mock-objects are in
1189            mockgeo now.
1190    
1191    2003-08-12  Jan-Oliver Wagner <[email protected]>
1192    
1193            * Thuban/UI/about.py (About.__init__): Added Bj�rn Broscheit.
1194    
1195    2003-08-12  Bernhard Herzog  <[email protected]>
1196    
1197            * po/de.po: New. German translations by Bjoern Broscheit
1198    
1199    2003-08-12  Bernhard Herzog  <[email protected]>
1200    
1201            * Thuban/UI/projdialog.py (UnknownProjPanel._DoLayout): Translated
1202            strings have to be one string literal.
1203    
1204    2003-08-11  Bernhard Herzog  <[email protected]>
1205    
1206            * test/support.py (FloatComparisonMixin.assertPointListEquals):
1207            New. This method was used in various derived classes, but it's
1208            better to have it here.
1209    
1210            * test/test_shapefilestore.py
1211            (ShapefileStoreTests.assertPointListEquals): Removed. It's now in
1212            FloatComparisonMixin
1213    
1214            * test/test_layer.py (TestLayer.assertPointListEquals): Removed.
1215            It's now in FloatComparisonMixin
1216    
1217            * test/test_derivedshapestore.py
1218            (TestDerivedShapeStore.assertPointListEquals): Removed. It's now
1219            in FloatComparisonMixin
1220    
1221    2003-08-11  Bernhard Herzog  <[email protected]>
1222    
1223            * Thuban/UI/join.py (JoinDialog.OnJoin): Add missing space to
1224            error message
1225    
1226    2003-08-08  Jan-Oliver Wagner <[email protected]>
1227    
1228            * Doc/manual/thuban-manual.xml: Now use authorgroup. Added revhistory
1229            with version number.
1230            Changed title to reflect version number of Thuban.
1231    
1232    2003-08-08  Jan-Oliver Wagner <[email protected]>
1233    
1234            * Thuban/UI/about.py (About.__init__): Reworked the hall of fame. Now
1235            the list corresponds to the "About" web page.
1236    
1237    2003-08-08  Bernhard Herzog  <[email protected]>
1238    
1239            * Thuban/UI/projdialog.py (UTMProposeZoneDialog.dialogLayout):
1240            Make sure translated strings are recognized as one string literal.
1241    
1242            * Thuban/UI/proj4dialog.py (UTMProposeZoneDialog.dialogLayout):
1243            Make sure translated strings are recognized as one string literal.
1244    
1245            * Thuban/UI/classgen.py (ClassGenDialog.OnOK): Make sure
1246            translated strings are recognized as one string literal.
1247    
1248            * Thuban/UI/application.py (ThubanApplication.OpenSession): Make
1249            sure translated strings are recognized as one string literal.
1250    
1251    2003-08-07  Bernhard Herzog  <[email protected]>
1252    
1253            * Thuban/Model/data.py (DerivedShapeStore.RawShapeFormat): New.
1254            Simply delegates to the original shapestore.
1255    
1256            * test/test_derivedshapestore.py
1257            (TestDerivedShapeStore.test_raw_format): New. Test case for
1258            DerivedShapeStore.RawShapeFormat
1259    
1260    2003-08-07  Bernhard Herzog  <[email protected]>
1261    
1262            Add raw data interface to shape objects.
1263    
1264            * Thuban/Model/data.py (ShapefileShape, Shape): Rname the shape
1265            class to ShapefileShape which now holds shapefile specific
1266            information.
1267            (ShapefileShape.compute_bbox): Simplified to not cache any
1268            information. The way this method is used that shouldn't matter
1269            performance wise.
1270            (ShapefileShape.RawData): New. Return the shapeid which is the raw
1271            data format for shapes from shapefiles.
1272            (ShapefileStore.RawShapeFormat): New. Return the raw datatype used
1273            in the shape objects returned by a shapestore. For a
1274            ShapefileStore this is always RAW_SHAPEFILE.
1275            (RAW_PYTHON, RAW_SHAPEFILE): Constants for the RawShapeFormat
1276            method.
1277    
1278            * test/test_shapefilestore.py
1279            (TestShapefileStore.test_raw_format): New test to test the raw
1280            format feature of shapes.
1281    
1282            * Thuban/Model/layer.py: Remove the unused import of Shape from
1283            data. It was only there for interface compatibility but it's not
1284            used inside of Thuban and the generic Shape class has gone away.
1285    
1286            * Thuban/UI/renderer.py (MapRenderer.low_level_renderer): Check
1287            the raw data format and only use an optimized version of its a
1288            shapefile.
1289    
1290    2003-08-07  Bernhard Herzog  <[email protected]>
1291    
1292            * test/test_baserenderer.py (SimpleShape): Shape class for the
1293            tests.
1294            (SimpleShapeStore.Shape): Use SimpleShape instead of
1295            Thuban.Model.data.Shape to make the tests independed of the coming
1296            changes.
1297    
1298    2003-08-07  Bernhard Herzog  <[email protected]>
1299    
1300            * test/support.py (SkipTest, ThubanTestResult, ThubanTestRunner)
1301            (ThubanTestProgram): New classes that extend the respective
1302            classes from unittest. These new version support skipping tests
1303            under certain expected conditions. In the Thuban test suite we
1304            uses this for tests that require the optional gdal support.
1305            (run_tests): Use ThubanTestProgram instead of the unittest.main()
1306    
1307            * test/runtests.py (main): Use the new ThubanTestRunner instead of
1308            the normal one from unittest
1309    
1310            * test/test_layer.py (TestLayer.test_raster_layer): If this test
1311            is not run because gdal support isn't available report this to the
1312            runner.
1313    
1314            * test/test_baserenderer.py
1315            (TestBaseRenderer.test_raster_no_projection): Do not run this test
1316            if gdal support isn't available and report this to the runner.
1317    
1318    2003-08-06  Bernhard Herzog  <[email protected]>
1319    
1320            Rearrange the renderers a bit, partly in preparation for changes
1321            required for the postgis merge, partly to make it more testable.
1322            Also make the representation of coordinates in Shapes more
1323            consistent.
1324    
1325            * Thuban/UI/renderer.py (MapRenderer): Most of the code/methods in
1326            this class is now in BaseRenderer. This class is now practically
1327            only a specialization of BaseRenderer for rendering to an actual
1328            wx DC.
1329            (ScreenRenderer.draw_shape_layer): Use self.low_level_renderer()
1330            to get the shapetype specific rendering functions.
1331    
1332            * Thuban/UI/baserenderer.py: New file with the basic rendering
1333            logic. The code in this file is completely independend of wx.
1334            (BaseRenderer): Class with the basic rendering logic
1335    
1336            * test/test_baserenderer.py: New. Test cases for BaseRenderer
1337    
1338            * Thuban/UI/view.py (MapCanvas.__init__): New instance variable
1339            error_on_redraw to guard agains endless loops and stack overflows
1340            when there's a bug in the rendering code that raises exceptions.
1341            (MapCanvas.OnIdle, MapCanvas._do_redraw): Split the actual
1342            rendering into a separate method _do_redraw so that error handling
1343            is a bit easier. When an exception occurs, set error_on_redraw to
1344            true. When it's true on entry to OnIdle do nothing and return
1345            immediately.
1346    
1347            * Thuban/Model/data.py (ShapefileStore.Shape): For consistency, a
1348            Shape object will always have the coordinates as a list of list of
1349            coordinate pairs (tuples).
1350            (Shape.compute_bbox): Adapt to new representation.
1351    
1352            * Thuban/UI/viewport.py (ViewPort.find_shape_at)
1353            (ViewPort.LabelShapeAt): Adapt to new coordinate representation in
1354            Shape objects.
1355    
1356            * test/test_shapefilestore.py
1357            (ShapefileStoreTests.assertFloatTuplesEqual)
1358            (ShapefileStoreTests.assertPointListEquals): Rename to
1359            assertPointListEquals and change purpose to checking equality of
1360            the lists returned by Shape.Points().
1361            (TestShapefileStoreArc.test_shape)
1362            (TestShapefileStorePolygon.test_shape)
1363            (TestShapefileStorePoint.test_shape): Use the new
1364            assertPointListEquals instead of assertFloatTuplesEqual
1365    
1366            * test/test_layer.py (TestLayer.assertFloatTuplesEqual)
1367            (TestLayer.assertPointListEquals): Rename to assertPointListEquals
1368            and change purpose to checking equality of the lists returned by
1369            Shape.Points().
1370            (TestLayer.test_arc_layer, TestLayer.test_arc_layer)
1371            (TestLayer.test_polygon_layer, TestLayer.test_point_layer)
1372            (TestLayer.test_derived_store): Use the new assertPointListEquals
1373            instead of assertFloatTuplesEqual
1374    
1375            * test/test_derivedshapestore.py
1376            (TestDerivedShapeStore.assertFloatTuplesEqual)
1377            (TestDerivedShapeStore.assertPointListEquals): Rename to
1378            assertPointListEquals and change purpose to checking equality of
1379            the lists returned by Shape.Points().
1380            (TestDerivedShapeStore.test_shape): Use the new
1381            assertPointListEquals instead of assertFloatTuplesEqual
1382    
1383    2003-08-06  Jan-Oliver Wagner <[email protected]>
1384    
1385            * Thuban/UI/projdialog.py (UTMPanel._OnPropose): Added test for
1386            a bounding box. A dialog is raised in case, no bounding box
1387            is found. This fixes bug #2043:
1388            https://intevation.de/rt/webrt?serial_num=2043
1389    
1390    2003-08-05  Bernhard Herzog  <[email protected]>
1391    
1392            * Thuban/Model/color.py (Color.__repr__): Make the repr of a color
1393            object look like a Color instantiation. Formerly it looked like a
1394            tuple.
1395    
1396            * test/test_color.py (TestColor.test_repr)
1397            (TestColor.test_equality, TestColor.test_inequality): New. test
1398            some more apects of the Color class
1399            (TestTransparent.test_repr, TestTransparent.test_hex)
1400            (TestTransparent.test_equality): New. Test cases for the
1401            Transparent object.
1402    
1403    2003-08-04  Jan-Oliver Wagner <[email protected]>
1404    
1405            * Doc/manual/thuban-manual.xml: a number of small improvements.
1406            The resulting file is the version submitted for GREAT-ER II.
1407    
1408    2003-08-01  Bernhard Herzog  <[email protected]>
1409    
1410            * Thuban/UI/resource.py, Thuban/UI/projdialog.py,
1411            Thuban/UI/join.py, Thuban/UI/classgen.py, Thuban/UI/about.py,
1412            Thuban/Model/resource.py: Insert cvs keywords and doc-strings.
1413    
1414            * Thuban/UI/common.py: Insert cvs keywords and doc-strings.
1415            (Color2wxColour, wxColour2Color, ThubanBeginBusyCursor)
1416            (ThubanEndBusyCursor): Add doc-strings
1417    
1418    2003-08-01  Bernhard Herzog  <[email protected]>
1419    
1420            First step towards PostGIS integration. More abstraction by movin
1421            more code from the layer to the shapestore. More methods of the
1422            layer are now simply delegated to the equivalent method of the
1423            shapestore. The SHAPETYPE_* constants are now in data not in
1424            layer.
1425    
1426            * Thuban/Model/data.py (SHAPETYPE_POLYGON, SHAPETYPE_ARC)
1427            (SHAPETYPE_POINT, Shape): Move these constants and classes from
1428            layer.py to data.py
1429            (ShapefileStore.__init__): More Initialization for the new methods
1430            and functionality.
1431            (ShapefileStore.ShapeType, ShapefileStore.NumShapes)
1432            (ShapefileStore.BoundingBox, ShapefileStore.ShapesInRegion)
1433            (ShapefileStore.Shape): New methods that were formerly implemented
1434            in the layer.
1435            (DerivedShapeStore.Shape, DerivedShapeStore.ShapesInRegion)
1436            (DerivedShapeStore.ShapeType, DerivedShapeStore.NumShapes)
1437            (DerivedShapeStore.BoundingBox): New. DerivedShapeStore
1438            equivalents of the new shape methods. These versions are simply
1439            delegated to the original shapstore.
1440    
1441            * Thuban/Model/layer.py (SHAPETYPE_POLYGON, SHAPETYPE_ARC)
1442            (SHAPETYPE_POINT, Shape): Removed. They're now in data.py
1443            (Layer.SetShapeStore): Removed the initializatin of instance
1444            variables that were needed for the stuff that's now in
1445            ShapefileStore
1446            (Layer.BoundingBox, Layer.NumShapes, Layer.ShapeType)
1447            (Layer.Shape, Layer.ShapesInRegion): Simply delegate to the
1448            shapestore.
1449    
1450            * Thuban/UI/classifier.py, Thuban/UI/renderer.py,
1451            Thuban/UI/viewport.py: Import the SHAPETYPE_* constants from data
1452            instead of layer.
1453    
1454            * test/test_shapefilestore.py: New. Tests for ShapefileStore.
1455    
1456            * test/test_derivedshapestore.py: New. Tests for DerivedShapeStore.
1457    
1458            * test/test_layer.py: Import the SHAPETYPE_* constants from data
1459            instead of layer.
1460            (TestLayer.test_derived_store): Remove the test for the exception
1461            when instantiating the DerivedShapeStore with an incompatible
1462            table which is now in test_derivedshapestore.py. Add some more
1463            tests of the layer methods to determine whether they work for a
1464            DerivedShapeStore as well.
1465    
1466    2003-07-31  Jonathan Coles   <[email protected]>
1467    
1468            * Doc/manual/thuban-manual.xml: Fix the list of required packages
1469            by just listing the name and where they can be found.
1470    
1471    2003-07-31  Frank Koormann   <[email protected]>
1472    
1473            * Doc/manual/thuban-manual.xml:
1474            Changed the screenshot elements to figure.
1475            Changed some variablelist elements to itemizedlist.
1476            Added section on GDAL formats.
1477    
1478    2003-07-31  Jonathan Coles   <[email protected]>
1479    
1480            * Doc/manual/thuban-manual.xml: Added a few sentences about
1481            the Fix Border Color option when generating classes.
1482    
1483    2003-07-30  Jonathan Coles   <[email protected]>
1484    
1485            * Thuban/Model/classgen.py: Add docstrings. Rename specific
1486            Ramp instances to use lower_case_style.
1487    
1488            * Thuban/UI/classgen.py: Use renamed Ramp instances.
1489            
1490            * Thuban/UI/classifier.py: Add docstrings.
1491    
1492            * Thuban/UI/dock.py: Add docstrings.
1493    
1494            * test/test_classgen.py: Use renamed Ramp instances.
1495    
1496    2003-07-30  Bernhard Herzog  <[email protected]>
1497    
1498            * Thuban/Lib/connector.py (QueueingPublisher): Removed. This class
1499            was never used in Thuban.
1500    
1501    2003-07-30  Bernhard Herzog  <[email protected]>
1502    
1503            * Thuban/UI/join.py (JoinDialog.__init__): Use the table's Title()
1504            method directly instead of going through the transient_table
1505            method. This faster because transient_table may force the copy of
1506            a DBF file into the transient database and setting a table's title
1507            doesnm't affect the title of the associated transient table, so
1508            this fixes RT #2042
1509    
1510            * Thuban/UI/main.py (__version__): Don't import the already
1511            removed show_exception_dialog.
1512    
1513    2003-07-29  Jonathan Coles   <[email protected]>
1514    
1515            * Thuban/UI/application.py (ThubanApplication.ShowExceptionDialog):
1516            Put back this method and remove the equivalent function since we
1517            are setting the exception hook from within this class (OnInit).
1518    
1519    2003-07-29  Jonathan Coles   <[email protected]>
1520    
1521            * Doc/manual/images/5_2_custom_ramp.png,
1522            Doc/manual/images/5_2_quantiles.png,
1523            Doc/manual/images/5_2_uniform_dist.png,
1524            Doc/manual/images/5_2_unique_values.png,
1525            Doc/manual/images/8_int_error.png: New screen shots.
1526    
1527            * Doc/manual/thuban-manual.xml: Fixed typos and wording, clarified
1528            some points, and added more screen shots.
1529    
1530    2003-07-29  Bernhard Herzog  <[email protected]>
1531    
1532            * Thuban/Model/data.py: Remove the now unused import of warnings
1533    
1534    2003-07-29  Bernhard Herzog  <[email protected]>
1535    
1536            * Thuban/Model/data.py (SimpleStore): Removed. This class has been
1537            deprecated since before the 0.8 release and isn't used in Thuban
1538            itself anymore.
1539    
1540            * Thuban/Model/transientdb.py: Remove some unnecessary imports
1541    
1542    2003-07-29  Jonathan Coles   <[email protected]>
1543    
1544            * Thuban/UI/application.py (ThubanApplication.OnInit): set the
1545            python exception hook here so that we are sure to catch any
1546            Thuban exception that happen during initialization.
1547    
1548            * Thuban/UI/main.py (main): Don't set the exception hook here,
1549            it will get set in ThubanApplication.OnInit.
1550    
1551    2003-07-29  Jonathan Coles   <[email protected]>
1552                                                                                
1553            * Thuban/UI/application.py (ThubanApplication.ShowExceptionDialog):
1554            Removed and called it show_exception_dialog() so that the exception
1555            handler can be set before the class is created.
1556                                                                                
1557            * Thuban/UI/main.py (main): Install the exception handler before
1558            a ThubanApplication is created.
1559                                                                                    
1560    2003-07-29  Bernhard Herzog  <[email protected]>
1561    
1562            * po/it.po: New. Italian translation by Maurizio Napolitano
1563    
1564            * po/ru.po: New. Russian translation by Alex Shevlakov
1565    
1566    2003-07-29  Frank Koormann   <[email protected]>
1567    
1568            * Doc/manual/thuban-manual.xml: Extended section on supported
1569            projections.
1570            
1571    2003-07-29  Frank Koormann   <[email protected]>
1572    
1573            * Doc/manual/thuban-manual.xml: gaspell-checked.
1574    
1575    2003-07-29  Jonathan Coles   <[email protected]>
1576    
1577            * Doc/manual/images/3_5_legend.png: Added border to improve look
1578            on white background.
1579    
1580    2003-07-29  Jonathan Coles   <[email protected]>
1581    
1582            * Doc/manual/thuban-manual.xml: Fixed grammar and typos. Added
1583            descriptions for the legend toolbar.
1584    
1585            * Doc/manual/images/4_2_raster_layer_properties.png: Removed
1586            cursor from dialog box.
1587    
1588    2003-07-28  Jonathan Coles   <[email protected]>
1589    
1590            * Doc/manual/thuban-manual.xml: More screenshots and more chapters.
1591    
1592            * Doc/manual/images/2_4_session_tree.png,
1593            Doc/manual/images/3_5_legend.png, Doc/manual/images/3_rename_map.png,
1594            Doc/manual/images/4_2_layer_properties.png,
1595            Doc/manual/images/4_2_raster_layer_properties.png,
1596            Doc/manual/images/5_3_genclass.png,
1597            Doc/manual/images/5_classification.png,
1598            Doc/manual/images/6_projection.png,
1599            Doc/manual/images/7_1_table_view.png,
1600            Doc/manual/images/7_2_5_join.png: New screenshots.
1601    
1602    2003-07-24  Jonathan Coles   <[email protected]>
1603    
1604            * Doc/manual/thuban-manual.xml: Chapter on Projection Management.
1605    
1606    2003-07-24  Jonathan Coles   <[email protected]>
1607    
1608            * Doc/manual/thuban-manual.xml: Added EPS images and wrote
1609            chapter on Layer Management.
1610    
1611            * Doc/manual/Makefile: New. Makefile to generate all formats for the
1612            manual and images.
1613    
1614    2003-07-24  Bernhard Herzog  <[email protected]>
1615    
1616            * Thuban/Model/range.py, Thuban/version.py: Remove the #! line as
1617            it annoys lintian which warns about these files not being
1618            executable. The #! isn't necessary here since if you absolutely
1619            must execute them you can always say "python <filename>".
1620    
1621            * Thuban/UI/renderer.py (ScreenRenderer.draw_shape_layer): Remove
1622            superfluous code to set brush and pen for point shapes
1623    
1624            * Thuban/UI/viewport.py: Remove commented out code that wouldn't
1625            belong in viewport anyway
1626    
1627    2003-07-24  Frank Koormann   <[email protected]>
1628    
1629            * Doc/manual/thuban-manual.xml: Added section on table management.
1630    
1631    2003-07-24  Bernhard Herzog  <[email protected]>
1632    
1633            * test/runtests.py (main): Recognize the long "verbose" option
1634            correctly.
1635    
1636    2003-07-22  Jonathan Coles   <[email protected]>
1637    
1638            * Doc/manual/thuban-manual.xml: Continue to write first revision
1639            of the manual.
1640    
1641            * Thuban/UI/renderer.py (MapRenderer.render_map): Wrap method
1642            with Begin/EndDrawing() calls to ensure we aren't doing to
1643            many updates to the dc during rendering.
1644            (ScreenRenderer.draw_shape_layer): self.draw_point_shape takes
1645            a pen and brush argument so they need to be passed to the function.
1646    
1647            * Thuban/UI/viewport.py (ViewPort.calc_min_max_scales): New.
1648            Calculates the minimum and maximum scale values. Factored out
1649            of set_view_transform so that it could be used to zoom all the
1650            way into a single point.
1651            (ViewPort.set_view_transform): Call calc_min_max_scales().
1652            (ViewPort.FitSelectedToWindow): Zoom to the maximum scale
1653            if only a single point is selected.
1654    
1655            * Doc/manual/images/1_2_legend_close.png,
1656            Doc/manual/images/1_2_legend_dock.png,
1657            Doc/manual/images/1_2_mainwindow.png,
1658            Doc/manual/images/1_2_mainwindow.ps,
1659            Doc/manual/images/1_2_mainwindow.sk,
1660            Doc/manual/images/3_2_fullextent.png,
1661            Doc/manual/images/3_2_fulllayerextent.png,
1662            Doc/manual/images/3_2_fullshapeextent.png,
1663            Doc/manual/images/3_2_pan.png,
1664            Doc/manual/images/3_2_zoomin.png,
1665            Doc/manual/images/3_2_zoomout.png,
1666            Doc/manual/images/3_3_identify.png,
1667            Doc/manual/images/3_3_label.png,
1668            Doc/manual/images/3_5_invisible.png,
1669            Doc/manual/images/3_5_movedown.png,
1670            Doc/manual/images/3_5_moveup.png,
1671            Doc/manual/images/3_5_props.png,
1672            Doc/manual/images/3_5_tobottom.png,
1673            Doc/manual/images/3_5_totop.png,
1674            Doc/manual/images/3_5_visible.png: New. Images for the documentation.
1675    
1676    2003-07-18  Bernhard Herzog  <[email protected]>
1677    
1678            * Thuban/UI/messages.py (MAP_REPLACED): New message.
1679    
1680            * Thuban/UI/viewport.py (ViewPort.SetMap): Issue MAP_REPLACED
1681            after the new map has been assigned
1682    
1683            * Thuban/UI/mainwindow.py (MainWindow.delegated_messages):
1684            Delegate MAP_REPLACED to the canvas too
1685            (MainWindow.prepare_new_session): Removed. Thanks to the new
1686            MAP_REPLACED message it's no longer needed
1687            (MainWindow.OpenSession, MainWindow.NewSession):
1688            prepare_new_session has been removed.
1689    
1690            * Thuban/UI/classifier.py (Classifier.__init__): Subscribe to
1691            MAP_REPLACED so that we can close the dialog if a new map is set.
1692            (Classifier.unsubscribe_messages): Unsubscribe from MAP_REPLACED
1693            (Classifier.map_replaced): Handle MAP_REPLACED by closing the
1694            dialog
1695    
1696            * test/test_viewport.py (SimpleViewPortTest)
1697            (SimpleViewPortTest.test_default_size): Add doc-strings
1698            (ViewPortTest.setUp): Bind map to self.map so we can use it in
1699            tests. Subscribe to MAP_REPLACED messages too.
1700            (ViewPortTest.tearDown): No need to explicitly unsubscribe
1701            (ViewPortTest.test_set_map): New test for the SetMap method.
1702    
1703    2003-07-18  Bernhard Herzog  <[email protected]>
1704    
1705            * test/test_viewport.py (SimpleViewPortTest.test_default_size):
1706            Move this test from ViewPortTest.setUp to this new separate test
1707            case. setUp is not the place for the actual tests.
1708            (ViewPortTest.test_inital_settings, ViewPortTest.setUp): Move some
1709            more of the test from setUp to the new test test_inital_settings.
1710            (ViewPortTest.test_win_to_proj, ViewPortTest.test_proj_to_win)
1711            (ViewPortTest.test_proj_conv): Split test_proj_conv into
1712            test_win_to_proj and test_proj_to_win and make the tests easier to
1713            understand
1714            (ViewPortTest.testFitRectToWindow, ViewPortTest.testZoomFactor)
1715            (ViewPortTest.testZoomOutToRect, ViewPortTest.testTranslate)
1716            (ViewPortTest.test_unprojected_rect_around_point)
1717            (ViewPortTest.test_find_shape_at, ViewPortTest.testTools):
1718            Reformat to increase readability.
1719    
1720    2003-07-18  Bernhard Herzog  <[email protected]>
1721    
1722            * Thuban/UI/view.py (MapCanvas.OnLeftDown): Capture the mouse.
1723    
1724    2003-07-18  Bernhard Herzog  <[email protected]>
1725    
1726            * test/runtests.py: The test suite can now be run without an X
1727            connection. To make sure this remains true, remove the DISPLAY
1728            environment variable so that an error occurs if the wxGTK is
1729            imported accidentally
1730    
1731    2003-07-18  Bernhard Herzog  <[email protected]>
1732    
1733            * Thuban/UI/viewport.py: Remove unused imports
1734    
1735            * Thuban/UI/view.py: Remove unused imports
1736    
1737    2003-07-18  Bernhard Herzog  <[email protected]>
1738    
1739            * test/test_export.py Remove unused imports. The OutputTransform
1740            function is now in viewport.py and is called output_transform
1741            (TestScalebar.test_output_transform)
1742            (TestScalebar.test_OutputTransform): Renamed to
1743            test_output_transform and updated to use output_transform instead
1744            of OutputTransform
1745    
1746            * Thuban/UI/view.py (OutputTransform): Moved to viewport.py and
1747            renamed.
1748            (MapCanvas.Export, MapPrintout.draw_on_dc): OutputTransform was
1749            renamed to output_transform
1750    
1751            * Thuban/UI/viewport.py (OutputTransform, output_transform):
1752            Rename to output_transform
1753    
1754    2003-07-18  Bernhard Herzog  <[email protected]>
1755    
1756            * Thuban/Model/layer.py (Layer.__init__): Rename
1757            classificationField to classificatin_column and init it here so
1758            that it can be used in SetClassificationColumn
1759            (Layer.GetClassificationColumn, Layer.GetClassificationField):
1760            Rename to GetClassificationColumn.
1761            (Layer.SetClassificationColumn, Layer.SetClassificationField):
1762            Rename to SetClassificationColumn and issue a LAYER_CHANGED
1763            message if the column changes.
1764            (Layer._classification_changed, Layer.ClassChanged): Rename to
1765            _classification_changed. Update the callers.
1766            (Layer.SetShapeStore): Further field->column renames.
1767    
1768            * Thuban/Model/load.py (SessionLoader.start_classification)
1769            (SessionLoader.start_clpoint): Updates because of
1770            field->column method name changes in the Layer class
1771    
1772            * Thuban/Model/save.py (SessionSaver.write_classification): Updates
1773            because of field->column method name changes in the Layer class
1774    
1775            * Thuban/UI/classifier.py (Classifier.__init__)
1776            (Classifier._OnTry, Classifier._OnRevert): Updates because of
1777            field->column method name changes in the Layer class
1778    
1779            * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Updates
1780            because of field->column method name changes in the Layer class
1781    
1782            * Thuban/UI/viewport.py (ViewPort.find_shape_at): Updates because
1783            of field->column method name changes in the Layer class
1784    
1785            * test/test_save.py (SaveSessionTest.testClassifiedLayer)
1786            (SaveSessionTest.testClassifiedLayer): Update because of
1787            field->column method name changes in the Layer class
1788    
1789            * test/test_layer.py (SetShapeStoreTests.setUp)
1790            (SetShapeStoreTests.test_sanity): Update because of field->column
1791            method name changes in the Layer class
1792            (TestLayerModification.setUp): Subscribe to LAYER_CHANGED as well
1793            (TestLayerModification.test_sanity)
1794            (TestLayerModification.test_initial_settings): remove unsued code
1795            and rename to test_sanity.
1796            (TestLayerModification.test_set_classification): New test for
1797            SetClassification and SetClassificationField.
1798    
1799    2003-07-18  Bernhard Herzog  <[email protected]>
1800    
1801            * test/test_classgen.py (TestFixedRamp.test): Extend test to check
1802            the non-fixed values as well. The old test would have accepted a
1803            fixed ramp that only returnes the fixed properties
1804    
1805    2003-07-17  Jonathan Coles   <[email protected]>
1806    
1807            * Doc/manual/mainwindow.png, Doc/manual/mainwindow.xcf: Screen
1808            shots for the manual. The XCF file is the source image and
1809            has additional layers to support changes.
1810    
1811            * Doc/manual/thuban-manual.xml: Wrote an initial Introduction.
1812    
1813            * Thuban/UI/classifier.py (Classifier.__BuildClassification):
1814            Return both the new class and the field name.
1815    
1816            * Thuban/UI/mainwindow.py (MainWindow.ToggleLegend): Don't
1817            fit the map to the window as this changes any zoom level that
1818            the user may have set.
1819    
1820    2003-07-16  Jonathan Coles   <[email protected]>
1821    
1822            * Thuban/Model/classgen.py (generate_singletons,
1823            generate_uniform_distribution, generate_quantiles): Remove
1824            fixes parameter, but maintain the same functionality by having
1825            the calling function pass a FixedRamp object for the ramp.
1826            (FixedRamp): New. Adapts a ramp to have fixed property values.
1827    
1828            * Thuban/Model/classification.py: Use new CLASS_CHANGED message.
1829            (Classification): Inherit from Publisher.
1830            (Classification.__init__): Remove the layer parameter.
1831            Classifications no longer need to have a parent layer.
1832            (Classification.GetField, Classification.GetFieldType,
1833            Classification.SetFieldInfo): Removed. The field name is stored
1834            in the layer, and the type can be retreived by calling
1835            Layer.GetFieldType().
1836            (Classification._set_layer, Classification.GetLayer): Removed.
1837            Classifications no longer have a parent layer.
1838    
1839            * Thuban/Model/layer.py (Layer.Destroy): Unsubscribe from the
1840            classification.
1841            (Layer.SetShapeStore): Reset the classification first while
1842            we still have the old shape store to work with.
1843            (Layer.GetClassificationField, Layer.SetClassificationField):
1844            New. Method for getting/setting the field to classify on.
1845            (Layer.SetClassification): Simplified now that the layer
1846            simply has to hold a reference to the classification and not
1847            tell the classification who owns it.
1848            Fixes RTbug #2023.
1849    
1850            * Thuban/Model/load.py (SessionLoader.start_classification):
1851            Set the field name on the layer, not the classification.
1852    
1853            * Thuban/Model/messages.py: Add CLASS_CHANGED for when a
1854            classification is modified.
1855    
1856            * Thuban/Model/save.py (SessionSaver.write_classification):
1857            Get the field name and type from the layer.
1858    
1859            * Thuban/Model/table.py (table_to_dbf, table_to_csv): Renamed
1860            parameter records to rows and add docstring. Fixes RTbug #1997.
1861    
1862            * Thuban/UI/classgen.py (ClassGenDialog.OnOK): Use a fixed
1863            ramp when we need to fix certain values of a ramp rather than
1864            using the old fixes parameter. Fixes RTbug #2024.
1865    
1866            * Thuban/UI/classifier.py (ClassGrid.CreateTable): Add fieldType
1867            parameter.
1868            (ClassTable.Reset): Add fieldType parameter and use it, rather
1869            than asking the classification.
1870            (Classifier.__init__): Remember the original class's field
1871            and ask the layer for the field type, rather than the classification.
1872            (Classifier.__SetGridTable): Retrieve the field and field type
1873            for the table because they are not in the classification.
1874            (Classifier._OnTry, Classifier._OnRevert): Set the classification
1875            field on the layer in addition to the classification itself.
1876    
1877            * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Get the
1878            classification field from layer.
1879    
1880            * Thuban/UI/viewport.py (ViewPort.find_shape_at): Get the
1881            classification field from layer. Split up tests and remove
1882            *-imports. Fixes RTbug #1992.
1883    
1884            * test/test_classgen.py (TestFixedRamp): Test for the FixedRamp class.
1885    
1886            * test/test_classification.py
1887            (TestClassification.test_classification): Remove tests for methods
1888            that no longer exist.
1889    
1890            * test/test_layer.py (SetShapeStoreTests.setUp): Classification
1891            __init__ no longer has a field parameter, use SetClassificationField.
1892            (SetShapeStoreTests.test_sanity): Use layer object to get class
1893            field info.
1894    
1895            * test/test_save.py (SaveSessionTest.testClassifiedLayer): Use
1896            SetClassificationField on layer to set class field info.
1897    
1898            * test/test_viewport.py: Renamed from test/test_view.py.
1899    
1900    2003-07-16  Jan-Oliver Wagner <[email protected]>
1901    
1902            * Doc/manual/thuban-manual.xml: Added authors and an initial
1903            coarse structure.
1904    
1905    2003-07-15  Bernhard Herzog  <[email protected]>
1906    
1907            * test/support.py (FloatComparisonMixin): This is a mix-in class
1908            and therefore should not be derived from any other class.
1909    
1910            * test/test_range.py (RangeTest): FloatComparisonMixin is a
1911            mix-in, so derive from TestCase as well.
1912    
1913    2003-07-15  Bernhard Herzog  <[email protected]>
1914    
1915            * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Rework the
1916            draw_func handling a bit to remove one layer of indirection. This
1917            makes the renderer about 10% faster in the non-classifying case
1918            and the code a bit cleaner
1919            (MapRenderer.draw_point_shape): Add the pen and brush parameters
1920            and set them in the dc. Now the draw_point_shape method and
1921            wxproj's draw_polygon_shape function have basically the same
1922            signature so that both can be directly used as draw_func
1923    
1924    2003-07-15  Bernhard Herzog  <[email protected]>
1925    
1926            * Thuban/Model/save.py (SessionSaver.write_classification): Encode
1927            string values (in addition to the labels) as UTF 8
1928    
1929            * Thuban/Model/load.py (SessionLoader.start_clpoint): Decode the
1930            values if the field type is string
1931    
1932            * test/test_save.py (SaveSessionTest.testClassifiedLayer): Test
1933            saving a session with non-ascii string classification values.
1934    
1935            * test/test_load.py (TestClassification.file_contents)
1936            (TestClassification.test): Check for non-ascii values in string
1937            classifications
1938    
1939    2003-07-14  Jonathan Coles   <[email protected]>
1940    
1941            * test/test_view.py: New. Tests for ViewPort.
1942    
1943    2003-07-14  Frank Koormann   <[email protected]>
1944    
1945            * Thuban/Model/load.py (SessionLoader.start_map): Encode map
1946            title to latin1.  Fixes https://intevation.de/rt/webrt?serial_num=2013
1947    
1948            * test/test_load_0_8.py (TestUnicodeStrings): New, test load of
1949            unicode strings from session file: session title, map title and
1950            projection name.
1951            
1952    2003-07-10  Jonathan Coles   <[email protected]>
1953    
1954            * Thuban/UI/viewport.py (Tool.MouseUp): Should have called
1955            drag_stop, not drag_move when the mouse is released.
1956    
1957    2003-07-10  Jonathan Coles   <[email protected]>
1958    
1959            The most important part of this is the seperation of view.py into
1960            two pieces. viewport.py now has a class called ViewPort which
1961            contains all the non-wx parts of view.py and can therefore be
1962            tested. view.py contains only the wx-specific parts and is fairly
1963            simple.
1964    
1965            * Thuban/UI/view.py: Stripped out all non-wx functionality. Fixes
1966            RTTbug #1992.
1967            * Thuban/UI/viewport.py: New. Contains non-wx view functionality.
1968            RTTbug #1992.
1969    
1970            * Thuban/Model/classgen.py (generate_singletons,
1971            generate_uniform_distribution, generate_quantiles):
1972            Added 'fixes' parameter so that property attributes can
1973            be held constant over the generated classification groups.
1974            (CustomRamp.GetProperties): Remove unused variables.
1975    
1976            * Thuban/Model/map.py (Map.SetProjection): Send the old
1977            projection as an argument to listeners of the MAP_PROJECTION_CHANGED
1978            event.
1979    
1980            * Thuban/Model/table.py (table_to_dbf, table_to_csv): Added 'records'
1981            parameter which is a list of records that restricts which
1982            records are saved. Fixes RTbug #1997.
1983    
1984            * Thuban/UI/application.py (ThubanApplication.ShowExceptionDialog):
1985            Port exception dialog from GREAT-ER. Fixes RTbug #1993.
1986    
1987            * Thuban/UI/classgen.py (ClassGenDialog.__init__): Add controls
1988            to allow the user to fix line color/width on generated groups.
1989            (ClassGenDialog.OnOK): Use new 'fixes' parameter of the generate_*
1990            functions to optionally fix group properties.
1991    
1992            * Thuban/UI/main.py (main): Set exception hook to the
1993            ShowExceptionDialog. Fixes RTbug #1993.
1994    
1995            * Thuban/UI/mainwindow.py (MainWindow.ShowTableView): Raise
1996            the table window when it is selectd to be shown.
1997    
1998            * Thuban/UI/tableview.py (QueryTableFrame.__init__): Add an
1999            Export Selection button and move the export buttons underneath
2000            the table.
2001            (QueryTableFrame.UpdateStatusText): Added event argument so
2002            that it can respond to grid selection events. The status text
2003            is now updated even when the table is not associated with a
2004            layer as was previously assumed.
2005            (QueryTableFrame.OnGridSelectRange, OnGridSelectCell): Removed.
2006            UpdateStatusText responds to these events.
2007            (QueryTableFrame.OnSaveAs): Renamed to doExport.
2008            (QueryTableFrame.doExport): Helper function that saves the
2009            entire table, or selected rows, to a file.
2010            (QueryTableFrame.OnExport, QueryTableFrame.OnExportSel): New.
2011            Respond to export button events and call doExport.
2012    
2013            * extensions/thuban/gdalwarp.cpp (ProjectRasterFile): Make sure
2014            the function doesn't return NULL without first setting a Python
2015            Error.
2016    
2017            * test/runtests.py (main): Only print "Unknown option" for
2018            unsupported options.
2019    
2020            * test/support.py (FloatComparisonMixin.assertFloatEqual): Take
2021            optional epsilon argument to specify floating point accuracy.
2022            (FloatComparisonMixin.assertFloatSeqEqual): Call assertFloatEqual
2023            for each item test.
2024    
2025            * test/test_csv_table.py (TestCSVTable.test_table_to_cvs): Add
2026            tests for saving selected records.
2027    
2028            * test/test_dbf_table.py (TestTableToDBF.test_table_to_dbf): Add
2029            tests for saving selected records.
2030    
2031            * test/test_map.py (TestMapWithContents.test_set_projection):
2032            MAP_PROJECTION_CHANGED events send the old projection.
2033    
2034            * test/test_session.py
2035            (TestSessionWithContent.test_forward_map_projection):
2036            MAP_PROJECTION_CHANGED events send the old projection.
2037    
2038            * test/test_table.py (TableTest): Update tests to use non-deprecated
2039            functions.
2040    
2041    2003-07-08  Bernhard Herzog  <[email protected]>
2042    
2043            * Thuban/Model/transientdb.py (TransientTableBase.Width): The type
2044            constants in the column objects are the standard ones defined in
2045            the table module.
2046    
2047            * test/test_transientdb.py
2048            (TestTransientTable.test_transienttable_to_dbf): New. Test whether
2049            exporting transient tables as DBF works. This should catch the bug
2050            just fixed in TransientTableBase.Width.
2051    
2052    2003-07-08  Bernhard Herzog  <[email protected]>
2053    
2054            * Thuban/Model/classgen.py (CustomRamp.GetProperties): Compute the
2055            interpolated colors correctly.
2056    
2057            * test/test_classgen.py (TestCustomRamp.test_color_interpolation):
2058            New. Test case for the fix in classgen.py
2059    
2060    2003-07-08  Bernhard Herzog  <[email protected]>
2061    
2062            * test/runtests.py (main): Make the default output less verbose
2063            and add a verbosity option (-v) to get the old output
2064    
2065    2003-07-08  Bernhard Herzog  <[email protected]>
2066    
2067            * Resources/XML/thuban-0.9.dtd: New. This will become the DTD for
2068            0.9.
2069    
2070            * Thuban/Model/transientdb.py (TransientJoinedTable.JoinType):
2071            New. Return the join type
2072    
2073            * Thuban/Model/save.py (SessionSaver.write_session): Use new 0.9
2074            DTD
2075            (SessionSaver.write_data_containers): Save the join type for
2076            joined tables
2077    
2078            * Thuban/Model/load.py (SessionLoader.__init__): Add the new 0.9
2079            namespace
2080            (SessionLoader.start_jointable): Handle the jointype attribute
2081    
2082            * test/test_load_0_8.py: New. Effectively a copy of test_load.py
2083            as of Thuban 0.8. These are now tests to determine whether Thuban
2084            can still read files generated by Thuban 0.8
2085    
2086            * test/test_load.py (LoadSessionTest.dtd)
2087            (TestSingleLayer.file_contents)
2088            (TestLayerVisibility.file_contents, TestLabels.file_contents)
2089            (TestLayerProjection.file_contents)
2090            (TestRasterLayer.file_contents, TestJoinedTable.file_contents)
2091            (TestJoinedTable.file_contents)
2092            (TestLoadError.file_contents): Update for new DTD
2093            (TestJoinedTable.file_contents, TestJoinedTable.setUp): Add test
2094            for new join type attribute
2095    
2096            * test/test_save.py (SaveSessionTest.dtd)
2097            (SaveSessionTest.testEmptySession)
2098            (SaveSessionTest.testSingleLayer)
2099            (SaveSessionTest.testLayerProjection)
2100            (SaveSessionTest.testRasterLayer)
2101            (SaveSessionTest.testClassifiedLayer)
2102            (SaveSessionTest.test_dbf_table)
2103            (SaveSessionTest.test_joined_table): Update for new DTD
2104            (SaveSessionTest.test_joined_table): Add test for new join type
2105            attribute
2106    
2107    2003-07-04  Bernhard Herzog  <[email protected]>
2108    
2109            * Thuban/Model/table.py (_find_dbf_column_names): New. Helper
2110            function for table_to_dbf
2111            (table_to_dbf): Deal with names longer than the 10 character limit
2112    
2113            * test/test_dbf_table.py (TestTableToDBF.test_table_to_dbf): Add
2114            doc-string
2115            (TestTableToDBF.test_table_to_dbf_long_col_names): New test for
2116            long column names
2117    
2118    2003-07-03  Bernhard Herzog  <[email protected]>
2119    
2120            * Doc/manual/thuban-manual.xml: Fix the CVS Revision Tag syntax
2121    
2122    2003-07-03  Bernhard Herzog  <[email protected]>
2123    
2124            * Doc/manual/thuban-manual.xml, Doc/manual/README: New. Skeleton
2125            for the Thuban manual and README with some basic information about
2126            the manual
2127    
2128    2003-07-03  Bernhard Herzog  <[email protected]>
2129    
2130            * Thuban/Model/transientdb.py (TransientJoinedTable.__init__):
2131            Update doc-string
2132            (TransientJoinedTable.create): Do not modify the column objects of
2133            the input tables in place and copy all columns of the input tables
2134            into the joined table after all.
2135    
2136            * test/test_transientdb.py
2137            (TestTransientTable.test_transient_joined_table_same_column_name):
2138            Update to reflect the new behavior
2139            (TestTransientTable.test_transient_joined_table_with_equal_column_names):
2140            Update to reflect the new behavior
2141            (TestTransientTable.test_transient_joined_table_name_collisions_dont_modify_in_place):
2142            New test case for a bug which modified the column objects in place
2143    
2144    2003-07-02  Jonathan Coles   <[email protected]>
2145    
2146            * Thuban/Model/classgen.py (generate_singletons,
2147            generate_uniform_distribution, generate_quantiles,
2148            GenQuantiles0): Make sure maxValue isn't less than
2149            one, otherwise we could divide by zero.
2150    
2151            * test/test_classgen.py (ClassGenTest.doClassRangeTest,
2152            ClassGenTest.doClassSingleTest): Call doBoundsTest to
2153            check the end classification groups against the
2154            proper property values.
2155            (ClassGenTest.doBoundsTest): New. Checks the first and
2156            last classification groups to make sure their properties
2157            are the correct upper and lower bounds for a color ramp.
2158    
2159    2003-07-02  Jonathan Coles   <[email protected]>
2160    
2161            * Thuban/Model/classgen.py (generate_singletons,
2162            generate_uniform_distribution, generate_quantiles,
2163            GenQuantiles0): The denominator was one to high when
2164            calculating the index for the ramp causing the index
2165            to never to reach one.
2166    
2167    2003-07-02  Jonathan Coles   <[email protected]>
2168    
2169            Changed the singature of ClassGroupRange.__init__ and
2170            ClassGroupRange.SetRange() so that the min/max values are
2171            passed as a tuple. This makes a better calling scheme for
2172            when a Range object is passed instead.
2173    
2174            * Thuban/Model/classgen.py: Fixed parameters to
2175            ClassGroupRange constructor.
2176    
2177            * Thuban/Model/classification.py (ClassGroupRange.__init__):
2178            Consolidate the min/max parameters into a single _range which
2179            can either be a tuple or a Range object.
2180            (ClassGroupRange.SetRange): Consolidate the min/max parameters
2181            into a single _range which can either be a tuple or a Range object.
2182    
2183            * Thuban/Model/load.py (SessionLoader.start_clrange): Fix
2184            call to ClassGroupRange constructor to use a tuple.
2185    
2186            * Thuban/Model/layer.py (Layer.SetClassification): Switch
2187            the classification instance variable to the new class
2188            before calling _set_layer otherwise subscribers to a
2189            LAYER_CHANGED event will not see any difference.
2190    
2191            * test/test_classification.py: Fix tests of ClassGroupRange
2192            so that they use the new signature.
2193    
2194            * test/test_load.py: Fix use of ClassGroupRange so that it
2195            uses the new signature.
2196    
2197            * test/test_load_0_2.py: Fix use of ClassGroupRange so that it
2198            uses the new signature.
2199    
2200            * test/test_save.py: Fix use of ClassGroupRange so that it
2201            uses the new signature.
2202    
2203    
2204    2003-07-01  Jonathan Coles   <[email protected]>
2205    
2206            * Thuban/Model/classgen.py: Fixes RTbug #1972, 1971.
2207            Import used objects/class from color.
2208            (generate_singletons): We don't
2209            need the numGroups parameter anymore because we are using
2210            the new ramps with GetProperties().
2211            (generate_uniform_distribution): Use new ramp method
2212            GetProperties().
2213            (generate_quantiles, GenQuantiles0): Use new ramp method
2214            GetProperties().
2215            (CustomRamp.SetNumGroups): Removed. The ramps now map
2216            a value from 0 to 1 to class properties so the number
2217            of groups is not needed ahead of time.
2218            (CustomRamp.next): Removed. CustomRamp does not support
2219            interation anymore.
2220            (CustomRamp.GetProperties): Returns a ClassGroupProperties
2221            object based on the index value from 0 to 1 that is
2222            passed to it.
2223            (GreyRamp, RedRamp, GreenRamp, BlueRamp, GreenToRedRamp):
2224            Made into instances of Monochromatic class instread of
2225            deriving from it.
2226            (HotToCold.SetNumGroups): Removed. See CustomRamp.
2227            (HotToCold.next): Removed. See CustomRamp.
2228    
2229            * Thuban/Model/classification.py: Fixes RTbug #1973, 1971.
2230            (Classification.SetField, Classification.SetFieldType):
2231            Replaced with SetFieldInfo.
2232            (Classification.SetFieldInfo): New. Does a better job of
2233            what SetField and SetFieldType used to do by combining
2234            their function since they should really always be done
2235            at the same time.
2236            (Classification.SetLayer): Renamed to _set_layer.
2237            (Classification._set_layer): Should only be called from
2238            Layer's SetClassification. This does not cause a recursive
2239            call as SetLayer did because we know that Layer knows about
2240            the classification.
2241    
2242            * Thuban/Model/color.py: Fixes RTbug #1971.
2243            (_Transparent): Renamed from Transparent so it doesn't
2244            conflict with the module variable.
2245            (Transparent, Black): Renamed from Color.Transparent,
2246            Color.Black so they are not class variables.
2247    
2248            * Thuban/Model/layer.py: Fixes RTbug #1971, 1973.
2249            (Layer.Destroy): We don't need to call SetClassification
2250            anymore to clear out the back reference in the classifcation
2251            to the layer. It's better to set it to None using _set_layer,
2252            and we won't be creating another clas object too.
2253            (Layer.SetClassification): Classification._set_layer is not
2254            recursive so remove all the locking variables. Also clean
2255            up the code so that it remains unchanged if something fails.
2256    
2257            * Thuban/Model/load.py: Fixes RTbug #1971.
2258            (SessionLoader.start_classification): Call
2259            Classification.SetFieldInfo().
2260    
2261            * Thuban/Model/save.py: Removed import of Color which wasn't
2262            being used.
2263    
2264            * Thuban/UI/classgen.py: Fixes RTbug #1972.
2265            (ClassGenDialog.__init__): Color ramps are now instances
2266            already so we don't need to create any new objects.
2267            (ClassGenDialog.OnOK): Check for numGroups is no longer
2268            necessary because we never use it.
2269    
2270            * Thuban/UI/classifier.py: Fixes RTbug #1971.
2271            (Classifier.__BuildClassification, Classifier.__SetGridTable):
2272            Call Classification.SetFieldInfo() instead of SetFieldType.
2273    
2274            * Thuban/UI/renderer.py: Fixes RTbug #1971.
2275    
2276            * Thuban/UI/view.py: Fixes RTbug #1974, 1971.
2277            (MapCanvas.__init__): Subscribe to the idle time event. Set
2278            background color to white.
2279            (MapCanvas.OnPaint): Set a flag indicating that we should
2280            render the map during idle time. If we already have a bitmap
2281            just draw it now.
2282            (MapCanvas.OnIdle): New. Render the map only during idle time.
2283            This also fixes a problem with the busy cursor under gtk.
2284    
2285            * test/test_classgen.py (ClassGenTest.test_generate_singletons):
2286            Fix calls to generate_singletons because the signature changed.
2287    
2288            * test/test_classification.py: Fix color references and
2289            change calls to Classification.[SetField|SetFieldType] to
2290            SetFieldInfo.
2291    
2292            * test/test_load.py: Fix color references.
2293    
2294            * test/test_load_0_2.py: Fix color references.
2295    
2296            * test/test_save.py (SaveSessionTest.testClassifiedLayer):
2297            Change calls to Classification.[SetField|SetFieldType] to
2298            SetFieldInfo.
2299    
2300    2003-07-01  Frank Koormann   <[email protected]>
2301    
2302            MERGE from the greater-ms3 branch.
2303    
2304            * test/test_transientdb.py
2305            (TestTransientTable.test_transient_joined_table_with_equal_column_names):
2306            New. Test join of two tables with partly equal column names.
2307    
2308            * Thuban/Model/transientdb.py (TransientJoinedTable.create):
2309            If duplicates in left and right tables column names are found,
2310            append '_' (underscores) to the name until it is unique.
2311            Create always new internal names for the resulting table and reference
2312            columns in the join statement with <table>.<column>
2313    
2314    2003-07-01  Bernhard Herzog  <[email protected]>
2315    
2316            * test/test_transientdb.py
2317            (TestTransientTable.test_transient_joined_table_same_column_name):
2318            New. Test whether joining on columns with the same names in both
2319            tables works.
2320            
2321            * Thuban/Model/transientdb.py (TransientJoinedTable.create): Make
2322            sure to use the right internal names even when joining on field
2323            with the same names in both tables. Also, detect duplicate names
2324            in the joined table correctly.
2325    
2326    2003-07-01  Frank Koormann   <[email protected]>
2327    
2328            * Thuban/UI/renderer.py (ExportRenderer.render_legend):
2329            Reverse List of layers to render in same order as in desktop legend.
2330    
2331    2003-06-30  Jonathan Coles   <[email protected]>
2332    
2333            * Thuban/version.py (make_tuple): Takes a version string
2334            and splits it into a tuple of at most three integers.
2335            Used make_tuple() to make tuple versions of the version
2336            numbers.
2337    
2338            * Thuban/UI/about.py: Add Thuban email addresses.
2339    
2340    2003-06-30  Jonathan Coles   <[email protected]>
2341    
2342            * Thuban/version.py: SQLite/PySQLite version dependencies
2343            were too high.
2344    
2345    2003-06-30  Jonathan Coles   <[email protected]>
2346    
2347            * Thuban/version.py: Update version to 0.8.1
2348            
2349            * MANIFEST.in: Added Projections so that default.proj is
2350            included.
2351    
2352    2003-06-26  Jonathan Coles   <[email protected]>
2353    
2354            New About box with lots more information including library
2355            versions and credits. More/better version checking before
2356            Thuban starts.
2357    
2358            * Thuban/UI/about.py: New. New About box that displays
2359            library version information and credits.
2360    
2361            * Thuban/version.py: Added new 'versions' dictionary which
2362            contains the verions of various libraries which are checked
2363            when the module loads.
2364            (verify_versions): Check all version numbers and returns
2365            a list of errors.
2366    
2367            * Thuban/UI/classifier.py (Classifier.__EnableButtons):
2368            Reset the status of the buttons as the situation warrants,
2369            but in a better more reliable way by not relying on the
2370            current status to determine what needs to change.
2371    
2372            * Thuban/UI/main.py (wxCHECK_VERSION): Removed. Not needed.
2373            (verify_versions): Remove most of the code since it is
2374            now in Thuban.version.verify_versions.o
2375    
2376            * Thuban/UI/mainwindow.py (MainWindow.About): Call new
2377            About box in Thuban.UI.about.
2378    
2379            * extensions/thuban/gdalwarp.cpp (get_gdal_version): New.
2380            Returns the version of gdal library being used as a string.
2381    
2382            * extensions/thuban/wxproj.cpp (check_version, check_version_gtk):
2383            Removed.
2384            (get_proj_version): Return the version of PROJ that the file
2385            was compiled with.
2386            (get_gtk_version): Return th version of GTK that the file
2387            was compiled with.
2388    
2389    2003-06-25  Jonathan Coles   <[email protected]>
2390    
2391            * Thuban/UI/classifier.py (Classifier.EditSymbol): The parent
2392            of the SelectPropertiesDialog should be self so the window
2393            appears on top.
2394            (ClassGroupPropertiesCtrl.DoEdit): The parent
2395            of the SelectPropertiesDialog should be self so the window
2396            appears on top.
2397    
2398            * Thuban/UI/resource.py: Cleaned up how we determine file
2399            extensions.
2400            (GetImageResource): Return an wxImage from our Resources.
2401    
2402    2003-06-24  Jonathan Coles   <[email protected]>
2403    
2404            * Thuban/UI/renderer.py (ExportRenderer.render_legend):
2405            Check that a layer has a classification before trying
2406            to get it. Raster layers don't have classifications.
2407    
2408    2003-06-23  Jonathan Coles   <[email protected]>
2409            
2410            * setup.py: Add Resources/XML to resource list.
2411        
2412    2003-06-23  Jonathan Coles   <[email protected]>
2413    
2414            * setup.cfg: Fix copyright dates
2415        
2416    2003-06-23  Jonathan Coles   <[email protected]>
2417    
2418            * MANIFEST.in: Update with Resources/XML
2419    
2420            * setup.py: Don't include Locale resources yet as we don't
2421            have any and it causes problems building the distribution
2422            for Windows. Update version to 0.8.0.
2423    
2424            * Doc/thuban.dtd: Removed since it is now in Resources/XML.
2425    
2426            * Thuban/UI/mainwindow.py: Add blank line at the end because
2427            file was not being read correctly building the Windows
2428            distribution.
2429    
2430    2003-06-23  Jonathan Coles   <[email protected]>
2431    
2432            * Thuban/UI/mainwindow.py (MainWindow.About): Fix text.
2433    
2434            * Thuban/version.py: Temporarily update longversion for
2435            the 0.8 release so that it doesn't have the cvs revision.
2436    
2437    2003-06-23  Jonathan Coles   <[email protected]>
2438    
2439            * Thuban/UI/common.py (ThubanBeginBusyCursor): Call wxSafeYield
2440            to make sure that we don't create reentrant possibilities with
2441            wxYield.
2442    
2443            * Thuban/UI/view.py (MapCanvas.OnPaint): Call wxBeginBusyCursor()
2444            directly to avoid the wxSafeYield() call which generates an
2445            OnPaint event causing infinite recursion. Don't try to catch
2446            exception anymore. This was for before there were limits on map
2447            scaling.
2448    
2449    2003-06-23  Bernhard Herzog  <[email protected]>
2450    
2451            Bug fix for RT #1961:
2452    
2453            * Thuban/Model/load.py (SessionLoader.start_derivedshapesource):
2454            Register DerivedShapestores with the session
2455    
2456            * Thuban/Model/session.py (Session.Tables): Make sure each table
2457            is only listed once.
2458    
2459            * test/test_load.py (TestJoinedTable.test): Add check_format call.
2460            Update file contents to match the one written out.
2461    
2462    2003-06-20  Bernhard Herzog  <[email protected]>
2463    
2464            * test/xmlsupport.py (SaxEventLister.startElementNS)
2465            (SaxEventLister.endElementNS): Do not include the qname. Python
2466            2.2.1 and 2.2.2 and 2.2.3 differ in this regard. In 2.2.1 qname it
2467            is (presumably incorrectly) None, whereas it's a string with the
2468            element name in the later versions.
2469    
2470            * test/test_xmlsupport.py (TestEventList.test_even_list_simple)
2471            (TestEventList.test_even_list_namespace): Update tests to reflect
2472            the new behaviour
2473            (TestEventList.test_even_list_id_normalization): Fix doc-string
2474    
2475    2003-06-20  Jonathan Coles   <[email protected]>
2476    
2477            * Thuban/Model/layer.py (BaseLayer.HasShapes): New. Overridden
2478            by deriving classes to determine if that layer supports shapes.
2479            (Layer): Override HasShapes and return true.
2480    
2481            * Thuban/UI/classgen.py: Use Thuban[Begin|End]BusyCursor()
2482            instead of a direct call to wx[Begin|End]CusyCursor().
2483            (GenUniquePanel._OnRetrieve): Set busy cursor while retrieving
2484            table data.
2485    
2486            * Thuban/UI/common.py (ThubanBeginBusyCursor, ThubanEndBusyCursor):
2487            New. Wrappers around the wxWindows functions that allow us to
2488            make additional calls such as wxYield which gives the native
2489            system a chance to update the cursor correctly.
2490    
2491            * Thuban/UI/tableview.py: Use Thuban[Begin|End]BusyCursor()
2492            instead of a direct call to wx[Begin|End]CusyCursor().
2493    
2494            * Thuban/UI/view.py: Use Thuban[Begin|End]BusyCursor()
2495            instead of a direct call to wx[Begin|End]CusyCursor().
2496            (MapCanvas.find_shape_at): Check if the current search layer
2497            support shapes, otherwise go on to the next layer.
2498    
2499            * test/test_layer.py: Add tests in each type of layer for
2500            HasClassification() and HasShapes()
2501    
2502    2003-06-20  Jonathan Coles   <[email protected]>
2503    
2504            * Thuban/UI/view.py (MapCanvas.OnPaint): Call wxYield after
2505            turning on the busy cursor to allow the system to change the
2506            cursor before we begin painting. This fixes a problem that
2507            was occuring only under GTK. Fixes RTbug #1840.
2508    
2509    2003-06-20  Bernhard Herzog  <[email protected]>
2510    
2511            * Resources/XML/thuban-0.8.dtd: New DTD for the new file format
2512            version.
2513    
2514            * Thuban/Model/save.py (sort_data_stores): New. Make topological
2515            sort of the data sources so they can be written with sources that
2516            data sources that depend on other data sources come after the
2517            sources they depend on.
2518            (SessionSaver.__init__): Add idmap instance variable to map from
2519            objects to the ids used in the file.
2520            (SessionSaver.get_id, SessionSaver.define_id)
2521            (SessionSaver.has_id): New. Methods to manage the idmap
2522            (SessionSaver.write): Use thuban-0.8.dtd
2523            (SessionSaver.write_session): Add a namespace on the session and
2524            write out the data sources before the maps.
2525            (SessionSaver.write_data_containers): New. Write the data
2526            containers.
2527            (SessionSaver.write_layer): Layer elements now refer to a
2528            shapestore and don't contain filenames anymore.
2529    
2530            * Thuban/Model/load.py (LoadError): Exception class to raise when
2531            errors in the files are discovered
2532            (SessionLoader.__init__): Define dispatchers for elements with a
2533            thuban-0.8 namespace too.
2534            (SessionLoader.check_attrs): New helper method to check and
2535            convert attributes
2536            (AttrDesc): New. Helper class for SessionLoader.check_attrs
2537            (SessionLoader.start_fileshapesource)
2538            (SessionLoader.start_derivedshapesource)
2539            (SessionLoader.start_filetable, SessionLoader.start_jointable):
2540            Handlers for the new elements in the new fileformat
2541            (SessionLoader.start_layer): Handle the shapestore attribute in
2542            addition to filename.
2543            (SessionLoader.start_table, SessionLoader.end_table): Removed.
2544            They were never used in the old formats and aren't needed for the
2545            new.
2546    
2547            * Thuban/Model/session.py (Session.DataContainers): New method to
2548            return all "data containers", i.e. shapestores and tables
2549    
2550            * test/xmlsupport.py (SaxEventLister.__init__)
2551            (SaxEventLister.startElementNS, sax_eventlist): Add support to
2552            normalize IDs.
2553    
2554            * test/test_xmlsupport.py
2555            (TestEventList.test_even_list_id_normalization): New test case for
2556            id normalization
2557    
2558            * test/test_load.py (LoadSessionTest.check_format): Use ID
2559            normalization
2560            (LoadSessionTest.thubanids, LoadSessionTest.thubanidrefs): New
2561            class atrributes used for ID normalization
2562            (TestSingleLayer, TestLayerVisibility, TestLabels.test)
2563            (TestLayerProjection.test, TestRasterLayer.test): Adapt to new
2564            file format
2565            (TestJoinedTable): New test for loading sessions with joined
2566            tables.
2567            (TestLoadError): New. Test whether missing required attributes
2568            cause a LoadError.
2569    
2570            * test/test_save.py (SaveSessionTest.thubanids)
2571            (SaveSessionTest.thubanidrefs): New class attributes for ID
2572            normalization in .thuban files.
2573            (SaveSessionTest.compare_xml): Use id-normalization.
2574            (SaveSessionTest.testEmptySession)
2575            (SaveSessionTest.testLayerProjection)
2576            (SaveSessionTest.testRasterLayer)
2577            (SaveSessionTest.testClassifiedLayer): Adapt to new file format.
2578            (SaveSessionTest.testLayerProjection): The filename used was the
2579            same as for testSingleLayer. Use a different one.
2580            (SaveSessionTest.test_dbf_table)
2581            (SaveSessionTest.test_joined_table): New test cases for saving the
2582            new data sources structures.
2583            (TestStoreSort, MockDataStore): Classes to test the sorting of the
2584            data stores for writing.
2585    
2586            * test/runtests.py: Add CVS keywords
2587    
2588    2003-06-20  Jonathan Coles   <[email protected]>
2589    
2590            * test/test_session.py
2591            (UnreferencedTablesTests.test_unreferenced_tables_with_joins):
2592            Use the cultural_landmark-point.dbf file for the store so that
2593            the table rows and shape count match.
2594    
2595    2003-06-20  Jonathan Coles   <[email protected]>
2596    
2597            * Thuban/Model/data.py (DerivedShapeStore.__init__): Raise
2598            an exception if the number of shapes is different from the
2599            number of rows in the table. Address RTbug #1933.
2600    
2601            * test/test_layer.py (TestLayer.test_derived_store): Add
2602            a test for the new exception in DerivedShapeStore.__init__.
2603    
2604            * test/support.py (FloatTestCase): Removed since there is
2605            already FloatComparisonMixin. Fixes RTbug #1954.
2606            (FloatComparisonMixin.assertFloatEqual): Include test for
2607            infinity that was part of FloatTestCase.
2608    
2609            * test/test_range.py (RangeTest): Inherit from
2610            support.FloatComparisonMixin now that we don't have
2611            support.FloatTestCase.
2612    
2613    2003-06-20  Bernhard Herzog  <[email protected]>
2614    
2615            * test/test_save.py (SaxEventLister, sax_eventlist): Removed. Use
2616            the implementation in xmlsupport instead.
2617            (SaveSessionTest.compare_xml): sax_eventlist is now in xmlsupport
2618    
2619            * test/test_proj.py: Import sax_eventlist from xmlsupport instead
2620            of test_save
2621    
2622    2003-06-20  Bernhard Herzog  <[email protected]>
2623    
2624            * test/test_load.py (LoadSessionTest.check_format): New helper
2625            method to make sure the test files we load might have been written
2626            by the current thuban version.
2627            (ClassificationTest.TestLayers, TestSingleLayer.test)
2628            (TestLayerVisibility.test, TestClassification.test)
2629            (TestLabels.test, TestLayerProjection.test, TestRasterLayer.test):
2630            Add check_format() calls and fix the thuban data to match the data
2631            that would be written by saving the session loaded from it.
2632    
2633            * test/xmlsupport.py (SaxEventLister, sax_eventlist): Copies of
2634            the same class and function in test_save.
2635    
2636            * test/test_xmlsupport.py (TestEventList): New. test cases for
2637            sax_eventlist
2638    
2639    2003-06-20  Bernhard Herzog  <[email protected]>
2640    
2641            * Resources/XML/thuban.dtd: Add comment about which versions of
2642            Thuban are covered by this DTD
2643            (map): Fix content model for layers and raster layers. There can
2644            be any number or layers and raster layers in any order.
2645    
2646    2003-06-20  Jonathan Coles   <[email protected]>
2647    
2648            This is mainly about fixing RTbug #1949.
2649    
2650            * Thuban/Model/classification.py: Remove "from __future__"
2651            import statement since python 2.2 is the earliest supported
2652            version.
2653    
2654            * Thuban/Model/proj.py (Projection.GetProjectedUnits): New.
2655            Currently returns PROJ_UNITS_METERS or PROJ_UNITS_DEGREES
2656            depending on the units this projection *forwards* into.
2657    
2658            * Thuban/Model/save.py (SessionSaver.write_classification):
2659            Remove unnecessary use of lambdas and nested functions.
2660    
2661            * Thuban/UI/legend.py (ScaleBarBitmap.__SetScale): Do scale
2662            adjustment here if the map projection uses degrees.
2663    
2664            * Thuban/UI/scalebar.py (ScaleBar.DrawScaleBar): Remove
2665            scale adjust code since it is now done before calling
2666            this method. Don't do anything if the map projection
2667            is None.
2668    
2669    2003-06-19  Bernhard Herzog  <[email protected]>
2670    
2671            Move version specific load tests to their own file.
2672    
2673            * test/test_load.py: Expand the doc-string to explain a bit how to
2674            handle file format changes.
2675            (TestClassification.test): Update the docstring as this test is
2676            not about Thuban 0.2 anymore.
2677    
2678            * test/test_load_0_2.py: New file with the load tests for thuban
2679            files created with Thuban 0.2 and earlier.
2680    
2681    2003-06-19  Bernhard Herzog  <[email protected]>
2682    
2683            Add XML validation to some of the tests. Validation will only be
2684            done if pyRXP is installed (http://reportlab.com/xml/pyrxp.html).
2685            To make the DTD available to the test cases it's moved into
2686            Resources/XML
2687    
2688            * Resources/XML/thuban.dtd: New. This is now the real Thuban DTD
2689            for versions up to and including 0.2. Two slight changes: added an
2690            encoding specification and fixed the comment which refered to
2691            GRASS, not Thuban
2692    
2693            * test/xmlsupport.py: New support module for tests involving XML.
2694            Currently there's a mix-in class for XML validation.
2695    
2696            * test/test_xmlsupport.py: New. Tests for the xmlsupport module
2697    
2698            * test/test_save.py (SaveSessionTest): Derive from ValidationTest
2699            so that we can validate the
2700            (SaveSessionTest.testEmptySession)
2701            (SaveSessionTest.testSingleLayer)
2702            (SaveSessionTest.testSingleLayer)
2703            (SaveSessionTest.testLayerProjection)
2704            (SaveSessionTest.testRasterLayer)
2705            (SaveSessionTest.testClassifiedLayer): Validate the generated XML
2706    
2707            * test/runtests.py (main): Call print_additional_summary instead
2708            of print_garbage_information
2709    
2710            * test/support.py (resource_dir): New function to return the
2711            "Resource" subdirectory
2712            (print_additional_summary): New function to combine several
2713            summary functions
2714            (run_tests): Use print_additional_summary instead of calling
2715            print_garbage_information directly
2716    
2717    2003-06-19  Bernhard Herzog  <[email protected]>
2718    
2719            * Doc/thuban.dtd (classification): Correct the content model of
2720            the classification element.
2721            (projection): Add the "name" attribute
2722    
2723    2003-06-19  Frank Koormann   <[email protected]>
2724    
2725            MERGE from the greater-ms3 branch.
2726    
2727            * Thuban/UI/scalebar.py (ScaleBar.DrawScaleBar): Apply conversion to
2728            scale if projection is latlong to get better estimate.
2729    
2730            Fix problem of hidden properties dialog under windows after double
2731            click on layer tree:
2732            The tree control always gets an Expanded / Collapsed event after
2733            the ItemActivated  on double click, which raises the main window again.         We add a second ItemActivated event to the queue, which simply
2734            raises the already displayed window.
2735    
2736            * Thuban/UI/legend.py (LegendTree.__init__): Instance variable
2737            raiseProperties initialized to prevent endless loops
2738            (LegendTree._OnItemActivated): Depending on self.raiseProperties
2739            simply raise the properties or open the dialog and issue a second
2740            event.
2741    
2742    2003-06-18  Jonathan Coles   <[email protected]>
2743    
2744            * setup.py: Fix a few problems that occured under Windows.
2745    
2746    2003-06-18  Jonathan Coles   <[email protected]>
2747    
2748            When Thuban loaded the map was redrawn twice because the
2749            legend was being opened after the mainwindow was created
2750            and not during its creation. This meant the map was drawn
2751            initially and then had to be redrawn when the legend
2752            caused the display to change. Now the legend is opened
2753            in the mainwindow constructor which resolves this issue.
2754    
2755            Also, although we were checking for the existence of
2756            gdal and gdalwarp modules, the gdalwarp extension was
2757            still being compiled (which may fail if the system doesn't
2758            have gdal installed). the build_ext command to setup.py
2759            now accepts the flags --with-gdal and --without-gdal.
2760            If --without-gdal is specified setup.py will try to
2761            use the gdal parameters specified by gdal-config. Under
2762            windows, those parameters have to be set in setup.py
2763            as with proj4 an wxWindows.
2764    
2765            * setup.py: Use a list instead of seperate variables for
2766            extension parameters so we can create a generic function
2767            that runs an appropriate *-config script.
2768            (run_cs_script): Renamed from run_wx_script and modified
2769            to accept a second argument which is a list of lists to
2770            be filled in by the values returned from running the command.
2771            (thuban_build_ext): New. Extends the build_ext command and
2772            provides the options --with-gdal/--without-gdal which then
2773            optionally includes the gdalwarp extension.
2774    
2775            * Thuban/Model/resource.py: First check if we can import
2776            the gdalwarp Thuban extension before checking for gdal.
2777            Also added some comments.
2778            
2779            * Thuban/UI/legend.py (ScaleBarBitmap.__SetScale): Check if
2780            the map is None which may be the case if none has been loaded
2781            yet.
2782    
2783            * Thuban/UI/main.py (main): Remove call to ShowLegend.
2784    
2785            * Thuban/UI/mainwindow.py (MainWindow.__init__): Call ShowLegend().
2786    
2787            * Thuban/UI/renderer.py: Check for gdal support before importing
2788            gdalwarp.
2789            (MapRenderer.render_map): Only try to optimize if we have gdal
2790            support otherwise nothing will get drawn.
2791    
2792            * Thuban/UI/view.py (MapCanvas.FitMapToWindow): This may be called
2793            during startup before a map has been created. Check if map is None
2794            before using it and do nothing if it is.
2795    
2796    2003-06-17  Jonathan Coles   <[email protected]>
2797    
2798            Fix the problem with raster layers under Windows that caused
2799            Thuban to crash. The view should respond to layer projection
2800            changed events to update the display. Changes to a projection
2801            should not cause the map to be set to full extent.
2802            
2803            * Thuban/UI/view.py (MapCanvas.__init__): New instance variable
2804            current_map_proj to remember the current map projection so that
2805            when the projection changes we know what the previous projection
2806            was.
2807            (MapCanvas.SetMap): Unsubscribe and subscribe to
2808            LAYER_PROJECTION_CHANGED events.
2809            (MapCanvas.projection_changed): Split into two methods that respond
2810            to map and layer projection changes.
2811            (MapCanvas.map_projection_changed): New. Takes the current view and
2812            projects it using the new projection. This does not cause the
2813            map to be redrawn at full extent.
2814            (MapCanvas.layer_projection_changed): New. Cause a redraw which
2815            will draw each layer in its new projection.
2816            
2817            * extensions/thuban/bmpdataset.cpp (BMPDataset::Open): Call
2818            VSIFClose() not VSIFCloseL() to close the file. Fixes a crash
2819            under Windows.
2820            
2821            * extensions/thuban/gdalwarp.cpp (MFILENAME): Padding should be
2822            to twice sizeof(void*) because there are two digits for each
2823            hex byte.
2824    
2825    2003-06-16  Bernhard Herzog  <[email protected]>
2826    
2827            Update to the layer interface: Direct access to the table,
2828            shapetable, shapefile and filename attributes is now actively
2829            deprecated by issuing deprecation warnings for all places where
2830            this happens.
2831    
2832            * Thuban/Model/layer.py (Layer.__getattr__): New. Implement access
2833            to the instance variables table, shapetable, shapefile and
2834            filename via __getattr__ so that we can issue a deprecation
2835            warning.
2836            (Layer.SetShapeStore): Don't set the deprecated instance variables
2837            any more
2838            (Layer.SetShapeStore): Don't use deprecated layer instance
2839            variables
2840            (Layer.Destroy): No need to explicitly remove the instance
2841            variables any more
2842            (Layer.GetFieldType, Layer.Shape): Don't use deprecated layer
2843            instance variables
2844    
2845            * Thuban/UI/classgen.py (ClassGenDialog.__init__)
2846            (GenUniformPanel._OnRetrieve, GenUniquePanel._OnRetrieve)
2847            (GenQuantilesPanel.GetList, GenQuantilesPanel.OnRetrieve): Don't
2848            use deprecated layer instance variables
2849    
2850            * Thuban/UI/classifier.py (Classifier.__init__): Don't use
2851            deprecated layer instance variables
2852    
2853            * Thuban/UI/identifyview.py (IdentifyListCtrl.selected_shape)
2854            (IdentifyGridCtrl.selected_shape): Don't set the deprecated layer
2855            instance variables
2856    
2857            * Thuban/UI/tableview.py (LayerTableGrid.select_shapes): Don't use
2858            deprecated layer instance variables
2859    
2860            * Thuban/UI/mainwindow.py (MainWindow.LayerShowTable): Don't use
2861            deprecated layer instance variables
2862    
2863            * Thuban/Model/save.py (SessionSaver.write_layer): Don't use
2864            deprecated layer instance variables
2865    
2866            * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer)
2867            (MapRenderer.polygon_render_param): Don't use deprecated layer instance
2868            variables
2869    
2870            * test/runtests.py (main): Turn Thuban's deprecation warnings into
2871            errors so that they're cought by the tests
2872    
2873            * test/test_load.py (TestSingleLayer.test): Don't use deprecated
2874            layer instance variables
2875    
2876    2003-06-16  Jonathan Coles   <[email protected]>
2877    
2878            Fix a problem under Windows whereby if the user double-clicks on a
2879            layer in the legend that tree item will expand or collapse as well
2880            as open the layer properties dialog. The state of the tree item
2881            should not be affected.
2882    
2883            * Thuban/UI/legend.py (LegendTree.__init__): Add instance variable
2884            preventExpandCollapse and subscribe to expanding and collapsing
2885            events.
2886            (LegendTree.OnItemExpandCollapse): New. Responds to expanding and
2887            collapsing events and will veto the event if it has been triggered
2888            by the user double clicking on a layer.
2889            (LegendTree._OnItemActivated): Set preventExpandCollapse to indicate
2890            that an expanding/collapsing event should be vetoed.
2891    
2892    2003-06-13  Bernhard Herzog  <[email protected]>
2893    
2894            * Thuban/UI/classifier.py (Classifier.OnClose)
2895            (Classifier.map_layers_removed)
2896            (Classifier.layer_shapestore_replaced): Unsubscribe the messages
2897            in OnClose and not in map_layers_removed or
2898            layer_shapestore_replaced to make sure it always happens when the
2899            dialog is closed
2900    
2901    2003-06-13  Jonathan Coles   <[email protected]>
2902    
2903            This puts back a fix for Windows where a panel is needed so that
2904            the background of the table view appears correctly.
2905    
2906            * Thuban/UI/tableview.py (TableFrame.__init__): Add a panel
2907            object that can be used by derived classes to place any
2908            controls (including the grid) onto.
2909            (QueryTableFrame.__init__): Use the panel as the parent window
2910            for all the controls. Reparent the grid so that the panel is
2911            the parent. Call UpdateStatusText() to correctly initialize
2912            the status bar.
2913    
2914    2003-06-13  Jonathan Coles   <[email protected]>
2915    
2916            * Thuban/UI/dialogs.py (ThubanFrame): New: a class that inherits
2917            from wxFrame (as opposed to wxDialog like the other classes)
2918            but otherwise behaves like the other classes. This is needed
2919            for the TableView which isn't really a dialog and needs to
2920            have a status bar and control buttons.
2921    
2922            * Thuban/UI/tableview.py (TableGrid.__init__): Create an
2923            instance variable to keep track of how many rows are selected.
2924            Subscribe once to the the events we are interested in.
2925            (ThubanGrid.OnRangeSelect): Only handle event if event handling
2926            hasn't been turned off.
2927            (ThubanGrid.OnSelectCell): Only handle event if event handling
2928            hasn't been turned off.
2929            (ThubanGrid.ToggleEventListeners): Rather than subscribe None
2930            as an event listener (which changes the event handler stack)
2931            simply set an instance variable to False. This is checked in
2932            the event handlers.
2933            (ThubanGrid.GetNumberSelected): Return the number of currently
2934            selected rows.
2935            (TableFrame): Inherit from ThubanFrame so we can have a
2936            status bar and control buttons.
2937            (QueryTableFrame.__init__): Create a status bar. Fixes RTbug #1942.
2938            Explicitly set which items are selected in the operator choice and
2939            action choice so there is always a valid selection. Fixes RTbug #1941.
2940            Subscribe to grid cell selection events so we can update the
2941            status bar.
2942            (QueryTableFrame.UpdateStatusText): Update the status bar with
2943            how many rows are in the grid, how many columns, and how many
2944            rows are selected.
2945            (QueryTableFrame.OnGridSelectRange, QueryTableFrame.OnGridSelectCell):
2946            Call UpdateStatusText when cells are (de)selected.
2947            (QueryTableFrame.OnQuery): Use the string value in the value
2948            combo if either the selected item index is 0 or if the string
2949            cannot be found in the predefined list (this happens if the
2950            user changes the text). Fixes RTbug #1940.
2951            Only turn off the grid event listeners if there a query comes
2952            back with a none empty list of ids. in the case that the list
2953            is empty this causes a grid.ClearSelection() call to actually
2954            clear the grid selection which causes the selected items in
2955            the map to be deselected. Fixes RTbug #1939.
2956    
2957            * test/test_save.py (XMLWriterTest.Encode): Check return values.
2958            Fixes RTbug #1851.
2959    
2960    2003-06-13  Bernhard Herzog  <[email protected]>
2961    
2962            * Thuban/UI/identifyview.py (IdentifyView.__init__): Call
2963            self.selected_shape with the current selection to make sure the
2964            contents of the dialog are up to date when it's shown for the
2965            first time.
2966            The dialog used to work without this by luck. The recent fix to
2967            the connector module 'broke' a 'feature' the identify view was
2968            relying on, i.e that subscribing to a message in response to
2969            receiving a message of that type would mean that the new
2970            subscriber would also be called for the same message.
2971            
2972    2003-06-12  Jonathan Coles   <[email protected]>
2973    
2974            * extensions/thuban/gdalwarp.cpp: Removed debug printing as
2975            the image is rendered. Fixes RTbug #1937.
2976    
2977    2003-06-12  Jonathan Coles   <[email protected]>
2978    
2979            * Thuban/Lib/fileutil.py: As is done under Windows, create the
2980            user directory if it doesn't exist on a posix system.
2981            Fixes RTbug #1815.
2982    
2983            * Thuban/Model/resource.py (get_user_proj_files): Moved the
2984            called to get_application_dir here, so that the directory
2985            will only be called if this method is invoked.
2986    
2987            * Thuban/UI/projdialog.py (ProjFrame.__DoOnProjAvail): Clear
2988            the projfilepath if no projection is selected.
2989    
2990    2003-06-12  Jonathan Coles   <[email protected]>
2991    
2992            * Thuban/UI/legend.py (ScaleBarBitmap.__SetScale): Don't draw
2993            the scalebar if the current map has no projection set.
2994    
2995            * Thuban/UI/projdialog.py (ProjFrame.__DoOnProjAvail): Set the
2996            projfilepath label to just the basename of the projection file
2997            rather than include the entire path.
2998    
2999            * Thuban/Model/resource.py: Fix missed proj functions that
3000            needed to be renamed.
3001    
3002    2003-06-12  Jonathan Coles   <[email protected]>
3003    
3004            * Thuban/Model/classification.py: Removed assert statements that
3005            tested if the variable was an instance of Color.
3006    
3007            * Thuban/Model/color.py (Color): Remove commented code that isn't
3008            used.
3009            (Transparent): Renamed from NoColor. Doesn't inherit from Color.
3010            Fixes RTbug #1835.
3011            (Transparent.__eq__, Transparent.__ne, Transparent.__repr): New.
3012            Needed now that the class doesn't inherit from Color.
3013    
3014    2003-06-12  Jonathan Coles   <[email protected]>
3015    
3016            * test/test_save.py (XMLWriterTest.testEncode): Explicitly
3017            check unicode strings.
3018    
3019            * test/test_layer.py: Check for existence of gdal.
3020    
3021    2003-06-12  Jonathan Coles   <[email protected]>
3022        
3023            * Thuban/Model/xmlreader.py: New. Contains the XMLReader class
3024            that was in load.py
3025    
3026            * Thuban/Model/xmlwriter.py: New. Contains the XMLWriter class
3027            that was in save.py
3028    
3029    2003-06-12  Jonathan Coles   <[email protected]>
3030    
3031            This is largely a collection of bug fixes. We also handle the
3032            case where gdal is not on the system. The XMLReader and XMLWriter
3033            classes were moved into there own files to resolve some circular
3034            import references and because they shouldn't really be in the
3035            file that is dediciated to reading/writing session files since
3036            they are also used elsewhere.
3037    
3038            * Thuban/Model/classgen.py: Renamed functions to follow the
3039            function_names_with_underscores style. Fixes RTbug #1903.
3040            (calculate_quantiles): Raise ValueError if 'percents' is invalid.
3041    
3042            * Thuban/Model/layer.py: Import gdal only if it available.
3043            (RasterLayer): Handle the case where the gdal library is unavailable.
3044            Addresses RTbug #1877.
3045    
3046            * Thuban/Model/load.py (XMLReader): Moved into seperate file
3047            xmlreader.py.
3048    
3049    2003-06-12  Jonathan Coles   <[email protected]>
3050    
3051            This is largely a collection of bug fixes. We also handle the
3052            case where gdal is not on the system. The XMLReader and XMLWriter
3053            classes were moved into there own files to resolve some circular
3054            import references and because they shouldn't really be in the
3055            file that is dediciated to reading/writing session files since
3056            they are also used elsewhere.
3057    
3058            * Thuban/Model/classgen.py: Renamed functions to follow the
3059            function_names_with_underscores style. Fixes RTbug #1903.
3060            (calculate_quantiles): Raise ValueError if 'percents' is invalid.
3061    
3062            * Thuban/Model/layer.py: Import gdal only if it available.
3063            (RasterLayer): Handle the case where the gdal library is unavailable.
3064            Addresses RTbug #1877.
3065    
3066            * Thuban/Model/load.py (XMLReader): Moved into seperate file
3067            xmlreader.py.
3068    
3069            * Thuban/Model/save.py (escape, XMLWriter): Moved into seperate
3070            file xmlwriter.py.
3071    
3072            * Thuban/Model/resource.py: Renamed functions to following the
3073            function_names_with_underscores style.
3074            (has_gdal_support): New function that returns true if the gdal
3075            library is available. Addresses RTbug #1877.
3076    
3077            * Thuban/UI/application.py (ThubanApplication.OpenSession):
3078            Display a message box if the gdal library is not available, but
3079            only if there are any layers that would use it. Addresses RTbug #1877.
3080    
3081            * Thuban/UI/classgen.py: Use renamed projection resource functions.
3082            (GenUniformPanel.__CalcStepping): Fix a slight discrepency
3083            when using integers versus floats.
3084    
3085            * Thuban/UI/mainwindow.py (_has_gdal_support): New. Used to
3086            determine if the "Add Image Layer" menu option should be
3087            greyed out or not. Addresses RTbug #1877.
3088    
3089            * Thuban/UI/projdialog.py: Use renamed projection resource functions.
3090    
3091            * Thuban/UI/renderer.py (MapRenderer.render_map): Only try to
3092            optimize if a raster layer is visible. Fixes RTbug #1931.
3093            Only draw the raster layer if the gdal library is available.
3094            Addresses RTbug #1877.
3095    
3096            * test/test_classgen.py: Add tests for generate_singletons,
3097            generate_uniform_distribution, generate_quantiles. Fixes RTbug #1903.
3098            (test_calculate_quantiles): Fix some tests to catch the new
3099            ValueError that is raised.
3100    
3101            * test/test_proj.py: Use renamed projection resource functions.
3102    
3103            * test/test_save.py (SaveSessionTest.testClassifiedLayer): New
3104            test for saving classified layers. Fixes RTbug #1902.
3105            (XMLWriterTest): New. Tests the XMLWriter class. Fixes RTbug #1851.
3106    
3107    2003-06-12  Jan-Oliver Wagner <[email protected]>
3108    
3109            Fix for http://intevation.de/rt/webrt?serial_num=1900.
3110    
3111            * Thuban/UI/multiplechoicedialog.py: New. A multiple choice dialog.
3112    
3113            * Thuban/UI/mainwindow.py: import wxMultipleChoiceDialog from
3114            multiplechoicedialog.py rather than from the wxPython library.
3115    
3116    2003-06-11  Frank Koormann  <[email protected]>
3117    
3118            * Thuban/Lib/fileutil.py (get_application_dir): Minor stability
3119            update.
3120    
3121    2003-06-11  Frank Koormann  <[email protected]>
3122    
3123            * Thuban/Lib/fileutil.py (get_application_dir): New function to
3124            determine the absolute .thuban/thuban directory under
3125            "posix" (os.expanduser) and "nt" (read AppData registry key).
3126    
3127            * Thuban/Model/resource.py: Use get_application_dir
3128    
3129            * Thuban/UI/application.py (ThubanApplication.read_startup_files):
3130            Use get_application_dir.
3131    
3132    2003-06-10  Bernhard Herzog  <[email protected]>
3133    
3134            * Thuban/UI/tableview.py (LayerTableFrame.__init__): Subscribe to
3135            the messages MAP_LAYERS_REMOVED messages
3136            (LayerTableFrame.OnClose): Unsubscribe from it.
3137            (LayerTableFrame.map_layers_removed): New. Receiver for
3138            MAP_LAYERS_REMOVED. Close the dialog when the layer whose the
3139            dialog is showing is removed.
3140    
3141    2003-06-10  Bernhard Herzog  <[email protected]>
3142    
3143            * Thuban/Lib/connector.py (Connector.Issue): Iterate over a copy
3144            of the receivers list so that unsubscribing in a receiver doesn't
3145            modify it while iterating over it.
3146    
3147            * test/test_connector.py
3148            (ConnectorTest.test_disconnect_in_receiver): New. Test whether
3149            unsubscribing in a receiver works correctly. See docstring for
3150            details
3151    
3152    2003-06-10  Bernhard Herzog  <[email protected]>
3153    
3154            * Thuban/Model/messages.py (LAYER_SHAPESTORE_REPLACED): New
3155            message.
3156    
3157            * Thuban/Model/layer.py (Layer.SetShapeStore): Send
3158            LAYER_SHAPESTORE_REPLACED when the shapestore changes. A
3159            LAYER_CHANGED will still be sent if the classification changes.
3160    
3161            * Thuban/UI/classifier.py (Classifier.__init__): Add the map as
3162            parameter so we can subscribe to some of its messages
3163            (Classifier.__init__): Subscribe to the map's MAP_LAYERS_REMOVED
3164            and the layer's LAYER_SHAPESTORE_REPLACED
3165            (Classifier.unsubscribe_messages): New. Unsubscribe from message
3166            subscribed to in __init__
3167            (Classifier.map_layers_removed)
3168            (Classifier.layer_shapestore_replaced): receivers for the messages
3169            subscribed to in __init__. Unsubscribe and close the dialog
3170    
3171            * Thuban/UI/mainwindow.py (MainWindow.OpenLayerProperties): Pass
3172            the map to the Classifier dialog
3173    
3174            * test/test_layer.py (SetShapeStoreTests): Derive from
3175            SubscriberMixin as well so we can test messages
3176            (SetShapeStoreTests.setUp): Subscribe to some of the layer's
3177            messages
3178            (SetShapeStoreTests.tearDown): Clear the messages again
3179            (SetShapeStoreTests.test_sanity): Expand the doc-string and check
3180            for the modified flag too
3181            (SetShapeStoreTests.test_set_shape_store_modified_flag): New test
3182            to check whether SetShapeStore sets the modified flag
3183            (SetShapeStoreTests.test_set_shape_store_different_field_name)
3184            (SetShapeStoreTests.test_set_shape_store_same_field)
3185            (SetShapeStoreTests.test_set_shape_store_same_field_different_type):
3186            Add tests for the messages. This checks both the new
3187            LAYER_SHAPESTORE_REPLACED and the older LAYER_CHANGED
3188    
3189    2003-06-06  Jan-Oliver Wagner <[email protected]>
3190    
3191            * Thuban/UI/mainwindow.py: Improved and partly added help texts for
3192            the menu items.
3193    
3194    2003-06-05  Frank Koormann  <[email protected]>
3195    
3196            * Thuban/UI/identifyview.py (IdentifyView.__init__):
3197            Layout reimplemented without panel. Make life easier to fit the list
3198            in the dialog.
3199    
3200    2003-06-05  Frank Koormann  <[email protected]>
3201    
3202            * Thuban/UI/projdialog.py (ProjFrame.__init__): Fill the projchoice
3203            once on initialisation (Former implementation resulted in multiple
3204            entries for each projection).
3205            (ProjFrame.__FillAvailList): selectProj as second optional parameter,
3206            if set, select the projection found under the specified name. This
3207            overwrites any other selection estimate.
3208            Removed projchoice filling from this method.
3209            (ProjFrame._OnSave, ProjFrame._OnAddToList):
3210            Updated call of ProjFrame.__FillAvailList
3211            (LCCPanel._DoLayout): Moved parameter controls in more common order.
3212    
3213            * Resources/Projections/defaults.proj: Extended defaults representing
3214            various common European projections.
3215    
3216    2003-06-05  Frank Koormann  <[email protected]>
3217    
3218            * Thuban/UI/identifyview.py (IdentifyView.__init__):
3219            Use ListCtrl instead of GridCtrl
3220    
3221            * Thuban/Model/resource.py:
3222            Guess location of .thuban directory from tempdir parent directory.
3223    
3224            * Thuban/UI/application.py (ThubanApplication.read_startup_files):
3225            Guess location of .thuban directory from tempdir parent directory.
3226    
3227    2003-06-04  Bernhard Herzog  <[email protected]>
3228    
3229            Do not cache the values returned by the tree widget's
3230            GetFirstChild and GetNextChild methods because it led to lots of
3231            segfaults. The new way requires more brute force but is more
3232            reliable.
3233    
3234            * Thuban/UI/legend.py (LegendTree.__init__): Remove instance
3235            variable layer2id
3236            (LegendTree.find_layer): New method to do with brute force what
3237            layer2id tried to accomplish
3238            (LegendTree._OnMsgLayerChanged)
3239            (LegendTree._OnMsgLayerTitleChanged, LegendTree.__ShowHideLayer):
3240            Use find_layer instead of layer2id
3241            (LegendTree.__RemoveLayer, LegendTree.__AddLayer): No need to
3242            update layer2id anymore
3243            (LegendTree._OnMsgMapLayersRemoved)
3244            (LegendTree._OnMsgMapLayersAdded): Get by without layer2id.
3245    
3246    2003-06-03  Thomas Koester  <[email protected]>
3247    
3248            * Thuban/Model/classgen.py (GenQuantiles0): New function.
3249    
3250    2003-06-02  Bernhard Herzog  <[email protected]>
3251    
3252            * Thuban/UI/mainwindow.py (layer_rename command, table_rename command):
3253            New commands.
3254            (main_menu): Add the new commands.
3255            (MainWindow.TableRename): New. Implementation of the table_rename
3256            command.
3257            (MainWindow.RenameLayer): New. Implementation of the layer_rename
3258            command.
3259    
3260            * Thuban/Model/session.py (Session.AddTable): call self.changed to
3261            set the modified flag
3262    
3263            * test/test_session.py (TestSessionSimple.test_add_table): Test
3264            whether the modified flag is set properly
3265    
3266            * Thuban/Model/base.py (TitledObject.SetTitle): Call changed
3267            instead of issue so that the modified flags get updated.
3268    
3269            * test/test_base.py (SomeTitledObject): Derive from Modifiable
3270            instead of Publisher to reflect reality better and to accomodate
3271            the fact that SetTitle now calls changed instead of issue
3272    
3273    2003-06-02  Bernhard Herzog  <[email protected]>
3274    
3275            * Thuban/UI/classgen.py (GenQuantilesPanel.GetList): Resource
3276            acquisition has to happen before the try in a try-finally.
3277    
3278    2003-06-02  Bernhard Herzog  <[email protected]>
3279    
3280            * Thuban/UI/legend.py (LegendTree._OnMsgMapLayersRemoved): It's
3281            possible that a layer is removed that is not currently selected in
3282            the legend so don't check for this.
3283    
3284    2003-05-30  Bernhard Herzog  <[email protected]>
3285    
3286            * Thuban/Model/layer.py (Layer.Destroy): Set all instance
3287            variables to None that have direct or indirect references to
3288            shapefiles or dbf files to make sure that they do go away and the
3289            files are closed.
3290    
3291    2003-05-30  Bernhard Herzog  <[email protected]>
3292    
3293            * Thuban/UI/legend.py (LegendTree.GetRootItem): Reset
3294            availImgListIndices when a new image list is created
3295            
3296    2003-05-30  Bernhard Herzog  <[email protected]>
3297    
3298            * Thuban/UI/legend.py (LegendTree.__init__): New instance variable
3299            changing_selection to indicate whether the LegendTree code itself
3300            is currently changing the selection
3301            (LegendTree.normalize_selection): New method to normalize the
3302            selection by selecting the layer item even if the user clicked on
3303            the classification.
3304            (LegendTree._OnSelChanged): normalize the selection. This works
3305            around a bug in wx which doesn't keep track of the selection
3306            properly when subtrees are deleted.
3307    
3308    2003-05-30  Bernhard Herzog  <[email protected]>
3309    
3310            * Thuban/UI/view.py (MapCanvas.set_view_transform): Limit the
3311            maximum and minimum scale factors.
3312    
3313            * test/test_classgen.py (ClassGenTest.test): Update to reflect the
3314            changes in classgen.py
3315    
3316    2003-05-30  Jonathan Coles   <[email protected]>
3317    
3318            * Thuban/Model/classgen.py: Remove ClassGenerator class but make
3319            all the methods functions. Fixes RTBug #1903.
3320    
3321            * Thuban/Model/map.py (Map.TopLayer, Map.BottomLayer): Renamed
3322            to MoveLayerToTop and MoveLayerToBottom respectively. Fixes
3323            RTBug #1907.
3324    
3325            * Thuban/UI/classgen.py: Use classgen functions that were part
3326            of the ClassGenerator class. Put try/finally blocks around
3327            code that uses wxBeginBusyCursor()/wxEndBusyCursor(). Fixes
3328            RTBug #1904.
3329    
3330            * Thuban/UI/classifier.py: Remove unused import of ClassGenerator.
3331    
3332            * Thuban/UI/legend.py: The legend was cleared and repopulated any
3333            time something changed which caused some state to be lost such
3334            as which children were expanded or collapsed. Fixes RTBug #1901.
3335            (LegendTree._OnMsgMapLayersAdded): Add only new layers.
3336            (LegendTree.__OnMsgMapLayersRemoved): Remove layers that exist in
3337            the legend but not in the map.
3338            (LegendTree.__FillTree): Move main functionality out into smaller
3339            methods that can be used by other methods.
3340            (LegendTree.__FillTreeLayer): Reuse old slots in the image list
3341            if they are available.
3342            (LegendTree.DeleteAllItems): Renamed from __DeleteAllItems so
3343            that we override the wxTreeCtrl method. Iterate over children
3344            and call __RemoveLayer.
3345            (LegendTree.__AddLayer): New. Add a new layer to the legend.
3346            (LegendTree.__RemoveLayer): Remove a layer from the legend.
3347            (LegendTree.DeleteChildren): New, overrides wxTreeCtrl method.
3348            Should only be called with the id of a layer branch.
3349            (LegendTree.GetRootItem): New, overrides wxTreeCtrl method.
3350            Returns the root item or creates one if necessary.
3351    
3352            * Thuban/UI/renderer.py (MapRenderer.draw_raster_layer): Call
3353            ProjectRasterFile with tuple arguments instead of strings.
3354    
3355            * Thuban/UI/tableview.py (QueryTableFrame.OnQuery): Wrap code
3356            with try/finally. Fixes RTBug #1904.
3357    
3358            * Thuban/UI/view.py (MapCanvas.OnPaint): Wrap code
3359            with try/finally. Fixes RTBug #1904.
3360            (MapCanvas.FitSelectedToWindow): If a single point is selected
3361            simply center it on the display. Fixes RTBug #1849.
3362    
3363            * extensions/thuban/gdalwarp.cpp: Removed code that allowed gdalwarp
3364            to be compiled as a standalone app. Now the code can only be
3365            called from Python which simplifies the parameter passing.
3366            (ProjectRasterFile): Handle Python arguments. Remove code that
3367            checks for a destination dataset. Add more clean up code.
3368    
3369            * test/test_map.py (TestMapWithContents.test_raise_layer_top,
3370            TestMapWithContents.test_lower_layer_bottom):
3371            Test Map.MoveLayerToTop() and Map.MoveLayerToBottom() respectively.
3372            Fixes RTBug #1907.
3373    
3374            * Thuban/UI/mainwindow.py (MainWindow.ToggleLegend): Apply a full
3375            extent to the map when the legend is toggled. Fixes RTBug #1881.
3376    
3377    2003-05-29  Jan-Oliver Wagner <[email protected]>
3378    
3379            * Thuban/UI/tableview.py (LayerTableFrame.OnClose): Bug-fix: Now
3380            unsubscribes all that is subcribed in __init__.
3381    
3382    2003-05-28  Bernhard Herzog  <[email protected]>
3383    
3384            * Thuban/UI/mainwindow.py (MainWindow.DuplicateLayer)
3385            (MainWindow.CanDuplicateLayer): New methods to implement the
3386            Layer/Duplicate command.
3387            (layer_duplicate command): New.
3388            (main_menu): Add layer_duplicate to the Layer menu.
3389    
3390    2003-05-28  Bernhard Herzog  <[email protected]>
3391    
3392            * Thuban/UI/tableview.py (NullRenderer.Draw): New. Our own
3393            renderer so that NULL/None values get displayed differently (by a
3394            gray rectangle).
3395            (TableGrid.__init__): Override the default renderers
3396    
3397    2003-05-28  Bernhard Herzog  <[email protected]>
3398    
3399            * Thuban/Model/layer.py (Layer.SetShapeStore): Set the
3400            classification to "None" if the type of the field has changed.
3401    
3402            * test/test_layer.py (SetShapeStoreTests): New. Class with a few
3403            test for the Layer.SetShapeStore method
3404    
3405    2003-05-28  Jan-Oliver Wagner <[email protected]>
3406    
3407            * Thuban/Model/layer.py (Layer.TreeInfo): Fixed a bug (a layer
3408            does not necessarily have a filename).
3409    
3410    2003-05-28  Jan-Oliver Wagner <[email protected]>
3411    
3412            * Thuban/UI/mainwindow.py (MainWindow.TableClose, MainWindow.TableShow):
3413            sort the selection list for the dialog.
3414    
3415    2003-05-28  Frank Koormann  <[email protected]>
3416    
3417            * extensions/thuban/wxproj.cpp
3418            (project_point): Removed cast to int for projected point coordinates.
3419            (shape_centroid): Return last point if all polygon vertices fall
3420            to one point.
3421    
3422    2003-05-28  Bernhard Herzog  <[email protected]>
3423    
3424            * Thuban/UI/mainwindow.py (_can_unjoin): Add doc-string and cope
3425            with layers that don't have shapestores, i.e. raster layers.
3426    
3427    2003-05-28  Bernhard Herzog  <[email protected]>
3428    
3429            * Thuban/Model/table.py (DBFTable.__init__): Omit the extension
3430            when determining the title from the filename.
3431    
3432            * test/test_dbf_table.py (TestDBFTable.test_title): Update to
3433            reflect changes in the way the title is derived from the filename
3434    
3435    2003-05-28  Frank Koormann  <[email protected]>
3436    
3437            * Thuban/UI/mainwindow.py (MainWindow.TableShow):
3438            Added wxDEFAULT_DIALOG_STYLE to show table dialog styles.
3439    
3440    2003-05-27  Bernhard Herzog  <[email protected]>
3441    
3442            * Thuban/UI/mainwindow.py (MainWindow.delegated_messages): Also
3443            delegate SelectedLayer.
3444            (MainWindow.LayerUnjoinTable): Implement.
3445            (_can_unjoin): New. Helper function for the sensitivity of the
3446            layer/unjoin command.
3447    
3448            * Thuban/Model/data.py (ShapefileStore.OrigShapeStore)
3449            (DerivedShapeStore.OrigShapeStore): New. Return the original
3450            shapestore. Used to figure out how to unjoin.
3451            (DerivedShapeStore.Shapefile): Fix a typo.
3452    
3453    2003-05-27  Bernhard Herzog  <[email protected]>
3454    
3455            * Thuban/UI/join.py (JoinDialog): Extend to handle layer joins as
3456            well
3457            (JoinDialog.__init__): Use the layer parameter and only build the
3458            left choice when a layer is given
3459            (JoinDialog.OnJoin): Handle layer joins as well
3460            (JoinDialog.OnLeftTable, JoinDialog.OnRightTable): Handle the case
3461            that the user selects the "Select..." item. The sensitivitly
3462            updating is now in update_sensitivity
3463            (JoinDialog.y): New method to refactor the sensitivity update of
3464            the join button into its own method.
3465    
3466            * Thuban/UI/mainwindow.py (MainWindow.LayerJoinTable): Implement.
3467    
3468    2003-05-27  Bernhard Herzog  <[email protected]>
3469    
3470            * Thuban/UI/mainwindow.py (table_close command): Make it sensitive
3471            iff there are unreferenced tables in the session
3472    
3473    2003-05-27  Bernhard Herzog  <[email protected]>
3474    
3475            * Thuban/Model/messages.py (TABLE_REMOVED): New message.
3476    
3477            * Thuban/Model/session.py (Session.UnreferencedTables): New method
3478            to return tables that are not referenced by other tables or shape
3479            stores and can be removed.
3480            (Session.RemoveTable): Issue a TABLE_REMOVED message after
3481            removing the table
3482    
3483            * Thuban/UI/mainwindow.py: Remove unused imports
3484            (MainWindow.TableClose): Implement.
3485    
3486            * Thuban/UI/tableview.py (TableFrame.__init__): Subscribe to some
3487            messages so that the frame will be automatically closed when a new
3488            session is opened or the table is removed.
3489            (TableFrame.OnClose): Unsubscribe the Subscriptions made in
3490            __init__
3491            (TableFrame.close_on_session_replaced)
3492            (TableFrame.close_on_table_removed): New. Subscribers that close
3493            the window
3494    
3495            * test/test_session.py (TestSessionMessages.test_remove_table)
3496            (TestSessionSimple.test_remove_table): Move the test to
3497            TestSessionSimple and add test for the TABLE_REMOVED message
3498            (TestSessionBase.setUp): Also subscribe to TABLE_REMOVED
3499            (TestSessionSimple.test_unreferenced_tables) New. Test for the
3500            UnreferencedTables method.
3501            (UnreferencedTablesTests): New. Class with some more sophisticated
3502            tests for UnreferencedTables.
3503    
3504    2003-05-27  Frank Koormann  <[email protected]>
3505    
3506            * Thuban/UI/tableview.py (QueryTableFrame.__init__): The "_S_election"
3507            display has some unwanted side effects. Removed again.
3508    
3509    2003-05-27  Frank Koormann  <[email protected]>
3510    
3511            * Resources/Bitmaps/legend_icon_layer.xpm: New, icon for legend.
3512    
3513            * Thuban/UI/legend.py (LegendTree.__FillTree): Use "legend_icon_layer"
3514    
3515    2003-05-27  Jan-Oliver Wagner <[email protected]>
3516    
3517            * test/test_menu.py (MenuTest.test): Added test for
3518            Menu.RemoveItem().
3519    
3520            * Thuban/UI/menu.py (Menu.RemoveItem): New. Remove an item from
3521            the menu.
3522    
3523    2003-05-27  Frank Koormann  <[email protected]>
3524            
3525            Nonmodal dialogs without parent (i.e. they can fall behind the main
3526            window)
3527    
3528            * Thuban/UI/mainwindow.py (MainWindow.OnClose): Explicitly destroy
3529            all dialogs in the dialogs dictionary and the canvas.
3530    
3531            * Thuban/UI/dialogs.py (NonModalNonParentDialog): New class, without
3532            parent, i.e. can fall behind other windows.
3533            (NonModalDialog.OnClose): Check is dialog is in mainwindow.dialog
3534            dictionary before removing it.
3535    
3536            * Thuban/UI/classifier.py: Dialog derived from NonModalNonParentDialog
3537    
3538            * Thuban/UI/projdialog.py: Dialog derived from NonModalNonParentDialog
3539            * Thuban/UI/tableview.py: Dialog derived from NonModalNonParentDialog
3540            * Thuban/UI/tree.py: Dialog derived from NonModalNonParentDialog
3541    
3542    2003-05-27  Bernhard Herzog  <[email protected]>
3543    
3544            * Thuban/UI/mainwindow.py (MainWindow.ShowTableView): New. Open a
3545            tableview dialog
3546            (MainWindow.TableShow): Use ShowTableView to open the dialogs.
3547            Also, don't use the table's titles as the dialog names. The titles
3548            aren't guaranteed to be unique.
3549            (MainWindow.TableOpen): Open a table view dialog after opening the
3550            table
3551    
3552    2003-05-27  Bernhard Herzog  <[email protected]>
3553    
3554            * Thuban/UI/mainwindow.py: Remove the Table/Hide menu item. Its
3555            effect can be achieved by simply closing the window showing the
3556            table.
3557            (MainWindow.TableHide): Removed.
3558            (main_menu): Removed "table_hide"
3559    
3560    2003-05-27  Frank Koormann  <[email protected]>
3561    
3562            Fix legend tree display problems under Win32
3563    
3564            * Thuban/UI/legend.py:  BMP_SIZE_W = 15
3565            (LegendTree.__FillTree): Display "legend_icon_map.xpm" with layer title.
3566            (LegendTree.__FillTreeLayer): Explicitely set SelectedImage.
3567    
3568            * Resources/Bitmaps/legend_icon_map.xpm: New icon for legend.
3569    
3570    2003-05-27  Jan-Oliver Wagner <[email protected]>
3571    
3572            * Thuban/UI/menu.py (Menu.InsertSeparator): Additional optional parameter
3573            'after' now allows to insert separators almost anywhere in the menu.
3574    
3575    2003-05-27  Frank Koormann  <[email protected]>
3576    
3577            * Thuban/UI/tableview.py (QueryTableFrame.__init__): Underline the
3578            "S" of selection box label to hint on hot key (Alt-S). Works under
3579            Win32 but is ignored under GTK.
3580    
3581    2003-05-26  Frank Koormann  <[email protected]>
3582    
3583            * Thuban/UI/projdialog.py (ProjFrame.__do_layout, ProjPanel._DoLayout):
3584            Center Choices.
3585    
3586    2003-05-26  Bernhard Herzog  <[email protected]>
3587    
3588            Remove the Precision methods again. They're too DBF specific to be
3589            part of the table interface and they're only used in table_to_dbf
3590            anyway.
3591            
3592            * Thuban/Model/transientdb.py (TransientTableBase.Width):Use a
3593            fixed precision of 12 for doubles.
3594            (TransientTableBase.Precision): Removed
3595            (AutoTransientTable.Width): Delegate to self.table.
3596    
3597            * Thuban/Model/table.py (DBFTable.Precision)
3598            (MemoryTable.Precision): Removed.
3599            (MemoryTable.Width): Use a fixed precision of 12 for doubles.
3600            (table_to_dbf): Use a fixed precision of 12 for floats unless the
3601            column object specifies something else.
3602    
3603            * test/test_dbf_table.py (TestTableToDBF.test_table_to_dbf): New.
3604            test for table_to_dbf
3605    
3606    2003-05-26  Bernhard Herzog  <[email protected]>
3607    
3608            * test/test_transientdb.py
3609            (TestTransientTable.run_iceland_political_tests): Fix a comment.
3610    
3611    2003-05-26  Bernhard Herzog  <[email protected]>
3612    
3613            * Thuban/UI/mainwindow.py (MainWindow.TableOpen): Real
3614            implementation. Mark parts of the file format strings for
3615            localization.
3616    
3617            * Thuban/Model/session.py (Session.OpenTableFile): New. Open a dbf
3618            file and add the table to the tables managed by the session
3619    
3620            * test/test_session.py (TestSessionSimple.test_open_table_file):
3621            New. test case for OpenTableFile
3622    
3623    2003-05-26  Jan-Oliver Wagner <[email protected]>
3624    
3625            * Thuban/UI/controls.py, Thuban/UI/identifyview.py, Thuban/UI/join.py,
3626            Thuban/UI/labeldialog.py, Thuban/UI/mainwindow.py,
3627            Thuban/UI/proj4dialog.py, Thuban/UI/tableview.py, Thuban/UI/view.py:
3628            Replace the true/false of wxWindows by True/False of Python 2.2.1.
3629    
3630    2003-05-26  Jan-Oliver Wagner <[email protected]>
3631    
3632            * Thuban/UI/tableview.py (LayerTableFrame.__init__): If there is
3633            already a selection present, update the grid accordingly.
3634    
3635            * Thuban/UI/mainwindow.py (MainWindow.TableShow): Make the dialog
3636            resizeable and increase its initial size.
3637    
3638    2003-05-26  Frank Koormann  <[email protected]>
3639    
3640            Table export functionality
3641    
3642            * Thuban/Model/table.py (DBFTable.Width, MemoryTable.Width):
3643            Return width (in characters) for a column.
3644            (DBFTable.Precision, MemoryTable.Precision): Return decimal precision.
3645            (table_to_dbf): Write table to dbf file.
3646            (table_to_csv): Write table to csv file.
3647    
3648            * Thuban/Model/transientdb.py (TransientTableBase.Width,
3649            TransientTableBase.Precision): Return column width and precision.
3650    
3651            * Thuban/UI/tableview.py (QueryTableFrame.OnSaveAs): Call table_to_dbf
3652            or table_to_csv depending on file selection.
3653    
3654            * test/test_dbf_table.py:
3655            Test table_to_dbf (extension of former part of test).
3656    
3657            * test/test_csv_table.py:
3658            Test table_to_csv.
3659    
3660    2003-05-23  Jan-Oliver Wagner <[email protected]>
3661    
3662            * Thuban/UI/join.py (JoinDialog.OnJoin): Use _() for strings.
3663            Use QueryTableFrame instead of TableFrame.
3664    
3665            * Thuban/UI/mainwindow.py (MainWindow.LayerShowTable): Prefix the
3666            table window with 'Layer Table:' instead of 'Table:'.
3667    
3668    2003-05-23  Jan-Oliver Wagner <[email protected]>
3669    
3670            Give all tables a title via mix-in TitledObject.LayerShowTable
3671    
3672            * Thuban/Model/base.py (TitledObject.SetTitle): Call method 'issue'
3673            only if it exists.
3674    
3675            * Thuban/Model/table.py (DBFTable, MemoryTable): mix-in TitledObject
3676            and call its init-method with a default title. Remove Title() method.
3677    
3678            * Thuban/Model/transientdb.py (TransientTable, TransientJoinedTable,
3679            AutoTransientTable): mix-in TitledObject and call its init-method with
3680            a default title. Remove Title() method.
3681    
3682    2003-05-23  Bernhard Herzog  <[email protected]>
3683    
3684            * Thuban/Model/session.py (Session.AddShapeStore): Define
3685            AddShapeStore analogously to AddTable.
3686    
3687            * test/test_session.py (TestSessionSimple.test_add_shapestore):
3688            New. Test for AddShapeStore
3689    
3690    2003-05-23  Jan-Oliver Wagner <[email protected]>
3691    
3692            Introducing QueryTableFrame and a very coarse ShowTable implementation.
3693    
3694            * Thuban/UI/tableview.py (LayerTableFrame, QueryTableFrame): Split the
3695            class LayerTableFrame into two classes, LayerTableFrame and QueryTableFrame.
3696            The latter implements the selection GUI without dependency on a layer.
3697            LayerTableFrame now is derived from QueryTableFrame and connects
3698            to a layer.
3699    
3700            * Thuban/UI/mainwindow.py (MainWindow.TableShow): A very coarse
3701            implementation that still needs work.
3702    
3703            * Thuban/Model/layer.py (Layer.TreeInfo): Added filename.
3704    
3705    2003-05-22  Frank Koormann  <[email protected]>
3706    
3707            * Thuban/Model/transientdb.py (TransientJoinedTable.__init__):
3708            Added "outer_join = False" as optional parameter.
3709            (TransientJoinedTable.create): If outer join is true, perform a
3710            "LEFT OUTER JOIN" instead of "JOIN", which preserves all records of
3711            the left table. Records not matching are filled with 0 / None.
3712    
3713            * Thuban/UI/join.py (JoinDialog.__init__): Checkbox for outer join.
3714            (JoinDialog.OnJoin): Consider outer join check box.
3715    
3716    2003-05-22  Bernhard Herzog  <[email protected]>
3717    
3718            * Thuban/UI/join.py (JoinDialog.OnJoin): Use exc_info in a
3719            somewhat safer way. Storing the traceback in a local variable can
3720            lead to memory leaks
3721    
3722    2003-05-22  Bernhard Herzog  <[email protected]>
3723    
3724            * Thuban/UI/join.py (JoinDialog.OnJoin): Make sure to really call
3725            the wxMessageDialog's Destroy() method.
3726    
3727    2003-05-22  Frank Koormann  <[email protected]>
3728    
3729            * Thuban/UI/join.py (JoinDialog.__init__): Make use of
3730            TransientTable.Title()
3731    
3732    2003-05-22  Frank Koormann  <[email protected]>
3733    
3734            Join Dialog, initial version.
3735    
3736            * Thuban/UI/mainwindow.py (MainWindow.TableJoin): Removed print.
3737    
3738            * Thuban/UI/join.py (JoinDialog): Functional implementation of
3739            former framework. Renamed Table1/Table2 to LeftTable/RightTable
3740            in all occurences.
3741    
3742            * Thuban/Model/transientdb.py (TransientJoinedTable.__doc__):
3743            Typo fixed.
3744    
3745    2003-05-22  Bernhard Herzog  <[email protected]>
3746    
3747            Give the tables titles so that the GUI can display more meaningful
3748            names. For now the titles are fixed but depend on e.g. filenames
3749            or the titles of the joined tables.
3750    
3751            * Thuban/Model/transientdb.py (TransientTable.Title)
3752            (TransientJoinedTable.Title, AutoTransientTable.Title): New.
3753    
3754            * Thuban/Model/table.py (DBFTable.Title, MemoryTable.Title): New.
3755    
3756            * test/test_transientdb.py
3757            (TestTransientTable.test_auto_transient_table_title): New. Test
3758            for the Title method
3759            (TestTransientTable.test_transient_joined_table)
3760            (TestTransientTable.test_transient_table): Add test for the Title
3761            methods
3762    
3763            * test/test_memory_table.py (TestMemoryTable.test_title): New.
3764            Test for the Title method
3765    
3766            * test/test_dbf_table.py (TestDBFTable.test_title): New. Test for
3767            the Title method
3768    
3769    2003-05-22  Bernhard Herzog  <[email protected]>
3770    
3771            * test/test_layer.py (TestLayer.setUp, TestLayer.tearDown):
3772            Provide a better way to destroy the layers
3773            (TestLayer.test_base_layer, TestLayer.test_arc_layer)
3774            (TestLayer.test_point_layer, TestLayer.test_empty_layer)
3775            (TestLayer.test_polygon_layer, TestLayer.test_get_field_type): Use
3776            the new way to destroy the layers.
3777            (TestLayer.test_derived_store): New. Test for using a layer with a
3778            DerivedShapeStore
3779    
3780            * Thuban/Model/layer.py (Layer.SetShapeStore): Only set the
3781            filename if the shape store actually has one.
3782    
3783    2003-05-22  Bernhard Herzog  <[email protected]>
3784    
3785            * Thuban/Model/table.py (DBFTable.FileName): New. Accessor method
3786            for the filename
3787    
3788            * test/test_dbf_table.py (TestDBFTable.test_filename): New. Test
3789            for the FileName method
3790            (TestDBFTableWriting.test_write): Fix spelling of filename
3791    
3792    2003-05-22  Thomas Koester  <[email protected]>
3793    
3794            * Thuban/Model/range.py, test/test_range.py: Brought over new Range
3795            from SciParam that now really is immutable.
3796    
3797    2003-05-22  Frank Koormann  <[email protected]>
3798    
3799            Layer Top/Bottom placement added to legend.
3800    
3801            * Thuban/UI/legend.py
3802            (LegendPanel._OnMoveTop(), LayerPanel._OnMoveBottom): New, methods
3803            bound to tool events.
3804            (LegendTree.MoveCurrentItemTop(), LegendTree.MoveCurrentItemBottom):
3805            New, methods binding the event methods with the map methods.
3806    
3807            * Thuban/Model/map.py (Map.TopLayer(), Map.BottomLayer()): New, place
3808            layer at top/bottom of layer stack.
3809    
3810            * Resources/Bitmaps/top_layer.xpm: New button icon.
3811    
3812            * Resources/Bitmaps/bottom_layer.xpm: New button icon.
3813    
3814    2003-05-22  Bernhard Herzog  <[email protected]>
3815    
3816            * Thuban/Model/session.py (Session.RemoveTable): New method to
3817            remove tables
3818    
3819            * test/test_session.py (TestSessionSimple.test_remove_table): New.
3820            Test for RemoveTable
3821    
3822    2003-05-22  Thomas Koester  <[email protected]>
3823    
3824            * Thuban/Model/classgen.py: Added short module doc string and CVS id.
3825            (ClassGenerator.GenUniformDistribution): Use new Range __init__, too.
3826    
3827    2003-05-22  Bernhard Herzog  <[email protected]>
3828    
3829            Implement a way to discover dependencies between tables and
3830            shapestores.
3831    
3832            * Thuban/Model/transientdb.py (TransientTableBase.Dependencies)
3833            (TransientJoinedTable.Dependencies)
3834            (AutoTransientTable.SimpleQuery): New. Implement the dependencies
3835            interface
3836            (TransientJoinedTable.__init__): Keep tack of the original table
3837            objects in addition to the corresponding transient tables.
3838    
3839            * Thuban/Model/table.py (DBFTable.Dependencies)
3840            (MemoryTable.Dependencies): New. Implement the dependencies
3841            interface
3842    
3843            * Thuban/Model/data.py (ShapeTable): New. Helper class for
3844            ShapefileStore
3845            (ShapefileStore.__init__): Use ShapeTable instead of
3846            AutoTransientTable
3847            (ShapefileStore.Table, ShapefileStore.Shapefile): Add doc-strings
3848            (ShapefileStore.FileName, ShapefileStore.FileType): New. Accessor
3849            methods for filename and type
3850            (ShapefileStore.Dependencies): New. Implement the dependencies
3851            interface
3852            (DerivedShapeStore): New class to replace SimpleStore. The main
3853            difference to SimpleStore is that it depends not on a shapefile
3854            but another shapestore which expresses the dependencies a bit
3855            better
3856            (SimpleStore.__init__): Add deprecation warning.
3857    
3858            * test/test_dbf_table.py (TestDBFTable.test_dependencies): New.
3859            Test for the Dependencies method.
3860    
3861            * test/test_memory_table.py (TestMemoryTable.test_dependencies):
3862            New. Test for the Dependencies method.
3863    
3864            * test/test_transientdb.py
3865            (TestTransientTable.test_auto_transient_table_dependencies): New.
3866            Test for the Dependencies method.
3867            (TestTransientTable.test_transient_joined_table): Add test for the
3868            Dependencies method.
3869    
3870            * test/test_session.py (TestSessionSimple.setUp)
3871            (TestSessionSimple.tearDown): New. Implement a better way to
3872            destroy the sessions.
3873            (TestSessionSimple.test_initial_state)
3874            (TestSessionSimple.test_add_table): Bind session to self.session
3875            so that it's destroyed by tearDown
3876            (TestSessionSimple.test_open_shapefile): New. Test for
3877            OpenShapefile and the object it returns
3878    
3879    2003-05-22  Bernhard Herzog  <[email protected]>
3880    
3881            * Thuban/Model/session.py (Session.AddTable): New method to
3882            register tables with the session.
3883            (Session.Tables): Return the tables registered with AddTable too.
3884    
3885            * test/test_session.py (TestSessionSimple.test_add_table): New.
3886            Test case for the AddTable method
3887    
3888    2003-05-22  Frank Koormann  <[email protected]>
3889    
3890            UI polishing updates: Place main buttons (OK, Cancel, etc) in the
3891            lower right corner, center labels for selections, initialize controls
3892            in reasonable order for keyboard navigation.
3893    
3894            * Thuban/UI/projdialog.py (ProjFrame.__init__, ProjFrame.__doLayout)
3895            (ProjFrame.__DoOnProjAvail): Determine position of current projection
3896            using the wxListBox.FindString() method. Still a problem (#1886)
3897    
3898            * Thuban/UI/classifier.py
3899            (Classifier.__init__, SelectPropertiesDialog.__init__)
3900    
3901            * Thuban/UI/classgen.py (ClassGenDialog.__init__,
3902            (ClassGenDialog.__DoOnGenTypeSelect): Moved initialization of the
3903            different classification types from here to __init__.
3904            (GenUniquePanel.__init__): Set the column width of the first field
3905            in the Field ListCtrl to the full width.
3906    
3907            * Thuban/UI/tableview.py (LayerTableFrame.__init__): Rename 'Save As'
3908            Button to 'Export'. Center Buttons in Selection Box, set Focus to
3909            Grid.
3910            (LayerTableFrame.OnKeyDown()): New, bound to the grid with EVT_KEY_DOWN,
3911            changes focus to the Selection when pressing "Alt-S".
3912    
3913            * Thuban/UI/legend.py (LegendTree.__SetVisibilityStyle): Only gray out
3914            the text if not visible. The italic font sometimes exceeds the
3915            rendering area.
3916    
3917    2003-05-21  Jonathan Coles   <[email protected]>
3918    
3919            * Thuban/UI/dock.py (DockFrame): Rename references to _OnClose
3920            to OnClose so that Thuban closes correctly.
3921    
3922            * Thuban/UI/mainwindow.py (MainWindow.OnClose): Call
3923            DockFrame.OnClose, not DockFrame._OnClose.
3924    
3925    2003-05-21  Jonathan Coles   <[email protected]>
3926    
3927            * Thuban/Model/classgen.py (ClassGenerator.GenQuantiles): Remove
3928            references to 'inf' and use new Range __init__ to pass floats
3929            directly rather than converting them to strings first.
3930            Fixes RTBug #1876.
3931    
3932            * Thuban/Model/classification.py (ClassGroupRange.SetRange):
3933            Use new Range ___init__ to pass floats.
3934    
3935            * Thuban/Model/layer.py (RasterLayer.__init__): Test if the
3936            filename is a valid image file. Throw IOError otherwise.
3937    
3938            * Thuban/Model/range.py: Brought over new Range from SciParam that
3939            is immutable and has an __init__ which can accept floats.
3940    
3941            * Thuban/UI/mainwindow.py (MainWindow.AddLayer): Move OpenShapefile
3942            into try block. AddLayer doesn't throw any exceptions anymore.
3943            (MainWindow.AddRasterLayer): Move constructor of RasterLayer into
3944            try block.
3945    
3946            * Thuban/UI/projdialog.py (GeoPanel.__init__): Put Degrees as
3947            the first item in choices. Fixes RTBug #1882.
3948    
3949            * Thuban/UI/renderer.py (MapRenderer.render_map): Check if scale
3950            has gone to 0 which is a serious problem. abort.
3951            (MapRenderer.draw_raster_layer): Catch IOError seperately and
3952            print the error from GDAL.
3953    
3954            * Thuban/UI/tableview.py (TableGrid.__init__): Call
3955            ToggleEventListeners to turn on listening.
3956            (TableGrid.ToggleEventListeners): New. Turns event listening on
3957            and off so as to prevent excessive messages.
3958            (LayerTableFrame.OnQuery): Use TableGrid.ToggleEventListeners
3959            to suppress excessive messages when selecting many rows.
3960            Fixes RTBug #1880.
3961    
3962            * Thuban/UI/view.py: Added checks against if scale == 0. This
3963            is a serious problem that can occur when an image without
3964            geo data is loading and causes the map projection bounds to
3965            go to infinity. Right now, the solution is to simply try
3966            to recover.
3967    
3968            * extensions/thuban/cpl_mfile.cpp (MFILEClose): Make sure
3969            to set the MFILEReceiver attributes even if the data is NULL.
3970    
3971            * extensions/thuban/gdalwarp.cpp: Improved the error handling
3972            and passed GDAL messages back up to the Python layer. Also
3973            tried to fix some memory leaks that were present in the original
3974            utility but didn't matter because the program aborted.
3975    
3976            * test/test_range.py: Copied over tests from SciParam. Removed
3977            tests against importing. Fixes RTBug #1867.
3978    
3979    2003-05-21  Bernhard Herzog  <[email protected]>
3980    
3981            * test/test_load.py: Remove unused imports and restructure the
3982            test code
3983            (LoadSessionTest): Split into one class for each test and turn
3984            LoadSessionTest itself into the base class for all such session
3985            tests.
3986            (ClassificationTest): New base class for load tests that test
3987            classifications
3988            (TestSingleLayer, TestLayerVisibility, TestClassification)
3989            (TestLabels, TestLayerProjection, TestRasterLayer): New classes
3990            for the individual tests
3991    
3992            * test/support.py (FileLoadTestCase.filename): New base class for
3993            file loading tests
3994    
3995    2003-05-21  Jan-Oliver Wagner <[email protected]>
3996    
3997            * Resources/Projections/defaults.proj: Renamed 'Universal Transverse
3998            Mercator' to 'UTM Zone 32' as a more convenient example.
3999            Added 'Gauss Krueger Zone 6'.
4000    
4001            * Data/iceland_sample_raster.thuban: political polygon now
4002            filled transparent to have the raster image visible at once.
4003    
4004    2003-05-21  Frank Koormann  <[email protected]>
4005    
4006            * Thuban/UI/mainwindow.py (MainWindow): Renamed _OnClose() back to
4007            OnClose() to keep in sync with extensions. Internally Thuban
4008            still uses "underscored" names.
4009    
4010    2003-05-20  Jonathan Coles   <[email protected]>
4011    
4012            This puts back Raster layer support. These layers support projections
4013            through the GDAL library. Currently, the CVS version is being used.
4014            There are no Debian packages available although this may change soon.
4015            A GDAL driver was extended to support writing to memory rather to
4016            files.
4017    
4018            There is still some work that needs to be done, such as some error
4019            handling when loading invalid images or when there is a problem
4020            projecting the image. This putback simply checks in the majority
4021            of the work.
4022    
4023            * setup.py: Add gdalwarp library extension.
4024    
4025            * Thuban/Model/layer.py (BaseLayer.HasClassification): New.
4026            Defaults to False, but can be overridden by subclasses if they
4027            support classification.
4028            (RasterLayer): New. Defines a new layer that represents an
4029            image.
4030    
4031            * Thuban/Model/load.py (SessionLoader.__init__): Add rasterlayer
4032            tag handler.
4033            (SessionLoader.start_layer): Encode the filename.
4034            (SessionLoader.start_rasterlayer, SessionLoader.end_rasterlayer):
4035            New. Supports reading a rasterlayer tag.
4036    
4037            * Thuban/Model/map.py (Map.BoundingBox): Fix typo in comment.
4038    
4039            * Thuban/Model/save.py (XMLWriter.encode): Don't assume that we
4040            get a string in Latin1. If we get such as string convert it to
4041            unicode first, otherwise leave if alone before encoding.
4042            (SessionSaver.write_layer): Add support for writing both Layers
4043            and RasterLayers.
4044    
4045            * Thuban/Model/transientdb.py (AutoTransientTable.SimpleQuery):
4046            The right argument may not be a string, it could also be a Column.
4047    
4048            * Thuban/UI/application.py (ThubanApplication.CreateMainWindow):
4049            Make initial window size 600x400. Fixes RTBug #1872.
4050    
4051            * Thuban/UI/classifier.py (Classifier.__init__): Rearrange how
4052            the dialog is constructed so that we can support layers that
4053            do not have classifications.
4054            (Classifier._OnTry): Only build a classification if the layer
4055            supports one.
4056    
4057            * Thuban/UI/legend.py: Change all checks that a layer is an
4058            instance of Layer into checks against BaseLayer.
4059            (LegendTree.__FillTreeLayer): Only add children to a branch if
4060            the layer supports classification.
4061    
4062            * Thuban/UI/mainwindow.py (MainWindow.NewSession,
4063            MainWindow.OpenSession): Don't proceed with an action if the
4064            user chooses Cancel when they are asked to save changes.
4065            (MainWindow.AddRasterLayer): New. Open a dialog to allow the
4066            user to select an image file. Create a new RasterLayer and add
4067            it to the map.
4068    
4069            * Thuban/UI/renderer.py (MapRenderer.render_map): Add support
4070            for rendering RasterLayer layers.
4071            (MapRenderer.draw_raster_layer): Actually method that calls
4072            the GDALWarp python wrapper and constructs an image from the
4073            data returned.
4074    
4075            * Thuban/UI/tableview.py (LayerTableFrame.__init__): Change the
4076            Choices symbols to match those used in the table query method.
4077            Replace deprecated method calls on table with new method names.
4078    
4079            * Thuban/UI/view.py (MapCanvas.set_view_transform): Try to limit
4080            how small the scale can get. This still needs more testing.
4081    
4082            * extensions/thuban/bmpdataset.cpp: New, but copied from GDAL.
4083            Provides a driver to output in .bmp format.
4084    
4085            * extensions/thuban/cpl_mfile.cpp, extensions/thuban/cpl_mfile.h:
4086            New. Provides IO routines which write to memory, rather than a file.
4087    
4088            * extensions/thuban/gdalwarp.cpp: New, but basically a direct copy
4089            of the gdalwarp utility provided in GDAL. Added function calls
4090            that can be accessed from python.
4091    
4092            * Data/iceland_sample_raster.thuban: New. Sample file that uses
4093            a raster layer.
4094    
4095            * Data/iceland/island.tfw, Data/iceland/island.tif: New. Raster
4096            layer image data.
4097    
4098            * Doc/thuban.dtd: Added rasterlayer attribute definition.
4099    
4100            * test/test_layer.py, test/test_load.py, test/test_save.py: Added
4101            tests associated with the raster layer code.
4102    
4103            * test/test_transientdb.py
4104            (TestTransientTable.test_auto_transient_table_query): Added a test
4105            for using a Column object as the "right" parameter to a query.
4106    
4107    2003-05-19  Frank Koormann  <[email protected]>
4108    
4109            * Thuban/version.py (get_changelog_date):
4110            Catch exceptions if ChangeLog does not exist.
4111    
4112            * Thuban/UI/view.py (MapCanvas.Export): Bugfix
4113    
4114    2003-05-19  Frank Koormann  <[email protected]>
4115    
4116            Extended version information for Thuban
4117    
4118            * Thuban/version.py: New, version information for Thuban: Last
4119            modification date and last ChangeLog entry date.
4120    
4121            * Thuban/UI/mainwindow.py (MainWindow.About()): Extended version
4122            information: Display Thuban, wxPython and Python version.
4123    
4124    2003-05-16  Bernhard Herzog  <[email protected]>
4125    
4126            * Thuban/Model/save.py: Remove some unused imports including the
4127            __future__ import for nested_scopes as Thuban relies on Python 2.2
4128            now.
4129            (XMLWriter.encode): Remove the special case for a None argument.
4130            In the saver encode is always called with a string argument.
4131    
4132    2003-05-16  Bernhard Herzog  <[email protected]>
4133    
4134            * Thuban/UI/__init__.py: Remove the work-around for the locale bug
4135            in wxPython (at least when usinvg wxGTK) prior to 2.4. The symptom
4136            of the bug was that e.g. float("1.2") would fail. Thuban now
4137            requires 2.4.x.
4138            
4139    2003-05-16  Frank Koormann   <[email protected]>
4140    
4141            Printing enhancement and WMF export (under Win32)
4142    
4143            * Thuban/UI/renderer.py (ExportRenderer): New, derived from
4144            ScreenRenderer. Renders Map, Legend and Scalebar for export.
4145            (PrinterRenderer): New, derived from ExportRenderer. Replaces the old
4146            PrintRender.
4147    
4148            * Thuban/UI/view.py (MapPrintout.__init__): Enhanced parameter set
4149            to fullfil information needed for PrinterRenderer.
4150            (MapCanvas.Export): New. Export Map (currently only to WMF on Win32).
4151            (MapCanvas.Print): Adapted to new MapPrintout.
4152            (OutputTransform): General calculations to transform from canvas
4153            coordinates to export/printing devices.
4154    
4155            * Thuban/UI/mainwindow.py (MainWindow.ExportMap()): New. Added also
4156            new method_command to call ExportMap, with platform dependency (only
4157            __WXMSW__)
4158      
4159            * Thuban/UI/scalebar.py (ScaleBar.DrawScaleBar): Position and Size
4160            of scalebar drawing area as new parameters.
4161            
4162            * Thuban/Model/scalebar.py (roundInterval): round long instead of int
4163    
4164            * Thuban/UI/legend.py (ScalebarBitmap.__SetScale):
4165            Update to extended scalebar.DrawScalebar header.
4166    
4167            * test/test_export.py: New, test Thuban.UI.view.OutputTransform()
4168    
4169            * test/test_scalebar.py: Made test executable as standalone.
4170    
4171    2003-05-16  Bernhard Herzog  <[email protected]>
4172    
4173            * Thuban/Model/table.py (Table): Remove this compatibility alias
4174            for DBFTable.
4175    
4176            * test/test_table.py: Import DBFTable as Table because that alias
4177            doesn't exist anymore.
4178    
4179            * Thuban/UI/classgen.py: Remove some unused imports
4180    
4181    2003-05-14  Jonathan Coles   <[email protected]>
4182    
4183            * Thuban/Model/classgen.py (ClassGenerator.GenSingletonsFromList):
4184            Fix docstring.
4185            (ClassGenerator.GenUniformDistribution): Fix spelling of method name.
4186            (ClassGenerator.GenQuantiles): Use the left/right brackets and min/max
4187            values of the supplied range to determine the beginning and end
4188            bounds of the generated classes.
4189    
4190            * Thuban/Model/range.py (Range.number_re): Now accepts floats that
4191            do not have a leading 0 (.5 is now accepted as well as 0.5).
4192    
4193            * Thuban/UI/classgen.py (ClassGenDialog.OnOK): Fix name of method
4194            call to ClassGenerator.GenUniformDistribution.
4195    
4196            * Thuban/UI/projdialog.py (ProjFrame.__do_layout): Fix Windows
4197            layout bug with the 'Projection' label.
4198    
4199            * test/support.py (FloatTestCase): New. Needed for the Range tests.
4200    
4201            * test/test_range.py: New. Imported from SciParam.
4202    
4203    2003-05-12  Jonathan Coles   <[email protected]>
4204    
4205            * Thuban/UI/classgen.py (GenQuantilesPanel.GetList): Replace call
4206            to table.UniqueValues() with calls that retrieve all the values
4207            from the table. This will need to be replaced by a method on table
4208            which can simply return the list (perhaps more efficiently).
4209    
4210    2003-05-12  Jonathan Coles   <[email protected]>
4211    
4212            The return value of ClassGenerator.CalculateQuantiles has changed.
4213            Refer to the documentation for details.
4214    
4215            * test/test_classgen.py: Modified Quantile tests to use the
4216            new return values.
4217    
4218            * Thuban/Model/classgen.py
4219            (ClassGenerator.GenQuantiles): Add comments describing the parameters,
4220            use new return values from CalculateQuantiles to produce the correct
4221            range bounds in the Classification.
4222            (ClassGenerator.CalculateQuantiles): Add more comments describing
4223            the return values and parameters. Make minor adjustments to improve
4224            the legibility of the code. Fix problem with adjusted not being set
4225            in most cases.
4226    
4227    2003-05-12  Frank Koormann <[email protected]>
4228            
4229            * Thuban/Model/save.py (XMLWriter.encode()): Explicite call to unicode
4230            and latin1. Fixes #1851 finally.
4231    
4232    2003-05-09  Jonathan Coles   <[email protected]>
4233    
4234            * test/test_classgen.py: New. Tests the Quantile algorithm.
4235    
4236            * Thuban/Model/classgen.py (ClassGenerator.CalculateQuantiles):
4237            Clean up debugging statement, add comments, fix a small bug in the
4238            returned adjusted percentiles.
4239            
4240    2003-05-09  Jonathan Coles   <[email protected]>
4241    
4242            Introduces Range class from SciParam into the ClassGroupRange class,
4243            and such ranges can now be saved and loaded from disk.
4244    
4245            Quantiles are now available in the Classification Generator.
4246    
4247            Initial support for building Queries on a table. Doesn't do anything
4248            but run some tests.
4249    
4250            * Thuban/Model/classification.py: Explicit imports.
4251            (ClassGroupRange): Use the Range class to store the underlying
4252            range information. The interface remains the same, except for
4253            GetRange(), and you can also supply a Range object as the min
4254            parameter to SetRange or __init__.
4255    
4256            * Thuban/Model/load.py (XMLReader.encode): New. Encodes the given
4257            string appropriately for use in Thuban. Fixes RTbug #1851.
4258            (SessionLoader.end_projection): Handle the context of the
4259            projection tag a bit better by looking at what objects are not
4260            None. There was an assumption that a projection tag for a map
4261            could occur before any layers.
4262            (SessionLoader.start_clrange): Provide backward compatibility for
4263            reading min/max values as well as the new range parameter.
4264    
4265            * Thuban/Model/map.py: Explicit imports.
4266    
4267            * Thuban/Model/resource.py: Import _.
4268            (ProjFileSaver.write): write header using projfile.dtd.
4269    
4270            * Thuban/Model/save.py: Explicit imports.
4271            (XMLWriter.encode): New. Encode the given string from a format
4272            used by Thuban into UTF-8. Fixes RTbug #1851.
4273    
4274            * Thuban/UI/classgen.py: Explicit imports.
4275            (ClassGenDialog.__init__): Clean up the code and add support
4276            for Quantiles.
4277            (ClassGenDialog.OnOK): Add support for Quantiles.
4278            (GenQuantilesPanel): New. Input panel for Quantiles.
4279            (ClassGenerator, CustomRamp, MonochromaticRamp, GreyRamp, RedRamp,
4280            GreenRamp, BlueRamp, HotToColdRamp): Move to Thuban/Model/classgen.py
4281    
4282            * Thuban/Model/classgen.py: New. Contains all the classes named above.
4283    
4284            * Thuban/UI/classifier.py: Explicit imports.
4285            (ClassTable.GetValueAsCust, ClassTable.__ParseInput,
4286            ClassTable.SetValueAsCustom): Reworked to use new Range class.
4287    
4288            * Thuban/UI/legend.py: Explicit imports.
4289    
4290            * Thuban/UI/mainwindow.py: Add support for the Join Dialog. Added
4291            a Table menu and associated method calls.
4292            (MainWindow.choose_color): Removed. No longer needed.
4293    
4294            * Thuban/UI/projdialog.py (ProjFrame.__VerifyButtons): Save button
4295            should be disabled if no projection is selected in the available
4296            list.
4297    
4298            * Thuban/UI/renderer.py: Explicit imports.
4299    
4300            * Thuban/UI/tableview.py (TableGrid.OnRangeSelect): Fix some issues
4301            with correctly selecting the rows and issuing the right events.
4302            Be sure to call Skip() to allow the grid to do some of its own
4303            handling which allows the rows to actually be selected.
4304            (LayerTableGrid.select_shapes): Rename from select_shape. Supports
4305            selecting multiple shapes.
4306            (LayerTableFrame): Support for building Queries.
4307            (LayerTableFrame.select_shapes): Allow multiple shapes to be selected.
4308    
4309            * Thuban/UI/tree.py: Explicit imports.
4310    
4311            * Thuban/UI/view.py (MapCanvas): Delegate "SelectedShapes" so the
4312            table view can call it.
4313    
4314            * test/test_classification.py: Explicit imports.
4315            (TestClassification.test_ClassGroupRange): Fix test for new
4316            Range class.
4317    
4318            * Doc/thuban.dtd: Add range parameter for clrange.
4319    
4320            * Thuban/Model/range.py: Taken from SciParam. Used as the underlying
4321            object in ClassGroupRange, and also uesd for inputting ranges in
4322            the classifer table and elsewhere.
4323    
4324            * Thuban/UI/join.py: New. Initial Join dialog. No real functionality
4325            yet.
4326    
4327    2003-05-09  Frank Koormann <[email protected]>
4328    
4329            * Thuban/UI/scalebar.py (DrawScaleBar): Draw only if interval > 0.0.
4330    
4331    2003-05-08  Frank Koormann <[email protected]>
4332    
4333            Coding style updates
4334    
4335            * test/test_scalebar.py: Replaced tab indentation by spaces.
4336    
4337            * Thuban/UI/scalebar.py: Explicit imports.
4338    
4339    2003-05-08  Frank Koormann <[email protected]>
4340    
4341            * Thuban/UI/scalebar.py
4342            (ScaleBar.DrawScalebar): Format string bug fixed.
4343    
4344    2003-05-08  Frank Koormann <[email protected]>
4345    
4346            Reorganization of scalebar component (no wx in Thuban/Model)
4347    
4348            * Thuban/Model/scalebar.py: Rendering moved to Thuban/UI/scalebar.py
4349            (deriveInterval):
4350            Calculate scalebar interval and unit which fits in width for scale.
4351            (roundInterval): Round float.
4352    
4353            * Thuban/UI/scalebar.py (ScaleBar): Scalebar rendering
4354    
4355            * test/test_scalebar.py: Test for Thuban/Model/scalebar.py methods.
4356    
4357            * Thuban/UI/legend.py: Import Thuban.UI.scalebar
4358    
4359    2003-05-08  Frank Koormann <[email protected]>
4360    
4361            * Thuban/UI/legend.py (ScalebarBitmap.SetCanvas):
4362            Initialize ScaleBar with canvas.map
4363    
4364            * Thuban/Model/scalebar.py (ScaleBar.roundInterval()): New,
4365            round intervals to display smarter lengths
4366            (ScaleBar.DrawScalebar): Draw Scalebar only if the map contains a
4367            layer. If the maps has no projection applied grey the scalebar.
4368    
4369    2003-05-07  Frank Koormann <[email protected]>
4370            
4371            Basic Scalebar features added.
4372    
4373            * Thuban/Model/scalebar.py (ScaleBar): New, scalebar rendering.
4374    
4375            * Thuban/UI/legend.py (LegendPanel): Added scalebar bitmap
4376            (ScaleBarBitmap): New, links the scalebar bitmap with view messages
4377            and the renderer.
4378    
4379            * Thuban/UI/view.py (MapCanvas.set_view_transform): Issue SCALE_CHANGED.
4380    
4381            * Thuban/UI/messages.py: SCALE_CHANGED added.
4382    
4383    2003-05-07  Bernhard Herzog  <[email protected]>
4384    
4385            * Thuban/Model/session.py (Session.__init__): New instance
4386            variable shapestores to hold a list of all open shapestore objects
4387            (Session.ShapeStores): New. Accessor method for the shapestores
4388            list.
4389            (Session._add_shapestore, Session._clean_weak_store_refs): New.
4390            Internal methods to maintain the shapestores list.
4391            (Session.Tables): New. Return all tables open in the session.
4392            (Session.OpenShapefile): Insert the new ShapeStore into the
4393            shapestores list.
4394    
4395            * test/test_session.py (TestSessionSimple.test_initial_state): Add
4396            tests for ShapeStores and Tables
4397            (TestSessionWithContent.test_shape_stores)
4398            (TestSessionWithContent.test_tables): New. Test cases for
4399            ShapeStores and Tables
4400    
4401    2003-05-07  Bernhard Herzog  <[email protected]>
4402    
4403            * Thuban/Model/transientdb.py (TransientTableBase.ReadRowAsDict):
4404            Add comments about the optimizations used.
4405            (AutoTransientTable.ReadValue, TransientTableBase.ReadValue): New.
4406            Implement the ReadValue table interface method.
4407    
4408            * test/test_transientdb.py
4409            (TestTransientTable.run_iceland_political_tests)
4410            (TestTransientTable.test_transient_joined_table): Add tests for
4411            ReadValue
4412    
4413    2003-05-07  Frank Koormann <[email protected]>
4414    
4415            * Resources/Bitmaps/fulllayerextent.xpm,
4416            Resources/Bitmaps/fullselextent.xpm: Replaced the place holders with
4417            new icons.
4418    
4419    2003-05-06  Bernhard Herzog  <[email protected]>
4420    
4421            * Thuban/Model/transientdb.py (AutoTransientTable.SimpleQuery):
4422            New. Simply delegate to the transient table's version.
4423    
4424            * test/test_transientdb.py
4425            (TestTransientTable.test_auto_transient_table_query): New. Test
4426            case for AutoTransientTable's SimpleQuery
4427    
4428    2003-05-06  Bernhard Herzog  <[email protected]>
4429    
4430            * Thuban/Model/transientdb.py (TransientTableBase.SimpleQuery):
4431            Implement a simple query method for the query dialog
4432            (TransientTableBase.create): Add an INTEGER PRIMARY KEY that holds
4433            the row index or shapeid.
4434            (TransientTable.create): Insert the right value of the row index
4435            (TransientJoinedTable.create): Copy the row index of the left
4436            table to the joined result table
4437    
4438            * test/test_transientdb.py
4439            (TestTransientTable.test_transient_table_read_twice): Fix
4440            doc-string
4441            (TestTransientTable.test_transient_table_query): New. Test for the
4442            SimpleQuery method
4443    
4444    2003-05-06  Bernhard Herzog  <[email protected]>
4445    
4446            Convert all table users to use the new table interface. This only
4447            covers Thuban itself, not GREAT-ER or other applications built on
4448            Thuban yet, so the compatibility interface stays in place for the
4449            time being but it now issues DeprecationWarnings.
4450    
4451            Finally, the new Table interface has a new method, HasColumn.
4452    
4453            * Thuban/Model/table.py (OldTableInterfaceMixin): All methods
4454            issue deprecation warnings when they're. The warnings refer to the
4455            caller of the method.
4456            (OldTableInterfaceMixin.__deprecation_warning): New. Helper method
4457            for the deprecation warnings
4458    
4459            * test/test_table.py: Ignore the deprecation warnings for the old
4460            table in the tests in this module. The purpose of the tests is to
4461            test the old interface, after all.
4462    
4463            * test/test_transientdb.py
4464            (TestTransientTable.run_iceland_political_tests): Use the
4465            constants for the types. Add a test for HasColumn
4466            (TestTransientTable.test_transient_joined_table): Adapt to new
4467            table interface. Add a test for HasColumn
4468            (TestTransientTable.test_transient_table_read_twice): Adapt to new
4469            table interface
4470    
4471            * Thuban/UI/tableview.py (DataTable.SetTable, DataTable.GetValue):
4472            Adapt to new table interface
4473    
4474            * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Adapt to
4475            new table interface
4476    
4477            * Thuban/UI/controls.py (RecordListCtrl.fill_list)
4478            (RecordTable.SetTable): Adapt to new table interface
4479    
4480            * Thuban/UI/classifier.py (Classifier.__init__)
4481            (Classifier.__init__): Adapt to new table interface
4482    
4483            * Thuban/UI/classgen.py (ClassGenDialog.__init__)
4484            (GenUniformPanel._OnRetrieve, GenUniquePanel._OnRetrieve): Adapt
4485            to new table interface
4486    
4487            * Thuban/Model/transientdb.py (TransientTableBase.HasColumn)
4488            (AutoTransientTable.HasColumn): Implement the new table interface
4489            method
4490            (AutoTransientTable.ReadRowAsDict, AutoTransientTable.ValueRange)
4491            (AutoTransientTable.UniqueValues): Adapt to new table interface
4492    
4493            * Thuban/Model/layer.py (Layer.SetShapeStore, Layer.GetFieldType):
4494            Adapt to new table interface
4495    
4496            * test/test_layer.py (TestLayer.open_shapefile): Helper method to
4497            simplify opening shapefiles a bit easier.
4498            (TestLayer.test_arc_layer, TestLayer.test_polygon_layer)
4499            (TestLayer.test_point_layer): Use the new helper method
4500            (TestLayer.test_get_field_type): New. Test for the GetFieldType
4501            method
4502    
4503            * test/test_dbf_table.py (TestDBFTable.test_has_column): Test for
4504            the new table method
4505    
4506            * test/test_memory_table.py (TestMemoryTable.test_has_column):
4507            Test for the new table method HasColumn
4508    
4509    2003-05-06  Jonathan Coles   <[email protected]>
4510    
4511            Addresses the "Selection Extent" wish of RTbug #1787.
4512    
4513            * Resources/Bitmaps/fulllayerextent.xpm,
4514            Resources/Bitmaps/fullselextent.xpm: Bitmaps for layer and selection
4515            extent. These are just place holders for the real bitmaps.
4516    
4517            * Thuban/Model/layer.py (Shape): Since a Shape is immutable only
4518            calculate the bounding box once (the first time compute_bbox() is
4519            called).
4520            (Layer.ShapesBoundingBox): New. Given a list of shape ids, return
4521            the bounding box for the shapes in lat/long coordinates.
4522    
4523            * Thuban/UI/mainwindow.py: Added new "Full selection extent" menu
4524            option.
4525            (MainWindow.has_selected_shapes): New. Returns true if there are
4526            any selected shapes.
4527            (MainWindow.FullSelectionExtent): New. Calls
4528            MapCanvas.FitSelectedToWindow() when the user selects the menu option.
4529            (_has_selected_shapes): New. Returns true if there are any
4530            selected shapes.
4531    
4532            * Thuban/UI/selection.py (Selection.HasSelectedShapes): New. Returns
4533            true if there are any selected shapes.
4534    
4535            * Thuban/UI/view.py (MapCanvas): Added delegated method
4536            HasSelectedShapes.
4537            (MapCanvas.FitSelectedToWindow): New. Centers and scales any selected
4538            shapes on the canvas using the map projection (if any).
4539    
4540            * test/test_layer.py (TestLayer.test_arc_layer): Add some tests
4541            for Layer.ShapesBoundingBox().
4542    
4543    2003-05-06  Bernhard Herzog  <[email protected]>
4544    
4545            * Resources/Projections/defaults.proj: Fix spelling of Mercator
4546    
4547    2003-05-05  Jonathan Coles   <[email protected]>
4548    
4549            Addresses the "Full Layer Extent" wish of RTbug #1787.
4550    
4551            * Resources/Projections/defaults.proj: Added UK National Grid.
4552    
4553            * Thuban/UI/mainwindow.py: Added new "Full layer extent" menu option.
4554            (MainWindow.FullLayerExtent): New. Calls MapCanvas.FitLayerToWindow()
4555            when the user selects the menu option.
4556    
4557            * Thuban/UI/view.py (MapCanvas.FitLayerToWindow): New. Centers and
4558            scales the given layer on the canvas using the map projection.
4559    
4560    2003-05-05  Bernhard Herzog  <[email protected]>
4561    
4562            Convert the table implementations to a new table interface. All
4563            tables use a common mixin class to provide backwards compatibility
4564            until all table users have been updated.
4565    
4566            * Thuban/Model/table.py (OldTableInterfaceMixin): Mixin class to
4567            provide backwards compatibility for table classes implementing the
4568            new interface
4569            (DBFTable, MemoryTable): Implement the new table interface. Use
4570            OldTableInterfaceMixin as base for compatibility
4571            (DBFColumn, MemoryColumn): New. Column description for DBFTable
4572            and MemoryTable resp.
4573    
4574            * test/test_dbf_table.py: New. Test cases for the DBFTable with
4575            the new table interface.
4576    
4577            * test/test_memory_table.py: New. Test cases for the MemoryTable
4578            with the new table interface.
4579    
4580            * test/test_table.py: Document the all tests in this file as only
4581            for backwards compatibility. The equivalent tests for the new
4582            interface are in test_memory_table.py and test_dbf_table.py
4583            (MemoryTableTest.test_read): field_info should be returning tuples
4584            with four items
4585            (MemoryTableTest.test_write): Make doc-string a more precise.
4586    
4587            * Thuban/Model/transientdb.py (TransientTableBase): Convert to new
4588            table interface. Derive from from OldTableInterfaceMixin for
4589            compatibility.
4590            (TransientTableBase.create): New intance variable column_map to
4591            map from names and indices to column objects
4592            (TransientTable.create): Use the new table interface of the input
4593            table
4594            (AutoTransientTable): Convert to new table interface. Derive from
4595            from OldTableInterfaceMixin for compatibility.
4596            (AutoTransientTable.write_record): Removed. It's not implemented
4597            yet and we still have to decide how to handle writing with the new
4598            table and data framework.
4599    
4600            * test/test_transientdb.py
4601            (TestTransientTable.run_iceland_political_tests)
4602            (TestTransientTable.test_transient_joined_table): Use the new
4603            table interface
4604    
4605    2003-05-05  Jonathan Coles   <[email protected]>
4606    
4607            This is namely a collection of UI updates to improve user interactivity.
4608            Tabbing between controls now exists and you can use ESC to close dialog
4609            boxes; ENTER will active the default button.
4610    
4611            * Thuban/UI/classgen.py (ClassGenDialog.__init__): Rearrange the
4612            order that the controls are created so that tabbing works correctly.
4613            (ClassGenDialog.OnOK): Renamed from _OnGenerate() so that the
4614            wxDialog can handle the default button correctly.
4615            (ClassGenDialog.OnCancel): Renamed from _OnCloseBtn() for the
4616            same reasons as for OnOK.
4617            (GenUniformPanel._OnRetrieve): Call wxBeginBusyCursor/wxEndBusyCursor
4618            when we ask the table for the maximum/minimum values of a field
4619            which could take a very long time.
4620    
4621            * Thuban/UI/classifier.py (Classifier.__init__): Rearrange the
4622            order that the controls are created so that tabbing works correctly.
4623            (SelectPropertiesDialog.__init__): Rearrange the order that the
4624            controls are created so that tabbing works correctly.
4625    
4626            * Thuban/UI/dialogs.py: Copied NonModalDialog box and changed it
4627            to derive from a wxDialog but behave like the original implementation
4628            which was derived from a wxFrame. wxDialog provides useful key
4629            handling functionality like ESC calling OnCancel and ENTER calling
4630            OnOK which is lost with wxFrame.
4631    
4632            * Thuban/UI/mainwindow.py: Add "..." to menu items that will open
4633            new dialogs.
4634    
4635            * Thuban/UI/projdialog.py (ProjFrame.__init__): Rearrange the
4636            order that the controls are created so that tabbing works correctly.
4637            (ProjFrame.OnApply): Renamed from _OnTry() to use wxDialog behaviour.
4638            (ProjFrame.OnOK): Renamed from _OnOK() to use wxDialog behaviour.
4639            (ProjFrame.OnCancel): Renamed from _OnClose() to use wxDialog behaviour.
4640            (ProjPanel.__init__): Add "Airy" to the list of ellipsoids so we
4641            can provide the "UK National Grid" as a default projection.
4642            (UTMPanel.__init__): Rearrange the order that the controls are
4643            created so that tabbing works correctly.
4644    
4645    2003-05-05  Bernhard Herzog  <[email protected]>
4646    
4647            * extensions/thuban/wxproj.cpp: Fix some of the comments.
4648            (project_point): If a map projection but no layer projection is
4649            given, convert degrees to radians before applying the map
4650            projection.
4651    
4652            * Thuban/UI/tableview.py (TableGrid.disallow_messages)
4653            (TableGrid.allow_messages): New methods to make it possible to
4654            inhibit message sending.
4655            (TableGrid.issue): Only send the message if not inhibited.
4656            (LayerTableGrid.select_shape): Use the new methods to make sure
4657            that no ROW_SELECTED message is sent while we're updating the
4658            selected rows to match the selected shapes.
4659    
4660    2003-05-02  Jan-Oliver Wagner <[email protected]>
4661    
4662            Implementation of MemoryTable.
4663    
4664            * Thuban/Model/table.py (MemoryTable): New. Quite simple table
4665            implementation that operates on a list of tuples. All of the data
4666            are kept in the memory.
4667    
4668            * test/test_table.py (MemoryTableTest): New.
4669    
4670            * test/test_transientdb.py (SimpleTable): Removed.
4671            (TestTransientTable.test_transient_joined_table,
4672            (TestTransientTable.test_transient_table_read_twice): Replaced
4673            SimpleTable by MemoryTable.
4674    
4675    2003-04-30  Jonathan Coles   <[email protected]>
4676    
4677            * Data/iceland_sample.thuban: Now contains correct projections
4678            for each of the layers.
4679    
4680            * Resources/Projections/defaults.proj: Geographic projection
4681            contains unit conversion parameter.
4682    
4683    2003-04-30  Jonathan Coles   <[email protected]>
4684    
4685            The most important part of this putback is the projection changes.
4686            It should now be possible to specify the projection that a layer
4687            is in and then specify a different projection for the map. The
4688            projection dialog has an extra parameter for a geographic projection
4689            which lets the user select if the input is in degrees or radians.
4690    
4691            * Thuban/Model/layer.py (Layer.ShapesInRegion): Fix docstring
4692            to say that the parameter is a tuple of unprojected
4693            points (which is what the callers to this method were assuming).
4694            Also, since the points are unprojected we need to projected them.
4695    
4696            * Thuban/UI/legend.py (LegendTree.MoveCurrentItemUp,
4697            LegendTree.MoveCurrentItemDown): If the layer or any of the layer's
4698            groups are selected, move the layer up/down. Fixes RTbug #1833.
4699    
4700            * Thuban/UI/mainwindow.py: Move menu item map_rename up.
4701    
4702            * Thuban/UI/projdialog.py (ProjFrame._OnSave): Add missing
4703            parameter in call to SetClientData.
4704            (GeoPanel): Add support for selecting the units that the
4705            source data is in (Radians or Degrees).
4706    
4707            * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Optimize
4708            the rendering loop by reducing the number of if's, removing the
4709            unnecessary try/except block, and checking if the old group
4710            is the same as the new one (which happens a lot if there is
4711            no classification, or lots of shapes are in the same group).
4712    
4713            * Thuban/UI/view.py (MapCanvas.OnPaint): Add a try/except block
4714            around the redraw routine to try to catch problems that the user
4715            may create by selecting invalid projections for the data set and
4716            map. Clears the display if there are any problems and prints the
4717            error.
4718            (MapCanvas.do_redraw): Use DC.Clear() instead of drawing a filled
4719            rectangle.
4720    
4721            * extensions/thuban/wxproj.cpp (project_point): First invert the
4722            supplied point (which should be in projected coordinates) using
4723            the layer's projection and then project the point using the
4724            map's projection.
4725            (project_points): Use project_point() to project each point.
4726    
4727    2003-04-30  Jan-Oliver Wagner <[email protected]>
4728    
4729            * Thuban/Model/layer.py (Layer.SetShapeStore): Fixed a bug:
4730            don't set the Classification to None if the classfication field
4731            is None (ie only a DEFAULT).
4732    
4733    2003-04-30  Bernhard Herzog  <[email protected]>
4734    
4735            * Thuban/UI/view.py: Fix some typos.
4736    
4737            * Thuban/UI/mainwindow.py (MainWindow.identify_view_on_demand): Do
4738            not pop up the dialog if the selection becomes empty (this could
4739            happen if e.g. a new selection is opened while the identify tool
4740            is active and dialog had been closed)
4741    
4742    2003-04-30  Bernhard Herzog  <[email protected]>
4743    
4744            * Thuban/Model/transientdb.py (TransientTableBase.__init__): New
4745            instance variable read_record_last_result
4746            (TransientTableBase.read_record): Make sure reading the same
4747            record twice works. The implementation uses the new instance
4748            variable read_record_last_result
4749    
4750            * test/test_transientdb.py
4751            (TestTransientTable.test_transient_table_read_twice): New test
4752            case for the above bug-fix.
4753    
4754    2003-04-29  Jonathan Coles   <[email protected]>
4755    
4756            * Thuban/common.py: Removed. No longer needed Str2Num. RTbug #1832.
4757    
4758            * Thuban/UI/classgen.py: Remove all uses of Str2Num.
4759    
4760            * Thuban/UI/classifier.py: Remove all uses of Str2Num.
4761            (ClassTable.SetValueAsCustom): Rename keyword argument in
4762            ClassGroup* constructors to match argument name.
4763    
4764    2003-04-29  Bernhard Herzog  <[email protected]>
4765    
4766            * Thuban/Model/session.py (Session.Destroy): Explicitly close the
4767            transient DB if it exists to make sure it doesn't leave a journal
4768            file in the temp directory.
4769    
4770            * Thuban/Model/transientdb.py (TransientDatabase.close): Set
4771            self.conn to None after closing the connection to make sure it's
4772            not closed twice
4773    
4774    2003-04-29  Jonathan Coles   <[email protected]>
4775    
4776            Add a visible parameter in the layer XML tag. The default value is
4777            "true". If anything other than "false" is specified we also assume
4778            "true". Addresses RTbug #1025.
4779    
4780            * Doc/thuban.dtd: Add visible parameter to a layer.
4781    
4782            * Thuban/Model/layer.py (BaseLayer.__init__): Change default value
4783            of visible from 1 to True.
4784            (Layer.__init__): Change default value of visible from 1 to True.
4785    
4786            * Thuban/Model/load.py (SessionLoader.start_layer): Read visible
4787            parameter.
4788    
4789            * Thuban/Model/save.py (SessionSaver.write_layer): Save visible
4790            parameter.
4791    
4792            * test/test_load.py: Add new test data contents_test_visible.
4793            (LoadSessionTest.setUp): save test data.
4794            (LoadSessionTest.testLayerVisibility): Test if the visible flag
4795            is loaded correctly.
4796    
4797            * test/test_save.py (SaveSessionTest.testSingleLayer): Add test
4798            for saving an invisible layer.
4799    
4800    2003-04-29  Jonathan Coles   <[email protected]>
4801    
4802            * Thuban/UI/mainwindow.py (MainWindow.SetMap): Look up the
4803            legend dialog box and tell it to change its map to the one
4804            supplied to SetMap(). Fixes RTbug #1770.
4805    
4806  2003-04-29  Bernhard Herzog  <[email protected]>  2003-04-29  Bernhard Herzog  <[email protected]>
4807    
4808          Next step of table implementation. Introduce a transient database          Next step of table implementation. Introduce a transient database
# Line 51  Line 4856 
4856          once. Plus it introduces a reference cycle that keeps can keep the          once. Plus it introduces a reference cycle that keeps can keep the
4857          session object alive for a long time.          session object alive for a long time.
4858    
4859  2003-04-25  Jonathan Coles   <[email protected]>  2003-04-29  Jonathan Coles   <[email protected]>
4860    
4861          * Thuban/Model/proj.py (Projection): Removed Set*() methods to make          * Thuban/Model/proj.py (Projection): Removed Set*() methods to make
4862          Projection an immutable item. Fixes RTbug #1825.          Projection an immutable item. Fixes RTbug #1825.

Legend:
Removed from v.766  
changed lines
  Added in v.1807

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26