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

Legend:
Removed from v.766  
changed lines
  Added in v.2026

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26