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

Legend:
Removed from v.1237  
changed lines
  Added in v.1965

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26