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

Legend:
Removed from v.1349  
changed lines
  Added in v.1949

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26