/[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 595 by bh, Wed Apr 2 18:28:09 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]>
4545    
4546            * Thuban/UI/view.py (MapCanvas.set_view_transform): Limit the
4547            maximum and minimum scale factors.
4548    
4549            * test/test_classgen.py (ClassGenTest.test): Update to reflect the
4550            changes in classgen.py
4551    
4552    2003-05-30  Jonathan Coles   <[email protected]>
4553    
4554            * Thuban/Model/classgen.py: Remove ClassGenerator class but make
4555            all the methods functions. Fixes RTBug #1903.
4556    
4557            * Thuban/Model/map.py (Map.TopLayer, Map.BottomLayer): Renamed
4558            to MoveLayerToTop and MoveLayerToBottom respectively. Fixes
4559            RTBug #1907.
4560    
4561            * Thuban/UI/classgen.py: Use classgen functions that were part
4562            of the ClassGenerator class. Put try/finally blocks around
4563            code that uses wxBeginBusyCursor()/wxEndBusyCursor(). Fixes
4564            RTBug #1904.
4565    
4566            * Thuban/UI/classifier.py: Remove unused import of ClassGenerator.
4567    
4568            * Thuban/UI/legend.py: The legend was cleared and repopulated any
4569            time something changed which caused some state to be lost such
4570            as which children were expanded or collapsed. Fixes RTBug #1901.
4571            (LegendTree._OnMsgMapLayersAdded): Add only new layers.
4572            (LegendTree.__OnMsgMapLayersRemoved): Remove layers that exist in
4573            the legend but not in the map.
4574            (LegendTree.__FillTree): Move main functionality out into smaller
4575            methods that can be used by other methods.
4576            (LegendTree.__FillTreeLayer): Reuse old slots in the image list
4577            if they are available.
4578            (LegendTree.DeleteAllItems): Renamed from __DeleteAllItems so
4579            that we override the wxTreeCtrl method. Iterate over children
4580            and call __RemoveLayer.
4581            (LegendTree.__AddLayer): New. Add a new layer to the legend.
4582            (LegendTree.__RemoveLayer): Remove a layer from the legend.
4583            (LegendTree.DeleteChildren): New, overrides wxTreeCtrl method.
4584            Should only be called with the id of a layer branch.
4585            (LegendTree.GetRootItem): New, overrides wxTreeCtrl method.
4586            Returns the root item or creates one if necessary.
4587    
4588            * Thuban/UI/renderer.py (MapRenderer.draw_raster_layer): Call
4589            ProjectRasterFile with tuple arguments instead of strings.
4590    
4591            * Thuban/UI/tableview.py (QueryTableFrame.OnQuery): Wrap code
4592            with try/finally. Fixes RTBug #1904.
4593    
4594            * Thuban/UI/view.py (MapCanvas.OnPaint): Wrap code
4595            with try/finally. Fixes RTBug #1904.
4596            (MapCanvas.FitSelectedToWindow): If a single point is selected
4597            simply center it on the display. Fixes RTBug #1849.
4598    
4599            * extensions/thuban/gdalwarp.cpp: Removed code that allowed gdalwarp
4600            to be compiled as a standalone app. Now the code can only be
4601            called from Python which simplifies the parameter passing.
4602            (ProjectRasterFile): Handle Python arguments. Remove code that
4603            checks for a destination dataset. Add more clean up code.
4604    
4605            * test/test_map.py (TestMapWithContents.test_raise_layer_top,
4606            TestMapWithContents.test_lower_layer_bottom):
4607            Test Map.MoveLayerToTop() and Map.MoveLayerToBottom() respectively.
4608            Fixes RTBug #1907.
4609    
4610            * Thuban/UI/mainwindow.py (MainWindow.ToggleLegend): Apply a full
4611            extent to the map when the legend is toggled. Fixes RTBug #1881.
4612    
4613    2003-05-29  Jan-Oliver Wagner <[email protected]>
4614    
4615            * Thuban/UI/tableview.py (LayerTableFrame.OnClose): Bug-fix: Now
4616            unsubscribes all that is subcribed in __init__.
4617    
4618    2003-05-28  Bernhard Herzog  <[email protected]>
4619    
4620            * Thuban/UI/mainwindow.py (MainWindow.DuplicateLayer)
4621            (MainWindow.CanDuplicateLayer): New methods to implement the
4622            Layer/Duplicate command.
4623            (layer_duplicate command): New.
4624            (main_menu): Add layer_duplicate to the Layer menu.
4625    
4626    2003-05-28  Bernhard Herzog  <[email protected]>
4627    
4628            * Thuban/UI/tableview.py (NullRenderer.Draw): New. Our own
4629            renderer so that NULL/None values get displayed differently (by a
4630            gray rectangle).
4631            (TableGrid.__init__): Override the default renderers
4632    
4633    2003-05-28  Bernhard Herzog  <[email protected]>
4634    
4635            * Thuban/Model/layer.py (Layer.SetShapeStore): Set the
4636            classification to "None" if the type of the field has changed.
4637    
4638            * test/test_layer.py (SetShapeStoreTests): New. Class with a few
4639            test for the Layer.SetShapeStore method
4640    
4641    2003-05-28  Jan-Oliver Wagner <[email protected]>
4642    
4643            * Thuban/Model/layer.py (Layer.TreeInfo): Fixed a bug (a layer
4644            does not necessarily have a filename).
4645    
4646    2003-05-28  Jan-Oliver Wagner <[email protected]>
4647    
4648            * Thuban/UI/mainwindow.py (MainWindow.TableClose, MainWindow.TableShow):
4649            sort the selection list for the dialog.
4650    
4651    2003-05-28  Frank Koormann  <[email protected]>
4652    
4653            * extensions/thuban/wxproj.cpp
4654            (project_point): Removed cast to int for projected point coordinates.
4655            (shape_centroid): Return last point if all polygon vertices fall
4656            to one point.
4657    
4658    2003-05-28  Bernhard Herzog  <[email protected]>
4659    
4660            * Thuban/UI/mainwindow.py (_can_unjoin): Add doc-string and cope
4661            with layers that don't have shapestores, i.e. raster layers.
4662    
4663    2003-05-28  Bernhard Herzog  <[email protected]>
4664    
4665            * Thuban/Model/table.py (DBFTable.__init__): Omit the extension
4666            when determining the title from the filename.
4667    
4668            * test/test_dbf_table.py (TestDBFTable.test_title): Update to
4669            reflect changes in the way the title is derived from the filename
4670    
4671    2003-05-28  Frank Koormann  <[email protected]>
4672    
4673            * Thuban/UI/mainwindow.py (MainWindow.TableShow):
4674            Added wxDEFAULT_DIALOG_STYLE to show table dialog styles.
4675    
4676    2003-05-27  Bernhard Herzog  <[email protected]>
4677    
4678            * Thuban/UI/mainwindow.py (MainWindow.delegated_messages): Also
4679            delegate SelectedLayer.
4680            (MainWindow.LayerUnjoinTable): Implement.
4681            (_can_unjoin): New. Helper function for the sensitivity of the
4682            layer/unjoin command.
4683    
4684            * Thuban/Model/data.py (ShapefileStore.OrigShapeStore)
4685            (DerivedShapeStore.OrigShapeStore): New. Return the original
4686            shapestore. Used to figure out how to unjoin.
4687            (DerivedShapeStore.Shapefile): Fix a typo.
4688    
4689    2003-05-27  Bernhard Herzog  <[email protected]>
4690    
4691            * Thuban/UI/join.py (JoinDialog): Extend to handle layer joins as
4692            well
4693            (JoinDialog.__init__): Use the layer parameter and only build the
4694            left choice when a layer is given
4695            (JoinDialog.OnJoin): Handle layer joins as well
4696            (JoinDialog.OnLeftTable, JoinDialog.OnRightTable): Handle the case
4697            that the user selects the "Select..." item. The sensitivitly
4698            updating is now in update_sensitivity
4699            (JoinDialog.y): New method to refactor the sensitivity update of
4700            the join button into its own method.
4701    
4702            * Thuban/UI/mainwindow.py (MainWindow.LayerJoinTable): Implement.
4703    
4704    2003-05-27  Bernhard Herzog  <[email protected]>
4705    
4706            * Thuban/UI/mainwindow.py (table_close command): Make it sensitive
4707            iff there are unreferenced tables in the session
4708    
4709    2003-05-27  Bernhard Herzog  <[email protected]>
4710    
4711            * Thuban/Model/messages.py (TABLE_REMOVED): New message.
4712    
4713            * Thuban/Model/session.py (Session.UnreferencedTables): New method
4714            to return tables that are not referenced by other tables or shape
4715            stores and can be removed.
4716            (Session.RemoveTable): Issue a TABLE_REMOVED message after
4717            removing the table
4718    
4719            * Thuban/UI/mainwindow.py: Remove unused imports
4720            (MainWindow.TableClose): Implement.
4721    
4722            * Thuban/UI/tableview.py (TableFrame.__init__): Subscribe to some
4723            messages so that the frame will be automatically closed when a new
4724            session is opened or the table is removed.
4725            (TableFrame.OnClose): Unsubscribe the Subscriptions made in
4726            __init__
4727            (TableFrame.close_on_session_replaced)
4728            (TableFrame.close_on_table_removed): New. Subscribers that close
4729            the window
4730    
4731            * test/test_session.py (TestSessionMessages.test_remove_table)
4732            (TestSessionSimple.test_remove_table): Move the test to
4733            TestSessionSimple and add test for the TABLE_REMOVED message
4734            (TestSessionBase.setUp): Also subscribe to TABLE_REMOVED
4735            (TestSessionSimple.test_unreferenced_tables) New. Test for the
4736            UnreferencedTables method.
4737            (UnreferencedTablesTests): New. Class with some more sophisticated
4738            tests for UnreferencedTables.
4739    
4740    2003-05-27  Frank Koormann  <[email protected]>
4741    
4742            * Thuban/UI/tableview.py (QueryTableFrame.__init__): The "_S_election"
4743            display has some unwanted side effects. Removed again.
4744    
4745    2003-05-27  Frank Koormann  <[email protected]>
4746    
4747            * Resources/Bitmaps/legend_icon_layer.xpm: New, icon for legend.
4748    
4749            * Thuban/UI/legend.py (LegendTree.__FillTree): Use "legend_icon_layer"
4750    
4751    2003-05-27  Jan-Oliver Wagner <[email protected]>
4752    
4753            * test/test_menu.py (MenuTest.test): Added test for
4754            Menu.RemoveItem().
4755    
4756            * Thuban/UI/menu.py (Menu.RemoveItem): New. Remove an item from
4757            the menu.
4758    
4759    2003-05-27  Frank Koormann  <[email protected]>
4760            
4761            Nonmodal dialogs without parent (i.e. they can fall behind the main
4762            window)
4763    
4764            * Thuban/UI/mainwindow.py (MainWindow.OnClose): Explicitly destroy
4765            all dialogs in the dialogs dictionary and the canvas.
4766    
4767            * Thuban/UI/dialogs.py (NonModalNonParentDialog): New class, without
4768            parent, i.e. can fall behind other windows.
4769            (NonModalDialog.OnClose): Check is dialog is in mainwindow.dialog
4770            dictionary before removing it.
4771    
4772            * Thuban/UI/classifier.py: Dialog derived from NonModalNonParentDialog
4773    
4774            * Thuban/UI/projdialog.py: Dialog derived from NonModalNonParentDialog
4775            * Thuban/UI/tableview.py: Dialog derived from NonModalNonParentDialog
4776            * Thuban/UI/tree.py: Dialog derived from NonModalNonParentDialog
4777    
4778    2003-05-27  Bernhard Herzog  <[email protected]>
4779    
4780            * Thuban/UI/mainwindow.py (MainWindow.ShowTableView): New. Open a
4781            tableview dialog
4782            (MainWindow.TableShow): Use ShowTableView to open the dialogs.
4783            Also, don't use the table's titles as the dialog names. The titles
4784            aren't guaranteed to be unique.
4785            (MainWindow.TableOpen): Open a table view dialog after opening the
4786            table
4787    
4788    2003-05-27  Bernhard Herzog  <[email protected]>
4789    
4790            * Thuban/UI/mainwindow.py: Remove the Table/Hide menu item. Its
4791            effect can be achieved by simply closing the window showing the
4792            table.
4793            (MainWindow.TableHide): Removed.
4794            (main_menu): Removed "table_hide"
4795    
4796    2003-05-27  Frank Koormann  <[email protected]>
4797    
4798            Fix legend tree display problems under Win32
4799    
4800            * Thuban/UI/legend.py:  BMP_SIZE_W = 15
4801            (LegendTree.__FillTree): Display "legend_icon_map.xpm" with layer title.
4802            (LegendTree.__FillTreeLayer): Explicitely set SelectedImage.
4803    
4804            * Resources/Bitmaps/legend_icon_map.xpm: New icon for legend.
4805    
4806    2003-05-27  Jan-Oliver Wagner <[email protected]>
4807    
4808            * Thuban/UI/menu.py (Menu.InsertSeparator): Additional optional parameter
4809            'after' now allows to insert separators almost anywhere in the menu.
4810    
4811    2003-05-27  Frank Koormann  <[email protected]>
4812    
4813            * Thuban/UI/tableview.py (QueryTableFrame.__init__): Underline the
4814            "S" of selection box label to hint on hot key (Alt-S). Works under
4815            Win32 but is ignored under GTK.
4816    
4817    2003-05-26  Frank Koormann  <[email protected]>
4818    
4819            * Thuban/UI/projdialog.py (ProjFrame.__do_layout, ProjPanel._DoLayout):
4820            Center Choices.
4821    
4822    2003-05-26  Bernhard Herzog  <[email protected]>
4823    
4824            Remove the Precision methods again. They're too DBF specific to be
4825            part of the table interface and they're only used in table_to_dbf
4826            anyway.
4827            
4828            * Thuban/Model/transientdb.py (TransientTableBase.Width):Use a
4829            fixed precision of 12 for doubles.
4830            (TransientTableBase.Precision): Removed
4831            (AutoTransientTable.Width): Delegate to self.table.
4832    
4833            * Thuban/Model/table.py (DBFTable.Precision)
4834            (MemoryTable.Precision): Removed.
4835            (MemoryTable.Width): Use a fixed precision of 12 for doubles.
4836            (table_to_dbf): Use a fixed precision of 12 for floats unless the
4837            column object specifies something else.
4838    
4839            * test/test_dbf_table.py (TestTableToDBF.test_table_to_dbf): New.
4840            test for table_to_dbf
4841    
4842    2003-05-26  Bernhard Herzog  <[email protected]>
4843    
4844            * test/test_transientdb.py
4845            (TestTransientTable.run_iceland_political_tests): Fix a comment.
4846    
4847    2003-05-26  Bernhard Herzog  <[email protected]>
4848    
4849            * Thuban/UI/mainwindow.py (MainWindow.TableOpen): Real
4850            implementation. Mark parts of the file format strings for
4851            localization.
4852    
4853            * Thuban/Model/session.py (Session.OpenTableFile): New. Open a dbf
4854            file and add the table to the tables managed by the session
4855    
4856            * test/test_session.py (TestSessionSimple.test_open_table_file):
4857            New. test case for OpenTableFile
4858    
4859    2003-05-26  Jan-Oliver Wagner <[email protected]>
4860    
4861            * Thuban/UI/controls.py, Thuban/UI/identifyview.py, Thuban/UI/join.py,
4862            Thuban/UI/labeldialog.py, Thuban/UI/mainwindow.py,
4863            Thuban/UI/proj4dialog.py, Thuban/UI/tableview.py, Thuban/UI/view.py:
4864            Replace the true/false of wxWindows by True/False of Python 2.2.1.
4865    
4866    2003-05-26  Jan-Oliver Wagner <[email protected]>
4867    
4868            * Thuban/UI/tableview.py (LayerTableFrame.__init__): If there is
4869            already a selection present, update the grid accordingly.
4870    
4871            * Thuban/UI/mainwindow.py (MainWindow.TableShow): Make the dialog
4872            resizeable and increase its initial size.
4873    
4874    2003-05-26  Frank Koormann  <[email protected]>
4875    
4876            Table export functionality
4877    
4878            * Thuban/Model/table.py (DBFTable.Width, MemoryTable.Width):
4879            Return width (in characters) for a column.
4880            (DBFTable.Precision, MemoryTable.Precision): Return decimal precision.
4881            (table_to_dbf): Write table to dbf file.
4882            (table_to_csv): Write table to csv file.
4883    
4884            * Thuban/Model/transientdb.py (TransientTableBase.Width,
4885            TransientTableBase.Precision): Return column width and precision.
4886    
4887            * Thuban/UI/tableview.py (QueryTableFrame.OnSaveAs): Call table_to_dbf
4888            or table_to_csv depending on file selection.
4889    
4890            * test/test_dbf_table.py:
4891            Test table_to_dbf (extension of former part of test).
4892    
4893            * test/test_csv_table.py:
4894            Test table_to_csv.
4895    
4896    2003-05-23  Jan-Oliver Wagner <[email protected]>
4897    
4898            * Thuban/UI/join.py (JoinDialog.OnJoin): Use _() for strings.
4899            Use QueryTableFrame instead of TableFrame.
4900    
4901            * Thuban/UI/mainwindow.py (MainWindow.LayerShowTable): Prefix the
4902            table window with 'Layer Table:' instead of 'Table:'.
4903    
4904    2003-05-23  Jan-Oliver Wagner <[email protected]>
4905    
4906            Give all tables a title via mix-in TitledObject.LayerShowTable
4907    
4908            * Thuban/Model/base.py (TitledObject.SetTitle): Call method 'issue'
4909            only if it exists.
4910    
4911            * Thuban/Model/table.py (DBFTable, MemoryTable): mix-in TitledObject
4912            and call its init-method with a default title. Remove Title() method.
4913    
4914            * Thuban/Model/transientdb.py (TransientTable, TransientJoinedTable,
4915            AutoTransientTable): mix-in TitledObject and call its init-method with
4916            a default title. Remove Title() method.
4917    
4918    2003-05-23  Bernhard Herzog  <[email protected]>
4919    
4920            * Thuban/Model/session.py (Session.AddShapeStore): Define
4921            AddShapeStore analogously to AddTable.
4922    
4923            * test/test_session.py (TestSessionSimple.test_add_shapestore):
4924            New. Test for AddShapeStore
4925    
4926    2003-05-23  Jan-Oliver Wagner <[email protected]>
4927    
4928            Introducing QueryTableFrame and a very coarse ShowTable implementation.
4929    
4930            * Thuban/UI/tableview.py (LayerTableFrame, QueryTableFrame): Split the
4931            class LayerTableFrame into two classes, LayerTableFrame and QueryTableFrame.
4932            The latter implements the selection GUI without dependency on a layer.
4933            LayerTableFrame now is derived from QueryTableFrame and connects
4934            to a layer.
4935    
4936            * Thuban/UI/mainwindow.py (MainWindow.TableShow): A very coarse
4937            implementation that still needs work.
4938    
4939            * Thuban/Model/layer.py (Layer.TreeInfo): Added filename.
4940    
4941    2003-05-22  Frank Koormann  <[email protected]>
4942    
4943            * Thuban/Model/transientdb.py (TransientJoinedTable.__init__):
4944            Added "outer_join = False" as optional parameter.
4945            (TransientJoinedTable.create): If outer join is true, perform a
4946            "LEFT OUTER JOIN" instead of "JOIN", which preserves all records of
4947            the left table. Records not matching are filled with 0 / None.
4948    
4949            * Thuban/UI/join.py (JoinDialog.__init__): Checkbox for outer join.
4950            (JoinDialog.OnJoin): Consider outer join check box.
4951    
4952    2003-05-22  Bernhard Herzog  <[email protected]>
4953    
4954            * Thuban/UI/join.py (JoinDialog.OnJoin): Use exc_info in a
4955            somewhat safer way. Storing the traceback in a local variable can
4956            lead to memory leaks
4957    
4958    2003-05-22  Bernhard Herzog  <[email protected]>
4959    
4960            * Thuban/UI/join.py (JoinDialog.OnJoin): Make sure to really call
4961            the wxMessageDialog's Destroy() method.
4962    
4963    2003-05-22  Frank Koormann  <[email protected]>
4964    
4965            * Thuban/UI/join.py (JoinDialog.__init__): Make use of
4966            TransientTable.Title()
4967    
4968    2003-05-22  Frank Koormann  <[email protected]>
4969    
4970            Join Dialog, initial version.
4971    
4972            * Thuban/UI/mainwindow.py (MainWindow.TableJoin): Removed print.
4973    
4974            * Thuban/UI/join.py (JoinDialog): Functional implementation of
4975            former framework. Renamed Table1/Table2 to LeftTable/RightTable
4976            in all occurences.
4977    
4978            * Thuban/Model/transientdb.py (TransientJoinedTable.__doc__):
4979            Typo fixed.
4980    
4981    2003-05-22  Bernhard Herzog  <[email protected]>
4982    
4983            Give the tables titles so that the GUI can display more meaningful
4984            names. For now the titles are fixed but depend on e.g. filenames
4985            or the titles of the joined tables.
4986    
4987            * Thuban/Model/transientdb.py (TransientTable.Title)
4988            (TransientJoinedTable.Title, AutoTransientTable.Title): New.
4989    
4990            * Thuban/Model/table.py (DBFTable.Title, MemoryTable.Title): New.
4991    
4992            * test/test_transientdb.py
4993            (TestTransientTable.test_auto_transient_table_title): New. Test
4994            for the Title method
4995            (TestTransientTable.test_transient_joined_table)
4996            (TestTransientTable.test_transient_table): Add test for the Title
4997            methods
4998    
4999            * test/test_memory_table.py (TestMemoryTable.test_title): New.
5000            Test for the Title method
5001    
5002            * test/test_dbf_table.py (TestDBFTable.test_title): New. Test for
5003            the Title method
5004    
5005    2003-05-22  Bernhard Herzog  <[email protected]>
5006    
5007            * test/test_layer.py (TestLayer.setUp, TestLayer.tearDown):
5008            Provide a better way to destroy the layers
5009            (TestLayer.test_base_layer, TestLayer.test_arc_layer)
5010            (TestLayer.test_point_layer, TestLayer.test_empty_layer)
5011            (TestLayer.test_polygon_layer, TestLayer.test_get_field_type): Use
5012            the new way to destroy the layers.
5013            (TestLayer.test_derived_store): New. Test for using a layer with a
5014            DerivedShapeStore
5015    
5016            * Thuban/Model/layer.py (Layer.SetShapeStore): Only set the
5017            filename if the shape store actually has one.
5018    
5019    2003-05-22  Bernhard Herzog  <[email protected]>
5020    
5021            * Thuban/Model/table.py (DBFTable.FileName): New. Accessor method
5022            for the filename
5023    
5024            * test/test_dbf_table.py (TestDBFTable.test_filename): New. Test
5025            for the FileName method
5026            (TestDBFTableWriting.test_write): Fix spelling of filename
5027    
5028    2003-05-22  Thomas Koester  <[email protected]>
5029    
5030            * Thuban/Model/range.py, test/test_range.py: Brought over new Range
5031            from SciParam that now really is immutable.
5032    
5033    2003-05-22  Frank Koormann  <[email protected]>
5034    
5035            Layer Top/Bottom placement added to legend.
5036    
5037            * Thuban/UI/legend.py
5038            (LegendPanel._OnMoveTop(), LayerPanel._OnMoveBottom): New, methods
5039            bound to tool events.
5040            (LegendTree.MoveCurrentItemTop(), LegendTree.MoveCurrentItemBottom):
5041            New, methods binding the event methods with the map methods.
5042    
5043            * Thuban/Model/map.py (Map.TopLayer(), Map.BottomLayer()): New, place
5044            layer at top/bottom of layer stack.
5045    
5046            * Resources/Bitmaps/top_layer.xpm: New button icon.
5047    
5048            * Resources/Bitmaps/bottom_layer.xpm: New button icon.
5049    
5050    2003-05-22  Bernhard Herzog  <[email protected]>
5051    
5052            * Thuban/Model/session.py (Session.RemoveTable): New method to
5053            remove tables
5054    
5055            * test/test_session.py (TestSessionSimple.test_remove_table): New.
5056            Test for RemoveTable
5057    
5058    2003-05-22  Thomas Koester  <[email protected]>
5059    
5060            * Thuban/Model/classgen.py: Added short module doc string and CVS id.
5061            (ClassGenerator.GenUniformDistribution): Use new Range __init__, too.
5062    
5063    2003-05-22  Bernhard Herzog  <[email protected]>
5064    
5065            Implement a way to discover dependencies between tables and
5066            shapestores.
5067    
5068            * Thuban/Model/transientdb.py (TransientTableBase.Dependencies)
5069            (TransientJoinedTable.Dependencies)
5070            (AutoTransientTable.SimpleQuery): New. Implement the dependencies
5071            interface
5072            (TransientJoinedTable.__init__): Keep tack of the original table
5073            objects in addition to the corresponding transient tables.
5074    
5075            * Thuban/Model/table.py (DBFTable.Dependencies)
5076            (MemoryTable.Dependencies): New. Implement the dependencies
5077            interface
5078    
5079            * Thuban/Model/data.py (ShapeTable): New. Helper class for
5080            ShapefileStore
5081            (ShapefileStore.__init__): Use ShapeTable instead of
5082            AutoTransientTable
5083            (ShapefileStore.Table, ShapefileStore.Shapefile): Add doc-strings
5084            (ShapefileStore.FileName, ShapefileStore.FileType): New. Accessor
5085            methods for filename and type
5086            (ShapefileStore.Dependencies): New. Implement the dependencies
5087            interface
5088            (DerivedShapeStore): New class to replace SimpleStore. The main
5089            difference to SimpleStore is that it depends not on a shapefile
5090            but another shapestore which expresses the dependencies a bit
5091            better
5092            (SimpleStore.__init__): Add deprecation warning.
5093    
5094            * test/test_dbf_table.py (TestDBFTable.test_dependencies): New.
5095            Test for the Dependencies method.
5096    
5097            * test/test_memory_table.py (TestMemoryTable.test_dependencies):
5098            New. Test for the Dependencies method.
5099    
5100            * test/test_transientdb.py
5101            (TestTransientTable.test_auto_transient_table_dependencies): New.
5102            Test for the Dependencies method.
5103            (TestTransientTable.test_transient_joined_table): Add test for the
5104            Dependencies method.
5105    
5106            * test/test_session.py (TestSessionSimple.setUp)
5107            (TestSessionSimple.tearDown): New. Implement a better way to
5108            destroy the sessions.
5109            (TestSessionSimple.test_initial_state)
5110            (TestSessionSimple.test_add_table): Bind session to self.session
5111            so that it's destroyed by tearDown
5112            (TestSessionSimple.test_open_shapefile): New. Test for
5113            OpenShapefile and the object it returns
5114    
5115    2003-05-22  Bernhard Herzog  <[email protected]>
5116    
5117            * Thuban/Model/session.py (Session.AddTable): New method to
5118            register tables with the session.
5119            (Session.Tables): Return the tables registered with AddTable too.
5120    
5121            * test/test_session.py (TestSessionSimple.test_add_table): New.
5122            Test case for the AddTable method
5123    
5124    2003-05-22  Frank Koormann  <[email protected]>
5125    
5126            UI polishing updates: Place main buttons (OK, Cancel, etc) in the
5127            lower right corner, center labels for selections, initialize controls
5128            in reasonable order for keyboard navigation.
5129    
5130            * Thuban/UI/projdialog.py (ProjFrame.__init__, ProjFrame.__doLayout)
5131            (ProjFrame.__DoOnProjAvail): Determine position of current projection
5132            using the wxListBox.FindString() method. Still a problem (#1886)
5133    
5134            * Thuban/UI/classifier.py
5135            (Classifier.__init__, SelectPropertiesDialog.__init__)
5136    
5137            * Thuban/UI/classgen.py (ClassGenDialog.__init__,
5138            (ClassGenDialog.__DoOnGenTypeSelect): Moved initialization of the
5139            different classification types from here to __init__.
5140            (GenUniquePanel.__init__): Set the column width of the first field
5141            in the Field ListCtrl to the full width.
5142    
5143            * Thuban/UI/tableview.py (LayerTableFrame.__init__): Rename 'Save As'
5144            Button to 'Export'. Center Buttons in Selection Box, set Focus to
5145            Grid.
5146            (LayerTableFrame.OnKeyDown()): New, bound to the grid with EVT_KEY_DOWN,
5147            changes focus to the Selection when pressing "Alt-S".
5148    
5149            * Thuban/UI/legend.py (LegendTree.__SetVisibilityStyle): Only gray out
5150            the text if not visible. The italic font sometimes exceeds the
5151            rendering area.
5152    
5153    2003-05-21  Jonathan Coles   <[email protected]>
5154    
5155            * Thuban/UI/dock.py (DockFrame): Rename references to _OnClose
5156            to OnClose so that Thuban closes correctly.
5157    
5158            * Thuban/UI/mainwindow.py (MainWindow.OnClose): Call
5159            DockFrame.OnClose, not DockFrame._OnClose.
5160    
5161    2003-05-21  Jonathan Coles   <[email protected]>
5162    
5163            * Thuban/Model/classgen.py (ClassGenerator.GenQuantiles): Remove
5164            references to 'inf' and use new Range __init__ to pass floats
5165            directly rather than converting them to strings first.
5166            Fixes RTBug #1876.
5167    
5168            * Thuban/Model/classification.py (ClassGroupRange.SetRange):
5169            Use new Range ___init__ to pass floats.
5170    
5171            * Thuban/Model/layer.py (RasterLayer.__init__): Test if the
5172            filename is a valid image file. Throw IOError otherwise.
5173    
5174            * Thuban/Model/range.py: Brought over new Range from SciParam that
5175            is immutable and has an __init__ which can accept floats.
5176    
5177            * Thuban/UI/mainwindow.py (MainWindow.AddLayer): Move OpenShapefile
5178            into try block. AddLayer doesn't throw any exceptions anymore.
5179            (MainWindow.AddRasterLayer): Move constructor of RasterLayer into
5180            try block.
5181    
5182            * Thuban/UI/projdialog.py (GeoPanel.__init__): Put Degrees as
5183            the first item in choices. Fixes RTBug #1882.
5184    
5185            * Thuban/UI/renderer.py (MapRenderer.render_map): Check if scale
5186            has gone to 0 which is a serious problem. abort.
5187            (MapRenderer.draw_raster_layer): Catch IOError seperately and
5188            print the error from GDAL.
5189    
5190            * Thuban/UI/tableview.py (TableGrid.__init__): Call
5191            ToggleEventListeners to turn on listening.
5192            (TableGrid.ToggleEventListeners): New. Turns event listening on
5193            and off so as to prevent excessive messages.
5194            (LayerTableFrame.OnQuery): Use TableGrid.ToggleEventListeners
5195            to suppress excessive messages when selecting many rows.
5196            Fixes RTBug #1880.
5197    
5198            * Thuban/UI/view.py: Added checks against if scale == 0. This
5199            is a serious problem that can occur when an image without
5200            geo data is loading and causes the map projection bounds to
5201            go to infinity. Right now, the solution is to simply try
5202            to recover.
5203    
5204            * extensions/thuban/cpl_mfile.cpp (MFILEClose): Make sure
5205            to set the MFILEReceiver attributes even if the data is NULL.
5206    
5207            * extensions/thuban/gdalwarp.cpp: Improved the error handling
5208            and passed GDAL messages back up to the Python layer. Also
5209            tried to fix some memory leaks that were present in the original
5210            utility but didn't matter because the program aborted.
5211    
5212            * test/test_range.py: Copied over tests from SciParam. Removed
5213            tests against importing. Fixes RTBug #1867.
5214    
5215    2003-05-21  Bernhard Herzog  <[email protected]>
5216    
5217            * test/test_load.py: Remove unused imports and restructure the
5218            test code
5219            (LoadSessionTest): Split into one class for each test and turn
5220            LoadSessionTest itself into the base class for all such session
5221            tests.
5222            (ClassificationTest): New base class for load tests that test
5223            classifications
5224            (TestSingleLayer, TestLayerVisibility, TestClassification)
5225            (TestLabels, TestLayerProjection, TestRasterLayer): New classes
5226            for the individual tests
5227    
5228            * test/support.py (FileLoadTestCase.filename): New base class for
5229            file loading tests
5230    
5231    2003-05-21  Jan-Oliver Wagner <[email protected]>
5232    
5233            * Resources/Projections/defaults.proj: Renamed 'Universal Transverse
5234            Mercator' to 'UTM Zone 32' as a more convenient example.
5235            Added 'Gauss Krueger Zone 6'.
5236    
5237            * Data/iceland_sample_raster.thuban: political polygon now
5238            filled transparent to have the raster image visible at once.
5239    
5240    2003-05-21  Frank Koormann  <[email protected]>
5241    
5242            * Thuban/UI/mainwindow.py (MainWindow): Renamed _OnClose() back to
5243            OnClose() to keep in sync with extensions. Internally Thuban
5244            still uses "underscored" names.
5245    
5246    2003-05-20  Jonathan Coles   <[email protected]>
5247    
5248            This puts back Raster layer support. These layers support projections
5249            through the GDAL library. Currently, the CVS version is being used.
5250            There are no Debian packages available although this may change soon.
5251            A GDAL driver was extended to support writing to memory rather to
5252            files.
5253    
5254            There is still some work that needs to be done, such as some error
5255            handling when loading invalid images or when there is a problem
5256            projecting the image. This putback simply checks in the majority
5257            of the work.
5258    
5259            * setup.py: Add gdalwarp library extension.
5260    
5261            * Thuban/Model/layer.py (BaseLayer.HasClassification): New.
5262            Defaults to False, but can be overridden by subclasses if they
5263            support classification.
5264            (RasterLayer): New. Defines a new layer that represents an
5265            image.
5266    
5267            * Thuban/Model/load.py (SessionLoader.__init__): Add rasterlayer
5268            tag handler.
5269            (SessionLoader.start_layer): Encode the filename.
5270            (SessionLoader.start_rasterlayer, SessionLoader.end_rasterlayer):
5271            New. Supports reading a rasterlayer tag.
5272    
5273            * Thuban/Model/map.py (Map.BoundingBox): Fix typo in comment.
5274    
5275            * Thuban/Model/save.py (XMLWriter.encode): Don't assume that we
5276            get a string in Latin1. If we get such as string convert it to
5277            unicode first, otherwise leave if alone before encoding.
5278            (SessionSaver.write_layer): Add support for writing both Layers
5279            and RasterLayers.
5280    
5281            * Thuban/Model/transientdb.py (AutoTransientTable.SimpleQuery):
5282            The right argument may not be a string, it could also be a Column.
5283    
5284            * Thuban/UI/application.py (ThubanApplication.CreateMainWindow):
5285            Make initial window size 600x400. Fixes RTBug #1872.
5286    
5287            * Thuban/UI/classifier.py (Classifier.__init__): Rearrange how
5288            the dialog is constructed so that we can support layers that
5289            do not have classifications.
5290            (Classifier._OnTry): Only build a classification if the layer
5291            supports one.
5292    
5293            * Thuban/UI/legend.py: Change all checks that a layer is an
5294            instance of Layer into checks against BaseLayer.
5295            (LegendTree.__FillTreeLayer): Only add children to a branch if
5296            the layer supports classification.
5297    
5298            * Thuban/UI/mainwindow.py (MainWindow.NewSession,
5299            MainWindow.OpenSession): Don't proceed with an action if the
5300            user chooses Cancel when they are asked to save changes.
5301            (MainWindow.AddRasterLayer): New. Open a dialog to allow the
5302            user to select an image file. Create a new RasterLayer and add
5303            it to the map.
5304    
5305            * Thuban/UI/renderer.py (MapRenderer.render_map): Add support
5306            for rendering RasterLayer layers.
5307            (MapRenderer.draw_raster_layer): Actually method that calls
5308            the GDALWarp python wrapper and constructs an image from the
5309            data returned.
5310    
5311            * Thuban/UI/tableview.py (LayerTableFrame.__init__): Change the
5312            Choices symbols to match those used in the table query method.
5313            Replace deprecated method calls on table with new method names.
5314    
5315            * Thuban/UI/view.py (MapCanvas.set_view_transform): Try to limit
5316            how small the scale can get. This still needs more testing.
5317    
5318            * extensions/thuban/bmpdataset.cpp: New, but copied from GDAL.
5319            Provides a driver to output in .bmp format.
5320    
5321            * extensions/thuban/cpl_mfile.cpp, extensions/thuban/cpl_mfile.h:
5322            New. Provides IO routines which write to memory, rather than a file.
5323    
5324            * extensions/thuban/gdalwarp.cpp: New, but basically a direct copy
5325            of the gdalwarp utility provided in GDAL. Added function calls
5326            that can be accessed from python.
5327    
5328            * Data/iceland_sample_raster.thuban: New. Sample file that uses
5329            a raster layer.
5330    
5331            * Data/iceland/island.tfw, Data/iceland/island.tif: New. Raster
5332            layer image data.
5333    
5334            * Doc/thuban.dtd: Added rasterlayer attribute definition.
5335    
5336            * test/test_layer.py, test/test_load.py, test/test_save.py: Added
5337            tests associated with the raster layer code.
5338    
5339            * test/test_transientdb.py
5340            (TestTransientTable.test_auto_transient_table_query): Added a test
5341            for using a Column object as the "right" parameter to a query.
5342    
5343    2003-05-19  Frank Koormann  <[email protected]>
5344    
5345            * Thuban/version.py (get_changelog_date):
5346            Catch exceptions if ChangeLog does not exist.
5347    
5348            * Thuban/UI/view.py (MapCanvas.Export): Bugfix
5349    
5350    2003-05-19  Frank Koormann  <[email protected]>
5351    
5352            Extended version information for Thuban
5353    
5354            * Thuban/version.py: New, version information for Thuban: Last
5355            modification date and last ChangeLog entry date.
5356    
5357            * Thuban/UI/mainwindow.py (MainWindow.About()): Extended version
5358            information: Display Thuban, wxPython and Python version.
5359    
5360    2003-05-16  Bernhard Herzog  <[email protected]>
5361    
5362            * Thuban/Model/save.py: Remove some unused imports including the
5363            __future__ import for nested_scopes as Thuban relies on Python 2.2
5364            now.
5365            (XMLWriter.encode): Remove the special case for a None argument.
5366            In the saver encode is always called with a string argument.
5367    
5368    2003-05-16  Bernhard Herzog  <[email protected]>
5369    
5370            * Thuban/UI/__init__.py: Remove the work-around for the locale bug
5371            in wxPython (at least when usinvg wxGTK) prior to 2.4. The symptom
5372            of the bug was that e.g. float("1.2") would fail. Thuban now
5373            requires 2.4.x.
5374            
5375    2003-05-16  Frank Koormann   <[email protected]>
5376    
5377            Printing enhancement and WMF export (under Win32)
5378    
5379            * Thuban/UI/renderer.py (ExportRenderer): New, derived from
5380            ScreenRenderer. Renders Map, Legend and Scalebar for export.
5381            (PrinterRenderer): New, derived from ExportRenderer. Replaces the old
5382            PrintRender.
5383    
5384            * Thuban/UI/view.py (MapPrintout.__init__): Enhanced parameter set
5385            to fullfil information needed for PrinterRenderer.
5386            (MapCanvas.Export): New. Export Map (currently only to WMF on Win32).
5387            (MapCanvas.Print): Adapted to new MapPrintout.
5388            (OutputTransform): General calculations to transform from canvas
5389            coordinates to export/printing devices.
5390    
5391            * Thuban/UI/mainwindow.py (MainWindow.ExportMap()): New. Added also
5392            new method_command to call ExportMap, with platform dependency (only
5393            __WXMSW__)
5394      
5395            * Thuban/UI/scalebar.py (ScaleBar.DrawScaleBar): Position and Size
5396            of scalebar drawing area as new parameters.
5397            
5398            * Thuban/Model/scalebar.py (roundInterval): round long instead of int
5399    
5400            * Thuban/UI/legend.py (ScalebarBitmap.__SetScale):
5401            Update to extended scalebar.DrawScalebar header.
5402    
5403            * test/test_export.py: New, test Thuban.UI.view.OutputTransform()
5404    
5405            * test/test_scalebar.py: Made test executable as standalone.
5406    
5407    2003-05-16  Bernhard Herzog  <[email protected]>
5408    
5409            * Thuban/Model/table.py (Table): Remove this compatibility alias
5410            for DBFTable.
5411    
5412            * test/test_table.py: Import DBFTable as Table because that alias
5413            doesn't exist anymore.
5414    
5415            * Thuban/UI/classgen.py: Remove some unused imports
5416    
5417    2003-05-14  Jonathan Coles   <[email protected]>
5418    
5419            * Thuban/Model/classgen.py (ClassGenerator.GenSingletonsFromList):
5420            Fix docstring.
5421            (ClassGenerator.GenUniformDistribution): Fix spelling of method name.
5422            (ClassGenerator.GenQuantiles): Use the left/right brackets and min/max
5423            values of the supplied range to determine the beginning and end
5424            bounds of the generated classes.
5425    
5426            * Thuban/Model/range.py (Range.number_re): Now accepts floats that
5427            do not have a leading 0 (.5 is now accepted as well as 0.5).
5428    
5429            * Thuban/UI/classgen.py (ClassGenDialog.OnOK): Fix name of method
5430            call to ClassGenerator.GenUniformDistribution.
5431    
5432            * Thuban/UI/projdialog.py (ProjFrame.__do_layout): Fix Windows
5433            layout bug with the 'Projection' label.
5434    
5435            * test/support.py (FloatTestCase): New. Needed for the Range tests.
5436    
5437            * test/test_range.py: New. Imported from SciParam.
5438    
5439    2003-05-12  Jonathan Coles   <[email protected]>
5440    
5441            * Thuban/UI/classgen.py (GenQuantilesPanel.GetList): Replace call
5442            to table.UniqueValues() with calls that retrieve all the values
5443            from the table. This will need to be replaced by a method on table
5444            which can simply return the list (perhaps more efficiently).
5445    
5446    2003-05-12  Jonathan Coles   <[email protected]>
5447    
5448            The return value of ClassGenerator.CalculateQuantiles has changed.
5449            Refer to the documentation for details.
5450    
5451            * test/test_classgen.py: Modified Quantile tests to use the
5452            new return values.
5453    
5454            * Thuban/Model/classgen.py
5455            (ClassGenerator.GenQuantiles): Add comments describing the parameters,
5456            use new return values from CalculateQuantiles to produce the correct
5457            range bounds in the Classification.
5458            (ClassGenerator.CalculateQuantiles): Add more comments describing
5459            the return values and parameters. Make minor adjustments to improve
5460            the legibility of the code. Fix problem with adjusted not being set
5461            in most cases.
5462    
5463    2003-05-12  Frank Koormann <[email protected]>
5464            
5465            * Thuban/Model/save.py (XMLWriter.encode()): Explicite call to unicode
5466            and latin1. Fixes #1851 finally.
5467    
5468    2003-05-09  Jonathan Coles   <[email protected]>
5469    
5470            * test/test_classgen.py: New. Tests the Quantile algorithm.
5471    
5472            * Thuban/Model/classgen.py (ClassGenerator.CalculateQuantiles):
5473            Clean up debugging statement, add comments, fix a small bug in the
5474            returned adjusted percentiles.
5475            
5476    2003-05-09  Jonathan Coles   <[email protected]>
5477    
5478            Introduces Range class from SciParam into the ClassGroupRange class,
5479            and such ranges can now be saved and loaded from disk.
5480    
5481            Quantiles are now available in the Classification Generator.
5482    
5483            Initial support for building Queries on a table. Doesn't do anything
5484            but run some tests.
5485    
5486            * Thuban/Model/classification.py: Explicit imports.
5487            (ClassGroupRange): Use the Range class to store the underlying
5488            range information. The interface remains the same, except for
5489            GetRange(), and you can also supply a Range object as the min
5490            parameter to SetRange or __init__.
5491    
5492            * Thuban/Model/load.py (XMLReader.encode): New. Encodes the given
5493            string appropriately for use in Thuban. Fixes RTbug #1851.
5494            (SessionLoader.end_projection): Handle the context of the
5495            projection tag a bit better by looking at what objects are not
5496            None. There was an assumption that a projection tag for a map
5497            could occur before any layers.
5498            (SessionLoader.start_clrange): Provide backward compatibility for
5499            reading min/max values as well as the new range parameter.
5500    
5501            * Thuban/Model/map.py: Explicit imports.
5502    
5503            * Thuban/Model/resource.py: Import _.
5504            (ProjFileSaver.write): write header using projfile.dtd.
5505    
5506            * Thuban/Model/save.py: Explicit imports.
5507            (XMLWriter.encode): New. Encode the given string from a format
5508            used by Thuban into UTF-8. Fixes RTbug #1851.
5509    
5510            * Thuban/UI/classgen.py: Explicit imports.
5511            (ClassGenDialog.__init__): Clean up the code and add support
5512            for Quantiles.
5513            (ClassGenDialog.OnOK): Add support for Quantiles.
5514            (GenQuantilesPanel): New. Input panel for Quantiles.
5515            (ClassGenerator, CustomRamp, MonochromaticRamp, GreyRamp, RedRamp,
5516            GreenRamp, BlueRamp, HotToColdRamp): Move to Thuban/Model/classgen.py
5517    
5518            * Thuban/Model/classgen.py: New. Contains all the classes named above.
5519    
5520            * Thuban/UI/classifier.py: Explicit imports.
5521            (ClassTable.GetValueAsCust, ClassTable.__ParseInput,
5522            ClassTable.SetValueAsCustom): Reworked to use new Range class.
5523    
5524            * Thuban/UI/legend.py: Explicit imports.
5525    
5526            * Thuban/UI/mainwindow.py: Add support for the Join Dialog. Added
5527            a Table menu and associated method calls.
5528            (MainWindow.choose_color): Removed. No longer needed.
5529    
5530            * Thuban/UI/projdialog.py (ProjFrame.__VerifyButtons): Save button
5531            should be disabled if no projection is selected in the available
5532            list.
5533    
5534            * Thuban/UI/renderer.py: Explicit imports.
5535    
5536            * Thuban/UI/tableview.py (TableGrid.OnRangeSelect): Fix some issues
5537            with correctly selecting the rows and issuing the right events.
5538            Be sure to call Skip() to allow the grid to do some of its own
5539            handling which allows the rows to actually be selected.
5540            (LayerTableGrid.select_shapes): Rename from select_shape. Supports
5541            selecting multiple shapes.
5542            (LayerTableFrame): Support for building Queries.
5543            (LayerTableFrame.select_shapes): Allow multiple shapes to be selected.
5544    
5545            * Thuban/UI/tree.py: Explicit imports.
5546    
5547            * Thuban/UI/view.py (MapCanvas): Delegate "SelectedShapes" so the
5548            table view can call it.
5549    
5550            * test/test_classification.py: Explicit imports.
5551            (TestClassification.test_ClassGroupRange): Fix test for new
5552            Range class.
5553    
5554            * Doc/thuban.dtd: Add range parameter for clrange.
5555    
5556            * Thuban/Model/range.py: Taken from SciParam. Used as the underlying
5557            object in ClassGroupRange, and also uesd for inputting ranges in
5558            the classifer table and elsewhere.
5559    
5560            * Thuban/UI/join.py: New. Initial Join dialog. No real functionality
5561            yet.
5562    
5563    2003-05-09  Frank Koormann <[email protected]>
5564    
5565            * Thuban/UI/scalebar.py (DrawScaleBar): Draw only if interval > 0.0.
5566    
5567    2003-05-08  Frank Koormann <[email protected]>
5568    
5569            Coding style updates
5570    
5571            * test/test_scalebar.py: Replaced tab indentation by spaces.
5572    
5573            * Thuban/UI/scalebar.py: Explicit imports.
5574    
5575    2003-05-08  Frank Koormann <[email protected]>
5576    
5577            * Thuban/UI/scalebar.py
5578            (ScaleBar.DrawScalebar): Format string bug fixed.
5579    
5580    2003-05-08  Frank Koormann <[email protected]>
5581    
5582            Reorganization of scalebar component (no wx in Thuban/Model)
5583    
5584            * Thuban/Model/scalebar.py: Rendering moved to Thuban/UI/scalebar.py
5585            (deriveInterval):
5586            Calculate scalebar interval and unit which fits in width for scale.
5587            (roundInterval): Round float.
5588    
5589            * Thuban/UI/scalebar.py (ScaleBar): Scalebar rendering
5590    
5591            * test/test_scalebar.py: Test for Thuban/Model/scalebar.py methods.
5592    
5593            * Thuban/UI/legend.py: Import Thuban.UI.scalebar
5594    
5595    2003-05-08  Frank Koormann <[email protected]>
5596    
5597            * Thuban/UI/legend.py (ScalebarBitmap.SetCanvas):
5598            Initialize ScaleBar with canvas.map
5599    
5600            * Thuban/Model/scalebar.py (ScaleBar.roundInterval()): New,
5601            round intervals to display smarter lengths
5602            (ScaleBar.DrawScalebar): Draw Scalebar only if the map contains a
5603            layer. If the maps has no projection applied grey the scalebar.
5604    
5605    2003-05-07  Frank Koormann <[email protected]>
5606            
5607            Basic Scalebar features added.
5608    
5609            * Thuban/Model/scalebar.py (ScaleBar): New, scalebar rendering.
5610    
5611            * Thuban/UI/legend.py (LegendPanel): Added scalebar bitmap
5612            (ScaleBarBitmap): New, links the scalebar bitmap with view messages
5613            and the renderer.
5614    
5615            * Thuban/UI/view.py (MapCanvas.set_view_transform): Issue SCALE_CHANGED.
5616    
5617            * Thuban/UI/messages.py: SCALE_CHANGED added.
5618    
5619    2003-05-07  Bernhard Herzog  <[email protected]>
5620    
5621            * Thuban/Model/session.py (Session.__init__): New instance
5622            variable shapestores to hold a list of all open shapestore objects
5623            (Session.ShapeStores): New. Accessor method for the shapestores
5624            list.
5625            (Session._add_shapestore, Session._clean_weak_store_refs): New.
5626            Internal methods to maintain the shapestores list.
5627            (Session.Tables): New. Return all tables open in the session.
5628            (Session.OpenShapefile): Insert the new ShapeStore into the
5629            shapestores list.
5630    
5631            * test/test_session.py (TestSessionSimple.test_initial_state): Add
5632            tests for ShapeStores and Tables
5633            (TestSessionWithContent.test_shape_stores)
5634            (TestSessionWithContent.test_tables): New. Test cases for
5635            ShapeStores and Tables
5636    
5637    2003-05-07  Bernhard Herzog  <[email protected]>
5638    
5639            * Thuban/Model/transientdb.py (TransientTableBase.ReadRowAsDict):
5640            Add comments about the optimizations used.
5641            (AutoTransientTable.ReadValue, TransientTableBase.ReadValue): New.
5642            Implement the ReadValue table interface method.
5643    
5644            * test/test_transientdb.py
5645            (TestTransientTable.run_iceland_political_tests)
5646            (TestTransientTable.test_transient_joined_table): Add tests for
5647            ReadValue
5648    
5649    2003-05-07  Frank Koormann <[email protected]>
5650    
5651            * Resources/Bitmaps/fulllayerextent.xpm,
5652            Resources/Bitmaps/fullselextent.xpm: Replaced the place holders with
5653            new icons.
5654    
5655    2003-05-06  Bernhard Herzog  <[email protected]>
5656    
5657            * Thuban/Model/transientdb.py (AutoTransientTable.SimpleQuery):
5658            New. Simply delegate to the transient table's version.
5659    
5660            * test/test_transientdb.py
5661            (TestTransientTable.test_auto_transient_table_query): New. Test
5662            case for AutoTransientTable's SimpleQuery
5663    
5664    2003-05-06  Bernhard Herzog  <[email protected]>
5665    
5666            * Thuban/Model/transientdb.py (TransientTableBase.SimpleQuery):
5667            Implement a simple query method for the query dialog
5668            (TransientTableBase.create): Add an INTEGER PRIMARY KEY that holds
5669            the row index or shapeid.
5670            (TransientTable.create): Insert the right value of the row index
5671            (TransientJoinedTable.create): Copy the row index of the left
5672            table to the joined result table
5673    
5674            * test/test_transientdb.py
5675            (TestTransientTable.test_transient_table_read_twice): Fix
5676            doc-string
5677            (TestTransientTable.test_transient_table_query): New. Test for the
5678            SimpleQuery method
5679    
5680    2003-05-06  Bernhard Herzog  <[email protected]>
5681    
5682            Convert all table users to use the new table interface. This only
5683            covers Thuban itself, not GREAT-ER or other applications built on
5684            Thuban yet, so the compatibility interface stays in place for the
5685            time being but it now issues DeprecationWarnings.
5686    
5687            Finally, the new Table interface has a new method, HasColumn.
5688    
5689            * Thuban/Model/table.py (OldTableInterfaceMixin): All methods
5690            issue deprecation warnings when they're. The warnings refer to the
5691            caller of the method.
5692            (OldTableInterfaceMixin.__deprecation_warning): New. Helper method
5693            for the deprecation warnings
5694    
5695            * test/test_table.py: Ignore the deprecation warnings for the old
5696            table in the tests in this module. The purpose of the tests is to
5697            test the old interface, after all.
5698    
5699            * test/test_transientdb.py
5700            (TestTransientTable.run_iceland_political_tests): Use the
5701            constants for the types. Add a test for HasColumn
5702            (TestTransientTable.test_transient_joined_table): Adapt to new
5703            table interface. Add a test for HasColumn
5704            (TestTransientTable.test_transient_table_read_twice): Adapt to new
5705            table interface
5706    
5707            * Thuban/UI/tableview.py (DataTable.SetTable, DataTable.GetValue):
5708            Adapt to new table interface
5709    
5710            * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Adapt to
5711            new table interface
5712    
5713            * Thuban/UI/controls.py (RecordListCtrl.fill_list)
5714            (RecordTable.SetTable): Adapt to new table interface
5715    
5716            * Thuban/UI/classifier.py (Classifier.__init__)
5717            (Classifier.__init__): Adapt to new table interface
5718    
5719            * Thuban/UI/classgen.py (ClassGenDialog.__init__)
5720            (GenUniformPanel._OnRetrieve, GenUniquePanel._OnRetrieve): Adapt
5721            to new table interface
5722    
5723            * Thuban/Model/transientdb.py (TransientTableBase.HasColumn)
5724            (AutoTransientTable.HasColumn): Implement the new table interface
5725            method
5726            (AutoTransientTable.ReadRowAsDict, AutoTransientTable.ValueRange)
5727            (AutoTransientTable.UniqueValues): Adapt to new table interface
5728    
5729            * Thuban/Model/layer.py (Layer.SetShapeStore, Layer.GetFieldType):
5730            Adapt to new table interface
5731    
5732            * test/test_layer.py (TestLayer.open_shapefile): Helper method to
5733            simplify opening shapefiles a bit easier.
5734            (TestLayer.test_arc_layer, TestLayer.test_polygon_layer)
5735            (TestLayer.test_point_layer): Use the new helper method
5736            (TestLayer.test_get_field_type): New. Test for the GetFieldType
5737            method
5738    
5739            * test/test_dbf_table.py (TestDBFTable.test_has_column): Test for
5740            the new table method
5741    
5742            * test/test_memory_table.py (TestMemoryTable.test_has_column):
5743            Test for the new table method HasColumn
5744    
5745    2003-05-06  Jonathan Coles   <[email protected]>
5746    
5747            Addresses the "Selection Extent" wish of RTbug #1787.
5748    
5749            * Resources/Bitmaps/fulllayerextent.xpm,
5750            Resources/Bitmaps/fullselextent.xpm: Bitmaps for layer and selection
5751            extent. These are just place holders for the real bitmaps.
5752    
5753            * Thuban/Model/layer.py (Shape): Since a Shape is immutable only
5754            calculate the bounding box once (the first time compute_bbox() is
5755            called).
5756            (Layer.ShapesBoundingBox): New. Given a list of shape ids, return
5757            the bounding box for the shapes in lat/long coordinates.
5758    
5759            * Thuban/UI/mainwindow.py: Added new "Full selection extent" menu
5760            option.
5761            (MainWindow.has_selected_shapes): New. Returns true if there are
5762            any selected shapes.
5763            (MainWindow.FullSelectionExtent): New. Calls
5764            MapCanvas.FitSelectedToWindow() when the user selects the menu option.
5765            (_has_selected_shapes): New. Returns true if there are any
5766            selected shapes.
5767    
5768            * Thuban/UI/selection.py (Selection.HasSelectedShapes): New. Returns
5769            true if there are any selected shapes.
5770    
5771            * Thuban/UI/view.py (MapCanvas): Added delegated method
5772            HasSelectedShapes.
5773            (MapCanvas.FitSelectedToWindow): New. Centers and scales any selected
5774            shapes on the canvas using the map projection (if any).
5775    
5776            * test/test_layer.py (TestLayer.test_arc_layer): Add some tests
5777            for Layer.ShapesBoundingBox().
5778    
5779    2003-05-06  Bernhard Herzog  <[email protected]>
5780    
5781            * Resources/Projections/defaults.proj: Fix spelling of Mercator
5782    
5783    2003-05-05  Jonathan Coles   <[email protected]>
5784    
5785            Addresses the "Full Layer Extent" wish of RTbug #1787.
5786    
5787            * Resources/Projections/defaults.proj: Added UK National Grid.
5788    
5789            * Thuban/UI/mainwindow.py: Added new "Full layer extent" menu option.
5790            (MainWindow.FullLayerExtent): New. Calls MapCanvas.FitLayerToWindow()
5791            when the user selects the menu option.
5792    
5793            * Thuban/UI/view.py (MapCanvas.FitLayerToWindow): New. Centers and
5794            scales the given layer on the canvas using the map projection.
5795    
5796    2003-05-05  Bernhard Herzog  <[email protected]>
5797    
5798            Convert the table implementations to a new table interface. All
5799            tables use a common mixin class to provide backwards compatibility
5800            until all table users have been updated.
5801    
5802            * Thuban/Model/table.py (OldTableInterfaceMixin): Mixin class to
5803            provide backwards compatibility for table classes implementing the
5804            new interface
5805            (DBFTable, MemoryTable): Implement the new table interface. Use
5806            OldTableInterfaceMixin as base for compatibility
5807            (DBFColumn, MemoryColumn): New. Column description for DBFTable
5808            and MemoryTable resp.
5809    
5810            * test/test_dbf_table.py: New. Test cases for the DBFTable with
5811            the new table interface.
5812    
5813            * test/test_memory_table.py: New. Test cases for the MemoryTable
5814            with the new table interface.
5815    
5816            * test/test_table.py: Document the all tests in this file as only
5817            for backwards compatibility. The equivalent tests for the new
5818            interface are in test_memory_table.py and test_dbf_table.py
5819            (MemoryTableTest.test_read): field_info should be returning tuples
5820            with four items
5821            (MemoryTableTest.test_write): Make doc-string a more precise.
5822    
5823            * Thuban/Model/transientdb.py (TransientTableBase): Convert to new
5824            table interface. Derive from from OldTableInterfaceMixin for
5825            compatibility.
5826            (TransientTableBase.create): New intance variable column_map to
5827            map from names and indices to column objects
5828            (TransientTable.create): Use the new table interface of the input
5829            table
5830            (AutoTransientTable): Convert to new table interface. Derive from
5831            from OldTableInterfaceMixin for compatibility.
5832            (AutoTransientTable.write_record): Removed. It's not implemented
5833            yet and we still have to decide how to handle writing with the new
5834            table and data framework.
5835    
5836            * test/test_transientdb.py
5837            (TestTransientTable.run_iceland_political_tests)
5838            (TestTransientTable.test_transient_joined_table): Use the new
5839            table interface
5840    
5841    2003-05-05  Jonathan Coles   <[email protected]>
5842    
5843            This is namely a collection of UI updates to improve user interactivity.
5844            Tabbing between controls now exists and you can use ESC to close dialog
5845            boxes; ENTER will active the default button.
5846    
5847            * Thuban/UI/classgen.py (ClassGenDialog.__init__): Rearrange the
5848            order that the controls are created so that tabbing works correctly.
5849            (ClassGenDialog.OnOK): Renamed from _OnGenerate() so that the
5850            wxDialog can handle the default button correctly.
5851            (ClassGenDialog.OnCancel): Renamed from _OnCloseBtn() for the
5852            same reasons as for OnOK.
5853            (GenUniformPanel._OnRetrieve): Call wxBeginBusyCursor/wxEndBusyCursor
5854            when we ask the table for the maximum/minimum values of a field
5855            which could take a very long time.
5856    
5857            * Thuban/UI/classifier.py (Classifier.__init__): Rearrange the
5858            order that the controls are created so that tabbing works correctly.
5859            (SelectPropertiesDialog.__init__): Rearrange the order that the
5860            controls are created so that tabbing works correctly.
5861    
5862            * Thuban/UI/dialogs.py: Copied NonModalDialog box and changed it
5863            to derive from a wxDialog but behave like the original implementation
5864            which was derived from a wxFrame. wxDialog provides useful key
5865            handling functionality like ESC calling OnCancel and ENTER calling
5866            OnOK which is lost with wxFrame.
5867    
5868            * Thuban/UI/mainwindow.py: Add "..." to menu items that will open
5869            new dialogs.
5870    
5871            * Thuban/UI/projdialog.py (ProjFrame.__init__): Rearrange the
5872            order that the controls are created so that tabbing works correctly.
5873            (ProjFrame.OnApply): Renamed from _OnTry() to use wxDialog behaviour.
5874            (ProjFrame.OnOK): Renamed from _OnOK() to use wxDialog behaviour.
5875            (ProjFrame.OnCancel): Renamed from _OnClose() to use wxDialog behaviour.
5876            (ProjPanel.__init__): Add "Airy" to the list of ellipsoids so we
5877            can provide the "UK National Grid" as a default projection.
5878            (UTMPanel.__init__): Rearrange the order that the controls are
5879            created so that tabbing works correctly.
5880    
5881    2003-05-05  Bernhard Herzog  <[email protected]>
5882    
5883            * extensions/thuban/wxproj.cpp: Fix some of the comments.
5884            (project_point): If a map projection but no layer projection is
5885            given, convert degrees to radians before applying the map
5886            projection.
5887    
5888            * Thuban/UI/tableview.py (TableGrid.disallow_messages)
5889            (TableGrid.allow_messages): New methods to make it possible to
5890            inhibit message sending.
5891            (TableGrid.issue): Only send the message if not inhibited.
5892            (LayerTableGrid.select_shape): Use the new methods to make sure
5893            that no ROW_SELECTED message is sent while we're updating the
5894            selected rows to match the selected shapes.
5895    
5896    2003-05-02  Jan-Oliver Wagner <[email protected]>
5897    
5898            Implementation of MemoryTable.
5899    
5900            * Thuban/Model/table.py (MemoryTable): New. Quite simple table
5901            implementation that operates on a list of tuples. All of the data
5902            are kept in the memory.
5903    
5904            * test/test_table.py (MemoryTableTest): New.
5905    
5906            * test/test_transientdb.py (SimpleTable): Removed.
5907            (TestTransientTable.test_transient_joined_table,
5908            (TestTransientTable.test_transient_table_read_twice): Replaced
5909            SimpleTable by MemoryTable.
5910    
5911    2003-04-30  Jonathan Coles   <[email protected]>
5912    
5913            * Data/iceland_sample.thuban: Now contains correct projections
5914            for each of the layers.
5915    
5916            * Resources/Projections/defaults.proj: Geographic projection
5917            contains unit conversion parameter.
5918    
5919    2003-04-30  Jonathan Coles   <[email protected]>
5920    
5921            The most important part of this putback is the projection changes.
5922            It should now be possible to specify the projection that a layer
5923            is in and then specify a different projection for the map. The
5924            projection dialog has an extra parameter for a geographic projection
5925            which lets the user select if the input is in degrees or radians.
5926    
5927            * Thuban/Model/layer.py (Layer.ShapesInRegion): Fix docstring
5928            to say that the parameter is a tuple of unprojected
5929            points (which is what the callers to this method were assuming).
5930            Also, since the points are unprojected we need to projected them.
5931    
5932            * Thuban/UI/legend.py (LegendTree.MoveCurrentItemUp,
5933            LegendTree.MoveCurrentItemDown): If the layer or any of the layer's
5934            groups are selected, move the layer up/down. Fixes RTbug #1833.
5935    
5936            * Thuban/UI/mainwindow.py: Move menu item map_rename up.
5937    
5938            * Thuban/UI/projdialog.py (ProjFrame._OnSave): Add missing
5939            parameter in call to SetClientData.
5940            (GeoPanel): Add support for selecting the units that the
5941            source data is in (Radians or Degrees).
5942    
5943            * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Optimize
5944            the rendering loop by reducing the number of if's, removing the
5945            unnecessary try/except block, and checking if the old group
5946            is the same as the new one (which happens a lot if there is
5947            no classification, or lots of shapes are in the same group).
5948    
5949            * Thuban/UI/view.py (MapCanvas.OnPaint): Add a try/except block
5950            around the redraw routine to try to catch problems that the user
5951            may create by selecting invalid projections for the data set and
5952            map. Clears the display if there are any problems and prints the
5953            error.
5954            (MapCanvas.do_redraw): Use DC.Clear() instead of drawing a filled
5955            rectangle.
5956    
5957            * extensions/thuban/wxproj.cpp (project_point): First invert the
5958            supplied point (which should be in projected coordinates) using
5959            the layer's projection and then project the point using the
5960            map's projection.
5961            (project_points): Use project_point() to project each point.
5962    
5963    2003-04-30  Jan-Oliver Wagner <[email protected]>
5964    
5965            * Thuban/Model/layer.py (Layer.SetShapeStore): Fixed a bug:
5966            don't set the Classification to None if the classfication field
5967            is None (ie only a DEFAULT).
5968    
5969    2003-04-30  Bernhard Herzog  <[email protected]>
5970    
5971            * Thuban/UI/view.py: Fix some typos.
5972    
5973            * Thuban/UI/mainwindow.py (MainWindow.identify_view_on_demand): Do
5974            not pop up the dialog if the selection becomes empty (this could
5975            happen if e.g. a new selection is opened while the identify tool
5976            is active and dialog had been closed)
5977    
5978    2003-04-30  Bernhard Herzog  <[email protected]>
5979    
5980            * Thuban/Model/transientdb.py (TransientTableBase.__init__): New
5981            instance variable read_record_last_result
5982            (TransientTableBase.read_record): Make sure reading the same
5983            record twice works. The implementation uses the new instance
5984            variable read_record_last_result
5985    
5986            * test/test_transientdb.py
5987            (TestTransientTable.test_transient_table_read_twice): New test
5988            case for the above bug-fix.
5989    
5990    2003-04-29  Jonathan Coles   <[email protected]>
5991    
5992            * Thuban/common.py: Removed. No longer needed Str2Num. RTbug #1832.
5993    
5994            * Thuban/UI/classgen.py: Remove all uses of Str2Num.
5995    
5996            * Thuban/UI/classifier.py: Remove all uses of Str2Num.
5997            (ClassTable.SetValueAsCustom): Rename keyword argument in
5998            ClassGroup* constructors to match argument name.
5999    
6000    2003-04-29  Bernhard Herzog  <[email protected]>
6001    
6002            * Thuban/Model/session.py (Session.Destroy): Explicitly close the
6003            transient DB if it exists to make sure it doesn't leave a journal
6004            file in the temp directory.
6005    
6006            * Thuban/Model/transientdb.py (TransientDatabase.close): Set
6007            self.conn to None after closing the connection to make sure it's
6008            not closed twice
6009    
6010    2003-04-29  Jonathan Coles   <[email protected]>
6011    
6012            Add a visible parameter in the layer XML tag. The default value is
6013            "true". If anything other than "false" is specified we also assume
6014            "true". Addresses RTbug #1025.
6015    
6016            * Doc/thuban.dtd: Add visible parameter to a layer.
6017    
6018            * Thuban/Model/layer.py (BaseLayer.__init__): Change default value
6019            of visible from 1 to True.
6020            (Layer.__init__): Change default value of visible from 1 to True.
6021    
6022            * Thuban/Model/load.py (SessionLoader.start_layer): Read visible
6023            parameter.
6024    
6025            * Thuban/Model/save.py (SessionSaver.write_layer): Save visible
6026            parameter.
6027    
6028            * test/test_load.py: Add new test data contents_test_visible.
6029            (LoadSessionTest.setUp): save test data.
6030            (LoadSessionTest.testLayerVisibility): Test if the visible flag
6031            is loaded correctly.
6032    
6033            * test/test_save.py (SaveSessionTest.testSingleLayer): Add test
6034            for saving an invisible layer.
6035    
6036    2003-04-29  Jonathan Coles   <[email protected]>
6037    
6038            * Thuban/UI/mainwindow.py (MainWindow.SetMap): Look up the
6039            legend dialog box and tell it to change its map to the one
6040            supplied to SetMap(). Fixes RTbug #1770.
6041    
6042    2003-04-29  Bernhard Herzog  <[email protected]>
6043    
6044            Next step of table implementation. Introduce a transient database
6045            using SQLite that some of the data is copied to on demand. This
6046            allows us to do joins and other operations that require an index
6047            for good performance with reasonable efficiency. Thuban now needs
6048            SQLite 2.8.0 and pysqlite 0.4.1. Older versions may work but I
6049            haven't tested that.
6050            
6051            * Thuban/Model/transientdb.py: New. Transient database
6052            implementation.
6053    
6054            * test/test_transientdb.py: New. Tests for the transient DB
6055            classes.
6056    
6057            * Thuban/Model/session.py (AutoRemoveFile, AutoRemoveDir): New
6058            classes to help automatically remove temporary files and
6059            directories.
6060            (Session.__init__): New instance variables temp_dir for the
6061            temporary directory and transient_db for the SQLite database
6062            (Session.temp_directory): New. Create a temporary directory if not
6063            yet done and return its name. Use AutoRemoveDir to have it
6064            automatically deleted
6065            (Session.TransientDB): Instantiate the transient database if not
6066            done yet and return it.
6067    
6068            * Thuban/Model/data.py (ShapefileStore.__init__): Use an
6069            AutoTransientTable so that data is copied to the transient DB on
6070            demand.
6071            (SimpleStore): New class that simply combines a table and a
6072            shapefile
6073    
6074            * Thuban/Model/table.py (Table, DBFTable): Rename Table into
6075            DBFTable and update its doc-string to reflect the fact that this
6076            is only the table interface to a DBF file. Table is now an alias
6077            for DBFTable for temporary backwards compatibility.
6078    
6079            * Thuban/UI/application.py (ThubanApplication.OnExit): Make sure
6080            the last reference to the session goes away so that the temporary
6081            files are removed properly.
6082    
6083            * test/test_load.py (LoadSessionTest.tearDown): Remove the
6084            reference to the session to make sure the temporary files are
6085            removed.
6086    
6087    2003-04-29  Bernhard Herzog  <[email protected]>
6088    
6089            * Thuban/Model/load.py (XMLReader.__init__, XMLReader.read): Turn
6090            the __parser instance variable into a normal local variable in
6091            read. It's only used there and read will never be called more than
6092            once. Plus it introduces a reference cycle that keeps can keep the
6093            session object alive for a long time.
6094    
6095    2003-04-29  Jonathan Coles   <[email protected]>
6096    
6097            * Thuban/Model/proj.py (Projection): Removed Set*() methods to make
6098            Projection an immutable item. Fixes RTbug #1825.
6099            (Projection.__init__): Initialize instance variables here.
6100            (ProjFile.Replace): New. Replace the given projection object with
6101            the new projection object. This solves the problem of needing the
6102            mutator Projection.SetProjection() in the ProjFrame class and
6103            allows a projection to change parameters without changing its
6104            location in the file.
6105    
6106            * Thuban/UI/mainwindow.py (MainWindow.SaveSessionAs): Dialog should
6107            be of type wxSAVE and should verify overwriting a file.
6108    
6109            * Thuban/UI/projdialog.py (ProjFrame._OnSave): Use the new
6110            ProjFile.Replace() method instead of the mutator
6111            Projection.SetProjection(). Also requires that we reassign the
6112            client data to the new projection.
6113    
6114            * test/test_proj.py (TestProjection.test): Test GetName() and
6115            GetAllParameters()
6116            (TestProjFile.test): Remove tests for Set*() methods. Add tests
6117            for Replace().
6118    
6119    2003-04-25  Jonathan Coles   <[email protected]>
6120    
6121            * Thuban/Model/save.py (SessionSaver.write_projection): Make sure
6122            to save the name of the projection.
6123    
6124            * test/test_save.py (SaveSessionTest.testLayerProjection): New
6125            test to verify layer projections are saved correctly.
6126    
6127    2003-04-25  Jonathan Coles   <[email protected]>
6128    
6129            * Thuban/Model/proj.py (Projection.SetName): Set the name
6130            to "Unknown" if name is None.
6131            (Projection.SetAllParameters): New. Set the projection's
6132            parameter list to the one supplied.
6133            (Projection.SetProjection): New. Set the projection's
6134            properties to those of the supplied Projection.
6135    
6136            * Thuban/UI/mainwindow.py (MainWindow.MapProjection): Set
6137            the dialog title to include the map's title.
6138            (MainWindow.LayerProjection): Set the dialog title to include
6139            the layer's title.
6140    
6141            * Thuban/UI/projdialog.py (ProjFrame.__ShowError): Consolidate
6142            error dialogs into a single method call.
6143            (ProjFrame.__VerifyButtons): Add more states to check.
6144            (ProjFrame.__GetProjection): Return the current state of an
6145            edited projection or None.
6146            (ProjFrame.__FillAvailList): Remove checks for states that
6147            shouldn't exist.
6148            (ProjFrame._OnNew): Clear all selected items and supply
6149            a projection panel if necessary.
6150    
6151            * test/test_proj.py (TestProjFile.test): Add tests for
6152            ProjFile.SetAllParameters, ProjFile.SetProjection,
6153            ProjFile.SetName.
6154    
6155    2003-04-25  Jonathan Coles   <[email protected]>
6156    
6157            * Thuban/UI/projdialog.py (ProjFrame.__FillAvailList): Now
6158            takes an optional argument to select the current projection.
6159            This does not guarantee that the item is visible due to
6160            limited wxWindows functionality. Fixes RTBug #1821.
6161    
6162    2003-04-25  Jonathan Coles   <[email protected]>
6163    
6164            * Thuban/Model/load.py (SessionLoader.start_projection): Remember
6165            the projection name and use it when constructing the Projection
6166            object.
6167    
6168            * Thuban/Model/proj.py (Projection.__init__): Change the default
6169            value for 'name' to None and then test if name is equal to None
6170            in the body of the constructor. This way the caller doesn't have to
6171            know what the default value should be. Namely, useful in load.py
6172            where we have to pick a default value if the 'name' parameter
6173            doesn't exist in the XML file.
6174    
6175            * test/test_load.py (LoadSessionTest.testLayerProjection): New.
6176            Tests a file where a layer has a projection.
6177    
6178    2003-04-25  Jonathan Coles   <[email protected]>
6179    
6180            * Thuban/Model/layer.py (Layer.TreeInfo): Add an item to the
6181            tree for projection information.
6182    
6183            * Thuban/Model/load.py (XMLReader.GetFilename): Renamed from
6184            XMLReader.GetFileName.
6185            (SessionLoader): Added support for loading projection tags that
6186            appear inside a layer.
6187    
6188            * Thuban/Model/proj.py (ProjFile): Document the class. Move
6189            back to using a list because the order of the projections in
6190            the file is important to maintain. Fixes RTbug #1817.
6191    
6192            * Thuban/Model/resource.py: Rename calls to ProjFile.GetFileName
6193            to ProjFile.GetFilename.
6194    
6195            * Thuban/Model/save.py (SessionSaver.write_layer): Save projection
6196            information.
6197    
6198            * Thuban/UI/projdialog.py (ProjFrame._OnAddToList): Renamed from
6199            ProjFrame._OnSaveAs. Removed old dead code from previous
6200            implementation.
6201            (ProjFrame._OnExport): Add support for exporting more than one
6202            projection to a single file.
6203            (ProjFrame.__FillAvailList): use string formatting (% operator)
6204            to build strings that are (partly) translated. Fixes RTbug #1818.
6205    
6206            * test/test_proj.py (TestProjFile.test): New. Tests the base ProjFile
6207            class.
6208    
6209    2003-04-24  Bernhard Herzog  <[email protected]>
6210    
6211            * po/es.po: Updated Spanish translation by Daniel Calvelo Aros
6212    
6213            * po/fr.po: New. French translation by Daniel Calvelo Aros
6214    
6215            * Thuban/UI/projdialog.py (ProjFrame._OnSaveAs): Don't translate
6216            empty strings.
6217    
6218    2003-04-24  Jonathan Coles   <[email protected]>
6219    
6220            * Thuban/Model/layer.py (Layer.GetProjection): New. Needed to
6221            implement the interface that the ProjFrame dialog expects.
6222    
6223            * Thuban/Model/proj.py (Projection.SetName): New. Allows the
6224            name of the projection to be changed.
6225            (ProjFile): Use a dictionary instead of a list so that removing
6226            projections is easier and we are sure about uniqueness.
6227            (ProjFile.Remove): Remove the given projection object.
6228    
6229            * Thuban/Model/resource.py (GetSystemProjFiles, GetUserProjFiles):
6230            Return a list with only one projection file instead of searching for
6231            any projection file. This simplifies many things if the user can
6232            only have one system file and one user file.
6233    
6234            * Thuban/UI/classgen.py: Change all references to
6235            genCombo to genChoice.
6236    
6237            * Thuban/UI/mainwindow.py: Add a Projection option under the
6238            layer menu.
6239            (MainWindow.LayerProjection): New. Open up a projection window
6240            for a layer.
6241    
6242            * Thuban/UI/projdialog.py: Large changes to how the dialog is
6243            laid out. Use three panels instead of one. One for the list of
6244            projections, one for the edit controls, and one for the buttons.
6245            Fixed resizing problems so that the dialog resizes correctly
6246            when the projection panel changes. Added import/export, save, and
6247            new buttons/functionality.
6248    
6249    2003-04-24  Bernhard Herzog  <[email protected]>
6250    
6251            First step towards table management. Introduce a simple data
6252            abstraction so that we replace the data a layer uses more easily
6253            in the next step.
6254    
6255            * Thuban/Model/data.py: New file with a simple data abstraction
6256            that bundles shapefile and dbffile into one object.
6257    
6258            * Thuban/Model/session.py (Session.OpenShapefile): New method to
6259            open shapefiles and return a shape store object
6260    
6261            * Thuban/Model/layer.py (Layer.__init__): Pass the data as a store
6262            object instead of a shapefile filename. This introduces a new
6263            instance variable store holding the datastore. For intermediate
6264            backwards compatibility keep the old instance variables.
6265            (open_shapefile): Removed. No longer needed with the shape store.
6266            (Layer.SetShapeStore, Layer.ShapeStore): New methods to set and
6267            get the shape store used by a layer.
6268            (Layer.Destroy): No need to explicitly destroy the shapefile or
6269            table anymore.
6270    
6271            * Thuban/UI/mainwindow.py (MainWindow.AddLayer)
6272            (MainWindow.AddLayer): Use the session's OpenShapefile method to
6273            open shapefiles
6274    
6275            * Thuban/Model/load.py (ProcessSession.start_layer): Use the
6276            session's OpenShapefile method to open shapefiles
6277    
6278            * test/test_classification.py
6279            (TestClassification.test_classification): Use the session's
6280            OpenShapefile method to open shapefiles and build the filename in
6281            a more platform independed way
6282    
6283            * test/test_layer.py (TestLayer.setUp, TestLayer.tearDown):
6284            Implement to have a session to use in the tests
6285            (TestLayer.test_arc_layer, TestLayer.test_polygon_layer)
6286            (TestLayer.test_point_layer, TestLayer.test_empty_layer): Use the
6287            session's OpenShapefile method to open shapefiles
6288            (TestLayerLegend.setUp): Instantiate a session so that we can use
6289            it to open shapefiles.
6290            (TestLayerLegend.tearDown): Make sure that all references to
6291            layers and session are removed otherwise we may get a resource
6292            leak
6293    
6294            * test/test_map.py (TestMapAddLayer.test_add_layer)
6295            (TestMapWithContents.setUp): Instantiate a session so that we can
6296            use it to open shapefiles.
6297            (TestMapWithContents.tearDown): Make sure that all references to
6298            layers, maps and sessions are removed otherwise we may get a
6299            resource leak
6300            ("__main__"): use support.run_tests() so that more info about
6301            uncollected garbage is printed
6302    
6303            * test/test_save.py (SaveSessionTest.testSingleLayer): Use the
6304            session's OpenShapefile method to open shapefiles
6305            ("__main__"): use support.run_tests() so that more info about
6306            uncollected garbage is printed
6307    
6308            * test/test_selection.py (TestSelection.tearDown): Make sure that
6309            all references to the session and the selection are removed
6310            otherwise we may get a resource leak
6311            (TestSelection.get_layer): Instantiate a session so that we can
6312            use it to open shapefiles.
6313            ("__main__"): use support.run_tests() so that more info about
6314            uncollected garbage is printed
6315    
6316            * test/test_session.py (TestSessionBase.tearDown)
6317            (TestSessionWithContent.tearDown): Make sure that all references
6318            to the session and layers are removed otherwise we may get a
6319            resource leak
6320            (TestSessionWithContent.setUp): Use the session's OpenShapefile
6321            method to open shapefiles
6322    
6323    2003-04-24  Jonathan Coles   <[email protected]>
6324    
6325            * Thuban/Model/load.py (XMLReader.read): Should have been checking
6326            if the file_or_filename object had the 'read' attribute.
6327    
6328    2003-04-23  Jonathan Coles   <[email protected]>
6329    
6330            * Thuban/Model/resource.py: Fixes RTbug #1813.
6331            (ReadProjFile): Add documentation about which exceptions are raised.
6332            Always pass the exceptions up to the caller.
6333            (GetProjFiles): If the directory can't be read return an empty list.
6334            If any of the proj files can't be read skip that file and go
6335            on to the next one.
6336    
6337            * test/test_proj.py: Added test cases to handle nonexistent files,
6338            unreadable files, and files that don't parse correctly.
6339    
6340    2003-04-23  Jonathan Coles   <[email protected]>
6341    
6342            Projection dialog. Allows the user to select from a list
6343            of projection templates and optionally edit them and save new ones.
6344    
6345            * Thuban/UI/projdialog.py (ProjFrame): New. Main dialog.
6346            (ProjPanel): Base class for projection specific panels.
6347            (TMPanel): Projection panel for Transverse Mercartor.
6348            (UTMPanel): Projection panel for Universal Transverse Mercartor.
6349            (LCCPanel): Projection panel for Lambert Conic Conformal.
6350            (GeoPanel): Projetion panel for Geographic Projection.
6351    
6352    2003-04-23  Jonathan Coles   <[email protected]>
6353    
6354            * Thuban/Model/load.py (XMLReader): Renamed from XMLProcessor to
6355            promote symmetry. There now exists XMLReader and XMLWriter.
6356            (XMLReader.read): New. Call to read the given file descriptor or
6357            filename.
6358            (XMLReader.close): New. Make sure the file is closed.
6359            (XMLReader.GetFileName): New. Return just the file name that is being
6360            read from.
6361            (XMLReader.GetDirectory): New. Return just the directory of the file
6362            that is being read.
6363            (XMLReader.AddDispatchers): New. Take a dictionary which contains
6364            the names of functions to call as the XML tree is parsed.
6365            (XMLReader.startElementNS): Updated to use new dispatcher dictionary.
6366            (XMLReader.endElementNS): Updated to use new dispatcher dictionary.
6367            (SessionLoader): Removed class variables start_dispatcher and
6368            end_dispatcher since this functionality is now part of a class
6369            instance. Fixes RTbug #1808.
6370            (SessionLoader.__init__): Add dispatcher functions.
6371            (load_xmlfile): Code was moved into the XMLReader.read().
6372            (load_session): Use modified SessionLoader.
6373    
6374            * Thuban/Model/map.py (Map.GetProjection): New. Returns the
6375            map's projection.
6376    
6377            * Thuban/Model/proj.py (Projection.GetParameters): Renamed to
6378            GetAllParameters.
6379            (Projection.GetParameter): Returns the value for the given parameter.
6380    
6381            * Thuban/Model/resource.py: Use XMLReader and XMLWriter.
6382            (GetProjFiles): Renamed from GetProjections. Now returns a list
6383            of ProjFile objects.
6384            (GetSystemProjFiles): Renamed from GetSuppliedProjections. Returns
6385            a list of ProjFile objects whose files are not user defined.
6386            (GetUserProjFiles): Renamed from GetUserProjections. Returns a
6387            list of ProjFile objects whose files are user defined.
6388            (ProjFileReader): Extend new XMLReader.
6389    
6390            * Thuban/Model/save.py (XMLWriter): Renamed from XMLSaver to
6391            promote symmetry.
6392    
6393            * Thuban/UI/classgen.py (ClassGenDialog.__init__): Use a wxChoice
6394            control instead of a wxComboBox. wxChoice controls do not generate
6395            events as the uses highlights possible choices which fixes problems
6396            with resizing the dialog when the use selects an option.
6397    
6398            * Thuban/UI/classifier.py (Classifier.__init__): Use a wxChoice
6399            control instead of a wxComboBox.
6400    
6401            * Thuban/UI/mainwindow.py (MainWindow.Projection): Use new projection
6402            dialog.
6403    
6404            * test/test_proj.py (TestProjection.test): New tests for GetParameter
6405            method.
6406    
6407    2003-04-22  Bernhard Herzog  <[email protected]>
6408    
6409            * Thuban/UI/mainwindow.py: Remove some unused imports and global
6410            constants
6411    
6412            * Thuban/UI/identifyview.py (IdentifyListCtrl.selected_shape)
6413            (IdentifyGridCtrl.selected_shape): Use table, not shapetable.
6414    
6415    2003-04-17  Bernhard Herzog  <[email protected]>
6416    
6417            * Thuban/Model/layer.py: Don't import LAYER_LEGEND_CHANGED.
6418            (Layer): Update doc-string since LAYER_LEGEND_CHANGED is not used
6419            anymore.
6420            (Layer.BoundingBox, Layer.GetFieldType, Layer.NumShapes)
6421            (Layer.ShapeType, Layer.Shape): No need to call
6422            self.open_shapefile since it's always called in __init__
6423    
6424            * Thuban/UI/application.py (ThubanApplication.MainLoop): Removed.
6425            In wxPython 2.4 there's no need to extend MainLoop anymore since
6426            wxPython itself makes sure OnExit is called.
6427    
6428    2003-04-16  Jonathan Coles   <[email protected]>
6429    
6430            Initial putback of projection management code. Includes new
6431            classes to read and write projection files. The current load
6432            and save classes were abstracted a bit so they could be reused.
6433            The Projection class was extended to provide new methods and
6434            have a name.
6435    
6436            * Thuban/Model/load.py (XMLProcessor): New. Contains all the
6437            general XML reading methods that were part of ProcessSession.
6438    
6439            * Thuban/Model/proj.py (Projection.__init__): Accepts an optional
6440            name.
6441            (ProjFile): New. Represents a file that contains projection
6442            information.
6443    
6444            * Thuban/Model/resource.py: New. Contains general utilities
6445            for read and writing projection files.
6446    
6447            * Thuban/Model/save.py (XMLSaver): New. Contains all the
6448            general XML writing methods that were part of SessionSaver.
6449            (SessionSaver): Renamed from Saver.
6450    
6451            * test/test_proj.py: New test cases for the projection
6452            file read and write functions.
6453    
6454    2003-04-16  Jonathan Coles   <[email protected]>
6455    
6456            * Thuban/Model/classification.py: Use repr() around values
6457            in the ClassGroup*.__repr__() methods so it is clearer when
6458            a value is a string and when it is a number.
6459    
6460            * test/test_load.py: Rework the classification test to test
6461            that we can load old files.
6462            (testLabels): Test a file where the groups have labels.
6463    
6464    2003-04-16  Bernhard Herzog  <[email protected]>
6465    
6466            Safer implementation of the performance enhancements of the
6467            low-level renderer:
6468            
6469            * extensions/thuban/wxproj.cpp (extract_projection)
6470            (extract_pointer): Rename extract_projection to extract_pointer
6471            and redefine its purpose to return the pointer stored in a CObject
6472            returned by the object's cobject method. Update all callers.
6473            (s_draw_info, free_draw_info, draw_polygon_init): Implement the
6474            handling of these low-level parameters so that each s_draw_info
6475            instance is handled as a CObject at python level that also
6476            contains real references to the actual python objects which
6477            contain the values in the struct. Add free_draw_info as the
6478            destructor.
6479            (draw_polygon_shape): Add the py_draw_info parameter which must a
6480            cobject containing an s_draw_info pointer.
6481    
6482            * Thuban/UI/renderer.py (MapRenderer.polygon_render_param): New
6483            method to instantiat the low-level render parameter
6484            (MapRenderer.draw_shape_layer): Use the new method. Remove some
6485            commented out code.
6486            (MapRenderer.draw_polygon_shape): Make the first parameter not the
6487            layer but the low-level render parameter
6488            (ScreenRenderer.draw_shape_layer): Use the low-level render
6489            parameter.
6490    
6491    2003-04-15  Jonathan Coles   <[email protected]>
6492    
6493            * Thuban/Model/classification.py: Implemented __repr__ for
6494            the ClassGroup* classes to make debugging a bit easier.
6495            (ClassGroup.SetLabel): Check that the string is an instance
6496            of StringTypes not StringType. Accounts for Unicode strings.
6497    
6498            * Thuban/Model/color.py: Implemented __repr__ to make
6499            debugging a bit easier.
6500    
6501            * Thuban/Model/save.py (Saver.write_classification): Need to
6502            save the group label.
6503    
6504            * test/test_load.py (testClassification): New. Loads the
6505            iceland_sample_test.thuban file and checks if it was loaded
6506            correctly.
6507    
6508    2003-04-15  Jonathan Coles   <[email protected]>
6509    
6510            * extensions/thuban/wxproj.cpp (draw_polygon_init): New. Used
6511            to improve rendering performance by initializing the variables
6512            that are not change each time draw_polygon_shape() is called.
6513            The values are stored in a global struct draw_info.
6514            (draw_polygon_shape): Removed initialization code that is
6515            now in draw_polygon_init().
6516    
6517            * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Make
6518            drawing initialization call to draw_polygon_init()
6519            (MapRenderer.draw_polygon_shape): Use new signature of
6520            draw_polygon_shape.
6521    
6522            * Thuban/UI/classgen.py (GenUniformPanel): Fix spin control
6523            weirdness by setting the range to (1, maxint).
6524    
6525            * Thuban/Model/classification.py (ClassGroupProperties): Make
6526            instance variables private and optimize comparison operator
6527            by first checking if the color references are the same.
6528            (ClassGroupSingleton): Make instance variables private.
6529            (ClassGroupRange): Make instance variables private.
6530    
6531            * HOWTO-Release: Filled in missing steps for releasing packages.
6532    
6533    2003-04-15  Bernhard Herzog  <[email protected]>
6534    
6535            First stab at internationalized messages:
6536    
6537            * Thuban/__init__.py (_): Implement the translation function for
6538            real using the python gettext module.
6539    
6540            * Thuban/UI/classifier.py (ClassTable.GetRowLabelValue): Don't
6541            translate empty strings.
6542    
6543            * Thuban/UI/application.py (ThubanApplication.read_startup_files):
6544            Add a missing space to a warning message
6545    
6546            * po/README: New. Notes about the management of the translation
6547            files.
6548    
6549            * po/Makefile: New. Makefile to help manage the translation files.
6550    
6551            * po/es.po: New. Spanish translation by Daniel Calvelo Aros
6552    
6553            * MANIFEST.in: Include the *.mo files in Resources/Locale and the
6554            translations and support files in po/
6555    
6556            * setup.py (data_files): Add the *.mo files to the data_files too
6557    
6558            * README: Add note about the translations when building from CVS
6559    
6560    2003-04-14  Jonathan Coles   <[email protected]>
6561    
6562            * Thuban/UI/dock.py: Fixes some window resizing problems most
6563            noticable under windows. Always assume the button bitmaps will
6564            be there. Code clean up.
6565            (DockabelWindow.Dock, DockableWindow.UnDock): Force all the
6566            images for the dock/undock button to the same images.
6567            Work around for RTbug #1801.
6568    
6569            * Thuban/UI/legend.py (LegendPanel.__init__): The toolbar should
6570            be allowed to grow within the sizer. Fixes a bug under Windows
6571            where the toolbar wasn't being drawn.
6572    
6573    2003-04-14  Frank Koormann   <[email protected]>
6574    
6575            * Resources/Bitmaps/dock_12.xpm, Resources/Bitmaps/undock_12.xpm:
6576            Updated design to try to make the button functionality more
6577            transparent.
6578    
6579    2003-04-14  Jonathan Coles   <[email protected]>
6580    
6581            * Thuban/UI/legend.py (LegendPanel.__init__): Call Create() to
6582            finalize the intialization of the panel.
6583    
6584            * Thuban/UI/dock.py (DockPanel.Create): New. Finalizes the
6585            creation of the panel. Should be the last thing called in the
6586            initializer of a subclass.
6587    
6588            * Thuban/UI/classgen.py (ClassGenDialog.__init__): Actively
6589            set the current selections in the combo boxes. This is needed
6590            under Windows.
6591    
6592            * Thuban/UI/classifier.py (Classifier.__init__): Add a top
6593            level panel to the dialog so that the background colors are
6594            consistent under Windows.
6595    
6596    2003-04-11  Jonathan Coles   <[email protected]>
6597    
6598            * Thuban/UI/classgen.py: Change color ramps to start at white
6599            not black.
6600    
6601            * Thuban/UI/legend.py: Enable/disable the legend buttons when
6602            the legend changes. Fixes RTbug #1793.
6603    
6604            * test/test_classification.py: Added test for copying of
6605            classifications.
6606    
6607    2003-04-11  Jonathan Coles   <[email protected]>
6608    
6609            * Thuban/UI/resource.py: New. Centralize the loading of resources
6610            such as bitmaps.
6611    
6612            * Thuban/UI/classgen.py (GenUniquePanel.__init__): Reordered buttons,
6613            added images to the move buttons, added 'reverse' button.
6614            (CustomRampPanel.__init__): Added images to the move buttons.
6615            (GreyRamp): New. Generates a ramp from white to black.
6616            (HotToColdRamp): New. Generates a ramp from cold to hot colors.
6617    
6618            * Thuban/UI/classifier.py: Refactored ID's from ID_CLASSIFY_* to
6619            ID_PROPERTY_*.
6620            (Classifier.__init__): Minor changes to the layout.
6621            (Classifier._OnTitleChanged): Listen for when the user edits the
6622            title and update the dialog's title and the layer's title.
6623    
6624            * Thuban/UI/dock.py: Use new bitmaps for the control buttons.
6625    
6626            * Thuban/UI/legend.py: Use new bitmaps for the control buttons.
6627            (LegendTree._OnMsgLayerTitleChanged): Change the displayed title
6628            if the layer's title changes.
6629    
6630            * Thuban/UI/mainwindow.py: Added new menu item and associated code
6631            to open a dialog to rename the map.
6632            (MainWindow): Use new resource class to import bitmaps.
6633    
6634    2003-04-11  Jonathan Coles   <[email protected]>
6635    
6636            * Resources/Bitmaps/close_12.xpm, Resources/Bitmaps/dock_12.xpm,
6637            Resources/Bitmaps/group_use.xpm, Resources/Bitmaps/group_use_all.xpm,
6638            Resources/Bitmaps/group_use_none.xpm,
6639            Resources/Bitmaps/group_use_not.xpm,
6640            Resources/Bitmaps/hide_layer.xpm,
6641            Resources/Bitmaps/layer_properties.xpm,
6642            Resources/Bitmaps/lower_layer.xpm, Resources/Bitmaps/raise_layer.xpm,
6643            Resources/Bitmaps/show_layer.xpm, Resources/Bitmaps/undock_12.xpm:
6644            New.
6645    
6646    2003-04-10  Jonathan Coles   <[email protected]>
6647    
6648            * Thuban/Model/classification.py: (ClassGroupRange.__init__):
6649            Should pass group to ClassGroup constructor.
6650    
6651    2003-04-10  Jonathan Coles   <[email protected]>
6652    
6653            * Thuban/Model/classification.py: (ClassGroup): Move all the common
6654            methods of the derived classes ([Set|Get]Properties(), __eq__, __ne__)
6655            here. Implement SetVisible(), IsVisible().
6656            (ClassGroup.__init__): Add group parameter which acts as a copy
6657            constructor.
6658    
6659            * Thuban/UI/classifier.py (ClassTable): Add a new column for the
6660            "Visible" check boxes.
6661            (Classifier): Rename the buttons and refactor the code to match
6662            the new labels.
6663    
6664            * Thuban/UI/legend.py: Classify button is now called "Properties".
6665            Refactored the code to change variable names.
6666            (LegendTree.__FillTreeLayer): Only list a group if it is visible.
6667    
6668            * Thuban/UI/mainwindow.py: MainWindow.OpenClassifier renamed to
6669            MainWindow.OpenLayerProperties. MainWindow.LayerEditProperties
6670            renamed to MainWindow.LayerEditProperties.
6671            (MainWindow.ToggleLegend): Don't include map name in legend title.
6672            (MainWindow.SetMap): Added the map name to the window title.
6673            (MainWindow.LayerFillColor, MainWindow.LayerTransparentFill,
6674            MainWindow.LayerOutlineColor, MainWindow.LayerNoOutline): Removed.
6675            Functionality is found in the layer properties dialog.
6676    
6677            * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Only
6678            draw visible groups.
6679    
6680    2003-04-09  Jonathan Coles   <[email protected]>
6681    
6682            * Thuban/UI/classgen.py: Modifications to allow simple
6683            addition and selection of new color schemes.
6684            (MonochromaticRamp): New. Generates a ramp between two colors.
6685            (RedRamp): New. Generates a ramp of all red.
6686            (GreenRamp): New. Generates a ramp of all green.
6687            (BlueRamp): New. Generates a ramp of all blue.
6688    
6689    2003-04-09  Jonathan Coles   <[email protected]>
6690    
6691            * Thuban/Model/classification.py (Classification.__deepcopy__):
6692            Need to copy over field and fieldType attributes.
6693    
6694            * Thuban/Model/table.py (Table.field_range): New. Retrive the
6695            maximum and minimum values over the entire table for a given
6696            field.
6697            (Table.GetUniqueValues): New. Retrieve all the unique values
6698            in the table for a given field.
6699    
6700            * Thuban/UI/classgen.py: Renamed GenRangePanel to GenUniformPanel.
6701            (GenUniquePanel): New. Controls to allow the user to select
6702            which unique field values they would like in the classification.
6703            (CustomRampPanel): Code that was in ClassGenDialog that allows
6704            the user to select the properties for a custom ramp.
6705            (ClassGenerator.GenUniformDistribution): Was called GenerateRanges.
6706    
6707            * Thuban/UI/classifier.py: Removed a lot of debugging code.
6708            (Classifier._SetClassification): Callback method so that the
6709            class generator can set the classification in the grid.
6710            (ClassGroupPropertiesCtrl): New. Encapsulates the drawing and
6711            editing of a group properties class into a wxWindows control.
6712    
6713            * Thuban/UI/dock.py: It was decided that if the user closes
6714            a dockable window the window should simply hide itself. That
6715            way if the user wants to show the dock again it appears in the
6716            same place as it was when it was closed.
6717            (DockableWindow.Destroy): Call renamed method OnDockDestroy().
6718            (DockableWindow._OnButtonClose): Hide the window instead of
6719            destroying it.
6720            (DockableWindow._OnClose): Hide the window instead of
6721            destroying it.
6722    
6723            * Thuban/UI/legend.py (LegendTree): Use a private method to
6724            consistently set the font and style of the text. Fixes RTbug #1786.
6725    
6726            * Thuban/UI/mainwindow.py: Import just the Classifier class.
6727    
6728    2003-04-07  Bernhard Herzog  <[email protected]>
6729    
6730            * Thuban/UI/mainwindow.py (main_menu): Move the toggle_legend item
6731            to the map module
6732    
6733    2003-04-07  Bernhard Herzog  <[email protected]>
6734    
6735            * Thuban/UI/mainwindow.py (MainWindow.ShowSessionTree): Removed in
6736            favor of ToggleSessionTree
6737            (MainWindow.ToggleSessionTree): New method to toggle visibility of
6738            the session tree.
6739            (MainWindow.SessionTreeShown): New method to return whether the
6740            session tree is currently shown.
6741            (MainWindow.ToggleLegend): New method to toggle visibility of the
6742            legend
6743            (MainWindow.ShowLegend): Implement in terms of ToggleLegend and
6744            LegendShown
6745            (MainWindow.LegendShown): New method to return whether the legend
6746            is currently shown.
6747            (_method_command): Add checked parameter so we can define check
6748            menu items
6749            (_has_tree_window_shown, _has_legend_shown): Use the appropriate
6750            mainwindow methods.
6751            (show_session_tree, show_legend commands): Removed.
6752            (toggle_session_tree, toggle_legend commands): New commands to
6753            toggle the visibility of the dialogs
6754    
6755    2003-04-07  Jonathan Coles   <[email protected]>
6756    
6757            * Thuban/UI/classgen.py: Fix Windows problem.
6758    
6759            * Thuban/UI/dock.py: Fix Windows problem.
6760    
6761            * Thuban/UI/mainwindow.py: Use False instead of false.
6762            (MainWindow.ShowLegend): Remove unnecessary switch parameter.
6763    
6764    2003-04-07  Jonathan Coles   <[email protected]>
6765    
6766            Since we now say that the order of the groups in a classification
6767            matters, it makes sense to be able to manipulate that order. Most
6768            of the changes to Thuban/Model/classification.py are to that end.
6769    
6770            * Thuban/Model/classification.py (Classification.AppendGroup,
6771            Classification.InsertGroup, Classification.ReplaceGroup,
6772            Classification.RemoveGroup, Classification.GetGroup): Do as the
6773            names imply.
6774            (Classification.FindGroup): This was called GetGroup, but GetGroup
6775            takes an index, while FindGroup takes a value.
6776            (Classification.__deepcopy__): Copy all the groups, BUT NOT THE LAYER
6777            REFERENCE. Currently there is a cyclic reference between the layer
6778            and its classification. If the classification doesn't need to know
6779            its owning layer we can change this, since it may make sense to be
6780            able to use the same classification with different layers.
6781    
6782            * Thuban/Model/load.py: Use Classification.AppendGroup(), not AddGroup()
6783    
6784            * Thuban/UI/classgen.py: Use Classification.AppendGroup(),
6785            not AddGroup()
6786    
6787            * Thuban/UI/classifier.py: Now that we can depend on the order in
6788            a Classification and have methods to manipulate that order we don't
6789            need to use our own data structures in the grid. We can simply make
6790            the grid/table access the information they need from a copy of
6791            the classification object.
6792            (Classifier._OnCloseBtn): Event handler for when the user clicks
6793            'Close'. This is needed so if the user applies changes and then
6794            continues to change the table the user has the option of discarding
6795            the most recent changes and keeping what they applied.
6796    
6797            * Thuban/UI/mainwindow.py: Put "Show Legend" and "Show Session Tree"
6798            into the same group.
6799    
6800            * extensions/thuban/wxproj.cpp (check_version): If Thuban is compiled
6801            with a really old version of proj, PJ_VERSION won't even be defined.
6802            If it isn't defined then just compile so that the function always
6803            returns Py_False.
6804    
6805            * test/test_classification.py: Fix tests to use the renamed methods.
6806            Still need to write tests for the new methods.
6807    
6808    2003-04-04  Jonathan Coles   <[email protected]>
6809    
6810            * Thuban/UI/classifier.py (Classifier.__SelectField): Move the
6811            call to SetSelection out of the method and before the call
6812            to __SelectField in __init__. This prevents a recursion of events
6813            when _OnFieldSelect is triggered by the user.
6814    
6815    2003-04-04  Jonathan Coles   <[email protected]>
6816    
6817            * Thuban/Model/classification.py: Rename Color.None to
6818            Color.Transparent.
6819            (ClassGroupProperties.SetLineColori, ClassGroupProperties.SetFill):
6820            Don't bother copying the color, since Colors are immutable.
6821    
6822            * Thuban/Model/color.py, Thuban/Model/layer.py, Thuban/Model/load.py,
6823            Thuban/UI/classifier.py, Thuban/UI/mainwindow.py,
6824            Thuban/UI/renderer.py, Thuban/UI/view.py:
6825            Rename Color.None to Color.Transparent.
6826        
6827            * test/test_classification.py, test/test_load.py: Rename Color.None
6828            to Color.Transparent.
6829    
6830    2003-04-04  Jonathan Coles   <[email protected]>
6831    
6832            * Thuban/Model/classification.py: Fix assert calls.
6833            (ClassGroupProperties.SetLineColor, ClassGroupProperties.SetFill):
6834            Copy the color parameter rather than hold onto a reference.
6835    
6836            * Thuban/Model/color.py (Color.__copy__, Color.__deepcopy): Copy
6837            the color object.
6838            (NoColor.__copy__, NoColor.__deepcopy): Return 'self' so that we
6839            are sure there exists only one refernce to Color.None in the system.
6840            This allows us to use 'is' rather than the comparision functions.
6841            
6842            * Thuban/Model/save.py: Fix assert calls.
6843            
6844            * Thuban/UI/classifier.py: Fix assert calls.
6845            (ClassGrid._OnCellDClick): Call up to the classifier to open the
6846            dialog to edit the groups properties.
6847            (ClassGrid._OnCellResize): Make sure that the scollbars are drawn
6848            correctly if a cell is resized.
6849            (ClassTable.SetClassification): New. Changes the classification
6850            that is in the table.
6851            (ClassTable.__SetRow): Allow groups to be prepended.
6852            (Classifier): New code for opening the EditProperties and
6853            GenerateRanges dialogs.
6854            (SelectPropertiesDialog.__GetColor): Only set the color in the
6855            color dialog if the current color is not None.
6856            
6857            * Thuban/UI/dock.py: Fix assert calls.
6858            
6859            * Thuban/UI/legend.py: Fix assert calls.
6860            
6861            * Thuban/UI/renderer.py: Fix assert calls.
6862            
6863            * Thuban/UI/classgen.py (ClassGenDialog): Dialog for generating
6864            classifications.
6865            (GenRangePanel): Panel specific to range generation.
6866            (GenSingletonPanel): Panel specific to singleton generation.
6867            (ClassGenerator): Class responsible for actually generating
6868            the classification from the data gathered in the dialog box.
6869            (PropertyRamp): Generates properties whose values range from
6870            a starting property to an ending property.
6871    
6872    2003-04-03  Bernhard Herzog  <[email protected]>
6873    
6874            * test/support.py (print_garbage_information): New function that
6875            prints information about still connected messages and memory
6876            leaks.
6877            (run_suite): Removed.
6878            (run_tests): New function for use as a replacement of
6879            unittest.main in the test_* files. This one calls
6880            print_garbage_information at the end.
6881    
6882            * test/runtests.py (main): Use support.print_garbage_information
6883    
6884            * test/test_layer.py: Use support.run_tests instead of
6885            unittest.main so we get memory leak information
6886            (TestLayer.test_arc_layer, TestLayer.test_polygon_layer)
6887            (TestLayer.test_point_layer, TestLayer.test_empty_layer)
6888            (TestLayerLegend.test_visibility): Call the layer's Destroy method
6889            to fix a memory leak.
6890    
6891            * test/test_classification.py: Use support.run_tests instead of
6892            unittest.main so we get memory leak information
6893            (TestClassification.test_classification): Call the layer's Destroy
6894            method to fix a memory leak.
6895    
6896  2003-04-02  Bernhard Herzog  <[email protected]>  2003-04-02  Bernhard Herzog  <[email protected]>
6897    
6898          * extensions/thuban/wxproj.cpp (check_version, check_version_gtk):          * extensions/thuban/wxproj.cpp (check_version, check_version_gtk):

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

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26