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

Legend:
Removed from v.803  
changed lines
  Added in v.1922

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26