/[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 1191 by jonathan, Thu Jun 12 17:01:45 2003 UTC revision 1895 by frank, Fri Oct 31 10:13:32 2003 UTC
# Line 1  Line 1 
1    2003-10-31  Frank Koormann <[email protected]>
2    
3            Added two items to legend popup menu: Remove Layer and Show Layer Table
4    
5            * Thuban/UI/legend.py (LegendPanel._OnRemoveLayer,
6            LegendPanel._OnShowTable): New event handlers, call the corresponding
7            mainwindow methods.
8            (LegendTree._OnRightClick): Added items to popup menu.
9    
10    2003-10-30  Bernhard Herzog  <[email protected]>
11    
12            * Thuban/UI/dialogs.py (ThubanFrame.__init__): Handle
13            EVT_WINDOW_DESTROY
14            (ThubanFrame.OnDestroy): New. Handler for EVT_WINDOW_DESTROY. Does
15            nothing but is convenient for the derived classes.
16    
17            * Thuban/UI/tableview.py
18            (TableFrame.OnDestroy, LayerTableFrame.OnDestroy): New.
19            Unsubscribe the messages here not in OnClose because that might
20            get called multiple times. Fixes RT #2196
21            (TableFrame.OnClose, LayerTableFrame.OnClose): Removed. Not needed
22            anymore.
23    
24            * README: Update the minimum requirement for wxPython. Since we
25            now use the EVT_WINDOW_DESTROY event, we need at least 2.4.0.4,
26            the version in which that was introduced for all platforms
27    
28    2003-10-30  Frank Koormann <[email protected]>
29    
30            * Thuban/UI/join.py (JoinDialog.OnJoin): Wrapped the major parts of
31            the join process in a ThubanBeginBusyCursor, ThubanEndBusyCursor
32            frame.
33    
34    2003-10-30  Jan-Oliver Wagner <[email protected]>
35    
36            Improved APR import extension, added further EPSG definitions
37            and some cleanup regarding string class.
38    
39            * test/test_proj.py (TestProjection.test_get_projection_units_geo):
40            Added test for alias 'longlat'.
41    
42            * Resources/Projections/epsg-deprecated.proj: New. Contains
43            deprecated EPSG definitions.
44    
45            * Extensions/importAPR/odb.py (ODBBaseObject.TreeInfo): Added
46            the variable names for objects.
47    
48            * Extensions/importAPR/apr.py (APR_BLnSym, APR_BMkSym, APR_BShSym): New.
49            Copied from importAPR and provided with documentation.
50    
51            * Extensions/importAPR/importAPR.py (APR_BLnSym, APR_BMkSym, APR_BShSym):
52            Moved to apr.py.
53            (APR_View): Added object ref 'ITheme'.
54    
55            * Thuban/Lib/fileutil.py, Thuban/UI/proj4dialog.py: Replaced string
56            split function by corresponding use of the string class method.
57    
58            * Thuban/Model/xmlwriter.py: Replaced string replace function by
59            corresponding string method.
60    
61    2003-10-29  Bernhard Herzog  <[email protected]>
62    
63            * Thuban/UI/baserenderer.py
64            (BaseRenderer.draw_shape_layer_incrementally): Speed up the
65            special case of a classification that only has the default group
66    
67    2003-10-27  Bernhard Herzog  <[email protected]>
68    
69            * po/fr.po, po/es.po: Updated translations from Daniel Calvelo
70    
71            * po/de.po: Update.
72    
73            * Thuban/UI/application.py
74            (ThubanApplication.ShowExceptionDialog): Handle translation of the
75            dialog message properly
76    
77    2003-10-27  Bernhard Herzog  <[email protected]>
78    
79            Rework how localization works so that we use wx's translation
80            functions when running Thuban as a normal application but not when
81            we don't need any UI, such as in the test suite. See the comment
82            in Thuban/__init__.py for details
83    
84            * Thuban/__init__.py (_): Add one level of indirection to make the
85            translation handling more flexible and to make it possible to use
86            either wx's translation services or not.
87            (gettext_identity, translation_function_installed)
88            (install_translation_function): New function to help with this
89    
90            * Thuban/UI/__init__.py: Install the wx specific translation
91            function if it's OK to do that
92    
93            * test/support.py (initthuban): Install a dummy translation
94            function so that importing Thuban.UI doesn't install a wx specific
95            one for which would need to import wxPython
96    
97    2003-10-27  Bernhard Herzog  <[email protected]>
98    
99            * HOWTO-Release: Source archives should be created first and the
100            binary packages should be created from the source archives.
101            There's an official debian package now so there's no need to test
102            the rpm on debian anymore
103    
104    2003-10-27  Bernhard Herzog  <[email protected]>
105    
106            Several rendering changes:
107    
108             - Render the selection into a separate bitmap so that only that
109               bitmap needs to be redrawn when the selection changes
110    
111             - Render incrementally showing previews and allowing interaction
112               before rendering is complete
113    
114             - Update the renderer interface a bit. Most parameters of
115               RenderMap are now parameters of the constructor
116    
117            * Thuban/UI/baserenderer.py (BaseRenderer.__init__): Add the map
118            and the update region as parameters. Update the doc-string
119            (BaseRenderer.render_map_incrementally): New. Generator function
120            to renders the map incrementally
121            (BaseRenderer.render_map): Remove the map argument (it's now in
122            the constructor) and simply iterate over the
123            render_map_incrementally generator to draw the map.
124            (BaseRenderer.draw_shape_layer_incrementally)
125            (BaseRenderer.draw_shape_layer): Renamed to
126            draw_shape_layer_incrementally and changed into a generator that
127            yields True every 500 shapes. Used by render_map_incrementally to
128            render shape layers incrementally
129    
130            * Thuban/UI/renderer.py (ScreenRenderer.RenderMap): Removed the
131            map and region parameters which are now in the constructor
132            (ScreenRenderer.RenderMapIncrementally): New. Public frontend for
133            the inherited render_map_incrementally.
134            (BaseRenderer.draw_shape_layer): Removed.
135            (ScreenRenderer.draw_selection_incrementally): New. The selection
136            drawing part of the removed draw_shape_layer as a generator
137            (ScreenRenderer.layer_shapes): Update because of the region
138            parameter change
139            (ExportRenderer.__init__): New. Extend the inherited constructor
140            with the destination region for the drawing
141            (ExportRenderer.RenderMap): Removed the map and region parameters
142            which are now in the constructor
143    
144            * Thuban/UI/view.py (MapCanvas.PreviewBitmap): New. Return a
145            bitmap suitable for a preview in a tool
146            (CanvasPanTool.MouseMove): Use the PreviewBitmap method to get the
147            bitmap
148            (MapPrintout.draw_on_dc): Adapt to new renderer interface
149            (MapCanvas.OnPaint): Handle drawing the selection bitmap if it
150            exists
151            (MapCanvas.OnIdle): Update the logic to deal with incremental
152            rendering and the selection bitmap
153            (MapCanvas._do_redraw): Handle the instantiation of the render
154            iterator and the redraws during rendering
155            (MapCanvas._render_iterator): New. Generator to incrementally
156            redraw both bitmaps
157            (MapCanvas.Export): Adapt to new renderer interface.
158            (MapCanvas.full_redraw): Reset the selection bitmap and the
159            renderer iterator too
160            (MapCanvas.redraw_selection): New. Force a redraw of the selection
161            bitmap
162            (MapCanvas.shape_selected): Only redraw the selection bitmap
163    
164            * test/test_baserenderer.py
165            (TestBaseRenderer.test_polygon_no_projection)
166            (TestBaseRenderer.test_raster_no_projection)
167            (TestBaseRenderer.test_point_map_projection)
168            (TestBaseRenderer.test_point_layer_and_map_projection)
169            (TestBaseRenderer.test_point_layer_projection)
170            (TestBaseRenderer.test_point_with_classification): Adapt to new
171            renderer interface
172    
173    2003-10-24  Bernhard Herzog  <[email protected]>
174    
175            * libraries/thuban/wxproj.cpp (draw_polygon_shape)
176            (point_in_polygon_shape, shape_centroid): Raise an exception if
177            the shape can't be read. Previously invalid shape ids would lead
178            to a segfault.
179    
180            * test/test_wxproj.py (TestShapeCentroid.test_invalid_shape_id):
181            New. test whether an exception is raised for invalid shape ids
182    
183    2003-10-24  Jan-Oliver Wagner <[email protected]>
184    
185            * Thuban/Model/proj.py (Projection.GetProjectedUnits): Added 'longlat'
186            as alias for 'latlong'.
187    
188            * Thuban/UI/projdialog.py (ProjFrame.__init__): Added 'longlat'
189            as alias for 'latlong'.
190    
191    2003-10-24  Jan-Oliver Wagner <[email protected]>
192    
193            * Thuban/UI/projdialog.py (ProjFrame.proj_selection_changed): Set
194            the projection even for the UnknownPanel.
195            (UnknownProjPanel.__init__): Define the text and create the textctrl
196            widget.
197            (UnknownProjPanel._DoLayout): Replaced static text widget by the
198            textctrl created in __init__.
199            (UnknownProjPanel.SetProjection): Set the text for the text ctrl
200            including the parameters of the projection.
201            
202    2003-10-24  Jan-Oliver Wagner <[email protected]>
203    
204            * Resources/Projections/epsg.proj: New. This is a list of
205            EPSG codes with parameters for proj. The list has been
206            generated using devtools/create_epsg.py based on the
207            file nad/epsg of the proj 4.4.7 package. Four projection
208            definitions have been deleted as they are not accepted by proj:
209            "CH1903+ / LV95", "Bern 1898 (Bern) / LV03C", "CH1903 / LV03"
210            and "HD72 / EOV".
211    
212    2003-10-22  Bernhard Herzog  <[email protected]>
213    
214            Some more tweaks to the projection dialog which should fix RT
215            #1886.
216    
217            * Thuban/UI/projlist.py (ProjectionList.Destroy): Unsubscribe from
218            the ProjFile's messages and call the base class methods correctly
219            (ProjectionList.SelectProjection): Set the wxLIST_STATE_FOCUSED
220            flag on the newly selected item too. Otherwise some other item is
221            focused and the first time the focus is moved with the keyboard
222            the selection moves in unexpected ways.
223    
224            * Thuban/UI/projdialog.py (ProjFrame.__init__): Do not set the
225            focus on the OK button, only on the projection list. That way the
226            list really has the focus initially
227            (ProjFrame.OnClose): Call the projection list's Destroy method to
228            make it unsubscribe all messages
229    
230    2003-10-21  Bernhard Herzog  <[email protected]>
231    
232            Rework the projection dialog to fix a few bugs, including RT 2166
233            and most of 2168
234    
235            * Thuban/UI/projlist.py: New. The class ProjectionList is a
236            special wxListCtrl to show a list of projections in a more MVC
237            fashion
238    
239            * Thuban/UI/projdialog.py (ProjFrame): Substantial changes
240            throughout the class. The main change is to use the ProjectionList
241            class instead of a normal wxListBox. Also, add an explicit
242            "Unknown" projection to the projection choice control.
243            (ProjPanel.__init__): Add an "unknown" ellipsoid
244            (TMPanel.__init__, LCCPanel.__init__): Tweak the order of
245            instantiation of the panel's controls to make the tab-order more
246            natural
247    
248    2003-10-21  Bernhard Herzog  <[email protected]>
249    
250            * test/test_load.py (TestSingleLayer.file_contents)
251            (TestSingleLayer.test): Add non-ascii characters to the titles of
252            session, map and layer. This is effectively a port of the
253            TestUnicodeStrings test in test_load_0_8.py which for some reason
254            was only added there.
255    
256            * test/test_load_0_9.py (TestSingleLayer.file_contents)
257            (TestSingleLayer.test): Same as in test_load.py: add non-ascii
258            characters to the titles of session, map and layer,.
259    
260    2003-10-21  Bernhard Herzog  <[email protected]>
261    
262            Add EPSG projection handling to .thuban files
263    
264            * test/test_save.py (SaveSessionTest.dtd)
265            (SaveSessionTest.testEmptySession)
266            (SaveSessionTest.testLayerProjection)
267            (SaveSessionTest.testRasterLayer)
268            (SaveSessionTest.testClassifiedLayer)
269            (SaveSessionTest.test_dbf_table)
270            (SaveSessionTest.test_joined_table)
271            (SaveSessionTest.test_save_postgis): Update to 1.0-dev namespace
272            (SaveSessionTest.testSingleLayer): Update to 1.0-dev namespace and
273            use a and epsg projection to test saving them
274    
275            * test/test_load.py (LoadSessionTest.dtd): Update to 1.0-dev
276            namespace
277            (TestLayerVisibility.file_contents, TestLabels.file_contents)
278            (TestLayerProjection.file_contents)
279            (TestRasterLayer.file_contents, TestJoinedTable.file_contents)
280            (TestPostGISLayer.file_contents)
281            (TestPostGISLayerPassword.file_contents)
282            (TestLoadError.file_contents, TestLoadError.test): Update to use
283            1.0-dev namespace
284            (TestSingleLayer.file_contents, TestSingleLayer.test): Update to
285            use 1.0-dev namespace and use an EPSG projection to test whether
286            loading it works
287    
288            * test/test_load_0_9.py: New. Effectively a copy of test_load.py
289            as of Thuban 0.9. These are now tests to determine whether Thuban
290            can still read files generated by Thuban 0.9
291    
292            * Thuban/Model/save.py (SessionSaver.write)
293            (SessionSaver.write_session): Use the 1.0 dtd and 1.0-dev
294            namespace
295            (SessionSaver.write_projection): Write the projection's epsg
296            attribute
297    
298            * Thuban/Model/load.py (SessionLoader.__init__): Also accept the
299            thuban-1.0-dev.dtd namespace
300            (SessionLoader.check_attrs): Allow a callable object as conversion
301            too
302            (SessionLoader.start_projection, SessionLoader.end_projection)
303            (SessionLoader.start_parameter): Handle the epsg attribute and
304            rename a few instance variables to lower case
305    
306            * Resources/XML/thuban-1.0.dtd: New. Only difference to
307            thuban-0.9.dtd is the epsg attribute for projections.
308    
309    2003-10-21  Bernhard Herzog  <[email protected]>
310    
311            * test/runtests.py (main): Let the user specify which tests to run
312            on the command line
313    
314            * test/support.py (ThubanTestResult.getDescription): Override to
315            give a better short description. The description can be used as a
316            parameter to run_tests to run that particular test in isolation.
317    
318    2003-10-21  Frank Koormann   <[email protected]>
319    
320            Popup menu for legend. Scheduled for the 1.2 release this was too
321            simple to implement: The popup menu is bound to the legend tree, while
322            the events are hanlded by its anchestor, the legend panel. This
323            allows reuse of all the event handlers already implemented for the
324            legend toolbar buttons.
325    
326            * Thuban/UI/legend.py (LegendPanel.__init__): EVT_MENU macros
327            to add handlers for the events issued by the popup menu.
328            (LegendPanel._OnToggleVisibility): Handler for toggling layer
329            visibility event
330            (LegendPanel._OnProjection): Handler for layer projection event.
331            (LegendTree.__init__): Added EVT_TREE_ITEM_RIGHT_CLICK
332            (LegendTree._OnRightClick): Event handler for right click, select item
333            and pop up menu.
334            (LegendTree.ToggleVisibility): Toggle layer visibility
335            (LegendTree.LayerProjection): Raise layer projection dialog for
336            current layer.
337    
338    2003-10-21  Bernhard Herzog  <[email protected]>
339    
340            * Resources/Projections/defaults.proj: Use correct DOCTYPE
341            declaration. The top-level element is projectionlist not projfile
342    
343    2003-10-20  Bernhard Herzog  <[email protected]>
344    
345            * Thuban/UI/projdialog.py (ProjFrame.write_proj_file): New. helper
346            method to write a projfile and display a busy cursor and error
347            dialogs.
348            (ProjFrame._OnSave, ProjFrame._OnAddToList, ProjFrame._OnImport)
349            (ProjFrame._OnExport, ProjFrame._OnRemove): Use write_proj_file
350            (ProjFrame.__FillAvailList): Translate "<None>" too and display a
351            busy cursor while loading the user and system prj files.
352    
353    2003-10-16  Bernhard Herzog  <[email protected]>
354    
355            * Thuban/Model/resource.py (projfile_cache): Introduce a cache for
356            ProjFile objects
357            (clear_proj_file_cache): New function to clear the cache. Mainly
358            useful for use by the test suite
359            (read_proj_file): Use the cache.
360    
361            * test/test_proj.py (TestProjFile): Clarify the doc-string
362            (ProjFileReadTests): Update doc-string
363            (ProjFileReadTests.test_get_system_proj_file): Check whether the
364            system proj files is cached.
365            (ProjFileLoadTestCase): New base class for the proj file tests
366            derived from support.FileLoadTestCase to provide some common
367            behavior.
368            (TestLoadingProjFile)
369            (TestLoadingProjFileWithEmptyProjectionlist.file_contents)
370            (TestProjFileWithInvalidParameters.file_contents): Derive from
371            ProjFileLoadTestCase
372            (TestLoadingProjFile.test_caching): New. Test whether the cache
373            works
374    
375    2003-10-16      Silke Reimer    <[email protected]>
376    
377            * debian/*: New directory with configuration files for building a thuban
378              deb-package.
379    
380    2003-10-14  Bernhard Herzog  <[email protected]>
381    
382            * test/test_proj.py: Execute support.run_tests when run as
383            __main__ so that missing unsubscribes are detected
384            (TestProjFile.tearDown): Destroy the proj_file properly
385    
386    2003-10-14  Bernhard Herzog  <[email protected]>
387    
388            * Thuban/Model/messages.py (PROJECTION_ADDED)
389            (PROJECTION_REPLACED, PROJECTION_REMOVED): New message types for
390            the ProjFile objects
391    
392            * Thuban/Model/proj.py (ProjFile): Derive from Publisher so we can
393            easily send messages when the projections change
394            (ProjFile.Add, ProjFile.Remove, ProjFile.Replace): Issue messages
395            when the change was successful
396    
397            * test/test_proj.py (TestProjFile.setUp): Subscribe to some of the
398            proj file messages
399            (TestProjFile.test_add_remove)
400            (TestProjFile.test_remove_non_existing)
401            (TestProjFile.test_replace)
402            (TestProjFile.test_replace_non_existing): Test whether the right
403            messages are sent
404    
405    2003-10-14  Bernhard Herzog  <[email protected]>
406    
407            * test/test_proj.py (TestProjFile.test): Refactor into several
408            tests
409            (TestProjFile.test_add_remove)
410            (TestProjFile.test_remove_non_existing)
411            (TestProjFile.test_replace)
412            (TestProjFile.test_replace_non_existing): Some of the new
413            individual test cases
414            (TestProjFileSimple): New class for the rest of the test cases
415            that came out of the refactoring
416            (ProjFileTest): Derive from xmlsupport.ValidationTest so that the
417            derived classes don't have to
418    
419    2003-10-13  Bernhard Herzog  <[email protected]>
420    
421            Add an optional EPSG code to the projection objects and extend the
422            .proj file format accordingly.
423    
424            * Resources/XML/projfile.dtd (element projection): Add epsg
425            attribute
426    
427            * Thuban/Model/proj.py (Projection.__init__): New parameter and
428            instance variable epsg. Update doc-string
429            (Projection.EPSGCode, Projection.Label): New methods to provide
430            access to EPSG code and a label for use in dialogs
431    
432            * Thuban/Model/resource.py (ProjFileReader.start_projection)
433            (ProjFileReader.end_projection, ProjFileSaver.write_projfile):
434            Handle the epsg code attribute when reading or writing proj files
435    
436            * Thuban/UI/projdialog.py (ProjFrame._OnSave)
437            (ProjFrame._OnAddToList, ProjFrame.__DoOnProjAvail)
438            (ProjFrame.__FillAvailList): Use the projection's Label method to
439            get the string for the list box
440    
441            * test/test_proj.py (TestProjection.test_label)
442            (TestProjection.test_label_epsg)
443            (TestProjection.test_epsgcode_for_non_epsg_projection)
444            (TestProjection.test_epsgcode_for_real_epsg_projection): New tests
445            for the label and EPSGCode methods
446            (WriteProjFileTests.doTestWrite, WriteProjFileTests.test_write)
447            (WriteProjFileTests.test_write_empty_file): Create the ProjFile
448            objects in the test cases and put the expected contents into the
449            test case methods too. Update doTestWrite accordingly
450            (TestLoadingProjFile)
451            (TestLoadingProjFileWithEmptyProjectionlist): New classes with the
452            read tests from TestProjFile.
453            (TestProjFile.doTestRead, TestProjFile.testRead): Removed. These
454            tests are now in the new classes.
455            (sample_projfile, sample_projfile_data)
456            (sample_projfile2, sample_projfile_data2): Removed. Not used
457            anymore.
458            (TestProjFile.test_read_unreadable_file): No need to reset the
459            permissions at the end anymore since we use a unique filename
460    
461    2003-10-13  Bernhard Herzog  <[email protected]>
462    
463            * test/test_proj.py: Some more refactoring of the test cases
464            (ProjFileTest): New base class for the proj file tests.
465            (TestProjFile): Derive from ProjFileTest
466            (TestProjFile.test_read_unreadable_file)
467            (TestProjFile.test_read_empty_file, TestProjFile.doTestRead): Use
468            the new filename method to get a unique filename
469            (TestProjFile.doTestWrite, TestProjFile.testWrite): Removed.
470            (WriteProjFileTests): New class for proj file write tests.
471            Contains the write test that were in TestProjFile originally.
472    
473    2003-10-13  Bernhard Herzog  <[email protected]>
474    
475            * test/test_proj.py (TestProjFile.testRead)
476            (TestProjFile.test_read_non_existing_file)
477            (TestProjFile.test_read_unreadable_file)
478            (TestProjFile.test_read_empty_file): Split into several methods.
479    
480    2003-10-10  Bernhard Herzog  <[email protected]>
481    
482            * Thuban/UI/sizers.py: New file with custom sizers.
483    
484            * Thuban/UI/projdialog.py (ProjFrame.build_dialog): Instantiate
485            all projection type specific panels and put them into a
486            NotebookLikeSizer. This way the dialog doesn't change its size
487            when a different projection is selected
488            (ProjFrame.__init__): Rename projection_panels
489            projection_panel_defs and reuse projection_panels for a list of
490            the instantiated panels.
491            (ProjFrame._show_proj_panel, ProjFrame.__DoOnProjAvail)
492            (ProjFrame.__DoOnProjChoice): Changes due to the new handling of
493            the panels
494            (UnknownProjPanel._DoLayout): Place the newlines in the message
495            differently to make the panel narrower.
496            (TMPanel._DoLayout): Layout the parameters in one column.
497    
498    2003-10-10  Bernhard Herzog  <[email protected]>
499    
500            * Thuban/UI/projdialog.py (ProjFrame.build_dialog): New method
501            that contains all the setup for the dialog's widgets, layout and
502            event handling.
503            (__): Call build_dialog to build the dialog.
504            (ProjFrame.__set_properties, ProjFrame.__do_layout): Removed.
505            Their functionality is now in build_dialog
506            (ProjFrame.__VerifyButtons, ProjFrame.__VerifyButtons)
507            (ProjFrame.__DoOnProjAvail, ProjFrame.__DoOnProjAvail)
508            (ProjFrame.__DoOnProjChoice): Small updates due to slightly
509            different widget names and hierarchy introduced with build_dialog.
510    
511    2003-10-10  Bernhard Herzog  <[email protected]>
512    
513            * README: Fix typo.
514    
515    2003-10-09  Bernhard Herzog  <[email protected]>
516    
517            * Thuban/Model/proj.py (ProjFile.Add): Do not check whether the
518            projection is already in the list. This is *a lot* faster when
519            loading files with hundreds of projections since it saves a linear
520            search. OTOH this will allow adding the same projection to the
521            user.proj file multiple times in the projection dialog but we'll
522            deal with that later
523    
524    2003-10-09  Jan-Oliver Wagner <[email protected]>
525    
526            * devtools: New. Directory for developer tools that are not intended
527            for the regular user.
528    
529            * devtools/create_epsg.py: New. Convert the epsg file of proj into
530            a python .proj file.
531    
532    2003-10-09  Bernhard Herzog  <[email protected]>
533    
534            * test/test_proj.py
535            (TestProjection.test_get_parameter_without_equals_sign): New. Test
536            whether GetParameter handles parameters without "=" sign correctly
537    
538            * Thuban/Model/proj.py (Projection.GetParameter): Handle
539            parameters that do not contain a "=". Update the doc-string
540    
541    2003-10-08  Bernhard Herzog  <[email protected]>
542    
543            * Thuban/UI/projdialog.py (ProjFrame.__set_properties): Remove the
544            length limit on the projname text control
545    
546    2003-10-08  Bernhard Herzog  <[email protected]>
547    
548            * test/test_proj.py (TestProjection.test_get_projection_units_geo)
549            (TestProjection.test_get_projection_units_normal): New. Tests for
550            the Projection.GetProjectedUnits method
551    
552    2003-10-08  Jan-Oliver Wagner <[email protected]>
553    
554            * Thuban/Model/resource.py (get_user_proj_file): small bug-fix:
555            Added missing 'val' parameter.
556    
557    2003-10-08  Bernhard Herzog  <[email protected]>
558    
559            * Thuban/UI/projdialog.py (ProjFrame.__DoOnProjAvail): When the
560            projection type of the currently selected projection is not known,
561            i.e. there's no panel for it, use the UnknownProjPanel
562            (ProjFrame.__DoOnProjChoice, ProjFrame._show_proj_panel): Split
563            the actual replacing of the proj panel into the new method
564            _show_proj_panel.
565            (UnknownProjPanel): Add doc-string.
566            (UnknownProjPanel._DoLayout): Insert a newline into the text so
567            that the panel is not so wide.
568    
569    2003-10-08  Bernhard Herzog  <[email protected]>
570    
571            * Thuban/Model/resource.py (read_proj_file): Return the warnings
572            too. Update the doc-string
573            (get_proj_files): Removed. It wasn't used anywhere
574            (get_system_proj_files, get_system_proj_file): Rename to
575            get_system_proj_file and return the ProjFile object and not a list
576            of ProjFile objects. Update the callers.
577            (get_user_proj_files, get_user_proj_file): Rename to
578            get_user_proj_file return the ProjFile object and not a list of
579            ProjFile objects. Update the callers.
580            (ProjFileReader.__init__): New instance variable for the warnings.
581            Rename the __pf ivar to projfile. Update the methods referring to
582            __pf
583            (ProjFileReader.end_projection): Catch any errors raised when
584            instantiating the projection and record that as an error. The
585            projection will not be in the final ProjFile object.
586            (ProjFileReader.GetWarnings): New method to return the warnings.
587    
588            * Thuban/UI/projdialog.py (ProjFrame.show_warnings): New method to
589            show the warnings from the projfile reader
590            (ProjFrame._OnImport): Deal with any warnings returned by
591            read_proj_file
592            (ProjFrame.__FillAvailList): Deal with any warnings returned by
593            get_system_proj_file or get_user_proj_file.
594    
595            * test/test_proj.py (TestProjFile.doTestRead): Check the warnings.
596            (TestProjFileWithInvalidParameters.file_contents): New test cases
597            to test whether read_proj_file handles invalid projection
598            parameters correctly
599            (TestProjFile.test_get_system_proj_file): New. Simple test for
600            resource.get_system_proj_file
601    
602    2003-10-07  Bernhard Herzog  <[email protected]>
603    
604            * test/test_derivedshapestore.py
605            (TestDerivedShapeStoreExceptions.tearDown): Clear the session
606            properly so that the temporary directories get deleted correctly
607    
608    2003-10-06  Bernhard Herzog  <[email protected]>
609    
610            Handle the title changes in a proper MVC way.
611    
612            * Thuban/UI/mainwindow.py (MainWindow.__init__): Subscribe to the
613            canvas' TITLE_CHANGED messages
614            (MainWindow.update_title): New. Update the main window's title
615            (MainWindow.__SetTitle): Removed. Use update_title instead.
616            (MainWindow.SetMap): Use update_title instead of __SetTitle
617            (MainWindow.RenameMap): Do change the window title explicitly
618            here. That's handled in a proper MVC way now.
619            (MainWindow.title_changed): New. Subscriber for the TITLE_CHANGED
620            messages
621    
622            * Thuban/Lib/connector.py (Conduit): New class to help classes
623            that forward messages
624    
625            * Thuban/UI/viewport.py: Forward the map's TITLE_CHANGED messages
626            (ViewPort): Derive from Conduit instead of Publisher
627            (ViewPort.Subscribe, ViewPort.Unsubscribe): Use the new base class
628            when calling the inherited versions
629            (ViewPort._subscribe_map, ViewPort._unsubscribe_map): New helper
630            methods to subscribe and unsubscribe map messages
631            (ViewPort.SetMap, ViewPort.Destroy): Use the new helper methods to
632            handle the map subscriptions
633            (ViewPort.Map, ViewPort.map_projection_changed)
634            (ViewPort.layer_projection_changed): Add or update doc-strings
635    
636            * test/test_connector.py (TestPublisher.test_issue_simple): Fix
637            typo
638            (MyConduit): Helper class for the Conduit test.
639            (TestConduit): Test cases for Conduit
640    
641            * test/test_connector.py: Use support.run_tests as main.
642    
643            * test/test_viewport.py (ViewPortTest.setUp): Also subscribe to
644            the TITLE_CHANGED messages
645            (ViewPortTest.test_forwarding_title_changed): New test to check
646            whether the viewport forwards the map's TITLE_CHANGED messages
647            (TestViewportWithPostGIS.tearDown): Call the map's Destroy method
648            after the port's because the latter may require a still functional
649            map.
650    
651    2003-10-06  Bernhard Herzog  <[email protected]>
652    
653            * Thuban/UI/application.py (ThubanApplication.maps_changed): Add
654            doc-string
655    
656    2003-10-06  Bernhard Herzog  <[email protected]>
657    
658            * test/test_viewport.py (ViewPortTest.setUp)
659            (SimpleViewPortTest.test_init_with_size): Move the test for the
660            initial size as a constructor parameter from ViewPortTest.setUp
661            method to a new separate test in SimpleViewPortTest.
662    
663    2003-10-06  Bernhard Herzog  <[email protected]>
664    
665            * test/test_viewport.py (MockView): New class derived from
666            ViewPort with a mock implementation of GetTextExtent to be used in
667            the test cases
668            (ViewPortTest.setUp): Use MockView instead of ViewPort
669    
670            * Thuban/UI/viewport.py (ViewPort.GetTextExtent): Turn this method
671            into what would be a "pure virtual function" in C++: always raise
672            NotImplementedError. Mock implementations for test cases don't
673            belong into the real code
674    
675    2003-10-02  Bernhard Herzog  <[email protected]>
676    
677            * test/test_layer.py (TestLayer.test_empty_layer): Explicitly
678            close the dbf file we create so that it's contents have been
679            written properly.
680    
681            * libraries/shapelib/shptree.c, libraries/shapelib/shpopen.c,
682            libraries/shapelib/shapefil.h, libraries/shapelib/dbfopen.c:
683            Update to shapelib 1.2.10
684    
685    2003-10-01  Jan-Oliver Wagner <[email protected]>
686    
687            * Thuban/UI/tree.py, Thuban/UI/main.py: Remove the #! line as
688            it annoys lintian which warns about these files not being
689            executable. The #! isn't necessary here since if you absolutely
690            must execute them you can always say "python <filename>".
691    
692    2003-09-26  Bernhard Herzog  <[email protected]>
693    
694            * Thuban/Model/classgen.py (GenQuantiles0): Removed since it's
695            only used in GREAT-ER but not used in Thuban itself. When GREAT-ER
696            is ported to a newer the import will fail, so it should be noticed
697            immediately that this function is gone.
698            Fixes RT#1919
699    
700    2003-09-26  Bernhard Herzog  <[email protected]>
701    
702            Add a DTD for the projection files and make thuban write valid
703            projection files
704    
705            * Resources/XML/projfile.dtd: New. DTD for thuban's projection
706            files
707    
708            * Thuban/Model/resource.py (ProjFileSaver.write): Use
709            'projectionlist' as the name in the document type declaration so
710            that it matches the element type of the root element.
711    
712            * test/test_proj.py (sample_projfile, sample_projfile2): Use
713            'projectionlist' as the name in the document type declaration just
714            as it is done now in the files thuban would write
715            (sample_projfile, sample_projfile_data): Fix spelling of
716            "Mercator"
717            (TestProjFile.doTestWrite): Validate the written and the expected
718            XML data
719            (TestProjFile): Derive from ValidationTest so that we can run xml
720            validation tests
721    
722    2003-09-24  Bernhard Herzog  <[email protected]>
723    
724            * Thuban/UI/renderer.py (ExportRenderer.render_legend): Do not
725            modify the list returned by map.Layers() in place since it is the
726            actual list of layers used by the map.
727    
728    2003-09-23  Jan-Oliver Wagner <[email protected]>
729    
730            * Doc/manual/thuban-manual.xml: Added subsection to chapter
731            Extensions to describe the extensions coming with the Thuban
732            standard package (gns2shp and importAPR).
733    
734    2003-09-23  Bernhard Herzog  <[email protected]>
735    
736            * libraries/thuban/wxproj.cpp (project_point): if there's an
737            inverse but no forward projection, convert to degrees after
738            applying the inverse projection. Fixes RT#2096
739    
740            * test/test_wxproj.py: New. Test cases for wxproj.so. One test
741            implicitly tests for the fix to RT#2096
742    
743            * test/support.py (FloatComparisonMixin.assertFloatSeqEqual):
744            Check that the sequences have the same lengths
745    
746            * Resources/Projections/defaults.proj (Geographic projection): Use
747            a much more precise value for the to_meter attribute.
748    
749    2003-09-22  Bernhard Herzog  <[email protected]>
750    
751            * test/support.py (initthuban): Make sure to unset the LANG env.
752            var. so that tests that compare translated strings work. Solves RT
753            #2094
754    
755    2003-09-22  Jan-Oliver Wagner <[email protected]>
756    
757            Small improvement of APR import.
758    
759            * Extensions/importAPR/test/test_apr.py (aprTest.test_LClass):
760            Added tests for text-ranges.
761    
762            * Extensions/importAPR/apr.py (APR_LClass.GetThubanRange): Now
763            returns a string object if the range is based on text.
764    
765            * Extensions/importAPR/importAPR.py (import_apr_dialog): Unified
766            range retrieval.
767    
768    2003-09-22  Jan-Oliver Wagner <[email protected]>
769    
770            Initial version of the importAPR extension which is in
771            experimental state.
772    
773            * /Extensions/importAPR/, /Extensions/importAPR/samples/,
774            /Extensions/importAPR/test/: New directories.
775    
776            * /Extensions/importAPR/samples/README: New: Howto load the samples.
777    
778            * /Extensions/importAPR/samples/iceland.apr: New: A sample APR
779            file which refers to the Thuban Iceland demo data.
780    
781            * /Extensions/importAPR/test/README: New: Howto execute the tests.
782    
783            * /Extensions/importAPR/test/test_apr.py: New: Tests for APR classes.
784    
785            * /Extensions/importAPR/apr.py: New: Classes for ArcView Objects
786            as in '.apr'-files.
787    
788            * /Extensions/importAPR/odb.py: New: Classes for generic ArcView
789            ODB Objects as in '.apr', '.avl' and other files.
790    
791            * /Extensions/importAPR/__init__.py: New: Init to make this
792            directory a package.
793    
794            * /Extensions/importAPR/importAPR.py: New: Import a ArcView
795            project file (.apr) and convert it to Thuban.
796    
797    2003-09-22  Jan-Oliver Wagner <[email protected]>
798    
799            * Extensions/gns2shp.gns2shp.py: The main module of gns2shp.
800    
801    2003-09-19  Jan-Oliver Wagner <[email protected]>
802    
803            * Doc/manual/thuban-manual.xml: Extended section 'Installation'
804            with description on RPM installation and RPM binary package
805            creation.
806    
807    2003-09-18  Bernhard Herzog  <[email protected]>
808    
809            * setup.py (data_files): Only add the mo files if the Locales
810            directory actually exists, so that setup.py works with a fresh CVS
811            checkout
812    
813    2003-09-12  Jan-Oliver Wagner <[email protected]>
814    
815            * Examples/simple_extensions/simple_tool.py: bugfix: Tool is now
816            in viewport, not anymore in view
817    
818    2003-09-04  Jan-Oliver Wagner <[email protected]>
819    
820            Introducing first Extension (gns2shp).
821    
822            * Extensions, Extensions/gns2shp, Extensions/gns2shp/test: New.
823    
824            * Extensions/__init__.py: New. init to make this dir a package.
825    
826            * Extensions/gns2shp/__init__.py: New. init to make this dir a package.
827    
828            * Extensions/gns2shp/test/README: New. some info on this test directory.
829    
830            * Extensions/gns2shp/test/ls.txt: New. test data set (Liechtenstein).
831    
832            * Extensions/gns2shp/test/test_gns2shp.py: New. Test for correct creation
833            of Shapefile from GNS text file format
834    
835    2003-09-03  Jan-Oliver Wagner <[email protected]>
836    
837            Fix/workaround for bug #2019:
838            https://intevation.de/rt/webrt?serial_num=2019
839    
840            * Thuban/UI/identifyview.py (IdentifyView.ID_STOP): New.
841            (IdentifyView.__init__): Added another button that allows to
842            stop the identify mode.
843            (IdentifyView.OnStop): New. Stops the identify mode.
844    
845    2003-09-03  Jan-Oliver Wagner <[email protected]>
846    
847            Introducing a new exception dialog that allows to exit the
848            application immediately.
849            This fixes bug #2060: https://intevation.de/rt/webrt?serial_num=2060
850    
851            * Thuban/UI/exceptiondialog.py: New. A special exception dialog.
852    
853            * Thuban/UI/application.py (ThubanApplication.ShowExceptionDialog):
854            Made strings available to translations. Exchanged the simple
855            ScrolledMessageDialog by the new ExceptionDialog.
856    
857    2003-09-01  Bernhard Herzog  <[email protected]>
858    
859            * NEWS: New. Summary of changes and release notes.
860    
861            * MANIFEST.in: Add NEWS
862    
863    2003-09-01  Bernhard Herzog  <[email protected]>
864    
865            * MANIFEST.in: Correct the include statement for the mo-files and
866            include the documentation too.
867    
868            * setup.py (data_files): Add the .mo files
869            (setup call): Up to version 0.9.0
870    
871    2003-09-01  Bernhard Herzog  <[email protected]>
872    
873            * Thuban/UI/dbdialog.py (ChooseDBTableDialog.__init__): Change the
874            parameter list to just parent and session
875            (ChooseDBTableDialog.__set_properties): Removed. Setting the
876            selection of empty list boxes is not allowed (and produces C++
877            assertion errors) and the rest of the setup is better done in
878            __init__ anyway.
879            (ChooseDBTableDialog.OnCancel, ChooseDBTableDialog.OnOK)
880            (ChooseDBTableDialog.OnLBDClick, DBDialog.OnOK): Use the Python
881            builtins True/False for booleans to avoid warnings from wxPython
882    
883            * Thuban/UI/mainwindow.py (MainWindow.AddDBLayer): Adapt to new
884            ChooseDBTableDialog constructor parameters.
885    
886    2003-09-01  Bernhard Herzog  <[email protected]>
887    
888            * Thuban/Model/postgisdb.py
889            (PostGISTable): Extend doc-string
890            (PostGISTable._fetch_table_information): Set the column index
891            correctly, pretending ignored columns don't exist.
892    
893            * test/test_postgis_db.py (TestPostGISIgnoredColumns): New tests
894            for postgis tables with data types not yet supported by thuban.
895    
896    2003-08-29  Bernhard Herzog  <[email protected]>
897    
898            * HOWTO-Release: Tweak item about running the tests.
899    
900    2003-08-29  Jan-Oliver Wagner <[email protected]>
901    
902            * /Doc/manual/thuban-manual.xml: updated to version 1.0pre2.
903    
904    2003-08-29  Bernhard Herzog  <[email protected]>
905    
906            Add some missing parameters to projections. Proj complains about
907            them on windows but for some reason not on Linux.
908    
909            * test/test_save.py (SaveSessionTest.testLayerProjection): Add
910            missing required projection parameters
911    
912            * test/test_proj.py (TestProjFile.test): Add missing required
913            projection parameters
914    
915            * test/test_load_0_8.py (TestLayerProjection.file_contents)
916            (TestLayerProjection.test): Add missing required projection
917            parameters and tests for them
918    
919            * test/test_load.py (TestLayerProjection.file_contents)
920            (TestLayerProjection.test): Add missing required projection
921            parameters and tests for them
922    
923            * test/test_layer.py (TestLayer.test_base_layer): Add missing
924            required projection parameters
925    
926    2003-08-29  Bernhard Herzog  <[email protected]>
927    
928            * libraries/pyprojection/Projection.i: Use pj_get_errno_ref to
929            access the pj_errno because directly accessing pj_errno doesn't
930            work on windows if the proj library is in a DLL
931    
932            * libraries/pyprojection/Projection_wrap.c: Update from Projection.i
933    
934    2003-08-28  Bernhard Herzog  <[email protected]>
935    
936            * test/test_proj.py: Import things from Thuban after calling
937            initthuban
938    
939            * test/test_load.py (LoadSessionTest.filenames): New class
940            variable with the filename attributes to normalize
941            (LoadSessionTest.check_format): Pass self.filenames to
942            sax_eventlist to normalize the filename attributes
943    
944            * test/xmlsupport.py: Add cvs keywords
945            (SaxEventLister.__init__): New parameter filenames which indicates
946            attributes that contain filenames
947            (SaxEventLister.startElementNS): Normalize the filename attributes
948            with os.path.normpath
949            (sax_eventlist): New parameter filenames to pass through to
950            SaxEventLister
951    
952            * test/test_derivedshapestore.py: Make this file callable as a
953            program to execute the tests
954            (TestDerivedShapeStoreExceptions.test_table_with_wrong_size): Bind
955            the session to self.session so that it gets destroyed properly
956    
957            * test/test_layer.py (TestLayer.tearDown): Call the session's
958            Destroy method
959    
960            * test/test_map.py (TestMapBase.tearDown): Destroy self.session
961            too if it exists
962            (TestMapAddLayer.test_add_layer): Bind the session to self.session
963            so that it gets destroyed properly
964    
965            * test/postgissupport.py (reason_for_not_running_tests): Add a
966            test for the existence of popen2.Popen4.
967    
968            * test/test_save.py (SaveSessionTest.tearDown): New. Provide a
969            reliable way to destroy the sessions created in the test cases
970            (SaveSessionTest.test_dbf_table): Bind the session to self.session
971            so that it gets destroyed properly
972            (SaveSessionTest.testLayerProjection): Bind the session to
973            self.session so that it gets destroyed properly
974    
975            * test/test_session.py (UnreferencedTablesTests.tearDown): Make
976            sure that the session is destroyed properly
977    
978            * test/test_shapefilestore.py: Make this callable as a program to
979            execute the tests
980    
981            * test/test_scalebar.py: Remove unnecessary import of _ from
982            Thuban
983    
984            * test/support.py (print_garbage_information): Call initthuban
985            here because it may be called indirectly from test cases that test
986            test support modules which do not use anything from thuban itself
987            (ThubanTestProgram.runTests): Remove unnecessary debug print
988    
989    2003-08-28  Bernhard Herzog  <[email protected]>
990    
991            * Thuban/version.py (longversion): Update to 0.9
992    
993            * Thuban/UI/mainwindow.py: Remove some unused imports
994    
995            * README: Add section about required additional software. Add date
996            and revision CVS keywords
997    
998            * HOWTO-Release: Add item about the translations. Add date and
999            revision CVs keywords and change formatting to match README a bit
1000            better
1001    
1002            * po/de.po: Update for 0.9
1003    
1004            * test/README: Tweak the wording a little because many tests are
1005            not really unittest.
1006    
1007    2003-08-27  Bernhard Herzog  <[email protected]>
1008    
1009            As preparation for the 0.9 release, switch thuban files to a
1010            non-dev namespace
1011    
1012            * Thuban/Model/save.py (SessionSaver.write_session): Write files
1013            with the http://thuban.intevation.org/dtds/thuban-0.9.dtd
1014            namespace
1015    
1016            * Thuban/Model/load.py (SessionLoader.__init__): Accept the
1017            http://thuban.intevation.org/dtds/thuban-0.9.dtd namespace too
1018    
1019            * test/test_save.py (SaveSessionTest.dtd)
1020            (SaveSessionTest.testEmptySession)
1021            (SaveSessionTest.testSingleLayer)
1022            (SaveSessionTest.testLayerProjection)
1023            (SaveSessionTest.testRasterLayer)
1024            (SaveSessionTest.testClassifiedLayer)
1025            (SaveSessionTest.test_dbf_table)
1026            (SaveSessionTest.test_joined_table)
1027            (SaveSessionTest.test_save_postgis): Update for new namespace
1028    
1029            * test/test_load.py (LoadSessionTest.dtd, TestSingleLayer)
1030            (TestLayerVisibility.file_contents, TestLabels.file_contents)
1031            (TestLayerProjection.file_contents)
1032            (TestRasterLayer.file_contents, TestJoinedTable.file_contents)
1033            (TestPostGISLayer.file_contents)
1034            (TestPostGISLayerPassword.file_contents)
1035            (TestLoadError.file_contents, TestLoadError.test): Update for new
1036            namespace
1037    
1038    2003-08-27  Bernhard Herzog  <[email protected]>
1039    
1040            Make the table interface distinguish between row ids (an integer
1041            that uniquely identifies a row) and row ordinals (a simple row
1042            count from 0 to NumRows() - 1)
1043    
1044            * Thuban/Model/postgisdb.py (PostGISTable.RowIdToOrdinal)
1045            (PostGISTable.RowOrdinalToId): New methods to conver between row
1046            ids and row ordinals
1047            (PostGISTable.ReadRowAsDict, PostGISTable.ReadValue): New keyword
1048            parameter row_is_ordinal to indicate whether the row parameter is
1049            the row id or the ordinal
1050    
1051            * Thuban/Model/transientdb.py (TransientTableBase.RowIdToOrdinal)
1052            (TransientTableBase.RowOrdinalToId)
1053            (AutoTransientTable.RowIdToOrdinal)
1054            (AutoTransientTable.RowOrdinalToId): Same new methods as in
1055            PostGISTable.
1056            (TransientTableBase.ReadRowAsDict, TransientTableBase.ReadValue)
1057            (AutoTransientTable.ReadRowAsDict, AutoTransientTable.ReadValue):
1058            Same new parameter as in PostGISTable.
1059    
1060            * Thuban/Model/table.py (DBFTable.RowIdToOrdinal)
1061            (DBFTable.RowOrdinalToId, MemoryTable.RowIdToOrdinal)
1062            (MemoryTable.RowOrdinalToId): Same new methods as in PostGISTable.
1063            (DBFTable.ReadValue, DBFTable.ReadRowAsDict)
1064            (MemoryTable.ReadValue, MemoryTable.ReadRowAsDict): Same new
1065            parameter as in PostGISTable.
1066    
1067            * Thuban/UI/tableview.py (DataTable.RowIdToOrdinal)
1068            (DataTable.RowOrdinalToId): New methods to convert between row ids
1069            and row ordinals.
1070            (TableGrid.SelectRowById): New method to select a row based on its
1071            ID as opposed to its ordinal
1072            (DataTable.GetValue, TableGrid.OnRangeSelect)
1073            (TableGrid.OnSelectCell, LayerTableGrid.select_shapes)
1074            (QueryTableFrame.OnQuery, QueryTableFrame.get_selected)
1075            (LayerTableFrame.__init__): Convert between row ids and row
1076            ordinals as appropriate
1077    
1078            * test/postgissupport.py (PostGISDatabase.__init__): Add
1079            doc-string.
1080            (PostGISDatabase.initdb): The optional third item in a tuple in
1081            tables is now a (key, value) list with additional arguments to
1082            pass to upload_shapefile
1083            (upload_shapefile): New parameter gid_offset to allow gids that
1084            are not the same as the shapeids in the shapefile
1085            (PostgreSQLServer.get_default_static_data_db): Use the new
1086            gid_offset to make the gids in landmarks 1000 higher than the
1087            shapeids in the shapefile
1088    
1089            * test/test_viewport.py
1090            (TestViewportWithPostGIS.test_find_shape_at_point): Adapt to the
1091            new shapeids in the landmarks table
1092    
1093            * test/test_transientdb.py
1094            (TestTransientTable.run_iceland_political_tests)
1095            (TestTransientTable.test_transient_joined_table): Add tests for
1096            the new table methods and new keywords arguments.
1097    
1098            * test/test_postgis_db.py
1099            (TestPostGISTable.test_read_row_as_dict_row_count_mode)
1100            (TestPostGISTable.test_read_value_row_count_mode)
1101            (TestPostGISTable.test_row_id_to_ordinal)
1102            (TestPostGISTable.test_row_oridnal_to_id): New test for the new
1103            table methods and the new arguments
1104            (TestPostGISShapestorePoint.test_shapes_in_region)
1105            (TestPostGISShapestorePoint.test_shape_raw_data)
1106            (TestPostGISShapestorePoint.test_shape_points)
1107            (TestPostGISShapestorePoint.test_shape_shapeid)
1108            (TestPostGISShapestorePoint.test_all_shapes)
1109            (TestPostGISTable.test_simple_query)
1110            (TestPostGISTable.test_simple_query)
1111            (TestPostGISTable.test_simple_query)
1112            (TestPostGISTable.test_read_value)
1113            (TestPostGISTable.test_read_row_as_dict): Adapt to the new
1114            shapeids in the landmarks table
1115    
1116            * test/test_memory_table.py
1117            (TestMemoryTable.test_read_row_as_dict_row_count_mode)
1118            (TestMemoryTable.test_read_value_row_count_mode)
1119            (TestMemoryTable.test_row_id_to_ordinal)
1120            (TestMemoryTable.test_row_oridnal_to_id): New test for the new
1121            table methods and the new arguments
1122    
1123            * test/test_dbf_table.py
1124            (TestDBFTable.test_read_row_as_dict_row_count_mode)
1125            (TestDBFTable.test_read_value_row_count_mode)
1126            (TestDBFTable.test_row_id_to_ordinal)
1127            (TestDBFTable.test_row_oridnal_to_id): New test for the new table
1128            methods and the new arguments
1129    
1130    2003-08-26  Bernhard Herzog  <[email protected]>
1131    
1132            * Thuban/Model/postgisdb.py (PostGISShapeStore.BoundingBox): Use a
1133            more postgis specific but much faster method to get the bounding
1134            box
1135    
1136    2003-08-26  Bernhard Herzog  <[email protected]>
1137    
1138            * Thuban/Model/postgisdb.py (PostGISTable.Title)
1139            (PostGISShapeStore.AllShapes): Add these missing methods.
1140            (PostGISShapeStore.ShapesInRegion): No need to raise
1141            StopIteration. We can simply return
1142    
1143            * test/test_postgis_db.py (TestPostGISTable.test_title)
1144            (TestPostGISShapestorePoint.test_all_shapes): New tests for the
1145            new methods
1146    
1147    2003-08-25  Bernhard Herzog  <[email protected]>
1148    
1149            * Thuban/Model/postgisdb.py (shapetype_map): Add MUTLIPOLYGON.
1150    
1151            * test/test_postgis_db.py (PolygonTests): New class containing
1152            those tests from TestPostGISShapestorePolygon that can also be
1153            used to test MUTLIPOLYGON tables
1154            (TestPostGISShapestorePolygon): Most tests are now in PolygonTests
1155            so derive from that
1156            (TestPostGISShapestoreMultiPolygon): New class with tests for
1157            MUTLIPOLYGON tables
1158    
1159            * test/postgissupport.py (PostGISDatabase.initdb): Allow the
1160            tables argument to have tuples with three items to override the
1161            WKT type used.
1162            (PostgreSQLServer.get_default_static_data_db): Use the above to
1163            create a polygon table with MUTLIPOLYGONs
1164            (point_to_wkt, coords_to_point, polygon_to_wkt, coords_to_polygon)
1165            (arc_to_wkt, coords_to_multilinestring): Rename from *_to_wkt to
1166            coords_to*
1167            (coords_to_multipolygon): New. Convert to MUTLIPOLYGON
1168            (wkt_converter): New. Map WKT types to converters
1169            (upload_shapefile): New parameter force_wkt_type to use a
1170            different WKT type than the default
1171    
1172    2003-08-25  Bernhard Herzog  <[email protected]>
1173    
1174            * Thuban/UI/application.py
1175            (ThubanApplication.run_db_param_dialog): New. Suitable as a
1176            db_connection_callback. Main difference is that the dialog run
1177            from this method doesn't have a parent so it can be used even when
1178            there is no main window
1179            (ThubanApplication.OpenSession): Use self.run_db_param_dialog if
1180            no db_connection_callback was given. This way the dialog pops up
1181            even when the .thuban file was given as a command line parameter.
1182    
1183    2003-08-25  Bernhard Herzog  <[email protected]>
1184    
1185            * Thuban/UI/view.py (MapCanvas.OnLeftUp): Release the the mouse
1186            before calling MouseLeftUp. MouseLeftUp may pop up modal dialogs
1187            which leads to an effectively frozen X session because the user
1188            can only interact with the dialog but the mouse is still grabbed
1189            by the canvas.
1190            Also, call the tool's Hide method before MouseLeftUp because
1191            MouseLeftUp may change the tool's coordinates.
1192    
1193    2003-08-25  Bernhard Herzog  <[email protected]>
1194    
1195            * Thuban/UI/application.py (ThubanApplication.OpenSession): Catch
1196            LoadCancelled exceptions and handle them by returning immediately.
1197    
1198    2003-08-25  Bernhard Herzog  <[email protected]>
1199    
1200            GUI part of loading sessions with postgis connections which may
1201            require user interaction to get passwords or updated parameters
1202    
1203            * Thuban/UI/dbdialog.py (DBDialog): Reimplement to make it look a
1204            bit nucer and be more generic.
1205            (DBFrame.OnAdd): Adapt to new DBDialog interface
1206    
1207            * Thuban/UI/application.py (ThubanApplication.OpenSession): New
1208            optional parameter db_connection_callback which is passed to
1209            load_session.
1210    
1211            * Thuban/UI/mainwindow.py (MainWindow.run_db_param_dialog): New.
1212            Suitable as a db_connection_callback
1213            (MainWindow.OpenSession): Use self.run_db_param_dialog as the
1214            db_connection_callback of the application's OpenSession method
1215    
1216    
1217    2003-08-25  Bernhard Herzog  <[email protected]>
1218    
1219            Basic loading of sessions containing postgis connections:
1220    
1221            * Thuban/Model/load.py (LoadError): Add doc-string
1222            (LoadCancelled): New exception class to indicate a cancelled load
1223            (SessionLoader.__init__): Add the db_connection_callback parameter
1224            which will be used by the loader to get updated parameters and a
1225            password for a database connection
1226            (SessionLoader.__init__): Add the new XML elements to the
1227            dispatchers dictionary
1228            (SessionLoader.check_attrs): Two new conversions, ascii to convert
1229            to a byte-string object and idref as a generic id reference
1230            (SessionLoader.start_dbconnection)
1231            (SessionLoader.start_dbshapesource): New. Handlers for the new XML
1232            elements
1233            (load_session): Add the db_connection_callback to pass through the
1234            SessionLoader
1235    
1236            * test/test_load.py (TestPostGISLayer, TestPostGISLayerPassword):
1237            New classes to test loading of sessions with postgis database
1238            connections.
1239    
1240    2003-08-25  Bernhard Herzog  <[email protected]>
1241    
1242            * Thuban/UI/mainwindow.py (__ThubanVersion__): Remove this and
1243            replace it and the comment with __BuildDate__ by the Source: and
1244            Id: cvs keywords as used in the other files.
1245    
1246    2003-08-25  Bernhard Herzog  <[email protected]>
1247    
1248            * Thuban/Model/load.py (SessionLoader.check_attrs): Raise a
1249            LoadError when a required attribute is missing. The code used to
1250            be commented out for some reason, but probably should have been
1251            active.
1252    
1253            * test/test_load.py (TestLoadError.test): Test the message in the
1254            LoadError too to make sure it really is about the missing
1255            attribute
1256    
1257    2003-08-22  Bernhard Herzog  <[email protected]>
1258    
1259            * test/test_save.py (SaveSessionTest.test_dbf_table)
1260            (SaveSessionTest.test_joined_table): Add XML validation tests.
1261    
1262    2003-08-22  Bernhard Herzog  <[email protected]>
1263    
1264            Implement saving a session with a postgis connection
1265    
1266            * Resources/XML/thuban-0.9.dtd (dbconnection, dbshapesource) New
1267            elements for database connections and shapestores using db
1268            connections
1269            (session): Add the dbconnections to the content model
1270    
1271            * Thuban/Model/save.py (SessionSaver.write_db_connections): New.
1272            Write the db connections
1273            (SessionSaver.write_session): Call write_db_connections to write
1274            the connection before the data sources
1275            (SessionSaver.write_data_containers): Handle postgis shapestores
1276    
1277            * test/test_save.py (SaveSessionTest.thubanids)
1278            (SaveSessionTest.thubanidrefs): Update for new DTD
1279            (SaveSessionTest.test_save_postgis): New. Test saving a session
1280            with postgis connections
1281    
1282            * Thuban/Model/postgisdb.py (PostGISTable.DBConnection)
1283            (PostGISTable.TableName): New accessor methods for the connection
1284            and table name
1285    
1286            * test/test_postgis_db.py (TestPostGISTable.test_dbconn)
1287            (TestPostGISTable.test_dbname): New methods to test the new
1288            PostGISConnection methods
1289    
1290    2003-08-22  Bernhard Herzog  <[email protected]>
1291    
1292            * Thuban/Model/postgisdb.py (ConnectionError): New exception class
1293            for exceptions occurring when establishing a Database connection
1294            (PostGISConnection.connect): Catch psycopg.OperationalError during
1295            connects and raise ConnectionError.
1296    
1297            * test/test_postgis_db.py (TestPostgisDBExceptions): New class for
1298            tests for database exceptions
1299    
1300    2003-08-22  Bernhard Herzog  <[email protected]>
1301    
1302            Prepare the test suite for tests with required authentication
1303    
1304            * test/postgissupport.py (PostgreSQLServer.__init__): Add instance
1305            variables with two predefined users/passwords, one for the admin
1306            and one for a non-privileged user.
1307            (PostgreSQLServer.createdb): Pass the admin name to initdb and add
1308            the non-privileged user to the database and set the admin password
1309            (PostgreSQLServer.wait_for_postmaster): Use the admin user name.
1310            Better error reporting
1311            (PostgreSQLServer.connection_params)
1312            (PostgreSQLServer.connection_string): New methods to return
1313            information about how to connect to the server
1314            (PostgreSQLServer.execute_sql): New. Convenience method to execute
1315            SQL statements
1316            (PostgreSQLServer.require_authentication): Toggle whether the
1317            server requires authentication
1318            (PostgreSQLServer.create_user, PostgreSQLServer.alter_user): New.
1319            Add or alter users
1320            (PostGISDatabase.initdb): Pass the admin name one the
1321            subprocesses' command lines. Grant select rights on
1322            geometry_columns to everybody.
1323            (upload_shapefile): Use the admin name and password when
1324            connecting. Grant select rights on the new table to everybody.
1325    
1326            * test/test_viewport.py (TestViewportWithPostGIS.setUp): Use the
1327            server's new methods to get the connection parameters.
1328    
1329            * test/test_postgis_session.py (TestSessionWithPostGIS.setUp)
1330            (TestSessionWithPostGIS.test_remove_dbconn_exception): Use the
1331            server's new methods to get the connection parameters.
1332    
1333            * test/test_postgis_db.py
1334            (TestPostGISConnection.test_gis_tables_empty)
1335            (TestPostGISConnection.test_gis_tables_non_empty)
1336            (PostGISStaticTests.setUp): Use the server's new methods to get
1337            the connection parameters.
1338    
1339    2003-08-22  Bernhard Herzog  <[email protected]>
1340    
1341            * Thuban/UI/about.py (About.__init__): Add the psycopg version.
1342    
1343            * Thuban/version.py: Add psycopg version
1344    
1345            * Thuban/Model/postgisdb.py (psycopg_version): New. Return the
1346            version of the psycopg module
1347    
1348    2003-08-22  Bernhard Herzog  <[email protected]>
1349    
1350            * Thuban/UI/dbdialog.py (DBPwdDlg): Removed because it's not used.
1351            (DBFrame.OnEdit): Removed because it's not used and wouldn't work
1352            at the moment. The functionality should probably be implemented
1353            some time, though.
1354            (DBFrame.OnRemove): Display a message if the connection can't be
1355            removed because it's still in use.
1356    
1357    2003-08-22  Jan-Oliver Wagner <[email protected]>
1358    
1359            * Thuban/UI/about.py (About.__init__): split up the huge about
1360            text into elements/lists for easier translation. This fixes bug
1361            https://intevation.de/rt/webrt?serial_num=2058
1362            Also, made some forgotten string available for the i18n.
1363    
1364    2003-08-21  Bernhard Herzog  <[email protected]>
1365    
1366            Make postgis support really optional including insensitive menu
1367            items.
1368    
1369            * Thuban/Model/postgisdb.py (has_postgis_support): New. Return
1370            whether the postgis is supported.
1371    
1372            * Thuban/UI/dbdialog.py: Put the psycopg import into try..except
1373            to make postgis support optional
1374    
1375            * Thuban/UI/mainwindow.py (_has_postgis_support): New. Context
1376            version of Thuban.Model.postgisdb.has_postgis_support
1377            (database_management command): Make it only sensitive if postgis
1378            is supported.
1379    
1380    2003-08-21  Jan-Oliver Wagner <[email protected]>
1381    
1382            * Doc/manual/thuban-manual.xml: Added CVS revision for rev-history.
1383            (section Adding and Removing Layers): Added text and described
1384            multi-selection.
1385            (chapter Extensions): New.
1386    
1387    2003-08-21  Jan-Oliver Wagner <[email protected]>
1388    
1389            * Thuban/UI/mainwindow.py (MainWindow.AddLayer): Changed dialog
1390            settings to allow multiple files to load into the map.
1391            Also reduced selection to *.shp as a default.
1392    
1393    2003-08-20  Bernhard Herzog  <[email protected]>
1394    
1395            Add dialogs and commands to open database connections and add
1396            database layers.
1397    
1398            * Thuban/UI/mainwindow.py (MainWindow.DatabaseManagement): New
1399            method to open the database connection management dialog
1400            (MainWindow.AddDBLayer): New method to add a layer from a database
1401            (_has_dbconnections): New helper function to use for sensitivity
1402            (database_management command, layer_add_db command): New commands
1403            that call the above new methods.
1404            (main_menu): Add the new commands to the menu.
1405    
1406            * Thuban/Model/postgisdb.py (PostGISConnection.__init__)
1407            (PostGISConnection.connect): Establish the actual connection in a
1408            separate method and call it in __init__. This makes it easier to
1409            override the behavior in test cases
1410            (PostGISConnection.BriefDescription): New method to return a brief
1411            description for use in dialogs.
1412    
1413            * test/test_postgis_db.py (NonConnection): DB connection that
1414            doesn't actually connect
1415            (TestBriefDescription): New class with tests for the new
1416            BriefDescription method
1417    
1418    2003-08-19  Jan-Oliver Wagner <[email protected]>
1419    
1420            Moved anything from extensions to libraries.
1421    
1422            * libraries: New.
1423    
1424            * libraries/ pyprojection, pyshapelib, shapelib, thuban: New.
1425    
1426            * libraries/pyprojection/ LICENSE, MANIFEST.in, Projection.i,
1427            Projection.py, Projection_wrap.c, setup.py, swighelp.txt: These files have
1428            been moved here from thuban/extensions/pyprojection/
1429            See there in the Attic for the older history.
1430    
1431            * libraries/pyshapelib/ COPYING, ChangeLog, NEWS, README, dbflib.i,
1432            dbflib.py, dbflib_wrap.c, pyshapelib_api.h, pytest.py, setup.py,
1433            shapelib.i, shapelib.py, shapelib_wrap.c, shptreemodule.c: These files
1434            have been moved here from thuban/extensions/pyshapelib/
1435            See there in the Attic for the older history.
1436    
1437            * libraries/shapelib/ dbfopen.c, shapefil.h, shpopen.c, shptree.c: These
1438            files have been moved here from thuban/extensions/shapelib/
1439            See there in the Attic for the older history.
1440    
1441            * libraries/thuban/ bmpdataset.cpp, cpl_mfile.cpp, cpl_mfile.h,
1442            gdalwarp.cpp, wxproj.cpp: These files have been moved here from
1443            thuban/extensions/thuban/
1444            See there in the Attic for the older history.
1445    
1446            * MANIFEST.in, setup.cfg, setup.py: renamed extensions to libraries.
1447    
1448            * extensions/thuban/ bmpdataset.cpp, cpl_mfile.cpp, cpl_mfile.h,
1449            gdalwarp.cpp, wxproj.cpp: Moved to libraries/thuban.
1450    
1451            * extensions/shapelib/ dbfopen.c, shapefil.h, shpopen.c, shptree.c:
1452            Moved to libraries/shapelib.
1453    
1454            * extensions/pyshapelib/ COPYING, NEWS, dbflib.py, pytest.py,
1455            shapelib.py, README, dbflib_wrap.c, setup.py, shapelib_wrap.c,
1456            ChangeLog, dbflib.i, pyshapelib_api.h, shapelib.i, shptreemodule.c:
1457            Moved to libraries/pyshapelib.
1458    
1459            * extensions/pyprojection/ MANIFEST.in, Projection.py, setup.py,
1460            LICENSE, Projection.i, Projection_wrap.c, swighelp.txt:
1461            Moved to libraries/pyprojection.
1462    
1463            * extensions/ pyprojection, pyshapelib, shapelib, thuban: Removed.
1464    
1465            * extensions: Removed.
1466    
1467    2003-08-19  Bernhard Herzog  <[email protected]>
1468    
1469            * test/test_viewport.py (ViewPortTest): We don't use the
1470            facilities of FileTestMixin so don't derive from it.
1471            (TestViewportWithPostGIS): New class with tests for using a
1472            viewport on a map with postgis layers.
1473    
1474    2003-08-19  Bernhard Herzog  <[email protected]>
1475    
1476            Add the db connection management to the session.
1477    
1478            * Thuban/Model/session.py (Session.__init__): New instance
1479            variable db_connections
1480            (Session.AddDBConnection, Session.DBConnections)
1481            (Session.HasDBConnections, Session.CanRemoveDBConnection)
1482            (Session.RemoveDBConnection): New methods to manage and query the
1483            db connections managed by the session
1484            (Session.OpenDBShapeStore): New method to open a shapestore from a
1485            db connection
1486    
1487            * Thuban/Model/messages.py (DBCONN_REMOVED, DBCONN_ADDED): New
1488            messages for the db connection handling in the session
1489    
1490            * test/test_postgis_session.py: New. test cases for the session's
1491            db connection handling with postgis connections
1492    
1493    2003-08-19  Bernhard Herzog  <[email protected]>
1494    
1495            Add very basic postgis database support and the corresponding test
1496            cases. The test cases require a PostgreSQL + postgis installation
1497            but no existing database. The database will be created
1498            automatically by the test cases
1499    
1500            * test/README: Add note about skipped tests and the requirements
1501            of the postgis tests.
1502    
1503            * Thuban/Model/postgisdb.py: New. Basic postgis database support.
1504    
1505            * test/test_postgis_db.py: New. Test cases for the postgis
1506            support.
1507    
1508            * Thuban/Model/wellknowntext.py: New. Parser for well-known-text
1509            format
1510    
1511            * test/test_wellknowntext.py: New. Test cases for the
1512            wellknowntext parser
1513    
1514            * test/postgissupport.py: New. Support module for tests involving
1515            a postgis database.
1516    
1517            * test/support.py (execute_as_testsuite): Shut down the postmaster
1518            if it's still running after the tests
1519    
1520            * Thuban/Model/data.py (RAW_WKT): New constant for raw data in
1521            well known text format
1522    
1523    2003-08-19  Jan-Oliver Wagner <[email protected]>
1524    
1525            * Examples/simple_extensions/hello_world.py: New. Raises a Hello World
1526            message dialog.
1527    
1528    2003-08-18  Bernhard Herzog  <[email protected]>
1529    
1530            * test/support.py (ThubanTestResult.printErrors): Indent the
1531            reason for the skips in the output to make it a bit more readable.
1532            (execute_as_testsuite): New helper function to run a test suite
1533            and print some more information.
1534            (run_tests): Use execute_as_testsuite to run the tests
1535    
1536            * test/runtests.py (main): Use execute_as_testsuite to run the
1537            tests
1538    
1539    2003-08-18  Bernhard Herzog  <[email protected]>
1540    
1541            Fix some bugs in Thuban and the test suite that were uncovered by
1542            changes introduced in Python 2.3:
1543    
1544            * Thuban/Model/table.py (DBFTable.__init__): Make sure the
1545            filename is an absolute name
1546    
1547            * Thuban/Model/layer.py (RasterLayer.__init__): Make sure the
1548            filename is an absolute name
1549    
1550            * test/test_save.py (SaveSessionTest.testRasterLayer): Use a
1551            unique filename to save to and use the correct relative filename
1552            in the expected output.
1553            (SaveSessionTest.test_dbf_table): Use the correct relative
1554            filename in the expected output.
1555    
1556            * test/test_layer.py (TestLayer.test_raster_layer): Update the
1557            test to check whether the filename is absolute.
1558    
1559    2003-08-18  Jan-Oliver Wagner <[email protected]>
1560    
1561            * Thuban/UI/about.py (About.__init__): Added Silke Reimer.
1562    
1563    2003-08-15  Bernhard Herzog  <[email protected]>
1564    
1565            Change the way shapes are returned by a shape store. The
1566            ShapesInRegion method returns an iterator over actual shape
1567            objects instead of a list of shape ids.
1568    
1569            * Thuban/Model/data.py (ShapefileShape.ShapeID): New. Return shape
1570            id.
1571            (ShapefileStore.ShapesInRegion): Return an iterator over the
1572            shapes which yields shape objects instead of returning a list of
1573            shape ids
1574            (ShapefileStore.AllShapes): New. Return an iterator over all
1575            shapes in the shape store
1576            (DerivedShapeStore.AllShapes): New. Like in ShapefileStore
1577    
1578            * Thuban/Model/layer.py (Layer.ShapesInRegion): Update
1579            doc-string.
1580    
1581            * Thuban/UI/baserenderer.py
1582            (BaseRenderer.layer_ids, BaseRenderer.layer_shapes): Rename to
1583            layer_shapes and make it return an iterator containg shapes
1584            instead of a list of ids.
1585            (BaseRenderer.draw_shape_layer): Update doc-string; Adapt to
1586            layer_shapes() change
1587    
1588            * Thuban/UI/renderer.py (ScreenRenderer.layer_ids)
1589            (ScreenRenderer.layer_shapes): Rename as in BaseRenderer
1590    
1591            * Thuban/UI/viewport.py (ViewPort._find_shape_in_layer): Adapt to
1592            changes in the ShapesInRegion return value.
1593            (ViewPort._get_hit_tester): Remove commented out code
1594    
1595            * test/mockgeo.py (SimpleShapeStore.ShapesInRegion): Adapt to the
1596            new return value.
1597            (SimpleShapeStore.AllShapes): New. Implement this method too.
1598    
1599            * test/test_layer.py (TestLayer.test_arc_layer)
1600            (TestLayer.test_polygon_layer, TestLayer.test_point_layer)
1601            (TestLayer.test_point_layer_with_projection)
1602            (TestLayer.test_derived_store): Adapt to changes in the
1603            ShapesInRegion return value.
1604    
1605            * test/test_shapefilestore.py
1606            (TestShapefileStoreArc.test_shapes_in_region)
1607            (TestShapefileStorePolygon.test_shapes_in_region)
1608            (TestShapefileStorePoint.test_shapes_in_region): Adapt to changes
1609            in the ShapesInRegion return value.
1610            (TestShapefileStorePoint.test_all_shapes)
1611            (TestShapefileStoreArc.test_shape_shapeid): New tests for the new
1612            methods
1613    
1614            * test/test_derivedshapestore.py
1615            (TestDerivedShapeStore.test_shapes_in_region): Adapt to changes in
1616            the ShapesInRegion return value.
1617            (TestDerivedShapeStore.test_all_shapes)
1618            (TestDerivedShapeStore.test_shape_shapeid): New tests for the new
1619            methods
1620    
1621    2003-08-15  Bernhard Herzog  <[email protected]>
1622    
1623            Make the renderers deal correctly with raw vs. python level
1624            representation of shape geometries
1625    
1626            * Thuban/UI/baserenderer.py (BaseRenderer.low_level_renderer):
1627            Return a flag useraw in addition to the callable and the parameter
1628            to indicate whether the callable can deal with the raw shape data
1629            or uses the higher level python lists of coordinates. The callable
1630            now should accept either the raw data or the return value of the
1631            shape's Points() method.
1632            (BaseRenderer.draw_shape_layer): Adapt to the low_level_renderer
1633            change
1634            (BaseRenderer.projected_points): Instead of the shape id use the
1635            points list as parameter.
1636            (BaseRenderer.draw_polygon_shape, BaseRenderer.draw_arc_shape)
1637            (BaseRenderer.draw_point_shape): Adapt to projected_points()
1638            change and accept the points list as parameter instead of the
1639            shape id.
1640    
1641            * Thuban/UI/renderer.py (MapRenderer.low_level_renderer): Return
1642            the useraw flag as required by the BaseRenderer
1643            (ScreenRenderer.draw_shape_layer): Adapt to low-level renderer
1644            changes.
1645    
1646            * test/test_baserenderer.py
1647            (TestBaseRenderer.test_point_with_classification): New test for
1648            rendering a map with classifications.
1649    
1650    2003-08-15  Bernhard Herzog  <[email protected]>
1651    
1652            * Thuban/UI/viewport.py (ViewPort.find_shape_at)
1653            (ViewPort._find_shape_in_layer, ViewPort._find_shape_in_layer)
1654            (ViewPort._get_hit_tester, ViewPort.projected_points)
1655            (ViewPort._hit_point, ViewPort._hit_arc, ViewPort._hit_polygon)
1656            (ViewPort._find_label_at): Split the find_shape_at method into
1657            several new methods and use the functions in the hit-test module.
1658    
1659            * Thuban/UI/hittest.py: New module with Python-level hit-testing
1660            functions
1661    
1662            * test/test_hittest.py: New. Test for the new hittest module
1663    
1664    2003-08-15  Bernhard Herzog  <[email protected]>
1665    
1666            * Thuban/Model/layer.py (Layer.ShapesInRegion): Apply the layer
1667            projection to all corners of the bounding box to get a better
1668            approximation of the projected bounding box
1669    
1670            * test/test_layer.py (TestLayer.test_point_layer_with_projection):
1671            New. Test coordinate handling of a layer with a projection.
1672            Catches the bug fixed in Layer.ShapesInRegion
1673    
1674    2003-08-15  Bernhard Herzog  <[email protected]>
1675    
1676            Move some of the mock objects in test_baserenderer into their own
1677            module so they can easily be used from other tests
1678    
1679            * test/mockgeo.py: New test helper module with some mock objects
1680            for geometry related things like shapes, shapestores and
1681            projections.
1682    
1683            * test/test_mockgeo.py: New. Tests for the new helper module
1684    
1685            * test/test_baserenderer.py: Some of the mock-objects are in
1686            mockgeo now.
1687    
1688    2003-08-12  Jan-Oliver Wagner <[email protected]>
1689    
1690            * Thuban/UI/about.py (About.__init__): Added Bj�rn Broscheit.
1691    
1692    2003-08-12  Bernhard Herzog  <[email protected]>
1693    
1694            * po/de.po: New. German translations by Bjoern Broscheit
1695    
1696    2003-08-12  Bernhard Herzog  <[email protected]>
1697    
1698            * Thuban/UI/projdialog.py (UnknownProjPanel._DoLayout): Translated
1699            strings have to be one string literal.
1700    
1701    2003-08-11  Bernhard Herzog  <[email protected]>
1702    
1703            * test/support.py (FloatComparisonMixin.assertPointListEquals):
1704            New. This method was used in various derived classes, but it's
1705            better to have it here.
1706    
1707            * test/test_shapefilestore.py
1708            (ShapefileStoreTests.assertPointListEquals): Removed. It's now in
1709            FloatComparisonMixin
1710    
1711            * test/test_layer.py (TestLayer.assertPointListEquals): Removed.
1712            It's now in FloatComparisonMixin
1713    
1714            * test/test_derivedshapestore.py
1715            (TestDerivedShapeStore.assertPointListEquals): Removed. It's now
1716            in FloatComparisonMixin
1717    
1718    2003-08-11  Bernhard Herzog  <[email protected]>
1719    
1720            * Thuban/UI/join.py (JoinDialog.OnJoin): Add missing space to
1721            error message
1722    
1723    2003-08-08  Jan-Oliver Wagner <[email protected]>
1724    
1725            * Doc/manual/thuban-manual.xml: Now use authorgroup. Added revhistory
1726            with version number.
1727            Changed title to reflect version number of Thuban.
1728    
1729    2003-08-08  Jan-Oliver Wagner <[email protected]>
1730    
1731            * Thuban/UI/about.py (About.__init__): Reworked the hall of fame. Now
1732            the list corresponds to the "About" web page.
1733    
1734    2003-08-08  Bernhard Herzog  <[email protected]>
1735    
1736            * Thuban/UI/projdialog.py (UTMProposeZoneDialog.dialogLayout):
1737            Make sure translated strings are recognized as one string literal.
1738    
1739            * Thuban/UI/proj4dialog.py (UTMProposeZoneDialog.dialogLayout):
1740            Make sure translated strings are recognized as one string literal.
1741    
1742            * Thuban/UI/classgen.py (ClassGenDialog.OnOK): Make sure
1743            translated strings are recognized as one string literal.
1744    
1745            * Thuban/UI/application.py (ThubanApplication.OpenSession): Make
1746            sure translated strings are recognized as one string literal.
1747    
1748    2003-08-07  Bernhard Herzog  <[email protected]>
1749    
1750            * Thuban/Model/data.py (DerivedShapeStore.RawShapeFormat): New.
1751            Simply delegates to the original shapestore.
1752    
1753            * test/test_derivedshapestore.py
1754            (TestDerivedShapeStore.test_raw_format): New. Test case for
1755            DerivedShapeStore.RawShapeFormat
1756    
1757    2003-08-07  Bernhard Herzog  <[email protected]>
1758    
1759            Add raw data interface to shape objects.
1760    
1761            * Thuban/Model/data.py (ShapefileShape, Shape): Rname the shape
1762            class to ShapefileShape which now holds shapefile specific
1763            information.
1764            (ShapefileShape.compute_bbox): Simplified to not cache any
1765            information. The way this method is used that shouldn't matter
1766            performance wise.
1767            (ShapefileShape.RawData): New. Return the shapeid which is the raw
1768            data format for shapes from shapefiles.
1769            (ShapefileStore.RawShapeFormat): New. Return the raw datatype used
1770            in the shape objects returned by a shapestore. For a
1771            ShapefileStore this is always RAW_SHAPEFILE.
1772            (RAW_PYTHON, RAW_SHAPEFILE): Constants for the RawShapeFormat
1773            method.
1774    
1775            * test/test_shapefilestore.py
1776            (TestShapefileStore.test_raw_format): New test to test the raw
1777            format feature of shapes.
1778    
1779            * Thuban/Model/layer.py: Remove the unused import of Shape from
1780            data. It was only there for interface compatibility but it's not
1781            used inside of Thuban and the generic Shape class has gone away.
1782    
1783            * Thuban/UI/renderer.py (MapRenderer.low_level_renderer): Check
1784            the raw data format and only use an optimized version of its a
1785            shapefile.
1786    
1787    2003-08-07  Bernhard Herzog  <[email protected]>
1788    
1789            * test/test_baserenderer.py (SimpleShape): Shape class for the
1790            tests.
1791            (SimpleShapeStore.Shape): Use SimpleShape instead of
1792            Thuban.Model.data.Shape to make the tests independed of the coming
1793            changes.
1794    
1795    2003-08-07  Bernhard Herzog  <[email protected]>
1796    
1797            * test/support.py (SkipTest, ThubanTestResult, ThubanTestRunner)
1798            (ThubanTestProgram): New classes that extend the respective
1799            classes from unittest. These new version support skipping tests
1800            under certain expected conditions. In the Thuban test suite we
1801            uses this for tests that require the optional gdal support.
1802            (run_tests): Use ThubanTestProgram instead of the unittest.main()
1803    
1804            * test/runtests.py (main): Use the new ThubanTestRunner instead of
1805            the normal one from unittest
1806    
1807            * test/test_layer.py (TestLayer.test_raster_layer): If this test
1808            is not run because gdal support isn't available report this to the
1809            runner.
1810    
1811            * test/test_baserenderer.py
1812            (TestBaseRenderer.test_raster_no_projection): Do not run this test
1813            if gdal support isn't available and report this to the runner.
1814    
1815    2003-08-06  Bernhard Herzog  <[email protected]>
1816    
1817            Rearrange the renderers a bit, partly in preparation for changes
1818            required for the postgis merge, partly to make it more testable.
1819            Also make the representation of coordinates in Shapes more
1820            consistent.
1821    
1822            * Thuban/UI/renderer.py (MapRenderer): Most of the code/methods in
1823            this class is now in BaseRenderer. This class is now practically
1824            only a specialization of BaseRenderer for rendering to an actual
1825            wx DC.
1826            (ScreenRenderer.draw_shape_layer): Use self.low_level_renderer()
1827            to get the shapetype specific rendering functions.
1828    
1829            * Thuban/UI/baserenderer.py: New file with the basic rendering
1830            logic. The code in this file is completely independend of wx.
1831            (BaseRenderer): Class with the basic rendering logic
1832    
1833            * test/test_baserenderer.py: New. Test cases for BaseRenderer
1834    
1835            * Thuban/UI/view.py (MapCanvas.__init__): New instance variable
1836            error_on_redraw to guard agains endless loops and stack overflows
1837            when there's a bug in the rendering code that raises exceptions.
1838            (MapCanvas.OnIdle, MapCanvas._do_redraw): Split the actual
1839            rendering into a separate method _do_redraw so that error handling
1840            is a bit easier. When an exception occurs, set error_on_redraw to
1841            true. When it's true on entry to OnIdle do nothing and return
1842            immediately.
1843    
1844            * Thuban/Model/data.py (ShapefileStore.Shape): For consistency, a
1845            Shape object will always have the coordinates as a list of list of
1846            coordinate pairs (tuples).
1847            (Shape.compute_bbox): Adapt to new representation.
1848    
1849            * Thuban/UI/viewport.py (ViewPort.find_shape_at)
1850            (ViewPort.LabelShapeAt): Adapt to new coordinate representation in
1851            Shape objects.
1852    
1853            * test/test_shapefilestore.py
1854            (ShapefileStoreTests.assertFloatTuplesEqual)
1855            (ShapefileStoreTests.assertPointListEquals): Rename to
1856            assertPointListEquals and change purpose to checking equality of
1857            the lists returned by Shape.Points().
1858            (TestShapefileStoreArc.test_shape)
1859            (TestShapefileStorePolygon.test_shape)
1860            (TestShapefileStorePoint.test_shape): Use the new
1861            assertPointListEquals instead of assertFloatTuplesEqual
1862    
1863            * test/test_layer.py (TestLayer.assertFloatTuplesEqual)
1864            (TestLayer.assertPointListEquals): Rename to assertPointListEquals
1865            and change purpose to checking equality of the lists returned by
1866            Shape.Points().
1867            (TestLayer.test_arc_layer, TestLayer.test_arc_layer)
1868            (TestLayer.test_polygon_layer, TestLayer.test_point_layer)
1869            (TestLayer.test_derived_store): Use the new assertPointListEquals
1870            instead of assertFloatTuplesEqual
1871    
1872            * test/test_derivedshapestore.py
1873            (TestDerivedShapeStore.assertFloatTuplesEqual)
1874            (TestDerivedShapeStore.assertPointListEquals): Rename to
1875            assertPointListEquals and change purpose to checking equality of
1876            the lists returned by Shape.Points().
1877            (TestDerivedShapeStore.test_shape): Use the new
1878            assertPointListEquals instead of assertFloatTuplesEqual
1879    
1880    2003-08-06  Jan-Oliver Wagner <[email protected]>
1881    
1882            * Thuban/UI/projdialog.py (UTMPanel._OnPropose): Added test for
1883            a bounding box. A dialog is raised in case, no bounding box
1884            is found. This fixes bug #2043:
1885            https://intevation.de/rt/webrt?serial_num=2043
1886    
1887    2003-08-05  Bernhard Herzog  <[email protected]>
1888    
1889            * Thuban/Model/color.py (Color.__repr__): Make the repr of a color
1890            object look like a Color instantiation. Formerly it looked like a
1891            tuple.
1892    
1893            * test/test_color.py (TestColor.test_repr)
1894            (TestColor.test_equality, TestColor.test_inequality): New. test
1895            some more apects of the Color class
1896            (TestTransparent.test_repr, TestTransparent.test_hex)
1897            (TestTransparent.test_equality): New. Test cases for the
1898            Transparent object.
1899    
1900    2003-08-04  Jan-Oliver Wagner <[email protected]>
1901    
1902            * Doc/manual/thuban-manual.xml: a number of small improvements.
1903            The resulting file is the version submitted for GREAT-ER II.
1904    
1905    2003-08-01  Bernhard Herzog  <[email protected]>
1906    
1907            * Thuban/UI/resource.py, Thuban/UI/projdialog.py,
1908            Thuban/UI/join.py, Thuban/UI/classgen.py, Thuban/UI/about.py,
1909            Thuban/Model/resource.py: Insert cvs keywords and doc-strings.
1910    
1911            * Thuban/UI/common.py: Insert cvs keywords and doc-strings.
1912            (Color2wxColour, wxColour2Color, ThubanBeginBusyCursor)
1913            (ThubanEndBusyCursor): Add doc-strings
1914    
1915    2003-08-01  Bernhard Herzog  <[email protected]>
1916    
1917            First step towards PostGIS integration. More abstraction by movin
1918            more code from the layer to the shapestore. More methods of the
1919            layer are now simply delegated to the equivalent method of the
1920            shapestore. The SHAPETYPE_* constants are now in data not in
1921            layer.
1922    
1923            * Thuban/Model/data.py (SHAPETYPE_POLYGON, SHAPETYPE_ARC)
1924            (SHAPETYPE_POINT, Shape): Move these constants and classes from
1925            layer.py to data.py
1926            (ShapefileStore.__init__): More Initialization for the new methods
1927            and functionality.
1928            (ShapefileStore.ShapeType, ShapefileStore.NumShapes)
1929            (ShapefileStore.BoundingBox, ShapefileStore.ShapesInRegion)
1930            (ShapefileStore.Shape): New methods that were formerly implemented
1931            in the layer.
1932            (DerivedShapeStore.Shape, DerivedShapeStore.ShapesInRegion)
1933            (DerivedShapeStore.ShapeType, DerivedShapeStore.NumShapes)
1934            (DerivedShapeStore.BoundingBox): New. DerivedShapeStore
1935            equivalents of the new shape methods. These versions are simply
1936            delegated to the original shapstore.
1937    
1938            * Thuban/Model/layer.py (SHAPETYPE_POLYGON, SHAPETYPE_ARC)
1939            (SHAPETYPE_POINT, Shape): Removed. They're now in data.py
1940            (Layer.SetShapeStore): Removed the initializatin of instance
1941            variables that were needed for the stuff that's now in
1942            ShapefileStore
1943            (Layer.BoundingBox, Layer.NumShapes, Layer.ShapeType)
1944            (Layer.Shape, Layer.ShapesInRegion): Simply delegate to the
1945            shapestore.
1946    
1947            * Thuban/UI/classifier.py, Thuban/UI/renderer.py,
1948            Thuban/UI/viewport.py: Import the SHAPETYPE_* constants from data
1949            instead of layer.
1950    
1951            * test/test_shapefilestore.py: New. Tests for ShapefileStore.
1952    
1953            * test/test_derivedshapestore.py: New. Tests for DerivedShapeStore.
1954    
1955            * test/test_layer.py: Import the SHAPETYPE_* constants from data
1956            instead of layer.
1957            (TestLayer.test_derived_store): Remove the test for the exception
1958            when instantiating the DerivedShapeStore with an incompatible
1959            table which is now in test_derivedshapestore.py. Add some more
1960            tests of the layer methods to determine whether they work for a
1961            DerivedShapeStore as well.
1962    
1963    2003-07-31  Jonathan Coles   <[email protected]>
1964    
1965            * Doc/manual/thuban-manual.xml: Fix the list of required packages
1966            by just listing the name and where they can be found.
1967    
1968    2003-07-31  Frank Koormann   <[email protected]>
1969    
1970            * Doc/manual/thuban-manual.xml:
1971            Changed the screenshot elements to figure.
1972            Changed some variablelist elements to itemizedlist.
1973            Added section on GDAL formats.
1974    
1975    2003-07-31  Jonathan Coles   <[email protected]>
1976    
1977            * Doc/manual/thuban-manual.xml: Added a few sentences about
1978            the Fix Border Color option when generating classes.
1979    
1980    2003-07-30  Jonathan Coles   <[email protected]>
1981    
1982            * Thuban/Model/classgen.py: Add docstrings. Rename specific
1983            Ramp instances to use lower_case_style.
1984    
1985            * Thuban/UI/classgen.py: Use renamed Ramp instances.
1986            
1987            * Thuban/UI/classifier.py: Add docstrings.
1988    
1989            * Thuban/UI/dock.py: Add docstrings.
1990    
1991            * test/test_classgen.py: Use renamed Ramp instances.
1992    
1993    2003-07-30  Bernhard Herzog  <[email protected]>
1994    
1995            * Thuban/Lib/connector.py (QueueingPublisher): Removed. This class
1996            was never used in Thuban.
1997    
1998    2003-07-30  Bernhard Herzog  <[email protected]>
1999    
2000            * Thuban/UI/join.py (JoinDialog.__init__): Use the table's Title()
2001            method directly instead of going through the transient_table
2002            method. This faster because transient_table may force the copy of
2003            a DBF file into the transient database and setting a table's title
2004            doesnm't affect the title of the associated transient table, so
2005            this fixes RT #2042
2006    
2007            * Thuban/UI/main.py (__version__): Don't import the already
2008            removed show_exception_dialog.
2009    
2010    2003-07-29  Jonathan Coles   <[email protected]>
2011    
2012            * Thuban/UI/application.py (ThubanApplication.ShowExceptionDialog):
2013            Put back this method and remove the equivalent function since we
2014            are setting the exception hook from within this class (OnInit).
2015    
2016    2003-07-29  Jonathan Coles   <[email protected]>
2017    
2018            * Doc/manual/images/5_2_custom_ramp.png,
2019            Doc/manual/images/5_2_quantiles.png,
2020            Doc/manual/images/5_2_uniform_dist.png,
2021            Doc/manual/images/5_2_unique_values.png,
2022            Doc/manual/images/8_int_error.png: New screen shots.
2023    
2024            * Doc/manual/thuban-manual.xml: Fixed typos and wording, clarified
2025            some points, and added more screen shots.
2026    
2027    2003-07-29  Bernhard Herzog  <[email protected]>
2028    
2029            * Thuban/Model/data.py: Remove the now unused import of warnings
2030    
2031    2003-07-29  Bernhard Herzog  <[email protected]>
2032    
2033            * Thuban/Model/data.py (SimpleStore): Removed. This class has been
2034            deprecated since before the 0.8 release and isn't used in Thuban
2035            itself anymore.
2036    
2037            * Thuban/Model/transientdb.py: Remove some unnecessary imports
2038    
2039    2003-07-29  Jonathan Coles   <[email protected]>
2040    
2041            * Thuban/UI/application.py (ThubanApplication.OnInit): set the
2042            python exception hook here so that we are sure to catch any
2043            Thuban exception that happen during initialization.
2044    
2045            * Thuban/UI/main.py (main): Don't set the exception hook here,
2046            it will get set in ThubanApplication.OnInit.
2047    
2048    2003-07-29  Jonathan Coles   <[email protected]>
2049                                                                                
2050            * Thuban/UI/application.py (ThubanApplication.ShowExceptionDialog):
2051            Removed and called it show_exception_dialog() so that the exception
2052            handler can be set before the class is created.
2053                                                                                
2054            * Thuban/UI/main.py (main): Install the exception handler before
2055            a ThubanApplication is created.
2056                                                                                    
2057    2003-07-29  Bernhard Herzog  <[email protected]>
2058    
2059            * po/it.po: New. Italian translation by Maurizio Napolitano
2060    
2061            * po/ru.po: New. Russian translation by Alex Shevlakov
2062    
2063    2003-07-29  Frank Koormann   <[email protected]>
2064    
2065            * Doc/manual/thuban-manual.xml: Extended section on supported
2066            projections.
2067            
2068    2003-07-29  Frank Koormann   <[email protected]>
2069    
2070            * Doc/manual/thuban-manual.xml: gaspell-checked.
2071    
2072    2003-07-29  Jonathan Coles   <[email protected]>
2073    
2074            * Doc/manual/images/3_5_legend.png: Added border to improve look
2075            on white background.
2076    
2077    2003-07-29  Jonathan Coles   <[email protected]>
2078    
2079            * Doc/manual/thuban-manual.xml: Fixed grammar and typos. Added
2080            descriptions for the legend toolbar.
2081    
2082            * Doc/manual/images/4_2_raster_layer_properties.png: Removed
2083            cursor from dialog box.
2084    
2085    2003-07-28  Jonathan Coles   <[email protected]>
2086    
2087            * Doc/manual/thuban-manual.xml: More screenshots and more chapters.
2088    
2089            * Doc/manual/images/2_4_session_tree.png,
2090            Doc/manual/images/3_5_legend.png, Doc/manual/images/3_rename_map.png,
2091            Doc/manual/images/4_2_layer_properties.png,
2092            Doc/manual/images/4_2_raster_layer_properties.png,
2093            Doc/manual/images/5_3_genclass.png,
2094            Doc/manual/images/5_classification.png,
2095            Doc/manual/images/6_projection.png,
2096            Doc/manual/images/7_1_table_view.png,
2097            Doc/manual/images/7_2_5_join.png: New screenshots.
2098    
2099    2003-07-24  Jonathan Coles   <[email protected]>
2100    
2101            * Doc/manual/thuban-manual.xml: Chapter on Projection Management.
2102    
2103    2003-07-24  Jonathan Coles   <[email protected]>
2104    
2105            * Doc/manual/thuban-manual.xml: Added EPS images and wrote
2106            chapter on Layer Management.
2107    
2108            * Doc/manual/Makefile: New. Makefile to generate all formats for the
2109            manual and images.
2110    
2111    2003-07-24  Bernhard Herzog  <[email protected]>
2112    
2113            * Thuban/Model/range.py, Thuban/version.py: Remove the #! line as
2114            it annoys lintian which warns about these files not being
2115            executable. The #! isn't necessary here since if you absolutely
2116            must execute them you can always say "python <filename>".
2117    
2118            * Thuban/UI/renderer.py (ScreenRenderer.draw_shape_layer): Remove
2119            superfluous code to set brush and pen for point shapes
2120    
2121            * Thuban/UI/viewport.py: Remove commented out code that wouldn't
2122            belong in viewport anyway
2123    
2124    2003-07-24  Frank Koormann   <[email protected]>
2125    
2126            * Doc/manual/thuban-manual.xml: Added section on table management.
2127    
2128    2003-07-24  Bernhard Herzog  <[email protected]>
2129    
2130            * test/runtests.py (main): Recognize the long "verbose" option
2131            correctly.
2132    
2133    2003-07-22  Jonathan Coles   <[email protected]>
2134    
2135            * Doc/manual/thuban-manual.xml: Continue to write first revision
2136            of the manual.
2137    
2138            * Thuban/UI/renderer.py (MapRenderer.render_map): Wrap method
2139            with Begin/EndDrawing() calls to ensure we aren't doing to
2140            many updates to the dc during rendering.
2141            (ScreenRenderer.draw_shape_layer): self.draw_point_shape takes
2142            a pen and brush argument so they need to be passed to the function.
2143    
2144            * Thuban/UI/viewport.py (ViewPort.calc_min_max_scales): New.
2145            Calculates the minimum and maximum scale values. Factored out
2146            of set_view_transform so that it could be used to zoom all the
2147            way into a single point.
2148            (ViewPort.set_view_transform): Call calc_min_max_scales().
2149            (ViewPort.FitSelectedToWindow): Zoom to the maximum scale
2150            if only a single point is selected.
2151    
2152            * Doc/manual/images/1_2_legend_close.png,
2153            Doc/manual/images/1_2_legend_dock.png,
2154            Doc/manual/images/1_2_mainwindow.png,
2155            Doc/manual/images/1_2_mainwindow.ps,
2156            Doc/manual/images/1_2_mainwindow.sk,
2157            Doc/manual/images/3_2_fullextent.png,
2158            Doc/manual/images/3_2_fulllayerextent.png,
2159            Doc/manual/images/3_2_fullshapeextent.png,
2160            Doc/manual/images/3_2_pan.png,
2161            Doc/manual/images/3_2_zoomin.png,
2162            Doc/manual/images/3_2_zoomout.png,
2163            Doc/manual/images/3_3_identify.png,
2164            Doc/manual/images/3_3_label.png,
2165            Doc/manual/images/3_5_invisible.png,
2166            Doc/manual/images/3_5_movedown.png,
2167            Doc/manual/images/3_5_moveup.png,
2168            Doc/manual/images/3_5_props.png,
2169            Doc/manual/images/3_5_tobottom.png,
2170            Doc/manual/images/3_5_totop.png,
2171            Doc/manual/images/3_5_visible.png: New. Images for the documentation.
2172    
2173    2003-07-18  Bernhard Herzog  <[email protected]>
2174    
2175            * Thuban/UI/messages.py (MAP_REPLACED): New message.
2176    
2177            * Thuban/UI/viewport.py (ViewPort.SetMap): Issue MAP_REPLACED
2178            after the new map has been assigned
2179    
2180            * Thuban/UI/mainwindow.py (MainWindow.delegated_messages):
2181            Delegate MAP_REPLACED to the canvas too
2182            (MainWindow.prepare_new_session): Removed. Thanks to the new
2183            MAP_REPLACED message it's no longer needed
2184            (MainWindow.OpenSession, MainWindow.NewSession):
2185            prepare_new_session has been removed.
2186    
2187            * Thuban/UI/classifier.py (Classifier.__init__): Subscribe to
2188            MAP_REPLACED so that we can close the dialog if a new map is set.
2189            (Classifier.unsubscribe_messages): Unsubscribe from MAP_REPLACED
2190            (Classifier.map_replaced): Handle MAP_REPLACED by closing the
2191            dialog
2192    
2193            * test/test_viewport.py (SimpleViewPortTest)
2194            (SimpleViewPortTest.test_default_size): Add doc-strings
2195            (ViewPortTest.setUp): Bind map to self.map so we can use it in
2196            tests. Subscribe to MAP_REPLACED messages too.
2197            (ViewPortTest.tearDown): No need to explicitly unsubscribe
2198            (ViewPortTest.test_set_map): New test for the SetMap method.
2199    
2200    2003-07-18  Bernhard Herzog  <[email protected]>
2201    
2202            * test/test_viewport.py (SimpleViewPortTest.test_default_size):
2203            Move this test from ViewPortTest.setUp to this new separate test
2204            case. setUp is not the place for the actual tests.
2205            (ViewPortTest.test_inital_settings, ViewPortTest.setUp): Move some
2206            more of the test from setUp to the new test test_inital_settings.
2207            (ViewPortTest.test_win_to_proj, ViewPortTest.test_proj_to_win)
2208            (ViewPortTest.test_proj_conv): Split test_proj_conv into
2209            test_win_to_proj and test_proj_to_win and make the tests easier to
2210            understand
2211            (ViewPortTest.testFitRectToWindow, ViewPortTest.testZoomFactor)
2212            (ViewPortTest.testZoomOutToRect, ViewPortTest.testTranslate)
2213            (ViewPortTest.test_unprojected_rect_around_point)
2214            (ViewPortTest.test_find_shape_at, ViewPortTest.testTools):
2215            Reformat to increase readability.
2216    
2217    2003-07-18  Bernhard Herzog  <[email protected]>
2218    
2219            * Thuban/UI/view.py (MapCanvas.OnLeftDown): Capture the mouse.
2220    
2221    2003-07-18  Bernhard Herzog  <[email protected]>
2222    
2223            * test/runtests.py: The test suite can now be run without an X
2224            connection. To make sure this remains true, remove the DISPLAY
2225            environment variable so that an error occurs if the wxGTK is
2226            imported accidentally
2227    
2228    2003-07-18  Bernhard Herzog  <[email protected]>
2229    
2230            * Thuban/UI/viewport.py: Remove unused imports
2231    
2232            * Thuban/UI/view.py: Remove unused imports
2233    
2234    2003-07-18  Bernhard Herzog  <[email protected]>
2235    
2236            * test/test_export.py Remove unused imports. The OutputTransform
2237            function is now in viewport.py and is called output_transform
2238            (TestScalebar.test_output_transform)
2239            (TestScalebar.test_OutputTransform): Renamed to
2240            test_output_transform and updated to use output_transform instead
2241            of OutputTransform
2242    
2243            * Thuban/UI/view.py (OutputTransform): Moved to viewport.py and
2244            renamed.
2245            (MapCanvas.Export, MapPrintout.draw_on_dc): OutputTransform was
2246            renamed to output_transform
2247    
2248            * Thuban/UI/viewport.py (OutputTransform, output_transform):
2249            Rename to output_transform
2250    
2251    2003-07-18  Bernhard Herzog  <[email protected]>
2252    
2253            * Thuban/Model/layer.py (Layer.__init__): Rename
2254            classificationField to classificatin_column and init it here so
2255            that it can be used in SetClassificationColumn
2256            (Layer.GetClassificationColumn, Layer.GetClassificationField):
2257            Rename to GetClassificationColumn.
2258            (Layer.SetClassificationColumn, Layer.SetClassificationField):
2259            Rename to SetClassificationColumn and issue a LAYER_CHANGED
2260            message if the column changes.
2261            (Layer._classification_changed, Layer.ClassChanged): Rename to
2262            _classification_changed. Update the callers.
2263            (Layer.SetShapeStore): Further field->column renames.
2264    
2265            * Thuban/Model/load.py (SessionLoader.start_classification)
2266            (SessionLoader.start_clpoint): Updates because of
2267            field->column method name changes in the Layer class
2268    
2269            * Thuban/Model/save.py (SessionSaver.write_classification): Updates
2270            because of field->column method name changes in the Layer class
2271    
2272            * Thuban/UI/classifier.py (Classifier.__init__)
2273            (Classifier._OnTry, Classifier._OnRevert): Updates because of
2274            field->column method name changes in the Layer class
2275    
2276            * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Updates
2277            because of field->column method name changes in the Layer class
2278    
2279            * Thuban/UI/viewport.py (ViewPort.find_shape_at): Updates because
2280            of field->column method name changes in the Layer class
2281    
2282            * test/test_save.py (SaveSessionTest.testClassifiedLayer)
2283            (SaveSessionTest.testClassifiedLayer): Update because of
2284            field->column method name changes in the Layer class
2285    
2286            * test/test_layer.py (SetShapeStoreTests.setUp)
2287            (SetShapeStoreTests.test_sanity): Update because of field->column
2288            method name changes in the Layer class
2289            (TestLayerModification.setUp): Subscribe to LAYER_CHANGED as well
2290            (TestLayerModification.test_sanity)
2291            (TestLayerModification.test_initial_settings): remove unsued code
2292            and rename to test_sanity.
2293            (TestLayerModification.test_set_classification): New test for
2294            SetClassification and SetClassificationField.
2295    
2296    2003-07-18  Bernhard Herzog  <[email protected]>
2297    
2298            * test/test_classgen.py (TestFixedRamp.test): Extend test to check
2299            the non-fixed values as well. The old test would have accepted a
2300            fixed ramp that only returnes the fixed properties
2301    
2302    2003-07-17  Jonathan Coles   <[email protected]>
2303    
2304            * Doc/manual/mainwindow.png, Doc/manual/mainwindow.xcf: Screen
2305            shots for the manual. The XCF file is the source image and
2306            has additional layers to support changes.
2307    
2308            * Doc/manual/thuban-manual.xml: Wrote an initial Introduction.
2309    
2310            * Thuban/UI/classifier.py (Classifier.__BuildClassification):
2311            Return both the new class and the field name.
2312    
2313            * Thuban/UI/mainwindow.py (MainWindow.ToggleLegend): Don't
2314            fit the map to the window as this changes any zoom level that
2315            the user may have set.
2316    
2317    2003-07-16  Jonathan Coles   <[email protected]>
2318    
2319            * Thuban/Model/classgen.py (generate_singletons,
2320            generate_uniform_distribution, generate_quantiles): Remove
2321            fixes parameter, but maintain the same functionality by having
2322            the calling function pass a FixedRamp object for the ramp.
2323            (FixedRamp): New. Adapts a ramp to have fixed property values.
2324    
2325            * Thuban/Model/classification.py: Use new CLASS_CHANGED message.
2326            (Classification): Inherit from Publisher.
2327            (Classification.__init__): Remove the layer parameter.
2328            Classifications no longer need to have a parent layer.
2329            (Classification.GetField, Classification.GetFieldType,
2330            Classification.SetFieldInfo): Removed. The field name is stored
2331            in the layer, and the type can be retreived by calling
2332            Layer.GetFieldType().
2333            (Classification._set_layer, Classification.GetLayer): Removed.
2334            Classifications no longer have a parent layer.
2335    
2336            * Thuban/Model/layer.py (Layer.Destroy): Unsubscribe from the
2337            classification.
2338            (Layer.SetShapeStore): Reset the classification first while
2339            we still have the old shape store to work with.
2340            (Layer.GetClassificationField, Layer.SetClassificationField):
2341            New. Method for getting/setting the field to classify on.
2342            (Layer.SetClassification): Simplified now that the layer
2343            simply has to hold a reference to the classification and not
2344            tell the classification who owns it.
2345            Fixes RTbug #2023.
2346    
2347            * Thuban/Model/load.py (SessionLoader.start_classification):
2348            Set the field name on the layer, not the classification.
2349    
2350            * Thuban/Model/messages.py: Add CLASS_CHANGED for when a
2351            classification is modified.
2352    
2353            * Thuban/Model/save.py (SessionSaver.write_classification):
2354            Get the field name and type from the layer.
2355    
2356            * Thuban/Model/table.py (table_to_dbf, table_to_csv): Renamed
2357            parameter records to rows and add docstring. Fixes RTbug #1997.
2358    
2359            * Thuban/UI/classgen.py (ClassGenDialog.OnOK): Use a fixed
2360            ramp when we need to fix certain values of a ramp rather than
2361            using the old fixes parameter. Fixes RTbug #2024.
2362    
2363            * Thuban/UI/classifier.py (ClassGrid.CreateTable): Add fieldType
2364            parameter.
2365            (ClassTable.Reset): Add fieldType parameter and use it, rather
2366            than asking the classification.
2367            (Classifier.__init__): Remember the original class's field
2368            and ask the layer for the field type, rather than the classification.
2369            (Classifier.__SetGridTable): Retrieve the field and field type
2370            for the table because they are not in the classification.
2371            (Classifier._OnTry, Classifier._OnRevert): Set the classification
2372            field on the layer in addition to the classification itself.
2373    
2374            * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Get the
2375            classification field from layer.
2376    
2377            * Thuban/UI/viewport.py (ViewPort.find_shape_at): Get the
2378            classification field from layer. Split up tests and remove
2379            *-imports. Fixes RTbug #1992.
2380    
2381            * test/test_classgen.py (TestFixedRamp): Test for the FixedRamp class.
2382    
2383            * test/test_classification.py
2384            (TestClassification.test_classification): Remove tests for methods
2385            that no longer exist.
2386    
2387            * test/test_layer.py (SetShapeStoreTests.setUp): Classification
2388            __init__ no longer has a field parameter, use SetClassificationField.
2389            (SetShapeStoreTests.test_sanity): Use layer object to get class
2390            field info.
2391    
2392            * test/test_save.py (SaveSessionTest.testClassifiedLayer): Use
2393            SetClassificationField on layer to set class field info.
2394    
2395            * test/test_viewport.py: Renamed from test/test_view.py.
2396    
2397    2003-07-16  Jan-Oliver Wagner <[email protected]>
2398    
2399            * Doc/manual/thuban-manual.xml: Added authors and an initial
2400            coarse structure.
2401    
2402    2003-07-15  Bernhard Herzog  <[email protected]>
2403    
2404            * test/support.py (FloatComparisonMixin): This is a mix-in class
2405            and therefore should not be derived from any other class.
2406    
2407            * test/test_range.py (RangeTest): FloatComparisonMixin is a
2408            mix-in, so derive from TestCase as well.
2409    
2410    2003-07-15  Bernhard Herzog  <[email protected]>
2411    
2412            * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Rework the
2413            draw_func handling a bit to remove one layer of indirection. This
2414            makes the renderer about 10% faster in the non-classifying case
2415            and the code a bit cleaner
2416            (MapRenderer.draw_point_shape): Add the pen and brush parameters
2417            and set them in the dc. Now the draw_point_shape method and
2418            wxproj's draw_polygon_shape function have basically the same
2419            signature so that both can be directly used as draw_func
2420    
2421    2003-07-15  Bernhard Herzog  <[email protected]>
2422    
2423            * Thuban/Model/save.py (SessionSaver.write_classification): Encode
2424            string values (in addition to the labels) as UTF 8
2425    
2426            * Thuban/Model/load.py (SessionLoader.start_clpoint): Decode the
2427            values if the field type is string
2428    
2429            * test/test_save.py (SaveSessionTest.testClassifiedLayer): Test
2430            saving a session with non-ascii string classification values.
2431    
2432            * test/test_load.py (TestClassification.file_contents)
2433            (TestClassification.test): Check for non-ascii values in string
2434            classifications
2435    
2436    2003-07-14  Jonathan Coles   <[email protected]>
2437    
2438            * test/test_view.py: New. Tests for ViewPort.
2439    
2440    2003-07-14  Frank Koormann   <[email protected]>
2441    
2442            * Thuban/Model/load.py (SessionLoader.start_map): Encode map
2443            title to latin1.  Fixes https://intevation.de/rt/webrt?serial_num=2013
2444    
2445            * test/test_load_0_8.py (TestUnicodeStrings): New, test load of
2446            unicode strings from session file: session title, map title and
2447            projection name.
2448            
2449    2003-07-10  Jonathan Coles   <[email protected]>
2450    
2451            * Thuban/UI/viewport.py (Tool.MouseUp): Should have called
2452            drag_stop, not drag_move when the mouse is released.
2453    
2454    2003-07-10  Jonathan Coles   <[email protected]>
2455    
2456            The most important part of this is the seperation of view.py into
2457            two pieces. viewport.py now has a class called ViewPort which
2458            contains all the non-wx parts of view.py and can therefore be
2459            tested. view.py contains only the wx-specific parts and is fairly
2460            simple.
2461    
2462            * Thuban/UI/view.py: Stripped out all non-wx functionality. Fixes
2463            RTTbug #1992.
2464            * Thuban/UI/viewport.py: New. Contains non-wx view functionality.
2465            RTTbug #1992.
2466    
2467            * Thuban/Model/classgen.py (generate_singletons,
2468            generate_uniform_distribution, generate_quantiles):
2469            Added 'fixes' parameter so that property attributes can
2470            be held constant over the generated classification groups.
2471            (CustomRamp.GetProperties): Remove unused variables.
2472    
2473            * Thuban/Model/map.py (Map.SetProjection): Send the old
2474            projection as an argument to listeners of the MAP_PROJECTION_CHANGED
2475            event.
2476    
2477            * Thuban/Model/table.py (table_to_dbf, table_to_csv): Added 'records'
2478            parameter which is a list of records that restricts which
2479            records are saved. Fixes RTbug #1997.
2480    
2481            * Thuban/UI/application.py (ThubanApplication.ShowExceptionDialog):
2482            Port exception dialog from GREAT-ER. Fixes RTbug #1993.
2483    
2484            * Thuban/UI/classgen.py (ClassGenDialog.__init__): Add controls
2485            to allow the user to fix line color/width on generated groups.
2486            (ClassGenDialog.OnOK): Use new 'fixes' parameter of the generate_*
2487            functions to optionally fix group properties.
2488    
2489            * Thuban/UI/main.py (main): Set exception hook to the
2490            ShowExceptionDialog. Fixes RTbug #1993.
2491    
2492            * Thuban/UI/mainwindow.py (MainWindow.ShowTableView): Raise
2493            the table window when it is selectd to be shown.
2494    
2495            * Thuban/UI/tableview.py (QueryTableFrame.__init__): Add an
2496            Export Selection button and move the export buttons underneath
2497            the table.
2498            (QueryTableFrame.UpdateStatusText): Added event argument so
2499            that it can respond to grid selection events. The status text
2500            is now updated even when the table is not associated with a
2501            layer as was previously assumed.
2502            (QueryTableFrame.OnGridSelectRange, OnGridSelectCell): Removed.
2503            UpdateStatusText responds to these events.
2504            (QueryTableFrame.OnSaveAs): Renamed to doExport.
2505            (QueryTableFrame.doExport): Helper function that saves the
2506            entire table, or selected rows, to a file.
2507            (QueryTableFrame.OnExport, QueryTableFrame.OnExportSel): New.
2508            Respond to export button events and call doExport.
2509    
2510            * extensions/thuban/gdalwarp.cpp (ProjectRasterFile): Make sure
2511            the function doesn't return NULL without first setting a Python
2512            Error.
2513    
2514            * test/runtests.py (main): Only print "Unknown option" for
2515            unsupported options.
2516    
2517            * test/support.py (FloatComparisonMixin.assertFloatEqual): Take
2518            optional epsilon argument to specify floating point accuracy.
2519            (FloatComparisonMixin.assertFloatSeqEqual): Call assertFloatEqual
2520            for each item test.
2521    
2522            * test/test_csv_table.py (TestCSVTable.test_table_to_cvs): Add
2523            tests for saving selected records.
2524    
2525            * test/test_dbf_table.py (TestTableToDBF.test_table_to_dbf): Add
2526            tests for saving selected records.
2527    
2528            * test/test_map.py (TestMapWithContents.test_set_projection):
2529            MAP_PROJECTION_CHANGED events send the old projection.
2530    
2531            * test/test_session.py
2532            (TestSessionWithContent.test_forward_map_projection):
2533            MAP_PROJECTION_CHANGED events send the old projection.
2534    
2535            * test/test_table.py (TableTest): Update tests to use non-deprecated
2536            functions.
2537    
2538    2003-07-08  Bernhard Herzog  <[email protected]>
2539    
2540            * Thuban/Model/transientdb.py (TransientTableBase.Width): The type
2541            constants in the column objects are the standard ones defined in
2542            the table module.
2543    
2544            * test/test_transientdb.py
2545            (TestTransientTable.test_transienttable_to_dbf): New. Test whether
2546            exporting transient tables as DBF works. This should catch the bug
2547            just fixed in TransientTableBase.Width.
2548    
2549    2003-07-08  Bernhard Herzog  <[email protected]>
2550    
2551            * Thuban/Model/classgen.py (CustomRamp.GetProperties): Compute the
2552            interpolated colors correctly.
2553    
2554            * test/test_classgen.py (TestCustomRamp.test_color_interpolation):
2555            New. Test case for the fix in classgen.py
2556    
2557    2003-07-08  Bernhard Herzog  <[email protected]>
2558    
2559            * test/runtests.py (main): Make the default output less verbose
2560            and add a verbosity option (-v) to get the old output
2561    
2562    2003-07-08  Bernhard Herzog  <[email protected]>
2563    
2564            * Resources/XML/thuban-0.9.dtd: New. This will become the DTD for
2565            0.9.
2566    
2567            * Thuban/Model/transientdb.py (TransientJoinedTable.JoinType):
2568            New. Return the join type
2569    
2570            * Thuban/Model/save.py (SessionSaver.write_session): Use new 0.9
2571            DTD
2572            (SessionSaver.write_data_containers): Save the join type for
2573            joined tables
2574    
2575            * Thuban/Model/load.py (SessionLoader.__init__): Add the new 0.9
2576            namespace
2577            (SessionLoader.start_jointable): Handle the jointype attribute
2578    
2579            * test/test_load_0_8.py: New. Effectively a copy of test_load.py
2580            as of Thuban 0.8. These are now tests to determine whether Thuban
2581            can still read files generated by Thuban 0.8
2582    
2583            * test/test_load.py (LoadSessionTest.dtd)
2584            (TestSingleLayer.file_contents)
2585            (TestLayerVisibility.file_contents, TestLabels.file_contents)
2586            (TestLayerProjection.file_contents)
2587            (TestRasterLayer.file_contents, TestJoinedTable.file_contents)
2588            (TestJoinedTable.file_contents)
2589            (TestLoadError.file_contents): Update for new DTD
2590            (TestJoinedTable.file_contents, TestJoinedTable.setUp): Add test
2591            for new join type attribute
2592    
2593            * test/test_save.py (SaveSessionTest.dtd)
2594            (SaveSessionTest.testEmptySession)
2595            (SaveSessionTest.testSingleLayer)
2596            (SaveSessionTest.testLayerProjection)
2597            (SaveSessionTest.testRasterLayer)
2598            (SaveSessionTest.testClassifiedLayer)
2599            (SaveSessionTest.test_dbf_table)
2600            (SaveSessionTest.test_joined_table): Update for new DTD
2601            (SaveSessionTest.test_joined_table): Add test for new join type
2602            attribute
2603    
2604    2003-07-04  Bernhard Herzog  <[email protected]>
2605    
2606            * Thuban/Model/table.py (_find_dbf_column_names): New. Helper
2607            function for table_to_dbf
2608            (table_to_dbf): Deal with names longer than the 10 character limit
2609    
2610            * test/test_dbf_table.py (TestTableToDBF.test_table_to_dbf): Add
2611            doc-string
2612            (TestTableToDBF.test_table_to_dbf_long_col_names): New test for
2613            long column names
2614    
2615    2003-07-03  Bernhard Herzog  <[email protected]>
2616    
2617            * Doc/manual/thuban-manual.xml: Fix the CVS Revision Tag syntax
2618    
2619    2003-07-03  Bernhard Herzog  <[email protected]>
2620    
2621            * Doc/manual/thuban-manual.xml, Doc/manual/README: New. Skeleton
2622            for the Thuban manual and README with some basic information about
2623            the manual
2624    
2625    2003-07-03  Bernhard Herzog  <[email protected]>
2626    
2627            * Thuban/Model/transientdb.py (TransientJoinedTable.__init__):
2628            Update doc-string
2629            (TransientJoinedTable.create): Do not modify the column objects of
2630            the input tables in place and copy all columns of the input tables
2631            into the joined table after all.
2632    
2633            * test/test_transientdb.py
2634            (TestTransientTable.test_transient_joined_table_same_column_name):
2635            Update to reflect the new behavior
2636            (TestTransientTable.test_transient_joined_table_with_equal_column_names):
2637            Update to reflect the new behavior
2638            (TestTransientTable.test_transient_joined_table_name_collisions_dont_modify_in_place):
2639            New test case for a bug which modified the column objects in place
2640    
2641    2003-07-02  Jonathan Coles   <[email protected]>
2642    
2643            * Thuban/Model/classgen.py (generate_singletons,
2644            generate_uniform_distribution, generate_quantiles,
2645            GenQuantiles0): Make sure maxValue isn't less than
2646            one, otherwise we could divide by zero.
2647    
2648            * test/test_classgen.py (ClassGenTest.doClassRangeTest,
2649            ClassGenTest.doClassSingleTest): Call doBoundsTest to
2650            check the end classification groups against the
2651            proper property values.
2652            (ClassGenTest.doBoundsTest): New. Checks the first and
2653            last classification groups to make sure their properties
2654            are the correct upper and lower bounds for a color ramp.
2655    
2656    2003-07-02  Jonathan Coles   <[email protected]>
2657    
2658            * Thuban/Model/classgen.py (generate_singletons,
2659            generate_uniform_distribution, generate_quantiles,
2660            GenQuantiles0): The denominator was one to high when
2661            calculating the index for the ramp causing the index
2662            to never to reach one.
2663    
2664    2003-07-02  Jonathan Coles   <[email protected]>
2665    
2666            Changed the singature of ClassGroupRange.__init__ and
2667            ClassGroupRange.SetRange() so that the min/max values are
2668            passed as a tuple. This makes a better calling scheme for
2669            when a Range object is passed instead.
2670    
2671            * Thuban/Model/classgen.py: Fixed parameters to
2672            ClassGroupRange constructor.
2673    
2674            * Thuban/Model/classification.py (ClassGroupRange.__init__):
2675            Consolidate the min/max parameters into a single _range which
2676            can either be a tuple or a Range object.
2677            (ClassGroupRange.SetRange): Consolidate the min/max parameters
2678            into a single _range which can either be a tuple or a Range object.
2679    
2680            * Thuban/Model/load.py (SessionLoader.start_clrange): Fix
2681            call to ClassGroupRange constructor to use a tuple.
2682    
2683            * Thuban/Model/layer.py (Layer.SetClassification): Switch
2684            the classification instance variable to the new class
2685            before calling _set_layer otherwise subscribers to a
2686            LAYER_CHANGED event will not see any difference.
2687    
2688            * test/test_classification.py: Fix tests of ClassGroupRange
2689            so that they use the new signature.
2690    
2691            * test/test_load.py: Fix use of ClassGroupRange so that it
2692            uses the new signature.
2693    
2694            * test/test_load_0_2.py: Fix use of ClassGroupRange so that it
2695            uses the new signature.
2696    
2697            * test/test_save.py: Fix use of ClassGroupRange so that it
2698            uses the new signature.
2699    
2700    
2701    2003-07-01  Jonathan Coles   <[email protected]>
2702    
2703            * Thuban/Model/classgen.py: Fixes RTbug #1972, 1971.
2704            Import used objects/class from color.
2705            (generate_singletons): We don't
2706            need the numGroups parameter anymore because we are using
2707            the new ramps with GetProperties().
2708            (generate_uniform_distribution): Use new ramp method
2709            GetProperties().
2710            (generate_quantiles, GenQuantiles0): Use new ramp method
2711            GetProperties().
2712            (CustomRamp.SetNumGroups): Removed. The ramps now map
2713            a value from 0 to 1 to class properties so the number
2714            of groups is not needed ahead of time.
2715            (CustomRamp.next): Removed. CustomRamp does not support
2716            interation anymore.
2717            (CustomRamp.GetProperties): Returns a ClassGroupProperties
2718            object based on the index value from 0 to 1 that is
2719            passed to it.
2720            (GreyRamp, RedRamp, GreenRamp, BlueRamp, GreenToRedRamp):
2721            Made into instances of Monochromatic class instread of
2722            deriving from it.
2723            (HotToCold.SetNumGroups): Removed. See CustomRamp.
2724            (HotToCold.next): Removed. See CustomRamp.
2725    
2726            * Thuban/Model/classification.py: Fixes RTbug #1973, 1971.
2727            (Classification.SetField, Classification.SetFieldType):
2728            Replaced with SetFieldInfo.
2729            (Classification.SetFieldInfo): New. Does a better job of
2730            what SetField and SetFieldType used to do by combining
2731            their function since they should really always be done
2732            at the same time.
2733            (Classification.SetLayer): Renamed to _set_layer.
2734            (Classification._set_layer): Should only be called from
2735            Layer's SetClassification. This does not cause a recursive
2736            call as SetLayer did because we know that Layer knows about
2737            the classification.
2738    
2739            * Thuban/Model/color.py: Fixes RTbug #1971.
2740            (_Transparent): Renamed from Transparent so it doesn't
2741            conflict with the module variable.
2742            (Transparent, Black): Renamed from Color.Transparent,
2743            Color.Black so they are not class variables.
2744    
2745            * Thuban/Model/layer.py: Fixes RTbug #1971, 1973.
2746            (Layer.Destroy): We don't need to call SetClassification
2747            anymore to clear out the back reference in the classifcation
2748            to the layer. It's better to set it to None using _set_layer,
2749            and we won't be creating another clas object too.
2750            (Layer.SetClassification): Classification._set_layer is not
2751            recursive so remove all the locking variables. Also clean
2752            up the code so that it remains unchanged if something fails.
2753    
2754            * Thuban/Model/load.py: Fixes RTbug #1971.
2755            (SessionLoader.start_classification): Call
2756            Classification.SetFieldInfo().
2757    
2758            * Thuban/Model/save.py: Removed import of Color which wasn't
2759            being used.
2760    
2761            * Thuban/UI/classgen.py: Fixes RTbug #1972.
2762            (ClassGenDialog.__init__): Color ramps are now instances
2763            already so we don't need to create any new objects.
2764            (ClassGenDialog.OnOK): Check for numGroups is no longer
2765            necessary because we never use it.
2766    
2767            * Thuban/UI/classifier.py: Fixes RTbug #1971.
2768            (Classifier.__BuildClassification, Classifier.__SetGridTable):
2769            Call Classification.SetFieldInfo() instead of SetFieldType.
2770    
2771            * Thuban/UI/renderer.py: Fixes RTbug #1971.
2772    
2773            * Thuban/UI/view.py: Fixes RTbug #1974, 1971.
2774            (MapCanvas.__init__): Subscribe to the idle time event. Set
2775            background color to white.
2776            (MapCanvas.OnPaint): Set a flag indicating that we should
2777            render the map during idle time. If we already have a bitmap
2778            just draw it now.
2779            (MapCanvas.OnIdle): New. Render the map only during idle time.
2780            This also fixes a problem with the busy cursor under gtk.
2781    
2782            * test/test_classgen.py (ClassGenTest.test_generate_singletons):
2783            Fix calls to generate_singletons because the signature changed.
2784    
2785            * test/test_classification.py: Fix color references and
2786            change calls to Classification.[SetField|SetFieldType] to
2787            SetFieldInfo.
2788    
2789            * test/test_load.py: Fix color references.
2790    
2791            * test/test_load_0_2.py: Fix color references.
2792    
2793            * test/test_save.py (SaveSessionTest.testClassifiedLayer):
2794            Change calls to Classification.[SetField|SetFieldType] to
2795            SetFieldInfo.
2796    
2797    2003-07-01  Frank Koormann   <[email protected]>
2798    
2799            MERGE from the greater-ms3 branch.
2800    
2801            * test/test_transientdb.py
2802            (TestTransientTable.test_transient_joined_table_with_equal_column_names):
2803            New. Test join of two tables with partly equal column names.
2804    
2805            * Thuban/Model/transientdb.py (TransientJoinedTable.create):
2806            If duplicates in left and right tables column names are found,
2807            append '_' (underscores) to the name until it is unique.
2808            Create always new internal names for the resulting table and reference
2809            columns in the join statement with <table>.<column>
2810    
2811    2003-07-01  Bernhard Herzog  <[email protected]>
2812    
2813            * test/test_transientdb.py
2814            (TestTransientTable.test_transient_joined_table_same_column_name):
2815            New. Test whether joining on columns with the same names in both
2816            tables works.
2817            
2818            * Thuban/Model/transientdb.py (TransientJoinedTable.create): Make
2819            sure to use the right internal names even when joining on field
2820            with the same names in both tables. Also, detect duplicate names
2821            in the joined table correctly.
2822    
2823    2003-07-01  Frank Koormann   <[email protected]>
2824    
2825            * Thuban/UI/renderer.py (ExportRenderer.render_legend):
2826            Reverse List of layers to render in same order as in desktop legend.
2827    
2828    2003-06-30  Jonathan Coles   <[email protected]>
2829    
2830            * Thuban/version.py (make_tuple): Takes a version string
2831            and splits it into a tuple of at most three integers.
2832            Used make_tuple() to make tuple versions of the version
2833            numbers.
2834    
2835            * Thuban/UI/about.py: Add Thuban email addresses.
2836    
2837    2003-06-30  Jonathan Coles   <[email protected]>
2838    
2839            * Thuban/version.py: SQLite/PySQLite version dependencies
2840            were too high.
2841    
2842    2003-06-30  Jonathan Coles   <[email protected]>
2843    
2844            * Thuban/version.py: Update version to 0.8.1
2845            
2846            * MANIFEST.in: Added Projections so that default.proj is
2847            included.
2848    
2849    2003-06-26  Jonathan Coles   <[email protected]>
2850    
2851            New About box with lots more information including library
2852            versions and credits. More/better version checking before
2853            Thuban starts.
2854    
2855            * Thuban/UI/about.py: New. New About box that displays
2856            library version information and credits.
2857    
2858            * Thuban/version.py: Added new 'versions' dictionary which
2859            contains the verions of various libraries which are checked
2860            when the module loads.
2861            (verify_versions): Check all version numbers and returns
2862            a list of errors.
2863    
2864            * Thuban/UI/classifier.py (Classifier.__EnableButtons):
2865            Reset the status of the buttons as the situation warrants,
2866            but in a better more reliable way by not relying on the
2867            current status to determine what needs to change.
2868    
2869            * Thuban/UI/main.py (wxCHECK_VERSION): Removed. Not needed.
2870            (verify_versions): Remove most of the code since it is
2871            now in Thuban.version.verify_versions.o
2872    
2873            * Thuban/UI/mainwindow.py (MainWindow.About): Call new
2874            About box in Thuban.UI.about.
2875    
2876            * extensions/thuban/gdalwarp.cpp (get_gdal_version): New.
2877            Returns the version of gdal library being used as a string.
2878    
2879            * extensions/thuban/wxproj.cpp (check_version, check_version_gtk):
2880            Removed.
2881            (get_proj_version): Return the version of PROJ that the file
2882            was compiled with.
2883            (get_gtk_version): Return th version of GTK that the file
2884            was compiled with.
2885    
2886    2003-06-25  Jonathan Coles   <[email protected]>
2887    
2888            * Thuban/UI/classifier.py (Classifier.EditSymbol): The parent
2889            of the SelectPropertiesDialog should be self so the window
2890            appears on top.
2891            (ClassGroupPropertiesCtrl.DoEdit): The parent
2892            of the SelectPropertiesDialog should be self so the window
2893            appears on top.
2894    
2895            * Thuban/UI/resource.py: Cleaned up how we determine file
2896            extensions.
2897            (GetImageResource): Return an wxImage from our Resources.
2898    
2899    2003-06-24  Jonathan Coles   <[email protected]>
2900    
2901            * Thuban/UI/renderer.py (ExportRenderer.render_legend):
2902            Check that a layer has a classification before trying
2903            to get it. Raster layers don't have classifications.
2904    
2905    2003-06-23  Jonathan Coles   <[email protected]>
2906            
2907            * setup.py: Add Resources/XML to resource list.
2908        
2909    2003-06-23  Jonathan Coles   <[email protected]>
2910    
2911            * setup.cfg: Fix copyright dates
2912        
2913    2003-06-23  Jonathan Coles   <[email protected]>
2914    
2915            * MANIFEST.in: Update with Resources/XML
2916    
2917            * setup.py: Don't include Locale resources yet as we don't
2918            have any and it causes problems building the distribution
2919            for Windows. Update version to 0.8.0.
2920    
2921            * Doc/thuban.dtd: Removed since it is now in Resources/XML.
2922    
2923            * Thuban/UI/mainwindow.py: Add blank line at the end because
2924            file was not being read correctly building the Windows
2925            distribution.
2926    
2927    2003-06-23  Jonathan Coles   <[email protected]>
2928    
2929            * Thuban/UI/mainwindow.py (MainWindow.About): Fix text.
2930    
2931            * Thuban/version.py: Temporarily update longversion for
2932            the 0.8 release so that it doesn't have the cvs revision.
2933    
2934    2003-06-23  Jonathan Coles   <[email protected]>
2935    
2936            * Thuban/UI/common.py (ThubanBeginBusyCursor): Call wxSafeYield
2937            to make sure that we don't create reentrant possibilities with
2938            wxYield.
2939    
2940            * Thuban/UI/view.py (MapCanvas.OnPaint): Call wxBeginBusyCursor()
2941            directly to avoid the wxSafeYield() call which generates an
2942            OnPaint event causing infinite recursion. Don't try to catch
2943            exception anymore. This was for before there were limits on map
2944            scaling.
2945    
2946    2003-06-23  Bernhard Herzog  <[email protected]>
2947    
2948            Bug fix for RT #1961:
2949    
2950            * Thuban/Model/load.py (SessionLoader.start_derivedshapesource):
2951            Register DerivedShapestores with the session
2952    
2953            * Thuban/Model/session.py (Session.Tables): Make sure each table
2954            is only listed once.
2955    
2956            * test/test_load.py (TestJoinedTable.test): Add check_format call.
2957            Update file contents to match the one written out.
2958    
2959    2003-06-20  Bernhard Herzog  <[email protected]>
2960    
2961            * test/xmlsupport.py (SaxEventLister.startElementNS)
2962            (SaxEventLister.endElementNS): Do not include the qname. Python
2963            2.2.1 and 2.2.2 and 2.2.3 differ in this regard. In 2.2.1 qname it
2964            is (presumably incorrectly) None, whereas it's a string with the
2965            element name in the later versions.
2966    
2967            * test/test_xmlsupport.py (TestEventList.test_even_list_simple)
2968            (TestEventList.test_even_list_namespace): Update tests to reflect
2969            the new behaviour
2970            (TestEventList.test_even_list_id_normalization): Fix doc-string
2971    
2972    2003-06-20  Jonathan Coles   <[email protected]>
2973    
2974            * Thuban/Model/layer.py (BaseLayer.HasShapes): New. Overridden
2975            by deriving classes to determine if that layer supports shapes.
2976            (Layer): Override HasShapes and return true.
2977    
2978            * Thuban/UI/classgen.py: Use Thuban[Begin|End]BusyCursor()
2979            instead of a direct call to wx[Begin|End]CusyCursor().
2980            (GenUniquePanel._OnRetrieve): Set busy cursor while retrieving
2981            table data.
2982    
2983            * Thuban/UI/common.py (ThubanBeginBusyCursor, ThubanEndBusyCursor):
2984            New. Wrappers around the wxWindows functions that allow us to
2985            make additional calls such as wxYield which gives the native
2986            system a chance to update the cursor correctly.
2987    
2988            * Thuban/UI/tableview.py: Use Thuban[Begin|End]BusyCursor()
2989            instead of a direct call to wx[Begin|End]CusyCursor().
2990    
2991            * Thuban/UI/view.py: Use Thuban[Begin|End]BusyCursor()
2992            instead of a direct call to wx[Begin|End]CusyCursor().
2993            (MapCanvas.find_shape_at): Check if the current search layer
2994            support shapes, otherwise go on to the next layer.
2995    
2996            * test/test_layer.py: Add tests in each type of layer for
2997            HasClassification() and HasShapes()
2998    
2999    2003-06-20  Jonathan Coles   <[email protected]>
3000    
3001            * Thuban/UI/view.py (MapCanvas.OnPaint): Call wxYield after
3002            turning on the busy cursor to allow the system to change the
3003            cursor before we begin painting. This fixes a problem that
3004            was occuring only under GTK. Fixes RTbug #1840.
3005    
3006    2003-06-20  Bernhard Herzog  <[email protected]>
3007    
3008            * Resources/XML/thuban-0.8.dtd: New DTD for the new file format
3009            version.
3010    
3011            * Thuban/Model/save.py (sort_data_stores): New. Make topological
3012            sort of the data sources so they can be written with sources that
3013            data sources that depend on other data sources come after the
3014            sources they depend on.
3015            (SessionSaver.__init__): Add idmap instance variable to map from
3016            objects to the ids used in the file.
3017            (SessionSaver.get_id, SessionSaver.define_id)
3018            (SessionSaver.has_id): New. Methods to manage the idmap
3019            (SessionSaver.write): Use thuban-0.8.dtd
3020            (SessionSaver.write_session): Add a namespace on the session and
3021            write out the data sources before the maps.
3022            (SessionSaver.write_data_containers): New. Write the data
3023            containers.
3024            (SessionSaver.write_layer): Layer elements now refer to a
3025            shapestore and don't contain filenames anymore.
3026    
3027            * Thuban/Model/load.py (LoadError): Exception class to raise when
3028            errors in the files are discovered
3029            (SessionLoader.__init__): Define dispatchers for elements with a
3030            thuban-0.8 namespace too.
3031            (SessionLoader.check_attrs): New helper method to check and
3032            convert attributes
3033            (AttrDesc): New. Helper class for SessionLoader.check_attrs
3034            (SessionLoader.start_fileshapesource)
3035            (SessionLoader.start_derivedshapesource)
3036            (SessionLoader.start_filetable, SessionLoader.start_jointable):
3037            Handlers for the new elements in the new fileformat
3038            (SessionLoader.start_layer): Handle the shapestore attribute in
3039            addition to filename.
3040            (SessionLoader.start_table, SessionLoader.end_table): Removed.
3041            They were never used in the old formats and aren't needed for the
3042            new.
3043    
3044            * Thuban/Model/session.py (Session.DataContainers): New method to
3045            return all "data containers", i.e. shapestores and tables
3046    
3047            * test/xmlsupport.py (SaxEventLister.__init__)
3048            (SaxEventLister.startElementNS, sax_eventlist): Add support to
3049            normalize IDs.
3050    
3051            * test/test_xmlsupport.py
3052            (TestEventList.test_even_list_id_normalization): New test case for
3053            id normalization
3054    
3055            * test/test_load.py (LoadSessionTest.check_format): Use ID
3056            normalization
3057            (LoadSessionTest.thubanids, LoadSessionTest.thubanidrefs): New
3058            class atrributes used for ID normalization
3059            (TestSingleLayer, TestLayerVisibility, TestLabels.test)
3060            (TestLayerProjection.test, TestRasterLayer.test): Adapt to new
3061            file format
3062            (TestJoinedTable): New test for loading sessions with joined
3063            tables.
3064            (TestLoadError): New. Test whether missing required attributes
3065            cause a LoadError.
3066    
3067            * test/test_save.py (SaveSessionTest.thubanids)
3068            (SaveSessionTest.thubanidrefs): New class attributes for ID
3069            normalization in .thuban files.
3070            (SaveSessionTest.compare_xml): Use id-normalization.
3071            (SaveSessionTest.testEmptySession)
3072            (SaveSessionTest.testLayerProjection)
3073            (SaveSessionTest.testRasterLayer)
3074            (SaveSessionTest.testClassifiedLayer): Adapt to new file format.
3075            (SaveSessionTest.testLayerProjection): The filename used was the
3076            same as for testSingleLayer. Use a different one.
3077            (SaveSessionTest.test_dbf_table)
3078            (SaveSessionTest.test_joined_table): New test cases for saving the
3079            new data sources structures.
3080            (TestStoreSort, MockDataStore): Classes to test the sorting of the
3081            data stores for writing.
3082    
3083            * test/runtests.py: Add CVS keywords
3084    
3085    2003-06-20  Jonathan Coles   <[email protected]>
3086    
3087            * test/test_session.py
3088            (UnreferencedTablesTests.test_unreferenced_tables_with_joins):
3089            Use the cultural_landmark-point.dbf file for the store so that
3090            the table rows and shape count match.
3091    
3092    2003-06-20  Jonathan Coles   <[email protected]>
3093    
3094            * Thuban/Model/data.py (DerivedShapeStore.__init__): Raise
3095            an exception if the number of shapes is different from the
3096            number of rows in the table. Address RTbug #1933.
3097    
3098            * test/test_layer.py (TestLayer.test_derived_store): Add
3099            a test for the new exception in DerivedShapeStore.__init__.
3100    
3101            * test/support.py (FloatTestCase): Removed since there is
3102            already FloatComparisonMixin. Fixes RTbug #1954.
3103            (FloatComparisonMixin.assertFloatEqual): Include test for
3104            infinity that was part of FloatTestCase.
3105    
3106            * test/test_range.py (RangeTest): Inherit from
3107            support.FloatComparisonMixin now that we don't have
3108            support.FloatTestCase.
3109    
3110    2003-06-20  Bernhard Herzog  <[email protected]>
3111    
3112            * test/test_save.py (SaxEventLister, sax_eventlist): Removed. Use
3113            the implementation in xmlsupport instead.
3114            (SaveSessionTest.compare_xml): sax_eventlist is now in xmlsupport
3115    
3116            * test/test_proj.py: Import sax_eventlist from xmlsupport instead
3117            of test_save
3118    
3119    2003-06-20  Bernhard Herzog  <[email protected]>
3120    
3121            * test/test_load.py (LoadSessionTest.check_format): New helper
3122            method to make sure the test files we load might have been written
3123            by the current thuban version.
3124            (ClassificationTest.TestLayers, TestSingleLayer.test)
3125            (TestLayerVisibility.test, TestClassification.test)
3126            (TestLabels.test, TestLayerProjection.test, TestRasterLayer.test):
3127            Add check_format() calls and fix the thuban data to match the data
3128            that would be written by saving the session loaded from it.
3129    
3130            * test/xmlsupport.py (SaxEventLister, sax_eventlist): Copies of
3131            the same class and function in test_save.
3132    
3133            * test/test_xmlsupport.py (TestEventList): New. test cases for
3134            sax_eventlist
3135    
3136    2003-06-20  Bernhard Herzog  <[email protected]>
3137    
3138            * Resources/XML/thuban.dtd: Add comment about which versions of
3139            Thuban are covered by this DTD
3140            (map): Fix content model for layers and raster layers. There can
3141            be any number or layers and raster layers in any order.
3142    
3143    2003-06-20  Jonathan Coles   <[email protected]>
3144    
3145            This is mainly about fixing RTbug #1949.
3146    
3147            * Thuban/Model/classification.py: Remove "from __future__"
3148            import statement since python 2.2 is the earliest supported
3149            version.
3150    
3151            * Thuban/Model/proj.py (Projection.GetProjectedUnits): New.
3152            Currently returns PROJ_UNITS_METERS or PROJ_UNITS_DEGREES
3153            depending on the units this projection *forwards* into.
3154    
3155            * Thuban/Model/save.py (SessionSaver.write_classification):
3156            Remove unnecessary use of lambdas and nested functions.
3157    
3158            * Thuban/UI/legend.py (ScaleBarBitmap.__SetScale): Do scale
3159            adjustment here if the map projection uses degrees.
3160    
3161            * Thuban/UI/scalebar.py (ScaleBar.DrawScaleBar): Remove
3162            scale adjust code since it is now done before calling
3163            this method. Don't do anything if the map projection
3164            is None.
3165    
3166    2003-06-19  Bernhard Herzog  <[email protected]>
3167    
3168            Move version specific load tests to their own file.
3169    
3170            * test/test_load.py: Expand the doc-string to explain a bit how to
3171            handle file format changes.
3172            (TestClassification.test): Update the docstring as this test is
3173            not about Thuban 0.2 anymore.
3174    
3175            * test/test_load_0_2.py: New file with the load tests for thuban
3176            files created with Thuban 0.2 and earlier.
3177    
3178    2003-06-19  Bernhard Herzog  <[email protected]>
3179    
3180            Add XML validation to some of the tests. Validation will only be
3181            done if pyRXP is installed (http://reportlab.com/xml/pyrxp.html).
3182            To make the DTD available to the test cases it's moved into
3183            Resources/XML
3184    
3185            * Resources/XML/thuban.dtd: New. This is now the real Thuban DTD
3186            for versions up to and including 0.2. Two slight changes: added an
3187            encoding specification and fixed the comment which refered to
3188            GRASS, not Thuban
3189    
3190            * test/xmlsupport.py: New support module for tests involving XML.
3191            Currently there's a mix-in class for XML validation.
3192    
3193            * test/test_xmlsupport.py: New. Tests for the xmlsupport module
3194    
3195            * test/test_save.py (SaveSessionTest): Derive from ValidationTest
3196            so that we can validate the
3197            (SaveSessionTest.testEmptySession)
3198            (SaveSessionTest.testSingleLayer)
3199            (SaveSessionTest.testSingleLayer)
3200            (SaveSessionTest.testLayerProjection)
3201            (SaveSessionTest.testRasterLayer)
3202            (SaveSessionTest.testClassifiedLayer): Validate the generated XML
3203    
3204            * test/runtests.py (main): Call print_additional_summary instead
3205            of print_garbage_information
3206    
3207            * test/support.py (resource_dir): New function to return the
3208            "Resource" subdirectory
3209            (print_additional_summary): New function to combine several
3210            summary functions
3211            (run_tests): Use print_additional_summary instead of calling
3212            print_garbage_information directly
3213    
3214    2003-06-19  Bernhard Herzog  <[email protected]>
3215    
3216            * Doc/thuban.dtd (classification): Correct the content model of
3217            the classification element.
3218            (projection): Add the "name" attribute
3219    
3220    2003-06-19  Frank Koormann   <[email protected]>
3221    
3222            MERGE from the greater-ms3 branch.
3223    
3224            * Thuban/UI/scalebar.py (ScaleBar.DrawScaleBar): Apply conversion to
3225            scale if projection is latlong to get better estimate.
3226    
3227            Fix problem of hidden properties dialog under windows after double
3228            click on layer tree:
3229            The tree control always gets an Expanded / Collapsed event after
3230            the ItemActivated  on double click, which raises the main window again.         We add a second ItemActivated event to the queue, which simply
3231            raises the already displayed window.
3232    
3233            * Thuban/UI/legend.py (LegendTree.__init__): Instance variable
3234            raiseProperties initialized to prevent endless loops
3235            (LegendTree._OnItemActivated): Depending on self.raiseProperties
3236            simply raise the properties or open the dialog and issue a second
3237            event.
3238    
3239    2003-06-18  Jonathan Coles   <[email protected]>
3240    
3241            * setup.py: Fix a few problems that occured under Windows.
3242    
3243    2003-06-18  Jonathan Coles   <[email protected]>
3244    
3245            When Thuban loaded the map was redrawn twice because the
3246            legend was being opened after the mainwindow was created
3247            and not during its creation. This meant the map was drawn
3248            initially and then had to be redrawn when the legend
3249            caused the display to change. Now the legend is opened
3250            in the mainwindow constructor which resolves this issue.
3251    
3252            Also, although we were checking for the existence of
3253            gdal and gdalwarp modules, the gdalwarp extension was
3254            still being compiled (which may fail if the system doesn't
3255            have gdal installed). the build_ext command to setup.py
3256            now accepts the flags --with-gdal and --without-gdal.
3257            If --without-gdal is specified setup.py will try to
3258            use the gdal parameters specified by gdal-config. Under
3259            windows, those parameters have to be set in setup.py
3260            as with proj4 an wxWindows.
3261    
3262            * setup.py: Use a list instead of seperate variables for
3263            extension parameters so we can create a generic function
3264            that runs an appropriate *-config script.
3265            (run_cs_script): Renamed from run_wx_script and modified
3266            to accept a second argument which is a list of lists to
3267            be filled in by the values returned from running the command.
3268            (thuban_build_ext): New. Extends the build_ext command and
3269            provides the options --with-gdal/--without-gdal which then
3270            optionally includes the gdalwarp extension.
3271    
3272            * Thuban/Model/resource.py: First check if we can import
3273            the gdalwarp Thuban extension before checking for gdal.
3274            Also added some comments.
3275            
3276            * Thuban/UI/legend.py (ScaleBarBitmap.__SetScale): Check if
3277            the map is None which may be the case if none has been loaded
3278            yet.
3279    
3280            * Thuban/UI/main.py (main): Remove call to ShowLegend.
3281    
3282            * Thuban/UI/mainwindow.py (MainWindow.__init__): Call ShowLegend().
3283    
3284            * Thuban/UI/renderer.py: Check for gdal support before importing
3285            gdalwarp.
3286            (MapRenderer.render_map): Only try to optimize if we have gdal
3287            support otherwise nothing will get drawn.
3288    
3289            * Thuban/UI/view.py (MapCanvas.FitMapToWindow): This may be called
3290            during startup before a map has been created. Check if map is None
3291            before using it and do nothing if it is.
3292    
3293    2003-06-17  Jonathan Coles   <[email protected]>
3294    
3295            Fix the problem with raster layers under Windows that caused
3296            Thuban to crash. The view should respond to layer projection
3297            changed events to update the display. Changes to a projection
3298            should not cause the map to be set to full extent.
3299            
3300            * Thuban/UI/view.py (MapCanvas.__init__): New instance variable
3301            current_map_proj to remember the current map projection so that
3302            when the projection changes we know what the previous projection
3303            was.
3304            (MapCanvas.SetMap): Unsubscribe and subscribe to
3305            LAYER_PROJECTION_CHANGED events.
3306            (MapCanvas.projection_changed): Split into two methods that respond
3307            to map and layer projection changes.
3308            (MapCanvas.map_projection_changed): New. Takes the current view and
3309            projects it using the new projection. This does not cause the
3310            map to be redrawn at full extent.
3311            (MapCanvas.layer_projection_changed): New. Cause a redraw which
3312            will draw each layer in its new projection.
3313            
3314            * extensions/thuban/bmpdataset.cpp (BMPDataset::Open): Call
3315            VSIFClose() not VSIFCloseL() to close the file. Fixes a crash
3316            under Windows.
3317            
3318            * extensions/thuban/gdalwarp.cpp (MFILENAME): Padding should be
3319            to twice sizeof(void*) because there are two digits for each
3320            hex byte.
3321    
3322    2003-06-16  Bernhard Herzog  <[email protected]>
3323    
3324            Update to the layer interface: Direct access to the table,
3325            shapetable, shapefile and filename attributes is now actively
3326            deprecated by issuing deprecation warnings for all places where
3327            this happens.
3328    
3329            * Thuban/Model/layer.py (Layer.__getattr__): New. Implement access
3330            to the instance variables table, shapetable, shapefile and
3331            filename via __getattr__ so that we can issue a deprecation
3332            warning.
3333            (Layer.SetShapeStore): Don't set the deprecated instance variables
3334            any more
3335            (Layer.SetShapeStore): Don't use deprecated layer instance
3336            variables
3337            (Layer.Destroy): No need to explicitly remove the instance
3338            variables any more
3339            (Layer.GetFieldType, Layer.Shape): Don't use deprecated layer
3340            instance variables
3341    
3342            * Thuban/UI/classgen.py (ClassGenDialog.__init__)
3343            (GenUniformPanel._OnRetrieve, GenUniquePanel._OnRetrieve)
3344            (GenQuantilesPanel.GetList, GenQuantilesPanel.OnRetrieve): Don't
3345            use deprecated layer instance variables
3346    
3347            * Thuban/UI/classifier.py (Classifier.__init__): Don't use
3348            deprecated layer instance variables
3349    
3350            * Thuban/UI/identifyview.py (IdentifyListCtrl.selected_shape)
3351            (IdentifyGridCtrl.selected_shape): Don't set the deprecated layer
3352            instance variables
3353    
3354            * Thuban/UI/tableview.py (LayerTableGrid.select_shapes): Don't use
3355            deprecated layer instance variables
3356    
3357            * Thuban/UI/mainwindow.py (MainWindow.LayerShowTable): Don't use
3358            deprecated layer instance variables
3359    
3360            * Thuban/Model/save.py (SessionSaver.write_layer): Don't use
3361            deprecated layer instance variables
3362    
3363            * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer)
3364            (MapRenderer.polygon_render_param): Don't use deprecated layer instance
3365            variables
3366    
3367            * test/runtests.py (main): Turn Thuban's deprecation warnings into
3368            errors so that they're cought by the tests
3369    
3370            * test/test_load.py (TestSingleLayer.test): Don't use deprecated
3371            layer instance variables
3372    
3373    2003-06-16  Jonathan Coles   <[email protected]>
3374    
3375            Fix a problem under Windows whereby if the user double-clicks on a
3376            layer in the legend that tree item will expand or collapse as well
3377            as open the layer properties dialog. The state of the tree item
3378            should not be affected.
3379    
3380            * Thuban/UI/legend.py (LegendTree.__init__): Add instance variable
3381            preventExpandCollapse and subscribe to expanding and collapsing
3382            events.
3383            (LegendTree.OnItemExpandCollapse): New. Responds to expanding and
3384            collapsing events and will veto the event if it has been triggered
3385            by the user double clicking on a layer.
3386            (LegendTree._OnItemActivated): Set preventExpandCollapse to indicate
3387            that an expanding/collapsing event should be vetoed.
3388    
3389    2003-06-13  Bernhard Herzog  <[email protected]>
3390    
3391            * Thuban/UI/classifier.py (Classifier.OnClose)
3392            (Classifier.map_layers_removed)
3393            (Classifier.layer_shapestore_replaced): Unsubscribe the messages
3394            in OnClose and not in map_layers_removed or
3395            layer_shapestore_replaced to make sure it always happens when the
3396            dialog is closed
3397    
3398    2003-06-13  Jonathan Coles   <[email protected]>
3399    
3400            This puts back a fix for Windows where a panel is needed so that
3401            the background of the table view appears correctly.
3402    
3403            * Thuban/UI/tableview.py (TableFrame.__init__): Add a panel
3404            object that can be used by derived classes to place any
3405            controls (including the grid) onto.
3406            (QueryTableFrame.__init__): Use the panel as the parent window
3407            for all the controls. Reparent the grid so that the panel is
3408            the parent. Call UpdateStatusText() to correctly initialize
3409            the status bar.
3410    
3411    2003-06-13  Jonathan Coles   <[email protected]>
3412    
3413            * Thuban/UI/dialogs.py (ThubanFrame): New: a class that inherits
3414            from wxFrame (as opposed to wxDialog like the other classes)
3415            but otherwise behaves like the other classes. This is needed
3416            for the TableView which isn't really a dialog and needs to
3417            have a status bar and control buttons.
3418    
3419            * Thuban/UI/tableview.py (TableGrid.__init__): Create an
3420            instance variable to keep track of how many rows are selected.
3421            Subscribe once to the the events we are interested in.
3422            (ThubanGrid.OnRangeSelect): Only handle event if event handling
3423            hasn't been turned off.
3424            (ThubanGrid.OnSelectCell): Only handle event if event handling
3425            hasn't been turned off.
3426            (ThubanGrid.ToggleEventListeners): Rather than subscribe None
3427            as an event listener (which changes the event handler stack)
3428            simply set an instance variable to False. This is checked in
3429            the event handlers.
3430            (ThubanGrid.GetNumberSelected): Return the number of currently
3431            selected rows.
3432            (TableFrame): Inherit from ThubanFrame so we can have a
3433            status bar and control buttons.
3434            (QueryTableFrame.__init__): Create a status bar. Fixes RTbug #1942.
3435            Explicitly set which items are selected in the operator choice and
3436            action choice so there is always a valid selection. Fixes RTbug #1941.
3437            Subscribe to grid cell selection events so we can update the
3438            status bar.
3439            (QueryTableFrame.UpdateStatusText): Update the status bar with
3440            how many rows are in the grid, how many columns, and how many
3441            rows are selected.
3442            (QueryTableFrame.OnGridSelectRange, QueryTableFrame.OnGridSelectCell):
3443            Call UpdateStatusText when cells are (de)selected.
3444            (QueryTableFrame.OnQuery): Use the string value in the value
3445            combo if either the selected item index is 0 or if the string
3446            cannot be found in the predefined list (this happens if the
3447            user changes the text). Fixes RTbug #1940.
3448            Only turn off the grid event listeners if there a query comes
3449            back with a none empty list of ids. in the case that the list
3450            is empty this causes a grid.ClearSelection() call to actually
3451            clear the grid selection which causes the selected items in
3452            the map to be deselected. Fixes RTbug #1939.
3453    
3454            * test/test_save.py (XMLWriterTest.Encode): Check return values.
3455            Fixes RTbug #1851.
3456    
3457    2003-06-13  Bernhard Herzog  <[email protected]>
3458    
3459            * Thuban/UI/identifyview.py (IdentifyView.__init__): Call
3460            self.selected_shape with the current selection to make sure the
3461            contents of the dialog are up to date when it's shown for the
3462            first time.
3463            The dialog used to work without this by luck. The recent fix to
3464            the connector module 'broke' a 'feature' the identify view was
3465            relying on, i.e that subscribing to a message in response to
3466            receiving a message of that type would mean that the new
3467            subscriber would also be called for the same message.
3468            
3469    2003-06-12  Jonathan Coles   <[email protected]>
3470    
3471            * extensions/thuban/gdalwarp.cpp: Removed debug printing as
3472            the image is rendered. Fixes RTbug #1937.
3473    
3474  2003-06-12  Jonathan Coles   <[email protected]>  2003-06-12  Jonathan Coles   <[email protected]>
3475    
3476          * Thuban/Lib/fileutil.py: As is done under Windows, create the          * Thuban/Lib/fileutil.py: As is done under Windows, create the
3477          user directory if it doesn't exist on a posix system.          user directory if it doesn't exist on a posix system.
3478            Fixes RTbug #1815.
3479    
3480          * Thuban/Model/resource.py (get_user_proj_files): Moved the          * Thuban/Model/resource.py (get_user_proj_files): Moved the
3481          called to get_application_dir here, so that the directory          called to get_application_dir here, so that the directory

Legend:
Removed from v.1191  
changed lines
  Added in v.1895

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26