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

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

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

revision 766 by bh, Tue Apr 29 12:42:27 2003 UTC revision 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]>
3399    
3400            * Thuban/Lib/fileutil.py: As is done under Windows, create the
3401            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
3405            called to get_application_dir here, so that the directory
3406            will only be called if this method is invoked.
3407    
3408            * Thuban/UI/projdialog.py (ProjFrame.__DoOnProjAvail): Clear
3409            the projfilepath if no projection is selected.
3410    
3411    2003-06-12  Jonathan Coles   <[email protected]>
3412    
3413            * Thuban/UI/legend.py (ScaleBarBitmap.__SetScale): Don't draw
3414            the scalebar if the current map has no projection set.
3415    
3416            * Thuban/UI/projdialog.py (ProjFrame.__DoOnProjAvail): Set the
3417            projfilepath label to just the basename of the projection file
3418            rather than include the entire path.
3419    
3420            * Thuban/Model/resource.py: Fix missed proj functions that
3421            needed to be renamed.
3422    
3423    2003-06-12  Jonathan Coles   <[email protected]>
3424    
3425            * Thuban/Model/classification.py: Removed assert statements that
3426            tested if the variable was an instance of Color.
3427    
3428            * Thuban/Model/color.py (Color): Remove commented code that isn't
3429            used.
3430            (Transparent): Renamed from NoColor. Doesn't inherit from Color.
3431            Fixes RTbug #1835.
3432            (Transparent.__eq__, Transparent.__ne, Transparent.__repr): New.
3433            Needed now that the class doesn't inherit from Color.
3434    
3435    2003-06-12  Jonathan Coles   <[email protected]>
3436    
3437            * test/test_save.py (XMLWriterTest.testEncode): Explicitly
3438            check unicode strings.
3439    
3440            * test/test_layer.py: Check for existence of gdal.
3441    
3442    2003-06-12  Jonathan Coles   <[email protected]>
3443        
3444            * Thuban/Model/xmlreader.py: New. Contains the XMLReader class
3445            that was in load.py
3446    
3447            * Thuban/Model/xmlwriter.py: New. Contains the XMLWriter class
3448            that was in save.py
3449    
3450    2003-06-12  Jonathan Coles   <[email protected]>
3451    
3452            This is largely a collection of bug fixes. We also handle the
3453            case where gdal is not on the system. The XMLReader and XMLWriter
3454            classes were moved into there own files to resolve some circular
3455            import references and because they shouldn't really be in the
3456            file that is dediciated to reading/writing session files since
3457            they are also used elsewhere.
3458    
3459            * Thuban/Model/classgen.py: Renamed functions to follow the
3460            function_names_with_underscores style. Fixes RTbug #1903.
3461            (calculate_quantiles): Raise ValueError if 'percents' is invalid.
3462    
3463            * Thuban/Model/layer.py: Import gdal only if it available.
3464            (RasterLayer): Handle the case where the gdal library is unavailable.
3465            Addresses RTbug #1877.
3466    
3467            * Thuban/Model/load.py (XMLReader): Moved into seperate file
3468            xmlreader.py.
3469    
3470    2003-06-12  Jonathan Coles   <[email protected]>
3471    
3472            This is largely a collection of bug fixes. We also handle the
3473            case where gdal is not on the system. The XMLReader and XMLWriter
3474            classes were moved into there own files to resolve some circular
3475            import references and because they shouldn't really be in the
3476            file that is dediciated to reading/writing session files since
3477            they are also used elsewhere.
3478    
3479            * Thuban/Model/classgen.py: Renamed functions to follow the
3480            function_names_with_underscores style. Fixes RTbug #1903.
3481            (calculate_quantiles): Raise ValueError if 'percents' is invalid.
3482    
3483            * Thuban/Model/layer.py: Import gdal only if it available.
3484            (RasterLayer): Handle the case where the gdal library is unavailable.
3485            Addresses RTbug #1877.
3486    
3487            * Thuban/Model/load.py (XMLReader): Moved into seperate file
3488            xmlreader.py.
3489    
3490            * Thuban/Model/save.py (escape, XMLWriter): Moved into seperate
3491            file xmlwriter.py.
3492    
3493            * Thuban/Model/resource.py: Renamed functions to following the
3494            function_names_with_underscores style.
3495            (has_gdal_support): New function that returns true if the gdal
3496            library is available. Addresses RTbug #1877.
3497    
3498            * Thuban/UI/application.py (ThubanApplication.OpenSession):
3499            Display a message box if the gdal library is not available, but
3500            only if there are any layers that would use it. Addresses RTbug #1877.
3501    
3502            * Thuban/UI/classgen.py: Use renamed projection resource functions.
3503            (GenUniformPanel.__CalcStepping): Fix a slight discrepency
3504            when using integers versus floats.
3505    
3506            * Thuban/UI/mainwindow.py (_has_gdal_support): New. Used to
3507            determine if the "Add Image Layer" menu option should be
3508            greyed out or not. Addresses RTbug #1877.
3509    
3510            * Thuban/UI/projdialog.py: Use renamed projection resource functions.
3511    
3512            * Thuban/UI/renderer.py (MapRenderer.render_map): Only try to
3513            optimize if a raster layer is visible. Fixes RTbug #1931.
3514            Only draw the raster layer if the gdal library is available.
3515            Addresses RTbug #1877.
3516    
3517            * test/test_classgen.py: Add tests for generate_singletons,
3518            generate_uniform_distribution, generate_quantiles. Fixes RTbug #1903.
3519            (test_calculate_quantiles): Fix some tests to catch the new
3520            ValueError that is raised.
3521    
3522            * test/test_proj.py: Use renamed projection resource functions.
3523    
3524            * test/test_save.py (SaveSessionTest.testClassifiedLayer): New
3525            test for saving classified layers. Fixes RTbug #1902.
3526            (XMLWriterTest): New. Tests the XMLWriter class. Fixes RTbug #1851.
3527    
3528    2003-06-12  Jan-Oliver Wagner <[email protected]>
3529    
3530            Fix for http://intevation.de/rt/webrt?serial_num=1900.
3531    
3532            * Thuban/UI/multiplechoicedialog.py: New. A multiple choice dialog.
3533    
3534            * Thuban/UI/mainwindow.py: import wxMultipleChoiceDialog from
3535            multiplechoicedialog.py rather than from the wxPython library.
3536    
3537    2003-06-11  Frank Koormann  <[email protected]>
3538    
3539            * Thuban/Lib/fileutil.py (get_application_dir): Minor stability
3540            update.
3541    
3542    2003-06-11  Frank Koormann  <[email protected]>
3543    
3544            * Thuban/Lib/fileutil.py (get_application_dir): New function to
3545            determine the absolute .thuban/thuban directory under
3546            "posix" (os.expanduser) and "nt" (read AppData registry key).
3547    
3548            * Thuban/Model/resource.py: Use get_application_dir
3549    
3550            * Thuban/UI/application.py (ThubanApplication.read_startup_files):
3551            Use get_application_dir.
3552    
3553    2003-06-10  Bernhard Herzog  <[email protected]>
3554    
3555            * Thuban/UI/tableview.py (LayerTableFrame.__init__): Subscribe to
3556            the messages MAP_LAYERS_REMOVED messages
3557            (LayerTableFrame.OnClose): Unsubscribe from it.
3558            (LayerTableFrame.map_layers_removed): New. Receiver for
3559            MAP_LAYERS_REMOVED. Close the dialog when the layer whose the
3560            dialog is showing is removed.
3561    
3562    2003-06-10  Bernhard Herzog  <[email protected]>
3563    
3564            * Thuban/Lib/connector.py (Connector.Issue): Iterate over a copy
3565            of the receivers list so that unsubscribing in a receiver doesn't
3566            modify it while iterating over it.
3567    
3568            * test/test_connector.py
3569            (ConnectorTest.test_disconnect_in_receiver): New. Test whether
3570            unsubscribing in a receiver works correctly. See docstring for
3571            details
3572    
3573    2003-06-10  Bernhard Herzog  <[email protected]>
3574    
3575            * Thuban/Model/messages.py (LAYER_SHAPESTORE_REPLACED): New
3576            message.
3577    
3578            * Thuban/Model/layer.py (Layer.SetShapeStore): Send
3579            LAYER_SHAPESTORE_REPLACED when the shapestore changes. A
3580            LAYER_CHANGED will still be sent if the classification changes.
3581    
3582            * Thuban/UI/classifier.py (Classifier.__init__): Add the map as
3583            parameter so we can subscribe to some of its messages
3584            (Classifier.__init__): Subscribe to the map's MAP_LAYERS_REMOVED
3585            and the layer's LAYER_SHAPESTORE_REPLACED
3586            (Classifier.unsubscribe_messages): New. Unsubscribe from message
3587            subscribed to in __init__
3588            (Classifier.map_layers_removed)
3589            (Classifier.layer_shapestore_replaced): receivers for the messages
3590            subscribed to in __init__. Unsubscribe and close the dialog
3591    
3592            * Thuban/UI/mainwindow.py (MainWindow.OpenLayerProperties): Pass
3593            the map to the Classifier dialog
3594    
3595            * test/test_layer.py (SetShapeStoreTests): Derive from
3596            SubscriberMixin as well so we can test messages
3597            (SetShapeStoreTests.setUp): Subscribe to some of the layer's
3598            messages
3599            (SetShapeStoreTests.tearDown): Clear the messages again
3600            (SetShapeStoreTests.test_sanity): Expand the doc-string and check
3601            for the modified flag too
3602            (SetShapeStoreTests.test_set_shape_store_modified_flag): New test
3603            to check whether SetShapeStore sets the modified flag
3604            (SetShapeStoreTests.test_set_shape_store_different_field_name)
3605            (SetShapeStoreTests.test_set_shape_store_same_field)
3606            (SetShapeStoreTests.test_set_shape_store_same_field_different_type):
3607            Add tests for the messages. This checks both the new
3608            LAYER_SHAPESTORE_REPLACED and the older LAYER_CHANGED
3609    
3610    2003-06-06  Jan-Oliver Wagner <[email protected]>
3611    
3612            * Thuban/UI/mainwindow.py: Improved and partly added help texts for
3613            the menu items.
3614    
3615    2003-06-05  Frank Koormann  <[email protected]>
3616    
3617            * Thuban/UI/identifyview.py (IdentifyView.__init__):
3618            Layout reimplemented without panel. Make life easier to fit the list
3619            in the dialog.
3620    
3621    2003-06-05  Frank Koormann  <[email protected]>
3622    
3623            * Thuban/UI/projdialog.py (ProjFrame.__init__): Fill the projchoice
3624            once on initialisation (Former implementation resulted in multiple
3625            entries for each projection).
3626            (ProjFrame.__FillAvailList): selectProj as second optional parameter,
3627            if set, select the projection found under the specified name. This
3628            overwrites any other selection estimate.
3629            Removed projchoice filling from this method.
3630            (ProjFrame._OnSave, ProjFrame._OnAddToList):
3631            Updated call of ProjFrame.__FillAvailList
3632            (LCCPanel._DoLayout): Moved parameter controls in more common order.
3633    
3634            * Resources/Projections/defaults.proj: Extended defaults representing
3635            various common European projections.
3636    
3637    2003-06-05  Frank Koormann  <[email protected]>
3638    
3639            * Thuban/UI/identifyview.py (IdentifyView.__init__):
3640            Use ListCtrl instead of GridCtrl
3641    
3642            * Thuban/Model/resource.py:
3643            Guess location of .thuban directory from tempdir parent directory.
3644    
3645            * Thuban/UI/application.py (ThubanApplication.read_startup_files):
3646            Guess location of .thuban directory from tempdir parent directory.
3647    
3648    2003-06-04  Bernhard Herzog  <[email protected]>
3649    
3650            Do not cache the values returned by the tree widget's
3651            GetFirstChild and GetNextChild methods because it led to lots of
3652            segfaults. The new way requires more brute force but is more
3653            reliable.
3654    
3655            * Thuban/UI/legend.py (LegendTree.__init__): Remove instance
3656            variable layer2id
3657            (LegendTree.find_layer): New method to do with brute force what
3658            layer2id tried to accomplish
3659            (LegendTree._OnMsgLayerChanged)
3660            (LegendTree._OnMsgLayerTitleChanged, LegendTree.__ShowHideLayer):
3661            Use find_layer instead of layer2id
3662            (LegendTree.__RemoveLayer, LegendTree.__AddLayer): No need to
3663            update layer2id anymore
3664            (LegendTree._OnMsgMapLayersRemoved)
3665            (LegendTree._OnMsgMapLayersAdded): Get by without layer2id.
3666    
3667    2003-06-03  Thomas Koester  <[email protected]>
3668    
3669            * Thuban/Model/classgen.py (GenQuantiles0): New function.
3670    
3671    2003-06-02  Bernhard Herzog  <[email protected]>
3672    
3673            * Thuban/UI/mainwindow.py (layer_rename command, table_rename command):
3674            New commands.
3675            (main_menu): Add the new commands.
3676            (MainWindow.TableRename): New. Implementation of the table_rename
3677            command.
3678            (MainWindow.RenameLayer): New. Implementation of the layer_rename
3679            command.
3680    
3681            * Thuban/Model/session.py (Session.AddTable): call self.changed to
3682            set the modified flag
3683    
3684            * test/test_session.py (TestSessionSimple.test_add_table): Test
3685            whether the modified flag is set properly
3686    
3687            * Thuban/Model/base.py (TitledObject.SetTitle): Call changed
3688            instead of issue so that the modified flags get updated.
3689    
3690            * test/test_base.py (SomeTitledObject): Derive from Modifiable
3691            instead of Publisher to reflect reality better and to accomodate
3692            the fact that SetTitle now calls changed instead of issue
3693    
3694    2003-06-02  Bernhard Herzog  <[email protected]>
3695    
3696            * Thuban/UI/classgen.py (GenQuantilesPanel.GetList): Resource
3697            acquisition has to happen before the try in a try-finally.
3698    
3699    2003-06-02  Bernhard Herzog  <[email protected]>
3700    
3701            * Thuban/UI/legend.py (LegendTree._OnMsgMapLayersRemoved): It's
3702            possible that a layer is removed that is not currently selected in
3703            the legend so don't check for this.
3704    
3705    2003-05-30  Bernhard Herzog  <[email protected]>
3706    
3707            * Thuban/Model/layer.py (Layer.Destroy): Set all instance
3708            variables to None that have direct or indirect references to
3709            shapefiles or dbf files to make sure that they do go away and the
3710            files are closed.
3711    
3712    2003-05-30  Bernhard Herzog  <[email protected]>
3713    
3714            * Thuban/UI/legend.py (LegendTree.GetRootItem): Reset
3715            availImgListIndices when a new image list is created
3716            
3717    2003-05-30  Bernhard Herzog  <[email protected]>
3718    
3719            * Thuban/UI/legend.py (LegendTree.__init__): New instance variable
3720            changing_selection to indicate whether the LegendTree code itself
3721            is currently changing the selection
3722            (LegendTree.normalize_selection): New method to normalize the
3723            selection by selecting the layer item even if the user clicked on
3724            the classification.
3725            (LegendTree._OnSelChanged): normalize the selection. This works
3726            around a bug in wx which doesn't keep track of the selection
3727            properly when subtrees are deleted.
3728    
3729    2003-05-30  Bernhard Herzog  <[email protected]>
3730    
3731            * Thuban/UI/view.py (MapCanvas.set_view_transform): Limit the
3732            maximum and minimum scale factors.
3733    
3734            * test/test_classgen.py (ClassGenTest.test): Update to reflect the
3735            changes in classgen.py
3736    
3737    2003-05-30  Jonathan Coles   <[email protected]>
3738    
3739            * Thuban/Model/classgen.py: Remove ClassGenerator class but make
3740            all the methods functions. Fixes RTBug #1903.
3741    
3742            * Thuban/Model/map.py (Map.TopLayer, Map.BottomLayer): Renamed
3743            to MoveLayerToTop and MoveLayerToBottom respectively. Fixes
3744            RTBug #1907.
3745    
3746            * Thuban/UI/classgen.py: Use classgen functions that were part
3747            of the ClassGenerator class. Put try/finally blocks around
3748            code that uses wxBeginBusyCursor()/wxEndBusyCursor(). Fixes
3749            RTBug #1904.
3750    
3751            * Thuban/UI/classifier.py: Remove unused import of ClassGenerator.
3752    
3753            * Thuban/UI/legend.py: The legend was cleared and repopulated any
3754            time something changed which caused some state to be lost such
3755            as which children were expanded or collapsed. Fixes RTBug #1901.
3756            (LegendTree._OnMsgMapLayersAdded): Add only new layers.
3757            (LegendTree.__OnMsgMapLayersRemoved): Remove layers that exist in
3758            the legend but not in the map.
3759            (LegendTree.__FillTree): Move main functionality out into smaller
3760            methods that can be used by other methods.
3761            (LegendTree.__FillTreeLayer): Reuse old slots in the image list
3762            if they are available.
3763            (LegendTree.DeleteAllItems): Renamed from __DeleteAllItems so
3764            that we override the wxTreeCtrl method. Iterate over children
3765            and call __RemoveLayer.
3766            (LegendTree.__AddLayer): New. Add a new layer to the legend.
3767            (LegendTree.__RemoveLayer): Remove a layer from the legend.
3768            (LegendTree.DeleteChildren): New, overrides wxTreeCtrl method.
3769            Should only be called with the id of a layer branch.
3770            (LegendTree.GetRootItem): New, overrides wxTreeCtrl method.
3771            Returns the root item or creates one if necessary.
3772    
3773            * Thuban/UI/renderer.py (MapRenderer.draw_raster_layer): Call
3774            ProjectRasterFile with tuple arguments instead of strings.
3775    
3776            * Thuban/UI/tableview.py (QueryTableFrame.OnQuery): Wrap code
3777            with try/finally. Fixes RTBug #1904.
3778    
3779            * Thuban/UI/view.py (MapCanvas.OnPaint): Wrap code
3780            with try/finally. Fixes RTBug #1904.
3781            (MapCanvas.FitSelectedToWindow): If a single point is selected
3782            simply center it on the display. Fixes RTBug #1849.
3783    
3784            * extensions/thuban/gdalwarp.cpp: Removed code that allowed gdalwarp
3785            to be compiled as a standalone app. Now the code can only be
3786            called from Python which simplifies the parameter passing.
3787            (ProjectRasterFile): Handle Python arguments. Remove code that
3788            checks for a destination dataset. Add more clean up code.
3789    
3790            * test/test_map.py (TestMapWithContents.test_raise_layer_top,
3791            TestMapWithContents.test_lower_layer_bottom):
3792            Test Map.MoveLayerToTop() and Map.MoveLayerToBottom() respectively.
3793            Fixes RTBug #1907.
3794    
3795            * Thuban/UI/mainwindow.py (MainWindow.ToggleLegend): Apply a full
3796            extent to the map when the legend is toggled. Fixes RTBug #1881.
3797    
3798    2003-05-29  Jan-Oliver Wagner <[email protected]>
3799    
3800            * Thuban/UI/tableview.py (LayerTableFrame.OnClose): Bug-fix: Now
3801            unsubscribes all that is subcribed in __init__.
3802    
3803    2003-05-28  Bernhard Herzog  <[email protected]>
3804    
3805            * Thuban/UI/mainwindow.py (MainWindow.DuplicateLayer)
3806            (MainWindow.CanDuplicateLayer): New methods to implement the
3807            Layer/Duplicate command.
3808            (layer_duplicate command): New.
3809            (main_menu): Add layer_duplicate to the Layer menu.
3810    
3811    2003-05-28  Bernhard Herzog  <[email protected]>
3812    
3813            * Thuban/UI/tableview.py (NullRenderer.Draw): New. Our own
3814            renderer so that NULL/None values get displayed differently (by a
3815            gray rectangle).
3816            (TableGrid.__init__): Override the default renderers
3817    
3818    2003-05-28  Bernhard Herzog  <[email protected]>
3819    
3820            * Thuban/Model/layer.py (Layer.SetShapeStore): Set the
3821            classification to "None" if the type of the field has changed.
3822    
3823            * test/test_layer.py (SetShapeStoreTests): New. Class with a few
3824            test for the Layer.SetShapeStore method
3825    
3826    2003-05-28  Jan-Oliver Wagner <[email protected]>
3827    
3828            * Thuban/Model/layer.py (Layer.TreeInfo): Fixed a bug (a layer
3829            does not necessarily have a filename).
3830    
3831    2003-05-28  Jan-Oliver Wagner <[email protected]>
3832    
3833            * Thuban/UI/mainwindow.py (MainWindow.TableClose, MainWindow.TableShow):
3834            sort the selection list for the dialog.
3835    
3836    2003-05-28  Frank Koormann  <[email protected]>
3837    
3838            * extensions/thuban/wxproj.cpp
3839            (project_point): Removed cast to int for projected point coordinates.
3840            (shape_centroid): Return last point if all polygon vertices fall
3841            to one point.
3842    
3843    2003-05-28  Bernhard Herzog  <[email protected]>
3844    
3845            * Thuban/UI/mainwindow.py (_can_unjoin): Add doc-string and cope
3846            with layers that don't have shapestores, i.e. raster layers.
3847    
3848    2003-05-28  Bernhard Herzog  <[email protected]>
3849    
3850            * Thuban/Model/table.py (DBFTable.__init__): Omit the extension
3851            when determining the title from the filename.
3852    
3853            * test/test_dbf_table.py (TestDBFTable.test_title): Update to
3854            reflect changes in the way the title is derived from the filename
3855    
3856    2003-05-28  Frank Koormann  <[email protected]>
3857    
3858            * Thuban/UI/mainwindow.py (MainWindow.TableShow):
3859            Added wxDEFAULT_DIALOG_STYLE to show table dialog styles.
3860    
3861    2003-05-27  Bernhard Herzog  <[email protected]>
3862    
3863            * Thuban/UI/mainwindow.py (MainWindow.delegated_messages): Also
3864            delegate SelectedLayer.
3865            (MainWindow.LayerUnjoinTable): Implement.
3866            (_can_unjoin): New. Helper function for the sensitivity of the
3867            layer/unjoin command.
3868    
3869            * Thuban/Model/data.py (ShapefileStore.OrigShapeStore)
3870            (DerivedShapeStore.OrigShapeStore): New. Return the original
3871            shapestore. Used to figure out how to unjoin.
3872            (DerivedShapeStore.Shapefile): Fix a typo.
3873    
3874    2003-05-27  Bernhard Herzog  <[email protected]>
3875    
3876            * Thuban/UI/join.py (JoinDialog): Extend to handle layer joins as
3877            well
3878            (JoinDialog.__init__): Use the layer parameter and only build the
3879            left choice when a layer is given
3880            (JoinDialog.OnJoin): Handle layer joins as well
3881            (JoinDialog.OnLeftTable, JoinDialog.OnRightTable): Handle the case
3882            that the user selects the "Select..." item. The sensitivitly
3883            updating is now in update_sensitivity
3884            (JoinDialog.y): New method to refactor the sensitivity update of
3885            the join button into its own method.
3886    
3887            * Thuban/UI/mainwindow.py (MainWindow.LayerJoinTable): Implement.
3888    
3889    2003-05-27  Bernhard Herzog  <[email protected]>
3890    
3891            * Thuban/UI/mainwindow.py (table_close command): Make it sensitive
3892            iff there are unreferenced tables in the session
3893    
3894    2003-05-27  Bernhard Herzog  <[email protected]>
3895    
3896            * Thuban/Model/messages.py (TABLE_REMOVED): New message.
3897    
3898            * Thuban/Model/session.py (Session.UnreferencedTables): New method
3899            to return tables that are not referenced by other tables or shape
3900            stores and can be removed.
3901            (Session.RemoveTable): Issue a TABLE_REMOVED message after
3902            removing the table
3903    
3904            * Thuban/UI/mainwindow.py: Remove unused imports
3905            (MainWindow.TableClose): Implement.
3906    
3907            * Thuban/UI/tableview.py (TableFrame.__init__): Subscribe to some
3908            messages so that the frame will be automatically closed when a new
3909            session is opened or the table is removed.
3910            (TableFrame.OnClose): Unsubscribe the Subscriptions made in
3911            __init__
3912            (TableFrame.close_on_session_replaced)
3913            (TableFrame.close_on_table_removed): New. Subscribers that close
3914            the window
3915    
3916            * test/test_session.py (TestSessionMessages.test_remove_table)
3917            (TestSessionSimple.test_remove_table): Move the test to
3918            TestSessionSimple and add test for the TABLE_REMOVED message
3919            (TestSessionBase.setUp): Also subscribe to TABLE_REMOVED
3920            (TestSessionSimple.test_unreferenced_tables) New. Test for the
3921            UnreferencedTables method.
3922            (UnreferencedTablesTests): New. Class with some more sophisticated
3923            tests for UnreferencedTables.
3924    
3925    2003-05-27  Frank Koormann  <[email protected]>
3926    
3927            * Thuban/UI/tableview.py (QueryTableFrame.__init__): The "_S_election"
3928            display has some unwanted side effects. Removed again.
3929    
3930    2003-05-27  Frank Koormann  <[email protected]>
3931    
3932            * Resources/Bitmaps/legend_icon_layer.xpm: New, icon for legend.
3933    
3934            * Thuban/UI/legend.py (LegendTree.__FillTree): Use "legend_icon_layer"
3935    
3936    2003-05-27  Jan-Oliver Wagner <[email protected]>
3937    
3938            * test/test_menu.py (MenuTest.test): Added test for
3939            Menu.RemoveItem().
3940    
3941            * Thuban/UI/menu.py (Menu.RemoveItem): New. Remove an item from
3942            the menu.
3943    
3944    2003-05-27  Frank Koormann  <[email protected]>
3945            
3946            Nonmodal dialogs without parent (i.e. they can fall behind the main
3947            window)
3948    
3949            * Thuban/UI/mainwindow.py (MainWindow.OnClose): Explicitly destroy
3950            all dialogs in the dialogs dictionary and the canvas.
3951    
3952            * Thuban/UI/dialogs.py (NonModalNonParentDialog): New class, without
3953            parent, i.e. can fall behind other windows.
3954            (NonModalDialog.OnClose): Check is dialog is in mainwindow.dialog
3955            dictionary before removing it.
3956    
3957            * Thuban/UI/classifier.py: Dialog derived from NonModalNonParentDialog
3958    
3959            * Thuban/UI/projdialog.py: Dialog derived from NonModalNonParentDialog
3960            * Thuban/UI/tableview.py: Dialog derived from NonModalNonParentDialog
3961            * Thuban/UI/tree.py: Dialog derived from NonModalNonParentDialog
3962    
3963    2003-05-27  Bernhard Herzog  <[email protected]>
3964    
3965            * Thuban/UI/mainwindow.py (MainWindow.ShowTableView): New. Open a
3966            tableview dialog
3967            (MainWindow.TableShow): Use ShowTableView to open the dialogs.
3968            Also, don't use the table's titles as the dialog names. The titles
3969            aren't guaranteed to be unique.
3970            (MainWindow.TableOpen): Open a table view dialog after opening the
3971            table
3972    
3973    2003-05-27  Bernhard Herzog  <[email protected]>
3974    
3975            * Thuban/UI/mainwindow.py: Remove the Table/Hide menu item. Its
3976            effect can be achieved by simply closing the window showing the
3977            table.
3978            (MainWindow.TableHide): Removed.
3979            (main_menu): Removed "table_hide"
3980    
3981    2003-05-27  Frank Koormann  <[email protected]>
3982    
3983            Fix legend tree display problems under Win32
3984    
3985            * Thuban/UI/legend.py:  BMP_SIZE_W = 15
3986            (LegendTree.__FillTree): Display "legend_icon_map.xpm" with layer title.
3987            (LegendTree.__FillTreeLayer): Explicitely set SelectedImage.
3988    
3989            * Resources/Bitmaps/legend_icon_map.xpm: New icon for legend.
3990    
3991    2003-05-27  Jan-Oliver Wagner <[email protected]>
3992    
3993            * Thuban/UI/menu.py (Menu.InsertSeparator): Additional optional parameter
3994            'after' now allows to insert separators almost anywhere in the menu.
3995    
3996    2003-05-27  Frank Koormann  <[email protected]>
3997    
3998            * Thuban/UI/tableview.py (QueryTableFrame.__init__): Underline the
3999            "S" of selection box label to hint on hot key (Alt-S). Works under
4000            Win32 but is ignored under GTK.
4001    
4002    2003-05-26  Frank Koormann  <[email protected]>
4003    
4004            * Thuban/UI/projdialog.py (ProjFrame.__do_layout, ProjPanel._DoLayout):
4005            Center Choices.
4006    
4007    2003-05-26  Bernhard Herzog  <[email protected]>
4008    
4009            Remove the Precision methods again. They're too DBF specific to be
4010            part of the table interface and they're only used in table_to_dbf
4011            anyway.
4012            
4013            * Thuban/Model/transientdb.py (TransientTableBase.Width):Use a
4014            fixed precision of 12 for doubles.
4015            (TransientTableBase.Precision): Removed
4016            (AutoTransientTable.Width): Delegate to self.table.
4017    
4018            * Thuban/Model/table.py (DBFTable.Precision)
4019            (MemoryTable.Precision): Removed.
4020            (MemoryTable.Width): Use a fixed precision of 12 for doubles.
4021            (table_to_dbf): Use a fixed precision of 12 for floats unless the
4022            column object specifies something else.
4023    
4024            * test/test_dbf_table.py (TestTableToDBF.test_table_to_dbf): New.
4025            test for table_to_dbf
4026    
4027    2003-05-26  Bernhard Herzog  <[email protected]>
4028    
4029            * test/test_transientdb.py
4030            (TestTransientTable.run_iceland_political_tests): Fix a comment.
4031    
4032    2003-05-26  Bernhard Herzog  <[email protected]>
4033    
4034            * Thuban/UI/mainwindow.py (MainWindow.TableOpen): Real
4035            implementation. Mark parts of the file format strings for
4036            localization.
4037    
4038            * Thuban/Model/session.py (Session.OpenTableFile): New. Open a dbf
4039            file and add the table to the tables managed by the session
4040    
4041            * test/test_session.py (TestSessionSimple.test_open_table_file):
4042            New. test case for OpenTableFile
4043    
4044    2003-05-26  Jan-Oliver Wagner <[email protected]>
4045    
4046            * Thuban/UI/controls.py, Thuban/UI/identifyview.py, Thuban/UI/join.py,
4047            Thuban/UI/labeldialog.py, Thuban/UI/mainwindow.py,
4048            Thuban/UI/proj4dialog.py, Thuban/UI/tableview.py, Thuban/UI/view.py:
4049            Replace the true/false of wxWindows by True/False of Python 2.2.1.
4050    
4051    2003-05-26  Jan-Oliver Wagner <[email protected]>
4052    
4053            * Thuban/UI/tableview.py (LayerTableFrame.__init__): If there is
4054            already a selection present, update the grid accordingly.
4055    
4056            * Thuban/UI/mainwindow.py (MainWindow.TableShow): Make the dialog
4057            resizeable and increase its initial size.
4058    
4059    2003-05-26  Frank Koormann  <[email protected]>
4060    
4061            Table export functionality
4062    
4063            * Thuban/Model/table.py (DBFTable.Width, MemoryTable.Width):
4064            Return width (in characters) for a column.
4065            (DBFTable.Precision, MemoryTable.Precision): Return decimal precision.
4066            (table_to_dbf): Write table to dbf file.
4067            (table_to_csv): Write table to csv file.
4068    
4069            * Thuban/Model/transientdb.py (TransientTableBase.Width,
4070            TransientTableBase.Precision): Return column width and precision.
4071    
4072            * Thuban/UI/tableview.py (QueryTableFrame.OnSaveAs): Call table_to_dbf
4073            or table_to_csv depending on file selection.
4074    
4075            * test/test_dbf_table.py:
4076            Test table_to_dbf (extension of former part of test).
4077    
4078            * test/test_csv_table.py:
4079            Test table_to_csv.
4080    
4081    2003-05-23  Jan-Oliver Wagner <[email protected]>
4082    
4083            * Thuban/UI/join.py (JoinDialog.OnJoin): Use _() for strings.
4084            Use QueryTableFrame instead of TableFrame.
4085    
4086            * Thuban/UI/mainwindow.py (MainWindow.LayerShowTable): Prefix the
4087            table window with 'Layer Table:' instead of 'Table:'.
4088    
4089    2003-05-23  Jan-Oliver Wagner <[email protected]>
4090    
4091            Give all tables a title via mix-in TitledObject.LayerShowTable
4092    
4093            * Thuban/Model/base.py (TitledObject.SetTitle): Call method 'issue'
4094            only if it exists.
4095    
4096            * Thuban/Model/table.py (DBFTable, MemoryTable): mix-in TitledObject
4097            and call its init-method with a default title. Remove Title() method.
4098    
4099            * Thuban/Model/transientdb.py (TransientTable, TransientJoinedTable,
4100            AutoTransientTable): mix-in TitledObject and call its init-method with
4101            a default title. Remove Title() method.
4102    
4103    2003-05-23  Bernhard Herzog  <[email protected]>
4104    
4105            * Thuban/Model/session.py (Session.AddShapeStore): Define
4106            AddShapeStore analogously to AddTable.
4107    
4108            * test/test_session.py (TestSessionSimple.test_add_shapestore):
4109            New. Test for AddShapeStore
4110    
4111    2003-05-23  Jan-Oliver Wagner <[email protected]>
4112    
4113            Introducing QueryTableFrame and a very coarse ShowTable implementation.
4114    
4115            * Thuban/UI/tableview.py (LayerTableFrame, QueryTableFrame): Split the
4116            class LayerTableFrame into two classes, LayerTableFrame and QueryTableFrame.
4117            The latter implements the selection GUI without dependency on a layer.
4118            LayerTableFrame now is derived from QueryTableFrame and connects
4119            to a layer.
4120    
4121            * Thuban/UI/mainwindow.py (MainWindow.TableShow): A very coarse
4122            implementation that still needs work.
4123    
4124            * Thuban/Model/layer.py (Layer.TreeInfo): Added filename.
4125    
4126    2003-05-22  Frank Koormann  <[email protected]>
4127    
4128            * Thuban/Model/transientdb.py (TransientJoinedTable.__init__):
4129            Added "outer_join = False" as optional parameter.
4130            (TransientJoinedTable.create): If outer join is true, perform a
4131            "LEFT OUTER JOIN" instead of "JOIN", which preserves all records of
4132            the left table. Records not matching are filled with 0 / None.
4133    
4134            * Thuban/UI/join.py (JoinDialog.__init__): Checkbox for outer join.
4135            (JoinDialog.OnJoin): Consider outer join check box.
4136    
4137    2003-05-22  Bernhard Herzog  <[email protected]>
4138    
4139            * Thuban/UI/join.py (JoinDialog.OnJoin): Use exc_info in a
4140            somewhat safer way. Storing the traceback in a local variable can
4141            lead to memory leaks
4142    
4143    2003-05-22  Bernhard Herzog  <[email protected]>
4144    
4145            * Thuban/UI/join.py (JoinDialog.OnJoin): Make sure to really call
4146            the wxMessageDialog's Destroy() method.
4147    
4148    2003-05-22  Frank Koormann  <[email protected]>
4149    
4150            * Thuban/UI/join.py (JoinDialog.__init__): Make use of
4151            TransientTable.Title()
4152    
4153    2003-05-22  Frank Koormann  <[email protected]>
4154    
4155            Join Dialog, initial version.
4156    
4157            * Thuban/UI/mainwindow.py (MainWindow.TableJoin): Removed print.
4158    
4159            * Thuban/UI/join.py (JoinDialog): Functional implementation of
4160            former framework. Renamed Table1/Table2 to LeftTable/RightTable
4161            in all occurences.
4162    
4163            * Thuban/Model/transientdb.py (TransientJoinedTable.__doc__):
4164            Typo fixed.
4165    
4166    2003-05-22  Bernhard Herzog  <[email protected]>
4167    
4168            Give the tables titles so that the GUI can display more meaningful
4169            names. For now the titles are fixed but depend on e.g. filenames
4170            or the titles of the joined tables.
4171    
4172            * Thuban/Model/transientdb.py (TransientTable.Title)
4173            (TransientJoinedTable.Title, AutoTransientTable.Title): New.
4174    
4175            * Thuban/Model/table.py (DBFTable.Title, MemoryTable.Title): New.
4176    
4177            * test/test_transientdb.py
4178            (TestTransientTable.test_auto_transient_table_title): New. Test
4179            for the Title method
4180            (TestTransientTable.test_transient_joined_table)
4181            (TestTransientTable.test_transient_table): Add test for the Title
4182            methods
4183    
4184            * test/test_memory_table.py (TestMemoryTable.test_title): New.
4185            Test for the Title method
4186    
4187            * test/test_dbf_table.py (TestDBFTable.test_title): New. Test for
4188            the Title method
4189    
4190    2003-05-22  Bernhard Herzog  <[email protected]>
4191    
4192            * test/test_layer.py (TestLayer.setUp, TestLayer.tearDown):
4193            Provide a better way to destroy the layers
4194            (TestLayer.test_base_layer, TestLayer.test_arc_layer)
4195            (TestLayer.test_point_layer, TestLayer.test_empty_layer)
4196            (TestLayer.test_polygon_layer, TestLayer.test_get_field_type): Use
4197            the new way to destroy the layers.
4198            (TestLayer.test_derived_store): New. Test for using a layer with a
4199            DerivedShapeStore
4200    
4201            * Thuban/Model/layer.py (Layer.SetShapeStore): Only set the
4202            filename if the shape store actually has one.
4203    
4204    2003-05-22  Bernhard Herzog  <[email protected]>
4205    
4206            * Thuban/Model/table.py (DBFTable.FileName): New. Accessor method
4207            for the filename
4208    
4209            * test/test_dbf_table.py (TestDBFTable.test_filename): New. Test
4210            for the FileName method
4211            (TestDBFTableWriting.test_write): Fix spelling of filename
4212    
4213    2003-05-22  Thomas Koester  <[email protected]>
4214    
4215            * Thuban/Model/range.py, test/test_range.py: Brought over new Range
4216            from SciParam that now really is immutable.
4217    
4218    2003-05-22  Frank Koormann  <[email protected]>
4219    
4220            Layer Top/Bottom placement added to legend.
4221    
4222            * Thuban/UI/legend.py
4223            (LegendPanel._OnMoveTop(), LayerPanel._OnMoveBottom): New, methods
4224            bound to tool events.
4225            (LegendTree.MoveCurrentItemTop(), LegendTree.MoveCurrentItemBottom):
4226            New, methods binding the event methods with the map methods.
4227    
4228            * Thuban/Model/map.py (Map.TopLayer(), Map.BottomLayer()): New, place
4229            layer at top/bottom of layer stack.
4230    
4231            * Resources/Bitmaps/top_layer.xpm: New button icon.
4232    
4233            * Resources/Bitmaps/bottom_layer.xpm: New button icon.
4234    
4235    2003-05-22  Bernhard Herzog  <[email protected]>
4236    
4237            * Thuban/Model/session.py (Session.RemoveTable): New method to
4238            remove tables
4239    
4240            * test/test_session.py (TestSessionSimple.test_remove_table): New.
4241            Test for RemoveTable
4242    
4243    2003-05-22  Thomas Koester  <[email protected]>
4244    
4245            * Thuban/Model/classgen.py: Added short module doc string and CVS id.
4246            (ClassGenerator.GenUniformDistribution): Use new Range __init__, too.
4247    
4248    2003-05-22  Bernhard Herzog  <[email protected]>
4249    
4250            Implement a way to discover dependencies between tables and
4251            shapestores.
4252    
4253            * Thuban/Model/transientdb.py (TransientTableBase.Dependencies)
4254            (TransientJoinedTable.Dependencies)
4255            (AutoTransientTable.SimpleQuery): New. Implement the dependencies
4256            interface
4257            (TransientJoinedTable.__init__): Keep tack of the original table
4258            objects in addition to the corresponding transient tables.
4259    
4260            * Thuban/Model/table.py (DBFTable.Dependencies)
4261            (MemoryTable.Dependencies): New. Implement the dependencies
4262            interface
4263    
4264            * Thuban/Model/data.py (ShapeTable): New. Helper class for
4265            ShapefileStore
4266            (ShapefileStore.__init__): Use ShapeTable instead of
4267            AutoTransientTable
4268            (ShapefileStore.Table, ShapefileStore.Shapefile): Add doc-strings
4269            (ShapefileStore.FileName, ShapefileStore.FileType): New. Accessor
4270            methods for filename and type
4271            (ShapefileStore.Dependencies): New. Implement the dependencies
4272            interface
4273            (DerivedShapeStore): New class to replace SimpleStore. The main
4274            difference to SimpleStore is that it depends not on a shapefile
4275            but another shapestore which expresses the dependencies a bit
4276            better
4277            (SimpleStore.__init__): Add deprecation warning.
4278    
4279            * test/test_dbf_table.py (TestDBFTable.test_dependencies): New.
4280            Test for the Dependencies method.
4281    
4282            * test/test_memory_table.py (TestMemoryTable.test_dependencies):
4283            New. Test for the Dependencies method.
4284    
4285            * test/test_transientdb.py
4286            (TestTransientTable.test_auto_transient_table_dependencies): New.
4287            Test for the Dependencies method.
4288            (TestTransientTable.test_transient_joined_table): Add test for the
4289            Dependencies method.
4290    
4291            * test/test_session.py (TestSessionSimple.setUp)
4292            (TestSessionSimple.tearDown): New. Implement a better way to
4293            destroy the sessions.
4294            (TestSessionSimple.test_initial_state)
4295            (TestSessionSimple.test_add_table): Bind session to self.session
4296            so that it's destroyed by tearDown
4297            (TestSessionSimple.test_open_shapefile): New. Test for
4298            OpenShapefile and the object it returns
4299    
4300    2003-05-22  Bernhard Herzog  <[email protected]>
4301    
4302            * Thuban/Model/session.py (Session.AddTable): New method to
4303            register tables with the session.
4304            (Session.Tables): Return the tables registered with AddTable too.
4305    
4306            * test/test_session.py (TestSessionSimple.test_add_table): New.
4307            Test case for the AddTable method
4308    
4309    2003-05-22  Frank Koormann  <[email protected]>
4310    
4311            UI polishing updates: Place main buttons (OK, Cancel, etc) in the
4312            lower right corner, center labels for selections, initialize controls
4313            in reasonable order for keyboard navigation.
4314    
4315            * Thuban/UI/projdialog.py (ProjFrame.__init__, ProjFrame.__doLayout)
4316            (ProjFrame.__DoOnProjAvail): Determine position of current projection
4317            using the wxListBox.FindString() method. Still a problem (#1886)
4318    
4319            * Thuban/UI/classifier.py
4320            (Classifier.__init__, SelectPropertiesDialog.__init__)
4321    
4322            * Thuban/UI/classgen.py (ClassGenDialog.__init__,
4323            (ClassGenDialog.__DoOnGenTypeSelect): Moved initialization of the
4324            different classification types from here to __init__.
4325            (GenUniquePanel.__init__): Set the column width of the first field
4326            in the Field ListCtrl to the full width.
4327    
4328            * Thuban/UI/tableview.py (LayerTableFrame.__init__): Rename 'Save As'
4329            Button to 'Export'. Center Buttons in Selection Box, set Focus to
4330            Grid.
4331            (LayerTableFrame.OnKeyDown()): New, bound to the grid with EVT_KEY_DOWN,
4332            changes focus to the Selection when pressing "Alt-S".
4333    
4334            * Thuban/UI/legend.py (LegendTree.__SetVisibilityStyle): Only gray out
4335            the text if not visible. The italic font sometimes exceeds the
4336            rendering area.
4337    
4338    2003-05-21  Jonathan Coles   <[email protected]>
4339    
4340            * Thuban/UI/dock.py (DockFrame): Rename references to _OnClose
4341            to OnClose so that Thuban closes correctly.
4342    
4343            * Thuban/UI/mainwindow.py (MainWindow.OnClose): Call
4344            DockFrame.OnClose, not DockFrame._OnClose.
4345    
4346    2003-05-21  Jonathan Coles   <[email protected]>
4347    
4348            * Thuban/Model/classgen.py (ClassGenerator.GenQuantiles): Remove
4349            references to 'inf' and use new Range __init__ to pass floats
4350            directly rather than converting them to strings first.
4351            Fixes RTBug #1876.
4352    
4353            * Thuban/Model/classification.py (ClassGroupRange.SetRange):
4354            Use new Range ___init__ to pass floats.
4355    
4356            * Thuban/Model/layer.py (RasterLayer.__init__): Test if the
4357            filename is a valid image file. Throw IOError otherwise.
4358    
4359            * Thuban/Model/range.py: Brought over new Range from SciParam that
4360            is immutable and has an __init__ which can accept floats.
4361    
4362            * Thuban/UI/mainwindow.py (MainWindow.AddLayer): Move OpenShapefile
4363            into try block. AddLayer doesn't throw any exceptions anymore.
4364            (MainWindow.AddRasterLayer): Move constructor of RasterLayer into
4365            try block.
4366    
4367            * Thuban/UI/projdialog.py (GeoPanel.__init__): Put Degrees as
4368            the first item in choices. Fixes RTBug #1882.
4369    
4370            * Thuban/UI/renderer.py (MapRenderer.render_map): Check if scale
4371            has gone to 0 which is a serious problem. abort.
4372            (MapRenderer.draw_raster_layer): Catch IOError seperately and
4373            print the error from GDAL.
4374    
4375            * Thuban/UI/tableview.py (TableGrid.__init__): Call
4376            ToggleEventListeners to turn on listening.
4377            (TableGrid.ToggleEventListeners): New. Turns event listening on
4378            and off so as to prevent excessive messages.
4379            (LayerTableFrame.OnQuery): Use TableGrid.ToggleEventListeners
4380            to suppress excessive messages when selecting many rows.
4381            Fixes RTBug #1880.
4382    
4383            * Thuban/UI/view.py: Added checks against if scale == 0. This
4384            is a serious problem that can occur when an image without
4385            geo data is loading and causes the map projection bounds to
4386            go to infinity. Right now, the solution is to simply try
4387            to recover.
4388    
4389            * extensions/thuban/cpl_mfile.cpp (MFILEClose): Make sure
4390            to set the MFILEReceiver attributes even if the data is NULL.
4391    
4392            * extensions/thuban/gdalwarp.cpp: Improved the error handling
4393            and passed GDAL messages back up to the Python layer. Also
4394            tried to fix some memory leaks that were present in the original
4395            utility but didn't matter because the program aborted.
4396    
4397            * test/test_range.py: Copied over tests from SciParam. Removed
4398            tests against importing. Fixes RTBug #1867.
4399    
4400    2003-05-21  Bernhard Herzog  <[email protected]>
4401    
4402            * test/test_load.py: Remove unused imports and restructure the
4403            test code
4404            (LoadSessionTest): Split into one class for each test and turn
4405            LoadSessionTest itself into the base class for all such session
4406            tests.
4407            (ClassificationTest): New base class for load tests that test
4408            classifications
4409            (TestSingleLayer, TestLayerVisibility, TestClassification)
4410            (TestLabels, TestLayerProjection, TestRasterLayer): New classes
4411            for the individual tests
4412    
4413            * test/support.py (FileLoadTestCase.filename): New base class for
4414            file loading tests
4415    
4416    2003-05-21  Jan-Oliver Wagner <[email protected]>
4417    
4418            * Resources/Projections/defaults.proj: Renamed 'Universal Transverse
4419            Mercator' to 'UTM Zone 32' as a more convenient example.
4420            Added 'Gauss Krueger Zone 6'.
4421    
4422            * Data/iceland_sample_raster.thuban: political polygon now
4423            filled transparent to have the raster image visible at once.
4424    
4425    2003-05-21  Frank Koormann  <[email protected]>
4426    
4427            * Thuban/UI/mainwindow.py (MainWindow): Renamed _OnClose() back to
4428            OnClose() to keep in sync with extensions. Internally Thuban
4429            still uses "underscored" names.
4430    
4431    2003-05-20  Jonathan Coles   <[email protected]>
4432    
4433            This puts back Raster layer support. These layers support projections
4434            through the GDAL library. Currently, the CVS version is being used.
4435            There are no Debian packages available although this may change soon.
4436            A GDAL driver was extended to support writing to memory rather to
4437            files.
4438    
4439            There is still some work that needs to be done, such as some error
4440            handling when loading invalid images or when there is a problem
4441            projecting the image. This putback simply checks in the majority
4442            of the work.
4443    
4444            * setup.py: Add gdalwarp library extension.
4445    
4446            * Thuban/Model/layer.py (BaseLayer.HasClassification): New.
4447            Defaults to False, but can be overridden by subclasses if they
4448            support classification.
4449            (RasterLayer): New. Defines a new layer that represents an
4450            image.
4451    
4452            * Thuban/Model/load.py (SessionLoader.__init__): Add rasterlayer
4453            tag handler.
4454            (SessionLoader.start_layer): Encode the filename.
4455            (SessionLoader.start_rasterlayer, SessionLoader.end_rasterlayer):
4456            New. Supports reading a rasterlayer tag.
4457    
4458            * Thuban/Model/map.py (Map.BoundingBox): Fix typo in comment.
4459    
4460            * Thuban/Model/save.py (XMLWriter.encode): Don't assume that we
4461            get a string in Latin1. If we get such as string convert it to
4462            unicode first, otherwise leave if alone before encoding.
4463            (SessionSaver.write_layer): Add support for writing both Layers
4464            and RasterLayers.
4465    
4466            * Thuban/Model/transientdb.py (AutoTransientTable.SimpleQuery):
4467            The right argument may not be a string, it could also be a Column.
4468    
4469            * Thuban/UI/application.py (ThubanApplication.CreateMainWindow):
4470            Make initial window size 600x400. Fixes RTBug #1872.
4471    
4472            * Thuban/UI/classifier.py (Classifier.__init__): Rearrange how
4473            the dialog is constructed so that we can support layers that
4474            do not have classifications.
4475            (Classifier._OnTry): Only build a classification if the layer
4476            supports one.
4477    
4478            * Thuban/UI/legend.py: Change all checks that a layer is an
4479            instance of Layer into checks against BaseLayer.
4480            (LegendTree.__FillTreeLayer): Only add children to a branch if
4481            the layer supports classification.
4482    
4483            * Thuban/UI/mainwindow.py (MainWindow.NewSession,
4484            MainWindow.OpenSession): Don't proceed with an action if the
4485            user chooses Cancel when they are asked to save changes.
4486            (MainWindow.AddRasterLayer): New. Open a dialog to allow the
4487            user to select an image file. Create a new RasterLayer and add
4488            it to the map.
4489    
4490            * Thuban/UI/renderer.py (MapRenderer.render_map): Add support
4491            for rendering RasterLayer layers.
4492            (MapRenderer.draw_raster_layer): Actually method that calls
4493            the GDALWarp python wrapper and constructs an image from the
4494            data returned.
4495    
4496            * Thuban/UI/tableview.py (LayerTableFrame.__init__): Change the
4497            Choices symbols to match those used in the table query method.
4498            Replace deprecated method calls on table with new method names.
4499    
4500            * Thuban/UI/view.py (MapCanvas.set_view_transform): Try to limit
4501            how small the scale can get. This still needs more testing.
4502    
4503            * extensions/thuban/bmpdataset.cpp: New, but copied from GDAL.
4504            Provides a driver to output in .bmp format.
4505    
4506            * extensions/thuban/cpl_mfile.cpp, extensions/thuban/cpl_mfile.h:
4507            New. Provides IO routines which write to memory, rather than a file.
4508    
4509            * extensions/thuban/gdalwarp.cpp: New, but basically a direct copy
4510            of the gdalwarp utility provided in GDAL. Added function calls
4511            that can be accessed from python.
4512    
4513            * Data/iceland_sample_raster.thuban: New. Sample file that uses
4514            a raster layer.
4515    
4516            * Data/iceland/island.tfw, Data/iceland/island.tif: New. Raster
4517            layer image data.
4518    
4519            * Doc/thuban.dtd: Added rasterlayer attribute definition.
4520    
4521            * test/test_layer.py, test/test_load.py, test/test_save.py: Added
4522            tests associated with the raster layer code.
4523    
4524            * test/test_transientdb.py
4525            (TestTransientTable.test_auto_transient_table_query): Added a test
4526            for using a Column object as the "right" parameter to a query.
4527    
4528    2003-05-19  Frank Koormann  <[email protected]>
4529    
4530            * Thuban/version.py (get_changelog_date):
4531            Catch exceptions if ChangeLog does not exist.
4532    
4533            * Thuban/UI/view.py (MapCanvas.Export): Bugfix
4534    
4535    2003-05-19  Frank Koormann  <[email protected]>
4536    
4537            Extended version information for Thuban
4538    
4539            * Thuban/version.py: New, version information for Thuban: Last
4540            modification date and last ChangeLog entry date.
4541    
4542            * Thuban/UI/mainwindow.py (MainWindow.About()): Extended version
4543            information: Display Thuban, wxPython and Python version.
4544    
4545    2003-05-16  Bernhard Herzog  <[email protected]>
4546    
4547            * Thuban/Model/save.py: Remove some unused imports including the
4548            __future__ import for nested_scopes as Thuban relies on Python 2.2
4549            now.
4550            (XMLWriter.encode): Remove the special case for a None argument.
4551            In the saver encode is always called with a string argument.
4552    
4553    2003-05-16  Bernhard Herzog  <[email protected]>
4554    
4555            * Thuban/UI/__init__.py: Remove the work-around for the locale bug
4556            in wxPython (at least when usinvg wxGTK) prior to 2.4. The symptom
4557            of the bug was that e.g. float("1.2") would fail. Thuban now
4558            requires 2.4.x.
4559            
4560    2003-05-16  Frank Koormann   <[email protected]>
4561    
4562            Printing enhancement and WMF export (under Win32)
4563    
4564            * Thuban/UI/renderer.py (ExportRenderer): New, derived from
4565            ScreenRenderer. Renders Map, Legend and Scalebar for export.
4566            (PrinterRenderer): New, derived from ExportRenderer. Replaces the old
4567            PrintRender.
4568    
4569            * Thuban/UI/view.py (MapPrintout.__init__): Enhanced parameter set
4570            to fullfil information needed for PrinterRenderer.
4571            (MapCanvas.Export): New. Export Map (currently only to WMF on Win32).
4572            (MapCanvas.Print): Adapted to new MapPrintout.
4573            (OutputTransform): General calculations to transform from canvas
4574            coordinates to export/printing devices.
4575    
4576            * Thuban/UI/mainwindow.py (MainWindow.ExportMap()): New. Added also
4577            new method_command to call ExportMap, with platform dependency (only
4578            __WXMSW__)
4579      
4580            * Thuban/UI/scalebar.py (ScaleBar.DrawScaleBar): Position and Size
4581            of scalebar drawing area as new parameters.
4582            
4583            * Thuban/Model/scalebar.py (roundInterval): round long instead of int
4584    
4585            * Thuban/UI/legend.py (ScalebarBitmap.__SetScale):
4586            Update to extended scalebar.DrawScalebar header.
4587    
4588            * test/test_export.py: New, test Thuban.UI.view.OutputTransform()
4589    
4590            * test/test_scalebar.py: Made test executable as standalone.
4591    
4592    2003-05-16  Bernhard Herzog  <[email protected]>
4593    
4594            * Thuban/Model/table.py (Table): Remove this compatibility alias
4595            for DBFTable.
4596    
4597            * test/test_table.py: Import DBFTable as Table because that alias
4598            doesn't exist anymore.
4599    
4600            * Thuban/UI/classgen.py: Remove some unused imports
4601    
4602    2003-05-14  Jonathan Coles   <[email protected]>
4603    
4604            * Thuban/Model/classgen.py (ClassGenerator.GenSingletonsFromList):
4605            Fix docstring.
4606            (ClassGenerator.GenUniformDistribution): Fix spelling of method name.
4607            (ClassGenerator.GenQuantiles): Use the left/right brackets and min/max
4608            values of the supplied range to determine the beginning and end
4609            bounds of the generated classes.
4610    
4611            * Thuban/Model/range.py (Range.number_re): Now accepts floats that
4612            do not have a leading 0 (.5 is now accepted as well as 0.5).
4613    
4614            * Thuban/UI/classgen.py (ClassGenDialog.OnOK): Fix name of method
4615            call to ClassGenerator.GenUniformDistribution.
4616    
4617            * Thuban/UI/projdialog.py (ProjFrame.__do_layout): Fix Windows
4618            layout bug with the 'Projection' label.
4619    
4620            * test/support.py (FloatTestCase): New. Needed for the Range tests.
4621    
4622            * test/test_range.py: New. Imported from SciParam.
4623    
4624    2003-05-12  Jonathan Coles   <[email protected]>
4625    
4626            * Thuban/UI/classgen.py (GenQuantilesPanel.GetList): Replace call
4627            to table.UniqueValues() with calls that retrieve all the values
4628            from the table. This will need to be replaced by a method on table
4629            which can simply return the list (perhaps more efficiently).
4630    
4631    2003-05-12  Jonathan Coles   <[email protected]>
4632    
4633            The return value of ClassGenerator.CalculateQuantiles has changed.
4634            Refer to the documentation for details.
4635    
4636            * test/test_classgen.py: Modified Quantile tests to use the
4637            new return values.
4638    
4639            * Thuban/Model/classgen.py
4640            (ClassGenerator.GenQuantiles): Add comments describing the parameters,
4641            use new return values from CalculateQuantiles to produce the correct
4642            range bounds in the Classification.
4643            (ClassGenerator.CalculateQuantiles): Add more comments describing
4644            the return values and parameters. Make minor adjustments to improve
4645            the legibility of the code. Fix problem with adjusted not being set
4646            in most cases.
4647    
4648    2003-05-12  Frank Koormann <[email protected]>
4649            
4650            * Thuban/Model/save.py (XMLWriter.encode()): Explicite call to unicode
4651            and latin1. Fixes #1851 finally.
4652    
4653    2003-05-09  Jonathan Coles   <[email protected]>
4654    
4655            * test/test_classgen.py: New. Tests the Quantile algorithm.
4656    
4657            * Thuban/Model/classgen.py (ClassGenerator.CalculateQuantiles):
4658            Clean up debugging statement, add comments, fix a small bug in the
4659            returned adjusted percentiles.
4660            
4661    2003-05-09  Jonathan Coles   <[email protected]>
4662    
4663            Introduces Range class from SciParam into the ClassGroupRange class,
4664            and such ranges can now be saved and loaded from disk.
4665    
4666            Quantiles are now available in the Classification Generator.
4667    
4668            Initial support for building Queries on a table. Doesn't do anything
4669            but run some tests.
4670    
4671            * Thuban/Model/classification.py: Explicit imports.
4672            (ClassGroupRange): Use the Range class to store the underlying
4673            range information. The interface remains the same, except for
4674            GetRange(), and you can also supply a Range object as the min
4675            parameter to SetRange or __init__.
4676    
4677            * Thuban/Model/load.py (XMLReader.encode): New. Encodes the given
4678            string appropriately for use in Thuban. Fixes RTbug #1851.
4679            (SessionLoader.end_projection): Handle the context of the
4680            projection tag a bit better by looking at what objects are not
4681            None. There was an assumption that a projection tag for a map
4682            could occur before any layers.
4683            (SessionLoader.start_clrange): Provide backward compatibility for
4684            reading min/max values as well as the new range parameter.
4685    
4686            * Thuban/Model/map.py: Explicit imports.
4687    
4688            * Thuban/Model/resource.py: Import _.
4689            (ProjFileSaver.write): write header using projfile.dtd.
4690    
4691            * Thuban/Model/save.py: Explicit imports.
4692            (XMLWriter.encode): New. Encode the given string from a format
4693            used by Thuban into UTF-8. Fixes RTbug #1851.
4694    
4695            * Thuban/UI/classgen.py: Explicit imports.
4696            (ClassGenDialog.__init__): Clean up the code and add support
4697            for Quantiles.
4698            (ClassGenDialog.OnOK): Add support for Quantiles.
4699            (GenQuantilesPanel): New. Input panel for Quantiles.
4700            (ClassGenerator, CustomRamp, MonochromaticRamp, GreyRamp, RedRamp,
4701            GreenRamp, BlueRamp, HotToColdRamp): Move to Thuban/Model/classgen.py
4702    
4703            * Thuban/Model/classgen.py: New. Contains all the classes named above.
4704    
4705            * Thuban/UI/classifier.py: Explicit imports.
4706            (ClassTable.GetValueAsCust, ClassTable.__ParseInput,
4707            ClassTable.SetValueAsCustom): Reworked to use new Range class.
4708    
4709            * Thuban/UI/legend.py: Explicit imports.
4710    
4711            * Thuban/UI/mainwindow.py: Add support for the Join Dialog. Added
4712            a Table menu and associated method calls.
4713            (MainWindow.choose_color): Removed. No longer needed.
4714    
4715            * Thuban/UI/projdialog.py (ProjFrame.__VerifyButtons): Save button
4716            should be disabled if no projection is selected in the available
4717            list.
4718    
4719            * Thuban/UI/renderer.py: Explicit imports.
4720    
4721            * Thuban/UI/tableview.py (TableGrid.OnRangeSelect): Fix some issues
4722            with correctly selecting the rows and issuing the right events.
4723            Be sure to call Skip() to allow the grid to do some of its own
4724            handling which allows the rows to actually be selected.
4725            (LayerTableGrid.select_shapes): Rename from select_shape. Supports
4726            selecting multiple shapes.
4727            (LayerTableFrame): Support for building Queries.
4728            (LayerTableFrame.select_shapes): Allow multiple shapes to be selected.
4729    
4730            * Thuban/UI/tree.py: Explicit imports.
4731    
4732            * Thuban/UI/view.py (MapCanvas): Delegate "SelectedShapes" so the
4733            table view can call it.
4734    
4735            * test/test_classification.py: Explicit imports.
4736            (TestClassification.test_ClassGroupRange): Fix test for new
4737            Range class.
4738    
4739            * Doc/thuban.dtd: Add range parameter for clrange.
4740    
4741            * Thuban/Model/range.py: Taken from SciParam. Used as the underlying
4742            object in ClassGroupRange, and also uesd for inputting ranges in
4743            the classifer table and elsewhere.
4744    
4745            * Thuban/UI/join.py: New. Initial Join dialog. No real functionality
4746            yet.
4747    
4748    2003-05-09  Frank Koormann <[email protected]>
4749    
4750            * Thuban/UI/scalebar.py (DrawScaleBar): Draw only if interval > 0.0.
4751    
4752    2003-05-08  Frank Koormann <[email protected]>
4753    
4754            Coding style updates
4755    
4756            * test/test_scalebar.py: Replaced tab indentation by spaces.
4757    
4758            * Thuban/UI/scalebar.py: Explicit imports.
4759    
4760    2003-05-08  Frank Koormann <[email protected]>
4761    
4762            * Thuban/UI/scalebar.py
4763            (ScaleBar.DrawScalebar): Format string bug fixed.
4764    
4765    2003-05-08  Frank Koormann <[email protected]>
4766    
4767            Reorganization of scalebar component (no wx in Thuban/Model)
4768    
4769            * Thuban/Model/scalebar.py: Rendering moved to Thuban/UI/scalebar.py
4770            (deriveInterval):
4771            Calculate scalebar interval and unit which fits in width for scale.
4772            (roundInterval): Round float.
4773    
4774            * Thuban/UI/scalebar.py (ScaleBar): Scalebar rendering
4775    
4776            * test/test_scalebar.py: Test for Thuban/Model/scalebar.py methods.
4777    
4778            * Thuban/UI/legend.py: Import Thuban.UI.scalebar
4779    
4780    2003-05-08  Frank Koormann <[email protected]>
4781    
4782            * Thuban/UI/legend.py (ScalebarBitmap.SetCanvas):
4783            Initialize ScaleBar with canvas.map
4784    
4785            * Thuban/Model/scalebar.py (ScaleBar.roundInterval()): New,
4786            round intervals to display smarter lengths
4787            (ScaleBar.DrawScalebar): Draw Scalebar only if the map contains a
4788            layer. If the maps has no projection applied grey the scalebar.
4789    
4790    2003-05-07  Frank Koormann <[email protected]>
4791            
4792            Basic Scalebar features added.
4793    
4794            * Thuban/Model/scalebar.py (ScaleBar): New, scalebar rendering.
4795    
4796            * Thuban/UI/legend.py (LegendPanel): Added scalebar bitmap
4797            (ScaleBarBitmap): New, links the scalebar bitmap with view messages
4798            and the renderer.
4799    
4800            * Thuban/UI/view.py (MapCanvas.set_view_transform): Issue SCALE_CHANGED.
4801    
4802            * Thuban/UI/messages.py: SCALE_CHANGED added.
4803    
4804    2003-05-07  Bernhard Herzog  <[email protected]>
4805    
4806            * Thuban/Model/session.py (Session.__init__): New instance
4807            variable shapestores to hold a list of all open shapestore objects
4808            (Session.ShapeStores): New. Accessor method for the shapestores
4809            list.
4810            (Session._add_shapestore, Session._clean_weak_store_refs): New.
4811            Internal methods to maintain the shapestores list.
4812            (Session.Tables): New. Return all tables open in the session.
4813            (Session.OpenShapefile): Insert the new ShapeStore into the
4814            shapestores list.
4815    
4816            * test/test_session.py (TestSessionSimple.test_initial_state): Add
4817            tests for ShapeStores and Tables
4818            (TestSessionWithContent.test_shape_stores)
4819            (TestSessionWithContent.test_tables): New. Test cases for
4820            ShapeStores and Tables
4821    
4822    2003-05-07  Bernhard Herzog  <[email protected]>
4823    
4824            * Thuban/Model/transientdb.py (TransientTableBase.ReadRowAsDict):
4825            Add comments about the optimizations used.
4826            (AutoTransientTable.ReadValue, TransientTableBase.ReadValue): New.
4827            Implement the ReadValue table interface method.
4828    
4829            * test/test_transientdb.py
4830            (TestTransientTable.run_iceland_political_tests)
4831            (TestTransientTable.test_transient_joined_table): Add tests for
4832            ReadValue
4833    
4834    2003-05-07  Frank Koormann <[email protected]>
4835    
4836            * Resources/Bitmaps/fulllayerextent.xpm,
4837            Resources/Bitmaps/fullselextent.xpm: Replaced the place holders with
4838            new icons.
4839    
4840    2003-05-06  Bernhard Herzog  <[email protected]>
4841    
4842            * Thuban/Model/transientdb.py (AutoTransientTable.SimpleQuery):
4843            New. Simply delegate to the transient table's version.
4844    
4845            * test/test_transientdb.py
4846            (TestTransientTable.test_auto_transient_table_query): New. Test
4847            case for AutoTransientTable's SimpleQuery
4848    
4849    2003-05-06  Bernhard Herzog  <[email protected]>
4850    
4851            * Thuban/Model/transientdb.py (TransientTableBase.SimpleQuery):
4852            Implement a simple query method for the query dialog
4853            (TransientTableBase.create): Add an INTEGER PRIMARY KEY that holds
4854            the row index or shapeid.
4855            (TransientTable.create): Insert the right value of the row index
4856            (TransientJoinedTable.create): Copy the row index of the left
4857            table to the joined result table
4858    
4859            * test/test_transientdb.py
4860            (TestTransientTable.test_transient_table_read_twice): Fix
4861            doc-string
4862            (TestTransientTable.test_transient_table_query): New. Test for the
4863            SimpleQuery method
4864    
4865    2003-05-06  Bernhard Herzog  <[email protected]>
4866    
4867            Convert all table users to use the new table interface. This only
4868            covers Thuban itself, not GREAT-ER or other applications built on
4869            Thuban yet, so the compatibility interface stays in place for the
4870            time being but it now issues DeprecationWarnings.
4871    
4872            Finally, the new Table interface has a new method, HasColumn.
4873    
4874            * Thuban/Model/table.py (OldTableInterfaceMixin): All methods
4875            issue deprecation warnings when they're. The warnings refer to the
4876            caller of the method.
4877            (OldTableInterfaceMixin.__deprecation_warning): New. Helper method
4878            for the deprecation warnings
4879    
4880            * test/test_table.py: Ignore the deprecation warnings for the old
4881            table in the tests in this module. The purpose of the tests is to
4882            test the old interface, after all.
4883    
4884            * test/test_transientdb.py
4885            (TestTransientTable.run_iceland_political_tests): Use the
4886            constants for the types. Add a test for HasColumn
4887            (TestTransientTable.test_transient_joined_table): Adapt to new
4888            table interface. Add a test for HasColumn
4889            (TestTransientTable.test_transient_table_read_twice): Adapt to new
4890            table interface
4891    
4892            * Thuban/UI/tableview.py (DataTable.SetTable, DataTable.GetValue):
4893            Adapt to new table interface
4894    
4895            * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Adapt to
4896            new table interface
4897    
4898            * Thuban/UI/controls.py (RecordListCtrl.fill_list)
4899            (RecordTable.SetTable): Adapt to new table interface
4900    
4901            * Thuban/UI/classifier.py (Classifier.__init__)
4902            (Classifier.__init__): Adapt to new table interface
4903    
4904            * Thuban/UI/classgen.py (ClassGenDialog.__init__)
4905            (GenUniformPanel._OnRetrieve, GenUniquePanel._OnRetrieve): Adapt
4906            to new table interface
4907    
4908            * Thuban/Model/transientdb.py (TransientTableBase.HasColumn)
4909            (AutoTransientTable.HasColumn): Implement the new table interface
4910            method
4911            (AutoTransientTable.ReadRowAsDict, AutoTransientTable.ValueRange)
4912            (AutoTransientTable.UniqueValues): Adapt to new table interface
4913    
4914            * Thuban/Model/layer.py (Layer.SetShapeStore, Layer.GetFieldType):
4915            Adapt to new table interface
4916    
4917            * test/test_layer.py (TestLayer.open_shapefile): Helper method to
4918            simplify opening shapefiles a bit easier.
4919            (TestLayer.test_arc_layer, TestLayer.test_polygon_layer)
4920            (TestLayer.test_point_layer): Use the new helper method
4921            (TestLayer.test_get_field_type): New. Test for the GetFieldType
4922            method
4923    
4924            * test/test_dbf_table.py (TestDBFTable.test_has_column): Test for
4925            the new table method
4926    
4927            * test/test_memory_table.py (TestMemoryTable.test_has_column):
4928            Test for the new table method HasColumn
4929    
4930    2003-05-06  Jonathan Coles   <[email protected]>
4931    
4932            Addresses the "Selection Extent" wish of RTbug #1787.
4933    
4934            * Resources/Bitmaps/fulllayerextent.xpm,
4935            Resources/Bitmaps/fullselextent.xpm: Bitmaps for layer and selection
4936            extent. These are just place holders for the real bitmaps.
4937    
4938            * Thuban/Model/layer.py (Shape): Since a Shape is immutable only
4939            calculate the bounding box once (the first time compute_bbox() is
4940            called).
4941            (Layer.ShapesBoundingBox): New. Given a list of shape ids, return
4942            the bounding box for the shapes in lat/long coordinates.
4943    
4944            * Thuban/UI/mainwindow.py: Added new "Full selection extent" menu
4945            option.
4946            (MainWindow.has_selected_shapes): New. Returns true if there are
4947            any selected shapes.
4948            (MainWindow.FullSelectionExtent): New. Calls
4949            MapCanvas.FitSelectedToWindow() when the user selects the menu option.
4950            (_has_selected_shapes): New. Returns true if there are any
4951            selected shapes.
4952    
4953            * Thuban/UI/selection.py (Selection.HasSelectedShapes): New. Returns
4954            true if there are any selected shapes.
4955    
4956            * Thuban/UI/view.py (MapCanvas): Added delegated method
4957            HasSelectedShapes.
4958            (MapCanvas.FitSelectedToWindow): New. Centers and scales any selected
4959            shapes on the canvas using the map projection (if any).
4960    
4961            * test/test_layer.py (TestLayer.test_arc_layer): Add some tests
4962            for Layer.ShapesBoundingBox().
4963    
4964    2003-05-06  Bernhard Herzog  <[email protected]>
4965    
4966            * Resources/Projections/defaults.proj: Fix spelling of Mercator
4967    
4968    2003-05-05  Jonathan Coles   <[email protected]>
4969    
4970            Addresses the "Full Layer Extent" wish of RTbug #1787.
4971    
4972            * Resources/Projections/defaults.proj: Added UK National Grid.
4973    
4974            * Thuban/UI/mainwindow.py: Added new "Full layer extent" menu option.
4975            (MainWindow.FullLayerExtent): New. Calls MapCanvas.FitLayerToWindow()
4976            when the user selects the menu option.
4977    
4978            * Thuban/UI/view.py (MapCanvas.FitLayerToWindow): New. Centers and
4979            scales the given layer on the canvas using the map projection.
4980    
4981    2003-05-05  Bernhard Herzog  <[email protected]>
4982    
4983            Convert the table implementations to a new table interface. All
4984            tables use a common mixin class to provide backwards compatibility
4985            until all table users have been updated.
4986    
4987            * Thuban/Model/table.py (OldTableInterfaceMixin): Mixin class to
4988            provide backwards compatibility for table classes implementing the
4989            new interface
4990            (DBFTable, MemoryTable): Implement the new table interface. Use
4991            OldTableInterfaceMixin as base for compatibility
4992            (DBFColumn, MemoryColumn): New. Column description for DBFTable
4993            and MemoryTable resp.
4994    
4995            * test/test_dbf_table.py: New. Test cases for the DBFTable with
4996            the new table interface.
4997    
4998            * test/test_memory_table.py: New. Test cases for the MemoryTable
4999            with the new table interface.
5000    
5001            * test/test_table.py: Document the all tests in this file as only
5002            for backwards compatibility. The equivalent tests for the new
5003            interface are in test_memory_table.py and test_dbf_table.py
5004            (MemoryTableTest.test_read): field_info should be returning tuples
5005            with four items
5006            (MemoryTableTest.test_write): Make doc-string a more precise.
5007    
5008            * Thuban/Model/transientdb.py (TransientTableBase): Convert to new
5009            table interface. Derive from from OldTableInterfaceMixin for
5010            compatibility.
5011            (TransientTableBase.create): New intance variable column_map to
5012            map from names and indices to column objects
5013            (TransientTable.create): Use the new table interface of the input
5014            table
5015            (AutoTransientTable): Convert to new table interface. Derive from
5016            from OldTableInterfaceMixin for compatibility.
5017            (AutoTransientTable.write_record): Removed. It's not implemented
5018            yet and we still have to decide how to handle writing with the new
5019            table and data framework.
5020    
5021            * test/test_transientdb.py
5022            (TestTransientTable.run_iceland_political_tests)
5023            (TestTransientTable.test_transient_joined_table): Use the new
5024            table interface
5025    
5026    2003-05-05  Jonathan Coles   <[email protected]>
5027    
5028            This is namely a collection of UI updates to improve user interactivity.
5029            Tabbing between controls now exists and you can use ESC to close dialog
5030            boxes; ENTER will active the default button.
5031    
5032            * Thuban/UI/classgen.py (ClassGenDialog.__init__): Rearrange the
5033            order that the controls are created so that tabbing works correctly.
5034            (ClassGenDialog.OnOK): Renamed from _OnGenerate() so that the
5035            wxDialog can handle the default button correctly.
5036            (ClassGenDialog.OnCancel): Renamed from _OnCloseBtn() for the
5037            same reasons as for OnOK.
5038            (GenUniformPanel._OnRetrieve): Call wxBeginBusyCursor/wxEndBusyCursor
5039            when we ask the table for the maximum/minimum values of a field
5040            which could take a very long time.
5041    
5042            * Thuban/UI/classifier.py (Classifier.__init__): Rearrange the
5043            order that the controls are created so that tabbing works correctly.
5044            (SelectPropertiesDialog.__init__): Rearrange the order that the
5045            controls are created so that tabbing works correctly.
5046    
5047            * Thuban/UI/dialogs.py: Copied NonModalDialog box and changed it
5048            to derive from a wxDialog but behave like the original implementation
5049            which was derived from a wxFrame. wxDialog provides useful key
5050            handling functionality like ESC calling OnCancel and ENTER calling
5051            OnOK which is lost with wxFrame.
5052    
5053            * Thuban/UI/mainwindow.py: Add "..." to menu items that will open
5054            new dialogs.
5055    
5056            * Thuban/UI/projdialog.py (ProjFrame.__init__): Rearrange the
5057            order that the controls are created so that tabbing works correctly.
5058            (ProjFrame.OnApply): Renamed from _OnTry() to use wxDialog behaviour.
5059            (ProjFrame.OnOK): Renamed from _OnOK() to use wxDialog behaviour.
5060            (ProjFrame.OnCancel): Renamed from _OnClose() to use wxDialog behaviour.
5061            (ProjPanel.__init__): Add "Airy" to the list of ellipsoids so we
5062            can provide the "UK National Grid" as a default projection.
5063            (UTMPanel.__init__): Rearrange the order that the controls are
5064            created so that tabbing works correctly.
5065    
5066    2003-05-05  Bernhard Herzog  <[email protected]>
5067    
5068            * extensions/thuban/wxproj.cpp: Fix some of the comments.
5069            (project_point): If a map projection but no layer projection is
5070            given, convert degrees to radians before applying the map
5071            projection.
5072    
5073            * Thuban/UI/tableview.py (TableGrid.disallow_messages)
5074            (TableGrid.allow_messages): New methods to make it possible to
5075            inhibit message sending.
5076            (TableGrid.issue): Only send the message if not inhibited.
5077            (LayerTableGrid.select_shape): Use the new methods to make sure
5078            that no ROW_SELECTED message is sent while we're updating the
5079            selected rows to match the selected shapes.
5080    
5081    2003-05-02  Jan-Oliver Wagner <[email protected]>
5082    
5083            Implementation of MemoryTable.
5084    
5085            * Thuban/Model/table.py (MemoryTable): New. Quite simple table
5086            implementation that operates on a list of tuples. All of the data
5087            are kept in the memory.
5088    
5089            * test/test_table.py (MemoryTableTest): New.
5090    
5091            * test/test_transientdb.py (SimpleTable): Removed.
5092            (TestTransientTable.test_transient_joined_table,
5093            (TestTransientTable.test_transient_table_read_twice): Replaced
5094            SimpleTable by MemoryTable.
5095    
5096    2003-04-30  Jonathan Coles   <[email protected]>
5097    
5098            * Data/iceland_sample.thuban: Now contains correct projections
5099            for each of the layers.
5100    
5101            * Resources/Projections/defaults.proj: Geographic projection
5102            contains unit conversion parameter.
5103    
5104    2003-04-30  Jonathan Coles   <[email protected]>
5105    
5106            The most important part of this putback is the projection changes.
5107            It should now be possible to specify the projection that a layer
5108            is in and then specify a different projection for the map. The
5109            projection dialog has an extra parameter for a geographic projection
5110            which lets the user select if the input is in degrees or radians.
5111    
5112            * Thuban/Model/layer.py (Layer.ShapesInRegion): Fix docstring
5113            to say that the parameter is a tuple of unprojected
5114            points (which is what the callers to this method were assuming).
5115            Also, since the points are unprojected we need to projected them.
5116    
5117            * Thuban/UI/legend.py (LegendTree.MoveCurrentItemUp,
5118            LegendTree.MoveCurrentItemDown): If the layer or any of the layer's
5119            groups are selected, move the layer up/down. Fixes RTbug #1833.
5120    
5121            * Thuban/UI/mainwindow.py: Move menu item map_rename up.
5122    
5123            * Thuban/UI/projdialog.py (ProjFrame._OnSave): Add missing
5124            parameter in call to SetClientData.
5125            (GeoPanel): Add support for selecting the units that the
5126            source data is in (Radians or Degrees).
5127    
5128            * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Optimize
5129            the rendering loop by reducing the number of if's, removing the
5130            unnecessary try/except block, and checking if the old group
5131            is the same as the new one (which happens a lot if there is
5132            no classification, or lots of shapes are in the same group).
5133    
5134            * Thuban/UI/view.py (MapCanvas.OnPaint): Add a try/except block
5135            around the redraw routine to try to catch problems that the user
5136            may create by selecting invalid projections for the data set and
5137            map. Clears the display if there are any problems and prints the
5138            error.
5139            (MapCanvas.do_redraw): Use DC.Clear() instead of drawing a filled
5140            rectangle.
5141    
5142            * extensions/thuban/wxproj.cpp (project_point): First invert the
5143            supplied point (which should be in projected coordinates) using
5144            the layer's projection and then project the point using the
5145            map's projection.
5146            (project_points): Use project_point() to project each point.
5147    
5148    2003-04-30  Jan-Oliver Wagner <[email protected]>
5149    
5150            * Thuban/Model/layer.py (Layer.SetShapeStore): Fixed a bug:
5151            don't set the Classification to None if the classfication field
5152            is None (ie only a DEFAULT).
5153    
5154    2003-04-30  Bernhard Herzog  <[email protected]>
5155    
5156            * Thuban/UI/view.py: Fix some typos.
5157    
5158            * Thuban/UI/mainwindow.py (MainWindow.identify_view_on_demand): Do
5159            not pop up the dialog if the selection becomes empty (this could
5160            happen if e.g. a new selection is opened while the identify tool
5161            is active and dialog had been closed)
5162    
5163    2003-04-30  Bernhard Herzog  <[email protected]>
5164    
5165            * Thuban/Model/transientdb.py (TransientTableBase.__init__): New
5166            instance variable read_record_last_result
5167            (TransientTableBase.read_record): Make sure reading the same
5168            record twice works. The implementation uses the new instance
5169            variable read_record_last_result
5170    
5171            * test/test_transientdb.py
5172            (TestTransientTable.test_transient_table_read_twice): New test
5173            case for the above bug-fix.
5174    
5175    2003-04-29  Jonathan Coles   <[email protected]>
5176    
5177            * Thuban/common.py: Removed. No longer needed Str2Num. RTbug #1832.
5178    
5179            * Thuban/UI/classgen.py: Remove all uses of Str2Num.
5180    
5181            * Thuban/UI/classifier.py: Remove all uses of Str2Num.
5182            (ClassTable.SetValueAsCustom): Rename keyword argument in
5183            ClassGroup* constructors to match argument name.
5184    
5185    2003-04-29  Bernhard Herzog  <[email protected]>
5186    
5187            * Thuban/Model/session.py (Session.Destroy): Explicitly close the
5188            transient DB if it exists to make sure it doesn't leave a journal
5189            file in the temp directory.
5190    
5191            * Thuban/Model/transientdb.py (TransientDatabase.close): Set
5192            self.conn to None after closing the connection to make sure it's
5193            not closed twice
5194    
5195    2003-04-29  Jonathan Coles   <[email protected]>
5196    
5197            Add a visible parameter in the layer XML tag. The default value is
5198            "true". If anything other than "false" is specified we also assume
5199            "true". Addresses RTbug #1025.
5200    
5201            * Doc/thuban.dtd: Add visible parameter to a layer.
5202    
5203            * Thuban/Model/layer.py (BaseLayer.__init__): Change default value
5204            of visible from 1 to True.
5205            (Layer.__init__): Change default value of visible from 1 to True.
5206    
5207            * Thuban/Model/load.py (SessionLoader.start_layer): Read visible
5208            parameter.
5209    
5210            * Thuban/Model/save.py (SessionSaver.write_layer): Save visible
5211            parameter.
5212    
5213            * test/test_load.py: Add new test data contents_test_visible.
5214            (LoadSessionTest.setUp): save test data.
5215            (LoadSessionTest.testLayerVisibility): Test if the visible flag
5216            is loaded correctly.
5217    
5218            * test/test_save.py (SaveSessionTest.testSingleLayer): Add test
5219            for saving an invisible layer.
5220    
5221    2003-04-29  Jonathan Coles   <[email protected]>
5222    
5223            * Thuban/UI/mainwindow.py (MainWindow.SetMap): Look up the
5224            legend dialog box and tell it to change its map to the one
5225            supplied to SetMap(). Fixes RTbug #1770.
5226    
5227  2003-04-29  Bernhard Herzog  <[email protected]>  2003-04-29  Bernhard Herzog  <[email protected]>
5228    
5229          Next step of table implementation. Introduce a transient database          Next step of table implementation. Introduce a transient database
# Line 51  Line 5277 
5277          once. Plus it introduces a reference cycle that keeps can keep the          once. Plus it introduces a reference cycle that keeps can keep the
5278          session object alive for a long time.          session object alive for a long time.
5279    
5280  2003-04-25  Jonathan Coles   <[email protected]>  2003-04-29  Jonathan Coles   <[email protected]>
5281    
5282          * Thuban/Model/proj.py (Projection): Removed Set*() methods to make          * Thuban/Model/proj.py (Projection): Removed Set*() methods to make
5283          Projection an immutable item. Fixes RTbug #1825.          Projection an immutable item. Fixes RTbug #1825.

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

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26