/[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 1418 by bh, Tue Jul 15 08:44:20 2003 UTC revision 1934 by bh, Tue Nov 11 16:38:32 2003 UTC
# Line 1  Line 1 
1    2003-11-11  Bernhard Herzog  <[email protected]>
2    
3            * Thuban/Model/resource.py (get_system_proj_file): Add a filename
4            parameter so that this function can be used for all proj files in
5            Resource/Projections
6            (DEFAULT_PROJ_FILE, EPSG_PROJ_FILE): New. Predefined filenames for
7            get_system_proj_file
8    
9            * Thuban/UI/projdialog.py (ProjFrame.__init__): Instead of one
10            ProjFile self.__sysProjFile use a dictionary of system ProjFile
11            objects self._sys_proj_files
12            (ProjFrame.build_dialog): Adapt to the new changes in the
13            ProjectionList constructor. Add a check button to toggle whether
14            EPSG projections are shown
15            (ProjFrame._OnShowEPSG): New. Handler for the epsg check button
16            events.
17            (ProjFrame.load_user_proj, ProjFrame.load_system_proj): Only show
18            the busy cursor if the files have not yet been loaded by the
19            dialog.
20            (ProjFrame.load_system_proj): Add a parameter for the name of the
21            proj file. Maintain the dictionary of system projections
22            self._sys_proj_files
23    
24            * Thuban/UI/projlist.py (ProjectionList): Merge the system_projs,
25            user_projs parameters into one parameter proj_files which is a
26            list of proj files.
27            (ProjectionList._subscribe_proj_files)
28            (ProjectionList._unsubscribe_proj_files): New. Move
29            subscription/unsubscription of projfile messages to separate
30            methods
31            (ProjectionList.Destroy): The unsubscribe is now done in
32            _unsubscribe_proj_files
33            (ProjectionList.update_projections): We now have a list of proj
34            file objects
35            (ProjectionList.SetProjFiles): New method to set a new list of
36            proj file objects
37    
38            * test/test_proj.py (ProjFileReadTests.test_get_system_proj_file):
39            Specify explicitly which system proj file to load.
40    
41    2003-11-11  Bernhard Herzog  <[email protected]>
42    
43            * Thuban/Model/load.py (SessionLoader.Destroy): New. Clear all
44            instance variables to cut cyclic references. The GC would have
45            collected the loader eventually but it can happen that it doesn't
46            run at all until thuban is closed (2.3 but not 2.2 tries a bit
47            harder and forces a collection when the interpreter terminates)
48            (load_session): Call the handler's Destroy method to make sure
49            that it gets garbage collected early. Otherwise it will be
50            collected very late if at all and it holds some references to e.g.
51            shapestores and the session which can lead to leaks (of e.g. the
52            temporary files)
53    
54            * test/test_load.py (TestSingleLayer.test_leak): New. test for the
55            resource leak in load_session
56    
57    2003-11-10  Bernhard Herzog  <[email protected]>
58    
59            * Thuban/UI/baserenderer.py: Add a way to specify how layers in
60            extensions are to be rendered.
61            (_renderer_extensions): New. List with renderer for layers in
62            extensions
63            (add_renderer_extension): New. Add a renderer extension
64            (init_renderer_extensions): New. Init the renderer extensions
65            (BaseRenderer.render_map_incrementally): Search
66            _renderer_extensions for how to draw unknown layer types
67            (BaseRenderer.draw_raster_data): Add format parameter so that
68            formats other than BMP can be drawn
69            (BaseRenderer.draw_raster_layer): Pass an explicit format to
70            draw_raster_data
71    
72            * Thuban/UI/renderer.py (raster_format_map): New. Mapping form the
73            strings of the format parameter of draw_raster_data method to wx
74            constants
75            (MapRenderer.draw_raster_data): Add the format parameter and use
76            raster_format_map to map it to the right wxwindows constant for
77            wxImageFromStream
78    
79            * test/test_baserenderer.py (SimpleRenderer.draw_raster_data): Add
80            the format parameter and record it
81            (TestBaseRenderer.test_raster_no_projection): check the format
82            paramter of the draw_raster_data method
83            (TestBaseRenderer.test_renderer_extension): New. Test the renderer
84            extension facility
85    
86    2003-11-07  Bernhard Herzog  <[email protected]>
87    
88            Tweak the usage of the sqlite database to make common use cases
89            more responsive. In most cases copying the data to the sqlite
90            database takes so long that using sqlite doesn't have enough
91            advantages.
92    
93            * Thuban/Model/transientdb.py (TransientTableBase.ValueRange): Add
94            comments about performance and query the min and max in separate
95            statements because only that way will indexes be used.
96            (TransientTableBase.UniqueValues): Add some comments about
97            performance.
98            (AutoTransientTable.ValueRange, AutoTransientTable.UniqueValues):
99            Do not copy the data to the transient DB but use the transient
100            copy if it exists. See the new comments for the performance trade
101            offs
102    
103            * test/test_transientdb.py
104            (TestTransientTable.test_auto_transient_table): Make sure that the
105            data is copied to the transient database at some point.
106    
107    2003-11-03  Bernhard Herzog  <[email protected]>
108    
109            * Thuban/Model/data.py (ShapefileStore.ShapesInRegion): Bind some
110            globals to locals so that it's a bit faster
111    
112    2003-11-03  Bernhard Herzog  <[email protected]>
113    
114            * Thuban/UI/baserenderer.py
115            (BaseRenderer.draw_shape_layer_incrementally): Use the ReadValue
116            method. ReadValue is faster than ReadRowAsDict since it only reads
117            one cell especially now that the dbf file objects actually
118            implement it.
119    
120            * Thuban/Model/table.py (DBFTable.ReadValue): Use the new
121            read_attribute method of the dbf objects
122    
123    2003-11-03  Bernhard Herzog  <[email protected]>
124    
125            * Extensions/profiling/profiling.py (popup_dialog_box): New config
126            variable to indicate whether the result should be shown in a
127            dialog box
128            (profile_screen_renderer, time_screen_renderer): Only show a
129            dialog box if popup_dialog_box is true.
130            (profile_screen_renderer): Flush stdout after the printing the
131            first part of the "profiling..." message
132    
133            * Thuban/UI/baserenderer.py
134            (BaseRenderer.draw_shape_layer_incrementally): Cache the pens and
135            brushes for the groups so that they're not created over and over
136            again
137    
138            * Thuban/Model/classification.py (Classification.__getattr__)
139            (Classification._compile_classification)
140            (Classification._clear_compiled_classification): New. Methods to
141            manage a 'compiled' representation of the classification groups
142            which is created on demand
143            (Classification.InsertGroup, Classification.RemoveGroup)
144            (Classification.ReplaceGroup): reset the compiled representation
145            (Classification.FindGroup): Use the compiled representation to
146            find the matching group
147            (ClassGroupRange.GetRangeTuple): New. Return the range as a tuple
148    
149    2003-10-31  Bernhard Herzog  <[email protected]>
150    
151            * Thuban/Model/classification.py (Classification.SetDefaultGroup):
152            Send a CLASS_CHANGED message
153            (Classification.RemoveGroup): Send a CLASS_CHANGED message and do
154            not return the removed group since it wasn't used.
155    
156            * test/test_classification.py
157            (TestClassification.test_set_default_group): New. Test the
158            SetDefaultGroup method
159            (TestClassification.test_insert_group): New. Test the InsertGroup
160            method
161            (TestClassification.test_remove_group): New. Test the RemoveGroup
162            method
163            (TestClassification.test_replace_group): New. Test the
164            ReplaceGroup method
165    
166    2003-10-31  Bernhard Herzog  <[email protected]>
167    
168            * test/test_classification.py (TestClassification.setUp):
169            Subscribe to the CLASS_CHANGED messages
170            (TestClassification.tearDown): New. Destroy the classification
171            properly
172            (TestClassification.test_defaults): Add tests for the default line
173            width and whether no messages were sent yet
174            (TestClassification.test_set_default_properties): Add tests for
175            messages and setting the default line width
176            (TestClassification.test_add_singleton)
177            (TestClassification.test_add_range)
178            (TestClassification.test_multiple_groups): Add tests for messages
179    
180    2003-10-31  Bernhard Herzog  <[email protected]>
181    
182            Some more refactoring in preparation for new tests:
183    
184            * test/test_classification.py (TestClassification.setUp): New.
185            Instantiate the classification here. Update the test methods
186            accordingly.
187            (TestClassification.test_multiple_groups): Make sure that the two
188            singletons matching 1 are considered different.
189    
190    2003-10-31  Bernhard Herzog  <[email protected]>
191    
192            * test/test_classification.py (red, green, blue): New. These
193            constants were used in several cases. Update the relevant methods.
194            (TestClassification.test_defaults)
195            (TestClassification.test_set_default_properties)
196            (TestClassification.test_add_singleton)
197            (TestClassification.test_add_range)
198            (TestClassification.test_multiple_groups)
199            (TestClassification.test_deepcopy): New. These were formerly all
200            part of the single method test.
201            (TestClassification.test_deepcopy): Removed.
202            (TestClassIterator): Removed. The test case is now a method of
203            TestClassification since it tests part of the public interface of
204            Classification
205            (TestClassification.test_iterator): New. Used to be
206            TestClassIterator effectively
207    
208    2003-10-31  Jan-Oliver Wagner <[email protected]>
209    
210            GUIfied the functions of the profiling extension.
211    
212            * /Extensions/profiling/__init__.py: New: Init to make this
213            directory a package.
214    
215            * Extensions/profiling/profiling.py: Moved menu entries to
216            the Extensions menu. Applied _() for strings.
217            (profile_screen_renderer): Catch the detailed printout and present
218            it in a dialog.
219            (time_screen_renderer): Raise a dialog to present the result instead
220            of printing it to stdout.
221    
222    2003-10-31  Bernhard Herzog  <[email protected]>
223    
224            * test/test_classification.py (TestClassGroupProperties)
225            (TestClassGroup, TestClassGroupDefault, TestClassGroupRange)
226            (TestClassGroupSingleton, TestClassIterator, TestClassification):
227            Split TestClassification into several classes, one for each class
228            being tested. TestClassification itself now only tests
229            Classification. This split makes changes to the tests a bit easier
230    
231    2003-10-31  Bernhard Herzog  <[email protected]>
232    
233            * Extensions/profiling/profiling.py: New. Extension to measure
234            Thuban performance
235    
236    2003-10-31  Frank Koormann <[email protected]>
237    
238            Added two items to legend popup menu: Remove Layer and Show Layer Table
239    
240            * Thuban/UI/legend.py (LegendPanel._OnRemoveLayer,
241            LegendPanel._OnShowTable): New event handlers, call the corresponding
242            mainwindow methods.
243            (LegendTree._OnRightClick): Added items to popup menu.
244    
245    2003-10-30  Bernhard Herzog  <[email protected]>
246    
247            * Thuban/UI/dialogs.py (ThubanFrame.__init__): Handle
248            EVT_WINDOW_DESTROY
249            (ThubanFrame.OnDestroy): New. Handler for EVT_WINDOW_DESTROY. Does
250            nothing but is convenient for the derived classes.
251    
252            * Thuban/UI/tableview.py
253            (TableFrame.OnDestroy, LayerTableFrame.OnDestroy): New.
254            Unsubscribe the messages here not in OnClose because that might
255            get called multiple times. Fixes RT #2196
256            (TableFrame.OnClose, LayerTableFrame.OnClose): Removed. Not needed
257            anymore.
258    
259            * README: Update the minimum requirement for wxPython. Since we
260            now use the EVT_WINDOW_DESTROY event, we need at least 2.4.0.4,
261            the version in which that was introduced for all platforms
262    
263    2003-10-30  Frank Koormann <[email protected]>
264    
265            * Thuban/UI/join.py (JoinDialog.OnJoin): Wrapped the major parts of
266            the join process in a ThubanBeginBusyCursor, ThubanEndBusyCursor
267            frame.
268    
269    2003-10-30  Jan-Oliver Wagner <[email protected]>
270    
271            Improved APR import extension, added further EPSG definitions
272            and some cleanup regarding string class.
273    
274            * test/test_proj.py (TestProjection.test_get_projection_units_geo):
275            Added test for alias 'longlat'.
276    
277            * Resources/Projections/epsg-deprecated.proj: New. Contains
278            deprecated EPSG definitions.
279    
280            * Extensions/importAPR/odb.py (ODBBaseObject.TreeInfo): Added
281            the variable names for objects.
282    
283            * Extensions/importAPR/apr.py (APR_BLnSym, APR_BMkSym, APR_BShSym): New.
284            Copied from importAPR and provided with documentation.
285    
286            * Extensions/importAPR/importAPR.py (APR_BLnSym, APR_BMkSym, APR_BShSym):
287            Moved to apr.py.
288            (APR_View): Added object ref 'ITheme'.
289    
290            * Thuban/Lib/fileutil.py, Thuban/UI/proj4dialog.py: Replaced string
291            split function by corresponding use of the string class method.
292    
293            * Thuban/Model/xmlwriter.py: Replaced string replace function by
294            corresponding string method.
295    
296    2003-10-29  Bernhard Herzog  <[email protected]>
297    
298            * Thuban/UI/baserenderer.py
299            (BaseRenderer.draw_shape_layer_incrementally): Speed up the
300            special case of a classification that only has the default group
301    
302    2003-10-27  Bernhard Herzog  <[email protected]>
303    
304            * po/fr.po, po/es.po: Updated translations from Daniel Calvelo
305    
306            * po/de.po: Update.
307    
308            * Thuban/UI/application.py
309            (ThubanApplication.ShowExceptionDialog): Handle translation of the
310            dialog message properly
311    
312    2003-10-27  Bernhard Herzog  <[email protected]>
313    
314            Rework how localization works so that we use wx's translation
315            functions when running Thuban as a normal application but not when
316            we don't need any UI, such as in the test suite. See the comment
317            in Thuban/__init__.py for details
318    
319            * Thuban/__init__.py (_): Add one level of indirection to make the
320            translation handling more flexible and to make it possible to use
321            either wx's translation services or not.
322            (gettext_identity, translation_function_installed)
323            (install_translation_function): New function to help with this
324    
325            * Thuban/UI/__init__.py: Install the wx specific translation
326            function if it's OK to do that
327    
328            * test/support.py (initthuban): Install a dummy translation
329            function so that importing Thuban.UI doesn't install a wx specific
330            one for which would need to import wxPython
331    
332    2003-10-27  Bernhard Herzog  <[email protected]>
333    
334            * HOWTO-Release: Source archives should be created first and the
335            binary packages should be created from the source archives.
336            There's an official debian package now so there's no need to test
337            the rpm on debian anymore
338    
339    2003-10-27  Bernhard Herzog  <[email protected]>
340    
341            Several rendering changes:
342    
343             - Render the selection into a separate bitmap so that only that
344               bitmap needs to be redrawn when the selection changes
345    
346             - Render incrementally showing previews and allowing interaction
347               before rendering is complete
348    
349             - Update the renderer interface a bit. Most parameters of
350               RenderMap are now parameters of the constructor
351    
352            * Thuban/UI/baserenderer.py (BaseRenderer.__init__): Add the map
353            and the update region as parameters. Update the doc-string
354            (BaseRenderer.render_map_incrementally): New. Generator function
355            to renders the map incrementally
356            (BaseRenderer.render_map): Remove the map argument (it's now in
357            the constructor) and simply iterate over the
358            render_map_incrementally generator to draw the map.
359            (BaseRenderer.draw_shape_layer_incrementally)
360            (BaseRenderer.draw_shape_layer): Renamed to
361            draw_shape_layer_incrementally and changed into a generator that
362            yields True every 500 shapes. Used by render_map_incrementally to
363            render shape layers incrementally
364    
365            * Thuban/UI/renderer.py (ScreenRenderer.RenderMap): Removed the
366            map and region parameters which are now in the constructor
367            (ScreenRenderer.RenderMapIncrementally): New. Public frontend for
368            the inherited render_map_incrementally.
369            (BaseRenderer.draw_shape_layer): Removed.
370            (ScreenRenderer.draw_selection_incrementally): New. The selection
371            drawing part of the removed draw_shape_layer as a generator
372            (ScreenRenderer.layer_shapes): Update because of the region
373            parameter change
374            (ExportRenderer.__init__): New. Extend the inherited constructor
375            with the destination region for the drawing
376            (ExportRenderer.RenderMap): Removed the map and region parameters
377            which are now in the constructor
378    
379            * Thuban/UI/view.py (MapCanvas.PreviewBitmap): New. Return a
380            bitmap suitable for a preview in a tool
381            (CanvasPanTool.MouseMove): Use the PreviewBitmap method to get the
382            bitmap
383            (MapPrintout.draw_on_dc): Adapt to new renderer interface
384            (MapCanvas.OnPaint): Handle drawing the selection bitmap if it
385            exists
386            (MapCanvas.OnIdle): Update the logic to deal with incremental
387            rendering and the selection bitmap
388            (MapCanvas._do_redraw): Handle the instantiation of the render
389            iterator and the redraws during rendering
390            (MapCanvas._render_iterator): New. Generator to incrementally
391            redraw both bitmaps
392            (MapCanvas.Export): Adapt to new renderer interface.
393            (MapCanvas.full_redraw): Reset the selection bitmap and the
394            renderer iterator too
395            (MapCanvas.redraw_selection): New. Force a redraw of the selection
396            bitmap
397            (MapCanvas.shape_selected): Only redraw the selection bitmap
398    
399            * test/test_baserenderer.py
400            (TestBaseRenderer.test_polygon_no_projection)
401            (TestBaseRenderer.test_raster_no_projection)
402            (TestBaseRenderer.test_point_map_projection)
403            (TestBaseRenderer.test_point_layer_and_map_projection)
404            (TestBaseRenderer.test_point_layer_projection)
405            (TestBaseRenderer.test_point_with_classification): Adapt to new
406            renderer interface
407    
408    2003-10-24  Bernhard Herzog  <[email protected]>
409    
410            * libraries/thuban/wxproj.cpp (draw_polygon_shape)
411            (point_in_polygon_shape, shape_centroid): Raise an exception if
412            the shape can't be read. Previously invalid shape ids would lead
413            to a segfault.
414    
415            * test/test_wxproj.py (TestShapeCentroid.test_invalid_shape_id):
416            New. test whether an exception is raised for invalid shape ids
417    
418    2003-10-24  Jan-Oliver Wagner <[email protected]>
419    
420            * Thuban/Model/proj.py (Projection.GetProjectedUnits): Added 'longlat'
421            as alias for 'latlong'.
422    
423            * Thuban/UI/projdialog.py (ProjFrame.__init__): Added 'longlat'
424            as alias for 'latlong'.
425    
426    2003-10-24  Jan-Oliver Wagner <[email protected]>
427    
428            * Thuban/UI/projdialog.py (ProjFrame.proj_selection_changed): Set
429            the projection even for the UnknownPanel.
430            (UnknownProjPanel.__init__): Define the text and create the textctrl
431            widget.
432            (UnknownProjPanel._DoLayout): Replaced static text widget by the
433            textctrl created in __init__.
434            (UnknownProjPanel.SetProjection): Set the text for the text ctrl
435            including the parameters of the projection.
436            
437    2003-10-24  Jan-Oliver Wagner <[email protected]>
438    
439            * Resources/Projections/epsg.proj: New. This is a list of
440            EPSG codes with parameters for proj. The list has been
441            generated using devtools/create_epsg.py based on the
442            file nad/epsg of the proj 4.4.7 package. Four projection
443            definitions have been deleted as they are not accepted by proj:
444            "CH1903+ / LV95", "Bern 1898 (Bern) / LV03C", "CH1903 / LV03"
445            and "HD72 / EOV".
446    
447    2003-10-22  Bernhard Herzog  <[email protected]>
448    
449            Some more tweaks to the projection dialog which should fix RT
450            #1886.
451    
452            * Thuban/UI/projlist.py (ProjectionList.Destroy): Unsubscribe from
453            the ProjFile's messages and call the base class methods correctly
454            (ProjectionList.SelectProjection): Set the wxLIST_STATE_FOCUSED
455            flag on the newly selected item too. Otherwise some other item is
456            focused and the first time the focus is moved with the keyboard
457            the selection moves in unexpected ways.
458    
459            * Thuban/UI/projdialog.py (ProjFrame.__init__): Do not set the
460            focus on the OK button, only on the projection list. That way the
461            list really has the focus initially
462            (ProjFrame.OnClose): Call the projection list's Destroy method to
463            make it unsubscribe all messages
464    
465    2003-10-21  Bernhard Herzog  <[email protected]>
466    
467            Rework the projection dialog to fix a few bugs, including RT 2166
468            and most of 2168
469    
470            * Thuban/UI/projlist.py: New. The class ProjectionList is a
471            special wxListCtrl to show a list of projections in a more MVC
472            fashion
473    
474            * Thuban/UI/projdialog.py (ProjFrame): Substantial changes
475            throughout the class. The main change is to use the ProjectionList
476            class instead of a normal wxListBox. Also, add an explicit
477            "Unknown" projection to the projection choice control.
478            (ProjPanel.__init__): Add an "unknown" ellipsoid
479            (TMPanel.__init__, LCCPanel.__init__): Tweak the order of
480            instantiation of the panel's controls to make the tab-order more
481            natural
482    
483    2003-10-21  Bernhard Herzog  <[email protected]>
484    
485            * test/test_load.py (TestSingleLayer.file_contents)
486            (TestSingleLayer.test): Add non-ascii characters to the titles of
487            session, map and layer. This is effectively a port of the
488            TestUnicodeStrings test in test_load_0_8.py which for some reason
489            was only added there.
490    
491            * test/test_load_0_9.py (TestSingleLayer.file_contents)
492            (TestSingleLayer.test): Same as in test_load.py: add non-ascii
493            characters to the titles of session, map and layer,.
494    
495    2003-10-21  Bernhard Herzog  <[email protected]>
496    
497            Add EPSG projection handling to .thuban files
498    
499            * test/test_save.py (SaveSessionTest.dtd)
500            (SaveSessionTest.testEmptySession)
501            (SaveSessionTest.testLayerProjection)
502            (SaveSessionTest.testRasterLayer)
503            (SaveSessionTest.testClassifiedLayer)
504            (SaveSessionTest.test_dbf_table)
505            (SaveSessionTest.test_joined_table)
506            (SaveSessionTest.test_save_postgis): Update to 1.0-dev namespace
507            (SaveSessionTest.testSingleLayer): Update to 1.0-dev namespace and
508            use a and epsg projection to test saving them
509    
510            * test/test_load.py (LoadSessionTest.dtd): Update to 1.0-dev
511            namespace
512            (TestLayerVisibility.file_contents, TestLabels.file_contents)
513            (TestLayerProjection.file_contents)
514            (TestRasterLayer.file_contents, TestJoinedTable.file_contents)
515            (TestPostGISLayer.file_contents)
516            (TestPostGISLayerPassword.file_contents)
517            (TestLoadError.file_contents, TestLoadError.test): Update to use
518            1.0-dev namespace
519            (TestSingleLayer.file_contents, TestSingleLayer.test): Update to
520            use 1.0-dev namespace and use an EPSG projection to test whether
521            loading it works
522    
523            * test/test_load_0_9.py: New. Effectively a copy of test_load.py
524            as of Thuban 0.9. These are now tests to determine whether Thuban
525            can still read files generated by Thuban 0.9
526    
527            * Thuban/Model/save.py (SessionSaver.write)
528            (SessionSaver.write_session): Use the 1.0 dtd and 1.0-dev
529            namespace
530            (SessionSaver.write_projection): Write the projection's epsg
531            attribute
532    
533            * Thuban/Model/load.py (SessionLoader.__init__): Also accept the
534            thuban-1.0-dev.dtd namespace
535            (SessionLoader.check_attrs): Allow a callable object as conversion
536            too
537            (SessionLoader.start_projection, SessionLoader.end_projection)
538            (SessionLoader.start_parameter): Handle the epsg attribute and
539            rename a few instance variables to lower case
540    
541            * Resources/XML/thuban-1.0.dtd: New. Only difference to
542            thuban-0.9.dtd is the epsg attribute for projections.
543    
544    2003-10-21  Bernhard Herzog  <[email protected]>
545    
546            * test/runtests.py (main): Let the user specify which tests to run
547            on the command line
548    
549            * test/support.py (ThubanTestResult.getDescription): Override to
550            give a better short description. The description can be used as a
551            parameter to run_tests to run that particular test in isolation.
552    
553    2003-10-21  Frank Koormann   <[email protected]>
554    
555            Popup menu for legend. Scheduled for the 1.2 release this was too
556            simple to implement: The popup menu is bound to the legend tree, while
557            the events are hanlded by its anchestor, the legend panel. This
558            allows reuse of all the event handlers already implemented for the
559            legend toolbar buttons.
560    
561            * Thuban/UI/legend.py (LegendPanel.__init__): EVT_MENU macros
562            to add handlers for the events issued by the popup menu.
563            (LegendPanel._OnToggleVisibility): Handler for toggling layer
564            visibility event
565            (LegendPanel._OnProjection): Handler for layer projection event.
566            (LegendTree.__init__): Added EVT_TREE_ITEM_RIGHT_CLICK
567            (LegendTree._OnRightClick): Event handler for right click, select item
568            and pop up menu.
569            (LegendTree.ToggleVisibility): Toggle layer visibility
570            (LegendTree.LayerProjection): Raise layer projection dialog for
571            current layer.
572    
573    2003-10-21  Bernhard Herzog  <[email protected]>
574    
575            * Resources/Projections/defaults.proj: Use correct DOCTYPE
576            declaration. The top-level element is projectionlist not projfile
577    
578    2003-10-20  Bernhard Herzog  <[email protected]>
579    
580            * Thuban/UI/projdialog.py (ProjFrame.write_proj_file): New. helper
581            method to write a projfile and display a busy cursor and error
582            dialogs.
583            (ProjFrame._OnSave, ProjFrame._OnAddToList, ProjFrame._OnImport)
584            (ProjFrame._OnExport, ProjFrame._OnRemove): Use write_proj_file
585            (ProjFrame.__FillAvailList): Translate "<None>" too and display a
586            busy cursor while loading the user and system prj files.
587    
588    2003-10-16  Bernhard Herzog  <[email protected]>
589    
590            * Thuban/Model/resource.py (projfile_cache): Introduce a cache for
591            ProjFile objects
592            (clear_proj_file_cache): New function to clear the cache. Mainly
593            useful for use by the test suite
594            (read_proj_file): Use the cache.
595    
596            * test/test_proj.py (TestProjFile): Clarify the doc-string
597            (ProjFileReadTests): Update doc-string
598            (ProjFileReadTests.test_get_system_proj_file): Check whether the
599            system proj files is cached.
600            (ProjFileLoadTestCase): New base class for the proj file tests
601            derived from support.FileLoadTestCase to provide some common
602            behavior.
603            (TestLoadingProjFile)
604            (TestLoadingProjFileWithEmptyProjectionlist.file_contents)
605            (TestProjFileWithInvalidParameters.file_contents): Derive from
606            ProjFileLoadTestCase
607            (TestLoadingProjFile.test_caching): New. Test whether the cache
608            works
609    
610    2003-10-16      Silke Reimer    <[email protected]>
611    
612            * debian/*: New directory with configuration files for building a thuban
613              deb-package.
614    
615    2003-10-14  Bernhard Herzog  <[email protected]>
616    
617            * test/test_proj.py: Execute support.run_tests when run as
618            __main__ so that missing unsubscribes are detected
619            (TestProjFile.tearDown): Destroy the proj_file properly
620    
621    2003-10-14  Bernhard Herzog  <[email protected]>
622    
623            * Thuban/Model/messages.py (PROJECTION_ADDED)
624            (PROJECTION_REPLACED, PROJECTION_REMOVED): New message types for
625            the ProjFile objects
626    
627            * Thuban/Model/proj.py (ProjFile): Derive from Publisher so we can
628            easily send messages when the projections change
629            (ProjFile.Add, ProjFile.Remove, ProjFile.Replace): Issue messages
630            when the change was successful
631    
632            * test/test_proj.py (TestProjFile.setUp): Subscribe to some of the
633            proj file messages
634            (TestProjFile.test_add_remove)
635            (TestProjFile.test_remove_non_existing)
636            (TestProjFile.test_replace)
637            (TestProjFile.test_replace_non_existing): Test whether the right
638            messages are sent
639    
640    2003-10-14  Bernhard Herzog  <[email protected]>
641    
642            * test/test_proj.py (TestProjFile.test): Refactor into several
643            tests
644            (TestProjFile.test_add_remove)
645            (TestProjFile.test_remove_non_existing)
646            (TestProjFile.test_replace)
647            (TestProjFile.test_replace_non_existing): Some of the new
648            individual test cases
649            (TestProjFileSimple): New class for the rest of the test cases
650            that came out of the refactoring
651            (ProjFileTest): Derive from xmlsupport.ValidationTest so that the
652            derived classes don't have to
653    
654    2003-10-13  Bernhard Herzog  <[email protected]>
655    
656            Add an optional EPSG code to the projection objects and extend the
657            .proj file format accordingly.
658    
659            * Resources/XML/projfile.dtd (element projection): Add epsg
660            attribute
661    
662            * Thuban/Model/proj.py (Projection.__init__): New parameter and
663            instance variable epsg. Update doc-string
664            (Projection.EPSGCode, Projection.Label): New methods to provide
665            access to EPSG code and a label for use in dialogs
666    
667            * Thuban/Model/resource.py (ProjFileReader.start_projection)
668            (ProjFileReader.end_projection, ProjFileSaver.write_projfile):
669            Handle the epsg code attribute when reading or writing proj files
670    
671            * Thuban/UI/projdialog.py (ProjFrame._OnSave)
672            (ProjFrame._OnAddToList, ProjFrame.__DoOnProjAvail)
673            (ProjFrame.__FillAvailList): Use the projection's Label method to
674            get the string for the list box
675    
676            * test/test_proj.py (TestProjection.test_label)
677            (TestProjection.test_label_epsg)
678            (TestProjection.test_epsgcode_for_non_epsg_projection)
679            (TestProjection.test_epsgcode_for_real_epsg_projection): New tests
680            for the label and EPSGCode methods
681            (WriteProjFileTests.doTestWrite, WriteProjFileTests.test_write)
682            (WriteProjFileTests.test_write_empty_file): Create the ProjFile
683            objects in the test cases and put the expected contents into the
684            test case methods too. Update doTestWrite accordingly
685            (TestLoadingProjFile)
686            (TestLoadingProjFileWithEmptyProjectionlist): New classes with the
687            read tests from TestProjFile.
688            (TestProjFile.doTestRead, TestProjFile.testRead): Removed. These
689            tests are now in the new classes.
690            (sample_projfile, sample_projfile_data)
691            (sample_projfile2, sample_projfile_data2): Removed. Not used
692            anymore.
693            (TestProjFile.test_read_unreadable_file): No need to reset the
694            permissions at the end anymore since we use a unique filename
695    
696    2003-10-13  Bernhard Herzog  <[email protected]>
697    
698            * test/test_proj.py: Some more refactoring of the test cases
699            (ProjFileTest): New base class for the proj file tests.
700            (TestProjFile): Derive from ProjFileTest
701            (TestProjFile.test_read_unreadable_file)
702            (TestProjFile.test_read_empty_file, TestProjFile.doTestRead): Use
703            the new filename method to get a unique filename
704            (TestProjFile.doTestWrite, TestProjFile.testWrite): Removed.
705            (WriteProjFileTests): New class for proj file write tests.
706            Contains the write test that were in TestProjFile originally.
707    
708    2003-10-13  Bernhard Herzog  <[email protected]>
709    
710            * test/test_proj.py (TestProjFile.testRead)
711            (TestProjFile.test_read_non_existing_file)
712            (TestProjFile.test_read_unreadable_file)
713            (TestProjFile.test_read_empty_file): Split into several methods.
714    
715    2003-10-10  Bernhard Herzog  <[email protected]>
716    
717            * Thuban/UI/sizers.py: New file with custom sizers.
718    
719            * Thuban/UI/projdialog.py (ProjFrame.build_dialog): Instantiate
720            all projection type specific panels and put them into a
721            NotebookLikeSizer. This way the dialog doesn't change its size
722            when a different projection is selected
723            (ProjFrame.__init__): Rename projection_panels
724            projection_panel_defs and reuse projection_panels for a list of
725            the instantiated panels.
726            (ProjFrame._show_proj_panel, ProjFrame.__DoOnProjAvail)
727            (ProjFrame.__DoOnProjChoice): Changes due to the new handling of
728            the panels
729            (UnknownProjPanel._DoLayout): Place the newlines in the message
730            differently to make the panel narrower.
731            (TMPanel._DoLayout): Layout the parameters in one column.
732    
733    2003-10-10  Bernhard Herzog  <[email protected]>
734    
735            * Thuban/UI/projdialog.py (ProjFrame.build_dialog): New method
736            that contains all the setup for the dialog's widgets, layout and
737            event handling.
738            (__): Call build_dialog to build the dialog.
739            (ProjFrame.__set_properties, ProjFrame.__do_layout): Removed.
740            Their functionality is now in build_dialog
741            (ProjFrame.__VerifyButtons, ProjFrame.__VerifyButtons)
742            (ProjFrame.__DoOnProjAvail, ProjFrame.__DoOnProjAvail)
743            (ProjFrame.__DoOnProjChoice): Small updates due to slightly
744            different widget names and hierarchy introduced with build_dialog.
745    
746    2003-10-10  Bernhard Herzog  <[email protected]>
747    
748            * README: Fix typo.
749    
750    2003-10-09  Bernhard Herzog  <[email protected]>
751    
752            * Thuban/Model/proj.py (ProjFile.Add): Do not check whether the
753            projection is already in the list. This is *a lot* faster when
754            loading files with hundreds of projections since it saves a linear
755            search. OTOH this will allow adding the same projection to the
756            user.proj file multiple times in the projection dialog but we'll
757            deal with that later
758    
759    2003-10-09  Jan-Oliver Wagner <[email protected]>
760    
761            * devtools: New. Directory for developer tools that are not intended
762            for the regular user.
763    
764            * devtools/create_epsg.py: New. Convert the epsg file of proj into
765            a python .proj file.
766    
767    2003-10-09  Bernhard Herzog  <[email protected]>
768    
769            * test/test_proj.py
770            (TestProjection.test_get_parameter_without_equals_sign): New. Test
771            whether GetParameter handles parameters without "=" sign correctly
772    
773            * Thuban/Model/proj.py (Projection.GetParameter): Handle
774            parameters that do not contain a "=". Update the doc-string
775    
776    2003-10-08  Bernhard Herzog  <[email protected]>
777    
778            * Thuban/UI/projdialog.py (ProjFrame.__set_properties): Remove the
779            length limit on the projname text control
780    
781    2003-10-08  Bernhard Herzog  <[email protected]>
782    
783            * test/test_proj.py (TestProjection.test_get_projection_units_geo)
784            (TestProjection.test_get_projection_units_normal): New. Tests for
785            the Projection.GetProjectedUnits method
786    
787    2003-10-08  Jan-Oliver Wagner <[email protected]>
788    
789            * Thuban/Model/resource.py (get_user_proj_file): small bug-fix:
790            Added missing 'val' parameter.
791    
792    2003-10-08  Bernhard Herzog  <[email protected]>
793    
794            * Thuban/UI/projdialog.py (ProjFrame.__DoOnProjAvail): When the
795            projection type of the currently selected projection is not known,
796            i.e. there's no panel for it, use the UnknownProjPanel
797            (ProjFrame.__DoOnProjChoice, ProjFrame._show_proj_panel): Split
798            the actual replacing of the proj panel into the new method
799            _show_proj_panel.
800            (UnknownProjPanel): Add doc-string.
801            (UnknownProjPanel._DoLayout): Insert a newline into the text so
802            that the panel is not so wide.
803    
804    2003-10-08  Bernhard Herzog  <[email protected]>
805    
806            * Thuban/Model/resource.py (read_proj_file): Return the warnings
807            too. Update the doc-string
808            (get_proj_files): Removed. It wasn't used anywhere
809            (get_system_proj_files, get_system_proj_file): Rename to
810            get_system_proj_file and return the ProjFile object and not a list
811            of ProjFile objects. Update the callers.
812            (get_user_proj_files, get_user_proj_file): Rename to
813            get_user_proj_file return the ProjFile object and not a list of
814            ProjFile objects. Update the callers.
815            (ProjFileReader.__init__): New instance variable for the warnings.
816            Rename the __pf ivar to projfile. Update the methods referring to
817            __pf
818            (ProjFileReader.end_projection): Catch any errors raised when
819            instantiating the projection and record that as an error. The
820            projection will not be in the final ProjFile object.
821            (ProjFileReader.GetWarnings): New method to return the warnings.
822    
823            * Thuban/UI/projdialog.py (ProjFrame.show_warnings): New method to
824            show the warnings from the projfile reader
825            (ProjFrame._OnImport): Deal with any warnings returned by
826            read_proj_file
827            (ProjFrame.__FillAvailList): Deal with any warnings returned by
828            get_system_proj_file or get_user_proj_file.
829    
830            * test/test_proj.py (TestProjFile.doTestRead): Check the warnings.
831            (TestProjFileWithInvalidParameters.file_contents): New test cases
832            to test whether read_proj_file handles invalid projection
833            parameters correctly
834            (TestProjFile.test_get_system_proj_file): New. Simple test for
835            resource.get_system_proj_file
836    
837    2003-10-07  Bernhard Herzog  <[email protected]>
838    
839            * test/test_derivedshapestore.py
840            (TestDerivedShapeStoreExceptions.tearDown): Clear the session
841            properly so that the temporary directories get deleted correctly
842    
843    2003-10-06  Bernhard Herzog  <[email protected]>
844    
845            Handle the title changes in a proper MVC way.
846    
847            * Thuban/UI/mainwindow.py (MainWindow.__init__): Subscribe to the
848            canvas' TITLE_CHANGED messages
849            (MainWindow.update_title): New. Update the main window's title
850            (MainWindow.__SetTitle): Removed. Use update_title instead.
851            (MainWindow.SetMap): Use update_title instead of __SetTitle
852            (MainWindow.RenameMap): Do change the window title explicitly
853            here. That's handled in a proper MVC way now.
854            (MainWindow.title_changed): New. Subscriber for the TITLE_CHANGED
855            messages
856    
857            * Thuban/Lib/connector.py (Conduit): New class to help classes
858            that forward messages
859    
860            * Thuban/UI/viewport.py: Forward the map's TITLE_CHANGED messages
861            (ViewPort): Derive from Conduit instead of Publisher
862            (ViewPort.Subscribe, ViewPort.Unsubscribe): Use the new base class
863            when calling the inherited versions
864            (ViewPort._subscribe_map, ViewPort._unsubscribe_map): New helper
865            methods to subscribe and unsubscribe map messages
866            (ViewPort.SetMap, ViewPort.Destroy): Use the new helper methods to
867            handle the map subscriptions
868            (ViewPort.Map, ViewPort.map_projection_changed)
869            (ViewPort.layer_projection_changed): Add or update doc-strings
870    
871            * test/test_connector.py (TestPublisher.test_issue_simple): Fix
872            typo
873            (MyConduit): Helper class for the Conduit test.
874            (TestConduit): Test cases for Conduit
875    
876            * test/test_connector.py: Use support.run_tests as main.
877    
878            * test/test_viewport.py (ViewPortTest.setUp): Also subscribe to
879            the TITLE_CHANGED messages
880            (ViewPortTest.test_forwarding_title_changed): New test to check
881            whether the viewport forwards the map's TITLE_CHANGED messages
882            (TestViewportWithPostGIS.tearDown): Call the map's Destroy method
883            after the port's because the latter may require a still functional
884            map.
885    
886    2003-10-06  Bernhard Herzog  <[email protected]>
887    
888            * Thuban/UI/application.py (ThubanApplication.maps_changed): Add
889            doc-string
890    
891    2003-10-06  Bernhard Herzog  <[email protected]>
892    
893            * test/test_viewport.py (ViewPortTest.setUp)
894            (SimpleViewPortTest.test_init_with_size): Move the test for the
895            initial size as a constructor parameter from ViewPortTest.setUp
896            method to a new separate test in SimpleViewPortTest.
897    
898    2003-10-06  Bernhard Herzog  <[email protected]>
899    
900            * test/test_viewport.py (MockView): New class derived from
901            ViewPort with a mock implementation of GetTextExtent to be used in
902            the test cases
903            (ViewPortTest.setUp): Use MockView instead of ViewPort
904    
905            * Thuban/UI/viewport.py (ViewPort.GetTextExtent): Turn this method
906            into what would be a "pure virtual function" in C++: always raise
907            NotImplementedError. Mock implementations for test cases don't
908            belong into the real code
909    
910    2003-10-02  Bernhard Herzog  <[email protected]>
911    
912            * test/test_layer.py (TestLayer.test_empty_layer): Explicitly
913            close the dbf file we create so that it's contents have been
914            written properly.
915    
916            * libraries/shapelib/shptree.c, libraries/shapelib/shpopen.c,
917            libraries/shapelib/shapefil.h, libraries/shapelib/dbfopen.c:
918            Update to shapelib 1.2.10
919    
920    2003-10-01  Jan-Oliver Wagner <[email protected]>
921    
922            * Thuban/UI/tree.py, Thuban/UI/main.py: Remove the #! line as
923            it annoys lintian which warns about these files not being
924            executable. The #! isn't necessary here since if you absolutely
925            must execute them you can always say "python <filename>".
926    
927    2003-09-26  Bernhard Herzog  <[email protected]>
928    
929            * Thuban/Model/classgen.py (GenQuantiles0): Removed since it's
930            only used in GREAT-ER but not used in Thuban itself. When GREAT-ER
931            is ported to a newer the import will fail, so it should be noticed
932            immediately that this function is gone.
933            Fixes RT#1919
934    
935    2003-09-26  Bernhard Herzog  <[email protected]>
936    
937            Add a DTD for the projection files and make thuban write valid
938            projection files
939    
940            * Resources/XML/projfile.dtd: New. DTD for thuban's projection
941            files
942    
943            * Thuban/Model/resource.py (ProjFileSaver.write): Use
944            'projectionlist' as the name in the document type declaration so
945            that it matches the element type of the root element.
946    
947            * test/test_proj.py (sample_projfile, sample_projfile2): Use
948            'projectionlist' as the name in the document type declaration just
949            as it is done now in the files thuban would write
950            (sample_projfile, sample_projfile_data): Fix spelling of
951            "Mercator"
952            (TestProjFile.doTestWrite): Validate the written and the expected
953            XML data
954            (TestProjFile): Derive from ValidationTest so that we can run xml
955            validation tests
956    
957    2003-09-24  Bernhard Herzog  <[email protected]>
958    
959            * Thuban/UI/renderer.py (ExportRenderer.render_legend): Do not
960            modify the list returned by map.Layers() in place since it is the
961            actual list of layers used by the map.
962    
963    2003-09-23  Jan-Oliver Wagner <[email protected]>
964    
965            * Doc/manual/thuban-manual.xml: Added subsection to chapter
966            Extensions to describe the extensions coming with the Thuban
967            standard package (gns2shp and importAPR).
968    
969    2003-09-23  Bernhard Herzog  <[email protected]>
970    
971            * libraries/thuban/wxproj.cpp (project_point): if there's an
972            inverse but no forward projection, convert to degrees after
973            applying the inverse projection. Fixes RT#2096
974    
975            * test/test_wxproj.py: New. Test cases for wxproj.so. One test
976            implicitly tests for the fix to RT#2096
977    
978            * test/support.py (FloatComparisonMixin.assertFloatSeqEqual):
979            Check that the sequences have the same lengths
980    
981            * Resources/Projections/defaults.proj (Geographic projection): Use
982            a much more precise value for the to_meter attribute.
983    
984    2003-09-22  Bernhard Herzog  <[email protected]>
985    
986            * test/support.py (initthuban): Make sure to unset the LANG env.
987            var. so that tests that compare translated strings work. Solves RT
988            #2094
989    
990    2003-09-22  Jan-Oliver Wagner <[email protected]>
991    
992            Small improvement of APR import.
993    
994            * Extensions/importAPR/test/test_apr.py (aprTest.test_LClass):
995            Added tests for text-ranges.
996    
997            * Extensions/importAPR/apr.py (APR_LClass.GetThubanRange): Now
998            returns a string object if the range is based on text.
999    
1000            * Extensions/importAPR/importAPR.py (import_apr_dialog): Unified
1001            range retrieval.
1002    
1003    2003-09-22  Jan-Oliver Wagner <[email protected]>
1004    
1005            Initial version of the importAPR extension which is in
1006            experimental state.
1007    
1008            * /Extensions/importAPR/, /Extensions/importAPR/samples/,
1009            /Extensions/importAPR/test/: New directories.
1010    
1011            * /Extensions/importAPR/samples/README: New: Howto load the samples.
1012    
1013            * /Extensions/importAPR/samples/iceland.apr: New: A sample APR
1014            file which refers to the Thuban Iceland demo data.
1015    
1016            * /Extensions/importAPR/test/README: New: Howto execute the tests.
1017    
1018            * /Extensions/importAPR/test/test_apr.py: New: Tests for APR classes.
1019    
1020            * /Extensions/importAPR/apr.py: New: Classes for ArcView Objects
1021            as in '.apr'-files.
1022    
1023            * /Extensions/importAPR/odb.py: New: Classes for generic ArcView
1024            ODB Objects as in '.apr', '.avl' and other files.
1025    
1026            * /Extensions/importAPR/__init__.py: New: Init to make this
1027            directory a package.
1028    
1029            * /Extensions/importAPR/importAPR.py: New: Import a ArcView
1030            project file (.apr) and convert it to Thuban.
1031    
1032    2003-09-22  Jan-Oliver Wagner <[email protected]>
1033    
1034            * Extensions/gns2shp.gns2shp.py: The main module of gns2shp.
1035    
1036    2003-09-19  Jan-Oliver Wagner <[email protected]>
1037    
1038            * Doc/manual/thuban-manual.xml: Extended section 'Installation'
1039            with description on RPM installation and RPM binary package
1040            creation.
1041    
1042    2003-09-18  Bernhard Herzog  <[email protected]>
1043    
1044            * setup.py (data_files): Only add the mo files if the Locales
1045            directory actually exists, so that setup.py works with a fresh CVS
1046            checkout
1047    
1048    2003-09-12  Jan-Oliver Wagner <[email protected]>
1049    
1050            * Examples/simple_extensions/simple_tool.py: bugfix: Tool is now
1051            in viewport, not anymore in view
1052    
1053    2003-09-04  Jan-Oliver Wagner <[email protected]>
1054    
1055            Introducing first Extension (gns2shp).
1056    
1057            * Extensions, Extensions/gns2shp, Extensions/gns2shp/test: New.
1058    
1059            * Extensions/__init__.py: New. init to make this dir a package.
1060    
1061            * Extensions/gns2shp/__init__.py: New. init to make this dir a package.
1062    
1063            * Extensions/gns2shp/test/README: New. some info on this test directory.
1064    
1065            * Extensions/gns2shp/test/ls.txt: New. test data set (Liechtenstein).
1066    
1067            * Extensions/gns2shp/test/test_gns2shp.py: New. Test for correct creation
1068            of Shapefile from GNS text file format
1069    
1070    2003-09-03  Jan-Oliver Wagner <[email protected]>
1071    
1072            Fix/workaround for bug #2019:
1073            https://intevation.de/rt/webrt?serial_num=2019
1074    
1075            * Thuban/UI/identifyview.py (IdentifyView.ID_STOP): New.
1076            (IdentifyView.__init__): Added another button that allows to
1077            stop the identify mode.
1078            (IdentifyView.OnStop): New. Stops the identify mode.
1079    
1080    2003-09-03  Jan-Oliver Wagner <[email protected]>
1081    
1082            Introducing a new exception dialog that allows to exit the
1083            application immediately.
1084            This fixes bug #2060: https://intevation.de/rt/webrt?serial_num=2060
1085    
1086            * Thuban/UI/exceptiondialog.py: New. A special exception dialog.
1087    
1088            * Thuban/UI/application.py (ThubanApplication.ShowExceptionDialog):
1089            Made strings available to translations. Exchanged the simple
1090            ScrolledMessageDialog by the new ExceptionDialog.
1091    
1092    2003-09-01  Bernhard Herzog  <[email protected]>
1093    
1094            * NEWS: New. Summary of changes and release notes.
1095    
1096            * MANIFEST.in: Add NEWS
1097    
1098    2003-09-01  Bernhard Herzog  <[email protected]>
1099    
1100            * MANIFEST.in: Correct the include statement for the mo-files and
1101            include the documentation too.
1102    
1103            * setup.py (data_files): Add the .mo files
1104            (setup call): Up to version 0.9.0
1105    
1106    2003-09-01  Bernhard Herzog  <[email protected]>
1107    
1108            * Thuban/UI/dbdialog.py (ChooseDBTableDialog.__init__): Change the
1109            parameter list to just parent and session
1110            (ChooseDBTableDialog.__set_properties): Removed. Setting the
1111            selection of empty list boxes is not allowed (and produces C++
1112            assertion errors) and the rest of the setup is better done in
1113            __init__ anyway.
1114            (ChooseDBTableDialog.OnCancel, ChooseDBTableDialog.OnOK)
1115            (ChooseDBTableDialog.OnLBDClick, DBDialog.OnOK): Use the Python
1116            builtins True/False for booleans to avoid warnings from wxPython
1117    
1118            * Thuban/UI/mainwindow.py (MainWindow.AddDBLayer): Adapt to new
1119            ChooseDBTableDialog constructor parameters.
1120    
1121    2003-09-01  Bernhard Herzog  <[email protected]>
1122    
1123            * Thuban/Model/postgisdb.py
1124            (PostGISTable): Extend doc-string
1125            (PostGISTable._fetch_table_information): Set the column index
1126            correctly, pretending ignored columns don't exist.
1127    
1128            * test/test_postgis_db.py (TestPostGISIgnoredColumns): New tests
1129            for postgis tables with data types not yet supported by thuban.
1130    
1131    2003-08-29  Bernhard Herzog  <[email protected]>
1132    
1133            * HOWTO-Release: Tweak item about running the tests.
1134    
1135    2003-08-29  Jan-Oliver Wagner <[email protected]>
1136    
1137            * /Doc/manual/thuban-manual.xml: updated to version 1.0pre2.
1138    
1139    2003-08-29  Bernhard Herzog  <[email protected]>
1140    
1141            Add some missing parameters to projections. Proj complains about
1142            them on windows but for some reason not on Linux.
1143    
1144            * test/test_save.py (SaveSessionTest.testLayerProjection): Add
1145            missing required projection parameters
1146    
1147            * test/test_proj.py (TestProjFile.test): Add missing required
1148            projection parameters
1149    
1150            * test/test_load_0_8.py (TestLayerProjection.file_contents)
1151            (TestLayerProjection.test): Add missing required projection
1152            parameters and tests for them
1153    
1154            * test/test_load.py (TestLayerProjection.file_contents)
1155            (TestLayerProjection.test): Add missing required projection
1156            parameters and tests for them
1157    
1158            * test/test_layer.py (TestLayer.test_base_layer): Add missing
1159            required projection parameters
1160    
1161    2003-08-29  Bernhard Herzog  <[email protected]>
1162    
1163            * libraries/pyprojection/Projection.i: Use pj_get_errno_ref to
1164            access the pj_errno because directly accessing pj_errno doesn't
1165            work on windows if the proj library is in a DLL
1166    
1167            * libraries/pyprojection/Projection_wrap.c: Update from Projection.i
1168    
1169    2003-08-28  Bernhard Herzog  <[email protected]>
1170    
1171            * test/test_proj.py: Import things from Thuban after calling
1172            initthuban
1173    
1174            * test/test_load.py (LoadSessionTest.filenames): New class
1175            variable with the filename attributes to normalize
1176            (LoadSessionTest.check_format): Pass self.filenames to
1177            sax_eventlist to normalize the filename attributes
1178    
1179            * test/xmlsupport.py: Add cvs keywords
1180            (SaxEventLister.__init__): New parameter filenames which indicates
1181            attributes that contain filenames
1182            (SaxEventLister.startElementNS): Normalize the filename attributes
1183            with os.path.normpath
1184            (sax_eventlist): New parameter filenames to pass through to
1185            SaxEventLister
1186    
1187            * test/test_derivedshapestore.py: Make this file callable as a
1188            program to execute the tests
1189            (TestDerivedShapeStoreExceptions.test_table_with_wrong_size): Bind
1190            the session to self.session so that it gets destroyed properly
1191    
1192            * test/test_layer.py (TestLayer.tearDown): Call the session's
1193            Destroy method
1194    
1195            * test/test_map.py (TestMapBase.tearDown): Destroy self.session
1196            too if it exists
1197            (TestMapAddLayer.test_add_layer): Bind the session to self.session
1198            so that it gets destroyed properly
1199    
1200            * test/postgissupport.py (reason_for_not_running_tests): Add a
1201            test for the existence of popen2.Popen4.
1202    
1203            * test/test_save.py (SaveSessionTest.tearDown): New. Provide a
1204            reliable way to destroy the sessions created in the test cases
1205            (SaveSessionTest.test_dbf_table): Bind the session to self.session
1206            so that it gets destroyed properly
1207            (SaveSessionTest.testLayerProjection): Bind the session to
1208            self.session so that it gets destroyed properly
1209    
1210            * test/test_session.py (UnreferencedTablesTests.tearDown): Make
1211            sure that the session is destroyed properly
1212    
1213            * test/test_shapefilestore.py: Make this callable as a program to
1214            execute the tests
1215    
1216            * test/test_scalebar.py: Remove unnecessary import of _ from
1217            Thuban
1218    
1219            * test/support.py (print_garbage_information): Call initthuban
1220            here because it may be called indirectly from test cases that test
1221            test support modules which do not use anything from thuban itself
1222            (ThubanTestProgram.runTests): Remove unnecessary debug print
1223    
1224    2003-08-28  Bernhard Herzog  <[email protected]>
1225    
1226            * Thuban/version.py (longversion): Update to 0.9
1227    
1228            * Thuban/UI/mainwindow.py: Remove some unused imports
1229    
1230            * README: Add section about required additional software. Add date
1231            and revision CVS keywords
1232    
1233            * HOWTO-Release: Add item about the translations. Add date and
1234            revision CVs keywords and change formatting to match README a bit
1235            better
1236    
1237            * po/de.po: Update for 0.9
1238    
1239            * test/README: Tweak the wording a little because many tests are
1240            not really unittest.
1241    
1242    2003-08-27  Bernhard Herzog  <[email protected]>
1243    
1244            As preparation for the 0.9 release, switch thuban files to a
1245            non-dev namespace
1246    
1247            * Thuban/Model/save.py (SessionSaver.write_session): Write files
1248            with the http://thuban.intevation.org/dtds/thuban-0.9.dtd
1249            namespace
1250    
1251            * Thuban/Model/load.py (SessionLoader.__init__): Accept the
1252            http://thuban.intevation.org/dtds/thuban-0.9.dtd namespace too
1253    
1254            * test/test_save.py (SaveSessionTest.dtd)
1255            (SaveSessionTest.testEmptySession)
1256            (SaveSessionTest.testSingleLayer)
1257            (SaveSessionTest.testLayerProjection)
1258            (SaveSessionTest.testRasterLayer)
1259            (SaveSessionTest.testClassifiedLayer)
1260            (SaveSessionTest.test_dbf_table)
1261            (SaveSessionTest.test_joined_table)
1262            (SaveSessionTest.test_save_postgis): Update for new namespace
1263    
1264            * test/test_load.py (LoadSessionTest.dtd, TestSingleLayer)
1265            (TestLayerVisibility.file_contents, TestLabels.file_contents)
1266            (TestLayerProjection.file_contents)
1267            (TestRasterLayer.file_contents, TestJoinedTable.file_contents)
1268            (TestPostGISLayer.file_contents)
1269            (TestPostGISLayerPassword.file_contents)
1270            (TestLoadError.file_contents, TestLoadError.test): Update for new
1271            namespace
1272    
1273    2003-08-27  Bernhard Herzog  <[email protected]>
1274    
1275            Make the table interface distinguish between row ids (an integer
1276            that uniquely identifies a row) and row ordinals (a simple row
1277            count from 0 to NumRows() - 1)
1278    
1279            * Thuban/Model/postgisdb.py (PostGISTable.RowIdToOrdinal)
1280            (PostGISTable.RowOrdinalToId): New methods to conver between row
1281            ids and row ordinals
1282            (PostGISTable.ReadRowAsDict, PostGISTable.ReadValue): New keyword
1283            parameter row_is_ordinal to indicate whether the row parameter is
1284            the row id or the ordinal
1285    
1286            * Thuban/Model/transientdb.py (TransientTableBase.RowIdToOrdinal)
1287            (TransientTableBase.RowOrdinalToId)
1288            (AutoTransientTable.RowIdToOrdinal)
1289            (AutoTransientTable.RowOrdinalToId): Same new methods as in
1290            PostGISTable.
1291            (TransientTableBase.ReadRowAsDict, TransientTableBase.ReadValue)
1292            (AutoTransientTable.ReadRowAsDict, AutoTransientTable.ReadValue):
1293            Same new parameter as in PostGISTable.
1294    
1295            * Thuban/Model/table.py (DBFTable.RowIdToOrdinal)
1296            (DBFTable.RowOrdinalToId, MemoryTable.RowIdToOrdinal)
1297            (MemoryTable.RowOrdinalToId): Same new methods as in PostGISTable.
1298            (DBFTable.ReadValue, DBFTable.ReadRowAsDict)
1299            (MemoryTable.ReadValue, MemoryTable.ReadRowAsDict): Same new
1300            parameter as in PostGISTable.
1301    
1302            * Thuban/UI/tableview.py (DataTable.RowIdToOrdinal)
1303            (DataTable.RowOrdinalToId): New methods to convert between row ids
1304            and row ordinals.
1305            (TableGrid.SelectRowById): New method to select a row based on its
1306            ID as opposed to its ordinal
1307            (DataTable.GetValue, TableGrid.OnRangeSelect)
1308            (TableGrid.OnSelectCell, LayerTableGrid.select_shapes)
1309            (QueryTableFrame.OnQuery, QueryTableFrame.get_selected)
1310            (LayerTableFrame.__init__): Convert between row ids and row
1311            ordinals as appropriate
1312    
1313            * test/postgissupport.py (PostGISDatabase.__init__): Add
1314            doc-string.
1315            (PostGISDatabase.initdb): The optional third item in a tuple in
1316            tables is now a (key, value) list with additional arguments to
1317            pass to upload_shapefile
1318            (upload_shapefile): New parameter gid_offset to allow gids that
1319            are not the same as the shapeids in the shapefile
1320            (PostgreSQLServer.get_default_static_data_db): Use the new
1321            gid_offset to make the gids in landmarks 1000 higher than the
1322            shapeids in the shapefile
1323    
1324            * test/test_viewport.py
1325            (TestViewportWithPostGIS.test_find_shape_at_point): Adapt to the
1326            new shapeids in the landmarks table
1327    
1328            * test/test_transientdb.py
1329            (TestTransientTable.run_iceland_political_tests)
1330            (TestTransientTable.test_transient_joined_table): Add tests for
1331            the new table methods and new keywords arguments.
1332    
1333            * test/test_postgis_db.py
1334            (TestPostGISTable.test_read_row_as_dict_row_count_mode)
1335            (TestPostGISTable.test_read_value_row_count_mode)
1336            (TestPostGISTable.test_row_id_to_ordinal)
1337            (TestPostGISTable.test_row_oridnal_to_id): New test for the new
1338            table methods and the new arguments
1339            (TestPostGISShapestorePoint.test_shapes_in_region)
1340            (TestPostGISShapestorePoint.test_shape_raw_data)
1341            (TestPostGISShapestorePoint.test_shape_points)
1342            (TestPostGISShapestorePoint.test_shape_shapeid)
1343            (TestPostGISShapestorePoint.test_all_shapes)
1344            (TestPostGISTable.test_simple_query)
1345            (TestPostGISTable.test_simple_query)
1346            (TestPostGISTable.test_simple_query)
1347            (TestPostGISTable.test_read_value)
1348            (TestPostGISTable.test_read_row_as_dict): Adapt to the new
1349            shapeids in the landmarks table
1350    
1351            * test/test_memory_table.py
1352            (TestMemoryTable.test_read_row_as_dict_row_count_mode)
1353            (TestMemoryTable.test_read_value_row_count_mode)
1354            (TestMemoryTable.test_row_id_to_ordinal)
1355            (TestMemoryTable.test_row_oridnal_to_id): New test for the new
1356            table methods and the new arguments
1357    
1358            * test/test_dbf_table.py
1359            (TestDBFTable.test_read_row_as_dict_row_count_mode)
1360            (TestDBFTable.test_read_value_row_count_mode)
1361            (TestDBFTable.test_row_id_to_ordinal)
1362            (TestDBFTable.test_row_oridnal_to_id): New test for the new table
1363            methods and the new arguments
1364    
1365    2003-08-26  Bernhard Herzog  <[email protected]>
1366    
1367            * Thuban/Model/postgisdb.py (PostGISShapeStore.BoundingBox): Use a
1368            more postgis specific but much faster method to get the bounding
1369            box
1370    
1371    2003-08-26  Bernhard Herzog  <[email protected]>
1372    
1373            * Thuban/Model/postgisdb.py (PostGISTable.Title)
1374            (PostGISShapeStore.AllShapes): Add these missing methods.
1375            (PostGISShapeStore.ShapesInRegion): No need to raise
1376            StopIteration. We can simply return
1377    
1378            * test/test_postgis_db.py (TestPostGISTable.test_title)
1379            (TestPostGISShapestorePoint.test_all_shapes): New tests for the
1380            new methods
1381    
1382    2003-08-25  Bernhard Herzog  <[email protected]>
1383    
1384            * Thuban/Model/postgisdb.py (shapetype_map): Add MUTLIPOLYGON.
1385    
1386            * test/test_postgis_db.py (PolygonTests): New class containing
1387            those tests from TestPostGISShapestorePolygon that can also be
1388            used to test MUTLIPOLYGON tables
1389            (TestPostGISShapestorePolygon): Most tests are now in PolygonTests
1390            so derive from that
1391            (TestPostGISShapestoreMultiPolygon): New class with tests for
1392            MUTLIPOLYGON tables
1393    
1394            * test/postgissupport.py (PostGISDatabase.initdb): Allow the
1395            tables argument to have tuples with three items to override the
1396            WKT type used.
1397            (PostgreSQLServer.get_default_static_data_db): Use the above to
1398            create a polygon table with MUTLIPOLYGONs
1399            (point_to_wkt, coords_to_point, polygon_to_wkt, coords_to_polygon)
1400            (arc_to_wkt, coords_to_multilinestring): Rename from *_to_wkt to
1401            coords_to*
1402            (coords_to_multipolygon): New. Convert to MUTLIPOLYGON
1403            (wkt_converter): New. Map WKT types to converters
1404            (upload_shapefile): New parameter force_wkt_type to use a
1405            different WKT type than the default
1406    
1407    2003-08-25  Bernhard Herzog  <[email protected]>
1408    
1409            * Thuban/UI/application.py
1410            (ThubanApplication.run_db_param_dialog): New. Suitable as a
1411            db_connection_callback. Main difference is that the dialog run
1412            from this method doesn't have a parent so it can be used even when
1413            there is no main window
1414            (ThubanApplication.OpenSession): Use self.run_db_param_dialog if
1415            no db_connection_callback was given. This way the dialog pops up
1416            even when the .thuban file was given as a command line parameter.
1417    
1418    2003-08-25  Bernhard Herzog  <[email protected]>
1419    
1420            * Thuban/UI/view.py (MapCanvas.OnLeftUp): Release the the mouse
1421            before calling MouseLeftUp. MouseLeftUp may pop up modal dialogs
1422            which leads to an effectively frozen X session because the user
1423            can only interact with the dialog but the mouse is still grabbed
1424            by the canvas.
1425            Also, call the tool's Hide method before MouseLeftUp because
1426            MouseLeftUp may change the tool's coordinates.
1427    
1428    2003-08-25  Bernhard Herzog  <[email protected]>
1429    
1430            * Thuban/UI/application.py (ThubanApplication.OpenSession): Catch
1431            LoadCancelled exceptions and handle them by returning immediately.
1432    
1433    2003-08-25  Bernhard Herzog  <[email protected]>
1434    
1435            GUI part of loading sessions with postgis connections which may
1436            require user interaction to get passwords or updated parameters
1437    
1438            * Thuban/UI/dbdialog.py (DBDialog): Reimplement to make it look a
1439            bit nucer and be more generic.
1440            (DBFrame.OnAdd): Adapt to new DBDialog interface
1441    
1442            * Thuban/UI/application.py (ThubanApplication.OpenSession): New
1443            optional parameter db_connection_callback which is passed to
1444            load_session.
1445    
1446            * Thuban/UI/mainwindow.py (MainWindow.run_db_param_dialog): New.
1447            Suitable as a db_connection_callback
1448            (MainWindow.OpenSession): Use self.run_db_param_dialog as the
1449            db_connection_callback of the application's OpenSession method
1450    
1451    
1452    2003-08-25  Bernhard Herzog  <[email protected]>
1453    
1454            Basic loading of sessions containing postgis connections:
1455    
1456            * Thuban/Model/load.py (LoadError): Add doc-string
1457            (LoadCancelled): New exception class to indicate a cancelled load
1458            (SessionLoader.__init__): Add the db_connection_callback parameter
1459            which will be used by the loader to get updated parameters and a
1460            password for a database connection
1461            (SessionLoader.__init__): Add the new XML elements to the
1462            dispatchers dictionary
1463            (SessionLoader.check_attrs): Two new conversions, ascii to convert
1464            to a byte-string object and idref as a generic id reference
1465            (SessionLoader.start_dbconnection)
1466            (SessionLoader.start_dbshapesource): New. Handlers for the new XML
1467            elements
1468            (load_session): Add the db_connection_callback to pass through the
1469            SessionLoader
1470    
1471            * test/test_load.py (TestPostGISLayer, TestPostGISLayerPassword):
1472            New classes to test loading of sessions with postgis database
1473            connections.
1474    
1475    2003-08-25  Bernhard Herzog  <[email protected]>
1476    
1477            * Thuban/UI/mainwindow.py (__ThubanVersion__): Remove this and
1478            replace it and the comment with __BuildDate__ by the Source: and
1479            Id: cvs keywords as used in the other files.
1480    
1481    2003-08-25  Bernhard Herzog  <[email protected]>
1482    
1483            * Thuban/Model/load.py (SessionLoader.check_attrs): Raise a
1484            LoadError when a required attribute is missing. The code used to
1485            be commented out for some reason, but probably should have been
1486            active.
1487    
1488            * test/test_load.py (TestLoadError.test): Test the message in the
1489            LoadError too to make sure it really is about the missing
1490            attribute
1491    
1492    2003-08-22  Bernhard Herzog  <[email protected]>
1493    
1494            * test/test_save.py (SaveSessionTest.test_dbf_table)
1495            (SaveSessionTest.test_joined_table): Add XML validation tests.
1496    
1497    2003-08-22  Bernhard Herzog  <[email protected]>
1498    
1499            Implement saving a session with a postgis connection
1500    
1501            * Resources/XML/thuban-0.9.dtd (dbconnection, dbshapesource) New
1502            elements for database connections and shapestores using db
1503            connections
1504            (session): Add the dbconnections to the content model
1505    
1506            * Thuban/Model/save.py (SessionSaver.write_db_connections): New.
1507            Write the db connections
1508            (SessionSaver.write_session): Call write_db_connections to write
1509            the connection before the data sources
1510            (SessionSaver.write_data_containers): Handle postgis shapestores
1511    
1512            * test/test_save.py (SaveSessionTest.thubanids)
1513            (SaveSessionTest.thubanidrefs): Update for new DTD
1514            (SaveSessionTest.test_save_postgis): New. Test saving a session
1515            with postgis connections
1516    
1517            * Thuban/Model/postgisdb.py (PostGISTable.DBConnection)
1518            (PostGISTable.TableName): New accessor methods for the connection
1519            and table name
1520    
1521            * test/test_postgis_db.py (TestPostGISTable.test_dbconn)
1522            (TestPostGISTable.test_dbname): New methods to test the new
1523            PostGISConnection methods
1524    
1525    2003-08-22  Bernhard Herzog  <[email protected]>
1526    
1527            * Thuban/Model/postgisdb.py (ConnectionError): New exception class
1528            for exceptions occurring when establishing a Database connection
1529            (PostGISConnection.connect): Catch psycopg.OperationalError during
1530            connects and raise ConnectionError.
1531    
1532            * test/test_postgis_db.py (TestPostgisDBExceptions): New class for
1533            tests for database exceptions
1534    
1535    2003-08-22  Bernhard Herzog  <[email protected]>
1536    
1537            Prepare the test suite for tests with required authentication
1538    
1539            * test/postgissupport.py (PostgreSQLServer.__init__): Add instance
1540            variables with two predefined users/passwords, one for the admin
1541            and one for a non-privileged user.
1542            (PostgreSQLServer.createdb): Pass the admin name to initdb and add
1543            the non-privileged user to the database and set the admin password
1544            (PostgreSQLServer.wait_for_postmaster): Use the admin user name.
1545            Better error reporting
1546            (PostgreSQLServer.connection_params)
1547            (PostgreSQLServer.connection_string): New methods to return
1548            information about how to connect to the server
1549            (PostgreSQLServer.execute_sql): New. Convenience method to execute
1550            SQL statements
1551            (PostgreSQLServer.require_authentication): Toggle whether the
1552            server requires authentication
1553            (PostgreSQLServer.create_user, PostgreSQLServer.alter_user): New.
1554            Add or alter users
1555            (PostGISDatabase.initdb): Pass the admin name one the
1556            subprocesses' command lines. Grant select rights on
1557            geometry_columns to everybody.
1558            (upload_shapefile): Use the admin name and password when
1559            connecting. Grant select rights on the new table to everybody.
1560    
1561            * test/test_viewport.py (TestViewportWithPostGIS.setUp): Use the
1562            server's new methods to get the connection parameters.
1563    
1564            * test/test_postgis_session.py (TestSessionWithPostGIS.setUp)
1565            (TestSessionWithPostGIS.test_remove_dbconn_exception): Use the
1566            server's new methods to get the connection parameters.
1567    
1568            * test/test_postgis_db.py
1569            (TestPostGISConnection.test_gis_tables_empty)
1570            (TestPostGISConnection.test_gis_tables_non_empty)
1571            (PostGISStaticTests.setUp): Use the server's new methods to get
1572            the connection parameters.
1573    
1574    2003-08-22  Bernhard Herzog  <[email protected]>
1575    
1576            * Thuban/UI/about.py (About.__init__): Add the psycopg version.
1577    
1578            * Thuban/version.py: Add psycopg version
1579    
1580            * Thuban/Model/postgisdb.py (psycopg_version): New. Return the
1581            version of the psycopg module
1582    
1583    2003-08-22  Bernhard Herzog  <[email protected]>
1584    
1585            * Thuban/UI/dbdialog.py (DBPwdDlg): Removed because it's not used.
1586            (DBFrame.OnEdit): Removed because it's not used and wouldn't work
1587            at the moment. The functionality should probably be implemented
1588            some time, though.
1589            (DBFrame.OnRemove): Display a message if the connection can't be
1590            removed because it's still in use.
1591    
1592    2003-08-22  Jan-Oliver Wagner <[email protected]>
1593    
1594            * Thuban/UI/about.py (About.__init__): split up the huge about
1595            text into elements/lists for easier translation. This fixes bug
1596            https://intevation.de/rt/webrt?serial_num=2058
1597            Also, made some forgotten string available for the i18n.
1598    
1599    2003-08-21  Bernhard Herzog  <[email protected]>
1600    
1601            Make postgis support really optional including insensitive menu
1602            items.
1603    
1604            * Thuban/Model/postgisdb.py (has_postgis_support): New. Return
1605            whether the postgis is supported.
1606    
1607            * Thuban/UI/dbdialog.py: Put the psycopg import into try..except
1608            to make postgis support optional
1609    
1610            * Thuban/UI/mainwindow.py (_has_postgis_support): New. Context
1611            version of Thuban.Model.postgisdb.has_postgis_support
1612            (database_management command): Make it only sensitive if postgis
1613            is supported.
1614    
1615    2003-08-21  Jan-Oliver Wagner <[email protected]>
1616    
1617            * Doc/manual/thuban-manual.xml: Added CVS revision for rev-history.
1618            (section Adding and Removing Layers): Added text and described
1619            multi-selection.
1620            (chapter Extensions): New.
1621    
1622    2003-08-21  Jan-Oliver Wagner <[email protected]>
1623    
1624            * Thuban/UI/mainwindow.py (MainWindow.AddLayer): Changed dialog
1625            settings to allow multiple files to load into the map.
1626            Also reduced selection to *.shp as a default.
1627    
1628    2003-08-20  Bernhard Herzog  <[email protected]>
1629    
1630            Add dialogs and commands to open database connections and add
1631            database layers.
1632    
1633            * Thuban/UI/mainwindow.py (MainWindow.DatabaseManagement): New
1634            method to open the database connection management dialog
1635            (MainWindow.AddDBLayer): New method to add a layer from a database
1636            (_has_dbconnections): New helper function to use for sensitivity
1637            (database_management command, layer_add_db command): New commands
1638            that call the above new methods.
1639            (main_menu): Add the new commands to the menu.
1640    
1641            * Thuban/Model/postgisdb.py (PostGISConnection.__init__)
1642            (PostGISConnection.connect): Establish the actual connection in a
1643            separate method and call it in __init__. This makes it easier to
1644            override the behavior in test cases
1645            (PostGISConnection.BriefDescription): New method to return a brief
1646            description for use in dialogs.
1647    
1648            * test/test_postgis_db.py (NonConnection): DB connection that
1649            doesn't actually connect
1650            (TestBriefDescription): New class with tests for the new
1651            BriefDescription method
1652    
1653    2003-08-19  Jan-Oliver Wagner <[email protected]>
1654    
1655            Moved anything from extensions to libraries.
1656    
1657            * libraries: New.
1658    
1659            * libraries/ pyprojection, pyshapelib, shapelib, thuban: New.
1660    
1661            * libraries/pyprojection/ LICENSE, MANIFEST.in, Projection.i,
1662            Projection.py, Projection_wrap.c, setup.py, swighelp.txt: These files have
1663            been moved here from thuban/extensions/pyprojection/
1664            See there in the Attic for the older history.
1665    
1666            * libraries/pyshapelib/ COPYING, ChangeLog, NEWS, README, dbflib.i,
1667            dbflib.py, dbflib_wrap.c, pyshapelib_api.h, pytest.py, setup.py,
1668            shapelib.i, shapelib.py, shapelib_wrap.c, shptreemodule.c: These files
1669            have been moved here from thuban/extensions/pyshapelib/
1670            See there in the Attic for the older history.
1671    
1672            * libraries/shapelib/ dbfopen.c, shapefil.h, shpopen.c, shptree.c: These
1673            files have been moved here from thuban/extensions/shapelib/
1674            See there in the Attic for the older history.
1675    
1676            * libraries/thuban/ bmpdataset.cpp, cpl_mfile.cpp, cpl_mfile.h,
1677            gdalwarp.cpp, wxproj.cpp: These files have been moved here from
1678            thuban/extensions/thuban/
1679            See there in the Attic for the older history.
1680    
1681            * MANIFEST.in, setup.cfg, setup.py: renamed extensions to libraries.
1682    
1683            * extensions/thuban/ bmpdataset.cpp, cpl_mfile.cpp, cpl_mfile.h,
1684            gdalwarp.cpp, wxproj.cpp: Moved to libraries/thuban.
1685    
1686            * extensions/shapelib/ dbfopen.c, shapefil.h, shpopen.c, shptree.c:
1687            Moved to libraries/shapelib.
1688    
1689            * extensions/pyshapelib/ COPYING, NEWS, dbflib.py, pytest.py,
1690            shapelib.py, README, dbflib_wrap.c, setup.py, shapelib_wrap.c,
1691            ChangeLog, dbflib.i, pyshapelib_api.h, shapelib.i, shptreemodule.c:
1692            Moved to libraries/pyshapelib.
1693    
1694            * extensions/pyprojection/ MANIFEST.in, Projection.py, setup.py,
1695            LICENSE, Projection.i, Projection_wrap.c, swighelp.txt:
1696            Moved to libraries/pyprojection.
1697    
1698            * extensions/ pyprojection, pyshapelib, shapelib, thuban: Removed.
1699    
1700            * extensions: Removed.
1701    
1702    2003-08-19  Bernhard Herzog  <[email protected]>
1703    
1704            * test/test_viewport.py (ViewPortTest): We don't use the
1705            facilities of FileTestMixin so don't derive from it.
1706            (TestViewportWithPostGIS): New class with tests for using a
1707            viewport on a map with postgis layers.
1708    
1709    2003-08-19  Bernhard Herzog  <[email protected]>
1710    
1711            Add the db connection management to the session.
1712    
1713            * Thuban/Model/session.py (Session.__init__): New instance
1714            variable db_connections
1715            (Session.AddDBConnection, Session.DBConnections)
1716            (Session.HasDBConnections, Session.CanRemoveDBConnection)
1717            (Session.RemoveDBConnection): New methods to manage and query the
1718            db connections managed by the session
1719            (Session.OpenDBShapeStore): New method to open a shapestore from a
1720            db connection
1721    
1722            * Thuban/Model/messages.py (DBCONN_REMOVED, DBCONN_ADDED): New
1723            messages for the db connection handling in the session
1724    
1725            * test/test_postgis_session.py: New. test cases for the session's
1726            db connection handling with postgis connections
1727    
1728    2003-08-19  Bernhard Herzog  <[email protected]>
1729    
1730            Add very basic postgis database support and the corresponding test
1731            cases. The test cases require a PostgreSQL + postgis installation
1732            but no existing database. The database will be created
1733            automatically by the test cases
1734    
1735            * test/README: Add note about skipped tests and the requirements
1736            of the postgis tests.
1737    
1738            * Thuban/Model/postgisdb.py: New. Basic postgis database support.
1739    
1740            * test/test_postgis_db.py: New. Test cases for the postgis
1741            support.
1742    
1743            * Thuban/Model/wellknowntext.py: New. Parser for well-known-text
1744            format
1745    
1746            * test/test_wellknowntext.py: New. Test cases for the
1747            wellknowntext parser
1748    
1749            * test/postgissupport.py: New. Support module for tests involving
1750            a postgis database.
1751    
1752            * test/support.py (execute_as_testsuite): Shut down the postmaster
1753            if it's still running after the tests
1754    
1755            * Thuban/Model/data.py (RAW_WKT): New constant for raw data in
1756            well known text format
1757    
1758    2003-08-19  Jan-Oliver Wagner <[email protected]>
1759    
1760            * Examples/simple_extensions/hello_world.py: New. Raises a Hello World
1761            message dialog.
1762    
1763    2003-08-18  Bernhard Herzog  <[email protected]>
1764    
1765            * test/support.py (ThubanTestResult.printErrors): Indent the
1766            reason for the skips in the output to make it a bit more readable.
1767            (execute_as_testsuite): New helper function to run a test suite
1768            and print some more information.
1769            (run_tests): Use execute_as_testsuite to run the tests
1770    
1771            * test/runtests.py (main): Use execute_as_testsuite to run the
1772            tests
1773    
1774    2003-08-18  Bernhard Herzog  <[email protected]>
1775    
1776            Fix some bugs in Thuban and the test suite that were uncovered by
1777            changes introduced in Python 2.3:
1778    
1779            * Thuban/Model/table.py (DBFTable.__init__): Make sure the
1780            filename is an absolute name
1781    
1782            * Thuban/Model/layer.py (RasterLayer.__init__): Make sure the
1783            filename is an absolute name
1784    
1785            * test/test_save.py (SaveSessionTest.testRasterLayer): Use a
1786            unique filename to save to and use the correct relative filename
1787            in the expected output.
1788            (SaveSessionTest.test_dbf_table): Use the correct relative
1789            filename in the expected output.
1790    
1791            * test/test_layer.py (TestLayer.test_raster_layer): Update the
1792            test to check whether the filename is absolute.
1793    
1794    2003-08-18  Jan-Oliver Wagner <[email protected]>
1795    
1796            * Thuban/UI/about.py (About.__init__): Added Silke Reimer.
1797    
1798    2003-08-15  Bernhard Herzog  <[email protected]>
1799    
1800            Change the way shapes are returned by a shape store. The
1801            ShapesInRegion method returns an iterator over actual shape
1802            objects instead of a list of shape ids.
1803    
1804            * Thuban/Model/data.py (ShapefileShape.ShapeID): New. Return shape
1805            id.
1806            (ShapefileStore.ShapesInRegion): Return an iterator over the
1807            shapes which yields shape objects instead of returning a list of
1808            shape ids
1809            (ShapefileStore.AllShapes): New. Return an iterator over all
1810            shapes in the shape store
1811            (DerivedShapeStore.AllShapes): New. Like in ShapefileStore
1812    
1813            * Thuban/Model/layer.py (Layer.ShapesInRegion): Update
1814            doc-string.
1815    
1816            * Thuban/UI/baserenderer.py
1817            (BaseRenderer.layer_ids, BaseRenderer.layer_shapes): Rename to
1818            layer_shapes and make it return an iterator containg shapes
1819            instead of a list of ids.
1820            (BaseRenderer.draw_shape_layer): Update doc-string; Adapt to
1821            layer_shapes() change
1822    
1823            * Thuban/UI/renderer.py (ScreenRenderer.layer_ids)
1824            (ScreenRenderer.layer_shapes): Rename as in BaseRenderer
1825    
1826            * Thuban/UI/viewport.py (ViewPort._find_shape_in_layer): Adapt to
1827            changes in the ShapesInRegion return value.
1828            (ViewPort._get_hit_tester): Remove commented out code
1829    
1830            * test/mockgeo.py (SimpleShapeStore.ShapesInRegion): Adapt to the
1831            new return value.
1832            (SimpleShapeStore.AllShapes): New. Implement this method too.
1833    
1834            * test/test_layer.py (TestLayer.test_arc_layer)
1835            (TestLayer.test_polygon_layer, TestLayer.test_point_layer)
1836            (TestLayer.test_point_layer_with_projection)
1837            (TestLayer.test_derived_store): Adapt to changes in the
1838            ShapesInRegion return value.
1839    
1840            * test/test_shapefilestore.py
1841            (TestShapefileStoreArc.test_shapes_in_region)
1842            (TestShapefileStorePolygon.test_shapes_in_region)
1843            (TestShapefileStorePoint.test_shapes_in_region): Adapt to changes
1844            in the ShapesInRegion return value.
1845            (TestShapefileStorePoint.test_all_shapes)
1846            (TestShapefileStoreArc.test_shape_shapeid): New tests for the new
1847            methods
1848    
1849            * test/test_derivedshapestore.py
1850            (TestDerivedShapeStore.test_shapes_in_region): Adapt to changes in
1851            the ShapesInRegion return value.
1852            (TestDerivedShapeStore.test_all_shapes)
1853            (TestDerivedShapeStore.test_shape_shapeid): New tests for the new
1854            methods
1855    
1856    2003-08-15  Bernhard Herzog  <[email protected]>
1857    
1858            Make the renderers deal correctly with raw vs. python level
1859            representation of shape geometries
1860    
1861            * Thuban/UI/baserenderer.py (BaseRenderer.low_level_renderer):
1862            Return a flag useraw in addition to the callable and the parameter
1863            to indicate whether the callable can deal with the raw shape data
1864            or uses the higher level python lists of coordinates. The callable
1865            now should accept either the raw data or the return value of the
1866            shape's Points() method.
1867            (BaseRenderer.draw_shape_layer): Adapt to the low_level_renderer
1868            change
1869            (BaseRenderer.projected_points): Instead of the shape id use the
1870            points list as parameter.
1871            (BaseRenderer.draw_polygon_shape, BaseRenderer.draw_arc_shape)
1872            (BaseRenderer.draw_point_shape): Adapt to projected_points()
1873            change and accept the points list as parameter instead of the
1874            shape id.
1875    
1876            * Thuban/UI/renderer.py (MapRenderer.low_level_renderer): Return
1877            the useraw flag as required by the BaseRenderer
1878            (ScreenRenderer.draw_shape_layer): Adapt to low-level renderer
1879            changes.
1880    
1881            * test/test_baserenderer.py
1882            (TestBaseRenderer.test_point_with_classification): New test for
1883            rendering a map with classifications.
1884    
1885    2003-08-15  Bernhard Herzog  <[email protected]>
1886    
1887            * Thuban/UI/viewport.py (ViewPort.find_shape_at)
1888            (ViewPort._find_shape_in_layer, ViewPort._find_shape_in_layer)
1889            (ViewPort._get_hit_tester, ViewPort.projected_points)
1890            (ViewPort._hit_point, ViewPort._hit_arc, ViewPort._hit_polygon)
1891            (ViewPort._find_label_at): Split the find_shape_at method into
1892            several new methods and use the functions in the hit-test module.
1893    
1894            * Thuban/UI/hittest.py: New module with Python-level hit-testing
1895            functions
1896    
1897            * test/test_hittest.py: New. Test for the new hittest module
1898    
1899    2003-08-15  Bernhard Herzog  <[email protected]>
1900    
1901            * Thuban/Model/layer.py (Layer.ShapesInRegion): Apply the layer
1902            projection to all corners of the bounding box to get a better
1903            approximation of the projected bounding box
1904    
1905            * test/test_layer.py (TestLayer.test_point_layer_with_projection):
1906            New. Test coordinate handling of a layer with a projection.
1907            Catches the bug fixed in Layer.ShapesInRegion
1908    
1909    2003-08-15  Bernhard Herzog  <[email protected]>
1910    
1911            Move some of the mock objects in test_baserenderer into their own
1912            module so they can easily be used from other tests
1913    
1914            * test/mockgeo.py: New test helper module with some mock objects
1915            for geometry related things like shapes, shapestores and
1916            projections.
1917    
1918            * test/test_mockgeo.py: New. Tests for the new helper module
1919    
1920            * test/test_baserenderer.py: Some of the mock-objects are in
1921            mockgeo now.
1922    
1923    2003-08-12  Jan-Oliver Wagner <[email protected]>
1924    
1925            * Thuban/UI/about.py (About.__init__): Added Bj�rn Broscheit.
1926    
1927    2003-08-12  Bernhard Herzog  <[email protected]>
1928    
1929            * po/de.po: New. German translations by Bjoern Broscheit
1930    
1931    2003-08-12  Bernhard Herzog  <[email protected]>
1932    
1933            * Thuban/UI/projdialog.py (UnknownProjPanel._DoLayout): Translated
1934            strings have to be one string literal.
1935    
1936    2003-08-11  Bernhard Herzog  <[email protected]>
1937    
1938            * test/support.py (FloatComparisonMixin.assertPointListEquals):
1939            New. This method was used in various derived classes, but it's
1940            better to have it here.
1941    
1942            * test/test_shapefilestore.py
1943            (ShapefileStoreTests.assertPointListEquals): Removed. It's now in
1944            FloatComparisonMixin
1945    
1946            * test/test_layer.py (TestLayer.assertPointListEquals): Removed.
1947            It's now in FloatComparisonMixin
1948    
1949            * test/test_derivedshapestore.py
1950            (TestDerivedShapeStore.assertPointListEquals): Removed. It's now
1951            in FloatComparisonMixin
1952    
1953    2003-08-11  Bernhard Herzog  <[email protected]>
1954    
1955            * Thuban/UI/join.py (JoinDialog.OnJoin): Add missing space to
1956            error message
1957    
1958    2003-08-08  Jan-Oliver Wagner <[email protected]>
1959    
1960            * Doc/manual/thuban-manual.xml: Now use authorgroup. Added revhistory
1961            with version number.
1962            Changed title to reflect version number of Thuban.
1963    
1964    2003-08-08  Jan-Oliver Wagner <[email protected]>
1965    
1966            * Thuban/UI/about.py (About.__init__): Reworked the hall of fame. Now
1967            the list corresponds to the "About" web page.
1968    
1969    2003-08-08  Bernhard Herzog  <[email protected]>
1970    
1971            * Thuban/UI/projdialog.py (UTMProposeZoneDialog.dialogLayout):
1972            Make sure translated strings are recognized as one string literal.
1973    
1974            * Thuban/UI/proj4dialog.py (UTMProposeZoneDialog.dialogLayout):
1975            Make sure translated strings are recognized as one string literal.
1976    
1977            * Thuban/UI/classgen.py (ClassGenDialog.OnOK): Make sure
1978            translated strings are recognized as one string literal.
1979    
1980            * Thuban/UI/application.py (ThubanApplication.OpenSession): Make
1981            sure translated strings are recognized as one string literal.
1982    
1983    2003-08-07  Bernhard Herzog  <[email protected]>
1984    
1985            * Thuban/Model/data.py (DerivedShapeStore.RawShapeFormat): New.
1986            Simply delegates to the original shapestore.
1987    
1988            * test/test_derivedshapestore.py
1989            (TestDerivedShapeStore.test_raw_format): New. Test case for
1990            DerivedShapeStore.RawShapeFormat
1991    
1992    2003-08-07  Bernhard Herzog  <[email protected]>
1993    
1994            Add raw data interface to shape objects.
1995    
1996            * Thuban/Model/data.py (ShapefileShape, Shape): Rname the shape
1997            class to ShapefileShape which now holds shapefile specific
1998            information.
1999            (ShapefileShape.compute_bbox): Simplified to not cache any
2000            information. The way this method is used that shouldn't matter
2001            performance wise.
2002            (ShapefileShape.RawData): New. Return the shapeid which is the raw
2003            data format for shapes from shapefiles.
2004            (ShapefileStore.RawShapeFormat): New. Return the raw datatype used
2005            in the shape objects returned by a shapestore. For a
2006            ShapefileStore this is always RAW_SHAPEFILE.
2007            (RAW_PYTHON, RAW_SHAPEFILE): Constants for the RawShapeFormat
2008            method.
2009    
2010            * test/test_shapefilestore.py
2011            (TestShapefileStore.test_raw_format): New test to test the raw
2012            format feature of shapes.
2013    
2014            * Thuban/Model/layer.py: Remove the unused import of Shape from
2015            data. It was only there for interface compatibility but it's not
2016            used inside of Thuban and the generic Shape class has gone away.
2017    
2018            * Thuban/UI/renderer.py (MapRenderer.low_level_renderer): Check
2019            the raw data format and only use an optimized version of its a
2020            shapefile.
2021    
2022    2003-08-07  Bernhard Herzog  <[email protected]>
2023    
2024            * test/test_baserenderer.py (SimpleShape): Shape class for the
2025            tests.
2026            (SimpleShapeStore.Shape): Use SimpleShape instead of
2027            Thuban.Model.data.Shape to make the tests independed of the coming
2028            changes.
2029    
2030    2003-08-07  Bernhard Herzog  <[email protected]>
2031    
2032            * test/support.py (SkipTest, ThubanTestResult, ThubanTestRunner)
2033            (ThubanTestProgram): New classes that extend the respective
2034            classes from unittest. These new version support skipping tests
2035            under certain expected conditions. In the Thuban test suite we
2036            uses this for tests that require the optional gdal support.
2037            (run_tests): Use ThubanTestProgram instead of the unittest.main()
2038    
2039            * test/runtests.py (main): Use the new ThubanTestRunner instead of
2040            the normal one from unittest
2041    
2042            * test/test_layer.py (TestLayer.test_raster_layer): If this test
2043            is not run because gdal support isn't available report this to the
2044            runner.
2045    
2046            * test/test_baserenderer.py
2047            (TestBaseRenderer.test_raster_no_projection): Do not run this test
2048            if gdal support isn't available and report this to the runner.
2049    
2050    2003-08-06  Bernhard Herzog  <[email protected]>
2051    
2052            Rearrange the renderers a bit, partly in preparation for changes
2053            required for the postgis merge, partly to make it more testable.
2054            Also make the representation of coordinates in Shapes more
2055            consistent.
2056    
2057            * Thuban/UI/renderer.py (MapRenderer): Most of the code/methods in
2058            this class is now in BaseRenderer. This class is now practically
2059            only a specialization of BaseRenderer for rendering to an actual
2060            wx DC.
2061            (ScreenRenderer.draw_shape_layer): Use self.low_level_renderer()
2062            to get the shapetype specific rendering functions.
2063    
2064            * Thuban/UI/baserenderer.py: New file with the basic rendering
2065            logic. The code in this file is completely independend of wx.
2066            (BaseRenderer): Class with the basic rendering logic
2067    
2068            * test/test_baserenderer.py: New. Test cases for BaseRenderer
2069    
2070            * Thuban/UI/view.py (MapCanvas.__init__): New instance variable
2071            error_on_redraw to guard agains endless loops and stack overflows
2072            when there's a bug in the rendering code that raises exceptions.
2073            (MapCanvas.OnIdle, MapCanvas._do_redraw): Split the actual
2074            rendering into a separate method _do_redraw so that error handling
2075            is a bit easier. When an exception occurs, set error_on_redraw to
2076            true. When it's true on entry to OnIdle do nothing and return
2077            immediately.
2078    
2079            * Thuban/Model/data.py (ShapefileStore.Shape): For consistency, a
2080            Shape object will always have the coordinates as a list of list of
2081            coordinate pairs (tuples).
2082            (Shape.compute_bbox): Adapt to new representation.
2083    
2084            * Thuban/UI/viewport.py (ViewPort.find_shape_at)
2085            (ViewPort.LabelShapeAt): Adapt to new coordinate representation in
2086            Shape objects.
2087    
2088            * test/test_shapefilestore.py
2089            (ShapefileStoreTests.assertFloatTuplesEqual)
2090            (ShapefileStoreTests.assertPointListEquals): Rename to
2091            assertPointListEquals and change purpose to checking equality of
2092            the lists returned by Shape.Points().
2093            (TestShapefileStoreArc.test_shape)
2094            (TestShapefileStorePolygon.test_shape)
2095            (TestShapefileStorePoint.test_shape): Use the new
2096            assertPointListEquals instead of assertFloatTuplesEqual
2097    
2098            * test/test_layer.py (TestLayer.assertFloatTuplesEqual)
2099            (TestLayer.assertPointListEquals): Rename to assertPointListEquals
2100            and change purpose to checking equality of the lists returned by
2101            Shape.Points().
2102            (TestLayer.test_arc_layer, TestLayer.test_arc_layer)
2103            (TestLayer.test_polygon_layer, TestLayer.test_point_layer)
2104            (TestLayer.test_derived_store): Use the new assertPointListEquals
2105            instead of assertFloatTuplesEqual
2106    
2107            * test/test_derivedshapestore.py
2108            (TestDerivedShapeStore.assertFloatTuplesEqual)
2109            (TestDerivedShapeStore.assertPointListEquals): Rename to
2110            assertPointListEquals and change purpose to checking equality of
2111            the lists returned by Shape.Points().
2112            (TestDerivedShapeStore.test_shape): Use the new
2113            assertPointListEquals instead of assertFloatTuplesEqual
2114    
2115    2003-08-06  Jan-Oliver Wagner <[email protected]>
2116    
2117            * Thuban/UI/projdialog.py (UTMPanel._OnPropose): Added test for
2118            a bounding box. A dialog is raised in case, no bounding box
2119            is found. This fixes bug #2043:
2120            https://intevation.de/rt/webrt?serial_num=2043
2121    
2122    2003-08-05  Bernhard Herzog  <[email protected]>
2123    
2124            * Thuban/Model/color.py (Color.__repr__): Make the repr of a color
2125            object look like a Color instantiation. Formerly it looked like a
2126            tuple.
2127    
2128            * test/test_color.py (TestColor.test_repr)
2129            (TestColor.test_equality, TestColor.test_inequality): New. test
2130            some more apects of the Color class
2131            (TestTransparent.test_repr, TestTransparent.test_hex)
2132            (TestTransparent.test_equality): New. Test cases for the
2133            Transparent object.
2134    
2135    2003-08-04  Jan-Oliver Wagner <[email protected]>
2136    
2137            * Doc/manual/thuban-manual.xml: a number of small improvements.
2138            The resulting file is the version submitted for GREAT-ER II.
2139    
2140    2003-08-01  Bernhard Herzog  <[email protected]>
2141    
2142            * Thuban/UI/resource.py, Thuban/UI/projdialog.py,
2143            Thuban/UI/join.py, Thuban/UI/classgen.py, Thuban/UI/about.py,
2144            Thuban/Model/resource.py: Insert cvs keywords and doc-strings.
2145    
2146            * Thuban/UI/common.py: Insert cvs keywords and doc-strings.
2147            (Color2wxColour, wxColour2Color, ThubanBeginBusyCursor)
2148            (ThubanEndBusyCursor): Add doc-strings
2149    
2150    2003-08-01  Bernhard Herzog  <[email protected]>
2151    
2152            First step towards PostGIS integration. More abstraction by movin
2153            more code from the layer to the shapestore. More methods of the
2154            layer are now simply delegated to the equivalent method of the
2155            shapestore. The SHAPETYPE_* constants are now in data not in
2156            layer.
2157    
2158            * Thuban/Model/data.py (SHAPETYPE_POLYGON, SHAPETYPE_ARC)
2159            (SHAPETYPE_POINT, Shape): Move these constants and classes from
2160            layer.py to data.py
2161            (ShapefileStore.__init__): More Initialization for the new methods
2162            and functionality.
2163            (ShapefileStore.ShapeType, ShapefileStore.NumShapes)
2164            (ShapefileStore.BoundingBox, ShapefileStore.ShapesInRegion)
2165            (ShapefileStore.Shape): New methods that were formerly implemented
2166            in the layer.
2167            (DerivedShapeStore.Shape, DerivedShapeStore.ShapesInRegion)
2168            (DerivedShapeStore.ShapeType, DerivedShapeStore.NumShapes)
2169            (DerivedShapeStore.BoundingBox): New. DerivedShapeStore
2170            equivalents of the new shape methods. These versions are simply
2171            delegated to the original shapstore.
2172    
2173            * Thuban/Model/layer.py (SHAPETYPE_POLYGON, SHAPETYPE_ARC)
2174            (SHAPETYPE_POINT, Shape): Removed. They're now in data.py
2175            (Layer.SetShapeStore): Removed the initializatin of instance
2176            variables that were needed for the stuff that's now in
2177            ShapefileStore
2178            (Layer.BoundingBox, Layer.NumShapes, Layer.ShapeType)
2179            (Layer.Shape, Layer.ShapesInRegion): Simply delegate to the
2180            shapestore.
2181    
2182            * Thuban/UI/classifier.py, Thuban/UI/renderer.py,
2183            Thuban/UI/viewport.py: Import the SHAPETYPE_* constants from data
2184            instead of layer.
2185    
2186            * test/test_shapefilestore.py: New. Tests for ShapefileStore.
2187    
2188            * test/test_derivedshapestore.py: New. Tests for DerivedShapeStore.
2189    
2190            * test/test_layer.py: Import the SHAPETYPE_* constants from data
2191            instead of layer.
2192            (TestLayer.test_derived_store): Remove the test for the exception
2193            when instantiating the DerivedShapeStore with an incompatible
2194            table which is now in test_derivedshapestore.py. Add some more
2195            tests of the layer methods to determine whether they work for a
2196            DerivedShapeStore as well.
2197    
2198    2003-07-31  Jonathan Coles   <[email protected]>
2199    
2200            * Doc/manual/thuban-manual.xml: Fix the list of required packages
2201            by just listing the name and where they can be found.
2202    
2203    2003-07-31  Frank Koormann   <[email protected]>
2204    
2205            * Doc/manual/thuban-manual.xml:
2206            Changed the screenshot elements to figure.
2207            Changed some variablelist elements to itemizedlist.
2208            Added section on GDAL formats.
2209    
2210    2003-07-31  Jonathan Coles   <[email protected]>
2211    
2212            * Doc/manual/thuban-manual.xml: Added a few sentences about
2213            the Fix Border Color option when generating classes.
2214    
2215    2003-07-30  Jonathan Coles   <[email protected]>
2216    
2217            * Thuban/Model/classgen.py: Add docstrings. Rename specific
2218            Ramp instances to use lower_case_style.
2219    
2220            * Thuban/UI/classgen.py: Use renamed Ramp instances.
2221            
2222            * Thuban/UI/classifier.py: Add docstrings.
2223    
2224            * Thuban/UI/dock.py: Add docstrings.
2225    
2226            * test/test_classgen.py: Use renamed Ramp instances.
2227    
2228    2003-07-30  Bernhard Herzog  <[email protected]>
2229    
2230            * Thuban/Lib/connector.py (QueueingPublisher): Removed. This class
2231            was never used in Thuban.
2232    
2233    2003-07-30  Bernhard Herzog  <[email protected]>
2234    
2235            * Thuban/UI/join.py (JoinDialog.__init__): Use the table's Title()
2236            method directly instead of going through the transient_table
2237            method. This faster because transient_table may force the copy of
2238            a DBF file into the transient database and setting a table's title
2239            doesnm't affect the title of the associated transient table, so
2240            this fixes RT #2042
2241    
2242            * Thuban/UI/main.py (__version__): Don't import the already
2243            removed show_exception_dialog.
2244    
2245    2003-07-29  Jonathan Coles   <[email protected]>
2246    
2247            * Thuban/UI/application.py (ThubanApplication.ShowExceptionDialog):
2248            Put back this method and remove the equivalent function since we
2249            are setting the exception hook from within this class (OnInit).
2250    
2251    2003-07-29  Jonathan Coles   <[email protected]>
2252    
2253            * Doc/manual/images/5_2_custom_ramp.png,
2254            Doc/manual/images/5_2_quantiles.png,
2255            Doc/manual/images/5_2_uniform_dist.png,
2256            Doc/manual/images/5_2_unique_values.png,
2257            Doc/manual/images/8_int_error.png: New screen shots.
2258    
2259            * Doc/manual/thuban-manual.xml: Fixed typos and wording, clarified
2260            some points, and added more screen shots.
2261    
2262    2003-07-29  Bernhard Herzog  <[email protected]>
2263    
2264            * Thuban/Model/data.py: Remove the now unused import of warnings
2265    
2266    2003-07-29  Bernhard Herzog  <[email protected]>
2267    
2268            * Thuban/Model/data.py (SimpleStore): Removed. This class has been
2269            deprecated since before the 0.8 release and isn't used in Thuban
2270            itself anymore.
2271    
2272            * Thuban/Model/transientdb.py: Remove some unnecessary imports
2273    
2274    2003-07-29  Jonathan Coles   <[email protected]>
2275    
2276            * Thuban/UI/application.py (ThubanApplication.OnInit): set the
2277            python exception hook here so that we are sure to catch any
2278            Thuban exception that happen during initialization.
2279    
2280            * Thuban/UI/main.py (main): Don't set the exception hook here,
2281            it will get set in ThubanApplication.OnInit.
2282    
2283    2003-07-29  Jonathan Coles   <[email protected]>
2284                                                                                
2285            * Thuban/UI/application.py (ThubanApplication.ShowExceptionDialog):
2286            Removed and called it show_exception_dialog() so that the exception
2287            handler can be set before the class is created.
2288                                                                                
2289            * Thuban/UI/main.py (main): Install the exception handler before
2290            a ThubanApplication is created.
2291                                                                                    
2292    2003-07-29  Bernhard Herzog  <[email protected]>
2293    
2294            * po/it.po: New. Italian translation by Maurizio Napolitano
2295    
2296            * po/ru.po: New. Russian translation by Alex Shevlakov
2297    
2298    2003-07-29  Frank Koormann   <[email protected]>
2299    
2300            * Doc/manual/thuban-manual.xml: Extended section on supported
2301            projections.
2302            
2303    2003-07-29  Frank Koormann   <[email protected]>
2304    
2305            * Doc/manual/thuban-manual.xml: gaspell-checked.
2306    
2307    2003-07-29  Jonathan Coles   <[email protected]>
2308    
2309            * Doc/manual/images/3_5_legend.png: Added border to improve look
2310            on white background.
2311    
2312    2003-07-29  Jonathan Coles   <[email protected]>
2313    
2314            * Doc/manual/thuban-manual.xml: Fixed grammar and typos. Added
2315            descriptions for the legend toolbar.
2316    
2317            * Doc/manual/images/4_2_raster_layer_properties.png: Removed
2318            cursor from dialog box.
2319    
2320    2003-07-28  Jonathan Coles   <[email protected]>
2321    
2322            * Doc/manual/thuban-manual.xml: More screenshots and more chapters.
2323    
2324            * Doc/manual/images/2_4_session_tree.png,
2325            Doc/manual/images/3_5_legend.png, Doc/manual/images/3_rename_map.png,
2326            Doc/manual/images/4_2_layer_properties.png,
2327            Doc/manual/images/4_2_raster_layer_properties.png,
2328            Doc/manual/images/5_3_genclass.png,
2329            Doc/manual/images/5_classification.png,
2330            Doc/manual/images/6_projection.png,
2331            Doc/manual/images/7_1_table_view.png,
2332            Doc/manual/images/7_2_5_join.png: New screenshots.
2333    
2334    2003-07-24  Jonathan Coles   <[email protected]>
2335    
2336            * Doc/manual/thuban-manual.xml: Chapter on Projection Management.
2337    
2338    2003-07-24  Jonathan Coles   <[email protected]>
2339    
2340            * Doc/manual/thuban-manual.xml: Added EPS images and wrote
2341            chapter on Layer Management.
2342    
2343            * Doc/manual/Makefile: New. Makefile to generate all formats for the
2344            manual and images.
2345    
2346    2003-07-24  Bernhard Herzog  <[email protected]>
2347    
2348            * Thuban/Model/range.py, Thuban/version.py: Remove the #! line as
2349            it annoys lintian which warns about these files not being
2350            executable. The #! isn't necessary here since if you absolutely
2351            must execute them you can always say "python <filename>".
2352    
2353            * Thuban/UI/renderer.py (ScreenRenderer.draw_shape_layer): Remove
2354            superfluous code to set brush and pen for point shapes
2355    
2356            * Thuban/UI/viewport.py: Remove commented out code that wouldn't
2357            belong in viewport anyway
2358    
2359    2003-07-24  Frank Koormann   <[email protected]>
2360    
2361            * Doc/manual/thuban-manual.xml: Added section on table management.
2362    
2363    2003-07-24  Bernhard Herzog  <[email protected]>
2364    
2365            * test/runtests.py (main): Recognize the long "verbose" option
2366            correctly.
2367    
2368    2003-07-22  Jonathan Coles   <[email protected]>
2369    
2370            * Doc/manual/thuban-manual.xml: Continue to write first revision
2371            of the manual.
2372    
2373            * Thuban/UI/renderer.py (MapRenderer.render_map): Wrap method
2374            with Begin/EndDrawing() calls to ensure we aren't doing to
2375            many updates to the dc during rendering.
2376            (ScreenRenderer.draw_shape_layer): self.draw_point_shape takes
2377            a pen and brush argument so they need to be passed to the function.
2378    
2379            * Thuban/UI/viewport.py (ViewPort.calc_min_max_scales): New.
2380            Calculates the minimum and maximum scale values. Factored out
2381            of set_view_transform so that it could be used to zoom all the
2382            way into a single point.
2383            (ViewPort.set_view_transform): Call calc_min_max_scales().
2384            (ViewPort.FitSelectedToWindow): Zoom to the maximum scale
2385            if only a single point is selected.
2386    
2387            * Doc/manual/images/1_2_legend_close.png,
2388            Doc/manual/images/1_2_legend_dock.png,
2389            Doc/manual/images/1_2_mainwindow.png,
2390            Doc/manual/images/1_2_mainwindow.ps,
2391            Doc/manual/images/1_2_mainwindow.sk,
2392            Doc/manual/images/3_2_fullextent.png,
2393            Doc/manual/images/3_2_fulllayerextent.png,
2394            Doc/manual/images/3_2_fullshapeextent.png,
2395            Doc/manual/images/3_2_pan.png,
2396            Doc/manual/images/3_2_zoomin.png,
2397            Doc/manual/images/3_2_zoomout.png,
2398            Doc/manual/images/3_3_identify.png,
2399            Doc/manual/images/3_3_label.png,
2400            Doc/manual/images/3_5_invisible.png,
2401            Doc/manual/images/3_5_movedown.png,
2402            Doc/manual/images/3_5_moveup.png,
2403            Doc/manual/images/3_5_props.png,
2404            Doc/manual/images/3_5_tobottom.png,
2405            Doc/manual/images/3_5_totop.png,
2406            Doc/manual/images/3_5_visible.png: New. Images for the documentation.
2407    
2408    2003-07-18  Bernhard Herzog  <[email protected]>
2409    
2410            * Thuban/UI/messages.py (MAP_REPLACED): New message.
2411    
2412            * Thuban/UI/viewport.py (ViewPort.SetMap): Issue MAP_REPLACED
2413            after the new map has been assigned
2414    
2415            * Thuban/UI/mainwindow.py (MainWindow.delegated_messages):
2416            Delegate MAP_REPLACED to the canvas too
2417            (MainWindow.prepare_new_session): Removed. Thanks to the new
2418            MAP_REPLACED message it's no longer needed
2419            (MainWindow.OpenSession, MainWindow.NewSession):
2420            prepare_new_session has been removed.
2421    
2422            * Thuban/UI/classifier.py (Classifier.__init__): Subscribe to
2423            MAP_REPLACED so that we can close the dialog if a new map is set.
2424            (Classifier.unsubscribe_messages): Unsubscribe from MAP_REPLACED
2425            (Classifier.map_replaced): Handle MAP_REPLACED by closing the
2426            dialog
2427    
2428            * test/test_viewport.py (SimpleViewPortTest)
2429            (SimpleViewPortTest.test_default_size): Add doc-strings
2430            (ViewPortTest.setUp): Bind map to self.map so we can use it in
2431            tests. Subscribe to MAP_REPLACED messages too.
2432            (ViewPortTest.tearDown): No need to explicitly unsubscribe
2433            (ViewPortTest.test_set_map): New test for the SetMap method.
2434    
2435    2003-07-18  Bernhard Herzog  <[email protected]>
2436    
2437            * test/test_viewport.py (SimpleViewPortTest.test_default_size):
2438            Move this test from ViewPortTest.setUp to this new separate test
2439            case. setUp is not the place for the actual tests.
2440            (ViewPortTest.test_inital_settings, ViewPortTest.setUp): Move some
2441            more of the test from setUp to the new test test_inital_settings.
2442            (ViewPortTest.test_win_to_proj, ViewPortTest.test_proj_to_win)
2443            (ViewPortTest.test_proj_conv): Split test_proj_conv into
2444            test_win_to_proj and test_proj_to_win and make the tests easier to
2445            understand
2446            (ViewPortTest.testFitRectToWindow, ViewPortTest.testZoomFactor)
2447            (ViewPortTest.testZoomOutToRect, ViewPortTest.testTranslate)
2448            (ViewPortTest.test_unprojected_rect_around_point)
2449            (ViewPortTest.test_find_shape_at, ViewPortTest.testTools):
2450            Reformat to increase readability.
2451    
2452    2003-07-18  Bernhard Herzog  <[email protected]>
2453    
2454            * Thuban/UI/view.py (MapCanvas.OnLeftDown): Capture the mouse.
2455    
2456    2003-07-18  Bernhard Herzog  <[email protected]>
2457    
2458            * test/runtests.py: The test suite can now be run without an X
2459            connection. To make sure this remains true, remove the DISPLAY
2460            environment variable so that an error occurs if the wxGTK is
2461            imported accidentally
2462    
2463    2003-07-18  Bernhard Herzog  <[email protected]>
2464    
2465            * Thuban/UI/viewport.py: Remove unused imports
2466    
2467            * Thuban/UI/view.py: Remove unused imports
2468    
2469    2003-07-18  Bernhard Herzog  <[email protected]>
2470    
2471            * test/test_export.py Remove unused imports. The OutputTransform
2472            function is now in viewport.py and is called output_transform
2473            (TestScalebar.test_output_transform)
2474            (TestScalebar.test_OutputTransform): Renamed to
2475            test_output_transform and updated to use output_transform instead
2476            of OutputTransform
2477    
2478            * Thuban/UI/view.py (OutputTransform): Moved to viewport.py and
2479            renamed.
2480            (MapCanvas.Export, MapPrintout.draw_on_dc): OutputTransform was
2481            renamed to output_transform
2482    
2483            * Thuban/UI/viewport.py (OutputTransform, output_transform):
2484            Rename to output_transform
2485    
2486    2003-07-18  Bernhard Herzog  <[email protected]>
2487    
2488            * Thuban/Model/layer.py (Layer.__init__): Rename
2489            classificationField to classificatin_column and init it here so
2490            that it can be used in SetClassificationColumn
2491            (Layer.GetClassificationColumn, Layer.GetClassificationField):
2492            Rename to GetClassificationColumn.
2493            (Layer.SetClassificationColumn, Layer.SetClassificationField):
2494            Rename to SetClassificationColumn and issue a LAYER_CHANGED
2495            message if the column changes.
2496            (Layer._classification_changed, Layer.ClassChanged): Rename to
2497            _classification_changed. Update the callers.
2498            (Layer.SetShapeStore): Further field->column renames.
2499    
2500            * Thuban/Model/load.py (SessionLoader.start_classification)
2501            (SessionLoader.start_clpoint): Updates because of
2502            field->column method name changes in the Layer class
2503    
2504            * Thuban/Model/save.py (SessionSaver.write_classification): Updates
2505            because of field->column method name changes in the Layer class
2506    
2507            * Thuban/UI/classifier.py (Classifier.__init__)
2508            (Classifier._OnTry, Classifier._OnRevert): Updates because of
2509            field->column method name changes in the Layer class
2510    
2511            * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Updates
2512            because of field->column method name changes in the Layer class
2513    
2514            * Thuban/UI/viewport.py (ViewPort.find_shape_at): Updates because
2515            of field->column method name changes in the Layer class
2516    
2517            * test/test_save.py (SaveSessionTest.testClassifiedLayer)
2518            (SaveSessionTest.testClassifiedLayer): Update because of
2519            field->column method name changes in the Layer class
2520    
2521            * test/test_layer.py (SetShapeStoreTests.setUp)
2522            (SetShapeStoreTests.test_sanity): Update because of field->column
2523            method name changes in the Layer class
2524            (TestLayerModification.setUp): Subscribe to LAYER_CHANGED as well
2525            (TestLayerModification.test_sanity)
2526            (TestLayerModification.test_initial_settings): remove unsued code
2527            and rename to test_sanity.
2528            (TestLayerModification.test_set_classification): New test for
2529            SetClassification and SetClassificationField.
2530    
2531    2003-07-18  Bernhard Herzog  <[email protected]>
2532    
2533            * test/test_classgen.py (TestFixedRamp.test): Extend test to check
2534            the non-fixed values as well. The old test would have accepted a
2535            fixed ramp that only returnes the fixed properties
2536    
2537    2003-07-17  Jonathan Coles   <[email protected]>
2538    
2539            * Doc/manual/mainwindow.png, Doc/manual/mainwindow.xcf: Screen
2540            shots for the manual. The XCF file is the source image and
2541            has additional layers to support changes.
2542    
2543            * Doc/manual/thuban-manual.xml: Wrote an initial Introduction.
2544    
2545            * Thuban/UI/classifier.py (Classifier.__BuildClassification):
2546            Return both the new class and the field name.
2547    
2548            * Thuban/UI/mainwindow.py (MainWindow.ToggleLegend): Don't
2549            fit the map to the window as this changes any zoom level that
2550            the user may have set.
2551    
2552    2003-07-16  Jonathan Coles   <[email protected]>
2553    
2554            * Thuban/Model/classgen.py (generate_singletons,
2555            generate_uniform_distribution, generate_quantiles): Remove
2556            fixes parameter, but maintain the same functionality by having
2557            the calling function pass a FixedRamp object for the ramp.
2558            (FixedRamp): New. Adapts a ramp to have fixed property values.
2559    
2560            * Thuban/Model/classification.py: Use new CLASS_CHANGED message.
2561            (Classification): Inherit from Publisher.
2562            (Classification.__init__): Remove the layer parameter.
2563            Classifications no longer need to have a parent layer.
2564            (Classification.GetField, Classification.GetFieldType,
2565            Classification.SetFieldInfo): Removed. The field name is stored
2566            in the layer, and the type can be retreived by calling
2567            Layer.GetFieldType().
2568            (Classification._set_layer, Classification.GetLayer): Removed.
2569            Classifications no longer have a parent layer.
2570    
2571            * Thuban/Model/layer.py (Layer.Destroy): Unsubscribe from the
2572            classification.
2573            (Layer.SetShapeStore): Reset the classification first while
2574            we still have the old shape store to work with.
2575            (Layer.GetClassificationField, Layer.SetClassificationField):
2576            New. Method for getting/setting the field to classify on.
2577            (Layer.SetClassification): Simplified now that the layer
2578            simply has to hold a reference to the classification and not
2579            tell the classification who owns it.
2580            Fixes RTbug #2023.
2581    
2582            * Thuban/Model/load.py (SessionLoader.start_classification):
2583            Set the field name on the layer, not the classification.
2584    
2585            * Thuban/Model/messages.py: Add CLASS_CHANGED for when a
2586            classification is modified.
2587    
2588            * Thuban/Model/save.py (SessionSaver.write_classification):
2589            Get the field name and type from the layer.
2590    
2591            * Thuban/Model/table.py (table_to_dbf, table_to_csv): Renamed
2592            parameter records to rows and add docstring. Fixes RTbug #1997.
2593    
2594            * Thuban/UI/classgen.py (ClassGenDialog.OnOK): Use a fixed
2595            ramp when we need to fix certain values of a ramp rather than
2596            using the old fixes parameter. Fixes RTbug #2024.
2597    
2598            * Thuban/UI/classifier.py (ClassGrid.CreateTable): Add fieldType
2599            parameter.
2600            (ClassTable.Reset): Add fieldType parameter and use it, rather
2601            than asking the classification.
2602            (Classifier.__init__): Remember the original class's field
2603            and ask the layer for the field type, rather than the classification.
2604            (Classifier.__SetGridTable): Retrieve the field and field type
2605            for the table because they are not in the classification.
2606            (Classifier._OnTry, Classifier._OnRevert): Set the classification
2607            field on the layer in addition to the classification itself.
2608    
2609            * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Get the
2610            classification field from layer.
2611    
2612            * Thuban/UI/viewport.py (ViewPort.find_shape_at): Get the
2613            classification field from layer. Split up tests and remove
2614            *-imports. Fixes RTbug #1992.
2615    
2616            * test/test_classgen.py (TestFixedRamp): Test for the FixedRamp class.
2617    
2618            * test/test_classification.py
2619            (TestClassification.test_classification): Remove tests for methods
2620            that no longer exist.
2621    
2622            * test/test_layer.py (SetShapeStoreTests.setUp): Classification
2623            __init__ no longer has a field parameter, use SetClassificationField.
2624            (SetShapeStoreTests.test_sanity): Use layer object to get class
2625            field info.
2626    
2627            * test/test_save.py (SaveSessionTest.testClassifiedLayer): Use
2628            SetClassificationField on layer to set class field info.
2629    
2630            * test/test_viewport.py: Renamed from test/test_view.py.
2631    
2632    2003-07-16  Jan-Oliver Wagner <[email protected]>
2633    
2634            * Doc/manual/thuban-manual.xml: Added authors and an initial
2635            coarse structure.
2636    
2637    2003-07-15  Bernhard Herzog  <[email protected]>
2638    
2639            * test/support.py (FloatComparisonMixin): This is a mix-in class
2640            and therefore should not be derived from any other class.
2641    
2642            * test/test_range.py (RangeTest): FloatComparisonMixin is a
2643            mix-in, so derive from TestCase as well.
2644    
2645    2003-07-15  Bernhard Herzog  <[email protected]>
2646    
2647            * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Rework the
2648            draw_func handling a bit to remove one layer of indirection. This
2649            makes the renderer about 10% faster in the non-classifying case
2650            and the code a bit cleaner
2651            (MapRenderer.draw_point_shape): Add the pen and brush parameters
2652            and set them in the dc. Now the draw_point_shape method and
2653            wxproj's draw_polygon_shape function have basically the same
2654            signature so that both can be directly used as draw_func
2655    
2656  2003-07-15  Bernhard Herzog  <[email protected]>  2003-07-15  Bernhard Herzog  <[email protected]>
2657    
2658          * Thuban/Model/save.py (SessionSaver.write_classification): Encode          * Thuban/Model/save.py (SessionSaver.write_classification): Encode

Legend:
Removed from v.1418  
changed lines
  Added in v.1934

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26