/[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 55 by bh, Tue Sep 11 11:45:27 2001 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]>
5302    
5303            * Data/iceland_sample.thuban: Now contains correct projections
5304            for each of the layers.
5305    
5306            * Resources/Projections/defaults.proj: Geographic projection
5307            contains unit conversion parameter.
5308    
5309    2003-04-30  Jonathan Coles   <[email protected]>
5310    
5311            The most important part of this putback is the projection changes.
5312            It should now be possible to specify the projection that a layer
5313            is in and then specify a different projection for the map. The
5314            projection dialog has an extra parameter for a geographic projection
5315            which lets the user select if the input is in degrees or radians.
5316    
5317            * Thuban/Model/layer.py (Layer.ShapesInRegion): Fix docstring
5318            to say that the parameter is a tuple of unprojected
5319            points (which is what the callers to this method were assuming).
5320            Also, since the points are unprojected we need to projected them.
5321    
5322            * Thuban/UI/legend.py (LegendTree.MoveCurrentItemUp,
5323            LegendTree.MoveCurrentItemDown): If the layer or any of the layer's
5324            groups are selected, move the layer up/down. Fixes RTbug #1833.
5325    
5326            * Thuban/UI/mainwindow.py: Move menu item map_rename up.
5327    
5328            * Thuban/UI/projdialog.py (ProjFrame._OnSave): Add missing
5329            parameter in call to SetClientData.
5330            (GeoPanel): Add support for selecting the units that the
5331            source data is in (Radians or Degrees).
5332    
5333            * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Optimize
5334            the rendering loop by reducing the number of if's, removing the
5335            unnecessary try/except block, and checking if the old group
5336            is the same as the new one (which happens a lot if there is
5337            no classification, or lots of shapes are in the same group).
5338    
5339            * Thuban/UI/view.py (MapCanvas.OnPaint): Add a try/except block
5340            around the redraw routine to try to catch problems that the user
5341            may create by selecting invalid projections for the data set and
5342            map. Clears the display if there are any problems and prints the
5343            error.
5344            (MapCanvas.do_redraw): Use DC.Clear() instead of drawing a filled
5345            rectangle.
5346    
5347            * extensions/thuban/wxproj.cpp (project_point): First invert the
5348            supplied point (which should be in projected coordinates) using
5349            the layer's projection and then project the point using the
5350            map's projection.
5351            (project_points): Use project_point() to project each point.
5352    
5353    2003-04-30  Jan-Oliver Wagner <[email protected]>
5354    
5355            * Thuban/Model/layer.py (Layer.SetShapeStore): Fixed a bug:
5356            don't set the Classification to None if the classfication field
5357            is None (ie only a DEFAULT).
5358    
5359    2003-04-30  Bernhard Herzog  <[email protected]>
5360    
5361            * Thuban/UI/view.py: Fix some typos.
5362    
5363            * Thuban/UI/mainwindow.py (MainWindow.identify_view_on_demand): Do
5364            not pop up the dialog if the selection becomes empty (this could
5365            happen if e.g. a new selection is opened while the identify tool
5366            is active and dialog had been closed)
5367    
5368    2003-04-30  Bernhard Herzog  <[email protected]>
5369    
5370            * Thuban/Model/transientdb.py (TransientTableBase.__init__): New
5371            instance variable read_record_last_result
5372            (TransientTableBase.read_record): Make sure reading the same
5373            record twice works. The implementation uses the new instance
5374            variable read_record_last_result
5375    
5376            * test/test_transientdb.py
5377            (TestTransientTable.test_transient_table_read_twice): New test
5378            case for the above bug-fix.
5379    
5380    2003-04-29  Jonathan Coles   <[email protected]>
5381    
5382            * Thuban/common.py: Removed. No longer needed Str2Num. RTbug #1832.
5383    
5384            * Thuban/UI/classgen.py: Remove all uses of Str2Num.
5385    
5386            * Thuban/UI/classifier.py: Remove all uses of Str2Num.
5387            (ClassTable.SetValueAsCustom): Rename keyword argument in
5388            ClassGroup* constructors to match argument name.
5389    
5390    2003-04-29  Bernhard Herzog  <[email protected]>
5391    
5392            * Thuban/Model/session.py (Session.Destroy): Explicitly close the
5393            transient DB if it exists to make sure it doesn't leave a journal
5394            file in the temp directory.
5395    
5396            * Thuban/Model/transientdb.py (TransientDatabase.close): Set
5397            self.conn to None after closing the connection to make sure it's
5398            not closed twice
5399    
5400    2003-04-29  Jonathan Coles   <[email protected]>
5401    
5402            Add a visible parameter in the layer XML tag. The default value is
5403            "true". If anything other than "false" is specified we also assume
5404            "true". Addresses RTbug #1025.
5405    
5406            * Doc/thuban.dtd: Add visible parameter to a layer.
5407    
5408            * Thuban/Model/layer.py (BaseLayer.__init__): Change default value
5409            of visible from 1 to True.
5410            (Layer.__init__): Change default value of visible from 1 to True.
5411    
5412            * Thuban/Model/load.py (SessionLoader.start_layer): Read visible
5413            parameter.
5414    
5415            * Thuban/Model/save.py (SessionSaver.write_layer): Save visible
5416            parameter.
5417    
5418            * test/test_load.py: Add new test data contents_test_visible.
5419            (LoadSessionTest.setUp): save test data.
5420            (LoadSessionTest.testLayerVisibility): Test if the visible flag
5421            is loaded correctly.
5422    
5423            * test/test_save.py (SaveSessionTest.testSingleLayer): Add test
5424            for saving an invisible layer.
5425    
5426    2003-04-29  Jonathan Coles   <[email protected]>
5427    
5428            * Thuban/UI/mainwindow.py (MainWindow.SetMap): Look up the
5429            legend dialog box and tell it to change its map to the one
5430            supplied to SetMap(). Fixes RTbug #1770.
5431    
5432    2003-04-29  Bernhard Herzog  <[email protected]>
5433    
5434            Next step of table implementation. Introduce a transient database
5435            using SQLite that some of the data is copied to on demand. This
5436            allows us to do joins and other operations that require an index
5437            for good performance with reasonable efficiency. Thuban now needs
5438            SQLite 2.8.0 and pysqlite 0.4.1. Older versions may work but I
5439            haven't tested that.
5440            
5441            * Thuban/Model/transientdb.py: New. Transient database
5442            implementation.
5443    
5444            * test/test_transientdb.py: New. Tests for the transient DB
5445            classes.
5446    
5447            * Thuban/Model/session.py (AutoRemoveFile, AutoRemoveDir): New
5448            classes to help automatically remove temporary files and
5449            directories.
5450            (Session.__init__): New instance variables temp_dir for the
5451            temporary directory and transient_db for the SQLite database
5452            (Session.temp_directory): New. Create a temporary directory if not
5453            yet done and return its name. Use AutoRemoveDir to have it
5454            automatically deleted
5455            (Session.TransientDB): Instantiate the transient database if not
5456            done yet and return it.
5457    
5458            * Thuban/Model/data.py (ShapefileStore.__init__): Use an
5459            AutoTransientTable so that data is copied to the transient DB on
5460            demand.
5461            (SimpleStore): New class that simply combines a table and a
5462            shapefile
5463    
5464            * Thuban/Model/table.py (Table, DBFTable): Rename Table into
5465            DBFTable and update its doc-string to reflect the fact that this
5466            is only the table interface to a DBF file. Table is now an alias
5467            for DBFTable for temporary backwards compatibility.
5468    
5469            * Thuban/UI/application.py (ThubanApplication.OnExit): Make sure
5470            the last reference to the session goes away so that the temporary
5471            files are removed properly.
5472    
5473            * test/test_load.py (LoadSessionTest.tearDown): Remove the
5474            reference to the session to make sure the temporary files are
5475            removed.
5476    
5477    2003-04-29  Bernhard Herzog  <[email protected]>
5478    
5479            * Thuban/Model/load.py (XMLReader.__init__, XMLReader.read): Turn
5480            the __parser instance variable into a normal local variable in
5481            read. It's only used there and read will never be called more than
5482            once. Plus it introduces a reference cycle that keeps can keep the
5483            session object alive for a long time.
5484    
5485    2003-04-29  Jonathan Coles   <[email protected]>
5486    
5487            * Thuban/Model/proj.py (Projection): Removed Set*() methods to make
5488            Projection an immutable item. Fixes RTbug #1825.
5489            (Projection.__init__): Initialize instance variables here.
5490            (ProjFile.Replace): New. Replace the given projection object with
5491            the new projection object. This solves the problem of needing the
5492            mutator Projection.SetProjection() in the ProjFrame class and
5493            allows a projection to change parameters without changing its
5494            location in the file.
5495    
5496            * Thuban/UI/mainwindow.py (MainWindow.SaveSessionAs): Dialog should
5497            be of type wxSAVE and should verify overwriting a file.
5498    
5499            * Thuban/UI/projdialog.py (ProjFrame._OnSave): Use the new
5500            ProjFile.Replace() method instead of the mutator
5501            Projection.SetProjection(). Also requires that we reassign the
5502            client data to the new projection.
5503    
5504            * test/test_proj.py (TestProjection.test): Test GetName() and
5505            GetAllParameters()
5506            (TestProjFile.test): Remove tests for Set*() methods. Add tests
5507            for Replace().
5508    
5509    2003-04-25  Jonathan Coles   <[email protected]>
5510    
5511            * Thuban/Model/save.py (SessionSaver.write_projection): Make sure
5512            to save the name of the projection.
5513    
5514            * test/test_save.py (SaveSessionTest.testLayerProjection): New
5515            test to verify layer projections are saved correctly.
5516    
5517    2003-04-25  Jonathan Coles   <[email protected]>
5518    
5519            * Thuban/Model/proj.py (Projection.SetName): Set the name
5520            to "Unknown" if name is None.
5521            (Projection.SetAllParameters): New. Set the projection's
5522            parameter list to the one supplied.
5523            (Projection.SetProjection): New. Set the projection's
5524            properties to those of the supplied Projection.
5525    
5526            * Thuban/UI/mainwindow.py (MainWindow.MapProjection): Set
5527            the dialog title to include the map's title.
5528            (MainWindow.LayerProjection): Set the dialog title to include
5529            the layer's title.
5530    
5531            * Thuban/UI/projdialog.py (ProjFrame.__ShowError): Consolidate
5532            error dialogs into a single method call.
5533            (ProjFrame.__VerifyButtons): Add more states to check.
5534            (ProjFrame.__GetProjection): Return the current state of an
5535            edited projection or None.
5536            (ProjFrame.__FillAvailList): Remove checks for states that
5537            shouldn't exist.
5538            (ProjFrame._OnNew): Clear all selected items and supply
5539            a projection panel if necessary.
5540    
5541            * test/test_proj.py (TestProjFile.test): Add tests for
5542            ProjFile.SetAllParameters, ProjFile.SetProjection,
5543            ProjFile.SetName.
5544    
5545    2003-04-25  Jonathan Coles   <[email protected]>
5546    
5547            * Thuban/UI/projdialog.py (ProjFrame.__FillAvailList): Now
5548            takes an optional argument to select the current projection.
5549            This does not guarantee that the item is visible due to
5550            limited wxWindows functionality. Fixes RTBug #1821.
5551    
5552    2003-04-25  Jonathan Coles   <[email protected]>
5553    
5554            * Thuban/Model/load.py (SessionLoader.start_projection): Remember
5555            the projection name and use it when constructing the Projection
5556            object.
5557    
5558            * Thuban/Model/proj.py (Projection.__init__): Change the default
5559            value for 'name' to None and then test if name is equal to None
5560            in the body of the constructor. This way the caller doesn't have to
5561            know what the default value should be. Namely, useful in load.py
5562            where we have to pick a default value if the 'name' parameter
5563            doesn't exist in the XML file.
5564    
5565            * test/test_load.py (LoadSessionTest.testLayerProjection): New.
5566            Tests a file where a layer has a projection.
5567    
5568    2003-04-25  Jonathan Coles   <[email protected]>
5569    
5570            * Thuban/Model/layer.py (Layer.TreeInfo): Add an item to the
5571            tree for projection information.
5572    
5573            * Thuban/Model/load.py (XMLReader.GetFilename): Renamed from
5574            XMLReader.GetFileName.
5575            (SessionLoader): Added support for loading projection tags that
5576            appear inside a layer.
5577    
5578            * Thuban/Model/proj.py (ProjFile): Document the class. Move
5579            back to using a list because the order of the projections in
5580            the file is important to maintain. Fixes RTbug #1817.
5581    
5582            * Thuban/Model/resource.py: Rename calls to ProjFile.GetFileName
5583            to ProjFile.GetFilename.
5584    
5585            * Thuban/Model/save.py (SessionSaver.write_layer): Save projection
5586            information.
5587    
5588            * Thuban/UI/projdialog.py (ProjFrame._OnAddToList): Renamed from
5589            ProjFrame._OnSaveAs. Removed old dead code from previous
5590            implementation.
5591            (ProjFrame._OnExport): Add support for exporting more than one
5592            projection to a single file.
5593            (ProjFrame.__FillAvailList): use string formatting (% operator)
5594            to build strings that are (partly) translated. Fixes RTbug #1818.
5595    
5596            * test/test_proj.py (TestProjFile.test): New. Tests the base ProjFile
5597            class.
5598    
5599    2003-04-24  Bernhard Herzog  <[email protected]>
5600    
5601            * po/es.po: Updated Spanish translation by Daniel Calvelo Aros
5602    
5603            * po/fr.po: New. French translation by Daniel Calvelo Aros
5604    
5605            * Thuban/UI/projdialog.py (ProjFrame._OnSaveAs): Don't translate
5606            empty strings.
5607    
5608    2003-04-24  Jonathan Coles   <[email protected]>
5609    
5610            * Thuban/Model/layer.py (Layer.GetProjection): New. Needed to
5611            implement the interface that the ProjFrame dialog expects.
5612    
5613            * Thuban/Model/proj.py (Projection.SetName): New. Allows the
5614            name of the projection to be changed.
5615            (ProjFile): Use a dictionary instead of a list so that removing
5616            projections is easier and we are sure about uniqueness.
5617            (ProjFile.Remove): Remove the given projection object.
5618    
5619            * Thuban/Model/resource.py (GetSystemProjFiles, GetUserProjFiles):
5620            Return a list with only one projection file instead of searching for
5621            any projection file. This simplifies many things if the user can
5622            only have one system file and one user file.
5623    
5624            * Thuban/UI/classgen.py: Change all references to
5625            genCombo to genChoice.
5626    
5627            * Thuban/UI/mainwindow.py: Add a Projection option under the
5628            layer menu.
5629            (MainWindow.LayerProjection): New. Open up a projection window
5630            for a layer.
5631    
5632            * Thuban/UI/projdialog.py: Large changes to how the dialog is
5633            laid out. Use three panels instead of one. One for the list of
5634            projections, one for the edit controls, and one for the buttons.
5635            Fixed resizing problems so that the dialog resizes correctly
5636            when the projection panel changes. Added import/export, save, and
5637            new buttons/functionality.
5638    
5639    2003-04-24  Bernhard Herzog  <[email protected]>
5640    
5641            First step towards table management. Introduce a simple data
5642            abstraction so that we replace the data a layer uses more easily
5643            in the next step.
5644    
5645            * Thuban/Model/data.py: New file with a simple data abstraction
5646            that bundles shapefile and dbffile into one object.
5647    
5648            * Thuban/Model/session.py (Session.OpenShapefile): New method to
5649            open shapefiles and return a shape store object
5650    
5651            * Thuban/Model/layer.py (Layer.__init__): Pass the data as a store
5652            object instead of a shapefile filename. This introduces a new
5653            instance variable store holding the datastore. For intermediate
5654            backwards compatibility keep the old instance variables.
5655            (open_shapefile): Removed. No longer needed with the shape store.
5656            (Layer.SetShapeStore, Layer.ShapeStore): New methods to set and
5657            get the shape store used by a layer.
5658            (Layer.Destroy): No need to explicitly destroy the shapefile or
5659            table anymore.
5660    
5661            * Thuban/UI/mainwindow.py (MainWindow.AddLayer)
5662            (MainWindow.AddLayer): Use the session's OpenShapefile method to
5663            open shapefiles
5664    
5665            * Thuban/Model/load.py (ProcessSession.start_layer): Use the
5666            session's OpenShapefile method to open shapefiles
5667    
5668            * test/test_classification.py
5669            (TestClassification.test_classification): Use the session's
5670            OpenShapefile method to open shapefiles and build the filename in
5671            a more platform independed way
5672    
5673            * test/test_layer.py (TestLayer.setUp, TestLayer.tearDown):
5674            Implement to have a session to use in the tests
5675            (TestLayer.test_arc_layer, TestLayer.test_polygon_layer)
5676            (TestLayer.test_point_layer, TestLayer.test_empty_layer): Use the
5677            session's OpenShapefile method to open shapefiles
5678            (TestLayerLegend.setUp): Instantiate a session so that we can use
5679            it to open shapefiles.
5680            (TestLayerLegend.tearDown): Make sure that all references to
5681            layers and session are removed otherwise we may get a resource
5682            leak
5683    
5684            * test/test_map.py (TestMapAddLayer.test_add_layer)
5685            (TestMapWithContents.setUp): Instantiate a session so that we can
5686            use it to open shapefiles.
5687            (TestMapWithContents.tearDown): Make sure that all references to
5688            layers, maps and sessions are removed otherwise we may get a
5689            resource leak
5690            ("__main__"): use support.run_tests() so that more info about
5691            uncollected garbage is printed
5692    
5693            * test/test_save.py (SaveSessionTest.testSingleLayer): Use the
5694            session's OpenShapefile method to open shapefiles
5695            ("__main__"): use support.run_tests() so that more info about
5696            uncollected garbage is printed
5697    
5698            * test/test_selection.py (TestSelection.tearDown): Make sure that
5699            all references to the session and the selection are removed
5700            otherwise we may get a resource leak
5701            (TestSelection.get_layer): Instantiate a session so that we can
5702            use it to open shapefiles.
5703            ("__main__"): use support.run_tests() so that more info about
5704            uncollected garbage is printed
5705    
5706            * test/test_session.py (TestSessionBase.tearDown)
5707            (TestSessionWithContent.tearDown): Make sure that all references
5708            to the session and layers are removed otherwise we may get a
5709            resource leak
5710            (TestSessionWithContent.setUp): Use the session's OpenShapefile
5711            method to open shapefiles
5712    
5713    2003-04-24  Jonathan Coles   <[email protected]>
5714    
5715            * Thuban/Model/load.py (XMLReader.read): Should have been checking
5716            if the file_or_filename object had the 'read' attribute.
5717    
5718    2003-04-23  Jonathan Coles   <[email protected]>
5719    
5720            * Thuban/Model/resource.py: Fixes RTbug #1813.
5721            (ReadProjFile): Add documentation about which exceptions are raised.
5722            Always pass the exceptions up to the caller.
5723            (GetProjFiles): If the directory can't be read return an empty list.
5724            If any of the proj files can't be read skip that file and go
5725            on to the next one.
5726    
5727            * test/test_proj.py: Added test cases to handle nonexistent files,
5728            unreadable files, and files that don't parse correctly.
5729    
5730    2003-04-23  Jonathan Coles   <[email protected]>
5731    
5732            Projection dialog. Allows the user to select from a list
5733            of projection templates and optionally edit them and save new ones.
5734    
5735            * Thuban/UI/projdialog.py (ProjFrame): New. Main dialog.
5736            (ProjPanel): Base class for projection specific panels.
5737            (TMPanel): Projection panel for Transverse Mercartor.
5738            (UTMPanel): Projection panel for Universal Transverse Mercartor.
5739            (LCCPanel): Projection panel for Lambert Conic Conformal.
5740            (GeoPanel): Projetion panel for Geographic Projection.
5741    
5742    2003-04-23  Jonathan Coles   <[email protected]>
5743    
5744            * Thuban/Model/load.py (XMLReader): Renamed from XMLProcessor to
5745            promote symmetry. There now exists XMLReader and XMLWriter.
5746            (XMLReader.read): New. Call to read the given file descriptor or
5747            filename.
5748            (XMLReader.close): New. Make sure the file is closed.
5749            (XMLReader.GetFileName): New. Return just the file name that is being
5750            read from.
5751            (XMLReader.GetDirectory): New. Return just the directory of the file
5752            that is being read.
5753            (XMLReader.AddDispatchers): New. Take a dictionary which contains
5754            the names of functions to call as the XML tree is parsed.
5755            (XMLReader.startElementNS): Updated to use new dispatcher dictionary.
5756            (XMLReader.endElementNS): Updated to use new dispatcher dictionary.
5757            (SessionLoader): Removed class variables start_dispatcher and
5758            end_dispatcher since this functionality is now part of a class
5759            instance. Fixes RTbug #1808.
5760            (SessionLoader.__init__): Add dispatcher functions.
5761            (load_xmlfile): Code was moved into the XMLReader.read().
5762            (load_session): Use modified SessionLoader.
5763    
5764            * Thuban/Model/map.py (Map.GetProjection): New. Returns the
5765            map's projection.
5766    
5767            * Thuban/Model/proj.py (Projection.GetParameters): Renamed to
5768            GetAllParameters.
5769            (Projection.GetParameter): Returns the value for the given parameter.
5770    
5771            * Thuban/Model/resource.py: Use XMLReader and XMLWriter.
5772            (GetProjFiles): Renamed from GetProjections. Now returns a list
5773            of ProjFile objects.
5774            (GetSystemProjFiles): Renamed from GetSuppliedProjections. Returns
5775            a list of ProjFile objects whose files are not user defined.
5776            (GetUserProjFiles): Renamed from GetUserProjections. Returns a
5777            list of ProjFile objects whose files are user defined.
5778            (ProjFileReader): Extend new XMLReader.
5779    
5780            * Thuban/Model/save.py (XMLWriter): Renamed from XMLSaver to
5781            promote symmetry.
5782    
5783            * Thuban/UI/classgen.py (ClassGenDialog.__init__): Use a wxChoice
5784            control instead of a wxComboBox. wxChoice controls do not generate
5785            events as the uses highlights possible choices which fixes problems
5786            with resizing the dialog when the use selects an option.
5787    
5788            * Thuban/UI/classifier.py (Classifier.__init__): Use a wxChoice
5789            control instead of a wxComboBox.
5790    
5791            * Thuban/UI/mainwindow.py (MainWindow.Projection): Use new projection
5792            dialog.
5793    
5794            * test/test_proj.py (TestProjection.test): New tests for GetParameter
5795            method.
5796    
5797    2003-04-22  Bernhard Herzog  <[email protected]>
5798    
5799            * Thuban/UI/mainwindow.py: Remove some unused imports and global
5800            constants
5801    
5802            * Thuban/UI/identifyview.py (IdentifyListCtrl.selected_shape)
5803            (IdentifyGridCtrl.selected_shape): Use table, not shapetable.
5804    
5805    2003-04-17  Bernhard Herzog  <[email protected]>
5806    
5807            * Thuban/Model/layer.py: Don't import LAYER_LEGEND_CHANGED.
5808            (Layer): Update doc-string since LAYER_LEGEND_CHANGED is not used
5809            anymore.
5810            (Layer.BoundingBox, Layer.GetFieldType, Layer.NumShapes)
5811            (Layer.ShapeType, Layer.Shape): No need to call
5812            self.open_shapefile since it's always called in __init__
5813    
5814            * Thuban/UI/application.py (ThubanApplication.MainLoop): Removed.
5815            In wxPython 2.4 there's no need to extend MainLoop anymore since
5816            wxPython itself makes sure OnExit is called.
5817    
5818    2003-04-16  Jonathan Coles   <[email protected]>
5819    
5820            Initial putback of projection management code. Includes new
5821            classes to read and write projection files. The current load
5822            and save classes were abstracted a bit so they could be reused.
5823            The Projection class was extended to provide new methods and
5824            have a name.
5825    
5826            * Thuban/Model/load.py (XMLProcessor): New. Contains all the
5827            general XML reading methods that were part of ProcessSession.
5828    
5829            * Thuban/Model/proj.py (Projection.__init__): Accepts an optional
5830            name.
5831            (ProjFile): New. Represents a file that contains projection
5832            information.
5833    
5834            * Thuban/Model/resource.py: New. Contains general utilities
5835            for read and writing projection files.
5836    
5837            * Thuban/Model/save.py (XMLSaver): New. Contains all the
5838            general XML writing methods that were part of SessionSaver.
5839            (SessionSaver): Renamed from Saver.
5840    
5841            * test/test_proj.py: New test cases for the projection
5842            file read and write functions.
5843    
5844    2003-04-16  Jonathan Coles   <[email protected]>
5845    
5846            * Thuban/Model/classification.py: Use repr() around values
5847            in the ClassGroup*.__repr__() methods so it is clearer when
5848            a value is a string and when it is a number.
5849    
5850            * test/test_load.py: Rework the classification test to test
5851            that we can load old files.
5852            (testLabels): Test a file where the groups have labels.
5853    
5854    2003-04-16  Bernhard Herzog  <[email protected]>
5855    
5856            Safer implementation of the performance enhancements of the
5857            low-level renderer:
5858            
5859            * extensions/thuban/wxproj.cpp (extract_projection)
5860            (extract_pointer): Rename extract_projection to extract_pointer
5861            and redefine its purpose to return the pointer stored in a CObject
5862            returned by the object's cobject method. Update all callers.
5863            (s_draw_info, free_draw_info, draw_polygon_init): Implement the
5864            handling of these low-level parameters so that each s_draw_info
5865            instance is handled as a CObject at python level that also
5866            contains real references to the actual python objects which
5867            contain the values in the struct. Add free_draw_info as the
5868            destructor.
5869            (draw_polygon_shape): Add the py_draw_info parameter which must a
5870            cobject containing an s_draw_info pointer.
5871    
5872            * Thuban/UI/renderer.py (MapRenderer.polygon_render_param): New
5873            method to instantiat the low-level render parameter
5874            (MapRenderer.draw_shape_layer): Use the new method. Remove some
5875            commented out code.
5876            (MapRenderer.draw_polygon_shape): Make the first parameter not the
5877            layer but the low-level render parameter
5878            (ScreenRenderer.draw_shape_layer): Use the low-level render
5879            parameter.
5880    
5881    2003-04-15  Jonathan Coles   <[email protected]>
5882    
5883            * Thuban/Model/classification.py: Implemented __repr__ for
5884            the ClassGroup* classes to make debugging a bit easier.
5885            (ClassGroup.SetLabel): Check that the string is an instance
5886            of StringTypes not StringType. Accounts for Unicode strings.
5887    
5888            * Thuban/Model/color.py: Implemented __repr__ to make
5889            debugging a bit easier.
5890    
5891            * Thuban/Model/save.py (Saver.write_classification): Need to
5892            save the group label.
5893    
5894            * test/test_load.py (testClassification): New. Loads the
5895            iceland_sample_test.thuban file and checks if it was loaded
5896            correctly.
5897    
5898    2003-04-15  Jonathan Coles   <[email protected]>
5899    
5900            * extensions/thuban/wxproj.cpp (draw_polygon_init): New. Used
5901            to improve rendering performance by initializing the variables
5902            that are not change each time draw_polygon_shape() is called.
5903            The values are stored in a global struct draw_info.
5904            (draw_polygon_shape): Removed initialization code that is
5905            now in draw_polygon_init().
5906    
5907            * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Make
5908            drawing initialization call to draw_polygon_init()
5909            (MapRenderer.draw_polygon_shape): Use new signature of
5910            draw_polygon_shape.
5911    
5912            * Thuban/UI/classgen.py (GenUniformPanel): Fix spin control
5913            weirdness by setting the range to (1, maxint).
5914    
5915            * Thuban/Model/classification.py (ClassGroupProperties): Make
5916            instance variables private and optimize comparison operator
5917            by first checking if the color references are the same.
5918            (ClassGroupSingleton): Make instance variables private.
5919            (ClassGroupRange): Make instance variables private.
5920    
5921            * HOWTO-Release: Filled in missing steps for releasing packages.
5922    
5923    2003-04-15  Bernhard Herzog  <[email protected]>
5924    
5925            First stab at internationalized messages:
5926    
5927            * Thuban/__init__.py (_): Implement the translation function for
5928            real using the python gettext module.
5929    
5930            * Thuban/UI/classifier.py (ClassTable.GetRowLabelValue): Don't
5931            translate empty strings.
5932    
5933            * Thuban/UI/application.py (ThubanApplication.read_startup_files):
5934            Add a missing space to a warning message
5935    
5936            * po/README: New. Notes about the management of the translation
5937            files.
5938    
5939            * po/Makefile: New. Makefile to help manage the translation files.
5940    
5941            * po/es.po: New. Spanish translation by Daniel Calvelo Aros
5942    
5943            * MANIFEST.in: Include the *.mo files in Resources/Locale and the
5944            translations and support files in po/
5945    
5946            * setup.py (data_files): Add the *.mo files to the data_files too
5947    
5948            * README: Add note about the translations when building from CVS
5949    
5950    2003-04-14  Jonathan Coles   <[email protected]>
5951    
5952            * Thuban/UI/dock.py: Fixes some window resizing problems most
5953            noticable under windows. Always assume the button bitmaps will
5954            be there. Code clean up.
5955            (DockabelWindow.Dock, DockableWindow.UnDock): Force all the
5956            images for the dock/undock button to the same images.
5957            Work around for RTbug #1801.
5958    
5959            * Thuban/UI/legend.py (LegendPanel.__init__): The toolbar should
5960            be allowed to grow within the sizer. Fixes a bug under Windows
5961            where the toolbar wasn't being drawn.
5962    
5963    2003-04-14  Frank Koormann   <[email protected]>
5964    
5965            * Resources/Bitmaps/dock_12.xpm, Resources/Bitmaps/undock_12.xpm:
5966            Updated design to try to make the button functionality more
5967            transparent.
5968    
5969    2003-04-14  Jonathan Coles   <[email protected]>
5970    
5971            * Thuban/UI/legend.py (LegendPanel.__init__): Call Create() to
5972            finalize the intialization of the panel.
5973    
5974            * Thuban/UI/dock.py (DockPanel.Create): New. Finalizes the
5975            creation of the panel. Should be the last thing called in the
5976            initializer of a subclass.
5977    
5978            * Thuban/UI/classgen.py (ClassGenDialog.__init__): Actively
5979            set the current selections in the combo boxes. This is needed
5980            under Windows.
5981    
5982            * Thuban/UI/classifier.py (Classifier.__init__): Add a top
5983            level panel to the dialog so that the background colors are
5984            consistent under Windows.
5985    
5986    2003-04-11  Jonathan Coles   <[email protected]>
5987    
5988            * Thuban/UI/classgen.py: Change color ramps to start at white
5989            not black.
5990    
5991            * Thuban/UI/legend.py: Enable/disable the legend buttons when
5992            the legend changes. Fixes RTbug #1793.
5993    
5994            * test/test_classification.py: Added test for copying of
5995            classifications.
5996    
5997    2003-04-11  Jonathan Coles   <[email protected]>
5998    
5999            * Thuban/UI/resource.py: New. Centralize the loading of resources
6000            such as bitmaps.
6001    
6002            * Thuban/UI/classgen.py (GenUniquePanel.__init__): Reordered buttons,
6003            added images to the move buttons, added 'reverse' button.
6004            (CustomRampPanel.__init__): Added images to the move buttons.
6005            (GreyRamp): New. Generates a ramp from white to black.
6006            (HotToColdRamp): New. Generates a ramp from cold to hot colors.
6007    
6008            * Thuban/UI/classifier.py: Refactored ID's from ID_CLASSIFY_* to
6009            ID_PROPERTY_*.
6010            (Classifier.__init__): Minor changes to the layout.
6011            (Classifier._OnTitleChanged): Listen for when the user edits the
6012            title and update the dialog's title and the layer's title.
6013    
6014            * Thuban/UI/dock.py: Use new bitmaps for the control buttons.
6015    
6016            * Thuban/UI/legend.py: Use new bitmaps for the control buttons.
6017            (LegendTree._OnMsgLayerTitleChanged): Change the displayed title
6018            if the layer's title changes.
6019    
6020            * Thuban/UI/mainwindow.py: Added new menu item and associated code
6021            to open a dialog to rename the map.
6022            (MainWindow): Use new resource class to import bitmaps.
6023    
6024    2003-04-11  Jonathan Coles   <[email protected]>
6025    
6026            * Resources/Bitmaps/close_12.xpm, Resources/Bitmaps/dock_12.xpm,
6027            Resources/Bitmaps/group_use.xpm, Resources/Bitmaps/group_use_all.xpm,
6028            Resources/Bitmaps/group_use_none.xpm,
6029            Resources/Bitmaps/group_use_not.xpm,
6030            Resources/Bitmaps/hide_layer.xpm,
6031            Resources/Bitmaps/layer_properties.xpm,
6032            Resources/Bitmaps/lower_layer.xpm, Resources/Bitmaps/raise_layer.xpm,
6033            Resources/Bitmaps/show_layer.xpm, Resources/Bitmaps/undock_12.xpm:
6034            New.
6035    
6036    2003-04-10  Jonathan Coles   <[email protected]>
6037    
6038            * Thuban/Model/classification.py: (ClassGroupRange.__init__):
6039            Should pass group to ClassGroup constructor.
6040    
6041    2003-04-10  Jonathan Coles   <[email protected]>
6042    
6043            * Thuban/Model/classification.py: (ClassGroup): Move all the common
6044            methods of the derived classes ([Set|Get]Properties(), __eq__, __ne__)
6045            here. Implement SetVisible(), IsVisible().
6046            (ClassGroup.__init__): Add group parameter which acts as a copy
6047            constructor.
6048    
6049            * Thuban/UI/classifier.py (ClassTable): Add a new column for the
6050            "Visible" check boxes.
6051            (Classifier): Rename the buttons and refactor the code to match
6052            the new labels.
6053    
6054            * Thuban/UI/legend.py: Classify button is now called "Properties".
6055            Refactored the code to change variable names.
6056            (LegendTree.__FillTreeLayer): Only list a group if it is visible.
6057    
6058            * Thuban/UI/mainwindow.py: MainWindow.OpenClassifier renamed to
6059            MainWindow.OpenLayerProperties. MainWindow.LayerEditProperties
6060            renamed to MainWindow.LayerEditProperties.
6061            (MainWindow.ToggleLegend): Don't include map name in legend title.
6062            (MainWindow.SetMap): Added the map name to the window title.
6063            (MainWindow.LayerFillColor, MainWindow.LayerTransparentFill,
6064            MainWindow.LayerOutlineColor, MainWindow.LayerNoOutline): Removed.
6065            Functionality is found in the layer properties dialog.
6066    
6067            * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Only
6068            draw visible groups.
6069    
6070    2003-04-09  Jonathan Coles   <[email protected]>
6071    
6072            * Thuban/UI/classgen.py: Modifications to allow simple
6073            addition and selection of new color schemes.
6074            (MonochromaticRamp): New. Generates a ramp between two colors.
6075            (RedRamp): New. Generates a ramp of all red.
6076            (GreenRamp): New. Generates a ramp of all green.
6077            (BlueRamp): New. Generates a ramp of all blue.
6078    
6079    2003-04-09  Jonathan Coles   <[email protected]>
6080    
6081            * Thuban/Model/classification.py (Classification.__deepcopy__):
6082            Need to copy over field and fieldType attributes.
6083    
6084            * Thuban/Model/table.py (Table.field_range): New. Retrive the
6085            maximum and minimum values over the entire table for a given
6086            field.
6087            (Table.GetUniqueValues): New. Retrieve all the unique values
6088            in the table for a given field.
6089    
6090            * Thuban/UI/classgen.py: Renamed GenRangePanel to GenUniformPanel.
6091            (GenUniquePanel): New. Controls to allow the user to select
6092            which unique field values they would like in the classification.
6093            (CustomRampPanel): Code that was in ClassGenDialog that allows
6094            the user to select the properties for a custom ramp.
6095            (ClassGenerator.GenUniformDistribution): Was called GenerateRanges.
6096    
6097            * Thuban/UI/classifier.py: Removed a lot of debugging code.
6098            (Classifier._SetClassification): Callback method so that the
6099            class generator can set the classification in the grid.
6100            (ClassGroupPropertiesCtrl): New. Encapsulates the drawing and
6101            editing of a group properties class into a wxWindows control.
6102    
6103            * Thuban/UI/dock.py: It was decided that if the user closes
6104            a dockable window the window should simply hide itself. That
6105            way if the user wants to show the dock again it appears in the
6106            same place as it was when it was closed.
6107            (DockableWindow.Destroy): Call renamed method OnDockDestroy().
6108            (DockableWindow._OnButtonClose): Hide the window instead of
6109            destroying it.
6110            (DockableWindow._OnClose): Hide the window instead of
6111            destroying it.
6112    
6113            * Thuban/UI/legend.py (LegendTree): Use a private method to
6114            consistently set the font and style of the text. Fixes RTbug #1786.
6115    
6116            * Thuban/UI/mainwindow.py: Import just the Classifier class.
6117    
6118    2003-04-07  Bernhard Herzog  <[email protected]>
6119    
6120            * Thuban/UI/mainwindow.py (main_menu): Move the toggle_legend item
6121            to the map module
6122    
6123    2003-04-07  Bernhard Herzog  <[email protected]>
6124    
6125            * Thuban/UI/mainwindow.py (MainWindow.ShowSessionTree): Removed in
6126            favor of ToggleSessionTree
6127            (MainWindow.ToggleSessionTree): New method to toggle visibility of
6128            the session tree.
6129            (MainWindow.SessionTreeShown): New method to return whether the
6130            session tree is currently shown.
6131            (MainWindow.ToggleLegend): New method to toggle visibility of the
6132            legend
6133            (MainWindow.ShowLegend): Implement in terms of ToggleLegend and
6134            LegendShown
6135            (MainWindow.LegendShown): New method to return whether the legend
6136            is currently shown.
6137            (_method_command): Add checked parameter so we can define check
6138            menu items
6139            (_has_tree_window_shown, _has_legend_shown): Use the appropriate
6140            mainwindow methods.
6141            (show_session_tree, show_legend commands): Removed.
6142            (toggle_session_tree, toggle_legend commands): New commands to
6143            toggle the visibility of the dialogs
6144    
6145    2003-04-07  Jonathan Coles   <[email protected]>
6146    
6147            * Thuban/UI/classgen.py: Fix Windows problem.
6148    
6149            * Thuban/UI/dock.py: Fix Windows problem.
6150    
6151            * Thuban/UI/mainwindow.py: Use False instead of false.
6152            (MainWindow.ShowLegend): Remove unnecessary switch parameter.
6153    
6154    2003-04-07  Jonathan Coles   <[email protected]>
6155    
6156            Since we now say that the order of the groups in a classification
6157            matters, it makes sense to be able to manipulate that order. Most
6158            of the changes to Thuban/Model/classification.py are to that end.
6159    
6160            * Thuban/Model/classification.py (Classification.AppendGroup,
6161            Classification.InsertGroup, Classification.ReplaceGroup,
6162            Classification.RemoveGroup, Classification.GetGroup): Do as the
6163            names imply.
6164            (Classification.FindGroup): This was called GetGroup, but GetGroup
6165            takes an index, while FindGroup takes a value.
6166            (Classification.__deepcopy__): Copy all the groups, BUT NOT THE LAYER
6167            REFERENCE. Currently there is a cyclic reference between the layer
6168            and its classification. If the classification doesn't need to know
6169            its owning layer we can change this, since it may make sense to be
6170            able to use the same classification with different layers.
6171    
6172            * Thuban/Model/load.py: Use Classification.AppendGroup(), not AddGroup()
6173    
6174            * Thuban/UI/classgen.py: Use Classification.AppendGroup(),
6175            not AddGroup()
6176    
6177            * Thuban/UI/classifier.py: Now that we can depend on the order in
6178            a Classification and have methods to manipulate that order we don't
6179            need to use our own data structures in the grid. We can simply make
6180            the grid/table access the information they need from a copy of
6181            the classification object.
6182            (Classifier._OnCloseBtn): Event handler for when the user clicks
6183            'Close'. This is needed so if the user applies changes and then
6184            continues to change the table the user has the option of discarding
6185            the most recent changes and keeping what they applied.
6186    
6187            * Thuban/UI/mainwindow.py: Put "Show Legend" and "Show Session Tree"
6188            into the same group.
6189    
6190            * extensions/thuban/wxproj.cpp (check_version): If Thuban is compiled
6191            with a really old version of proj, PJ_VERSION won't even be defined.
6192            If it isn't defined then just compile so that the function always
6193            returns Py_False.
6194    
6195            * test/test_classification.py: Fix tests to use the renamed methods.
6196            Still need to write tests for the new methods.
6197    
6198    2003-04-04  Jonathan Coles   <[email protected]>
6199    
6200            * Thuban/UI/classifier.py (Classifier.__SelectField): Move the
6201            call to SetSelection out of the method and before the call
6202            to __SelectField in __init__. This prevents a recursion of events
6203            when _OnFieldSelect is triggered by the user.
6204    
6205    2003-04-04  Jonathan Coles   <[email protected]>
6206    
6207            * Thuban/Model/classification.py: Rename Color.None to
6208            Color.Transparent.
6209            (ClassGroupProperties.SetLineColori, ClassGroupProperties.SetFill):
6210            Don't bother copying the color, since Colors are immutable.
6211    
6212            * Thuban/Model/color.py, Thuban/Model/layer.py, Thuban/Model/load.py,
6213            Thuban/UI/classifier.py, Thuban/UI/mainwindow.py,
6214            Thuban/UI/renderer.py, Thuban/UI/view.py:
6215            Rename Color.None to Color.Transparent.
6216        
6217            * test/test_classification.py, test/test_load.py: Rename Color.None
6218            to Color.Transparent.
6219    
6220    2003-04-04  Jonathan Coles   <[email protected]>
6221    
6222            * Thuban/Model/classification.py: Fix assert calls.
6223            (ClassGroupProperties.SetLineColor, ClassGroupProperties.SetFill):
6224            Copy the color parameter rather than hold onto a reference.
6225    
6226            * Thuban/Model/color.py (Color.__copy__, Color.__deepcopy): Copy
6227            the color object.
6228            (NoColor.__copy__, NoColor.__deepcopy): Return 'self' so that we
6229            are sure there exists only one refernce to Color.None in the system.
6230            This allows us to use 'is' rather than the comparision functions.
6231            
6232            * Thuban/Model/save.py: Fix assert calls.
6233            
6234            * Thuban/UI/classifier.py: Fix assert calls.
6235            (ClassGrid._OnCellDClick): Call up to the classifier to open the
6236            dialog to edit the groups properties.
6237            (ClassGrid._OnCellResize): Make sure that the scollbars are drawn
6238            correctly if a cell is resized.
6239            (ClassTable.SetClassification): New. Changes the classification
6240            that is in the table.
6241            (ClassTable.__SetRow): Allow groups to be prepended.
6242            (Classifier): New code for opening the EditProperties and
6243            GenerateRanges dialogs.
6244            (SelectPropertiesDialog.__GetColor): Only set the color in the
6245            color dialog if the current color is not None.
6246            
6247            * Thuban/UI/dock.py: Fix assert calls.
6248            
6249            * Thuban/UI/legend.py: Fix assert calls.
6250            
6251            * Thuban/UI/renderer.py: Fix assert calls.
6252            
6253            * Thuban/UI/classgen.py (ClassGenDialog): Dialog for generating
6254            classifications.
6255            (GenRangePanel): Panel specific to range generation.
6256            (GenSingletonPanel): Panel specific to singleton generation.
6257            (ClassGenerator): Class responsible for actually generating
6258            the classification from the data gathered in the dialog box.
6259            (PropertyRamp): Generates properties whose values range from
6260            a starting property to an ending property.
6261    
6262    2003-04-03  Bernhard Herzog  <[email protected]>
6263    
6264            * test/support.py (print_garbage_information): New function that
6265            prints information about still connected messages and memory
6266            leaks.
6267            (run_suite): Removed.
6268            (run_tests): New function for use as a replacement of
6269            unittest.main in the test_* files. This one calls
6270            print_garbage_information at the end.
6271    
6272            * test/runtests.py (main): Use support.print_garbage_information
6273    
6274            * test/test_layer.py: Use support.run_tests instead of
6275            unittest.main so we get memory leak information
6276            (TestLayer.test_arc_layer, TestLayer.test_polygon_layer)
6277            (TestLayer.test_point_layer, TestLayer.test_empty_layer)
6278            (TestLayerLegend.test_visibility): Call the layer's Destroy method
6279            to fix a memory leak.
6280    
6281            * test/test_classification.py: Use support.run_tests instead of
6282            unittest.main so we get memory leak information
6283            (TestClassification.test_classification): Call the layer's Destroy
6284            method to fix a memory leak.
6285    
6286    2003-04-02  Bernhard Herzog  <[email protected]>
6287    
6288            * extensions/thuban/wxproj.cpp (check_version, check_version_gtk):
6289            Handle the reference counts of the return value and errors in
6290            PyArg_ParseTuple correctly.
6291    
6292            * Thuban/UI/application.py (ThubanApplication.OpenSession): Make
6293            sure the filename is absolute to avoid problems when saving the
6294            session again
6295    
6296            * Thuban/Model/table.py: Remove unnecessary import. Fix a typo.
6297    
6298    2003-04-01  Jonathan Coles   <[email protected]>
6299    
6300            *  Thuban/UI/renderer.py (MapRenderer.draw_point_shape): Check
6301            that there actually are points in the returned list of points
6302            before trying to index into the list. The list may be empty if
6303            the shape is a Null Shape.
6304    
6305    2003-04-01  Bernhard Herzog  <[email protected]>
6306    
6307            * test/test_map.py: Don't use from <module> import *
6308    
6309    2003-04-01  Jonathan Coles   <[email protected]>
6310    
6311            * Thuban/Model/session.py: Use LAYER_CHANGED instead of
6312            LAYER_LEGEND_CHANGED
6313    
6314            * Thuban/UI/dock.py (DockableWindow._OnButtonClose): Call
6315            self.Destroy() to close the window after yesterday's changes.
6316    
6317            * test/test_map.py, test/test_session.py: Fix messages that
6318            are sent from maps and layers.
6319    
6320    2003-03-31  Jonathan Coles   <[email protected]>
6321    
6322            * Thuban/UI/classifier.py: Commented out some debugging statements.
6323            (ClassDataPreviewer.Draw): Draw rectangles for polygon layers per
6324            RTbug #1769.
6325    
6326            * Thuban/UI/dock.py (DockableWindow.UnDock): Restore size and
6327            position (although position doesn't work yet under GTK).
6328            (DockableWindow.Destroy): New. Called when the window must be
6329            closed. Namely needed when the DockFrame closes and must close
6330            its children.
6331            (DockFrame): Listen for EVT_CLOSE and destroy all children.
6332    
6333            * Thuban/UI/legend.py (LegendPanel.Destroy): New. Cleans up
6334            when then window is told to close.
6335            (LegendTree._OnMsgLayerChanged): Fixes a seg fault bug. See
6336            comment in source for more info.
6337    
6338            * Thuban/UI/main.py: Show the legend by default when Thuban starts.
6339    
6340            * Thuban/UI/mainwindow.py: Renamed OnClose to _OnClose for
6341            symmetry with other such methods.
6342            (MainWindow.ShowLegend): Show the legend docked by default.
6343    
6344    2003-03-28  Jonathan Coles   <[email protected]>
6345    
6346            * Thuban/UI/classifier.py: Support for highlighting a specific
6347            group within the grid when the classification dialog is opened.
6348            Also contains a lot of debugging printouts which will later
6349            be removed.
6350    
6351            * Thuban/UI/dock.py: Complete rework on the dock code so that
6352            that it is fairly removed from the rest of the Thuban application.
6353            It is easy to add new docks which the rest of the program having
6354            to be aware of them.
6355    
6356            * Thuban/UI/legend.py: Modifications to support selecting a
6357            specific group in the classification dialog. Changed how layers
6358            are drawn when the layer is visible/invisible.
6359    
6360            * Thuban/UI/mainwindow.py: Removed legend specific code and
6361            replaced it with calls to the new dock code.
6362    
6363            * Thuban/UI/renderer.py (MapRenderer.__init__): Added assert
6364            to check if scale > 0. Trying to track down a divide by zero.
6365    
6366    2003-03-26  Jonathan Coles   <[email protected]>
6367    
6368            * Thuban/UI/legend.py: Removed unnecessary LegendDialog class.
6369            (LegendPanel): Removed _OnDock()/_OnUnDock() methods which are
6370            now part of DockableWindow.
6371            (LegendPanel.DoOnSelChanged): Select the current layer in the
6372            map.
6373            (LegendTree._OnSelChanged): Call LegendPanel.DoOnSelChanged()
6374            with the selected layer and/or group.
6375    
6376    2003-03-26  Jonathan Coles   <[email protected]>
6377    
6378            This putback contains the code for dockable windows. There is
6379            no support in wxWindows as of this date for windows that can
6380            attach themselves to other windows.
6381    
6382            The current model contains a DockableWindow which has a parent
6383            window for when it is detached and a dock window that it puts
6384            its contents in when it is docked. The contents of a DockableWindow
6385            must be a DockPanel. DockPanel itself derives from wxPanel.
6386    
6387            * Thuban/Model/layer.py (Layer.ClassChanged): Send a LAYER_CHANGED
6388            message, not a LAYER_LEGEND_CHANGED message.
6389    
6390            * Thuban/Model/map.py (Map): Forward LAYER_CHANGED messages.
6391    
6392            * Thuban/UI/classifier.py (Classifier.__init__): Use wxADJUST_MINSIZE
6393            as one of the style properties for the fieldTypeText item to
6394            be sure that its size is correct when the text changes.
6395    
6396            * Thuban/UI/dock.py: New. Classes for the DockPanel and
6397            DockableWindow.
6398    
6399            * Thuban/UI/legend.py: Added some more buttons and made the
6400            LegendPanel a DockPanel.
6401    
6402            * Thuban/UI/mainwindow.py: Added sash windows to the main window
6403            and supporting functions for manipulating the sashes.
6404            (MainWindow.ShowLegend): Create a DockableWindow with the
6405            LegendPanel as the contents.
6406    
6407            * Thuban/UI/messages.py: Added DOCKABLE_* messages
6408    
6409            * Thuban/UI/view.py (MapCanves.SetMap): Listen for LAYER_CHANGED,
6410            not LAYER_LEGEND_CHANGED, messages.
6411    
6412    2003-03-25  Jonathan Coles   <[email protected]>
6413    
6414            * setup.py: Added custom script bdist_rpm_build_script so that
6415            when the rpm is built the path to wx-config is correct.
6416    
6417            * setup.cfg: Added line saying to use the custom build script
6418    
6419    2003-03-20  Jonathan Coles   <[email protected]>
6420    
6421            Initial implementation of the Legend.
6422    
6423            * Thuban/UI/legend.py: New. Creates a window that shows the map's
6424            Legend information and allows the user to add/modify classifications
6425            and how the layers are drawn on the map.
6426    
6427            * setup.py: New command 'build_docs' which currently uses
6428            happydoc to generate html documentation for Thuban.
6429    
6430            * Thuban/Model/classification.py (ClassGroup.GetDisplayText): New.
6431            Returns a string which is appropriately describes the group.
6432    
6433            * Thuban/Model/layer.py (Layer.SetClassification): Generate a
6434            LAYER_CHANGED event instead of a LAYER_LEGEND_CHANGED event.
6435    
6436            * Thuban/Model/map.py (Map): Rename messages and use new, more
6437            specific, messages.
6438    
6439            * Thuban/Model/messages.py: New message to indicate that a layer's
6440            data has changed (LAYER_CHANGED). New map messages to indicate
6441            when layers have been added/removed/changed or if the stacking order
6442            of the layers has changed.
6443    
6444            * Thuban/Model/session.py: Rename and use new messages.
6445    
6446            * Thuban/UI/classifier.py: Remember if any changes have actually
6447            been applied so that if the dialog is cancelled without an application
6448            of changes we don't have to set a new classification.
6449            (ClassDataPreviewer): Pulled out the window specific code and put it
6450            ClassDataPreviewWindow. ClassDataPreviewer can then be used to draw
6451            symbols on any DC.
6452            
6453            * Thuban/UI/mainwindow.py: New code to open the legend.
6454    
6455            * Thuban/UI/view.py: Use new message names.
6456    
6457    2003-03-19  Jonathan Coles   <[email protected]>
6458    
6459            * Thuban/UI/main.py (verify_versions): New. Checks the versions
6460            of Python, wxPython, and some other libraries.
6461    
6462            * extensions/thuban/wxproj.cpp (check_version): Checks the given
6463            version against what wxproj was compiled with.
6464            (check_version_gtk): If wxproj was compiled with gtk then check
6465            the given version against the version of the gtk library
6466            currently being used.
6467    
6468    2003-03-14  Bernhard Herzog  <[email protected]>
6469    
6470            * test/test_command.py: Run the tests when the module is run as a
6471            script
6472    
6473    2003-03-14  Bernhard Herzog  <[email protected]>
6474    
6475            Implement selection of multiple selected shapes in the same layer:
6476    
6477            - Introduce a new class to hold the selection. This basically
6478              replaces the interactor which was nothing more than the
6479              selection anyway. A major difference is of course that the new
6480              selection class supports multiple selected shapes in one layer
6481            
6482            - Move the object that represents the selection from the
6483              application to the canvas. The canvas is a better place than the
6484              application because the selection represents which shapes and
6485              layer of the map displayed by the canvas are selected and
6486              affects how the map is drawn.
6487    
6488            - Make the selection and its messages publicly available through
6489              the mainwindow.
6490    
6491            - The non-modal dialogs do not get a reference to the interactor
6492              anymore as they can simply refer to their parent, the
6493              mainwindow, for the what the interactor had to offer.
6494    
6495            * Thuban/UI/selection.py: New module with a class to represent the
6496            selection.
6497    
6498            * Thuban/UI/messages.py (SELECTED_TABLE, SELECTED_MAP): Remove
6499            these unused messages
6500    
6501            * Thuban/UI/application.py (ThubanApplication.OnInit)
6502            (ThubanApplication.OnExit, ThubanApplication.SetSession): The
6503            interactor is gone now.
6504            (ThubanApplication.CreateMainWindow): There is no interactor
6505            anymore so we pass None as the interactor argument for now for
6506            compatibility.
6507    
6508            * Thuban/UI/view.py (MapCanvas.delegated_messages)
6509            (MapCanvas.Subscribe, MapCanvas.Unsubscribe): In Subscribe and
6510            Unsubscribe, delegate messages according to the delegated_messages
6511            class variable.
6512            (MapCanvas.__getattr__, MapCanvas.delegated_methods): Get some
6513            attributes from instance variables as described with the
6514            delegated_methods class variable.
6515            (MapCanvas.__init__): New instance variable selection holding the
6516            current selection
6517            (MapCanvas.do_redraw): Deal with multiple selected shapes. Simply
6518            pass them on to the renderer
6519            (MapCanvas.SetMap): Clear the selection when a different map is
6520            selected.
6521            (MapCanvas.shape_selected): Simple force a complete redraw. The
6522            selection class now takes care of only issueing SHAPES_SELECTED
6523            messages when the set of selected shapes actually does change.
6524            (MapCanvas.SelectShapeAt): The selection is now managed in
6525            self.selection
6526    
6527            * Thuban/UI/mainwindow.py (MainWindow.delegated_messages)
6528            (MainWindow.Subscribe, MainWindow.Unsubscribe): In Subscribe and
6529            Unsubscribe, delegate messages according to the delegated_messages
6530            class variable.
6531            (MainWindow.delegated_methods, MainWindow.__getattr__): Get some
6532            attributes from instance variables as described with the
6533            delegated_methods class variable.
6534            (MainWindow.__init__): The interactor as ivar is gone. The
6535            parameter is still there for compatibility. The selection messages
6536            now come from the canvas.
6537            (MainWindow.current_layer, MainWindow.has_selected_layer):
6538            Delegate to the the canvas.
6539            (MainWindow.LayerShowTable, MainWindow.Classify)
6540            (MainWindow.identify_view_on_demand): The dialogs don't need the
6541            interactor parameter anymore.
6542    
6543            * Thuban/UI/tableview.py (TableFrame.__init__)
6544            (LayerTableFrame.__init__, LayerTableFrame.OnClose)
6545            (LayerTableFrame.row_selected): The interactor is gone. It's job
6546            from the dialog's point of view is now done by the mainwindow,
6547            i.e. the parent. Subscribe to SHAPES_SELECTED instead
6548            of SELECTED_SHAPE
6549            
6550            * Thuban/UI/dialogs.py (NonModalDialog.__init__): The interactor
6551            is gone. It's job from the dialog's point of view is now done by
6552            the mainwindow, i.e. the parent.
6553            
6554            * Thuban/UI/classifier.py (Classifier.__init__): The interactor is
6555            gone. It's job from the dialog's point of view is now done by the
6556            mainwindow, i.e. the parent.
6557    
6558            * Thuban/UI/tree.py (SessionTreeView.__init__): The interactor is
6559            gone. It's job from the dialog's point of view is now done by the
6560            mainwindow, i.e. the parent.
6561            (SessionTreeCtrl.__init__): New parameter mainwindow which is
6562            stored as self.mainwindow. The mainwindow is need so that the tree
6563            can still subscribe to the selection messages.
6564            (SessionTreeCtrl.__init__, SessionTreeCtrl.unsubscribe_all)
6565            (SessionTreeCtrl.update_tree, SessionTreeCtrl.OnSelChanged): The
6566            selection is now accessible through the mainwindow. Subscribe to
6567            SHAPES_SELECTED instead of SELECTED_SHAPE
6568    
6569            * Thuban/UI/identifyview.py (IdentifyView.__init__): Use the
6570            SHAPES_SELECTED message now.
6571            (IdentifyView.selected_shape): Now subscribed to SHAPES_SELECTED,
6572            so deal with multiple shapes
6573            (IdentifyView.__init__, IdentifyView.OnClose): The interactor is
6574            gone. It's job from the dialog's point of view is now done by the
6575            mainwindow, i.e. the parent.
6576    
6577            * Thuban/UI/controls.py (RecordListCtrl.fill_list): The second
6578            parameter is now a list of shape ids.
6579            (RecordTable.SetTable): The second parameter is now a list of
6580            indices.
6581    
6582            * Thuban/UI/renderer.py (ScreenRenderer.RenderMap): Rename the
6583            selected_shape parameter and ivar to selected_shapes. It's now a
6584            list of shape ids.
6585            (MapRenderer.draw_label_layer): Deal with multiple selected
6586            shapes. Rearrange the code a bit so that the setup and shape type
6587            distinctions are only executed once.
6588    
6589            * test/test_selection.py: Test cases for the selection class
6590    
6591    2003-03-11  Jonathan Coles   <[email protected]>
6592    
6593            * Thuban/Model/load.py: Temporary fix so that the xml reader
6594            doesn't cause Thuban to crash.
6595    
6596            * Thuban/Model/layer.py: Handle the cyclic references between
6597            a layer and its classification better, and be sure to disconnect
6598            the classification from the layer when the layer is destroyed
6599            so that we don't maintain a cyclic reference that may not be
6600            garbage collected.
6601    
6602            * Thuban/Model/classification.py: See comment for layer.py.
6603    
6604    2003-03-12  Jan-Oliver Wagner <[email protected]>
6605    
6606            * HOWTO-Release: New. Information on the steps for releasing
6607            a new version of Thuban.
6608    
6609    2003-03-11  Jonathan Coles   <[email protected]>
6610    
6611            * Thuban/UI/classifier.py: Add normal border to SelectPropertiesDialog.
6612            Use True instead of true.
6613            (Classifier): Should have a single panel in which all the controls lie.
6614    
6615            * Thuban/UI/proj4dialog.py: Add normal border.
6616    
6617            * Thuban/UI/tree.py: Fixed problem with bad item images under Windows.
6618    
6619            * Thuban/UI/mainwindow.py: Use True instead of true.
6620    
6621            * setup.py: Update some definitions to use wxWindows2.4 files
6622    
6623            * Data/iceland_sample_class.thuban: Fixed file so that the
6624            field_type information is present.
6625    
6626    2003-03-10  Jonathan Coles   <[email protected]>
6627    
6628            * Thuban/UI/classifier.py (Classifier.__init__): Make the
6629            field type label grow so that when the text changes the
6630            size is updated correctly. This may be a wxWindows bug.
6631    
6632    2003-03-10  Jonathan Coles   <[email protected]>
6633    
6634            * Thuban/UI/application.py: Changed SESSION_CHANGED to
6635            SESSION_REPLACED.
6636    
6637            * Thuban/UI/classifier.py: Wrap text with _().
6638            (ClassGrid.CreateTable): Set dimensions and size hints here,
6639            instead of in Reset, so we only set the size once.
6640    
6641            * Thuban/UI/dialogs.py: Don't need Shutdown(); just use Close()!
6642    
6643            * Thuban/UI/mainwindow.py (MainWindow.prepare_new_session):
6644            Call Close() instead of Shutdown().
6645    
6646            * Thuban/UI/messages.py: Changed SESSION_CHANGED to SESSION_REPLACED.
6647    
6648            * Thuban/UI/tree.py: Changed SESSION_CHANGED to SESSION_REPLACED.
6649            Go back to using OnClose() instead of Shutdown().
6650    
6651    2003-03-10  Jonathan Coles   <[email protected]>
6652    
6653            * Thuban/UI/classifier.py (Classifier): SelectField() needed
6654            to know the old field index as well as the new one.
6655    
6656    2003-03-10  Jonathan Coles   <[email protected]>
6657    
6658            * Thuban/UI/classifier.py (Classifier): Use __SelectField()
6659            to correctly set the table information and call this from
6660            __init__ and from _OnFieldSelect so that all the information
6661            is up to date when the dialog opens and when a field is changed.
6662    
6663    2003-03-10  Jonathan Coles   <[email protected]>
6664    
6665            * Thuban/Model/classification.py (Classification): Don't use
6666            layer's message function directly, use the ClassChanged() method
6667            when then classification changes. SetField/SetFieldType/SetLayer
6668            must keep the information about field name and field type in
6669            sync when an owning layer is set or removed.
6670    
6671            * Thuban/Model/layer.py: Added ClassChanged() so that the
6672            classification can tell the layer when its data has changed.
6673            (Layer.SetClassification): Accepts None as an arguement to
6674            remove the current classification and correctly handles
6675            adding a new classification.
6676    
6677            * Thuban/Model/load.py: Comment out print statement
6678    
6679            * test/test_classification.py, test/test_save.py: New and
6680            improved tests.
6681    
6682    2003-03-07  Jonathan Coles   <[email protected]>
6683    
6684            * Thuban/Model/classification.py: Implemented __copy__ and
6685            __deepcopy__ for ClassGroup* and ClassGroupProperites so
6686            they can easily be copied by the classifier dialog.
6687            (ClassGroupProperites.__init__): The default line color should
6688            have been Color.Black.
6689    
6690            * Thuban/UI/classifier.py: Setting and Getting table values now
6691            uses a consistent set of functions.
6692            (Classifier): Now non-modal. Has field type label which changes
6693            as the field changes. Keep track of buttons in a list so that
6694            we can enable/disable the buttons when the None field is selected.
6695            (SelectPropertiesDialog): Add buttons to make the colors transparent.
6696    
6697            * Thuban/UI/dialogs.py (NonModalDialog.Shutdown): New method which
6698            does what OnClose did, but can be called by the application to
6699            close a window. Needed when a session changes, and we have to
6700            close the classifier windows.
6701    
6702            * Thuban/UI/mainwindow.py (MainWindow.prepare_new_session):
6703            Shuts down open dialogs. Used when a new session is created
6704            or a session is opened.
6705            (MainWindow.SaveSession): Should only call application.SaveSession()
6706            if we don't call SaveSessionAs first.
6707            (MainWindow.Classify): Allow different classifier dialogs for
6708            different layers.
6709    
6710            * Thuban/UI/tree.py (SessionTreeView): Remove OnClose and let
6711            the parent class handle it. Add Shutdown() to unsubscibe from
6712            event notification and call the parent Shutdown(). This was
6713            necessary so the application can close the tree window.
6714    
6715    2003-03-06  Jonathan Coles   <[email protected]>
6716    
6717            * Thuban/Model/classification.py: Minor documentation changes,
6718            Addition of __eq__ and __ne__ methods.
6719            (Classification.SetLayer): prevent recursion between this method
6720            and Layer.SetClassification().
6721    
6722            * Thuban/Model/color.py: Addition of __eq__ and __ne__ methods.
6723    
6724            * Thuban/Model/layer.py (SetClassification): prevent recursion
6725            between this method and Classification.SetLayer().
6726    
6727            * test/test_classification.py, test/test_load.py,
6728            test/test_session.py: Fixed and added tests for the classification
6729            classes.
6730    
6731    2003-03-06  Bernhard Herzog  <[email protected]>
6732    
6733            * Thuban/UI/classifier.py (ClassGrid.__init__)
6734            (ClassGrid.CreateTable): Move the SetSelectionMode call to
6735            CreateTable because otherwise it triggers an assertion in
6736            wxPython/wxGTK 2.4.
6737    
6738    2003-03-05  Jonathan Coles   <[email protected]>
6739    
6740            * Thuban/common.py: Move FIELDTYPE constants back to table.py.
6741    
6742            * Thuban/Model/load.py: import FIELDTYPE constants from table.
6743    
6744            * Thuban/UI/classifier.py: import FIELDTYPE constants from table.
6745    
6746            * Thuban/Model/table.py: Put FIELDTYPE constants back.
6747    
6748    2003-03-05  Jonathan Coles   <[email protected]>
6749    
6750            * Thuban/UI/classifier.py: Added class documentation.
6751            Fixed RTbug #1713, #1714. Added Move[Up|Down] buttons.
6752            Store just the groups in the table and generate the other
6753            column information when it is requested. Add "None" field
6754            to pull-down to select no classification.
6755    
6756            * Thuban/common.py: Moved FIELDTYPE constants from table.py
6757            (Str2Num): Only catch ValueError exceptions.
6758    
6759            * Thuban/Model/classification.py: Class documentation. Renaming
6760            of methods with Stroke to Line. Groups are stored in a single
6761            list with the default as the first element. Groups are searched
6762            in the order they appear in the list.
6763    
6764            * Thuban/Model/color.py: Documentation.
6765    
6766            * Thuban/Model/layer.py (Layer): Add GetFieldType to retreive
6767            the kind of data represented by a field.
6768    
6769            * Thuban/Model/load.py (ProcessSession): Use proper string
6770            conversion function; fixes RTbug #1713.
6771    
6772            * Thuban/Model/save.py (Saver): Store field type information.
6773    
6774            * Thuban/Model/table.py: Put FIELDTYPE constants in common.py.
6775            (Table): Add field_info_by_name() to retrieve field information
6776            by specifying the field name, not the number.
6777    
6778            * Thuban/UI/mainwindow.py: Function name changes.
6779    
6780            * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Only
6781            get the layer classification once. Don't try to classify
6782            values when the field is None: just use the default properties.
6783    
6784            * Thuban/UI/view.py: Function name changes.
6785    
6786            * Doc/thuban.dtd: Add field_type attribute to a classification.
6787    
6788    2003-03-04  Bernhard Herzog  <[email protected]>
6789    
6790            * Doc/thuban.dtd: Use correct syntax for optional attributes. Make
6791            the fill and stroke layer attributes optional with suitable
6792            default values. Add the stroke_width layer attribute. Use correct
6793            syntax for empty elements. Make the attribute list for labels
6794            refer to the label element.
6795    
6796    2003-03-04  Bernhard Herzog  <[email protected]>
6797    
6798            * setup.py (thuban_build_py.build): Add a comment about distutils in
6799            Python 2.3 containing some of the functionality we implement in
6800            setup.py ourselves.
6801    
6802            * Thuban/UI/classifier.py (ClassGrid.__init__): Set the table
6803            before the selection mode. Doing it the other way round triggers
6804            an assertion in wxWindows.
6805    
6806            * Thuban/Model/save.py (escape): Fix typo in doc-string
6807    
6808            * Thuban/Model/classification.py: Remove unnecessary wxPython
6809            import
6810    
6811    2003-03-04  Jonathan Coles   <[email protected]>
6812    
6813            * Thuban/Model/classification.py (ClassGroupRange.GetProperties):
6814            Parameter 'value' should default to None.
6815    
6816            * Thuban/UI/mainwindow.py: Use Layer.GetClassification() since
6817            the class attribute __classification is now private.
6818    
6819            * Thuban/UI/classifier.py (ClassGrid): Moved OnCellDClick() from
6820            Classifier to ClassGrid. Added support for removing selected rows,
6821            which including code for keeping track of when cells are selected,
6822            and deselected.
6823            (ClassTable): Support for added/removing rows. Fixed a problem
6824            with __ParseInput whereby it would not allow strings (only numbers)
6825            to be entered.
6826            (Classifier): Added button and supporting code for removing
6827            selected rows.
6828    
6829    2003-02-27  Jonathan Coles   <[email protected]>
6830    
6831            * Thuban/common.py: Moved color conversion functions into
6832            Thuban/UI/common.py.
6833            (Str2Num): Now converts the float (not the string) to a long/int
6834            so that an exception isn't thrown.
6835    
6836            * Thuban/UI/common.py: Common functions used in several UI modules
6837    
6838            * Thuban/Model/classification.py: Changed the class hierarchy
6839            so that a Classification consists of Groups which return
6840            Properties when a value matches a Group.
6841    
6842            * Thuban/Model/layer.py: Fixed name resolution problem.
6843    
6844            * Thuban/Model/load.py: Use new Classification and Group functions.
6845    
6846            * Thuban/Model/save.py (Saver.write_attribs): Fixes a test case
6847            failure.
6848            (Saver.write_classification): Use new Classification and Group
6849            functions.
6850    
6851            * Thuban/UI/classifier.py: Changes to use new Classification and Group
6852            functions. Fix to create a tuple with a single value instead of
6853            simply returning the value.
6854    
6855            * Thuban/UI/renderer.py: Use new Classification and Group functions.
6856            Use common.py functions.
6857    
6858            * Thuban/UI/tree.py: Use common.py functions.
6859            
6860            * test/test_classification.py: Use new Classification and Group
6861            classes.
6862    
6863    2003-02-24  Jonathan Coles   <[email protected]>
6864    
6865            * Thuban/common.py (Color2wxColour, wxColour2Color): Conversion
6866            functions from Thuban color objects to wxWindow colour objects.
6867    
6868            * Thuban/Model/classification.py (Classification): Renamed
6869            GetProperties() to GetClassData(). Used the new iterator
6870            in TreeInfo().
6871            (ClassIterator): Iterator implementation to iterate over the
6872            ClassData objects in a classification object.
6873    
6874            * Thuban/Model/save.py (Saver.write_classificaton): Uses
6875            the new iterator to save the classification information.
6876    
6877            * Thuban/UI/classifier.py (SelectPropertiesDialog): Support
6878            for changing the stroke and fill colors and previewing the
6879            changes.
6880    
6881            * Thuban/UI/mainwindow.py (MainWindow.OpenSession,
6882            MainWindow.SaveSessionAs): Text string changes so the dialogs
6883            have more meaningful titles.
6884    
6885            * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Change
6886            Classification method name from GetProperties to GetClassData.
6887    
6888            * Thuban/UI/view.py (MapCanvas.find_shape_at): Use method calls
6889            instead of accessing now non-existent class variables.
6890    
6891    2003-02-24  Bernhard Herzog  <[email protected]>
6892    
6893            * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Remove
6894            unneeded Shape() call. Rendering is substantially faster without
6895            it and it avoids some problems with broken shape files.
6896    
6897    2003-02-20  Frank Koormann   <[email protected]>
6898    
6899            Force minimal size of identify and label dialogs. The autosizing
6900            looked too ugly.
6901    
6902            * Thuban/UI/controls.py (RecordListCtrl): Set minimal width for columns.
6903            * Thuban/UI/labeldialog.py (LabelDialog.dialog_layout):
6904            Set size of listctrl.
6905            * Thuban/UI/identifyview.py (IdentifyView.__init__):
6906            Set size of dialog.
6907    
6908    2003-02-19  Jonathan Coles   <[email protected]>
6909    
6910            * test/test_classification.py, test/test_layer.py,
6911            test/test_load.py, test/test_map.py, test/test_session.py:
6912            Updated the tests to use the new functions that are in the
6913            respective classes.
6914    
6915            * Thuban/Model/classification.py (Classification):
6916            Uses the new ClassData* classes. Modification messages are
6917            passed up to the parent layer (if it exists).
6918            (ClassData): New class to encapsulate the common data in each
6919            classification property.
6920            (ClassDataDefault): Represents the Default class. data.
6921            (ClassDataPoint): Represents a single class. data point
6922            (ClassDataRange): Represents a class. range
6923            (ClassDataMap): Represents a class. map (unused).
6924    
6925            * Thuban/Model/color.py: Added Color.None to represent something
6926            with no color. Color.Black represents the color black.
6927            (NoColor): Helper class derived from Color to represent something
6928            with no color.
6929    
6930            * Thuban/Model/layer.py (Layer): Removed references to fill, stroke,
6931            stroke_width attributes. Made the 'classification' attribute private.
6932            New methods for setting/getting the classification.
6933    
6934            * Thuban/Model/load.py (ProcessSession): Use new methods on Layer
6935            to get the classifcation and use the new ClassData* classes to
6936            hold the classification data. Use Str2Num to convert numbers
6937            properly.
6938    
6939            * Thuban/Model/save.py (Saver): Use new Color and Classification
6940            methods
6941    
6942            * Thuban/UI/classifier.py (ClassGrid): New class to represent a
6943            custom grid.
6944            (ClassTable): Support for editing Values and Labels and for
6945            changing what type (point or range) of data is stored in each
6946            property based on how the user enters the data.
6947            (Classifier): Support for saving the new classifications and
6948            launching the dialog to edit a property.
6949            (SelectPropertiesDialog): New class for editing the visual
6950            properties of a classification (stroke color, width, and fill color)
6951            (ClassPreviewer): Took the Draw method from ClassRenderer and
6952            made most of it into this new class. Intend to use this class in
6953            the SelectPropertiesDialog for previewing changes.
6954    
6955            * Thuban/UI/renderer.py: Use new Color and Classification methods.
6956    
6957            * Thuban/UI/tree.py: Formatting changes.
6958    
6959            * Doc/thuban.dtd: Add 'label' element
6960    
6961            * Thuban/common.py: New. Contains common routines used throughout
6962            the code.
6963            (Str2Num): Takes a string and converts it to the "best" type of
6964            number.
6965    
6966    2003-02-14  Bernhard Herzog  <[email protected]>
6967    
6968            * Thuban/UI/view.py (MapCanvas.OnLeftUp): Make sure that the
6969            dragging flag is always set to 0 even when the tool implementation
6970            raises an exception
6971    
6972    2003-02-11  Bernhard Herzog  <[email protected]>
6973    
6974            * Thuban/UI/application.py (ThubanApplication.splash_screen): New
6975            method to create a splash screen.
6976            (ThubanApplication.ShowMainWindow): New. Show the main window.
6977            Needed so the splash screen can display the mainwindow
6978            (ThubanApplication.OnInit): Call the
6979            new splash_screen method to determine whether the application
6980            should display a splash screen. If it displays a splash screen do
6981            not immediately show the main window.
6982    
6983    2003-02-11  Jonathan Coles  <[email protected]>
6984    
6985            * Thuban/Model/classification.py: Added import line to fix
6986            feature conflicts between running on python2.2 and python2.1.
6987    
6988            * Thuban/UI/classifier.py (ClassTable): Didn't need to hang
6989            onto the clinfo parameter, so removed the deepcopy().
6990    
6991    2003-02-10  Jonathan Coles  <[email protected]>
6992    
6993            * Thuban/Model/save.py (Saver.open_element, Saver.close_element):
6994            Added element_open variable to track opening and closing of tags
6995            so that tags that don't span more than one line are closed with
6996            /> instead of </tag_name>. Use the GetDefault*() methods of
6997            the Classification class.
6998    
6999            * Thuban/Model/classification.py (Classificaton): Added set and
7000            get methods for the default data. The class also takes a layer
7001            reference so that modification messages can be sent. Fixed the
7002            methods to use the new ClassData class.
7003            (ClassData): New class to encapsulate the classification data
7004    
7005            * Thuban/Model/layer.py (Layer): Remove the
7006            Set[Fill|Stroke|StrokeWidth]() methods. Code should call the
7007            SetDefault*() methods on the layer's classification object.
7008            (Layer.__init__): Use the new SetDefault*() methods in the
7009            Classification class.
7010    
7011            * Thuban/Model/load.py (ProcessSession): Use the new ClassData
7012            object instead of a dictionary.
7013    
7014            * Thuban/UI/classifier.py (ClassRenderer): New class to
7015            draw the classifications in the dialog box's table.
7016            (Classifier): Modified to use the ClassRenderer class.
7017    
7018            * Thuban/UI/mainwindow.py (MainWindow): Use the SetDefault*()
7019            methods of the Classification class.
7020    
7021            * Thuban/UI/renderer.py (MapRenderer): Use the Get*() methods
7022            of the ClassData class.
7023    
7024            * test/test_classification.py, test/test_layer.py,
7025            test/test_map.py, test/test_session.py: Fix the tests to work
7026            with the above code changes.
7027    
7028    2003-02-03  Jonathan Coles  <[email protected]>
7029    
7030            * Thuban/Model/classification.py (Classification): Added getNull()
7031            to return the NullData reference
7032    
7033            * Thuban/Model/layer.py (Layer.SetFill, Layer.SetStroke,
7034            Layer.SetStrokeWidth): Modified these functions to change the
7035            null data in the classification rather than keep these values
7036            directly in the Layer class. Menu options to change these values
7037            work again.
7038    
7039    2003-01-28  Jonathan Coles  <[email protected]>
7040    
7041            * Thuban/UI/classifier.py (Classifier): Resolved merging conflicts.
7042            Fixed crashing problem on some systems. Dialog box shows
7043            classification data.
7044    
7045            * Thuban/UI/tree.py (SessionTreeCtrl.add_items): Handle drawing
7046            Colors in the tree view.
7047    
7048            * Thuban/Model/layer.py (Layer.TreeInfo): Added a call to build
7049            the tree info for classifications. Commented out unnecessary lines.
7050    
7051            * Thuban/Model/classification.py (Classification.TreeInfo): New
7052            function to add information about the classification into the
7053            tree view.
7054    
7055    2003-01-27  Jan-Oliver Wagner <[email protected]>
7056    
7057            * Thuban/__init__.py (_): New.
7058    
7059            * Thuban/Model/classification.py, Thuban/Model/extension.py,
7060            Thuban/Model/layer.py, Thuban/Model/load.py, Thuban/Model/map.py,
7061            Thuban/Model/session.py, Thuban/UI/application.py,
7062            Thuban/UI/classifier.py, Thuban/UI/context.py, Thuban/UI/controls.py,
7063            Thuban/UI/identifyview.py, Thuban/UI/labeldialog.py,
7064            Thuban/UI/mainwindow.py, Thuban/UI/menu.py, Thuban/UI/proj4dialog.py,
7065            Thuban/UI/renderer.py, Thuban/UI/tree.py, Thuban/Lib/connector.py,
7066            Thuban/Lib/fileutil.py: Replace user string by _() for i18n.
7067    
7068    2003-01-27  Jonathan Coles  <[email protected]>
7069    
7070            * Thuban/Model/layer.py: Classification initialization calls.
7071    
7072            * Thuban/Model/classification.py: Created class to encapsulate
7073            a layer classification. Supports specific data points and
7074            ranges.
7075    
7076            * Thuban/Model/load.py: Added support for loading classification
7077            information.
7078    
7079            * Thuban/Model/save.py: Added support for saving classification
7080            information.
7081    
7082            * Thuban/UI/classifier.py: Initial class for a dialog box for
7083            specifying classification information.
7084    
7085            * Thuban/UI/mainwindows.py: Support for opening the classifier
7086            dialog.
7087    
7088            * Thuban/UI/renderer.py: Support for drawing a layer with the
7089            classification information.
7090    
7091            * Data/iceland_sample_class.thuban: iceland_sample with
7092            classification data.
7093    
7094            * test/test_classification: Tests for the Classification class.
7095    
7096    2002-12-09  Bernhard Herzog  <[email protected]>
7097    
7098            * test/test_command.py: New. Tests for the command classes.
7099    
7100            * Thuban/UI/command.py (ToolCommand): New class for tool commands.
7101            (Command.IsTool): New method to distinguish between command
7102            switching tools and other commands.
7103    
7104            * Thuban/UI/view.py (MapCanvas.SelectTool): New method to select
7105            the tool to avoid direct assignments to instance variables
7106            (MapCanvas.ZoomInTool, MapCanvas.ZoomOutTool, MapCanvas.PanTool)
7107            (MapCanvas.IdentifyTool, MapCanvas.LabelTool): Use SelectTool to
7108            change the tool
7109    
7110            * Thuban/UI/mainwindow.py (MainWindow.update_command_ui): If an
7111            active tool's command turns insensitive, disable the tool.
7112            (_tool_command): Use the new ToolCommand class
7113    
7114            * Examples/simple_extensions/simple_tool.py (simple_tool): Use the
7115            SelectTool method to change the tool
7116            (iconfile): Use the ToolCommand class
7117    
7118    2002-12-03  Bernhard Herzog  <[email protected]>
7119    
7120            * Thuban/UI/tree.py (SessionTreeCtrl.normalize_selection): Handle
7121            the case of selected items that are not children of Layers or Maps
7122            properly. Previously this bug would trigger an assertion in
7123            wxWindows.
7124    
7125    2002-11-06  Frank Koormann  <[email protected]>
7126    
7127            * Thuban/UI/mainwindow.py: Altered the order of tools in the
7128            toolbar: First now are all navigation tools (Zoom In/Out, Pan,
7129            Full Extent).
7130    
7131    2002-10-23  Bernhard Herzog  <[email protected]>
7132    
7133            * setup.py (setup call): version now 0.1.3
7134    
7135            * MANIFEST.in: Add the files in test/
7136    
7137            * test/README: Add note about tests requiring the iceland data
7138    
7139            * Thuban/UI/mainwindow.py (MainWindow.About): Add 2002 to
7140            copyright notice.
7141    
7142    2002-10-18  Bernhard Herzog  <[email protected]>
7143    
7144            * test/test_map.py
7145            (TestMapWithContents.test_projected_bounding_box): Use an explicit
7146            epsilon.
7147    
7148            * test/support.py (FloatComparisonMixin.assertFloatEqual)
7149            (FloatComparisonMixin.assertFloatSeqEqual): give a more useful
7150            message if the assertion fails and don't return the return value
7151            of self.assert_. In assertFloatSeqEqual the return meant that not
7152            all items of the sequence were compared.
7153    
7154    2002-09-20  Bernhard Herzog  <[email protected]>
7155    
7156            * test/test_fileutil.py: New. Test cases for Thuban.Lib.fileutil
7157    
7158            * Thuban/Lib/fileutil.py: Fixup some whitespace and typos
7159    
7160            * test/test_map.py (TestMapWithContents.test_tree_info): Create
7161            the string with the bounding box on the fly because of platform
7162            differences in the way %g is handled.
7163    
7164            * test/test_layer.py (TestLayer.test_empty_layer): Create an empty
7165            DBFfile too because Thuban layers can't yet cope missing DBF
7166            files.
7167    
7168    2002-09-20  Bernhard Herzog  <[email protected]>
7169    
7170            * test/test_menu.py: Use initthuban instead of
7171            add_thuban_dir_to_path to initialize Thuban.
7172    
7173            * test/support.py (FloatComparisonMixin.assertFloatEqual): New.
7174            Mixin class for float comparisons
7175            (SubscriberMixin): New. Mixin class to test messages sent through
7176            the Connector class
7177    
7178            * test/README: Fix a typo and add the -v flag to the command for
7179            individual tests
7180    
7181            * test/test_session.py: New. Test cases for Thuban.Model.session
7182    
7183            * test/test_proj.py: New. Test cases for Thuban.Model.proj
7184    
7185            * test/test_map.py: New. Test cases for Thuban.Model.map
7186    
7187            * test/test_layer.py: New. Test cases for Thuban.Model.layer
7188    
7189            * test/test_label.py: New. Test cases for Thuban.Model.label
7190    
7191            * test/test_connector.py: New. Test cases for Thuban.Lib.connector
7192    
7193            * test/test_color.py: New. Test cases for Thuban.Model.color
7194    
7195            * test/test_base.py: New. Test cases for Thuban.Model.base
7196    
7197    2002-09-13  Bernhard Herzog  <[email protected]>
7198    
7199            * Thuban/Model/session.py (Session.forwarded_channels): Forward
7200            the CHANGED channel too.
7201    
7202            * Thuban/Model/map.py (Map.forwarded_channels): Forward the
7203            CHANGED channel too.
7204            (Map.__init__): Call the Modifiable constructor as well.
7205    
7206            * Thuban/Model/base.py (Modifiable.UnsetModified): Issue a CHANGED
7207            event if the modified flag changes.
7208            (Modifiable.changed): Tweak the doc-string.
7209    
7210            * Thuban/UI/mainwindow.py (MainWindow.view_position_changed)
7211            (MainWindow.set_position_text): Put the code that puts the text
7212            with the mouse position into the status bar into the new method
7213            set_position_text so that it can overwritten in derived classes.
7214    
7215    2002-09-12  Bernhard Herzog  <[email protected]>
7216    
7217            * Thuban/UI/mainwindow.py (MainWindow.RunMessageBox): Center the
7218            message box on the main window.
7219    
7220    2002-09-11  Bernhard Herzog  <[email protected]>
7221    
7222            * Thuban/UI/mainwindow.py: Underline the 'x' in "Exit" instead of
7223            the 'E' because it's less likely to interfere with other menu
7224            entries.
7225            (MainWindow.build_menu): remove an incorrect comment.
7226    
7227    2002-09-10  Bernhard Herzog  <[email protected]>
7228    
7229            * Thuban/UI/mainwindow.py (MainWindow.Map): New.
7230            (_tool_command): Add sensitive parameter
7231            (_has_visible_map): Sensitivity callback to tools and other
7232            commands that require a visible map. Use it in map_zoom_in_tool,
7233            map_zoom_out_tool, map_pan_tool, map_identify_tool, map_label_tool
7234            and map_full_extent
7235    
7236    2002-09-06  Bernhard Herzog  <[email protected]>
7237    
7238            * Thuban/UI/mainwindow.py (MainWindow.OnClose): Unsubscribe
7239            VIEW_POSITION
7240    
7241    2002-09-04  Frank Koormann  <[email protected]>
7242    
7243            * Resources/Bitmaps/fullextent.xpm: Updated Icon (removed "potatoe")
7244    
7245    2002-09-02  Bernhard Herzog  <[email protected]>
7246    
7247            * Thuban/UI/view.py: Get rid of the idle redraw. This is done by
7248            wxWindows already and our implementation doesn't work correctly
7249            with wxGTK 2.3:
7250            (MapCanvas.__init__): Remove the instance variable
7251            (MapCanvas.OnPaint): Always call do_redraw when there's a map to
7252            be drawin
7253            (MapCanvas.OnIdle): Removed.
7254    
7255            * Thuban/UI/view.py (MapCanvas.unprojected_rect_around_point): Add
7256            a parameter to determine the size of the rectangle.
7257            (MapCanvas.find_shape_at): Create the box around the point on a
7258            layer by layer basis and make the size depend on the shape type.
7259            This solves a problem with the selection of point shapes at the
7260            border of the layer's bounding box
7261    
7262    2002-08-30  Bernhard Herzog  <[email protected]>
7263    
7264            * Thuban/UI/mainwindow.py (MainWindow.CanRemoveLayer): New method
7265            for the sensitivity  of remove layer.
7266            (_can_remove_layer): New. Sensitivity callback for remove layer
7267            (Command layer_remove): Use _can_remove_layer
7268    
7269            * Thuban/Model/map.py (Map.CanRemoveLayer): New method to
7270            determine whether a given layer can be deleted.
7271    
7272            * Thuban/UI/view.py (MapCanvas.__init__, MapCanvas.OnPaint)
7273            (MapCanvas.do_redraw): Get rid of the unused update_region
7274            instance variable
7275    
7276            * Thuban/UI/view.py: Add/update some doc-strings.
7277    
7278            * test/: new subdirectory with a bunch of unit tests.
7279    
7280            * test/README, test/test_table.py, test/test_save.py,
7281            test/test_menu.py, test/test_load.py: Initial set of tests and
7282            brief instructions on how to run them
7283    
7284    2002-08-29  Bernhard Herzog  <[email protected]>
7285    
7286            * Thuban/UI/renderer.py (ScreenRenderer.draw_shape_layer): Handle
7287            arcs with multiple parts.
7288    
7289            * Thuban/UI/view.py (ZoomInTool.MouseUp, ZoomOutTool.MouseUp):
7290            Handle degenrate rectangles.
7291    
7292            * Thuban/Model/table.py: Make writing records work correctly:
7293            (Table.__init__): Keep track of whether the DBF is open for
7294            writing
7295            (Table.write_record): Open the DBF file for writing when necessary
7296    
7297    2002-08-27  Bernhard Herzog  <[email protected]>
7298    
7299            * Thuban/Model/table.py (Table.write_record, Table.__init__): Open
7300            dbf files only for reading by default. Use a new writable dbf
7301            object for writing.
7302    
7303    2002-08-26  Bernhard Herzog  <[email protected]>
7304    
7305            * Thuban/UI/mainwindow.py: Refactor the context creation:
7306            (MainWindow.Context): New method to return a context
7307            (MainWindow.invoke_command, MainWindow.update_command_ui): Use the
7308            new method
7309    
7310            * Thuban/UI/tableview.py (TableGrid, LayerTableGrid): Split the
7311            layer table specific code from TableGrid into LayerTableGrid
7312            (TableFrame, LayerTableFrame): Split the layer table specific code
7313            from TableFrame into LayerTableFrame
7314            (LayerTableGrid.select_shape): Remove a debug print
7315    
7316            * Thuban/UI/mainwindow.py (MainWindow.LayerShowTable): Use the
7317            LayerTableFrame
7318    
7319    2002-08-23  Bernhard Herzog  <[email protected]>
7320    
7321            * Thuban/Model/layer.py (Layer.__init__): Make sure we have an
7322            absolute filename.
7323    
7324    2002-08-22  Bernhard Herzog  <[email protected]>
7325    
7326            * Thuban/Model/table.py (Table.write_record): New method to write
7327            records.
7328            (Table.__init__): Open the DBF file for writing too.
7329    
7330            * Thuban/UI/controls.py (RecordTable.SetValue): Write the value
7331            into the underlying table.
7332    
7333            * extensions/shapelib/shapefil.h (DBFCommit),
7334            extensions/shapelib/dbfopen.c (DBFCommit): New API function to
7335            commit any changes made to the DBF file.
7336    
7337            * Thuban/UI/mainwindow.py (make_check_current_tool)
7338            (_tool_command): Put the code that generates the "checked"
7339            callback into a separate function so that we can reuse it
7340            elsewhere
7341    
7342            * Thuban/Model/save.py (Saver): New class to handle serializing a
7343            session into an XML file. The main reason to introduce a class is
7344            that applications built on Thuban can derive from it so that they
7345            can save additional information in a session file.
7346            (save_session): Delegate almost all the work to the Saver class.
7347            Rename the filename argument to file because it may be a file like
7348            object now.
7349    
7350            * Thuban/Model/load.py: Get rid of the Python 1.5.2 compatibility
7351            code. Remove the little test code which would be executed when the
7352            module is run as a script which didn't work anymore since it can't
7353            import the other Thuban modules.
7354            (ProcessSession, load_session): Refactor the ProcessSession to
7355            have one method for each element start and end tag so that derived
7356            classes can easily override the processing of individual tags.
7357            Also, always parse with namespaces enabled because applications
7358            built on top of Thuban will likely use namespaces if they extend
7359            the session file format.
7360    
7361    2002-08-21  Bernhard Herzog  <[email protected]>
7362    
7363            * setup.py (ThubanInstall.run): Don't repr install_lib_orig
7364            because thubaninit_contents will do it for us.
7365    
7366    2002-08-16  Jan-Oliver Wagner <[email protected]>
7367    
7368            * Thuban/UI/mainwindow.py: menu item 'show session tree' now disable if
7369            tree window already open
7370    
7371    2002-08-15  Bernhard Herzog  <[email protected]>
7372    
7373            * Thuban/Model/layer.py (Layer.Destroy): Call the unboundd method
7374            with self.
7375    
7376            * Thuban/UI/view.py (MapCanvas.OnLeftUp): Only release the mouse
7377            when we have actually captured it.
7378    
7379            * Thuban/Model/layer.py (Layer.Destroy): New. Explicitly close the
7380            shapefile and destroy the table.
7381    
7382            * Thuban/Model/table.py (Table.Destroy): New. Close the DBF file.
7383    
7384    2002-08-14  Bernhard Herzog  <[email protected]>
7385    
7386            * Thuban/UI/controls.py (RecordTable.__init__): Remove the unused
7387            instance variable columns
7388            (RecordTable.GetTypeName): row and col may be negative in some
7389            cases.
7390    
7391            * setup.py (InstallLocal.initialize_options)
7392            (InstallLocal.finalize_options, InstallLocal.user_options): New
7393            option create-init-file to build a thubaninit.py when running
7394            install_local
7395            (InstallLocal.run): Create the thubaninit.py module when requested
7396            (thubaninit_contents): Split the template into several parts and
7397            create a new function thubaninit_contents that creates the
7398            contents of a thubaninit module.
7399            (ThubanInstall.run): Use the new function to create the thubaninit
7400            module.
7401    
7402    2002-07-30  Bernhard Herzog  <[email protected]>
7403    
7404            * Thuban/UI/application.py (ThubanApplication.OnExit): Do some
7405            cleanup.
7406            (ThubanApplication.MainLoop): Extend to automatically call OnExit.
7407    
7408            * Thuban/Model/session.py (Session.Destroy): Don't bypass the
7409            direct base class' Destroy method.
7410    
7411            * Thuban/Model/map.py (Map.ClearLayers): New method to delete all
7412            layers.
7413            (Map.Destroy): Destroy the label_layer as well and call the
7414            inherited Desatroymethod first so that no more messages are
7415            issued.
7416            (Map.RaiseLayer, Map.LowerLayer): Only issue LAYERS_CHANGED
7417            message if the stacking order actually has changed. Add
7418            doc-strings.
7419            (Map.BoundingBox): Correct the doc-string.
7420            (Map.AddLayer, Map.RemoveLayer, Map.Layers, Map.HasLayers)
7421            (Map.ProjectedBoundingBox, Map.SetProjection): Add doc-strings.
7422    
7423            * Thuban/Model/label.py (LabelLayer.ClearLabels): New to delete
7424            all labels.
7425    
7426    2002-07-29  Bernhard Herzog  <[email protected]>
7427    
7428            * Thuban/Model/map.py (Map.subscribe_layer_channels)
7429            (Map.unsubscribe_layer_channels): Put the code that (un)subscribes
7430            to a layer's channels into separate methods.
7431            (Map.RemoveLayer, Map.AddLayer): Call the new methods
7432            (Map.Destroy): Unsubscribe from a layer's channels before
7433            destroying it.
7434    
7435            * Thuban/UI/view.py (MapCanvas.find_shape_at): Change the
7436            selected_layer parameter to searched_layer which is the layer to
7437            search in.
7438            (MapCanvas.SelectShapeAt): New parameter layer to restrict the
7439            search to that layer. Return the selected layer and shape.
7440    
7441            * Examples/simple_extensions/simple_tool.py (simple_tool): Fix a
7442            typo
7443    
7444    2002-07-24  Bernhard Herzog  <[email protected]>
7445    
7446            * Thuban/UI/application.py (ThubanApplication.create_session):
7447            Extend the doc string.
7448            (ThubanApplication.subscribe_session)
7449            (ThubanApplication.unsubscribe_session): New methods to
7450            subscribe/unsubscribe to/from session channels.
7451            (ThubanApplication.SetSession): Call the new methods here.
7452            (ThubanApplication.maps_changed, ThubanApplication.set_map):
7453            Renamed set_map to maps_changed. Its now a subscriber for
7454            MAPS_CHANGED.
7455    
7456            * Thuban/UI/view.py (ZoomOutTool.MouseUp): Use the correct
7457            x-coordinate in case of simple clicks
7458    
7459            * Thuban/Model/base.py (Modifiable.changed): Apply the args tuple,
7460            don't pass it as a parameter
7461    
7462            * Thuban/Model/session.py (Session.RemoveMap): New
7463    
7464            * Thuban/UI/mainwindow.py (MainWindow.__init__): Turn the initial
7465            window size into a parameter.
7466    
7467    2002-07-23  Bernhard Herzog  <[email protected]>
7468    
7469            * Thuban/UI/menu.py (Menu.item_index): Also search for menus not
7470            just commands.
7471    
7472            * Thuban/UI/mainwindow.py (MainWindow.__init__): Change the
7473            parameter list a bit to allow setting the window title and the
7474            initial message in the status bar. Update the callers.
7475    
7476            * Thuban/UI/application.py (ThubanApplication.OnInit)
7477            (ThubanApplication.CreateMainWindow): Put the mainwindow
7478            instantiation into a separate method so that it can be overridden
7479            by a subclass.
7480    
7481    2002-07-19  Bernhard Herzog  <[email protected]>
7482    
7483            * Thuban/Model/session.py: Issue a CHANGED message every time
7484            another changed message is issued to make it easier to get
7485            notified of changes.
7486            (Session): Update the doc string
7487            (Session.forward): Issue changed-events as CHANGED as well.
7488            (Session.changed): Overwrite the inherited version to issue
7489            CHANGED events as well.
7490    
7491            * Thuban/UI/tree.py: We can now simply subscribe to the session's
7492            CHANGED channel to be informed of changes.
7493            (SessionTreeCtrl.session_channels): Not needed any longer.
7494            (SessionTreeCtrl.unsubscribe_all, SessionTreeCtrl.session_changed):
7495            Only have to (un)subscribe CHANGED
7496    
7497            * Thuban/Model/map.py (Map.TreeInfo): Deal better with empty maps.
7498    
7499            * Thuban/UI/main.py, Thuban/UI/__init__.py: Move the work-around
7500            for the wxPython locale bug to __init__.py so that it's
7501            automatically executed by anybody using UI code from Thuban.
7502    
7503    2002-07-18  Bernhard Herzog  <[email protected]>
7504    
7505            * Thuban/UI/main.py (main): app no longer needs to be global
7506    
7507            * Thuban/UI/mainwindow.py (MainWindow.__init__): Add application
7508            as parameter and store it in an instance variable
7509            (MainWindow.invoke_command, MainWindow.update_command_ui)
7510            (MainWindow.save_modified_session, MainWindow.NewSession)
7511            (MainWindow.OpenSession, MainWindow.SaveSession)
7512            (MainWindow.SaveSessionAs, MainWindow.ShowSessionTree): Use self's
7513            application object.
7514    
7515            * Thuban/UI/application.py (ThubanApplication.OnInit): Instantiate
7516            the main window with self.
7517    
7518            * Thuban/UI/context.py: New module with the context class
7519    
7520            * Thuban/UI/command.py (Command): Update doc string.
7521    
7522            * Thuban/UI/mainwindow.py (MainWindow.invoke_command,
7523            MainWindow.update_command_ui): Pass an instance of the context
7524            class to the command's methods
7525            (check_current_tool, call_method): Handle the new context
7526            implementation
7527    
7528            * Examples/simple_extensions/simple_tool.py (simple_tool,
7529            check_simple_tool): Handle the new context implementation
7530    
7531            * Examples/simple_extensions/simple_command.py (simple_command):
7532            Handle the new context implementation. Update the comments about
7533            the context.
7534    
7535            * Thuban/UI/application.py (ThubanApplication.SetSession): Add
7536            doc-string
7537            (ThubanApplication.Session): New method to return the session
7538            object
7539    
7540            * Thuban/UI/tree.py (SessionTreeCtrl.update_tree): The
7541            interactor's selected_layer may not be a layer of the current
7542            session when the tree is updated while a new session is being set.
7543    
7544    2002-07-17  Bernhard Herzog  <[email protected]>
7545    
7546            * Thuban/UI/tree.py (color_string): Removed. No longer used.
7547            (SessionTreeCtrl.update_tree, SessionTreeCtrl.add_items): Split
7548            update_tree into update_tree and add_items. The tree now uses a
7549            more generic way to display the contents of the tree.
7550            (SessionTreeCtrl): Add a doc string explaining the TreeInfo method
7551    
7552            * Thuban/Model/layer.py (Layer.TreeInfo),
7553            Thuban/Model/extension.py (Extension.TreeInfo),
7554            Thuban/Model/map.py (Map.TreeInfo),
7555            Thuban/Model/session.py (Session.TreeInfo):
7556            Add TreeInfo methods to implement the new tree view update scheme
7557    
7558    2002-07-16  Bernhard Herzog  <[email protected]>
7559    
7560            * Thuban/UI/application.py: Don't use "import from" for the
7561            MainWindow. It can't always be resolved.
7562            (ThubanApplication.OnInit): change reference to MainWindow
7563            accordingly.
7564    
7565            * Thuban/UI/menu.py (Menu.SetItems): New method to replace a menu
7566            completely
7567    
7568    2002-07-10  Bernhard Herzog  <[email protected]>
7569    
7570            * setup.py (create_init_module): New configurable variable whose
7571            default depends on the platform we're running on.
7572            (ThubanInstall.initialize_options): Initialize
7573            self.create_init_module from the global create_init_module
7574            (ThubanInstall.user_options): indictate that the options
7575            create-init-module and init-module-dir have arguments.
7576    
7577            * setup.py: In the setup call change the version number to include
7578            cvs.
7579    
7580            * MANIFEST.in: Add the files in Examples
7581    
7582    2002-07-09  Bernhard Herzog  <[email protected]>
7583    
7584            * setup.py: In the setup call, use the thuban homepage as the
7585            value of the url parameter.
7586    
7587            * Examples: New subdirectory for examples.
7588    
7589            * Examples/simple_extensions/simple_tool.xpm,
7590            Examples/simple_extensions/simple_tool.py,
7591            Examples/simple_extensions/simple_command.py,
7592            Examples/simple_extensions/README: Simple examples showing how to
7593            add new commands and tools.
7594    
7595            * setup.cfg (bdist_rpm): Add the default value for prefix and tell
7596            bdist_rpm that we also have an install script.
7597            (bdist_inno): Add 2002 to the copyright notice.
7598    
7599            * setup.py: Create a file in python's site-packages directory to
7600            make installation of Thuban as a library easier.
7601            (ThubanInstall.user_options): Add two new options,
7602            create-init-module and init-module-dir
7603            (ThubanInstall.expand_with_pure_python_dirs): New method to expand
7604            filenames for installation in the default directories.
7605            (ThubanInstall.select_scheme, ThubanInstall.convert_paths): Extend
7606            the inherited methods to capture some filenames before they're
7607            transformed too much by distutils.
7608            (ThubanInstall.run): Create the init module if requested.
7609            (ThubanInstall.thuban_init_filename): New method to return the
7610            full name of the init module.
7611            (ThubanInstall.get_outputs): Append the filename of the init
7612            module.
7613    
7614    2002-07-08  Bernhard Herzog  <[email protected]>
7615    
7616            * setup.py (thuban_bdist_rpm): Extend this version of bdist_rpm to
7617            handle the prefix properly which means that the default for the
7618            installation prefix should be /usr for RPMs and /usr/local when
7619            doing a normal source install.
7620            (bdist_rpm_install_script): Script to override the default install
7621            commands in the specfile generated by the bdist_rpm command.
7622            (thuban_bdist_rpm.user_options): Add a prefix option
7623            (thuban_bdist_rpm.initialize_options): Init the prefix option.
7624            Create the script files for the spec files as empty files here
7625            (thuban_bdist_rpm._make_spec_file): Override the inherited method
7626            to fill the script files with content.
7627    
7628            * Thuban/Model/save.py (relative_filename): Wrapper around
7629            Thuban.Lib.fileutil.relative_filename that accepts an empty dir
7630            argument. save_session now automatically uses this version,
7631            solving a problem when saving to a relative filename.
7632    
7633            * setup.py: In the setup call, make sure that the library
7634            directories are under $prefix/lib not directly under $prefix.
7635    
7636    2002-06-20  Jan-Oliver Wagner <[email protected]>
7637    
7638            * Thuban/Model/extension.py: new module to handle extension objects.
7639            * Thuban/Model/messages.py: new messages for extensions.
7640            * Thuban/Model/session.py (Session.Extensions, Session.HasExtensions,
7641            Session.AddExtension): new for handling extensions.
7642            Also some other minor changes to round up extension handling.
7643            * Thuban/UI/tree.py (SessionTreeCrtl:update_tree): Added visualization
7644            of Extension titles and title and names of its objects.
7645    
7646    2002-05-29  Bernhard Herzog  <[email protected]>
7647    
7648            * Thuban/UI/mainwindow.py (MainWindow.bind_command_events): Bind
7649            the events for a command.
7650            (MainWindow.add_toolbar_command, MainWindow.add_menu_command):
7651            Call bind_command_events to bind the events. add_toolbar_command
7652            can now bind events too so that it's possible to have commands
7653            that are only available through the toolbar.
7654            (MainWindow.init_ids): New instance variable events_bound to keep
7655            track of for which commands events have been bound.
7656    
7657    2002-05-28  Bernhard Herzog  <[email protected]>
7658    
7659            * Thuban/UI/menu.py: New module to build and manage menus.
7660    
7661            * Thuban/UI/mainwindow.py: Remove some unused imports.
7662            (MainWindow.__init__, main_menu): move the definition of the main
7663            menu from __init__ to the Menu instance main_menu.
7664            (MainWindow.build_menu_bar, MainWindow.build_menu): New methods to
7665            build the menu bar and sub-menus from a menu description.
7666    
7667            * Thuban/UI/application.py (ThubanApplication.OnInit): Read the
7668            startup file
7669            (ThubanApplication.read_startup_files): New method to run
7670            ~/.thuban/thubanstart.py
7671    
7672            * Thuban/UI/mainwindow.py (MainWindow.__init__, main_toolbar):
7673            Move the toolbar definition to the Menu instance main_toolbar.
7674            (MainWindow.build_toolbar): New method to build the toolbar
7675            similar to the build_menu methods
7676    
7677    2002-05-23  Bernhard Herzog  <[email protected]>
7678    
7679            * Thuban/UI/mainwindow.py (MainWindow.__init__): Fix spelling of
7680            layer_outline_color. Fix it in the definition of the command too.
7681    
7682            * Thuban/UI/command.py (Command): Fix typo in doc string
7683    
7684    2002-05-22  Bernhard Herzog  <[email protected]>
7685    
7686            * Thuban/UI/mainwindow.py (MainWindow.RunMessageBox): Fix a typo
7687            in the docstring
7688    
7689    2002-05-15  Bernhard Herzog  <[email protected]>
7690    
7691            * Thuban/Model/layer.py (Layer.open_shapefile): Set bbox to None
7692            when the shapefile is empty.
7693            (Layer.BoundingBox, Layer.LatLongBoundingBox): Both methods may
7694            now return None for empty shapefiles. Update doc-strings.
7695    
7696            * Thuban/Model/map.py (Map.BoundingBox): Add doc-string. Deal with
7697            the layer's bbox being None.
7698    
7699            * Thuban/UI/tree.py (SessionTreeCtrl.update_tree): Deal with the
7700            layer's bbox being None.
7701    
7702            * Thuban/UI/view.py (MapCanvas.shape_selected): Only redraw when
7703            necessary.
7704            (MapCanvas.__init__): New instance variables, last_selected_layer
7705            and last_selected_shape to determine how the selection has
7706            changed.
7707    
7708            * Thuban/UI/tableview.py (TableGrid.__init__): Do not call
7709            AutoSizeColumns because it will cause a traversal of the entire
7710            table which for large .dbf files will take a very long time.
7711    
7712    2002-05-14  Bernhard Herzog  <[email protected]>
7713    
7714            * Thuban/Model/layer.py (Layer.open_shapefile): Choose a better
7715            maximum depth for the tree than shapelib does by default.
7716    
7717    2002-05-10  Bernhard Herzog  <[email protected]>
7718    
7719            * setup.py (py_modules): The shptree modules doesn't have a
7720            wrapper, so don't include it in the py_modules
7721    
7722    2002-05-08  Bernhard Herzog  <[email protected]>
7723    
7724            * extensions/shapelib/shptree.c (compare_ints): Make arguments
7725            const void * as in the qsort prototype
7726            (SHPTreeFindLikelyShapes): Remove some unused variables.
7727    
7728            * Thuban/UI/view.py (PanTool.MouseMove): Use the bitmap the view
7729            maintains to redraw the window during a drag.
7730            (MapCanvas.unprojected_rect_around_point): New method to determine
7731            a small region around a point for hit-testing.
7732            (MapCanvas.find_shape_at): Only test the shapes in a small region
7733            around the point.
7734    
7735            * setup.py: Increment the version to 0.1.2
7736    
7737            * Thuban/UI/tree.py (SessionTreeCtrl.unsubscribe_all): Remove a
7738            debug print and set session to None after unsubscribing
7739    
7740    2002-05-07  Bernhard Herzog  <[email protected]>
7741    
7742            * Data/iceland_sample.session, Data/iceland_sample.thuban: Rename
7743            the file to have a .thuban extension.
7744    
7745            * Thuban/UI/tree.py (session_channels): New class constant with
7746            all the session channels to subscribe to to update the tree
7747            (SessionTreeCtrl.session_changed): Remember the session so that we
7748            can unsubscribe properly. Use the new class constant to
7749            unsubscribe from the old session and subscribe to the new one.
7750            (SessionTreeCtrl.unsubscribe_all): New method to unsubscribe all
7751            subscriptions of the SessionTreeCtrl.
7752            (SessionTreeView.OnClose): Call the tree's unsubscribe_all method.
7753    
7754            * Thuban/UI/mainwindow.py (MainWindow.__init__): Add the "Show
7755            Session Tree" command to the file menu.
7756    
7757            * Thuban/UI/view.py (MapCanvas.do_redraw): Pass the entire bitmap
7758            as update_region to the renderer.
7759    
7760            * Thuban/UI/renderer.py
7761            (ScreenRenderer.layer_ids, ScreenRenderer.draw_shape_layer): The
7762            update box is now directly a tuple, not a wxRect anymore.
7763    
7764            * Thuban/Model/layer.py (Layer.ShapesInRegion): Remove some debug
7765            prints.
7766    
7767    2002-05-07  Bernhard Herzog  <[email protected]>
7768    
7769            * setup.py: Add the shptree extension module. See
7770            extensions/pyshapelib/ChangeLog for more details.
7771    
7772            * extensions/shapelib/shpopen.c, extensions/shapelib/shapefil.h,
7773            extensions/shapelib/dbfopen.c: Really update to the versions of
7774            shapelib 1.2.9. For some reason it wasn't really done on
7775            2002-04-11.
7776    
7777            * extensions/shapelib/shptree.c: Modified version of shptree.c of
7778            shapelib 1.2.9. The only real difference is the use of qsort
7779            instead of a bubble sort implementation
7780    
7781            * Thuban/Model/layer.py (Layer.__init__): New instance variable
7782            shapetree to hold the shapelib quadtree for the shapefile
7783            (Layer.open_shapefile): Create the quad tree.
7784            (Layer.ShapesInRegion): New method to return the ids of shapes in
7785            a given region using the quad tree.
7786    
7787            * extensions/thuban/wxproj.cpp (project_points): Fix some typos in
7788            comment
7789            (draw_polygon_shape): Accept both arcs and polygons.
7790            (initwxproj): Use the new PYSHAPELIB_IMPORT_API macro to import
7791            the api.
7792    
7793            * Thuban/UI/renderer.py (MapRenderer.layer_ids): New method to
7794            return the shape ids to be rendered in a given layer.
7795            (MapRenderer.draw_shape_layer): Call layer_ids to get the list of
7796            ids. Use draw_polygon_shape to draw arc shapes as well.
7797            (ScreenRenderer.RenderMap): New parameter for the rectangle that
7798            has to be updated
7799            (ScreenRenderer.layer_ids): Make use of the layer's quadtree by
7800            calling it's ShapesInRegion method.
7801    
7802            * Thuban/UI/view.py (MapCanvas.__init__): New instance variable
7803            update_region for the update region.
7804            (MapCanvas.OnPaint): Maintain the update region
7805            (MapCanvas.do_redraw): Pass the bounding box of the update_region
7806            to the renderer when drawing the bitmap. Reset the update_region.
7807    
7808    2002-05-03  Bernhard Herzog  <[email protected]>
7809    
7810            * Thuban/UI/mainwindow.py (MainWindow.SaveSessionAs,
7811            MainWindow.OpenSession): Change the file extension of the session
7812            files to .thuban
7813    
7814            * Thuban/Model/session.py (Session.AddMap, forwarded_channels):
7815            Move the map channels to be forwarded by the session into the
7816            class constant with forwarded_channels. Also add
7817            LAYER_PROJECTION_CHANGED and LAYER_VISIBILITY_CHANGED to
7818            forwarded_channels
7819    
7820            * Thuban/Model/base.py (Modifiable.changed): Fix doc-string (a
7821            typo and some rewording).
7822    
7823    2002-05-02  Bernhard Herzog  <[email protected]>
7824    
7825            * Thuban/UI/view.py: Keep the temporary bitmap used during drawing
7826            around to speed up most redraws:
7827            (MapCanvas.__init__): New instance variable bitmap which holds the
7828            bitmap
7829            (MapCanvas.do_redraw): Redraw self.bitmap if necessary. Use
7830            self.bitmap to draw.
7831            (MapCanvas.full_redraw): New method to force a full redraw
7832            including the bitmap
7833            (MapCanvas.SetMap): Subscribe full_redraw instead of redraw to
7834            make sure the bitmap is redrawn.
7835            (MapCanvas.projection_changed, MapCanvas.set_view_transform,
7836            MapCanvas.shape_selected): Call full_redraw instead of readraw to
7837            make sure the bitmap is redrawn.
7838            (MapCanvas.OnSize): New method to handle size events so that the
7839            bitmap can be redrawn.
7840    
7841    2002-04-29  Bernhard Herzog  <[email protected]>
7842    
7843            * Thuban/UI/mainwindow.py (MainWindow.__init__): Subscribe to the
7844            canvas' VIEW_POSITION event
7845            (MainWindow.view_position_changed): Handler for VIEW_POSITION.
7846            Update the text in the status-bar accordingly.
7847    
7848            * Thuban/UI/view.py (MapCanvas): Derive from Publisher as well
7849            (MapCanvas.__del__): Implement because Publisher.__del__ has to be
7850            called.
7851            (MapCanvas.__init__): Bind EVT_LEAVE_WINDOW too. Initialize
7852            current_position
7853            (MapCanvas.set_current_position): New method to set
7854            current_position. Issue a VIEW_POSITION event
7855            (MapCanvas.CurrentPosition): New public method to return the value
7856            of current_position. Should be called when the VIEW_POSITION event
7857            is processed.
7858            (MapCanvas.OnLeftDown, MapCanvas.OnLeftUp, MapCanvas.OnMotion):
7859            Update the position.
7860            (MapCanvas.OnLeaveWindow): Set the position to None.
7861    
7862            * Thuban/UI/messages.py (VIEW_POSITION): New message for the
7863            position in the statusbar
7864    
7865    2002-04-26  Frank Koormann <[email protected]>
7866    
7867            * Thuban/UI/mainwindow.py: AddLayer, Dialog title s/session/data
7868    
7869    2002-04-24  Frank Koormann <[email protected]>
7870    
7871            * Resources/Bitmaps/identify.xpm: shadow added
7872    
7873            * Resources/Bitmaps/fullextent.xpm: new
7874    
7875    2002-04-22  Jan-Oliver Wagner <[email protected]>
7876    
7877            * Thuban/UI/tree.py (update_tree): added test for None on map bounding
7878            box
7879    
7880    2002-04-21  Jan-Oliver Wagner <[email protected]>
7881    
7882            * Thuban/UI/proj4dialog.py (UTMProposeZoneDialog): new
7883    
7884            * Thuban/UI/tree.py (update_tree): added added map extent
7885    
7886            * Thuban/UI/mainwindow.py (_method_command): extended by parameter
7887            icon; added map_full_extend as tool
7888    
7889    2002-04-19  Jan-Oliver Wagner <[email protected]>
7890    
7891            * Thuban/UI/mainwindow.py (SaveSession): launch save as dialog for
7892            saving _new_ sessions
7893    
7894            * Thuban/Model/session.py (create_empty_session): new session
7895            don't have a filename (set to None)
7896    
7897            * Thuban/UI/tree.py (update_tree): added filename and modified flag
7898    
7899            * Thuban/Model/load.py (ProcessSession): convert projection
7900            parameters from unicode to regular string
7901    
7902            * Data/iceland_sample.session: Added UTM Zone 26 projection.
7903    
7904    2002-04-11  Bernhard Herzog  <[email protected]>
7905    
7906            * extensions/shapelib/shapefil.h, extensions/shapelib/shpopen.c,
7907            extensions/shapelib/dbfopen.c: Update to the versions of shapelib
7908            1.2.9
7909    
7910            * setup.py (Lib.wxproj extension): Don't link shpopen.c and put
7911            the pyshapelib directoy into the list of include dirs, so that
7912            pyshapelib_api.h can be found.
7913    
7914            * extensions/thuban/wxproj.cpp (pyshapelib_api): New variable that
7915            holds the pyshapelib C-API
7916            (draw_polygon_shape, point_in_polygon_shape, shape_centroid): Use
7917            pyshapelib_api to access the shapelib functions.
7918            (initwxproj): Import the c_api from the shapelib module and
7919            initialize pyshapelib_api.
7920    
7921    2002-04-04  Bernhard Herzog  <[email protected]>
7922    
7923            * setup.py (thuban_bdist_rpm.initialize_options): Use
7924            initialize_options to create the scripts for the rpm.
7925    
7926            * extensions/pyprojection/setup.py (PROJ4_PREFIX): Just use /
7927    
7928    2002-04-03  Bernhard Herzog  <[email protected]>
7929    
7930            * setup.py: Increment version to 0.1.1
7931    
7932            * Thuban/UI/mainwindow.py (MainWindow.__init__): Move the "Add
7933            Layer" and "Remove Layer" commands from the layer menu to the map
7934            menu
7935    
7936    2002-02-15  Bernhard Herzog  <[email protected]>
7937    
7938            * Thuban/Model/layer.py (Layer.Shape): list append only takes one
7939            argument (python <= 1.5.2 erroneously accepted multiuple
7940            arguments)
7941    
7942    2002-02-04  Bernhard Herzog  <[email protected]>
7943    
7944            * Thuban/UI/identifyview.py (IdentifyGridCtrl): New class to use a
7945            RecordGrid in the identifyview.
7946            (IdentifyView.__init__): Use IdentifyGridCtrl instead of
7947            IdentifyListCtrl. The grid allows editing of the values.
7948    
7949            * Thuban/UI/controls.py (RecordTable, RecordGridCtrl): New classes
7950            implementing a grid for a single row of a thuban table.
7951    
7952            * Thuban/UI/view.py (MapCanvas.SelectShapeAt): Search through all
7953            layers by default. Easier to use than the previous default of only
7954            searching through the select layer which meant that if no layer
7955            was selected, you couldn't select a shape.
7956    
7957            * Thuban/UI/tableview.py (TableGrid.__init__): Fix typo
7958    
7959            * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Honour the
7960            stroke_width attribute
7961    
7962            * Thuban/Model/save.py (save_session): Write the new stroke_width
7963            attribute
7964    
7965            * Thuban/Model/load.py (ProcessSession.startElement): Read the
7966            stroke_width attribute
7967    
7968            * Thuban/Model/layer.py (Layer.__init__): New parameter and
7969            instance variable stroke_width
7970            (Layer.SetStrokeWidth): Set the stroke_width.
7971    
7972    2002-02-01  Bernhard Herzog  <[email protected]>
7973    
7974            * extensions/thuban/wxproj.cpp (project_points): Fix two
7975            off-by-one errors in the last loop that joins the various parts
7976            together.
7977    
7978    2002-01-14  Bernhard Herzog  <[email protected]>
7979    
7980            * setup.py (data_dist.make_distribution): Fix some typos
7981    
7982    2001-09-18  Bernhard Herzog  <[email protected]>
7983    
7984            * README: Slight tweaking in preparation for the 0.1 release
7985    
7986            * setup.cfg: Add section for sdist to create both tgz and zip
7987            archives
7988    
7989            * setup.py: increase version number to 0.1
7990            (data_dist): New command class for data distribution
7991    
7992    2001-09-14  Bernhard Herzog  <[email protected]>
7993    
7994            * Thuban/UI/identifyview.py (IdentifyListCtrl.selected_shape):
7995            Handle the case of no layer (i.e. layer is None) properly.
7996    
7997            * Thuban/UI/proj4dialog.py (UTMDialog.__init__, Proj4Dialog.__init__):
7998            Set the initial selection of the combo boxes to reflect the
7999            projection we're starting with in a way that works on windows,
8000            too.
8001    
8002            * Thuban/Lib/connector.py (Connector.print_connections): Print the
8003            puiblisher's ids in hex to make it easier to compare them to the
8004            standard repr of python methods
8005    
8006            * Thuban/Model/map.py (Map.Destroy): Unsubscribe the label_layer
8007            messages
8008    
8009    2001-09-13  Bernhard Herzog  <[email protected]>
8010    
8011            * Thuban/UI/tree.py (SessionTreeCtrl.OnSelChanged): Make sure to
8012            deselect the layer if no layer is selected
8013    
8014            * Thuban/UI/view.py (MapCanvas.OnPaint): Only delay drawing to
8015            idle time when there actually is something to draw. If there's
8016            nothing to draw simply clear the window
8017            (MapCanvas.do_redraw): Call dc.EndDrawing and add some comments.
8018            (MapCanvas.SetMap): force a redraw in all cases because
8019            FitMapToWindow doesn't always do it.
8020            (MapCanvas.ZoomFactor): Add an optional parameter, center, to
8021            specify the point to move into the center of the window
8022            (ZoomOutTool.MouseUp, ZoomInTool.MouseUp): If the mouse wasn't
8023            dragged, zoon in/out by a factor of 2
8024            (MapCanvas.find_shape_at): Iterate backwards (i.e. with decreasing
8025            index, i.e. reversed drawing order) so that objects appearing to
8026            be in from of others are selected first. This is probably mostly
8027            relevant for point shapes where the symbols used may overlap
8028    
8029            * Thuban/Model/session.py (create_empty_session): Unset the
8030            modified bit before returning it
8031    
8032            * Thuban/UI/mainwindow.py (MainWindow.NewSession): Use
8033            create_empty_session session to create the new, empty session.
8034    
8035            * Thuban/UI/mainwindow.py (MainWindow.__init__): Set the size of
8036            the tool bitmaps.
8037            (MainWindow.OnClose, MainWindow.save_modified_session): Separate
8038            the code that asks whether the session should be saved into the
8039            new method save_modified_session.
8040            (MainWindow.OpenSession, MainWindow.NewSession): Use the new
8041            method to save modified session here too.
8042    
8043  2001-09-11  Bernhard Herzog  <[email protected]>  2001-09-11  Bernhard Herzog  <[email protected]>
8044    
8045          * setup.py (InnoIconItem): fix typo          * setup.py (InnoIconItem): fix typo
# Line 62  Line 8104 
8104          (MainWindow.identify_view_on_demand): Store the interactor in an          (MainWindow.identify_view_on_demand): Store the interactor in an
8105          instvar and use that reference instead of going through main.app          instvar and use that reference instead of going through main.app
8106    
8107          * Thuban/UI/mainwindow.py (MainWindow.ShowSessionTree):          * Thuban/UI/mainwindow.py (MainWindow.ShowSessionTree):
8108          * Thuban/UI/application.py (ThubanApplication.OnInit):          * Thuban/UI/application.py (ThubanApplication.OnInit):
8109          * Thuban/UI/main.py (main): Create the session tree view in main          * Thuban/UI/main.py (main): Create the session tree view in main
8110          with the new mainwindow method ShowSessionTree and not directly          with the new mainwindow method ShowSessionTree and not directly
8111          the application's OnInit method          the application's OnInit method
# Line 79  Line 8121 
8121          layer to the tableview dialog.          layer to the tableview dialog.
8122    
8123          * Thuban/UI/tableview.py: Add some doc-strings          * Thuban/UI/tableview.py: Add some doc-strings
8124          (TableGrid):          (TableGrid):
8125          (TableGrid.OnRangeSelect):          (TableGrid.OnRangeSelect):
8126          (TableGrid.OnSelectCell):          (TableGrid.OnSelectCell):
8127          (TableFrame.__init__):          (TableFrame.__init__):
# Line 146  Line 8188 
8188  2001-09-05  Bernhard Herzog  <[email protected]>  2001-09-05  Bernhard Herzog  <[email protected]>
8189    
8190          * Thuban/UI/view.py (MapCanvas.__init__): New argument, interactor.          * Thuban/UI/view.py (MapCanvas.__init__): New argument, interactor.
8191            
8192          * Thuban/UI/mainwindow.py (MainWindow.__init__): New argument          * Thuban/UI/mainwindow.py (MainWindow.__init__): New argument
8193          interactor to pass through to the MapCanvas          interactor to pass through to the MapCanvas
8194            
8195          * Thuban/UI/application.py (ThubanApplication.OnInit): Use the new          * Thuban/UI/application.py (ThubanApplication.OnInit): Use the new
8196          argument to the MainWindow constructor to get rid of the ugly hack          argument to the MainWindow constructor to get rid of the ugly hack
8197          that made main.app available early just so that the mapcanvas          that made main.app available early just so that the mapcanvas
# Line 196  Line 8238 
8238          (ThubanInstall.run): Remove the leading install root from the          (ThubanInstall.run): Remove the leading install root from the
8239          script filename if an install root was specified and use the new          script filename if an install root was specified and use the new
8240          link_file method          link_file method
8241            
8242          * Thuban/UI/mainwindow.py (MainWindow.AddLayer): Fit the map to          * Thuban/UI/mainwindow.py (MainWindow.AddLayer): Fit the map to
8243          the window when the first layer is added to the map.          the window when the first layer is added to the map.
8244    
# Line 233  Line 8275 
8275          (InnoIconItem): Helper class for bdist_inno          (InnoIconItem): Helper class for bdist_inno
8276          (thuban_bdist_inno): Thuban specific version of bdist_inno. Added          (thuban_bdist_inno): Thuban specific version of bdist_inno. Added
8277          this together with the appropriate parameters, to the setup call.          this together with the appropriate parameters, to the setup call.
8278            
8279          * setup.cfg (bdist_inno): added new section for the inno setup          * setup.cfg (bdist_inno): added new section for the inno setup
8280          installer          installer
8281    

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

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26