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

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26