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

Legend:
Removed from v.1112  
changed lines
  Added in v.2037

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26