/[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 55 by bh, Tue Sep 11 11:45:27 2001 UTC revision 2045 by bh, Tue Dec 23 13:57:21 2003 UTC
# Line 1  Line 1 
1    2003-12-23  Bernhard Herzog  <[email protected]>
2    
3            * NEWS: Update for 1.0.0
4    
5            * po/it.po: Another update from Maurizio Napolitano
6    
7    2003-12-23  Bernhard Herzog  <[email protected]>
8    
9            * po/it.po: Updated translation from Maurizio Napolitano
10    
11    2003-12-23  Bernhard Herzog  <[email protected]>
12    
13            * Thuban/UI/join.py (JoinDialog.__init__): Mark one more string
14            for translation
15    
16            * Thuban/UI/mainwindow.py (MainWindow.TableRename)
17            (MainWindow.RenameMap, MainWindow.RenameLayer): Mark some more
18            strings for translation
19    
20            * po/de.po: Update with the newly marked strings.
21    
22    2003-12-22  Bernhard Herzog  <[email protected]>
23    
24            * HOWTO-Release: Fix the places where version numbers have to be
25            updated
26    
27    2003-12-22  Bernhard Herzog  <[email protected]>
28    
29            * setup.py (setup call): 1.0.0, yeah!
30    
31            * Thuban/version.py (longversion): 1.0.0, yeah!
32    
33            * Thuban/Model/load.py (SessionLoader.__init__): Accept the
34            1.0.0 namespace too
35    
36            * Thuban/Model/save.py (SessionSaver.write_session): Save with
37            1.0.0 namespace
38    
39            * test/test_load.py (LoadSessionTest.dtd)
40            (TestSingleLayer.file_contents)
41            (TestNonAsciiColumnName.file_contents)
42            (TestLayerVisibility.file_contents)
43            (TestClassification.file_contents, TestLabels.file_contents)
44            (TestLayerProjection.file_contents)
45            (TestRasterLayer.file_contents, TestJoinedTable.file_contents)
46            (TestLabelLayer.file_contents, TestPostGISLayer.file_contents)
47            (TestPostGISLayerPassword.file_contents)
48            (TestLoadError.file_contents, TestLoadError.test): Update for
49            1.0.0 namespace
50    
51            * test/test_save.py (SaveSessionTest.dtd)
52            (SaveSessionTest.testEmptySession)
53            (SaveSessionTest.testSingleLayer)
54            (SaveSessionTest.testLayerProjection)
55            (SaveSessionTest.testRasterLayer)
56            (SaveSessionTest.testClassifiedLayer)
57            (SaveSessionTest.test_dbf_table)
58            (SaveSessionTest.test_joined_table)
59            (SaveSessionTest.test_save_postgis): Update for 1.0.0 namespace
60    
61    2003-12-22  Bernhard Herzog  <[email protected]>
62    
63            * Thuban/Model/load.py (SessionLoader.start_label): Make sure the
64            alignment flags are byte strings not unicode and that they have
65            valid values
66    
67            * test/test_load.py (TestLabelLayer): New. Test loading (and
68            indirectly saving) of maps with labels.
69    
70    2003-12-22  Bernhard Herzog  <[email protected]>
71    
72            * Thuban/UI/tableview.py (TableGrid.OnDestroy)
73            (TableGrid.__init__): Handle EVT_WINDOW_DESTROY in the grid to
74            unsubscribe all subscribers.
75            (LayerTableFrame.OnDestroy): Do not unsubscribe any messages from
76            self.grid since it may already have been destroyed.
77            Fixes RT #2256
78    
79    2003-12-19  Bernhard Herzog  <[email protected]>
80    
81            * po/fr.po, po/es.po: Updated translations from Daniel Calvelo
82    
83    2003-12-16  Bernhard Herzog  <[email protected]>
84            
85            * debian/bitmappath.patch, debian/setup.py.patch:
86                    added to ensure compliance with FHS for debian
87            * debian/rules, debian/changelog:
88                added patches in rules to ensure compliance with FHS for debian
89    
90    2003-12-16  Bernhard Herzog  <[email protected]>
91    
92            * po/Makefile (mo): Make the output a bit nicer so that it prints
93            statistics about the translations. Add a comment how produce even
94            nicer statistics with sed.
95    
96    2003-12-09  Frank Koormann   <[email protected]>
97    
98            * Resources/Projections/defaults.proj:
99            French projection sample with correct accents (UNICODE).
100    
101    2003-12-05  Bernhard Herzog  <[email protected]>
102    
103            * MANIFEST.in: Add the devtools directory
104    
105            * setup.py (setup call): Use license instead of licence. This
106            silences a deprecation warning on Python 2.3
107    
108    2003-12-05  Frank Koormann   <[email protected]>
109    
110            Documentation synced with 1.0rc1
111    
112            * Doc/manual/thuban-manual.xml:
113            Minor formatting changes and references to database layers .
114            Introduction.Internationalization: New section on i18n.
115            MapManagement.AddingandRemovingLayers: Added item on database layers.  
116            MapManagement.TheLegend: Added section and screenshot on popup menu.
117            ProjectionManagement: Updated screenshot and sentence on EPSG.
118            Appendix.SupportedDataSources: Added PostGIS.
119            Appendix.WorkingwithPostGIS: New section.
120    
121            * Doc/manual/images/6_projection.png: Updated screenshot including
122            EPSG checkboxes.
123    
124            * Doc/manual/images/3_5_popup_menu.png: New, popup menu screenshot.
125    
126            * Doc/manual/images/app_postgis_add_layer.png,
127            Doc/manual/images/app_postgis_db_add.png,
128            Doc/manual/images/app_postgis_db_management.png:
129            New screenshots focussing on database layers
130    
131    2003-12-05  Frank Koormann   <[email protected]>
132    
133            * Thuban/UI/projdialog.py (load_user_proj): If user.proj is missing
134            write warning to stderr instead of rising a warning dialog
135    
136    2003-12-03  Bernhard Herzog  <[email protected]>
137    
138            Fix for RT #2243
139    
140            * Thuban/UI/mainwindow.py (MainWindow.has_selected_shape_layer):
141            New. Like has_selected_layer but for shape layers only
142            (_has_selected_shape_layer): New. Like _has_selected_layer but for
143            shape layers only
144            (layer_show_table command, layer_jointable command): Use these
145            commands should only be available for shape layers
146    
147    2003-12-03  Bernhard Herzog  <[email protected]>
148    
149            * Thuban/UI/mainwindow.py (MainWindow.Unsubscribe): Deal with
150            publishers that are wx objects and may have been destroyed by wx
151            already. Fixes RT #2242.
152    
153    2003-12-03  Bernhard Herzog  <[email protected]>
154    
155            * po/ru.po: Updates from Alex Shevlakov
156    
157    2003-12-03  Silke Reimer <silkeintevation.de>
158    
159            * debian/control, debian/changelog: Added gdal-support to
160                    debian package, updated to new thuban version
161    
162    
163    2003-12-03  Bernhard Herzog  <[email protected]>
164    
165            * Thuban/Lib/version.py: New. Module for version number
166            manipulations. The version of make_tuple here also deals better
167            with more unusual version number strings, such as e.g.
168            "1.2+cvs20031111"
169    
170            * Thuban/version.py (make_tuple): Removed. It's now in
171            Thuban.Lib.version. Use that implementation instead.
172    
173            * test/test_lib_version.py: New. Tests for Thuban/Lib/version.py
174    
175    2003-12-02  Bernhard Herzog  <[email protected]>
176    
177            * MANIFEST.in: Add debian files
178    
179            * setup.py (setup call): Add packages for the Extensions so that
180            they're installed too
181            (data_files): Add READMEs and sample data from some Extensions
182    
183            * NEWS: Add note about the extensions in binary packages
184    
185    2003-12-02  Bernhard Herzog  <[email protected]>
186    
187            * Thuban/Model/save.py (SessionSaver.write_session): Save files
188            with the thuban-1.0rc1
189    
190            * Thuban/Model/load.py (SessionLoader.__init__): Recognize the
191            thuban-1.0rc1 namespace too
192    
193            * test/test_save.py (SaveSessionTest.dtd)
194            (SaveSessionTest.testEmptySession)
195            (SaveSessionTest.testSingleLayer)
196            (SaveSessionTest.testLayerProjection)
197            (SaveSessionTest.testRasterLayer)
198            (SaveSessionTest.testClassifiedLayer)
199            (SaveSessionTest.test_dbf_table)
200            (SaveSessionTest.test_joined_table)
201            (SaveSessionTest.test_save_postgis): Update to thuban-1.0rc1
202            namespace
203    
204            * test/test_load.py (LoadSessionTest.dtd): Update to thuban-1.0rc1
205            namespace
206            (TestSingleLayer.file_contents)
207            (TestNonAsciiColumnName.file_contents)
208            (TestLayerVisibility.file_contents)
209            (TestClassification.file_contents, TestLabels.file_contents)
210            (TestLayerProjection.file_contents)
211            (TestRasterLayer.file_contents, TestJoinedTable.file_contents)
212            (TestPostGISLayer.file_contents)
213            (TestPostGISLayerPassword.file_contents)
214            (TestLoadError.file_contents, TestLoadError.test): Update to
215            thuban-1.0rc1 namespace
216    
217    2003-12-01  Bernhard Herzog  <[email protected]>
218    
219            * setup.py (proj4_prefix, wx_prefix, gdal_prefix): Fix these for
220            nt to better match Intevation's current w32 setup
221    
222            * HOWTO-Release: Add note about updating MANIFEST.in
223    
224            * MANIFEST.in: Add the Extensions
225    
226            * NEWS: Update for 1.0rc1
227    
228    2003-12-01  Bernhard Herzog  <[email protected]>
229    
230            * Thuban/UI/mainwindow.py (MainWindow.AddLayer): Change the wild
231            cards for the dialog so that shapefiles ending in all uppercase
232            SHP are listed too
233    
234    2003-11-28  Bernhard Herzog  <[email protected]>
235    
236            * Thuban/version.py (longversion): Update to 1.0rc1
237    
238            * setup.py (setup call): Update version to 1.0rc1. Use the
239            [email protected] email address as author email instead of my
240            personal one.
241    
242    2003-11-28  Bernhard Herzog  <[email protected]>
243    
244            * po/de.po: Update german translation.
245    
246    2003-11-28  Bernhard Herzog  <[email protected]>
247    
248            Unify the filenames stored in .thuban files so that the .thuban
249            files are more platform independend
250    
251            * Thuban/Model/save.py (unify_filename): New. Unify filenames so
252            that they can be used on both windows and unix
253            (SessionSaver.prepare_filename): New. Handle all filename
254            transformations for filenames stored in the thuban file
255            (SessionSaver.write_data_containers, SessionSaver.write_layer):
256            Use prepare_filename
257    
258            * test/test_save.py (SaveSessionTest.testSingleLayer)
259            (SaveSessionTest.testLayerProjection)
260            (SaveSessionTest.testRasterLayer)
261            (SaveSessionTest.testClassifiedLayer)
262            (SaveSessionTest.test_dbf_table)
263            (SaveSessionTest.test_joined_table): Filenames are always stored
264            with slashes on all currently supported platforms so adapt all
265            tests to this
266    
267            * test/test_load.py (LoadSessionTest.filenames): With the new
268            filename scheme the filenames in the tests should be
269            understandable on all currently supported platforms so we turn
270            this into an empty list because we don't have to normalize them
271            anymore
272    
273    2003-11-28  Bernhard Herzog  <[email protected]>
274    
275            * test/test_layer.py (TestLayer.test_arc_layer_with_projection):
276            Add the ellipsoid to the projection since some Proj versions
277            complain if it's missing.
278    
279    2003-11-27  Bernhard Herzog  <[email protected]>
280    
281            Corect some bounding box projection problems
282    
283            * Thuban/Model/proj.py (Projection.InverseBBox): New. Inverse
284            version of ForwardBBox
285            (Projection._transform_bbox): New. common implementation of
286            ForwardBBox and InverseBBox
287            (Projection.ForwardBBox): Use _transform_bbox.
288    
289            * test/test_proj.py (TestProjection.test): Add test for
290            InverseBBox
291    
292            * Thuban/Model/layer.py (Layer.LatLongBoundingBox)
293            (Layer.ShapesBoundingBox, RasterLayer.LatLongBoundingBox): Use the
294            new InverseBBox method to determine the unprojected bounding box
295            (Layer.ShapesInRegion): Use the ForwardBBox method to project the
296            bbox.
297    
298            * test/test_layer.py (TestLayer.test_point_layer_with_projection):
299            Removed.
300            (TestLayer.test_arc_layer_with_projection): New. This test is
301            better able to test whether bounding boxes are projected correctly
302            than test_point_layer_with_projection
303    
304            * Thuban/UI/viewport.py (ViewPort.map_projection_changed): Use
305            InverseBBox to unproject bboxes
306    
307    2003-11-25  Bernhard Herzog  <[email protected]>
308    
309            * Thuban/UI/about.py (About.__init__): Make sure we have ASCII
310            source code.
311    
312    2003-11-25  Bernhard Herzog  <[email protected]>
313    
314            * Thuban/Model/layer.py (Layer.__getattr__): Removed. It was only
315            there for backwards compatibility and all code relying on that
316            should have been updated by now.
317    
318    2003-11-25  Bernhard Herzog  <[email protected]>
319    
320            * test/test_load.py (TestClassification.test): Add the missing
321            round trip test.
322            (TestClassification.file_contents): Update to the newest file
323            format
324    
325    2003-11-25  Bernhard Herzog  <[email protected]>
326    
327            Add very experimental (and possibly dangerous) extension to draw
328            polygons:
329    
330            * Extensions/drawshape/README: New. Brief installation
331            instructions
332    
333            * Extensions/drawshape/drawshape.py: New. Implementation of the
334            drawshape extensions
335    
336            * Extensions/drawshape/patch.diff: Patch to apply before the
337            extension can be used.
338    
339    2003-11-24  Bernhard Herzog  <[email protected]>
340    
341            * Thuban/Model/data.py (ShapefileStore._open_shapefile)
342            (ShapefileStore.__init__): Factor opening the shapefile into a
343            separate method (the new _open_shapefile). This makes the code a
344            bit more readable but the real reason is that it makes some evil
345            hacks easier. :-)
346    
347    2003-11-24  Bernhard Herzog  <[email protected]>
348    
349            * Thuban/Model/load.py (SessionLoader.check_attrs): If no
350            converter is specified for an attribute assume it's a string
351            containing only Latin1 characters. Update doc-string accordingly.
352            This change should fix many places where unicode objects might
353            accidentally enter Thuban.
354    
355            * test/test_load.py (TestNonAsciiColumnName): New test to check
356            what happens with column names in DBF files that contain non-ascii
357            characters
358    
359    2003-11-21  Bernhard Herzog  <[email protected]>
360    
361            Enable the experimental attribute editing again and introduce a
362            command line switch to actually activate it
363    
364            * Thuban/UI/main.py (options): New. Container for options set on
365            the commmand line
366            (main): Add the --enable-attribute-editing flag.
367    
368            * Thuban/UI/identifyview.py (IdentifyView.__init__): If attribute
369            editing is enabled use the grid ctrl which allows editing of the
370            values
371    
372            * Thuban/Model/transientdb.py (AutoTransientTable.write_record):
373            New. Just delegate this to the underlying table.
374    
375    2003-11-20  Bernhard Herzog  <[email protected]>
376    
377            * test/test_proj.py (ProjFileReadTests.test_read_unreadable_file):
378            Skip this test if run under non-posix systems since it only works
379            there
380    
381    2003-11-19  Bernhard Herzog  <[email protected]>
382    
383            * Thuban/Model/resource.py: Rework the way gdal support is
384            determined so that we can give a reason in the about why gdal is
385            not supported.
386            (gdal_support_status): New. Variable holding a string with the
387            reason for no gdal support
388    
389            * Thuban/UI/about.py (About.__init__): Add the reason why gdal is
390            not supported to the message
391    
392    2003-11-19  Bernhard Herzog  <[email protected]>
393    
394            Remove the old table interface and its test cases
395    
396            * Thuban/Model/table.py (OldTableInterfaceMixin): Removed.
397            (DBFTable, MemoryTable): Do not derive from OldTableInterfaceMixin
398            anymore
399    
400            * Thuban/Model/transientdb.py (TransientTableBase)
401            (AutoTransientTable): Do not derive from OldTableInterfaceMixin
402            anymore
403    
404            * test/test_table.py: Removed since the old interface it tests is
405            gone.
406    
407            * test/runtests.py (main): The old table interface is gone and
408            with it the deprecation warnings so remove the code that turns
409            these warnings into errors
410    
411    2003-11-19  Bernhard Herzog  <[email protected]>
412    
413            * test/test_table.py: Revert to revision 1.5 again. Changing the
414            tests to use the new table interface is completely wrong since the
415            whole purpose of the tests in this module is to test the old
416            interface.
417    
418    2003-11-18  Bernhard Herzog  <[email protected]>
419    
420            * Thuban/Model/postgisdb.py (PostGISConnection.MatchesParameters):
421            New. Test whether the connection matches a set of connection
422            parameters
423    
424            * Thuban/UI/dbdialog.py (DBFrame.conns_changed): Fix doc-string
425            (DBFrame.OnAdd): Use the new MatchesParameters method when looking
426            for existing connections with the same parameters and break out of
427            the loop correctly.
428    
429            * test/test_postgis_db.py (TestBriefDescription)
430            (TestPostGISSimple.test_brief_description): Rename
431            TestBriefDescription to TestPostGISSimple and the test method to
432            test_brief_description so that we can add more test methods.
433            (TestPostGISSimple.test_matches_parameters): New. Test the new
434            MatchesParameters method
435    
436    2003-11-18  Bernhard Herzog  <[email protected]>
437    
438            * Thuban/Lib/connector.py (Publisher): Introduce a new flag,
439            _was_destroyed, to indicate whether an publisher instance has
440            already been destroyed.
441            (Publisher.Unsubscribe): Only disconnect if the publisher has not
442            been destroyed yet.
443            (Publisher.Destroy): Set the _was_destroyed flag to true.
444    
445            * test/test_connector.py
446            (TestPublisher.test_unsubscribe_after_destroy): New. Test that
447            calling Unsubscribe after Destroy doesn't raise an exception
448    
449    2003-11-14  Bernhard Herzog  <[email protected]>
450    
451            * Thuban/UI/identifyview.py (IdentifyView.selected_shape): Fix
452            typo in doc-string
453    
454    2003-11-13  Bernhard Herzog  <[email protected]>
455    
456            Quote table and column names properly for postgis.
457    
458            * Thuban/Model/postgisdb.py (quote_identifier): New. Function to
459            quote an identifier for use in an sql statement
460            (PostGISColumn.__init__): Add the quoted_name attribute
461            (PostGISTable.__init__): New instance variable quoted_tablename
462            (PostGISTable._fetch_table_information): Use the quoted table
463            name. New isntance variable quoted_geo_col with a quoted version
464            of geometry_column
465            (PostGISTable.NumRows, PostGISTable.RowIdToOrdinal)
466            (PostGISTable.RowOrdinalToId): Use the quoted table name
467            (PostGISTable.ReadValue, PostGISTable.ValueRange)
468            (PostGISTable.UniqueValues, PostGISTable.SimpleQuery)
469            (PostGISShapeStore.BoundingBox, PostGISShapeStore.Shape)
470            (PostGISShapeStore.AllShapes, PostGISShapeStore.ShapesInRegion):
471            Use quoted table and column names
472    
473            * test/test_postgis_db.py (TestPostGISSpecialCases)
474            (TestPostGISIgnoredColumns): Rename the class to
475            TestPostGISSpecialCases because that better describes the new
476            cases
477            (TestPostGISSpecialCases.test_unsupported_types)
478            (TestPostGISSpecialCases.test): Rename the method to
479            test_unsupported_types because we need a more descriptive name now
480            that there are more methods
481            (TestPostGISSpecialCases.test_table_name_quoting)
482            (TestPostGISSpecialCases.test_column_name_quoting)
483            (TestPostGISSpecialCases.test_shapestore_name_quoting): New test
484            cases to test quoting of table and column names in PostGISTable
485            and PostGISShapeStore
486    
487            * test/postgissupport.py
488            (skip_if_addgeometrycolumn_does_not_use_quote_ident): New. Skip if
489            AddGeometryColumn desn't support table or column names with sapces
490            or double quotes
491    
492    2003-11-12  Jan-Oliver Wagner <[email protected]>
493    
494            * Extensions/wms/__init__.py: New: Init to make this
495            directory a package.
496    
497            * Extensions/wms/wms.py: New: Provide layers via OGC WMS.
498    
499    2003-11-11  Bernhard Herzog  <[email protected]>
500    
501            * Thuban/Model/resource.py (EPSG_DEPRECATED_PROJ_FILE): New.
502            Constant for the file woth deprecated epsg projections
503            (get_system_proj_file): Update doc-string
504    
505            * Thuban/UI/projdialog.py (ProjFrame.build_dialog): Add a space
506            above the EPS widgets, introduce a check box for the deprecated
507            eps projections and a label for the epsg widgets
508            (ProjFrame._OnShowEPSG): Handle the deprecated EPSG projections
509            too
510    
511    2003-11-11  Bernhard Herzog  <[email protected]>
512    
513            Avoid warnings when run under Python 2.3
514    
515            * Thuban/UI/baserenderer.py (BaseRenderer.draw_point_shape)
516            (BaseRenderer.draw_label_layer): Coordinates must be ints.
517    
518            * Thuban/UI/renderer.py (MapRenderer.make_point): Turn this into a
519            real method so that we can convert to int.
520            (MapRenderer.label_font): The font size mist be an int.
521    
522            * Thuban/UI/common.py (Color2wxColour): The color values must be
523            ints. Also, remove the unnecessary asserts.
524    
525            * test/test_load_0_8.py (TestUnicodeStrings.file_contents)
526            (TestUnicodeStrings.test): Python source code should not contain
527            non-ascii characters unless an encoding is specified in the file.
528            Therefore use \x escapes in the string literals for non-ascii
529            characters.
530    
531    2003-11-11  Bernhard Herzog  <[email protected]>
532    
533            * Thuban/Model/resource.py (get_system_proj_file): Add a filename
534            parameter so that this function can be used for all proj files in
535            Resource/Projections
536            (DEFAULT_PROJ_FILE, EPSG_PROJ_FILE): New. Predefined filenames for
537            get_system_proj_file
538    
539            * Thuban/UI/projdialog.py (ProjFrame.__init__): Instead of one
540            ProjFile self.__sysProjFile use a dictionary of system ProjFile
541            objects self._sys_proj_files
542            (ProjFrame.build_dialog): Adapt to the new changes in the
543            ProjectionList constructor. Add a check button to toggle whether
544            EPSG projections are shown
545            (ProjFrame._OnShowEPSG): New. Handler for the epsg check button
546            events.
547            (ProjFrame.load_user_proj, ProjFrame.load_system_proj): Only show
548            the busy cursor if the files have not yet been loaded by the
549            dialog.
550            (ProjFrame.load_system_proj): Add a parameter for the name of the
551            proj file. Maintain the dictionary of system projections
552            self._sys_proj_files
553    
554            * Thuban/UI/projlist.py (ProjectionList): Merge the system_projs,
555            user_projs parameters into one parameter proj_files which is a
556            list of proj files.
557            (ProjectionList._subscribe_proj_files)
558            (ProjectionList._unsubscribe_proj_files): New. Move
559            subscription/unsubscription of projfile messages to separate
560            methods
561            (ProjectionList.Destroy): The unsubscribe is now done in
562            _unsubscribe_proj_files
563            (ProjectionList.update_projections): We now have a list of proj
564            file objects
565            (ProjectionList.SetProjFiles): New method to set a new list of
566            proj file objects
567    
568            * test/test_proj.py (ProjFileReadTests.test_get_system_proj_file):
569            Specify explicitly which system proj file to load.
570    
571    2003-11-11  Bernhard Herzog  <[email protected]>
572    
573            * Thuban/Model/load.py (SessionLoader.Destroy): New. Clear all
574            instance variables to cut cyclic references. The GC would have
575            collected the loader eventually but it can happen that it doesn't
576            run at all until thuban is closed (2.3 but not 2.2 tries a bit
577            harder and forces a collection when the interpreter terminates)
578            (load_session): Call the handler's Destroy method to make sure
579            that it gets garbage collected early. Otherwise it will be
580            collected very late if at all and it holds some references to e.g.
581            shapestores and the session which can lead to leaks (of e.g. the
582            temporary files)
583    
584            * test/test_load.py (TestSingleLayer.test_leak): New. test for the
585            resource leak in load_session
586    
587    2003-11-10  Bernhard Herzog  <[email protected]>
588    
589            * Thuban/UI/baserenderer.py: Add a way to specify how layers in
590            extensions are to be rendered.
591            (_renderer_extensions): New. List with renderer for layers in
592            extensions
593            (add_renderer_extension): New. Add a renderer extension
594            (init_renderer_extensions): New. Init the renderer extensions
595            (BaseRenderer.render_map_incrementally): Search
596            _renderer_extensions for how to draw unknown layer types
597            (BaseRenderer.draw_raster_data): Add format parameter so that
598            formats other than BMP can be drawn
599            (BaseRenderer.draw_raster_layer): Pass an explicit format to
600            draw_raster_data
601    
602            * Thuban/UI/renderer.py (raster_format_map): New. Mapping form the
603            strings of the format parameter of draw_raster_data method to wx
604            constants
605            (MapRenderer.draw_raster_data): Add the format parameter and use
606            raster_format_map to map it to the right wxwindows constant for
607            wxImageFromStream
608    
609            * test/test_baserenderer.py (SimpleRenderer.draw_raster_data): Add
610            the format parameter and record it
611            (TestBaseRenderer.test_raster_no_projection): check the format
612            paramter of the draw_raster_data method
613            (TestBaseRenderer.test_renderer_extension): New. Test the renderer
614            extension facility
615    
616    2003-11-07  Bernhard Herzog  <[email protected]>
617    
618            Tweak the usage of the sqlite database to make common use cases
619            more responsive. In most cases copying the data to the sqlite
620            database takes so long that using sqlite doesn't have enough
621            advantages.
622    
623            * Thuban/Model/transientdb.py (TransientTableBase.ValueRange): Add
624            comments about performance and query the min and max in separate
625            statements because only that way will indexes be used.
626            (TransientTableBase.UniqueValues): Add some comments about
627            performance.
628            (AutoTransientTable.ValueRange, AutoTransientTable.UniqueValues):
629            Do not copy the data to the transient DB but use the transient
630            copy if it exists. See the new comments for the performance trade
631            offs
632    
633            * test/test_transientdb.py
634            (TestTransientTable.test_auto_transient_table): Make sure that the
635            data is copied to the transient database at some point.
636    
637    2003-11-03  Bernhard Herzog  <[email protected]>
638    
639            * Thuban/Model/data.py (ShapefileStore.ShapesInRegion): Bind some
640            globals to locals so that it's a bit faster
641    
642    2003-11-03  Bernhard Herzog  <[email protected]>
643    
644            * Thuban/UI/baserenderer.py
645            (BaseRenderer.draw_shape_layer_incrementally): Use the ReadValue
646            method. ReadValue is faster than ReadRowAsDict since it only reads
647            one cell especially now that the dbf file objects actually
648            implement it.
649    
650            * Thuban/Model/table.py (DBFTable.ReadValue): Use the new
651            read_attribute method of the dbf objects
652    
653    2003-11-03  Bernhard Herzog  <[email protected]>
654    
655            * Extensions/profiling/profiling.py (popup_dialog_box): New config
656            variable to indicate whether the result should be shown in a
657            dialog box
658            (profile_screen_renderer, time_screen_renderer): Only show a
659            dialog box if popup_dialog_box is true.
660            (profile_screen_renderer): Flush stdout after the printing the
661            first part of the "profiling..." message
662    
663            * Thuban/UI/baserenderer.py
664            (BaseRenderer.draw_shape_layer_incrementally): Cache the pens and
665            brushes for the groups so that they're not created over and over
666            again
667    
668            * Thuban/Model/classification.py (Classification.__getattr__)
669            (Classification._compile_classification)
670            (Classification._clear_compiled_classification): New. Methods to
671            manage a 'compiled' representation of the classification groups
672            which is created on demand
673            (Classification.InsertGroup, Classification.RemoveGroup)
674            (Classification.ReplaceGroup): reset the compiled representation
675            (Classification.FindGroup): Use the compiled representation to
676            find the matching group
677            (ClassGroupRange.GetRangeTuple): New. Return the range as a tuple
678    
679    2003-10-31  Bernhard Herzog  <[email protected]>
680    
681            * Thuban/Model/classification.py (Classification.SetDefaultGroup):
682            Send a CLASS_CHANGED message
683            (Classification.RemoveGroup): Send a CLASS_CHANGED message and do
684            not return the removed group since it wasn't used.
685    
686            * test/test_classification.py
687            (TestClassification.test_set_default_group): New. Test the
688            SetDefaultGroup method
689            (TestClassification.test_insert_group): New. Test the InsertGroup
690            method
691            (TestClassification.test_remove_group): New. Test the RemoveGroup
692            method
693            (TestClassification.test_replace_group): New. Test the
694            ReplaceGroup method
695    
696    2003-10-31  Bernhard Herzog  <[email protected]>
697    
698            * test/test_classification.py (TestClassification.setUp):
699            Subscribe to the CLASS_CHANGED messages
700            (TestClassification.tearDown): New. Destroy the classification
701            properly
702            (TestClassification.test_defaults): Add tests for the default line
703            width and whether no messages were sent yet
704            (TestClassification.test_set_default_properties): Add tests for
705            messages and setting the default line width
706            (TestClassification.test_add_singleton)
707            (TestClassification.test_add_range)
708            (TestClassification.test_multiple_groups): Add tests for messages
709    
710    2003-10-31  Bernhard Herzog  <[email protected]>
711    
712            Some more refactoring in preparation for new tests:
713    
714            * test/test_classification.py (TestClassification.setUp): New.
715            Instantiate the classification here. Update the test methods
716            accordingly.
717            (TestClassification.test_multiple_groups): Make sure that the two
718            singletons matching 1 are considered different.
719    
720    2003-10-31  Bernhard Herzog  <[email protected]>
721    
722            * test/test_classification.py (red, green, blue): New. These
723            constants were used in several cases. Update the relevant methods.
724            (TestClassification.test_defaults)
725            (TestClassification.test_set_default_properties)
726            (TestClassification.test_add_singleton)
727            (TestClassification.test_add_range)
728            (TestClassification.test_multiple_groups)
729            (TestClassification.test_deepcopy): New. These were formerly all
730            part of the single method test.
731            (TestClassification.test_deepcopy): Removed.
732            (TestClassIterator): Removed. The test case is now a method of
733            TestClassification since it tests part of the public interface of
734            Classification
735            (TestClassification.test_iterator): New. Used to be
736            TestClassIterator effectively
737    
738    2003-10-31  Jan-Oliver Wagner <[email protected]>
739    
740            GUIfied the functions of the profiling extension.
741    
742            * /Extensions/profiling/__init__.py: New: Init to make this
743            directory a package.
744    
745            * Extensions/profiling/profiling.py: Moved menu entries to
746            the Extensions menu. Applied _() for strings.
747            (profile_screen_renderer): Catch the detailed printout and present
748            it in a dialog.
749            (time_screen_renderer): Raise a dialog to present the result instead
750            of printing it to stdout.
751    
752    2003-10-31  Bernhard Herzog  <[email protected]>
753    
754            * test/test_classification.py (TestClassGroupProperties)
755            (TestClassGroup, TestClassGroupDefault, TestClassGroupRange)
756            (TestClassGroupSingleton, TestClassIterator, TestClassification):
757            Split TestClassification into several classes, one for each class
758            being tested. TestClassification itself now only tests
759            Classification. This split makes changes to the tests a bit easier
760    
761    2003-10-31  Bernhard Herzog  <[email protected]>
762    
763            * Extensions/profiling/profiling.py: New. Extension to measure
764            Thuban performance
765    
766    2003-10-31  Frank Koormann <[email protected]>
767    
768            Added two items to legend popup menu: Remove Layer and Show Layer Table
769    
770            * Thuban/UI/legend.py (LegendPanel._OnRemoveLayer,
771            LegendPanel._OnShowTable): New event handlers, call the corresponding
772            mainwindow methods.
773            (LegendTree._OnRightClick): Added items to popup menu.
774    
775    2003-10-30  Bernhard Herzog  <[email protected]>
776    
777            * Thuban/UI/dialogs.py (ThubanFrame.__init__): Handle
778            EVT_WINDOW_DESTROY
779            (ThubanFrame.OnDestroy): New. Handler for EVT_WINDOW_DESTROY. Does
780            nothing but is convenient for the derived classes.
781    
782            * Thuban/UI/tableview.py
783            (TableFrame.OnDestroy, LayerTableFrame.OnDestroy): New.
784            Unsubscribe the messages here not in OnClose because that might
785            get called multiple times. Fixes RT #2196
786            (TableFrame.OnClose, LayerTableFrame.OnClose): Removed. Not needed
787            anymore.
788    
789            * README: Update the minimum requirement for wxPython. Since we
790            now use the EVT_WINDOW_DESTROY event, we need at least 2.4.0.4,
791            the version in which that was introduced for all platforms
792    
793    2003-10-30  Frank Koormann <[email protected]>
794    
795            * Thuban/UI/join.py (JoinDialog.OnJoin): Wrapped the major parts of
796            the join process in a ThubanBeginBusyCursor, ThubanEndBusyCursor
797            frame.
798    
799    2003-10-30  Jan-Oliver Wagner <[email protected]>
800    
801            Improved APR import extension, added further EPSG definitions
802            and some cleanup regarding string class.
803    
804            * test/test_proj.py (TestProjection.test_get_projection_units_geo):
805            Added test for alias 'longlat'.
806    
807            * Resources/Projections/epsg-deprecated.proj: New. Contains
808            deprecated EPSG definitions.
809    
810            * Extensions/importAPR/odb.py (ODBBaseObject.TreeInfo): Added
811            the variable names for objects.
812    
813            * Extensions/importAPR/apr.py (APR_BLnSym, APR_BMkSym, APR_BShSym): New.
814            Copied from importAPR and provided with documentation.
815    
816            * Extensions/importAPR/importAPR.py (APR_BLnSym, APR_BMkSym, APR_BShSym):
817            Moved to apr.py.
818            (APR_View): Added object ref 'ITheme'.
819    
820            * Thuban/Lib/fileutil.py, Thuban/UI/proj4dialog.py: Replaced string
821            split function by corresponding use of the string class method.
822    
823            * Thuban/Model/xmlwriter.py: Replaced string replace function by
824            corresponding string method.
825    
826    2003-10-29  Bernhard Herzog  <[email protected]>
827    
828            * Thuban/UI/baserenderer.py
829            (BaseRenderer.draw_shape_layer_incrementally): Speed up the
830            special case of a classification that only has the default group
831    
832    2003-10-27  Bernhard Herzog  <[email protected]>
833    
834            * po/fr.po, po/es.po: Updated translations from Daniel Calvelo
835    
836            * po/de.po: Update.
837    
838            * Thuban/UI/application.py
839            (ThubanApplication.ShowExceptionDialog): Handle translation of the
840            dialog message properly
841    
842    2003-10-27  Bernhard Herzog  <[email protected]>
843    
844            Rework how localization works so that we use wx's translation
845            functions when running Thuban as a normal application but not when
846            we don't need any UI, such as in the test suite. See the comment
847            in Thuban/__init__.py for details
848    
849            * Thuban/__init__.py (_): Add one level of indirection to make the
850            translation handling more flexible and to make it possible to use
851            either wx's translation services or not.
852            (gettext_identity, translation_function_installed)
853            (install_translation_function): New function to help with this
854    
855            * Thuban/UI/__init__.py: Install the wx specific translation
856            function if it's OK to do that
857    
858            * test/support.py (initthuban): Install a dummy translation
859            function so that importing Thuban.UI doesn't install a wx specific
860            one for which would need to import wxPython
861    
862    2003-10-27  Bernhard Herzog  <[email protected]>
863    
864            * HOWTO-Release: Source archives should be created first and the
865            binary packages should be created from the source archives.
866            There's an official debian package now so there's no need to test
867            the rpm on debian anymore
868    
869    2003-10-27  Bernhard Herzog  <[email protected]>
870    
871            Several rendering changes:
872    
873             - Render the selection into a separate bitmap so that only that
874               bitmap needs to be redrawn when the selection changes
875    
876             - Render incrementally showing previews and allowing interaction
877               before rendering is complete
878    
879             - Update the renderer interface a bit. Most parameters of
880               RenderMap are now parameters of the constructor
881    
882            * Thuban/UI/baserenderer.py (BaseRenderer.__init__): Add the map
883            and the update region as parameters. Update the doc-string
884            (BaseRenderer.render_map_incrementally): New. Generator function
885            to renders the map incrementally
886            (BaseRenderer.render_map): Remove the map argument (it's now in
887            the constructor) and simply iterate over the
888            render_map_incrementally generator to draw the map.
889            (BaseRenderer.draw_shape_layer_incrementally)
890            (BaseRenderer.draw_shape_layer): Renamed to
891            draw_shape_layer_incrementally and changed into a generator that
892            yields True every 500 shapes. Used by render_map_incrementally to
893            render shape layers incrementally
894    
895            * Thuban/UI/renderer.py (ScreenRenderer.RenderMap): Removed the
896            map and region parameters which are now in the constructor
897            (ScreenRenderer.RenderMapIncrementally): New. Public frontend for
898            the inherited render_map_incrementally.
899            (BaseRenderer.draw_shape_layer): Removed.
900            (ScreenRenderer.draw_selection_incrementally): New. The selection
901            drawing part of the removed draw_shape_layer as a generator
902            (ScreenRenderer.layer_shapes): Update because of the region
903            parameter change
904            (ExportRenderer.__init__): New. Extend the inherited constructor
905            with the destination region for the drawing
906            (ExportRenderer.RenderMap): Removed the map and region parameters
907            which are now in the constructor
908    
909            * Thuban/UI/view.py (MapCanvas.PreviewBitmap): New. Return a
910            bitmap suitable for a preview in a tool
911            (CanvasPanTool.MouseMove): Use the PreviewBitmap method to get the
912            bitmap
913            (MapPrintout.draw_on_dc): Adapt to new renderer interface
914            (MapCanvas.OnPaint): Handle drawing the selection bitmap if it
915            exists
916            (MapCanvas.OnIdle): Update the logic to deal with incremental
917            rendering and the selection bitmap
918            (MapCanvas._do_redraw): Handle the instantiation of the render
919            iterator and the redraws during rendering
920            (MapCanvas._render_iterator): New. Generator to incrementally
921            redraw both bitmaps
922            (MapCanvas.Export): Adapt to new renderer interface.
923            (MapCanvas.full_redraw): Reset the selection bitmap and the
924            renderer iterator too
925            (MapCanvas.redraw_selection): New. Force a redraw of the selection
926            bitmap
927            (MapCanvas.shape_selected): Only redraw the selection bitmap
928    
929            * test/test_baserenderer.py
930            (TestBaseRenderer.test_polygon_no_projection)
931            (TestBaseRenderer.test_raster_no_projection)
932            (TestBaseRenderer.test_point_map_projection)
933            (TestBaseRenderer.test_point_layer_and_map_projection)
934            (TestBaseRenderer.test_point_layer_projection)
935            (TestBaseRenderer.test_point_with_classification): Adapt to new
936            renderer interface
937    
938    2003-10-24  Bernhard Herzog  <[email protected]>
939    
940            * libraries/thuban/wxproj.cpp (draw_polygon_shape)
941            (point_in_polygon_shape, shape_centroid): Raise an exception if
942            the shape can't be read. Previously invalid shape ids would lead
943            to a segfault.
944    
945            * test/test_wxproj.py (TestShapeCentroid.test_invalid_shape_id):
946            New. test whether an exception is raised for invalid shape ids
947    
948    2003-10-24  Jan-Oliver Wagner <[email protected]>
949    
950            * Thuban/Model/proj.py (Projection.GetProjectedUnits): Added 'longlat'
951            as alias for 'latlong'.
952    
953            * Thuban/UI/projdialog.py (ProjFrame.__init__): Added 'longlat'
954            as alias for 'latlong'.
955    
956    2003-10-24  Jan-Oliver Wagner <[email protected]>
957    
958            * Thuban/UI/projdialog.py (ProjFrame.proj_selection_changed): Set
959            the projection even for the UnknownPanel.
960            (UnknownProjPanel.__init__): Define the text and create the textctrl
961            widget.
962            (UnknownProjPanel._DoLayout): Replaced static text widget by the
963            textctrl created in __init__.
964            (UnknownProjPanel.SetProjection): Set the text for the text ctrl
965            including the parameters of the projection.
966            
967    2003-10-24  Jan-Oliver Wagner <[email protected]>
968    
969            * Resources/Projections/epsg.proj: New. This is a list of
970            EPSG codes with parameters for proj. The list has been
971            generated using devtools/create_epsg.py based on the
972            file nad/epsg of the proj 4.4.7 package. Four projection
973            definitions have been deleted as they are not accepted by proj:
974            "CH1903+ / LV95", "Bern 1898 (Bern) / LV03C", "CH1903 / LV03"
975            and "HD72 / EOV".
976    
977    2003-10-22  Bernhard Herzog  <[email protected]>
978    
979            Some more tweaks to the projection dialog which should fix RT
980            #1886.
981    
982            * Thuban/UI/projlist.py (ProjectionList.Destroy): Unsubscribe from
983            the ProjFile's messages and call the base class methods correctly
984            (ProjectionList.SelectProjection): Set the wxLIST_STATE_FOCUSED
985            flag on the newly selected item too. Otherwise some other item is
986            focused and the first time the focus is moved with the keyboard
987            the selection moves in unexpected ways.
988    
989            * Thuban/UI/projdialog.py (ProjFrame.__init__): Do not set the
990            focus on the OK button, only on the projection list. That way the
991            list really has the focus initially
992            (ProjFrame.OnClose): Call the projection list's Destroy method to
993            make it unsubscribe all messages
994    
995    2003-10-21  Bernhard Herzog  <[email protected]>
996    
997            Rework the projection dialog to fix a few bugs, including RT 2166
998            and most of 2168
999    
1000            * Thuban/UI/projlist.py: New. The class ProjectionList is a
1001            special wxListCtrl to show a list of projections in a more MVC
1002            fashion
1003    
1004            * Thuban/UI/projdialog.py (ProjFrame): Substantial changes
1005            throughout the class. The main change is to use the ProjectionList
1006            class instead of a normal wxListBox. Also, add an explicit
1007            "Unknown" projection to the projection choice control.
1008            (ProjPanel.__init__): Add an "unknown" ellipsoid
1009            (TMPanel.__init__, LCCPanel.__init__): Tweak the order of
1010            instantiation of the panel's controls to make the tab-order more
1011            natural
1012    
1013    2003-10-21  Bernhard Herzog  <[email protected]>
1014    
1015            * test/test_load.py (TestSingleLayer.file_contents)
1016            (TestSingleLayer.test): Add non-ascii characters to the titles of
1017            session, map and layer. This is effectively a port of the
1018            TestUnicodeStrings test in test_load_0_8.py which for some reason
1019            was only added there.
1020    
1021            * test/test_load_0_9.py (TestSingleLayer.file_contents)
1022            (TestSingleLayer.test): Same as in test_load.py: add non-ascii
1023            characters to the titles of session, map and layer,.
1024    
1025    2003-10-21  Bernhard Herzog  <[email protected]>
1026    
1027            Add EPSG projection handling to .thuban files
1028    
1029            * test/test_save.py (SaveSessionTest.dtd)
1030            (SaveSessionTest.testEmptySession)
1031            (SaveSessionTest.testLayerProjection)
1032            (SaveSessionTest.testRasterLayer)
1033            (SaveSessionTest.testClassifiedLayer)
1034            (SaveSessionTest.test_dbf_table)
1035            (SaveSessionTest.test_joined_table)
1036            (SaveSessionTest.test_save_postgis): Update to 1.0-dev namespace
1037            (SaveSessionTest.testSingleLayer): Update to 1.0-dev namespace and
1038            use a and epsg projection to test saving them
1039    
1040            * test/test_load.py (LoadSessionTest.dtd): Update to 1.0-dev
1041            namespace
1042            (TestLayerVisibility.file_contents, TestLabels.file_contents)
1043            (TestLayerProjection.file_contents)
1044            (TestRasterLayer.file_contents, TestJoinedTable.file_contents)
1045            (TestPostGISLayer.file_contents)
1046            (TestPostGISLayerPassword.file_contents)
1047            (TestLoadError.file_contents, TestLoadError.test): Update to use
1048            1.0-dev namespace
1049            (TestSingleLayer.file_contents, TestSingleLayer.test): Update to
1050            use 1.0-dev namespace and use an EPSG projection to test whether
1051            loading it works
1052    
1053            * test/test_load_0_9.py: New. Effectively a copy of test_load.py
1054            as of Thuban 0.9. These are now tests to determine whether Thuban
1055            can still read files generated by Thuban 0.9
1056    
1057            * Thuban/Model/save.py (SessionSaver.write)
1058            (SessionSaver.write_session): Use the 1.0 dtd and 1.0-dev
1059            namespace
1060            (SessionSaver.write_projection): Write the projection's epsg
1061            attribute
1062    
1063            * Thuban/Model/load.py (SessionLoader.__init__): Also accept the
1064            thuban-1.0-dev.dtd namespace
1065            (SessionLoader.check_attrs): Allow a callable object as conversion
1066            too
1067            (SessionLoader.start_projection, SessionLoader.end_projection)
1068            (SessionLoader.start_parameter): Handle the epsg attribute and
1069            rename a few instance variables to lower case
1070    
1071            * Resources/XML/thuban-1.0.dtd: New. Only difference to
1072            thuban-0.9.dtd is the epsg attribute for projections.
1073    
1074    2003-10-21  Bernhard Herzog  <[email protected]>
1075    
1076            * test/runtests.py (main): Let the user specify which tests to run
1077            on the command line
1078    
1079            * test/support.py (ThubanTestResult.getDescription): Override to
1080            give a better short description. The description can be used as a
1081            parameter to run_tests to run that particular test in isolation.
1082    
1083    2003-10-21  Frank Koormann   <[email protected]>
1084    
1085            Popup menu for legend. Scheduled for the 1.2 release this was too
1086            simple to implement: The popup menu is bound to the legend tree, while
1087            the events are hanlded by its anchestor, the legend panel. This
1088            allows reuse of all the event handlers already implemented for the
1089            legend toolbar buttons.
1090    
1091            * Thuban/UI/legend.py (LegendPanel.__init__): EVT_MENU macros
1092            to add handlers for the events issued by the popup menu.
1093            (LegendPanel._OnToggleVisibility): Handler for toggling layer
1094            visibility event
1095            (LegendPanel._OnProjection): Handler for layer projection event.
1096            (LegendTree.__init__): Added EVT_TREE_ITEM_RIGHT_CLICK
1097            (LegendTree._OnRightClick): Event handler for right click, select item
1098            and pop up menu.
1099            (LegendTree.ToggleVisibility): Toggle layer visibility
1100            (LegendTree.LayerProjection): Raise layer projection dialog for
1101            current layer.
1102    
1103    2003-10-21  Bernhard Herzog  <[email protected]>
1104    
1105            * Resources/Projections/defaults.proj: Use correct DOCTYPE
1106            declaration. The top-level element is projectionlist not projfile
1107    
1108    2003-10-20  Bernhard Herzog  <[email protected]>
1109    
1110            * Thuban/UI/projdialog.py (ProjFrame.write_proj_file): New. helper
1111            method to write a projfile and display a busy cursor and error
1112            dialogs.
1113            (ProjFrame._OnSave, ProjFrame._OnAddToList, ProjFrame._OnImport)
1114            (ProjFrame._OnExport, ProjFrame._OnRemove): Use write_proj_file
1115            (ProjFrame.__FillAvailList): Translate "<None>" too and display a
1116            busy cursor while loading the user and system prj files.
1117    
1118    2003-10-16  Bernhard Herzog  <[email protected]>
1119    
1120            * Thuban/Model/resource.py (projfile_cache): Introduce a cache for
1121            ProjFile objects
1122            (clear_proj_file_cache): New function to clear the cache. Mainly
1123            useful for use by the test suite
1124            (read_proj_file): Use the cache.
1125    
1126            * test/test_proj.py (TestProjFile): Clarify the doc-string
1127            (ProjFileReadTests): Update doc-string
1128            (ProjFileReadTests.test_get_system_proj_file): Check whether the
1129            system proj files is cached.
1130            (ProjFileLoadTestCase): New base class for the proj file tests
1131            derived from support.FileLoadTestCase to provide some common
1132            behavior.
1133            (TestLoadingProjFile)
1134            (TestLoadingProjFileWithEmptyProjectionlist.file_contents)
1135            (TestProjFileWithInvalidParameters.file_contents): Derive from
1136            ProjFileLoadTestCase
1137            (TestLoadingProjFile.test_caching): New. Test whether the cache
1138            works
1139    
1140    2003-10-16      Silke Reimer    <[email protected]>
1141    
1142            * debian/*: New directory with configuration files for building a thuban
1143              deb-package.
1144    
1145    2003-10-14  Bernhard Herzog  <[email protected]>
1146    
1147            * test/test_proj.py: Execute support.run_tests when run as
1148            __main__ so that missing unsubscribes are detected
1149            (TestProjFile.tearDown): Destroy the proj_file properly
1150    
1151    2003-10-14  Bernhard Herzog  <[email protected]>
1152    
1153            * Thuban/Model/messages.py (PROJECTION_ADDED)
1154            (PROJECTION_REPLACED, PROJECTION_REMOVED): New message types for
1155            the ProjFile objects
1156    
1157            * Thuban/Model/proj.py (ProjFile): Derive from Publisher so we can
1158            easily send messages when the projections change
1159            (ProjFile.Add, ProjFile.Remove, ProjFile.Replace): Issue messages
1160            when the change was successful
1161    
1162            * test/test_proj.py (TestProjFile.setUp): Subscribe to some of the
1163            proj file messages
1164            (TestProjFile.test_add_remove)
1165            (TestProjFile.test_remove_non_existing)
1166            (TestProjFile.test_replace)
1167            (TestProjFile.test_replace_non_existing): Test whether the right
1168            messages are sent
1169    
1170    2003-10-14  Bernhard Herzog  <[email protected]>
1171    
1172            * test/test_proj.py (TestProjFile.test): Refactor into several
1173            tests
1174            (TestProjFile.test_add_remove)
1175            (TestProjFile.test_remove_non_existing)
1176            (TestProjFile.test_replace)
1177            (TestProjFile.test_replace_non_existing): Some of the new
1178            individual test cases
1179            (TestProjFileSimple): New class for the rest of the test cases
1180            that came out of the refactoring
1181            (ProjFileTest): Derive from xmlsupport.ValidationTest so that the
1182            derived classes don't have to
1183    
1184    2003-10-13  Bernhard Herzog  <[email protected]>
1185    
1186            Add an optional EPSG code to the projection objects and extend the
1187            .proj file format accordingly.
1188    
1189            * Resources/XML/projfile.dtd (element projection): Add epsg
1190            attribute
1191    
1192            * Thuban/Model/proj.py (Projection.__init__): New parameter and
1193            instance variable epsg. Update doc-string
1194            (Projection.EPSGCode, Projection.Label): New methods to provide
1195            access to EPSG code and a label for use in dialogs
1196    
1197            * Thuban/Model/resource.py (ProjFileReader.start_projection)
1198            (ProjFileReader.end_projection, ProjFileSaver.write_projfile):
1199            Handle the epsg code attribute when reading or writing proj files
1200    
1201            * Thuban/UI/projdialog.py (ProjFrame._OnSave)
1202            (ProjFrame._OnAddToList, ProjFrame.__DoOnProjAvail)
1203            (ProjFrame.__FillAvailList): Use the projection's Label method to
1204            get the string for the list box
1205    
1206            * test/test_proj.py (TestProjection.test_label)
1207            (TestProjection.test_label_epsg)
1208            (TestProjection.test_epsgcode_for_non_epsg_projection)
1209            (TestProjection.test_epsgcode_for_real_epsg_projection): New tests
1210            for the label and EPSGCode methods
1211            (WriteProjFileTests.doTestWrite, WriteProjFileTests.test_write)
1212            (WriteProjFileTests.test_write_empty_file): Create the ProjFile
1213            objects in the test cases and put the expected contents into the
1214            test case methods too. Update doTestWrite accordingly
1215            (TestLoadingProjFile)
1216            (TestLoadingProjFileWithEmptyProjectionlist): New classes with the
1217            read tests from TestProjFile.
1218            (TestProjFile.doTestRead, TestProjFile.testRead): Removed. These
1219            tests are now in the new classes.
1220            (sample_projfile, sample_projfile_data)
1221            (sample_projfile2, sample_projfile_data2): Removed. Not used
1222            anymore.
1223            (TestProjFile.test_read_unreadable_file): No need to reset the
1224            permissions at the end anymore since we use a unique filename
1225    
1226    2003-10-13  Bernhard Herzog  <[email protected]>
1227    
1228            * test/test_proj.py: Some more refactoring of the test cases
1229            (ProjFileTest): New base class for the proj file tests.
1230            (TestProjFile): Derive from ProjFileTest
1231            (TestProjFile.test_read_unreadable_file)
1232            (TestProjFile.test_read_empty_file, TestProjFile.doTestRead): Use
1233            the new filename method to get a unique filename
1234            (TestProjFile.doTestWrite, TestProjFile.testWrite): Removed.
1235            (WriteProjFileTests): New class for proj file write tests.
1236            Contains the write test that were in TestProjFile originally.
1237    
1238    2003-10-13  Bernhard Herzog  <[email protected]>
1239    
1240            * test/test_proj.py (TestProjFile.testRead)
1241            (TestProjFile.test_read_non_existing_file)
1242            (TestProjFile.test_read_unreadable_file)
1243            (TestProjFile.test_read_empty_file): Split into several methods.
1244    
1245    2003-10-10  Bernhard Herzog  <[email protected]>
1246    
1247            * Thuban/UI/sizers.py: New file with custom sizers.
1248    
1249            * Thuban/UI/projdialog.py (ProjFrame.build_dialog): Instantiate
1250            all projection type specific panels and put them into a
1251            NotebookLikeSizer. This way the dialog doesn't change its size
1252            when a different projection is selected
1253            (ProjFrame.__init__): Rename projection_panels
1254            projection_panel_defs and reuse projection_panels for a list of
1255            the instantiated panels.
1256            (ProjFrame._show_proj_panel, ProjFrame.__DoOnProjAvail)
1257            (ProjFrame.__DoOnProjChoice): Changes due to the new handling of
1258            the panels
1259            (UnknownProjPanel._DoLayout): Place the newlines in the message
1260            differently to make the panel narrower.
1261            (TMPanel._DoLayout): Layout the parameters in one column.
1262    
1263    2003-10-10  Bernhard Herzog  <[email protected]>
1264    
1265            * Thuban/UI/projdialog.py (ProjFrame.build_dialog): New method
1266            that contains all the setup for the dialog's widgets, layout and
1267            event handling.
1268            (__): Call build_dialog to build the dialog.
1269            (ProjFrame.__set_properties, ProjFrame.__do_layout): Removed.
1270            Their functionality is now in build_dialog
1271            (ProjFrame.__VerifyButtons, ProjFrame.__VerifyButtons)
1272            (ProjFrame.__DoOnProjAvail, ProjFrame.__DoOnProjAvail)
1273            (ProjFrame.__DoOnProjChoice): Small updates due to slightly
1274            different widget names and hierarchy introduced with build_dialog.
1275    
1276    2003-10-10  Bernhard Herzog  <[email protected]>
1277    
1278            * README: Fix typo.
1279    
1280    2003-10-09  Bernhard Herzog  <[email protected]>
1281    
1282            * Thuban/Model/proj.py (ProjFile.Add): Do not check whether the
1283            projection is already in the list. This is *a lot* faster when
1284            loading files with hundreds of projections since it saves a linear
1285            search. OTOH this will allow adding the same projection to the
1286            user.proj file multiple times in the projection dialog but we'll
1287            deal with that later
1288    
1289    2003-10-09  Jan-Oliver Wagner <[email protected]>
1290    
1291            * devtools: New. Directory for developer tools that are not intended
1292            for the regular user.
1293    
1294            * devtools/create_epsg.py: New. Convert the epsg file of proj into
1295            a python .proj file.
1296    
1297    2003-10-09  Bernhard Herzog  <[email protected]>
1298    
1299            * test/test_proj.py
1300            (TestProjection.test_get_parameter_without_equals_sign): New. Test
1301            whether GetParameter handles parameters without "=" sign correctly
1302    
1303            * Thuban/Model/proj.py (Projection.GetParameter): Handle
1304            parameters that do not contain a "=". Update the doc-string
1305    
1306    2003-10-08  Bernhard Herzog  <[email protected]>
1307    
1308            * Thuban/UI/projdialog.py (ProjFrame.__set_properties): Remove the
1309            length limit on the projname text control
1310    
1311    2003-10-08  Bernhard Herzog  <[email protected]>
1312    
1313            * test/test_proj.py (TestProjection.test_get_projection_units_geo)
1314            (TestProjection.test_get_projection_units_normal): New. Tests for
1315            the Projection.GetProjectedUnits method
1316    
1317    2003-10-08  Jan-Oliver Wagner <[email protected]>
1318    
1319            * Thuban/Model/resource.py (get_user_proj_file): small bug-fix:
1320            Added missing 'val' parameter.
1321    
1322    2003-10-08  Bernhard Herzog  <[email protected]>
1323    
1324            * Thuban/UI/projdialog.py (ProjFrame.__DoOnProjAvail): When the
1325            projection type of the currently selected projection is not known,
1326            i.e. there's no panel for it, use the UnknownProjPanel
1327            (ProjFrame.__DoOnProjChoice, ProjFrame._show_proj_panel): Split
1328            the actual replacing of the proj panel into the new method
1329            _show_proj_panel.
1330            (UnknownProjPanel): Add doc-string.
1331            (UnknownProjPanel._DoLayout): Insert a newline into the text so
1332            that the panel is not so wide.
1333    
1334    2003-10-08  Bernhard Herzog  <[email protected]>
1335    
1336            * Thuban/Model/resource.py (read_proj_file): Return the warnings
1337            too. Update the doc-string
1338            (get_proj_files): Removed. It wasn't used anywhere
1339            (get_system_proj_files, get_system_proj_file): Rename to
1340            get_system_proj_file and return the ProjFile object and not a list
1341            of ProjFile objects. Update the callers.
1342            (get_user_proj_files, get_user_proj_file): Rename to
1343            get_user_proj_file return the ProjFile object and not a list of
1344            ProjFile objects. Update the callers.
1345            (ProjFileReader.__init__): New instance variable for the warnings.
1346            Rename the __pf ivar to projfile. Update the methods referring to
1347            __pf
1348            (ProjFileReader.end_projection): Catch any errors raised when
1349            instantiating the projection and record that as an error. The
1350            projection will not be in the final ProjFile object.
1351            (ProjFileReader.GetWarnings): New method to return the warnings.
1352    
1353            * Thuban/UI/projdialog.py (ProjFrame.show_warnings): New method to
1354            show the warnings from the projfile reader
1355            (ProjFrame._OnImport): Deal with any warnings returned by
1356            read_proj_file
1357            (ProjFrame.__FillAvailList): Deal with any warnings returned by
1358            get_system_proj_file or get_user_proj_file.
1359    
1360            * test/test_proj.py (TestProjFile.doTestRead): Check the warnings.
1361            (TestProjFileWithInvalidParameters.file_contents): New test cases
1362            to test whether read_proj_file handles invalid projection
1363            parameters correctly
1364            (TestProjFile.test_get_system_proj_file): New. Simple test for
1365            resource.get_system_proj_file
1366    
1367    2003-10-07  Bernhard Herzog  <[email protected]>
1368    
1369            * test/test_derivedshapestore.py
1370            (TestDerivedShapeStoreExceptions.tearDown): Clear the session
1371            properly so that the temporary directories get deleted correctly
1372    
1373    2003-10-06  Bernhard Herzog  <[email protected]>
1374    
1375            Handle the title changes in a proper MVC way.
1376    
1377            * Thuban/UI/mainwindow.py (MainWindow.__init__): Subscribe to the
1378            canvas' TITLE_CHANGED messages
1379            (MainWindow.update_title): New. Update the main window's title
1380            (MainWindow.__SetTitle): Removed. Use update_title instead.
1381            (MainWindow.SetMap): Use update_title instead of __SetTitle
1382            (MainWindow.RenameMap): Do change the window title explicitly
1383            here. That's handled in a proper MVC way now.
1384            (MainWindow.title_changed): New. Subscriber for the TITLE_CHANGED
1385            messages
1386    
1387            * Thuban/Lib/connector.py (Conduit): New class to help classes
1388            that forward messages
1389    
1390            * Thuban/UI/viewport.py: Forward the map's TITLE_CHANGED messages
1391            (ViewPort): Derive from Conduit instead of Publisher
1392            (ViewPort.Subscribe, ViewPort.Unsubscribe): Use the new base class
1393            when calling the inherited versions
1394            (ViewPort._subscribe_map, ViewPort._unsubscribe_map): New helper
1395            methods to subscribe and unsubscribe map messages
1396            (ViewPort.SetMap, ViewPort.Destroy): Use the new helper methods to
1397            handle the map subscriptions
1398            (ViewPort.Map, ViewPort.map_projection_changed)
1399            (ViewPort.layer_projection_changed): Add or update doc-strings
1400    
1401            * test/test_connector.py (TestPublisher.test_issue_simple): Fix
1402            typo
1403            (MyConduit): Helper class for the Conduit test.
1404            (TestConduit): Test cases for Conduit
1405    
1406            * test/test_connector.py: Use support.run_tests as main.
1407    
1408            * test/test_viewport.py (ViewPortTest.setUp): Also subscribe to
1409            the TITLE_CHANGED messages
1410            (ViewPortTest.test_forwarding_title_changed): New test to check
1411            whether the viewport forwards the map's TITLE_CHANGED messages
1412            (TestViewportWithPostGIS.tearDown): Call the map's Destroy method
1413            after the port's because the latter may require a still functional
1414            map.
1415    
1416    2003-10-06  Bernhard Herzog  <[email protected]>
1417    
1418            * Thuban/UI/application.py (ThubanApplication.maps_changed): Add
1419            doc-string
1420    
1421    2003-10-06  Bernhard Herzog  <[email protected]>
1422    
1423            * test/test_viewport.py (ViewPortTest.setUp)
1424            (SimpleViewPortTest.test_init_with_size): Move the test for the
1425            initial size as a constructor parameter from ViewPortTest.setUp
1426            method to a new separate test in SimpleViewPortTest.
1427    
1428    2003-10-06  Bernhard Herzog  <[email protected]>
1429    
1430            * test/test_viewport.py (MockView): New class derived from
1431            ViewPort with a mock implementation of GetTextExtent to be used in
1432            the test cases
1433            (ViewPortTest.setUp): Use MockView instead of ViewPort
1434    
1435            * Thuban/UI/viewport.py (ViewPort.GetTextExtent): Turn this method
1436            into what would be a "pure virtual function" in C++: always raise
1437            NotImplementedError. Mock implementations for test cases don't
1438            belong into the real code
1439    
1440    2003-10-02  Bernhard Herzog  <[email protected]>
1441    
1442            * test/test_layer.py (TestLayer.test_empty_layer): Explicitly
1443            close the dbf file we create so that it's contents have been
1444            written properly.
1445    
1446            * libraries/shapelib/shptree.c, libraries/shapelib/shpopen.c,
1447            libraries/shapelib/shapefil.h, libraries/shapelib/dbfopen.c:
1448            Update to shapelib 1.2.10
1449    
1450    2003-10-01  Jan-Oliver Wagner <[email protected]>
1451    
1452            * Thuban/UI/tree.py, Thuban/UI/main.py: Remove the #! line as
1453            it annoys lintian which warns about these files not being
1454            executable. The #! isn't necessary here since if you absolutely
1455            must execute them you can always say "python <filename>".
1456    
1457    2003-09-26  Bernhard Herzog  <[email protected]>
1458    
1459            * Thuban/Model/classgen.py (GenQuantiles0): Removed since it's
1460            only used in GREAT-ER but not used in Thuban itself. When GREAT-ER
1461            is ported to a newer the import will fail, so it should be noticed
1462            immediately that this function is gone.
1463            Fixes RT#1919
1464    
1465    2003-09-26  Bernhard Herzog  <[email protected]>
1466    
1467            Add a DTD for the projection files and make thuban write valid
1468            projection files
1469    
1470            * Resources/XML/projfile.dtd: New. DTD for thuban's projection
1471            files
1472    
1473            * Thuban/Model/resource.py (ProjFileSaver.write): Use
1474            'projectionlist' as the name in the document type declaration so
1475            that it matches the element type of the root element.
1476    
1477            * test/test_proj.py (sample_projfile, sample_projfile2): Use
1478            'projectionlist' as the name in the document type declaration just
1479            as it is done now in the files thuban would write
1480            (sample_projfile, sample_projfile_data): Fix spelling of
1481            "Mercator"
1482            (TestProjFile.doTestWrite): Validate the written and the expected
1483            XML data
1484            (TestProjFile): Derive from ValidationTest so that we can run xml
1485            validation tests
1486    
1487    2003-09-24  Bernhard Herzog  <[email protected]>
1488    
1489            * Thuban/UI/renderer.py (ExportRenderer.render_legend): Do not
1490            modify the list returned by map.Layers() in place since it is the
1491            actual list of layers used by the map.
1492    
1493    2003-09-23  Jan-Oliver Wagner <[email protected]>
1494    
1495            * Doc/manual/thuban-manual.xml: Added subsection to chapter
1496            Extensions to describe the extensions coming with the Thuban
1497            standard package (gns2shp and importAPR).
1498    
1499    2003-09-23  Bernhard Herzog  <[email protected]>
1500    
1501            * libraries/thuban/wxproj.cpp (project_point): if there's an
1502            inverse but no forward projection, convert to degrees after
1503            applying the inverse projection. Fixes RT#2096
1504    
1505            * test/test_wxproj.py: New. Test cases for wxproj.so. One test
1506            implicitly tests for the fix to RT#2096
1507    
1508            * test/support.py (FloatComparisonMixin.assertFloatSeqEqual):
1509            Check that the sequences have the same lengths
1510    
1511            * Resources/Projections/defaults.proj (Geographic projection): Use
1512            a much more precise value for the to_meter attribute.
1513    
1514    2003-09-22  Bernhard Herzog  <[email protected]>
1515    
1516            * test/support.py (initthuban): Make sure to unset the LANG env.
1517            var. so that tests that compare translated strings work. Solves RT
1518            #2094
1519    
1520    2003-09-22  Jan-Oliver Wagner <[email protected]>
1521    
1522            Small improvement of APR import.
1523    
1524            * Extensions/importAPR/test/test_apr.py (aprTest.test_LClass):
1525            Added tests for text-ranges.
1526    
1527            * Extensions/importAPR/apr.py (APR_LClass.GetThubanRange): Now
1528            returns a string object if the range is based on text.
1529    
1530            * Extensions/importAPR/importAPR.py (import_apr_dialog): Unified
1531            range retrieval.
1532    
1533    2003-09-22  Jan-Oliver Wagner <[email protected]>
1534    
1535            Initial version of the importAPR extension which is in
1536            experimental state.
1537    
1538            * /Extensions/importAPR/, /Extensions/importAPR/samples/,
1539            /Extensions/importAPR/test/: New directories.
1540    
1541            * /Extensions/importAPR/samples/README: New: Howto load the samples.
1542    
1543            * /Extensions/importAPR/samples/iceland.apr: New: A sample APR
1544            file which refers to the Thuban Iceland demo data.
1545    
1546            * /Extensions/importAPR/test/README: New: Howto execute the tests.
1547    
1548            * /Extensions/importAPR/test/test_apr.py: New: Tests for APR classes.
1549    
1550            * /Extensions/importAPR/apr.py: New: Classes for ArcView Objects
1551            as in '.apr'-files.
1552    
1553            * /Extensions/importAPR/odb.py: New: Classes for generic ArcView
1554            ODB Objects as in '.apr', '.avl' and other files.
1555    
1556            * /Extensions/importAPR/__init__.py: New: Init to make this
1557            directory a package.
1558    
1559            * /Extensions/importAPR/importAPR.py: New: Import a ArcView
1560            project file (.apr) and convert it to Thuban.
1561    
1562    2003-09-22  Jan-Oliver Wagner <[email protected]>
1563    
1564            * Extensions/gns2shp.gns2shp.py: The main module of gns2shp.
1565    
1566    2003-09-19  Jan-Oliver Wagner <[email protected]>
1567    
1568            * Doc/manual/thuban-manual.xml: Extended section 'Installation'
1569            with description on RPM installation and RPM binary package
1570            creation.
1571    
1572    2003-09-18  Bernhard Herzog  <[email protected]>
1573    
1574            * setup.py (data_files): Only add the mo files if the Locales
1575            directory actually exists, so that setup.py works with a fresh CVS
1576            checkout
1577    
1578    2003-09-12  Jan-Oliver Wagner <[email protected]>
1579    
1580            * Examples/simple_extensions/simple_tool.py: bugfix: Tool is now
1581            in viewport, not anymore in view
1582    
1583    2003-09-04  Jan-Oliver Wagner <[email protected]>
1584    
1585            Introducing first Extension (gns2shp).
1586    
1587            * Extensions, Extensions/gns2shp, Extensions/gns2shp/test: New.
1588    
1589            * Extensions/__init__.py: New. init to make this dir a package.
1590    
1591            * Extensions/gns2shp/__init__.py: New. init to make this dir a package.
1592    
1593            * Extensions/gns2shp/test/README: New. some info on this test directory.
1594    
1595            * Extensions/gns2shp/test/ls.txt: New. test data set (Liechtenstein).
1596    
1597            * Extensions/gns2shp/test/test_gns2shp.py: New. Test for correct creation
1598            of Shapefile from GNS text file format
1599    
1600    2003-09-03  Jan-Oliver Wagner <[email protected]>
1601    
1602            Fix/workaround for bug #2019:
1603            https://intevation.de/rt/webrt?serial_num=2019
1604    
1605            * Thuban/UI/identifyview.py (IdentifyView.ID_STOP): New.
1606            (IdentifyView.__init__): Added another button that allows to
1607            stop the identify mode.
1608            (IdentifyView.OnStop): New. Stops the identify mode.
1609    
1610    2003-09-03  Jan-Oliver Wagner <[email protected]>
1611    
1612            Introducing a new exception dialog that allows to exit the
1613            application immediately.
1614            This fixes bug #2060: https://intevation.de/rt/webrt?serial_num=2060
1615    
1616            * Thuban/UI/exceptiondialog.py: New. A special exception dialog.
1617    
1618            * Thuban/UI/application.py (ThubanApplication.ShowExceptionDialog):
1619            Made strings available to translations. Exchanged the simple
1620            ScrolledMessageDialog by the new ExceptionDialog.
1621    
1622    2003-09-01  Bernhard Herzog  <[email protected]>
1623    
1624            * NEWS: New. Summary of changes and release notes.
1625    
1626            * MANIFEST.in: Add NEWS
1627    
1628    2003-09-01  Bernhard Herzog  <[email protected]>
1629    
1630            * MANIFEST.in: Correct the include statement for the mo-files and
1631            include the documentation too.
1632    
1633            * setup.py (data_files): Add the .mo files
1634            (setup call): Up to version 0.9.0
1635    
1636    2003-09-01  Bernhard Herzog  <[email protected]>
1637    
1638            * Thuban/UI/dbdialog.py (ChooseDBTableDialog.__init__): Change the
1639            parameter list to just parent and session
1640            (ChooseDBTableDialog.__set_properties): Removed. Setting the
1641            selection of empty list boxes is not allowed (and produces C++
1642            assertion errors) and the rest of the setup is better done in
1643            __init__ anyway.
1644            (ChooseDBTableDialog.OnCancel, ChooseDBTableDialog.OnOK)
1645            (ChooseDBTableDialog.OnLBDClick, DBDialog.OnOK): Use the Python
1646            builtins True/False for booleans to avoid warnings from wxPython
1647    
1648            * Thuban/UI/mainwindow.py (MainWindow.AddDBLayer): Adapt to new
1649            ChooseDBTableDialog constructor parameters.
1650    
1651    2003-09-01  Bernhard Herzog  <[email protected]>
1652    
1653            * Thuban/Model/postgisdb.py
1654            (PostGISTable): Extend doc-string
1655            (PostGISTable._fetch_table_information): Set the column index
1656            correctly, pretending ignored columns don't exist.
1657    
1658            * test/test_postgis_db.py (TestPostGISIgnoredColumns): New tests
1659            for postgis tables with data types not yet supported by thuban.
1660    
1661    2003-08-29  Bernhard Herzog  <[email protected]>
1662    
1663            * HOWTO-Release: Tweak item about running the tests.
1664    
1665    2003-08-29  Jan-Oliver Wagner <[email protected]>
1666    
1667            * /Doc/manual/thuban-manual.xml: updated to version 1.0pre2.
1668    
1669    2003-08-29  Bernhard Herzog  <[email protected]>
1670    
1671            Add some missing parameters to projections. Proj complains about
1672            them on windows but for some reason not on Linux.
1673    
1674            * test/test_save.py (SaveSessionTest.testLayerProjection): Add
1675            missing required projection parameters
1676    
1677            * test/test_proj.py (TestProjFile.test): Add missing required
1678            projection parameters
1679    
1680            * test/test_load_0_8.py (TestLayerProjection.file_contents)
1681            (TestLayerProjection.test): Add missing required projection
1682            parameters and tests for them
1683    
1684            * test/test_load.py (TestLayerProjection.file_contents)
1685            (TestLayerProjection.test): Add missing required projection
1686            parameters and tests for them
1687    
1688            * test/test_layer.py (TestLayer.test_base_layer): Add missing
1689            required projection parameters
1690    
1691    2003-08-29  Bernhard Herzog  <[email protected]>
1692    
1693            * libraries/pyprojection/Projection.i: Use pj_get_errno_ref to
1694            access the pj_errno because directly accessing pj_errno doesn't
1695            work on windows if the proj library is in a DLL
1696    
1697            * libraries/pyprojection/Projection_wrap.c: Update from Projection.i
1698    
1699    2003-08-28  Bernhard Herzog  <[email protected]>
1700    
1701            * test/test_proj.py: Import things from Thuban after calling
1702            initthuban
1703    
1704            * test/test_load.py (LoadSessionTest.filenames): New class
1705            variable with the filename attributes to normalize
1706            (LoadSessionTest.check_format): Pass self.filenames to
1707            sax_eventlist to normalize the filename attributes
1708    
1709            * test/xmlsupport.py: Add cvs keywords
1710            (SaxEventLister.__init__): New parameter filenames which indicates
1711            attributes that contain filenames
1712            (SaxEventLister.startElementNS): Normalize the filename attributes
1713            with os.path.normpath
1714            (sax_eventlist): New parameter filenames to pass through to
1715            SaxEventLister
1716    
1717            * test/test_derivedshapestore.py: Make this file callable as a
1718            program to execute the tests
1719            (TestDerivedShapeStoreExceptions.test_table_with_wrong_size): Bind
1720            the session to self.session so that it gets destroyed properly
1721    
1722            * test/test_layer.py (TestLayer.tearDown): Call the session's
1723            Destroy method
1724    
1725            * test/test_map.py (TestMapBase.tearDown): Destroy self.session
1726            too if it exists
1727            (TestMapAddLayer.test_add_layer): Bind the session to self.session
1728            so that it gets destroyed properly
1729    
1730            * test/postgissupport.py (reason_for_not_running_tests): Add a
1731            test for the existence of popen2.Popen4.
1732    
1733            * test/test_save.py (SaveSessionTest.tearDown): New. Provide a
1734            reliable way to destroy the sessions created in the test cases
1735            (SaveSessionTest.test_dbf_table): Bind the session to self.session
1736            so that it gets destroyed properly
1737            (SaveSessionTest.testLayerProjection): Bind the session to
1738            self.session so that it gets destroyed properly
1739    
1740            * test/test_session.py (UnreferencedTablesTests.tearDown): Make
1741            sure that the session is destroyed properly
1742    
1743            * test/test_shapefilestore.py: Make this callable as a program to
1744            execute the tests
1745    
1746            * test/test_scalebar.py: Remove unnecessary import of _ from
1747            Thuban
1748    
1749            * test/support.py (print_garbage_information): Call initthuban
1750            here because it may be called indirectly from test cases that test
1751            test support modules which do not use anything from thuban itself
1752            (ThubanTestProgram.runTests): Remove unnecessary debug print
1753    
1754    2003-08-28  Bernhard Herzog  <[email protected]>
1755    
1756            * Thuban/version.py (longversion): Update to 0.9
1757    
1758            * Thuban/UI/mainwindow.py: Remove some unused imports
1759    
1760            * README: Add section about required additional software. Add date
1761            and revision CVS keywords
1762    
1763            * HOWTO-Release: Add item about the translations. Add date and
1764            revision CVs keywords and change formatting to match README a bit
1765            better
1766    
1767            * po/de.po: Update for 0.9
1768    
1769            * test/README: Tweak the wording a little because many tests are
1770            not really unittest.
1771    
1772    2003-08-27  Bernhard Herzog  <[email protected]>
1773    
1774            As preparation for the 0.9 release, switch thuban files to a
1775            non-dev namespace
1776    
1777            * Thuban/Model/save.py (SessionSaver.write_session): Write files
1778            with the http://thuban.intevation.org/dtds/thuban-0.9.dtd
1779            namespace
1780    
1781            * Thuban/Model/load.py (SessionLoader.__init__): Accept the
1782            http://thuban.intevation.org/dtds/thuban-0.9.dtd namespace too
1783    
1784            * test/test_save.py (SaveSessionTest.dtd)
1785            (SaveSessionTest.testEmptySession)
1786            (SaveSessionTest.testSingleLayer)
1787            (SaveSessionTest.testLayerProjection)
1788            (SaveSessionTest.testRasterLayer)
1789            (SaveSessionTest.testClassifiedLayer)
1790            (SaveSessionTest.test_dbf_table)
1791            (SaveSessionTest.test_joined_table)
1792            (SaveSessionTest.test_save_postgis): Update for new namespace
1793    
1794            * test/test_load.py (LoadSessionTest.dtd, TestSingleLayer)
1795            (TestLayerVisibility.file_contents, TestLabels.file_contents)
1796            (TestLayerProjection.file_contents)
1797            (TestRasterLayer.file_contents, TestJoinedTable.file_contents)
1798            (TestPostGISLayer.file_contents)
1799            (TestPostGISLayerPassword.file_contents)
1800            (TestLoadError.file_contents, TestLoadError.test): Update for new
1801            namespace
1802    
1803    2003-08-27  Bernhard Herzog  <[email protected]>
1804    
1805            Make the table interface distinguish between row ids (an integer
1806            that uniquely identifies a row) and row ordinals (a simple row
1807            count from 0 to NumRows() - 1)
1808    
1809            * Thuban/Model/postgisdb.py (PostGISTable.RowIdToOrdinal)
1810            (PostGISTable.RowOrdinalToId): New methods to conver between row
1811            ids and row ordinals
1812            (PostGISTable.ReadRowAsDict, PostGISTable.ReadValue): New keyword
1813            parameter row_is_ordinal to indicate whether the row parameter is
1814            the row id or the ordinal
1815    
1816            * Thuban/Model/transientdb.py (TransientTableBase.RowIdToOrdinal)
1817            (TransientTableBase.RowOrdinalToId)
1818            (AutoTransientTable.RowIdToOrdinal)
1819            (AutoTransientTable.RowOrdinalToId): Same new methods as in
1820            PostGISTable.
1821            (TransientTableBase.ReadRowAsDict, TransientTableBase.ReadValue)
1822            (AutoTransientTable.ReadRowAsDict, AutoTransientTable.ReadValue):
1823            Same new parameter as in PostGISTable.
1824    
1825            * Thuban/Model/table.py (DBFTable.RowIdToOrdinal)
1826            (DBFTable.RowOrdinalToId, MemoryTable.RowIdToOrdinal)
1827            (MemoryTable.RowOrdinalToId): Same new methods as in PostGISTable.
1828            (DBFTable.ReadValue, DBFTable.ReadRowAsDict)
1829            (MemoryTable.ReadValue, MemoryTable.ReadRowAsDict): Same new
1830            parameter as in PostGISTable.
1831    
1832            * Thuban/UI/tableview.py (DataTable.RowIdToOrdinal)
1833            (DataTable.RowOrdinalToId): New methods to convert between row ids
1834            and row ordinals.
1835            (TableGrid.SelectRowById): New method to select a row based on its
1836            ID as opposed to its ordinal
1837            (DataTable.GetValue, TableGrid.OnRangeSelect)
1838            (TableGrid.OnSelectCell, LayerTableGrid.select_shapes)
1839            (QueryTableFrame.OnQuery, QueryTableFrame.get_selected)
1840            (LayerTableFrame.__init__): Convert between row ids and row
1841            ordinals as appropriate
1842    
1843            * test/postgissupport.py (PostGISDatabase.__init__): Add
1844            doc-string.
1845            (PostGISDatabase.initdb): The optional third item in a tuple in
1846            tables is now a (key, value) list with additional arguments to
1847            pass to upload_shapefile
1848            (upload_shapefile): New parameter gid_offset to allow gids that
1849            are not the same as the shapeids in the shapefile
1850            (PostgreSQLServer.get_default_static_data_db): Use the new
1851            gid_offset to make the gids in landmarks 1000 higher than the
1852            shapeids in the shapefile
1853    
1854            * test/test_viewport.py
1855            (TestViewportWithPostGIS.test_find_shape_at_point): Adapt to the
1856            new shapeids in the landmarks table
1857    
1858            * test/test_transientdb.py
1859            (TestTransientTable.run_iceland_political_tests)
1860            (TestTransientTable.test_transient_joined_table): Add tests for
1861            the new table methods and new keywords arguments.
1862    
1863            * test/test_postgis_db.py
1864            (TestPostGISTable.test_read_row_as_dict_row_count_mode)
1865            (TestPostGISTable.test_read_value_row_count_mode)
1866            (TestPostGISTable.test_row_id_to_ordinal)
1867            (TestPostGISTable.test_row_oridnal_to_id): New test for the new
1868            table methods and the new arguments
1869            (TestPostGISShapestorePoint.test_shapes_in_region)
1870            (TestPostGISShapestorePoint.test_shape_raw_data)
1871            (TestPostGISShapestorePoint.test_shape_points)
1872            (TestPostGISShapestorePoint.test_shape_shapeid)
1873            (TestPostGISShapestorePoint.test_all_shapes)
1874            (TestPostGISTable.test_simple_query)
1875            (TestPostGISTable.test_simple_query)
1876            (TestPostGISTable.test_simple_query)
1877            (TestPostGISTable.test_read_value)
1878            (TestPostGISTable.test_read_row_as_dict): Adapt to the new
1879            shapeids in the landmarks table
1880    
1881            * test/test_memory_table.py
1882            (TestMemoryTable.test_read_row_as_dict_row_count_mode)
1883            (TestMemoryTable.test_read_value_row_count_mode)
1884            (TestMemoryTable.test_row_id_to_ordinal)
1885            (TestMemoryTable.test_row_oridnal_to_id): New test for the new
1886            table methods and the new arguments
1887    
1888            * test/test_dbf_table.py
1889            (TestDBFTable.test_read_row_as_dict_row_count_mode)
1890            (TestDBFTable.test_read_value_row_count_mode)
1891            (TestDBFTable.test_row_id_to_ordinal)
1892            (TestDBFTable.test_row_oridnal_to_id): New test for the new table
1893            methods and the new arguments
1894    
1895    2003-08-26  Bernhard Herzog  <[email protected]>
1896    
1897            * Thuban/Model/postgisdb.py (PostGISShapeStore.BoundingBox): Use a
1898            more postgis specific but much faster method to get the bounding
1899            box
1900    
1901    2003-08-26  Bernhard Herzog  <[email protected]>
1902    
1903            * Thuban/Model/postgisdb.py (PostGISTable.Title)
1904            (PostGISShapeStore.AllShapes): Add these missing methods.
1905            (PostGISShapeStore.ShapesInRegion): No need to raise
1906            StopIteration. We can simply return
1907    
1908            * test/test_postgis_db.py (TestPostGISTable.test_title)
1909            (TestPostGISShapestorePoint.test_all_shapes): New tests for the
1910            new methods
1911    
1912    2003-08-25  Bernhard Herzog  <[email protected]>
1913    
1914            * Thuban/Model/postgisdb.py (shapetype_map): Add MUTLIPOLYGON.
1915    
1916            * test/test_postgis_db.py (PolygonTests): New class containing
1917            those tests from TestPostGISShapestorePolygon that can also be
1918            used to test MUTLIPOLYGON tables
1919            (TestPostGISShapestorePolygon): Most tests are now in PolygonTests
1920            so derive from that
1921            (TestPostGISShapestoreMultiPolygon): New class with tests for
1922            MUTLIPOLYGON tables
1923    
1924            * test/postgissupport.py (PostGISDatabase.initdb): Allow the
1925            tables argument to have tuples with three items to override the
1926            WKT type used.
1927            (PostgreSQLServer.get_default_static_data_db): Use the above to
1928            create a polygon table with MUTLIPOLYGONs
1929            (point_to_wkt, coords_to_point, polygon_to_wkt, coords_to_polygon)
1930            (arc_to_wkt, coords_to_multilinestring): Rename from *_to_wkt to
1931            coords_to*
1932            (coords_to_multipolygon): New. Convert to MUTLIPOLYGON
1933            (wkt_converter): New. Map WKT types to converters
1934            (upload_shapefile): New parameter force_wkt_type to use a
1935            different WKT type than the default
1936    
1937    2003-08-25  Bernhard Herzog  <[email protected]>
1938    
1939            * Thuban/UI/application.py
1940            (ThubanApplication.run_db_param_dialog): New. Suitable as a
1941            db_connection_callback. Main difference is that the dialog run
1942            from this method doesn't have a parent so it can be used even when
1943            there is no main window
1944            (ThubanApplication.OpenSession): Use self.run_db_param_dialog if
1945            no db_connection_callback was given. This way the dialog pops up
1946            even when the .thuban file was given as a command line parameter.
1947    
1948    2003-08-25  Bernhard Herzog  <[email protected]>
1949    
1950            * Thuban/UI/view.py (MapCanvas.OnLeftUp): Release the the mouse
1951            before calling MouseLeftUp. MouseLeftUp may pop up modal dialogs
1952            which leads to an effectively frozen X session because the user
1953            can only interact with the dialog but the mouse is still grabbed
1954            by the canvas.
1955            Also, call the tool's Hide method before MouseLeftUp because
1956            MouseLeftUp may change the tool's coordinates.
1957    
1958    2003-08-25  Bernhard Herzog  <[email protected]>
1959    
1960            * Thuban/UI/application.py (ThubanApplication.OpenSession): Catch
1961            LoadCancelled exceptions and handle them by returning immediately.
1962    
1963    2003-08-25  Bernhard Herzog  <[email protected]>
1964    
1965            GUI part of loading sessions with postgis connections which may
1966            require user interaction to get passwords or updated parameters
1967    
1968            * Thuban/UI/dbdialog.py (DBDialog): Reimplement to make it look a
1969            bit nucer and be more generic.
1970            (DBFrame.OnAdd): Adapt to new DBDialog interface
1971    
1972            * Thuban/UI/application.py (ThubanApplication.OpenSession): New
1973            optional parameter db_connection_callback which is passed to
1974            load_session.
1975    
1976            * Thuban/UI/mainwindow.py (MainWindow.run_db_param_dialog): New.
1977            Suitable as a db_connection_callback
1978            (MainWindow.OpenSession): Use self.run_db_param_dialog as the
1979            db_connection_callback of the application's OpenSession method
1980    
1981    
1982    2003-08-25  Bernhard Herzog  <[email protected]>
1983    
1984            Basic loading of sessions containing postgis connections:
1985    
1986            * Thuban/Model/load.py (LoadError): Add doc-string
1987            (LoadCancelled): New exception class to indicate a cancelled load
1988            (SessionLoader.__init__): Add the db_connection_callback parameter
1989            which will be used by the loader to get updated parameters and a
1990            password for a database connection
1991            (SessionLoader.__init__): Add the new XML elements to the
1992            dispatchers dictionary
1993            (SessionLoader.check_attrs): Two new conversions, ascii to convert
1994            to a byte-string object and idref as a generic id reference
1995            (SessionLoader.start_dbconnection)
1996            (SessionLoader.start_dbshapesource): New. Handlers for the new XML
1997            elements
1998            (load_session): Add the db_connection_callback to pass through the
1999            SessionLoader
2000    
2001            * test/test_load.py (TestPostGISLayer, TestPostGISLayerPassword):
2002            New classes to test loading of sessions with postgis database
2003            connections.
2004    
2005    2003-08-25  Bernhard Herzog  <[email protected]>
2006    
2007            * Thuban/UI/mainwindow.py (__ThubanVersion__): Remove this and
2008            replace it and the comment with __BuildDate__ by the Source: and
2009            Id: cvs keywords as used in the other files.
2010    
2011    2003-08-25  Bernhard Herzog  <[email protected]>
2012    
2013            * Thuban/Model/load.py (SessionLoader.check_attrs): Raise a
2014            LoadError when a required attribute is missing. The code used to
2015            be commented out for some reason, but probably should have been
2016            active.
2017    
2018            * test/test_load.py (TestLoadError.test): Test the message in the
2019            LoadError too to make sure it really is about the missing
2020            attribute
2021    
2022    2003-08-22  Bernhard Herzog  <[email protected]>
2023    
2024            * test/test_save.py (SaveSessionTest.test_dbf_table)
2025            (SaveSessionTest.test_joined_table): Add XML validation tests.
2026    
2027    2003-08-22  Bernhard Herzog  <[email protected]>
2028    
2029            Implement saving a session with a postgis connection
2030    
2031            * Resources/XML/thuban-0.9.dtd (dbconnection, dbshapesource) New
2032            elements for database connections and shapestores using db
2033            connections
2034            (session): Add the dbconnections to the content model
2035    
2036            * Thuban/Model/save.py (SessionSaver.write_db_connections): New.
2037            Write the db connections
2038            (SessionSaver.write_session): Call write_db_connections to write
2039            the connection before the data sources
2040            (SessionSaver.write_data_containers): Handle postgis shapestores
2041    
2042            * test/test_save.py (SaveSessionTest.thubanids)
2043            (SaveSessionTest.thubanidrefs): Update for new DTD
2044            (SaveSessionTest.test_save_postgis): New. Test saving a session
2045            with postgis connections
2046    
2047            * Thuban/Model/postgisdb.py (PostGISTable.DBConnection)
2048            (PostGISTable.TableName): New accessor methods for the connection
2049            and table name
2050    
2051            * test/test_postgis_db.py (TestPostGISTable.test_dbconn)
2052            (TestPostGISTable.test_dbname): New methods to test the new
2053            PostGISConnection methods
2054    
2055    2003-08-22  Bernhard Herzog  <[email protected]>
2056    
2057            * Thuban/Model/postgisdb.py (ConnectionError): New exception class
2058            for exceptions occurring when establishing a Database connection
2059            (PostGISConnection.connect): Catch psycopg.OperationalError during
2060            connects and raise ConnectionError.
2061    
2062            * test/test_postgis_db.py (TestPostgisDBExceptions): New class for
2063            tests for database exceptions
2064    
2065    2003-08-22  Bernhard Herzog  <[email protected]>
2066    
2067            Prepare the test suite for tests with required authentication
2068    
2069            * test/postgissupport.py (PostgreSQLServer.__init__): Add instance
2070            variables with two predefined users/passwords, one for the admin
2071            and one for a non-privileged user.
2072            (PostgreSQLServer.createdb): Pass the admin name to initdb and add
2073            the non-privileged user to the database and set the admin password
2074            (PostgreSQLServer.wait_for_postmaster): Use the admin user name.
2075            Better error reporting
2076            (PostgreSQLServer.connection_params)
2077            (PostgreSQLServer.connection_string): New methods to return
2078            information about how to connect to the server
2079            (PostgreSQLServer.execute_sql): New. Convenience method to execute
2080            SQL statements
2081            (PostgreSQLServer.require_authentication): Toggle whether the
2082            server requires authentication
2083            (PostgreSQLServer.create_user, PostgreSQLServer.alter_user): New.
2084            Add or alter users
2085            (PostGISDatabase.initdb): Pass the admin name one the
2086            subprocesses' command lines. Grant select rights on
2087            geometry_columns to everybody.
2088            (upload_shapefile): Use the admin name and password when
2089            connecting. Grant select rights on the new table to everybody.
2090    
2091            * test/test_viewport.py (TestViewportWithPostGIS.setUp): Use the
2092            server's new methods to get the connection parameters.
2093    
2094            * test/test_postgis_session.py (TestSessionWithPostGIS.setUp)
2095            (TestSessionWithPostGIS.test_remove_dbconn_exception): Use the
2096            server's new methods to get the connection parameters.
2097    
2098            * test/test_postgis_db.py
2099            (TestPostGISConnection.test_gis_tables_empty)
2100            (TestPostGISConnection.test_gis_tables_non_empty)
2101            (PostGISStaticTests.setUp): Use the server's new methods to get
2102            the connection parameters.
2103    
2104    2003-08-22  Bernhard Herzog  <[email protected]>
2105    
2106            * Thuban/UI/about.py (About.__init__): Add the psycopg version.
2107    
2108            * Thuban/version.py: Add psycopg version
2109    
2110            * Thuban/Model/postgisdb.py (psycopg_version): New. Return the
2111            version of the psycopg module
2112    
2113    2003-08-22  Bernhard Herzog  <[email protected]>
2114    
2115            * Thuban/UI/dbdialog.py (DBPwdDlg): Removed because it's not used.
2116            (DBFrame.OnEdit): Removed because it's not used and wouldn't work
2117            at the moment. The functionality should probably be implemented
2118            some time, though.
2119            (DBFrame.OnRemove): Display a message if the connection can't be
2120            removed because it's still in use.
2121    
2122    2003-08-22  Jan-Oliver Wagner <[email protected]>
2123    
2124            * Thuban/UI/about.py (About.__init__): split up the huge about
2125            text into elements/lists for easier translation. This fixes bug
2126            https://intevation.de/rt/webrt?serial_num=2058
2127            Also, made some forgotten string available for the i18n.
2128    
2129    2003-08-21  Bernhard Herzog  <[email protected]>
2130    
2131            Make postgis support really optional including insensitive menu
2132            items.
2133    
2134            * Thuban/Model/postgisdb.py (has_postgis_support): New. Return
2135            whether the postgis is supported.
2136    
2137            * Thuban/UI/dbdialog.py: Put the psycopg import into try..except
2138            to make postgis support optional
2139    
2140            * Thuban/UI/mainwindow.py (_has_postgis_support): New. Context
2141            version of Thuban.Model.postgisdb.has_postgis_support
2142            (database_management command): Make it only sensitive if postgis
2143            is supported.
2144    
2145    2003-08-21  Jan-Oliver Wagner <[email protected]>
2146    
2147            * Doc/manual/thuban-manual.xml: Added CVS revision for rev-history.
2148            (section Adding and Removing Layers): Added text and described
2149            multi-selection.
2150            (chapter Extensions): New.
2151    
2152    2003-08-21  Jan-Oliver Wagner <[email protected]>
2153    
2154            * Thuban/UI/mainwindow.py (MainWindow.AddLayer): Changed dialog
2155            settings to allow multiple files to load into the map.
2156            Also reduced selection to *.shp as a default.
2157    
2158    2003-08-20  Bernhard Herzog  <[email protected]>
2159    
2160            Add dialogs and commands to open database connections and add
2161            database layers.
2162    
2163            * Thuban/UI/mainwindow.py (MainWindow.DatabaseManagement): New
2164            method to open the database connection management dialog
2165            (MainWindow.AddDBLayer): New method to add a layer from a database
2166            (_has_dbconnections): New helper function to use for sensitivity
2167            (database_management command, layer_add_db command): New commands
2168            that call the above new methods.
2169            (main_menu): Add the new commands to the menu.
2170    
2171            * Thuban/Model/postgisdb.py (PostGISConnection.__init__)
2172            (PostGISConnection.connect): Establish the actual connection in a
2173            separate method and call it in __init__. This makes it easier to
2174            override the behavior in test cases
2175            (PostGISConnection.BriefDescription): New method to return a brief
2176            description for use in dialogs.
2177    
2178            * test/test_postgis_db.py (NonConnection): DB connection that
2179            doesn't actually connect
2180            (TestBriefDescription): New class with tests for the new
2181            BriefDescription method
2182    
2183    2003-08-19  Jan-Oliver Wagner <[email protected]>
2184    
2185            Moved anything from extensions to libraries.
2186    
2187            * libraries: New.
2188    
2189            * libraries/ pyprojection, pyshapelib, shapelib, thuban: New.
2190    
2191            * libraries/pyprojection/ LICENSE, MANIFEST.in, Projection.i,
2192            Projection.py, Projection_wrap.c, setup.py, swighelp.txt: These files have
2193            been moved here from thuban/extensions/pyprojection/
2194            See there in the Attic for the older history.
2195    
2196            * libraries/pyshapelib/ COPYING, ChangeLog, NEWS, README, dbflib.i,
2197            dbflib.py, dbflib_wrap.c, pyshapelib_api.h, pytest.py, setup.py,
2198            shapelib.i, shapelib.py, shapelib_wrap.c, shptreemodule.c: These files
2199            have been moved here from thuban/extensions/pyshapelib/
2200            See there in the Attic for the older history.
2201    
2202            * libraries/shapelib/ dbfopen.c, shapefil.h, shpopen.c, shptree.c: These
2203            files have been moved here from thuban/extensions/shapelib/
2204            See there in the Attic for the older history.
2205    
2206            * libraries/thuban/ bmpdataset.cpp, cpl_mfile.cpp, cpl_mfile.h,
2207            gdalwarp.cpp, wxproj.cpp: These files have been moved here from
2208            thuban/extensions/thuban/
2209            See there in the Attic for the older history.
2210    
2211            * MANIFEST.in, setup.cfg, setup.py: renamed extensions to libraries.
2212    
2213            * extensions/thuban/ bmpdataset.cpp, cpl_mfile.cpp, cpl_mfile.h,
2214            gdalwarp.cpp, wxproj.cpp: Moved to libraries/thuban.
2215    
2216            * extensions/shapelib/ dbfopen.c, shapefil.h, shpopen.c, shptree.c:
2217            Moved to libraries/shapelib.
2218    
2219            * extensions/pyshapelib/ COPYING, NEWS, dbflib.py, pytest.py,
2220            shapelib.py, README, dbflib_wrap.c, setup.py, shapelib_wrap.c,
2221            ChangeLog, dbflib.i, pyshapelib_api.h, shapelib.i, shptreemodule.c:
2222            Moved to libraries/pyshapelib.
2223    
2224            * extensions/pyprojection/ MANIFEST.in, Projection.py, setup.py,
2225            LICENSE, Projection.i, Projection_wrap.c, swighelp.txt:
2226            Moved to libraries/pyprojection.
2227    
2228            * extensions/ pyprojection, pyshapelib, shapelib, thuban: Removed.
2229    
2230            * extensions: Removed.
2231    
2232    2003-08-19  Bernhard Herzog  <[email protected]>
2233    
2234            * test/test_viewport.py (ViewPortTest): We don't use the
2235            facilities of FileTestMixin so don't derive from it.
2236            (TestViewportWithPostGIS): New class with tests for using a
2237            viewport on a map with postgis layers.
2238    
2239    2003-08-19  Bernhard Herzog  <[email protected]>
2240    
2241            Add the db connection management to the session.
2242    
2243            * Thuban/Model/session.py (Session.__init__): New instance
2244            variable db_connections
2245            (Session.AddDBConnection, Session.DBConnections)
2246            (Session.HasDBConnections, Session.CanRemoveDBConnection)
2247            (Session.RemoveDBConnection): New methods to manage and query the
2248            db connections managed by the session
2249            (Session.OpenDBShapeStore): New method to open a shapestore from a
2250            db connection
2251    
2252            * Thuban/Model/messages.py (DBCONN_REMOVED, DBCONN_ADDED): New
2253            messages for the db connection handling in the session
2254    
2255            * test/test_postgis_session.py: New. test cases for the session's
2256            db connection handling with postgis connections
2257    
2258    2003-08-19  Bernhard Herzog  <[email protected]>
2259    
2260            Add very basic postgis database support and the corresponding test
2261            cases. The test cases require a PostgreSQL + postgis installation
2262            but no existing database. The database will be created
2263            automatically by the test cases
2264    
2265            * test/README: Add note about skipped tests and the requirements
2266            of the postgis tests.
2267    
2268            * Thuban/Model/postgisdb.py: New. Basic postgis database support.
2269    
2270            * test/test_postgis_db.py: New. Test cases for the postgis
2271            support.
2272    
2273            * Thuban/Model/wellknowntext.py: New. Parser for well-known-text
2274            format
2275    
2276            * test/test_wellknowntext.py: New. Test cases for the
2277            wellknowntext parser
2278    
2279            * test/postgissupport.py: New. Support module for tests involving
2280            a postgis database.
2281    
2282            * test/support.py (execute_as_testsuite): Shut down the postmaster
2283            if it's still running after the tests
2284    
2285            * Thuban/Model/data.py (RAW_WKT): New constant for raw data in
2286            well known text format
2287    
2288    2003-08-19  Jan-Oliver Wagner <[email protected]>
2289    
2290            * Examples/simple_extensions/hello_world.py: New. Raises a Hello World
2291            message dialog.
2292    
2293    2003-08-18  Bernhard Herzog  <[email protected]>
2294    
2295            * test/support.py (ThubanTestResult.printErrors): Indent the
2296            reason for the skips in the output to make it a bit more readable.
2297            (execute_as_testsuite): New helper function to run a test suite
2298            and print some more information.
2299            (run_tests): Use execute_as_testsuite to run the tests
2300    
2301            * test/runtests.py (main): Use execute_as_testsuite to run the
2302            tests
2303    
2304    2003-08-18  Bernhard Herzog  <[email protected]>
2305    
2306            Fix some bugs in Thuban and the test suite that were uncovered by
2307            changes introduced in Python 2.3:
2308    
2309            * Thuban/Model/table.py (DBFTable.__init__): Make sure the
2310            filename is an absolute name
2311    
2312            * Thuban/Model/layer.py (RasterLayer.__init__): Make sure the
2313            filename is an absolute name
2314    
2315            * test/test_save.py (SaveSessionTest.testRasterLayer): Use a
2316            unique filename to save to and use the correct relative filename
2317            in the expected output.
2318            (SaveSessionTest.test_dbf_table): Use the correct relative
2319            filename in the expected output.
2320    
2321            * test/test_layer.py (TestLayer.test_raster_layer): Update the
2322            test to check whether the filename is absolute.
2323    
2324    2003-08-18  Jan-Oliver Wagner <[email protected]>
2325    
2326            * Thuban/UI/about.py (About.__init__): Added Silke Reimer.
2327    
2328    2003-08-15  Bernhard Herzog  <[email protected]>
2329    
2330            Change the way shapes are returned by a shape store. The
2331            ShapesInRegion method returns an iterator over actual shape
2332            objects instead of a list of shape ids.
2333    
2334            * Thuban/Model/data.py (ShapefileShape.ShapeID): New. Return shape
2335            id.
2336            (ShapefileStore.ShapesInRegion): Return an iterator over the
2337            shapes which yields shape objects instead of returning a list of
2338            shape ids
2339            (ShapefileStore.AllShapes): New. Return an iterator over all
2340            shapes in the shape store
2341            (DerivedShapeStore.AllShapes): New. Like in ShapefileStore
2342    
2343            * Thuban/Model/layer.py (Layer.ShapesInRegion): Update
2344            doc-string.
2345    
2346            * Thuban/UI/baserenderer.py
2347            (BaseRenderer.layer_ids, BaseRenderer.layer_shapes): Rename to
2348            layer_shapes and make it return an iterator containg shapes
2349            instead of a list of ids.
2350            (BaseRenderer.draw_shape_layer): Update doc-string; Adapt to
2351            layer_shapes() change
2352    
2353            * Thuban/UI/renderer.py (ScreenRenderer.layer_ids)
2354            (ScreenRenderer.layer_shapes): Rename as in BaseRenderer
2355    
2356            * Thuban/UI/viewport.py (ViewPort._find_shape_in_layer): Adapt to
2357            changes in the ShapesInRegion return value.
2358            (ViewPort._get_hit_tester): Remove commented out code
2359    
2360            * test/mockgeo.py (SimpleShapeStore.ShapesInRegion): Adapt to the
2361            new return value.
2362            (SimpleShapeStore.AllShapes): New. Implement this method too.
2363    
2364            * test/test_layer.py (TestLayer.test_arc_layer)
2365            (TestLayer.test_polygon_layer, TestLayer.test_point_layer)
2366            (TestLayer.test_point_layer_with_projection)
2367            (TestLayer.test_derived_store): Adapt to changes in the
2368            ShapesInRegion return value.
2369    
2370            * test/test_shapefilestore.py
2371            (TestShapefileStoreArc.test_shapes_in_region)
2372            (TestShapefileStorePolygon.test_shapes_in_region)
2373            (TestShapefileStorePoint.test_shapes_in_region): Adapt to changes
2374            in the ShapesInRegion return value.
2375            (TestShapefileStorePoint.test_all_shapes)
2376            (TestShapefileStoreArc.test_shape_shapeid): New tests for the new
2377            methods
2378    
2379            * test/test_derivedshapestore.py
2380            (TestDerivedShapeStore.test_shapes_in_region): Adapt to changes in
2381            the ShapesInRegion return value.
2382            (TestDerivedShapeStore.test_all_shapes)
2383            (TestDerivedShapeStore.test_shape_shapeid): New tests for the new
2384            methods
2385    
2386    2003-08-15  Bernhard Herzog  <[email protected]>
2387    
2388            Make the renderers deal correctly with raw vs. python level
2389            representation of shape geometries
2390    
2391            * Thuban/UI/baserenderer.py (BaseRenderer.low_level_renderer):
2392            Return a flag useraw in addition to the callable and the parameter
2393            to indicate whether the callable can deal with the raw shape data
2394            or uses the higher level python lists of coordinates. The callable
2395            now should accept either the raw data or the return value of the
2396            shape's Points() method.
2397            (BaseRenderer.draw_shape_layer): Adapt to the low_level_renderer
2398            change
2399            (BaseRenderer.projected_points): Instead of the shape id use the
2400            points list as parameter.
2401            (BaseRenderer.draw_polygon_shape, BaseRenderer.draw_arc_shape)
2402            (BaseRenderer.draw_point_shape): Adapt to projected_points()
2403            change and accept the points list as parameter instead of the
2404            shape id.
2405    
2406            * Thuban/UI/renderer.py (MapRenderer.low_level_renderer): Return
2407            the useraw flag as required by the BaseRenderer
2408            (ScreenRenderer.draw_shape_layer): Adapt to low-level renderer
2409            changes.
2410    
2411            * test/test_baserenderer.py
2412            (TestBaseRenderer.test_point_with_classification): New test for
2413            rendering a map with classifications.
2414    
2415    2003-08-15  Bernhard Herzog  <[email protected]>
2416    
2417            * Thuban/UI/viewport.py (ViewPort.find_shape_at)
2418            (ViewPort._find_shape_in_layer, ViewPort._find_shape_in_layer)
2419            (ViewPort._get_hit_tester, ViewPort.projected_points)
2420            (ViewPort._hit_point, ViewPort._hit_arc, ViewPort._hit_polygon)
2421            (ViewPort._find_label_at): Split the find_shape_at method into
2422            several new methods and use the functions in the hit-test module.
2423    
2424            * Thuban/UI/hittest.py: New module with Python-level hit-testing
2425            functions
2426    
2427            * test/test_hittest.py: New. Test for the new hittest module
2428    
2429    2003-08-15  Bernhard Herzog  <[email protected]>
2430    
2431            * Thuban/Model/layer.py (Layer.ShapesInRegion): Apply the layer
2432            projection to all corners of the bounding box to get a better
2433            approximation of the projected bounding box
2434    
2435            * test/test_layer.py (TestLayer.test_point_layer_with_projection):
2436            New. Test coordinate handling of a layer with a projection.
2437            Catches the bug fixed in Layer.ShapesInRegion
2438    
2439    2003-08-15  Bernhard Herzog  <[email protected]>
2440    
2441            Move some of the mock objects in test_baserenderer into their own
2442            module so they can easily be used from other tests
2443    
2444            * test/mockgeo.py: New test helper module with some mock objects
2445            for geometry related things like shapes, shapestores and
2446            projections.
2447    
2448            * test/test_mockgeo.py: New. Tests for the new helper module
2449    
2450            * test/test_baserenderer.py: Some of the mock-objects are in
2451            mockgeo now.
2452    
2453    2003-08-12  Jan-Oliver Wagner <[email protected]>
2454    
2455            * Thuban/UI/about.py (About.__init__): Added Bj�rn Broscheit.
2456    
2457    2003-08-12  Bernhard Herzog  <[email protected]>
2458    
2459            * po/de.po: New. German translations by Bjoern Broscheit
2460    
2461    2003-08-12  Bernhard Herzog  <[email protected]>
2462    
2463            * Thuban/UI/projdialog.py (UnknownProjPanel._DoLayout): Translated
2464            strings have to be one string literal.
2465    
2466    2003-08-11  Bernhard Herzog  <[email protected]>
2467    
2468            * test/support.py (FloatComparisonMixin.assertPointListEquals):
2469            New. This method was used in various derived classes, but it's
2470            better to have it here.
2471    
2472            * test/test_shapefilestore.py
2473            (ShapefileStoreTests.assertPointListEquals): Removed. It's now in
2474            FloatComparisonMixin
2475    
2476            * test/test_layer.py (TestLayer.assertPointListEquals): Removed.
2477            It's now in FloatComparisonMixin
2478    
2479            * test/test_derivedshapestore.py
2480            (TestDerivedShapeStore.assertPointListEquals): Removed. It's now
2481            in FloatComparisonMixin
2482    
2483    2003-08-11  Bernhard Herzog  <[email protected]>
2484    
2485            * Thuban/UI/join.py (JoinDialog.OnJoin): Add missing space to
2486            error message
2487    
2488    2003-08-08  Jan-Oliver Wagner <[email protected]>
2489    
2490            * Doc/manual/thuban-manual.xml: Now use authorgroup. Added revhistory
2491            with version number.
2492            Changed title to reflect version number of Thuban.
2493    
2494    2003-08-08  Jan-Oliver Wagner <[email protected]>
2495    
2496            * Thuban/UI/about.py (About.__init__): Reworked the hall of fame. Now
2497            the list corresponds to the "About" web page.
2498    
2499    2003-08-08  Bernhard Herzog  <[email protected]>
2500    
2501            * Thuban/UI/projdialog.py (UTMProposeZoneDialog.dialogLayout):
2502            Make sure translated strings are recognized as one string literal.
2503    
2504            * Thuban/UI/proj4dialog.py (UTMProposeZoneDialog.dialogLayout):
2505            Make sure translated strings are recognized as one string literal.
2506    
2507            * Thuban/UI/classgen.py (ClassGenDialog.OnOK): Make sure
2508            translated strings are recognized as one string literal.
2509    
2510            * Thuban/UI/application.py (ThubanApplication.OpenSession): Make
2511            sure translated strings are recognized as one string literal.
2512    
2513    2003-08-07  Bernhard Herzog  <[email protected]>
2514    
2515            * Thuban/Model/data.py (DerivedShapeStore.RawShapeFormat): New.
2516            Simply delegates to the original shapestore.
2517    
2518            * test/test_derivedshapestore.py
2519            (TestDerivedShapeStore.test_raw_format): New. Test case for
2520            DerivedShapeStore.RawShapeFormat
2521    
2522    2003-08-07  Bernhard Herzog  <[email protected]>
2523    
2524            Add raw data interface to shape objects.
2525    
2526            * Thuban/Model/data.py (ShapefileShape, Shape): Rname the shape
2527            class to ShapefileShape which now holds shapefile specific
2528            information.
2529            (ShapefileShape.compute_bbox): Simplified to not cache any
2530            information. The way this method is used that shouldn't matter
2531            performance wise.
2532            (ShapefileShape.RawData): New. Return the shapeid which is the raw
2533            data format for shapes from shapefiles.
2534            (ShapefileStore.RawShapeFormat): New. Return the raw datatype used
2535            in the shape objects returned by a shapestore. For a
2536            ShapefileStore this is always RAW_SHAPEFILE.
2537            (RAW_PYTHON, RAW_SHAPEFILE): Constants for the RawShapeFormat
2538            method.
2539    
2540            * test/test_shapefilestore.py
2541            (TestShapefileStore.test_raw_format): New test to test the raw
2542            format feature of shapes.
2543    
2544            * Thuban/Model/layer.py: Remove the unused import of Shape from
2545            data. It was only there for interface compatibility but it's not
2546            used inside of Thuban and the generic Shape class has gone away.
2547    
2548            * Thuban/UI/renderer.py (MapRenderer.low_level_renderer): Check
2549            the raw data format and only use an optimized version of its a
2550            shapefile.
2551    
2552    2003-08-07  Bernhard Herzog  <[email protected]>
2553    
2554            * test/test_baserenderer.py (SimpleShape): Shape class for the
2555            tests.
2556            (SimpleShapeStore.Shape): Use SimpleShape instead of
2557            Thuban.Model.data.Shape to make the tests independed of the coming
2558            changes.
2559    
2560    2003-08-07  Bernhard Herzog  <[email protected]>
2561    
2562            * test/support.py (SkipTest, ThubanTestResult, ThubanTestRunner)
2563            (ThubanTestProgram): New classes that extend the respective
2564            classes from unittest. These new version support skipping tests
2565            under certain expected conditions. In the Thuban test suite we
2566            uses this for tests that require the optional gdal support.
2567            (run_tests): Use ThubanTestProgram instead of the unittest.main()
2568    
2569            * test/runtests.py (main): Use the new ThubanTestRunner instead of
2570            the normal one from unittest
2571    
2572            * test/test_layer.py (TestLayer.test_raster_layer): If this test
2573            is not run because gdal support isn't available report this to the
2574            runner.
2575    
2576            * test/test_baserenderer.py
2577            (TestBaseRenderer.test_raster_no_projection): Do not run this test
2578            if gdal support isn't available and report this to the runner.
2579    
2580    2003-08-06  Bernhard Herzog  <[email protected]>
2581    
2582            Rearrange the renderers a bit, partly in preparation for changes
2583            required for the postgis merge, partly to make it more testable.
2584            Also make the representation of coordinates in Shapes more
2585            consistent.
2586    
2587            * Thuban/UI/renderer.py (MapRenderer): Most of the code/methods in
2588            this class is now in BaseRenderer. This class is now practically
2589            only a specialization of BaseRenderer for rendering to an actual
2590            wx DC.
2591            (ScreenRenderer.draw_shape_layer): Use self.low_level_renderer()
2592            to get the shapetype specific rendering functions.
2593    
2594            * Thuban/UI/baserenderer.py: New file with the basic rendering
2595            logic. The code in this file is completely independend of wx.
2596            (BaseRenderer): Class with the basic rendering logic
2597    
2598            * test/test_baserenderer.py: New. Test cases for BaseRenderer
2599    
2600            * Thuban/UI/view.py (MapCanvas.__init__): New instance variable
2601            error_on_redraw to guard agains endless loops and stack overflows
2602            when there's a bug in the rendering code that raises exceptions.
2603            (MapCanvas.OnIdle, MapCanvas._do_redraw): Split the actual
2604            rendering into a separate method _do_redraw so that error handling
2605            is a bit easier. When an exception occurs, set error_on_redraw to
2606            true. When it's true on entry to OnIdle do nothing and return
2607            immediately.
2608    
2609            * Thuban/Model/data.py (ShapefileStore.Shape): For consistency, a
2610            Shape object will always have the coordinates as a list of list of
2611            coordinate pairs (tuples).
2612            (Shape.compute_bbox): Adapt to new representation.
2613    
2614            * Thuban/UI/viewport.py (ViewPort.find_shape_at)
2615            (ViewPort.LabelShapeAt): Adapt to new coordinate representation in
2616            Shape objects.
2617    
2618            * test/test_shapefilestore.py
2619            (ShapefileStoreTests.assertFloatTuplesEqual)
2620            (ShapefileStoreTests.assertPointListEquals): Rename to
2621            assertPointListEquals and change purpose to checking equality of
2622            the lists returned by Shape.Points().
2623            (TestShapefileStoreArc.test_shape)
2624            (TestShapefileStorePolygon.test_shape)
2625            (TestShapefileStorePoint.test_shape): Use the new
2626            assertPointListEquals instead of assertFloatTuplesEqual
2627    
2628            * test/test_layer.py (TestLayer.assertFloatTuplesEqual)
2629            (TestLayer.assertPointListEquals): Rename to assertPointListEquals
2630            and change purpose to checking equality of the lists returned by
2631            Shape.Points().
2632            (TestLayer.test_arc_layer, TestLayer.test_arc_layer)
2633            (TestLayer.test_polygon_layer, TestLayer.test_point_layer)
2634            (TestLayer.test_derived_store): Use the new assertPointListEquals
2635            instead of assertFloatTuplesEqual
2636    
2637            * test/test_derivedshapestore.py
2638            (TestDerivedShapeStore.assertFloatTuplesEqual)
2639            (TestDerivedShapeStore.assertPointListEquals): Rename to
2640            assertPointListEquals and change purpose to checking equality of
2641            the lists returned by Shape.Points().
2642            (TestDerivedShapeStore.test_shape): Use the new
2643            assertPointListEquals instead of assertFloatTuplesEqual
2644    
2645    2003-08-06  Jan-Oliver Wagner <[email protected]>
2646    
2647            * Thuban/UI/projdialog.py (UTMPanel._OnPropose): Added test for
2648            a bounding box. A dialog is raised in case, no bounding box
2649            is found. This fixes bug #2043:
2650            https://intevation.de/rt/webrt?serial_num=2043
2651    
2652    2003-08-05  Bernhard Herzog  <[email protected]>
2653    
2654            * Thuban/Model/color.py (Color.__repr__): Make the repr of a color
2655            object look like a Color instantiation. Formerly it looked like a
2656            tuple.
2657    
2658            * test/test_color.py (TestColor.test_repr)
2659            (TestColor.test_equality, TestColor.test_inequality): New. test
2660            some more apects of the Color class
2661            (TestTransparent.test_repr, TestTransparent.test_hex)
2662            (TestTransparent.test_equality): New. Test cases for the
2663            Transparent object.
2664    
2665    2003-08-04  Jan-Oliver Wagner <[email protected]>
2666    
2667            * Doc/manual/thuban-manual.xml: a number of small improvements.
2668            The resulting file is the version submitted for GREAT-ER II.
2669    
2670    2003-08-01  Bernhard Herzog  <[email protected]>
2671    
2672            * Thuban/UI/resource.py, Thuban/UI/projdialog.py,
2673            Thuban/UI/join.py, Thuban/UI/classgen.py, Thuban/UI/about.py,
2674            Thuban/Model/resource.py: Insert cvs keywords and doc-strings.
2675    
2676            * Thuban/UI/common.py: Insert cvs keywords and doc-strings.
2677            (Color2wxColour, wxColour2Color, ThubanBeginBusyCursor)
2678            (ThubanEndBusyCursor): Add doc-strings
2679    
2680    2003-08-01  Bernhard Herzog  <[email protected]>
2681    
2682            First step towards PostGIS integration. More abstraction by movin
2683            more code from the layer to the shapestore. More methods of the
2684            layer are now simply delegated to the equivalent method of the
2685            shapestore. The SHAPETYPE_* constants are now in data not in
2686            layer.
2687    
2688            * Thuban/Model/data.py (SHAPETYPE_POLYGON, SHAPETYPE_ARC)
2689            (SHAPETYPE_POINT, Shape): Move these constants and classes from
2690            layer.py to data.py
2691            (ShapefileStore.__init__): More Initialization for the new methods
2692            and functionality.
2693            (ShapefileStore.ShapeType, ShapefileStore.NumShapes)
2694            (ShapefileStore.BoundingBox, ShapefileStore.ShapesInRegion)
2695            (ShapefileStore.Shape): New methods that were formerly implemented
2696            in the layer.
2697            (DerivedShapeStore.Shape, DerivedShapeStore.ShapesInRegion)
2698            (DerivedShapeStore.ShapeType, DerivedShapeStore.NumShapes)
2699            (DerivedShapeStore.BoundingBox): New. DerivedShapeStore
2700            equivalents of the new shape methods. These versions are simply
2701            delegated to the original shapstore.
2702    
2703            * Thuban/Model/layer.py (SHAPETYPE_POLYGON, SHAPETYPE_ARC)
2704            (SHAPETYPE_POINT, Shape): Removed. They're now in data.py
2705            (Layer.SetShapeStore): Removed the initializatin of instance
2706            variables that were needed for the stuff that's now in
2707            ShapefileStore
2708            (Layer.BoundingBox, Layer.NumShapes, Layer.ShapeType)
2709            (Layer.Shape, Layer.ShapesInRegion): Simply delegate to the
2710            shapestore.
2711    
2712            * Thuban/UI/classifier.py, Thuban/UI/renderer.py,
2713            Thuban/UI/viewport.py: Import the SHAPETYPE_* constants from data
2714            instead of layer.
2715    
2716            * test/test_shapefilestore.py: New. Tests for ShapefileStore.
2717    
2718            * test/test_derivedshapestore.py: New. Tests for DerivedShapeStore.
2719    
2720            * test/test_layer.py: Import the SHAPETYPE_* constants from data
2721            instead of layer.
2722            (TestLayer.test_derived_store): Remove the test for the exception
2723            when instantiating the DerivedShapeStore with an incompatible
2724            table which is now in test_derivedshapestore.py. Add some more
2725            tests of the layer methods to determine whether they work for a
2726            DerivedShapeStore as well.
2727    
2728    2003-07-31  Jonathan Coles   <[email protected]>
2729    
2730            * Doc/manual/thuban-manual.xml: Fix the list of required packages
2731            by just listing the name and where they can be found.
2732    
2733    2003-07-31  Frank Koormann   <[email protected]>
2734    
2735            * Doc/manual/thuban-manual.xml:
2736            Changed the screenshot elements to figure.
2737            Changed some variablelist elements to itemizedlist.
2738            Added section on GDAL formats.
2739    
2740    2003-07-31  Jonathan Coles   <[email protected]>
2741    
2742            * Doc/manual/thuban-manual.xml: Added a few sentences about
2743            the Fix Border Color option when generating classes.
2744    
2745    2003-07-30  Jonathan Coles   <[email protected]>
2746    
2747            * Thuban/Model/classgen.py: Add docstrings. Rename specific
2748            Ramp instances to use lower_case_style.
2749    
2750            * Thuban/UI/classgen.py: Use renamed Ramp instances.
2751            
2752            * Thuban/UI/classifier.py: Add docstrings.
2753    
2754            * Thuban/UI/dock.py: Add docstrings.
2755    
2756            * test/test_classgen.py: Use renamed Ramp instances.
2757    
2758    2003-07-30  Bernhard Herzog  <[email protected]>
2759    
2760            * Thuban/Lib/connector.py (QueueingPublisher): Removed. This class
2761            was never used in Thuban.
2762    
2763    2003-07-30  Bernhard Herzog  <[email protected]>
2764    
2765            * Thuban/UI/join.py (JoinDialog.__init__): Use the table's Title()
2766            method directly instead of going through the transient_table
2767            method. This faster because transient_table may force the copy of
2768            a DBF file into the transient database and setting a table's title
2769            doesnm't affect the title of the associated transient table, so
2770            this fixes RT #2042
2771    
2772            * Thuban/UI/main.py (__version__): Don't import the already
2773            removed show_exception_dialog.
2774    
2775    2003-07-29  Jonathan Coles   <[email protected]>
2776    
2777            * Thuban/UI/application.py (ThubanApplication.ShowExceptionDialog):
2778            Put back this method and remove the equivalent function since we
2779            are setting the exception hook from within this class (OnInit).
2780    
2781    2003-07-29  Jonathan Coles   <[email protected]>
2782    
2783            * Doc/manual/images/5_2_custom_ramp.png,
2784            Doc/manual/images/5_2_quantiles.png,
2785            Doc/manual/images/5_2_uniform_dist.png,
2786            Doc/manual/images/5_2_unique_values.png,
2787            Doc/manual/images/8_int_error.png: New screen shots.
2788    
2789            * Doc/manual/thuban-manual.xml: Fixed typos and wording, clarified
2790            some points, and added more screen shots.
2791    
2792    2003-07-29  Bernhard Herzog  <[email protected]>
2793    
2794            * Thuban/Model/data.py: Remove the now unused import of warnings
2795    
2796    2003-07-29  Bernhard Herzog  <[email protected]>
2797    
2798            * Thuban/Model/data.py (SimpleStore): Removed. This class has been
2799            deprecated since before the 0.8 release and isn't used in Thuban
2800            itself anymore.
2801    
2802            * Thuban/Model/transientdb.py: Remove some unnecessary imports
2803    
2804    2003-07-29  Jonathan Coles   <[email protected]>
2805    
2806            * Thuban/UI/application.py (ThubanApplication.OnInit): set the
2807            python exception hook here so that we are sure to catch any
2808            Thuban exception that happen during initialization.
2809    
2810            * Thuban/UI/main.py (main): Don't set the exception hook here,
2811            it will get set in ThubanApplication.OnInit.
2812    
2813    2003-07-29  Jonathan Coles   <[email protected]>
2814                                                                                
2815            * Thuban/UI/application.py (ThubanApplication.ShowExceptionDialog):
2816            Removed and called it show_exception_dialog() so that the exception
2817            handler can be set before the class is created.
2818                                                                                
2819            * Thuban/UI/main.py (main): Install the exception handler before
2820            a ThubanApplication is created.
2821                                                                                    
2822    2003-07-29  Bernhard Herzog  <[email protected]>
2823    
2824            * po/it.po: New. Italian translation by Maurizio Napolitano
2825    
2826            * po/ru.po: New. Russian translation by Alex Shevlakov
2827    
2828    2003-07-29  Frank Koormann   <[email protected]>
2829    
2830            * Doc/manual/thuban-manual.xml: Extended section on supported
2831            projections.
2832            
2833    2003-07-29  Frank Koormann   <[email protected]>
2834    
2835            * Doc/manual/thuban-manual.xml: gaspell-checked.
2836    
2837    2003-07-29  Jonathan Coles   <[email protected]>
2838    
2839            * Doc/manual/images/3_5_legend.png: Added border to improve look
2840            on white background.
2841    
2842    2003-07-29  Jonathan Coles   <[email protected]>
2843    
2844            * Doc/manual/thuban-manual.xml: Fixed grammar and typos. Added
2845            descriptions for the legend toolbar.
2846    
2847            * Doc/manual/images/4_2_raster_layer_properties.png: Removed
2848            cursor from dialog box.
2849    
2850    2003-07-28  Jonathan Coles   <[email protected]>
2851    
2852            * Doc/manual/thuban-manual.xml: More screenshots and more chapters.
2853    
2854            * Doc/manual/images/2_4_session_tree.png,
2855            Doc/manual/images/3_5_legend.png, Doc/manual/images/3_rename_map.png,
2856            Doc/manual/images/4_2_layer_properties.png,
2857            Doc/manual/images/4_2_raster_layer_properties.png,
2858            Doc/manual/images/5_3_genclass.png,
2859            Doc/manual/images/5_classification.png,
2860            Doc/manual/images/6_projection.png,
2861            Doc/manual/images/7_1_table_view.png,
2862            Doc/manual/images/7_2_5_join.png: New screenshots.
2863    
2864    2003-07-24  Jonathan Coles   <[email protected]>
2865    
2866            * Doc/manual/thuban-manual.xml: Chapter on Projection Management.
2867    
2868    2003-07-24  Jonathan Coles   <[email protected]>
2869    
2870            * Doc/manual/thuban-manual.xml: Added EPS images and wrote
2871            chapter on Layer Management.
2872    
2873            * Doc/manual/Makefile: New. Makefile to generate all formats for the
2874            manual and images.
2875    
2876    2003-07-24  Bernhard Herzog  <[email protected]>
2877    
2878            * Thuban/Model/range.py, Thuban/version.py: Remove the #! line as
2879            it annoys lintian which warns about these files not being
2880            executable. The #! isn't necessary here since if you absolutely
2881            must execute them you can always say "python <filename>".
2882    
2883            * Thuban/UI/renderer.py (ScreenRenderer.draw_shape_layer): Remove
2884            superfluous code to set brush and pen for point shapes
2885    
2886            * Thuban/UI/viewport.py: Remove commented out code that wouldn't
2887            belong in viewport anyway
2888    
2889    2003-07-24  Frank Koormann   <[email protected]>
2890    
2891            * Doc/manual/thuban-manual.xml: Added section on table management.
2892    
2893    2003-07-24  Bernhard Herzog  <[email protected]>
2894    
2895            * test/runtests.py (main): Recognize the long "verbose" option
2896            correctly.
2897    
2898    2003-07-22  Jonathan Coles   <[email protected]>
2899    
2900            * Doc/manual/thuban-manual.xml: Continue to write first revision
2901            of the manual.
2902    
2903            * Thuban/UI/renderer.py (MapRenderer.render_map): Wrap method
2904            with Begin/EndDrawing() calls to ensure we aren't doing to
2905            many updates to the dc during rendering.
2906            (ScreenRenderer.draw_shape_layer): self.draw_point_shape takes
2907            a pen and brush argument so they need to be passed to the function.
2908    
2909            * Thuban/UI/viewport.py (ViewPort.calc_min_max_scales): New.
2910            Calculates the minimum and maximum scale values. Factored out
2911            of set_view_transform so that it could be used to zoom all the
2912            way into a single point.
2913            (ViewPort.set_view_transform): Call calc_min_max_scales().
2914            (ViewPort.FitSelectedToWindow): Zoom to the maximum scale
2915            if only a single point is selected.
2916    
2917            * Doc/manual/images/1_2_legend_close.png,
2918            Doc/manual/images/1_2_legend_dock.png,
2919            Doc/manual/images/1_2_mainwindow.png,
2920            Doc/manual/images/1_2_mainwindow.ps,
2921            Doc/manual/images/1_2_mainwindow.sk,
2922            Doc/manual/images/3_2_fullextent.png,
2923            Doc/manual/images/3_2_fulllayerextent.png,
2924            Doc/manual/images/3_2_fullshapeextent.png,
2925            Doc/manual/images/3_2_pan.png,
2926            Doc/manual/images/3_2_zoomin.png,
2927            Doc/manual/images/3_2_zoomout.png,
2928            Doc/manual/images/3_3_identify.png,
2929            Doc/manual/images/3_3_label.png,
2930            Doc/manual/images/3_5_invisible.png,
2931            Doc/manual/images/3_5_movedown.png,
2932            Doc/manual/images/3_5_moveup.png,
2933            Doc/manual/images/3_5_props.png,
2934            Doc/manual/images/3_5_tobottom.png,
2935            Doc/manual/images/3_5_totop.png,
2936            Doc/manual/images/3_5_visible.png: New. Images for the documentation.
2937    
2938    2003-07-18  Bernhard Herzog  <[email protected]>
2939    
2940            * Thuban/UI/messages.py (MAP_REPLACED): New message.
2941    
2942            * Thuban/UI/viewport.py (ViewPort.SetMap): Issue MAP_REPLACED
2943            after the new map has been assigned
2944    
2945            * Thuban/UI/mainwindow.py (MainWindow.delegated_messages):
2946            Delegate MAP_REPLACED to the canvas too
2947            (MainWindow.prepare_new_session): Removed. Thanks to the new
2948            MAP_REPLACED message it's no longer needed
2949            (MainWindow.OpenSession, MainWindow.NewSession):
2950            prepare_new_session has been removed.
2951    
2952            * Thuban/UI/classifier.py (Classifier.__init__): Subscribe to
2953            MAP_REPLACED so that we can close the dialog if a new map is set.
2954            (Classifier.unsubscribe_messages): Unsubscribe from MAP_REPLACED
2955            (Classifier.map_replaced): Handle MAP_REPLACED by closing the
2956            dialog
2957    
2958            * test/test_viewport.py (SimpleViewPortTest)
2959            (SimpleViewPortTest.test_default_size): Add doc-strings
2960            (ViewPortTest.setUp): Bind map to self.map so we can use it in
2961            tests. Subscribe to MAP_REPLACED messages too.
2962            (ViewPortTest.tearDown): No need to explicitly unsubscribe
2963            (ViewPortTest.test_set_map): New test for the SetMap method.
2964    
2965    2003-07-18  Bernhard Herzog  <[email protected]>
2966    
2967            * test/test_viewport.py (SimpleViewPortTest.test_default_size):
2968            Move this test from ViewPortTest.setUp to this new separate test
2969            case. setUp is not the place for the actual tests.
2970            (ViewPortTest.test_inital_settings, ViewPortTest.setUp): Move some
2971            more of the test from setUp to the new test test_inital_settings.
2972            (ViewPortTest.test_win_to_proj, ViewPortTest.test_proj_to_win)
2973            (ViewPortTest.test_proj_conv): Split test_proj_conv into
2974            test_win_to_proj and test_proj_to_win and make the tests easier to
2975            understand
2976            (ViewPortTest.testFitRectToWindow, ViewPortTest.testZoomFactor)
2977            (ViewPortTest.testZoomOutToRect, ViewPortTest.testTranslate)
2978            (ViewPortTest.test_unprojected_rect_around_point)
2979            (ViewPortTest.test_find_shape_at, ViewPortTest.testTools):
2980            Reformat to increase readability.
2981    
2982    2003-07-18  Bernhard Herzog  <[email protected]>
2983    
2984            * Thuban/UI/view.py (MapCanvas.OnLeftDown): Capture the mouse.
2985    
2986    2003-07-18  Bernhard Herzog  <[email protected]>
2987    
2988            * test/runtests.py: The test suite can now be run without an X
2989            connection. To make sure this remains true, remove the DISPLAY
2990            environment variable so that an error occurs if the wxGTK is
2991            imported accidentally
2992    
2993    2003-07-18  Bernhard Herzog  <[email protected]>
2994    
2995            * Thuban/UI/viewport.py: Remove unused imports
2996    
2997            * Thuban/UI/view.py: Remove unused imports
2998    
2999    2003-07-18  Bernhard Herzog  <[email protected]>
3000    
3001            * test/test_export.py Remove unused imports. The OutputTransform
3002            function is now in viewport.py and is called output_transform
3003            (TestScalebar.test_output_transform)
3004            (TestScalebar.test_OutputTransform): Renamed to
3005            test_output_transform and updated to use output_transform instead
3006            of OutputTransform
3007    
3008            * Thuban/UI/view.py (OutputTransform): Moved to viewport.py and
3009            renamed.
3010            (MapCanvas.Export, MapPrintout.draw_on_dc): OutputTransform was
3011            renamed to output_transform
3012    
3013            * Thuban/UI/viewport.py (OutputTransform, output_transform):
3014            Rename to output_transform
3015    
3016    2003-07-18  Bernhard Herzog  <[email protected]>
3017    
3018            * Thuban/Model/layer.py (Layer.__init__): Rename
3019            classificationField to classificatin_column and init it here so
3020            that it can be used in SetClassificationColumn
3021            (Layer.GetClassificationColumn, Layer.GetClassificationField):
3022            Rename to GetClassificationColumn.
3023            (Layer.SetClassificationColumn, Layer.SetClassificationField):
3024            Rename to SetClassificationColumn and issue a LAYER_CHANGED
3025            message if the column changes.
3026            (Layer._classification_changed, Layer.ClassChanged): Rename to
3027            _classification_changed. Update the callers.
3028            (Layer.SetShapeStore): Further field->column renames.
3029    
3030            * Thuban/Model/load.py (SessionLoader.start_classification)
3031            (SessionLoader.start_clpoint): Updates because of
3032            field->column method name changes in the Layer class
3033    
3034            * Thuban/Model/save.py (SessionSaver.write_classification): Updates
3035            because of field->column method name changes in the Layer class
3036    
3037            * Thuban/UI/classifier.py (Classifier.__init__)
3038            (Classifier._OnTry, Classifier._OnRevert): Updates because of
3039            field->column method name changes in the Layer class
3040    
3041            * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Updates
3042            because of field->column method name changes in the Layer class
3043    
3044            * Thuban/UI/viewport.py (ViewPort.find_shape_at): Updates because
3045            of field->column method name changes in the Layer class
3046    
3047            * test/test_save.py (SaveSessionTest.testClassifiedLayer)
3048            (SaveSessionTest.testClassifiedLayer): Update because of
3049            field->column method name changes in the Layer class
3050    
3051            * test/test_layer.py (SetShapeStoreTests.setUp)
3052            (SetShapeStoreTests.test_sanity): Update because of field->column
3053            method name changes in the Layer class
3054            (TestLayerModification.setUp): Subscribe to LAYER_CHANGED as well
3055            (TestLayerModification.test_sanity)
3056            (TestLayerModification.test_initial_settings): remove unsued code
3057            and rename to test_sanity.
3058            (TestLayerModification.test_set_classification): New test for
3059            SetClassification and SetClassificationField.
3060    
3061    2003-07-18  Bernhard Herzog  <[email protected]>
3062    
3063            * test/test_classgen.py (TestFixedRamp.test): Extend test to check
3064            the non-fixed values as well. The old test would have accepted a
3065            fixed ramp that only returnes the fixed properties
3066    
3067    2003-07-17  Jonathan Coles   <[email protected]>
3068    
3069            * Doc/manual/mainwindow.png, Doc/manual/mainwindow.xcf: Screen
3070            shots for the manual. The XCF file is the source image and
3071            has additional layers to support changes.
3072    
3073            * Doc/manual/thuban-manual.xml: Wrote an initial Introduction.
3074    
3075            * Thuban/UI/classifier.py (Classifier.__BuildClassification):
3076            Return both the new class and the field name.
3077    
3078            * Thuban/UI/mainwindow.py (MainWindow.ToggleLegend): Don't
3079            fit the map to the window as this changes any zoom level that
3080            the user may have set.
3081    
3082    2003-07-16  Jonathan Coles   <[email protected]>
3083    
3084            * Thuban/Model/classgen.py (generate_singletons,
3085            generate_uniform_distribution, generate_quantiles): Remove
3086            fixes parameter, but maintain the same functionality by having
3087            the calling function pass a FixedRamp object for the ramp.
3088            (FixedRamp): New. Adapts a ramp to have fixed property values.
3089    
3090            * Thuban/Model/classification.py: Use new CLASS_CHANGED message.
3091            (Classification): Inherit from Publisher.
3092            (Classification.__init__): Remove the layer parameter.
3093            Classifications no longer need to have a parent layer.
3094            (Classification.GetField, Classification.GetFieldType,
3095            Classification.SetFieldInfo): Removed. The field name is stored
3096            in the layer, and the type can be retreived by calling
3097            Layer.GetFieldType().
3098            (Classification._set_layer, Classification.GetLayer): Removed.
3099            Classifications no longer have a parent layer.
3100    
3101            * Thuban/Model/layer.py (Layer.Destroy): Unsubscribe from the
3102            classification.
3103            (Layer.SetShapeStore): Reset the classification first while
3104            we still have the old shape store to work with.
3105            (Layer.GetClassificationField, Layer.SetClassificationField):
3106            New. Method for getting/setting the field to classify on.
3107            (Layer.SetClassification): Simplified now that the layer
3108            simply has to hold a reference to the classification and not
3109            tell the classification who owns it.
3110            Fixes RTbug #2023.
3111    
3112            * Thuban/Model/load.py (SessionLoader.start_classification):
3113            Set the field name on the layer, not the classification.
3114    
3115            * Thuban/Model/messages.py: Add CLASS_CHANGED for when a
3116            classification is modified.
3117    
3118            * Thuban/Model/save.py (SessionSaver.write_classification):
3119            Get the field name and type from the layer.
3120    
3121            * Thuban/Model/table.py (table_to_dbf, table_to_csv): Renamed
3122            parameter records to rows and add docstring. Fixes RTbug #1997.
3123    
3124            * Thuban/UI/classgen.py (ClassGenDialog.OnOK): Use a fixed
3125            ramp when we need to fix certain values of a ramp rather than
3126            using the old fixes parameter. Fixes RTbug #2024.
3127    
3128            * Thuban/UI/classifier.py (ClassGrid.CreateTable): Add fieldType
3129            parameter.
3130            (ClassTable.Reset): Add fieldType parameter and use it, rather
3131            than asking the classification.
3132            (Classifier.__init__): Remember the original class's field
3133            and ask the layer for the field type, rather than the classification.
3134            (Classifier.__SetGridTable): Retrieve the field and field type
3135            for the table because they are not in the classification.
3136            (Classifier._OnTry, Classifier._OnRevert): Set the classification
3137            field on the layer in addition to the classification itself.
3138    
3139            * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Get the
3140            classification field from layer.
3141    
3142            * Thuban/UI/viewport.py (ViewPort.find_shape_at): Get the
3143            classification field from layer. Split up tests and remove
3144            *-imports. Fixes RTbug #1992.
3145    
3146            * test/test_classgen.py (TestFixedRamp): Test for the FixedRamp class.
3147    
3148            * test/test_classification.py
3149            (TestClassification.test_classification): Remove tests for methods
3150            that no longer exist.
3151    
3152            * test/test_layer.py (SetShapeStoreTests.setUp): Classification
3153            __init__ no longer has a field parameter, use SetClassificationField.
3154            (SetShapeStoreTests.test_sanity): Use layer object to get class
3155            field info.
3156    
3157            * test/test_save.py (SaveSessionTest.testClassifiedLayer): Use
3158            SetClassificationField on layer to set class field info.
3159    
3160            * test/test_viewport.py: Renamed from test/test_view.py.
3161    
3162    2003-07-16  Jan-Oliver Wagner <[email protected]>
3163    
3164            * Doc/manual/thuban-manual.xml: Added authors and an initial
3165            coarse structure.
3166    
3167    2003-07-15  Bernhard Herzog  <[email protected]>
3168    
3169            * test/support.py (FloatComparisonMixin): This is a mix-in class
3170            and therefore should not be derived from any other class.
3171    
3172            * test/test_range.py (RangeTest): FloatComparisonMixin is a
3173            mix-in, so derive from TestCase as well.
3174    
3175    2003-07-15  Bernhard Herzog  <[email protected]>
3176    
3177            * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Rework the
3178            draw_func handling a bit to remove one layer of indirection. This
3179            makes the renderer about 10% faster in the non-classifying case
3180            and the code a bit cleaner
3181            (MapRenderer.draw_point_shape): Add the pen and brush parameters
3182            and set them in the dc. Now the draw_point_shape method and
3183            wxproj's draw_polygon_shape function have basically the same
3184            signature so that both can be directly used as draw_func
3185    
3186    2003-07-15  Bernhard Herzog  <[email protected]>
3187    
3188            * Thuban/Model/save.py (SessionSaver.write_classification): Encode
3189            string values (in addition to the labels) as UTF 8
3190    
3191            * Thuban/Model/load.py (SessionLoader.start_clpoint): Decode the
3192            values if the field type is string
3193    
3194            * test/test_save.py (SaveSessionTest.testClassifiedLayer): Test
3195            saving a session with non-ascii string classification values.
3196    
3197            * test/test_load.py (TestClassification.file_contents)
3198            (TestClassification.test): Check for non-ascii values in string
3199            classifications
3200    
3201    2003-07-14  Jonathan Coles   <[email protected]>
3202    
3203            * test/test_view.py: New. Tests for ViewPort.
3204    
3205    2003-07-14  Frank Koormann   <[email protected]>
3206    
3207            * Thuban/Model/load.py (SessionLoader.start_map): Encode map
3208            title to latin1.  Fixes https://intevation.de/rt/webrt?serial_num=2013
3209    
3210            * test/test_load_0_8.py (TestUnicodeStrings): New, test load of
3211            unicode strings from session file: session title, map title and
3212            projection name.
3213            
3214    2003-07-10  Jonathan Coles   <[email protected]>
3215    
3216            * Thuban/UI/viewport.py (Tool.MouseUp): Should have called
3217            drag_stop, not drag_move when the mouse is released.
3218    
3219    2003-07-10  Jonathan Coles   <[email protected]>
3220    
3221            The most important part of this is the seperation of view.py into
3222            two pieces. viewport.py now has a class called ViewPort which
3223            contains all the non-wx parts of view.py and can therefore be
3224            tested. view.py contains only the wx-specific parts and is fairly
3225            simple.
3226    
3227            * Thuban/UI/view.py: Stripped out all non-wx functionality. Fixes
3228            RTTbug #1992.
3229            * Thuban/UI/viewport.py: New. Contains non-wx view functionality.
3230            RTTbug #1992.
3231    
3232            * Thuban/Model/classgen.py (generate_singletons,
3233            generate_uniform_distribution, generate_quantiles):
3234            Added 'fixes' parameter so that property attributes can
3235            be held constant over the generated classification groups.
3236            (CustomRamp.GetProperties): Remove unused variables.
3237    
3238            * Thuban/Model/map.py (Map.SetProjection): Send the old
3239            projection as an argument to listeners of the MAP_PROJECTION_CHANGED
3240            event.
3241    
3242            * Thuban/Model/table.py (table_to_dbf, table_to_csv): Added 'records'
3243            parameter which is a list of records that restricts which
3244            records are saved. Fixes RTbug #1997.
3245    
3246            * Thuban/UI/application.py (ThubanApplication.ShowExceptionDialog):
3247            Port exception dialog from GREAT-ER. Fixes RTbug #1993.
3248    
3249            * Thuban/UI/classgen.py (ClassGenDialog.__init__): Add controls
3250            to allow the user to fix line color/width on generated groups.
3251            (ClassGenDialog.OnOK): Use new 'fixes' parameter of the generate_*
3252            functions to optionally fix group properties.
3253    
3254            * Thuban/UI/main.py (main): Set exception hook to the
3255            ShowExceptionDialog. Fixes RTbug #1993.
3256    
3257            * Thuban/UI/mainwindow.py (MainWindow.ShowTableView): Raise
3258            the table window when it is selectd to be shown.
3259    
3260            * Thuban/UI/tableview.py (QueryTableFrame.__init__): Add an
3261            Export Selection button and move the export buttons underneath
3262            the table.
3263            (QueryTableFrame.UpdateStatusText): Added event argument so
3264            that it can respond to grid selection events. The status text
3265            is now updated even when the table is not associated with a
3266            layer as was previously assumed.
3267            (QueryTableFrame.OnGridSelectRange, OnGridSelectCell): Removed.
3268            UpdateStatusText responds to these events.
3269            (QueryTableFrame.OnSaveAs): Renamed to doExport.
3270            (QueryTableFrame.doExport): Helper function that saves the
3271            entire table, or selected rows, to a file.
3272            (QueryTableFrame.OnExport, QueryTableFrame.OnExportSel): New.
3273            Respond to export button events and call doExport.
3274    
3275            * extensions/thuban/gdalwarp.cpp (ProjectRasterFile): Make sure
3276            the function doesn't return NULL without first setting a Python
3277            Error.
3278    
3279            * test/runtests.py (main): Only print "Unknown option" for
3280            unsupported options.
3281    
3282            * test/support.py (FloatComparisonMixin.assertFloatEqual): Take
3283            optional epsilon argument to specify floating point accuracy.
3284            (FloatComparisonMixin.assertFloatSeqEqual): Call assertFloatEqual
3285            for each item test.
3286    
3287            * test/test_csv_table.py (TestCSVTable.test_table_to_cvs): Add
3288            tests for saving selected records.
3289    
3290            * test/test_dbf_table.py (TestTableToDBF.test_table_to_dbf): Add
3291            tests for saving selected records.
3292    
3293            * test/test_map.py (TestMapWithContents.test_set_projection):
3294            MAP_PROJECTION_CHANGED events send the old projection.
3295    
3296            * test/test_session.py
3297            (TestSessionWithContent.test_forward_map_projection):
3298            MAP_PROJECTION_CHANGED events send the old projection.
3299    
3300            * test/test_table.py (TableTest): Update tests to use non-deprecated
3301            functions.
3302    
3303    2003-07-08  Bernhard Herzog  <[email protected]>
3304    
3305            * Thuban/Model/transientdb.py (TransientTableBase.Width): The type
3306            constants in the column objects are the standard ones defined in
3307            the table module.
3308    
3309            * test/test_transientdb.py
3310            (TestTransientTable.test_transienttable_to_dbf): New. Test whether
3311            exporting transient tables as DBF works. This should catch the bug
3312            just fixed in TransientTableBase.Width.
3313    
3314    2003-07-08  Bernhard Herzog  <[email protected]>
3315    
3316            * Thuban/Model/classgen.py (CustomRamp.GetProperties): Compute the
3317            interpolated colors correctly.
3318    
3319            * test/test_classgen.py (TestCustomRamp.test_color_interpolation):
3320            New. Test case for the fix in classgen.py
3321    
3322    2003-07-08  Bernhard Herzog  <[email protected]>
3323    
3324            * test/runtests.py (main): Make the default output less verbose
3325            and add a verbosity option (-v) to get the old output
3326    
3327    2003-07-08  Bernhard Herzog  <[email protected]>
3328    
3329            * Resources/XML/thuban-0.9.dtd: New. This will become the DTD for
3330            0.9.
3331    
3332            * Thuban/Model/transientdb.py (TransientJoinedTable.JoinType):
3333            New. Return the join type
3334    
3335            * Thuban/Model/save.py (SessionSaver.write_session): Use new 0.9
3336            DTD
3337            (SessionSaver.write_data_containers): Save the join type for
3338            joined tables
3339    
3340            * Thuban/Model/load.py (SessionLoader.__init__): Add the new 0.9
3341            namespace
3342            (SessionLoader.start_jointable): Handle the jointype attribute
3343    
3344            * test/test_load_0_8.py: New. Effectively a copy of test_load.py
3345            as of Thuban 0.8. These are now tests to determine whether Thuban
3346            can still read files generated by Thuban 0.8
3347    
3348            * test/test_load.py (LoadSessionTest.dtd)
3349            (TestSingleLayer.file_contents)
3350            (TestLayerVisibility.file_contents, TestLabels.file_contents)
3351            (TestLayerProjection.file_contents)
3352            (TestRasterLayer.file_contents, TestJoinedTable.file_contents)
3353            (TestJoinedTable.file_contents)
3354            (TestLoadError.file_contents): Update for new DTD
3355            (TestJoinedTable.file_contents, TestJoinedTable.setUp): Add test
3356            for new join type attribute
3357    
3358            * test/test_save.py (SaveSessionTest.dtd)
3359            (SaveSessionTest.testEmptySession)
3360            (SaveSessionTest.testSingleLayer)
3361            (SaveSessionTest.testLayerProjection)
3362            (SaveSessionTest.testRasterLayer)
3363            (SaveSessionTest.testClassifiedLayer)
3364            (SaveSessionTest.test_dbf_table)
3365            (SaveSessionTest.test_joined_table): Update for new DTD
3366            (SaveSessionTest.test_joined_table): Add test for new join type
3367            attribute
3368    
3369    2003-07-04  Bernhard Herzog  <[email protected]>
3370    
3371            * Thuban/Model/table.py (_find_dbf_column_names): New. Helper
3372            function for table_to_dbf
3373            (table_to_dbf): Deal with names longer than the 10 character limit
3374    
3375            * test/test_dbf_table.py (TestTableToDBF.test_table_to_dbf): Add
3376            doc-string
3377            (TestTableToDBF.test_table_to_dbf_long_col_names): New test for
3378            long column names
3379    
3380    2003-07-03  Bernhard Herzog  <[email protected]>
3381    
3382            * Doc/manual/thuban-manual.xml: Fix the CVS Revision Tag syntax
3383    
3384    2003-07-03  Bernhard Herzog  <[email protected]>
3385    
3386            * Doc/manual/thuban-manual.xml, Doc/manual/README: New. Skeleton
3387            for the Thuban manual and README with some basic information about
3388            the manual
3389    
3390    2003-07-03  Bernhard Herzog  <[email protected]>
3391    
3392            * Thuban/Model/transientdb.py (TransientJoinedTable.__init__):
3393            Update doc-string
3394            (TransientJoinedTable.create): Do not modify the column objects of
3395            the input tables in place and copy all columns of the input tables
3396            into the joined table after all.
3397    
3398            * test/test_transientdb.py
3399            (TestTransientTable.test_transient_joined_table_same_column_name):
3400            Update to reflect the new behavior
3401            (TestTransientTable.test_transient_joined_table_with_equal_column_names):
3402            Update to reflect the new behavior
3403            (TestTransientTable.test_transient_joined_table_name_collisions_dont_modify_in_place):
3404            New test case for a bug which modified the column objects in place
3405    
3406    2003-07-02  Jonathan Coles   <[email protected]>
3407    
3408            * Thuban/Model/classgen.py (generate_singletons,
3409            generate_uniform_distribution, generate_quantiles,
3410            GenQuantiles0): Make sure maxValue isn't less than
3411            one, otherwise we could divide by zero.
3412    
3413            * test/test_classgen.py (ClassGenTest.doClassRangeTest,
3414            ClassGenTest.doClassSingleTest): Call doBoundsTest to
3415            check the end classification groups against the
3416            proper property values.
3417            (ClassGenTest.doBoundsTest): New. Checks the first and
3418            last classification groups to make sure their properties
3419            are the correct upper and lower bounds for a color ramp.
3420    
3421    2003-07-02  Jonathan Coles   <[email protected]>
3422    
3423            * Thuban/Model/classgen.py (generate_singletons,
3424            generate_uniform_distribution, generate_quantiles,
3425            GenQuantiles0): The denominator was one to high when
3426            calculating the index for the ramp causing the index
3427            to never to reach one.
3428    
3429    2003-07-02  Jonathan Coles   <[email protected]>
3430    
3431            Changed the singature of ClassGroupRange.__init__ and
3432            ClassGroupRange.SetRange() so that the min/max values are
3433            passed as a tuple. This makes a better calling scheme for
3434            when a Range object is passed instead.
3435    
3436            * Thuban/Model/classgen.py: Fixed parameters to
3437            ClassGroupRange constructor.
3438    
3439            * Thuban/Model/classification.py (ClassGroupRange.__init__):
3440            Consolidate the min/max parameters into a single _range which
3441            can either be a tuple or a Range object.
3442            (ClassGroupRange.SetRange): Consolidate the min/max parameters
3443            into a single _range which can either be a tuple or a Range object.
3444    
3445            * Thuban/Model/load.py (SessionLoader.start_clrange): Fix
3446            call to ClassGroupRange constructor to use a tuple.
3447    
3448            * Thuban/Model/layer.py (Layer.SetClassification): Switch
3449            the classification instance variable to the new class
3450            before calling _set_layer otherwise subscribers to a
3451            LAYER_CHANGED event will not see any difference.
3452    
3453            * test/test_classification.py: Fix tests of ClassGroupRange
3454            so that they use the new signature.
3455    
3456            * test/test_load.py: Fix use of ClassGroupRange so that it
3457            uses the new signature.
3458    
3459            * test/test_load_0_2.py: Fix use of ClassGroupRange so that it
3460            uses the new signature.
3461    
3462            * test/test_save.py: Fix use of ClassGroupRange so that it
3463            uses the new signature.
3464    
3465    
3466    2003-07-01  Jonathan Coles   <[email protected]>
3467    
3468            * Thuban/Model/classgen.py: Fixes RTbug #1972, 1971.
3469            Import used objects/class from color.
3470            (generate_singletons): We don't
3471            need the numGroups parameter anymore because we are using
3472            the new ramps with GetProperties().
3473            (generate_uniform_distribution): Use new ramp method
3474            GetProperties().
3475            (generate_quantiles, GenQuantiles0): Use new ramp method
3476            GetProperties().
3477            (CustomRamp.SetNumGroups): Removed. The ramps now map
3478            a value from 0 to 1 to class properties so the number
3479            of groups is not needed ahead of time.
3480            (CustomRamp.next): Removed. CustomRamp does not support
3481            interation anymore.
3482            (CustomRamp.GetProperties): Returns a ClassGroupProperties
3483            object based on the index value from 0 to 1 that is
3484            passed to it.
3485            (GreyRamp, RedRamp, GreenRamp, BlueRamp, GreenToRedRamp):
3486            Made into instances of Monochromatic class instread of
3487            deriving from it.
3488            (HotToCold.SetNumGroups): Removed. See CustomRamp.
3489            (HotToCold.next): Removed. See CustomRamp.
3490    
3491            * Thuban/Model/classification.py: Fixes RTbug #1973, 1971.
3492            (Classification.SetField, Classification.SetFieldType):
3493            Replaced with SetFieldInfo.
3494            (Classification.SetFieldInfo): New. Does a better job of
3495            what SetField and SetFieldType used to do by combining
3496            their function since they should really always be done
3497            at the same time.
3498            (Classification.SetLayer): Renamed to _set_layer.
3499            (Classification._set_layer): Should only be called from
3500            Layer's SetClassification. This does not cause a recursive
3501            call as SetLayer did because we know that Layer knows about
3502            the classification.
3503    
3504            * Thuban/Model/color.py: Fixes RTbug #1971.
3505            (_Transparent): Renamed from Transparent so it doesn't
3506            conflict with the module variable.
3507            (Transparent, Black): Renamed from Color.Transparent,
3508            Color.Black so they are not class variables.
3509    
3510            * Thuban/Model/layer.py: Fixes RTbug #1971, 1973.
3511            (Layer.Destroy): We don't need to call SetClassification
3512            anymore to clear out the back reference in the classifcation
3513            to the layer. It's better to set it to None using _set_layer,
3514            and we won't be creating another clas object too.
3515            (Layer.SetClassification): Classification._set_layer is not
3516            recursive so remove all the locking variables. Also clean
3517            up the code so that it remains unchanged if something fails.
3518    
3519            * Thuban/Model/load.py: Fixes RTbug #1971.
3520            (SessionLoader.start_classification): Call
3521            Classification.SetFieldInfo().
3522    
3523            * Thuban/Model/save.py: Removed import of Color which wasn't
3524            being used.
3525    
3526            * Thuban/UI/classgen.py: Fixes RTbug #1972.
3527            (ClassGenDialog.__init__): Color ramps are now instances
3528            already so we don't need to create any new objects.
3529            (ClassGenDialog.OnOK): Check for numGroups is no longer
3530            necessary because we never use it.
3531    
3532            * Thuban/UI/classifier.py: Fixes RTbug #1971.
3533            (Classifier.__BuildClassification, Classifier.__SetGridTable):
3534            Call Classification.SetFieldInfo() instead of SetFieldType.
3535    
3536            * Thuban/UI/renderer.py: Fixes RTbug #1971.
3537    
3538            * Thuban/UI/view.py: Fixes RTbug #1974, 1971.
3539            (MapCanvas.__init__): Subscribe to the idle time event. Set
3540            background color to white.
3541            (MapCanvas.OnPaint): Set a flag indicating that we should
3542            render the map during idle time. If we already have a bitmap
3543            just draw it now.
3544            (MapCanvas.OnIdle): New. Render the map only during idle time.
3545            This also fixes a problem with the busy cursor under gtk.
3546    
3547            * test/test_classgen.py (ClassGenTest.test_generate_singletons):
3548            Fix calls to generate_singletons because the signature changed.
3549    
3550            * test/test_classification.py: Fix color references and
3551            change calls to Classification.[SetField|SetFieldType] to
3552            SetFieldInfo.
3553    
3554            * test/test_load.py: Fix color references.
3555    
3556            * test/test_load_0_2.py: Fix color references.
3557    
3558            * test/test_save.py (SaveSessionTest.testClassifiedLayer):
3559            Change calls to Classification.[SetField|SetFieldType] to
3560            SetFieldInfo.
3561    
3562    2003-07-01  Frank Koormann   <[email protected]>
3563    
3564            MERGE from the greater-ms3 branch.
3565    
3566            * test/test_transientdb.py
3567            (TestTransientTable.test_transient_joined_table_with_equal_column_names):
3568            New. Test join of two tables with partly equal column names.
3569    
3570            * Thuban/Model/transientdb.py (TransientJoinedTable.create):
3571            If duplicates in left and right tables column names are found,
3572            append '_' (underscores) to the name until it is unique.
3573            Create always new internal names for the resulting table and reference
3574            columns in the join statement with <table>.<column>
3575    
3576    2003-07-01  Bernhard Herzog  <[email protected]>
3577    
3578            * test/test_transientdb.py
3579            (TestTransientTable.test_transient_joined_table_same_column_name):
3580            New. Test whether joining on columns with the same names in both
3581            tables works.
3582            
3583            * Thuban/Model/transientdb.py (TransientJoinedTable.create): Make
3584            sure to use the right internal names even when joining on field
3585            with the same names in both tables. Also, detect duplicate names
3586            in the joined table correctly.
3587    
3588    2003-07-01  Frank Koormann   <[email protected]>
3589    
3590            * Thuban/UI/renderer.py (ExportRenderer.render_legend):
3591            Reverse List of layers to render in same order as in desktop legend.
3592    
3593    2003-06-30  Jonathan Coles   <[email protected]>
3594    
3595            * Thuban/version.py (make_tuple): Takes a version string
3596            and splits it into a tuple of at most three integers.
3597            Used make_tuple() to make tuple versions of the version
3598            numbers.
3599    
3600            * Thuban/UI/about.py: Add Thuban email addresses.
3601    
3602    2003-06-30  Jonathan Coles   <[email protected]>
3603    
3604            * Thuban/version.py: SQLite/PySQLite version dependencies
3605            were too high.
3606    
3607    2003-06-30  Jonathan Coles   <[email protected]>
3608    
3609            * Thuban/version.py: Update version to 0.8.1
3610            
3611            * MANIFEST.in: Added Projections so that default.proj is
3612            included.
3613    
3614    2003-06-26  Jonathan Coles   <[email protected]>
3615    
3616            New About box with lots more information including library
3617            versions and credits. More/better version checking before
3618            Thuban starts.
3619    
3620            * Thuban/UI/about.py: New. New About box that displays
3621            library version information and credits.
3622    
3623            * Thuban/version.py: Added new 'versions' dictionary which
3624            contains the verions of various libraries which are checked
3625            when the module loads.
3626            (verify_versions): Check all version numbers and returns
3627            a list of errors.
3628    
3629            * Thuban/UI/classifier.py (Classifier.__EnableButtons):
3630            Reset the status of the buttons as the situation warrants,
3631            but in a better more reliable way by not relying on the
3632            current status to determine what needs to change.
3633    
3634            * Thuban/UI/main.py (wxCHECK_VERSION): Removed. Not needed.
3635            (verify_versions): Remove most of the code since it is
3636            now in Thuban.version.verify_versions.o
3637    
3638            * Thuban/UI/mainwindow.py (MainWindow.About): Call new
3639            About box in Thuban.UI.about.
3640    
3641            * extensions/thuban/gdalwarp.cpp (get_gdal_version): New.
3642            Returns the version of gdal library being used as a string.
3643    
3644            * extensions/thuban/wxproj.cpp (check_version, check_version_gtk):
3645            Removed.
3646            (get_proj_version): Return the version of PROJ that the file
3647            was compiled with.
3648            (get_gtk_version): Return th version of GTK that the file
3649            was compiled with.
3650    
3651    2003-06-25  Jonathan Coles   <[email protected]>
3652    
3653            * Thuban/UI/classifier.py (Classifier.EditSymbol): The parent
3654            of the SelectPropertiesDialog should be self so the window
3655            appears on top.
3656            (ClassGroupPropertiesCtrl.DoEdit): The parent
3657            of the SelectPropertiesDialog should be self so the window
3658            appears on top.
3659    
3660            * Thuban/UI/resource.py: Cleaned up how we determine file
3661            extensions.
3662            (GetImageResource): Return an wxImage from our Resources.
3663    
3664    2003-06-24  Jonathan Coles   <[email protected]>
3665    
3666            * Thuban/UI/renderer.py (ExportRenderer.render_legend):
3667            Check that a layer has a classification before trying
3668            to get it. Raster layers don't have classifications.
3669    
3670    2003-06-23  Jonathan Coles   <[email protected]>
3671            
3672            * setup.py: Add Resources/XML to resource list.
3673        
3674    2003-06-23  Jonathan Coles   <[email protected]>
3675    
3676            * setup.cfg: Fix copyright dates
3677        
3678    2003-06-23  Jonathan Coles   <[email protected]>
3679    
3680            * MANIFEST.in: Update with Resources/XML
3681    
3682            * setup.py: Don't include Locale resources yet as we don't
3683            have any and it causes problems building the distribution
3684            for Windows. Update version to 0.8.0.
3685    
3686            * Doc/thuban.dtd: Removed since it is now in Resources/XML.
3687    
3688            * Thuban/UI/mainwindow.py: Add blank line at the end because
3689            file was not being read correctly building the Windows
3690            distribution.
3691    
3692    2003-06-23  Jonathan Coles   <[email protected]>
3693    
3694            * Thuban/UI/mainwindow.py (MainWindow.About): Fix text.
3695    
3696            * Thuban/version.py: Temporarily update longversion for
3697            the 0.8 release so that it doesn't have the cvs revision.
3698    
3699    2003-06-23  Jonathan Coles   <[email protected]>
3700    
3701            * Thuban/UI/common.py (ThubanBeginBusyCursor): Call wxSafeYield
3702            to make sure that we don't create reentrant possibilities with
3703            wxYield.
3704    
3705            * Thuban/UI/view.py (MapCanvas.OnPaint): Call wxBeginBusyCursor()
3706            directly to avoid the wxSafeYield() call which generates an
3707            OnPaint event causing infinite recursion. Don't try to catch
3708            exception anymore. This was for before there were limits on map
3709            scaling.
3710    
3711    2003-06-23  Bernhard Herzog  <[email protected]>
3712    
3713            Bug fix for RT #1961:
3714    
3715            * Thuban/Model/load.py (SessionLoader.start_derivedshapesource):
3716            Register DerivedShapestores with the session
3717    
3718            * Thuban/Model/session.py (Session.Tables): Make sure each table
3719            is only listed once.
3720    
3721            * test/test_load.py (TestJoinedTable.test): Add check_format call.
3722            Update file contents to match the one written out.
3723    
3724    2003-06-20  Bernhard Herzog  <[email protected]>
3725    
3726            * test/xmlsupport.py (SaxEventLister.startElementNS)
3727            (SaxEventLister.endElementNS): Do not include the qname. Python
3728            2.2.1 and 2.2.2 and 2.2.3 differ in this regard. In 2.2.1 qname it
3729            is (presumably incorrectly) None, whereas it's a string with the
3730            element name in the later versions.
3731    
3732            * test/test_xmlsupport.py (TestEventList.test_even_list_simple)
3733            (TestEventList.test_even_list_namespace): Update tests to reflect
3734            the new behaviour
3735            (TestEventList.test_even_list_id_normalization): Fix doc-string
3736    
3737    2003-06-20  Jonathan Coles   <[email protected]>
3738    
3739            * Thuban/Model/layer.py (BaseLayer.HasShapes): New. Overridden
3740            by deriving classes to determine if that layer supports shapes.
3741            (Layer): Override HasShapes and return true.
3742    
3743            * Thuban/UI/classgen.py: Use Thuban[Begin|End]BusyCursor()
3744            instead of a direct call to wx[Begin|End]CusyCursor().
3745            (GenUniquePanel._OnRetrieve): Set busy cursor while retrieving
3746            table data.
3747    
3748            * Thuban/UI/common.py (ThubanBeginBusyCursor, ThubanEndBusyCursor):
3749            New. Wrappers around the wxWindows functions that allow us to
3750            make additional calls such as wxYield which gives the native
3751            system a chance to update the cursor correctly.
3752    
3753            * Thuban/UI/tableview.py: Use Thuban[Begin|End]BusyCursor()
3754            instead of a direct call to wx[Begin|End]CusyCursor().
3755    
3756            * Thuban/UI/view.py: Use Thuban[Begin|End]BusyCursor()
3757            instead of a direct call to wx[Begin|End]CusyCursor().
3758            (MapCanvas.find_shape_at): Check if the current search layer
3759            support shapes, otherwise go on to the next layer.
3760    
3761            * test/test_layer.py: Add tests in each type of layer for
3762            HasClassification() and HasShapes()
3763    
3764    2003-06-20  Jonathan Coles   <[email protected]>
3765    
3766            * Thuban/UI/view.py (MapCanvas.OnPaint): Call wxYield after
3767            turning on the busy cursor to allow the system to change the
3768            cursor before we begin painting. This fixes a problem that
3769            was occuring only under GTK. Fixes RTbug #1840.
3770    
3771    2003-06-20  Bernhard Herzog  <[email protected]>
3772    
3773            * Resources/XML/thuban-0.8.dtd: New DTD for the new file format
3774            version.
3775    
3776            * Thuban/Model/save.py (sort_data_stores): New. Make topological
3777            sort of the data sources so they can be written with sources that
3778            data sources that depend on other data sources come after the
3779            sources they depend on.
3780            (SessionSaver.__init__): Add idmap instance variable to map from
3781            objects to the ids used in the file.
3782            (SessionSaver.get_id, SessionSaver.define_id)
3783            (SessionSaver.has_id): New. Methods to manage the idmap
3784            (SessionSaver.write): Use thuban-0.8.dtd
3785            (SessionSaver.write_session): Add a namespace on the session and
3786            write out the data sources before the maps.
3787            (SessionSaver.write_data_containers): New. Write the data
3788            containers.
3789            (SessionSaver.write_layer): Layer elements now refer to a
3790            shapestore and don't contain filenames anymore.
3791    
3792            * Thuban/Model/load.py (LoadError): Exception class to raise when
3793            errors in the files are discovered
3794            (SessionLoader.__init__): Define dispatchers for elements with a
3795            thuban-0.8 namespace too.
3796            (SessionLoader.check_attrs): New helper method to check and
3797            convert attributes
3798            (AttrDesc): New. Helper class for SessionLoader.check_attrs
3799            (SessionLoader.start_fileshapesource)
3800            (SessionLoader.start_derivedshapesource)
3801            (SessionLoader.start_filetable, SessionLoader.start_jointable):
3802            Handlers for the new elements in the new fileformat
3803            (SessionLoader.start_layer): Handle the shapestore attribute in
3804            addition to filename.
3805            (SessionLoader.start_table, SessionLoader.end_table): Removed.
3806            They were never used in the old formats and aren't needed for the
3807            new.
3808    
3809            * Thuban/Model/session.py (Session.DataContainers): New method to
3810            return all "data containers", i.e. shapestores and tables
3811    
3812            * test/xmlsupport.py (SaxEventLister.__init__)
3813            (SaxEventLister.startElementNS, sax_eventlist): Add support to
3814            normalize IDs.
3815    
3816            * test/test_xmlsupport.py
3817            (TestEventList.test_even_list_id_normalization): New test case for
3818            id normalization
3819    
3820            * test/test_load.py (LoadSessionTest.check_format): Use ID
3821            normalization
3822            (LoadSessionTest.thubanids, LoadSessionTest.thubanidrefs): New
3823            class atrributes used for ID normalization
3824            (TestSingleLayer, TestLayerVisibility, TestLabels.test)
3825            (TestLayerProjection.test, TestRasterLayer.test): Adapt to new
3826            file format
3827            (TestJoinedTable): New test for loading sessions with joined
3828            tables.
3829            (TestLoadError): New. Test whether missing required attributes
3830            cause a LoadError.
3831    
3832            * test/test_save.py (SaveSessionTest.thubanids)
3833            (SaveSessionTest.thubanidrefs): New class attributes for ID
3834            normalization in .thuban files.
3835            (SaveSessionTest.compare_xml): Use id-normalization.
3836            (SaveSessionTest.testEmptySession)
3837            (SaveSessionTest.testLayerProjection)
3838            (SaveSessionTest.testRasterLayer)
3839            (SaveSessionTest.testClassifiedLayer): Adapt to new file format.
3840            (SaveSessionTest.testLayerProjection): The filename used was the
3841            same as for testSingleLayer. Use a different one.
3842            (SaveSessionTest.test_dbf_table)
3843            (SaveSessionTest.test_joined_table): New test cases for saving the
3844            new data sources structures.
3845            (TestStoreSort, MockDataStore): Classes to test the sorting of the
3846            data stores for writing.
3847    
3848            * test/runtests.py: Add CVS keywords
3849    
3850    2003-06-20  Jonathan Coles   <[email protected]>
3851    
3852            * test/test_session.py
3853            (UnreferencedTablesTests.test_unreferenced_tables_with_joins):
3854            Use the cultural_landmark-point.dbf file for the store so that
3855            the table rows and shape count match.
3856    
3857    2003-06-20  Jonathan Coles   <[email protected]>
3858    
3859            * Thuban/Model/data.py (DerivedShapeStore.__init__): Raise
3860            an exception if the number of shapes is different from the
3861            number of rows in the table. Address RTbug #1933.
3862    
3863            * test/test_layer.py (TestLayer.test_derived_store): Add
3864            a test for the new exception in DerivedShapeStore.__init__.
3865    
3866            * test/support.py (FloatTestCase): Removed since there is
3867            already FloatComparisonMixin. Fixes RTbug #1954.
3868            (FloatComparisonMixin.assertFloatEqual): Include test for
3869            infinity that was part of FloatTestCase.
3870    
3871            * test/test_range.py (RangeTest): Inherit from
3872            support.FloatComparisonMixin now that we don't have
3873            support.FloatTestCase.
3874    
3875    2003-06-20  Bernhard Herzog  <[email protected]>
3876    
3877            * test/test_save.py (SaxEventLister, sax_eventlist): Removed. Use
3878            the implementation in xmlsupport instead.
3879            (SaveSessionTest.compare_xml): sax_eventlist is now in xmlsupport
3880    
3881            * test/test_proj.py: Import sax_eventlist from xmlsupport instead
3882            of test_save
3883    
3884    2003-06-20  Bernhard Herzog  <[email protected]>
3885    
3886            * test/test_load.py (LoadSessionTest.check_format): New helper
3887            method to make sure the test files we load might have been written
3888            by the current thuban version.
3889            (ClassificationTest.TestLayers, TestSingleLayer.test)
3890            (TestLayerVisibility.test, TestClassification.test)
3891            (TestLabels.test, TestLayerProjection.test, TestRasterLayer.test):
3892            Add check_format() calls and fix the thuban data to match the data
3893            that would be written by saving the session loaded from it.
3894    
3895            * test/xmlsupport.py (SaxEventLister, sax_eventlist): Copies of
3896            the same class and function in test_save.
3897    
3898            * test/test_xmlsupport.py (TestEventList): New. test cases for
3899            sax_eventlist
3900    
3901    2003-06-20  Bernhard Herzog  <[email protected]>
3902    
3903            * Resources/XML/thuban.dtd: Add comment about which versions of
3904            Thuban are covered by this DTD
3905            (map): Fix content model for layers and raster layers. There can
3906            be any number or layers and raster layers in any order.
3907    
3908    2003-06-20  Jonathan Coles   <[email protected]>
3909    
3910            This is mainly about fixing RTbug #1949.
3911    
3912            * Thuban/Model/classification.py: Remove "from __future__"
3913            import statement since python 2.2 is the earliest supported
3914            version.
3915    
3916            * Thuban/Model/proj.py (Projection.GetProjectedUnits): New.
3917            Currently returns PROJ_UNITS_METERS or PROJ_UNITS_DEGREES
3918            depending on the units this projection *forwards* into.
3919    
3920            * Thuban/Model/save.py (SessionSaver.write_classification):
3921            Remove unnecessary use of lambdas and nested functions.
3922    
3923            * Thuban/UI/legend.py (ScaleBarBitmap.__SetScale): Do scale
3924            adjustment here if the map projection uses degrees.
3925    
3926            * Thuban/UI/scalebar.py (ScaleBar.DrawScaleBar): Remove
3927            scale adjust code since it is now done before calling
3928            this method. Don't do anything if the map projection
3929            is None.
3930    
3931    2003-06-19  Bernhard Herzog  <[email protected]>
3932    
3933            Move version specific load tests to their own file.
3934    
3935            * test/test_load.py: Expand the doc-string to explain a bit how to
3936            handle file format changes.
3937            (TestClassification.test): Update the docstring as this test is
3938            not about Thuban 0.2 anymore.
3939    
3940            * test/test_load_0_2.py: New file with the load tests for thuban
3941            files created with Thuban 0.2 and earlier.
3942    
3943    2003-06-19  Bernhard Herzog  <[email protected]>
3944    
3945            Add XML validation to some of the tests. Validation will only be
3946            done if pyRXP is installed (http://reportlab.com/xml/pyrxp.html).
3947            To make the DTD available to the test cases it's moved into
3948            Resources/XML
3949    
3950            * Resources/XML/thuban.dtd: New. This is now the real Thuban DTD
3951            for versions up to and including 0.2. Two slight changes: added an
3952            encoding specification and fixed the comment which refered to
3953            GRASS, not Thuban
3954    
3955            * test/xmlsupport.py: New support module for tests involving XML.
3956            Currently there's a mix-in class for XML validation.
3957    
3958            * test/test_xmlsupport.py: New. Tests for the xmlsupport module
3959    
3960            * test/test_save.py (SaveSessionTest): Derive from ValidationTest
3961            so that we can validate the
3962            (SaveSessionTest.testEmptySession)
3963            (SaveSessionTest.testSingleLayer)
3964            (SaveSessionTest.testSingleLayer)
3965            (SaveSessionTest.testLayerProjection)
3966            (SaveSessionTest.testRasterLayer)
3967            (SaveSessionTest.testClassifiedLayer): Validate the generated XML
3968    
3969            * test/runtests.py (main): Call print_additional_summary instead
3970            of print_garbage_information
3971    
3972            * test/support.py (resource_dir): New function to return the
3973            "Resource" subdirectory
3974            (print_additional_summary): New function to combine several
3975            summary functions
3976            (run_tests): Use print_additional_summary instead of calling
3977            print_garbage_information directly
3978    
3979    2003-06-19  Bernhard Herzog  <[email protected]>
3980    
3981            * Doc/thuban.dtd (classification): Correct the content model of
3982            the classification element.
3983            (projection): Add the "name" attribute
3984    
3985    2003-06-19  Frank Koormann   <[email protected]>
3986    
3987            MERGE from the greater-ms3 branch.
3988    
3989            * Thuban/UI/scalebar.py (ScaleBar.DrawScaleBar): Apply conversion to
3990            scale if projection is latlong to get better estimate.
3991    
3992            Fix problem of hidden properties dialog under windows after double
3993            click on layer tree:
3994            The tree control always gets an Expanded / Collapsed event after
3995            the ItemActivated  on double click, which raises the main window again.         We add a second ItemActivated event to the queue, which simply
3996            raises the already displayed window.
3997    
3998            * Thuban/UI/legend.py (LegendTree.__init__): Instance variable
3999            raiseProperties initialized to prevent endless loops
4000            (LegendTree._OnItemActivated): Depending on self.raiseProperties
4001            simply raise the properties or open the dialog and issue a second
4002            event.
4003    
4004    2003-06-18  Jonathan Coles   <[email protected]>
4005    
4006            * setup.py: Fix a few problems that occured under Windows.
4007    
4008    2003-06-18  Jonathan Coles   <[email protected]>
4009    
4010            When Thuban loaded the map was redrawn twice because the
4011            legend was being opened after the mainwindow was created
4012            and not during its creation. This meant the map was drawn
4013            initially and then had to be redrawn when the legend
4014            caused the display to change. Now the legend is opened
4015            in the mainwindow constructor which resolves this issue.
4016    
4017            Also, although we were checking for the existence of
4018            gdal and gdalwarp modules, the gdalwarp extension was
4019            still being compiled (which may fail if the system doesn't
4020            have gdal installed). the build_ext command to setup.py
4021            now accepts the flags --with-gdal and --without-gdal.
4022            If --without-gdal is specified setup.py will try to
4023            use the gdal parameters specified by gdal-config. Under
4024            windows, those parameters have to be set in setup.py
4025            as with proj4 an wxWindows.
4026    
4027            * setup.py: Use a list instead of seperate variables for
4028            extension parameters so we can create a generic function
4029            that runs an appropriate *-config script.
4030            (run_cs_script): Renamed from run_wx_script and modified
4031            to accept a second argument which is a list of lists to
4032            be filled in by the values returned from running the command.
4033            (thuban_build_ext): New. Extends the build_ext command and
4034            provides the options --with-gdal/--without-gdal which then
4035            optionally includes the gdalwarp extension.
4036    
4037            * Thuban/Model/resource.py: First check if we can import
4038            the gdalwarp Thuban extension before checking for gdal.
4039            Also added some comments.
4040            
4041            * Thuban/UI/legend.py (ScaleBarBitmap.__SetScale): Check if
4042            the map is None which may be the case if none has been loaded
4043            yet.
4044    
4045            * Thuban/UI/main.py (main): Remove call to ShowLegend.
4046    
4047            * Thuban/UI/mainwindow.py (MainWindow.__init__): Call ShowLegend().
4048    
4049            * Thuban/UI/renderer.py: Check for gdal support before importing
4050            gdalwarp.
4051            (MapRenderer.render_map): Only try to optimize if we have gdal
4052            support otherwise nothing will get drawn.
4053    
4054            * Thuban/UI/view.py (MapCanvas.FitMapToWindow): This may be called
4055            during startup before a map has been created. Check if map is None
4056            before using it and do nothing if it is.
4057    
4058    2003-06-17  Jonathan Coles   <[email protected]>
4059    
4060            Fix the problem with raster layers under Windows that caused
4061            Thuban to crash. The view should respond to layer projection
4062            changed events to update the display. Changes to a projection
4063            should not cause the map to be set to full extent.
4064            
4065            * Thuban/UI/view.py (MapCanvas.__init__): New instance variable
4066            current_map_proj to remember the current map projection so that
4067            when the projection changes we know what the previous projection
4068            was.
4069            (MapCanvas.SetMap): Unsubscribe and subscribe to
4070            LAYER_PROJECTION_CHANGED events.
4071            (MapCanvas.projection_changed): Split into two methods that respond
4072            to map and layer projection changes.
4073            (MapCanvas.map_projection_changed): New. Takes the current view and
4074            projects it using the new projection. This does not cause the
4075            map to be redrawn at full extent.
4076            (MapCanvas.layer_projection_changed): New. Cause a redraw which
4077            will draw each layer in its new projection.
4078            
4079            * extensions/thuban/bmpdataset.cpp (BMPDataset::Open): Call
4080            VSIFClose() not VSIFCloseL() to close the file. Fixes a crash
4081            under Windows.
4082            
4083            * extensions/thuban/gdalwarp.cpp (MFILENAME): Padding should be
4084            to twice sizeof(void*) because there are two digits for each
4085            hex byte.
4086    
4087    2003-06-16  Bernhard Herzog  <[email protected]>
4088    
4089            Update to the layer interface: Direct access to the table,
4090            shapetable, shapefile and filename attributes is now actively
4091            deprecated by issuing deprecation warnings for all places where
4092            this happens.
4093    
4094            * Thuban/Model/layer.py (Layer.__getattr__): New. Implement access
4095            to the instance variables table, shapetable, shapefile and
4096            filename via __getattr__ so that we can issue a deprecation
4097            warning.
4098            (Layer.SetShapeStore): Don't set the deprecated instance variables
4099            any more
4100            (Layer.SetShapeStore): Don't use deprecated layer instance
4101            variables
4102            (Layer.Destroy): No need to explicitly remove the instance
4103            variables any more
4104            (Layer.GetFieldType, Layer.Shape): Don't use deprecated layer
4105            instance variables
4106    
4107            * Thuban/UI/classgen.py (ClassGenDialog.__init__)
4108            (GenUniformPanel._OnRetrieve, GenUniquePanel._OnRetrieve)
4109            (GenQuantilesPanel.GetList, GenQuantilesPanel.OnRetrieve): Don't
4110            use deprecated layer instance variables
4111    
4112            * Thuban/UI/classifier.py (Classifier.__init__): Don't use
4113            deprecated layer instance variables
4114    
4115            * Thuban/UI/identifyview.py (IdentifyListCtrl.selected_shape)
4116            (IdentifyGridCtrl.selected_shape): Don't set the deprecated layer
4117            instance variables
4118    
4119            * Thuban/UI/tableview.py (LayerTableGrid.select_shapes): Don't use
4120            deprecated layer instance variables
4121    
4122            * Thuban/UI/mainwindow.py (MainWindow.LayerShowTable): Don't use
4123            deprecated layer instance variables
4124    
4125            * Thuban/Model/save.py (SessionSaver.write_layer): Don't use
4126            deprecated layer instance variables
4127    
4128            * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer)
4129            (MapRenderer.polygon_render_param): Don't use deprecated layer instance
4130            variables
4131    
4132            * test/runtests.py (main): Turn Thuban's deprecation warnings into
4133            errors so that they're cought by the tests
4134    
4135            * test/test_load.py (TestSingleLayer.test): Don't use deprecated
4136            layer instance variables
4137    
4138    2003-06-16  Jonathan Coles   <[email protected]>
4139    
4140            Fix a problem under Windows whereby if the user double-clicks on a
4141            layer in the legend that tree item will expand or collapse as well
4142            as open the layer properties dialog. The state of the tree item
4143            should not be affected.
4144    
4145            * Thuban/UI/legend.py (LegendTree.__init__): Add instance variable
4146            preventExpandCollapse and subscribe to expanding and collapsing
4147            events.
4148            (LegendTree.OnItemExpandCollapse): New. Responds to expanding and
4149            collapsing events and will veto the event if it has been triggered
4150            by the user double clicking on a layer.
4151            (LegendTree._OnItemActivated): Set preventExpandCollapse to indicate
4152            that an expanding/collapsing event should be vetoed.
4153    
4154    2003-06-13  Bernhard Herzog  <[email protected]>
4155    
4156            * Thuban/UI/classifier.py (Classifier.OnClose)
4157            (Classifier.map_layers_removed)
4158            (Classifier.layer_shapestore_replaced): Unsubscribe the messages
4159            in OnClose and not in map_layers_removed or
4160            layer_shapestore_replaced to make sure it always happens when the
4161            dialog is closed
4162    
4163    2003-06-13  Jonathan Coles   <[email protected]>
4164    
4165            This puts back a fix for Windows where a panel is needed so that
4166            the background of the table view appears correctly.
4167    
4168            * Thuban/UI/tableview.py (TableFrame.__init__): Add a panel
4169            object that can be used by derived classes to place any
4170            controls (including the grid) onto.
4171            (QueryTableFrame.__init__): Use the panel as the parent window
4172            for all the controls. Reparent the grid so that the panel is
4173            the parent. Call UpdateStatusText() to correctly initialize
4174            the status bar.
4175    
4176    2003-06-13  Jonathan Coles   <[email protected]>
4177    
4178            * Thuban/UI/dialogs.py (ThubanFrame): New: a class that inherits
4179            from wxFrame (as opposed to wxDialog like the other classes)
4180            but otherwise behaves like the other classes. This is needed
4181            for the TableView which isn't really a dialog and needs to
4182            have a status bar and control buttons.
4183    
4184            * Thuban/UI/tableview.py (TableGrid.__init__): Create an
4185            instance variable to keep track of how many rows are selected.
4186            Subscribe once to the the events we are interested in.
4187            (ThubanGrid.OnRangeSelect): Only handle event if event handling
4188            hasn't been turned off.
4189            (ThubanGrid.OnSelectCell): Only handle event if event handling
4190            hasn't been turned off.
4191            (ThubanGrid.ToggleEventListeners): Rather than subscribe None
4192            as an event listener (which changes the event handler stack)
4193            simply set an instance variable to False. This is checked in
4194            the event handlers.
4195            (ThubanGrid.GetNumberSelected): Return the number of currently
4196            selected rows.
4197            (TableFrame): Inherit from ThubanFrame so we can have a
4198            status bar and control buttons.
4199            (QueryTableFrame.__init__): Create a status bar. Fixes RTbug #1942.
4200            Explicitly set which items are selected in the operator choice and
4201            action choice so there is always a valid selection. Fixes RTbug #1941.
4202            Subscribe to grid cell selection events so we can update the
4203            status bar.
4204            (QueryTableFrame.UpdateStatusText): Update the status bar with
4205            how many rows are in the grid, how many columns, and how many
4206            rows are selected.
4207            (QueryTableFrame.OnGridSelectRange, QueryTableFrame.OnGridSelectCell):
4208            Call UpdateStatusText when cells are (de)selected.
4209            (QueryTableFrame.OnQuery): Use the string value in the value
4210            combo if either the selected item index is 0 or if the string
4211            cannot be found in the predefined list (this happens if the
4212            user changes the text). Fixes RTbug #1940.
4213            Only turn off the grid event listeners if there a query comes
4214            back with a none empty list of ids. in the case that the list
4215            is empty this causes a grid.ClearSelection() call to actually
4216            clear the grid selection which causes the selected items in
4217            the map to be deselected. Fixes RTbug #1939.
4218    
4219            * test/test_save.py (XMLWriterTest.Encode): Check return values.
4220            Fixes RTbug #1851.
4221    
4222    2003-06-13  Bernhard Herzog  <[email protected]>
4223    
4224            * Thuban/UI/identifyview.py (IdentifyView.__init__): Call
4225            self.selected_shape with the current selection to make sure the
4226            contents of the dialog are up to date when it's shown for the
4227            first time.
4228            The dialog used to work without this by luck. The recent fix to
4229            the connector module 'broke' a 'feature' the identify view was
4230            relying on, i.e that subscribing to a message in response to
4231            receiving a message of that type would mean that the new
4232            subscriber would also be called for the same message.
4233            
4234    2003-06-12  Jonathan Coles   <[email protected]>
4235    
4236            * extensions/thuban/gdalwarp.cpp: Removed debug printing as
4237            the image is rendered. Fixes RTbug #1937.
4238    
4239    2003-06-12  Jonathan Coles   <[email protected]>
4240    
4241            * Thuban/Lib/fileutil.py: As is done under Windows, create the
4242            user directory if it doesn't exist on a posix system.
4243            Fixes RTbug #1815.
4244    
4245            * Thuban/Model/resource.py (get_user_proj_files): Moved the
4246            called to get_application_dir here, so that the directory
4247            will only be called if this method is invoked.
4248    
4249            * Thuban/UI/projdialog.py (ProjFrame.__DoOnProjAvail): Clear
4250            the projfilepath if no projection is selected.
4251    
4252    2003-06-12  Jonathan Coles   <[email protected]>
4253    
4254            * Thuban/UI/legend.py (ScaleBarBitmap.__SetScale): Don't draw
4255            the scalebar if the current map has no projection set.
4256    
4257            * Thuban/UI/projdialog.py (ProjFrame.__DoOnProjAvail): Set the
4258            projfilepath label to just the basename of the projection file
4259            rather than include the entire path.
4260    
4261            * Thuban/Model/resource.py: Fix missed proj functions that
4262            needed to be renamed.
4263    
4264    2003-06-12  Jonathan Coles   <[email protected]>
4265    
4266            * Thuban/Model/classification.py: Removed assert statements that
4267            tested if the variable was an instance of Color.
4268    
4269            * Thuban/Model/color.py (Color): Remove commented code that isn't
4270            used.
4271            (Transparent): Renamed from NoColor. Doesn't inherit from Color.
4272            Fixes RTbug #1835.
4273            (Transparent.__eq__, Transparent.__ne, Transparent.__repr): New.
4274            Needed now that the class doesn't inherit from Color.
4275    
4276    2003-06-12  Jonathan Coles   <[email protected]>
4277    
4278            * test/test_save.py (XMLWriterTest.testEncode): Explicitly
4279            check unicode strings.
4280    
4281            * test/test_layer.py: Check for existence of gdal.
4282    
4283    2003-06-12  Jonathan Coles   <[email protected]>
4284        
4285            * Thuban/Model/xmlreader.py: New. Contains the XMLReader class
4286            that was in load.py
4287    
4288            * Thuban/Model/xmlwriter.py: New. Contains the XMLWriter class
4289            that was in save.py
4290    
4291    2003-06-12  Jonathan Coles   <[email protected]>
4292    
4293            This is largely a collection of bug fixes. We also handle the
4294            case where gdal is not on the system. The XMLReader and XMLWriter
4295            classes were moved into there own files to resolve some circular
4296            import references and because they shouldn't really be in the
4297            file that is dediciated to reading/writing session files since
4298            they are also used elsewhere.
4299    
4300            * Thuban/Model/classgen.py: Renamed functions to follow the
4301            function_names_with_underscores style. Fixes RTbug #1903.
4302            (calculate_quantiles): Raise ValueError if 'percents' is invalid.
4303    
4304            * Thuban/Model/layer.py: Import gdal only if it available.
4305            (RasterLayer): Handle the case where the gdal library is unavailable.
4306            Addresses RTbug #1877.
4307    
4308            * Thuban/Model/load.py (XMLReader): Moved into seperate file
4309            xmlreader.py.
4310    
4311    2003-06-12  Jonathan Coles   <[email protected]>
4312    
4313            This is largely a collection of bug fixes. We also handle the
4314            case where gdal is not on the system. The XMLReader and XMLWriter
4315            classes were moved into there own files to resolve some circular
4316            import references and because they shouldn't really be in the
4317            file that is dediciated to reading/writing session files since
4318            they are also used elsewhere.
4319    
4320            * Thuban/Model/classgen.py: Renamed functions to follow the
4321            function_names_with_underscores style. Fixes RTbug #1903.
4322            (calculate_quantiles): Raise ValueError if 'percents' is invalid.
4323    
4324            * Thuban/Model/layer.py: Import gdal only if it available.
4325            (RasterLayer): Handle the case where the gdal library is unavailable.
4326            Addresses RTbug #1877.
4327    
4328            * Thuban/Model/load.py (XMLReader): Moved into seperate file
4329            xmlreader.py.
4330    
4331            * Thuban/Model/save.py (escape, XMLWriter): Moved into seperate
4332            file xmlwriter.py.
4333    
4334            * Thuban/Model/resource.py: Renamed functions to following the
4335            function_names_with_underscores style.
4336            (has_gdal_support): New function that returns true if the gdal
4337            library is available. Addresses RTbug #1877.
4338    
4339            * Thuban/UI/application.py (ThubanApplication.OpenSession):
4340            Display a message box if the gdal library is not available, but
4341            only if there are any layers that would use it. Addresses RTbug #1877.
4342    
4343            * Thuban/UI/classgen.py: Use renamed projection resource functions.
4344            (GenUniformPanel.__CalcStepping): Fix a slight discrepency
4345            when using integers versus floats.
4346    
4347            * Thuban/UI/mainwindow.py (_has_gdal_support): New. Used to
4348            determine if the "Add Image Layer" menu option should be
4349            greyed out or not. Addresses RTbug #1877.
4350    
4351            * Thuban/UI/projdialog.py: Use renamed projection resource functions.
4352    
4353            * Thuban/UI/renderer.py (MapRenderer.render_map): Only try to
4354            optimize if a raster layer is visible. Fixes RTbug #1931.
4355            Only draw the raster layer if the gdal library is available.
4356            Addresses RTbug #1877.
4357    
4358            * test/test_classgen.py: Add tests for generate_singletons,
4359            generate_uniform_distribution, generate_quantiles. Fixes RTbug #1903.
4360            (test_calculate_quantiles): Fix some tests to catch the new
4361            ValueError that is raised.
4362    
4363            * test/test_proj.py: Use renamed projection resource functions.
4364    
4365            * test/test_save.py (SaveSessionTest.testClassifiedLayer): New
4366            test for saving classified layers. Fixes RTbug #1902.
4367            (XMLWriterTest): New. Tests the XMLWriter class. Fixes RTbug #1851.
4368    
4369    2003-06-12  Jan-Oliver Wagner <[email protected]>
4370    
4371            Fix for http://intevation.de/rt/webrt?serial_num=1900.
4372    
4373            * Thuban/UI/multiplechoicedialog.py: New. A multiple choice dialog.
4374    
4375            * Thuban/UI/mainwindow.py: import wxMultipleChoiceDialog from
4376            multiplechoicedialog.py rather than from the wxPython library.
4377    
4378    2003-06-11  Frank Koormann  <[email protected]>
4379    
4380            * Thuban/Lib/fileutil.py (get_application_dir): Minor stability
4381            update.
4382    
4383    2003-06-11  Frank Koormann  <[email protected]>
4384    
4385            * Thuban/Lib/fileutil.py (get_application_dir): New function to
4386            determine the absolute .thuban/thuban directory under
4387            "posix" (os.expanduser) and "nt" (read AppData registry key).
4388    
4389            * Thuban/Model/resource.py: Use get_application_dir
4390    
4391            * Thuban/UI/application.py (ThubanApplication.read_startup_files):
4392            Use get_application_dir.
4393    
4394    2003-06-10  Bernhard Herzog  <[email protected]>
4395    
4396            * Thuban/UI/tableview.py (LayerTableFrame.__init__): Subscribe to
4397            the messages MAP_LAYERS_REMOVED messages
4398            (LayerTableFrame.OnClose): Unsubscribe from it.
4399            (LayerTableFrame.map_layers_removed): New. Receiver for
4400            MAP_LAYERS_REMOVED. Close the dialog when the layer whose the
4401            dialog is showing is removed.
4402    
4403    2003-06-10  Bernhard Herzog  <[email protected]>
4404    
4405            * Thuban/Lib/connector.py (Connector.Issue): Iterate over a copy
4406            of the receivers list so that unsubscribing in a receiver doesn't
4407            modify it while iterating over it.
4408    
4409            * test/test_connector.py
4410            (ConnectorTest.test_disconnect_in_receiver): New. Test whether
4411            unsubscribing in a receiver works correctly. See docstring for
4412            details
4413    
4414    2003-06-10  Bernhard Herzog  <[email protected]>
4415    
4416            * Thuban/Model/messages.py (LAYER_SHAPESTORE_REPLACED): New
4417            message.
4418    
4419            * Thuban/Model/layer.py (Layer.SetShapeStore): Send
4420            LAYER_SHAPESTORE_REPLACED when the shapestore changes. A
4421            LAYER_CHANGED will still be sent if the classification changes.
4422    
4423            * Thuban/UI/classifier.py (Classifier.__init__): Add the map as
4424            parameter so we can subscribe to some of its messages
4425            (Classifier.__init__): Subscribe to the map's MAP_LAYERS_REMOVED
4426            and the layer's LAYER_SHAPESTORE_REPLACED
4427            (Classifier.unsubscribe_messages): New. Unsubscribe from message
4428            subscribed to in __init__
4429            (Classifier.map_layers_removed)
4430            (Classifier.layer_shapestore_replaced): receivers for the messages
4431            subscribed to in __init__. Unsubscribe and close the dialog
4432    
4433            * Thuban/UI/mainwindow.py (MainWindow.OpenLayerProperties): Pass
4434            the map to the Classifier dialog
4435    
4436            * test/test_layer.py (SetShapeStoreTests): Derive from
4437            SubscriberMixin as well so we can test messages
4438            (SetShapeStoreTests.setUp): Subscribe to some of the layer's
4439            messages
4440            (SetShapeStoreTests.tearDown): Clear the messages again
4441            (SetShapeStoreTests.test_sanity): Expand the doc-string and check
4442            for the modified flag too
4443            (SetShapeStoreTests.test_set_shape_store_modified_flag): New test
4444            to check whether SetShapeStore sets the modified flag
4445            (SetShapeStoreTests.test_set_shape_store_different_field_name)
4446            (SetShapeStoreTests.test_set_shape_store_same_field)
4447            (SetShapeStoreTests.test_set_shape_store_same_field_different_type):
4448            Add tests for the messages. This checks both the new
4449            LAYER_SHAPESTORE_REPLACED and the older LAYER_CHANGED
4450    
4451    2003-06-06  Jan-Oliver Wagner <[email protected]>
4452    
4453            * Thuban/UI/mainwindow.py: Improved and partly added help texts for
4454            the menu items.
4455    
4456    2003-06-05  Frank Koormann  <[email protected]>
4457    
4458            * Thuban/UI/identifyview.py (IdentifyView.__init__):
4459            Layout reimplemented without panel. Make life easier to fit the list
4460            in the dialog.
4461    
4462    2003-06-05  Frank Koormann  <[email protected]>
4463    
4464            * Thuban/UI/projdialog.py (ProjFrame.__init__): Fill the projchoice
4465            once on initialisation (Former implementation resulted in multiple
4466            entries for each projection).
4467            (ProjFrame.__FillAvailList): selectProj as second optional parameter,
4468            if set, select the projection found under the specified name. This
4469            overwrites any other selection estimate.
4470            Removed projchoice filling from this method.
4471            (ProjFrame._OnSave, ProjFrame._OnAddToList):
4472            Updated call of ProjFrame.__FillAvailList
4473            (LCCPanel._DoLayout): Moved parameter controls in more common order.
4474    
4475            * Resources/Projections/defaults.proj: Extended defaults representing
4476            various common European projections.
4477    
4478    2003-06-05  Frank Koormann  <[email protected]>
4479    
4480            * Thuban/UI/identifyview.py (IdentifyView.__init__):
4481            Use ListCtrl instead of GridCtrl
4482    
4483            * Thuban/Model/resource.py:
4484            Guess location of .thuban directory from tempdir parent directory.
4485    
4486            * Thuban/UI/application.py (ThubanApplication.read_startup_files):
4487            Guess location of .thuban directory from tempdir parent directory.
4488    
4489    2003-06-04  Bernhard Herzog  <[email protected]>
4490    
4491            Do not cache the values returned by the tree widget's
4492            GetFirstChild and GetNextChild methods because it led to lots of
4493            segfaults. The new way requires more brute force but is more
4494            reliable.
4495    
4496            * Thuban/UI/legend.py (LegendTree.__init__): Remove instance
4497            variable layer2id
4498            (LegendTree.find_layer): New method to do with brute force what
4499            layer2id tried to accomplish
4500            (LegendTree._OnMsgLayerChanged)
4501            (LegendTree._OnMsgLayerTitleChanged, LegendTree.__ShowHideLayer):
4502            Use find_layer instead of layer2id
4503            (LegendTree.__RemoveLayer, LegendTree.__AddLayer): No need to
4504            update layer2id anymore
4505            (LegendTree._OnMsgMapLayersRemoved)
4506            (LegendTree._OnMsgMapLayersAdded): Get by without layer2id.
4507    
4508    2003-06-03  Thomas Koester  <[email protected]>
4509    
4510            * Thuban/Model/classgen.py (GenQuantiles0): New function.
4511    
4512    2003-06-02  Bernhard Herzog  <[email protected]>
4513    
4514            * Thuban/UI/mainwindow.py (layer_rename command, table_rename command):
4515            New commands.
4516            (main_menu): Add the new commands.
4517            (MainWindow.TableRename): New. Implementation of the table_rename
4518            command.
4519            (MainWindow.RenameLayer): New. Implementation of the layer_rename
4520            command.
4521    
4522            * Thuban/Model/session.py (Session.AddTable): call self.changed to
4523            set the modified flag
4524    
4525            * test/test_session.py (TestSessionSimple.test_add_table): Test
4526            whether the modified flag is set properly
4527    
4528            * Thuban/Model/base.py (TitledObject.SetTitle): Call changed
4529            instead of issue so that the modified flags get updated.
4530    
4531            * test/test_base.py (SomeTitledObject): Derive from Modifiable
4532            instead of Publisher to reflect reality better and to accomodate
4533            the fact that SetTitle now calls changed instead of issue
4534    
4535    2003-06-02  Bernhard Herzog  <[email protected]>
4536    
4537            * Thuban/UI/classgen.py (GenQuantilesPanel.GetList): Resource
4538            acquisition has to happen before the try in a try-finally.
4539    
4540    2003-06-02  Bernhard Herzog  <[email protected]>
4541    
4542            * Thuban/UI/legend.py (LegendTree._OnMsgMapLayersRemoved): It's
4543            possible that a layer is removed that is not currently selected in
4544            the legend so don't check for this.
4545    
4546    2003-05-30  Bernhard Herzog  <[email protected]>
4547    
4548            * Thuban/Model/layer.py (Layer.Destroy): Set all instance
4549            variables to None that have direct or indirect references to
4550            shapefiles or dbf files to make sure that they do go away and the
4551            files are closed.
4552    
4553    2003-05-30  Bernhard Herzog  <[email protected]>
4554    
4555            * Thuban/UI/legend.py (LegendTree.GetRootItem): Reset
4556            availImgListIndices when a new image list is created
4557            
4558    2003-05-30  Bernhard Herzog  <[email protected]>
4559    
4560            * Thuban/UI/legend.py (LegendTree.__init__): New instance variable
4561            changing_selection to indicate whether the LegendTree code itself
4562            is currently changing the selection
4563            (LegendTree.normalize_selection): New method to normalize the
4564            selection by selecting the layer item even if the user clicked on
4565            the classification.
4566            (LegendTree._OnSelChanged): normalize the selection. This works
4567            around a bug in wx which doesn't keep track of the selection
4568            properly when subtrees are deleted.
4569    
4570    2003-05-30  Bernhard Herzog  <[email protected]>
4571    
4572            * Thuban/UI/view.py (MapCanvas.set_view_transform): Limit the
4573            maximum and minimum scale factors.
4574    
4575            * test/test_classgen.py (ClassGenTest.test): Update to reflect the
4576            changes in classgen.py
4577    
4578    2003-05-30  Jonathan Coles   <[email protected]>
4579    
4580            * Thuban/Model/classgen.py: Remove ClassGenerator class but make
4581            all the methods functions. Fixes RTBug #1903.
4582    
4583            * Thuban/Model/map.py (Map.TopLayer, Map.BottomLayer): Renamed
4584            to MoveLayerToTop and MoveLayerToBottom respectively. Fixes
4585            RTBug #1907.
4586    
4587            * Thuban/UI/classgen.py: Use classgen functions that were part
4588            of the ClassGenerator class. Put try/finally blocks around
4589            code that uses wxBeginBusyCursor()/wxEndBusyCursor(). Fixes
4590            RTBug #1904.
4591    
4592            * Thuban/UI/classifier.py: Remove unused import of ClassGenerator.
4593    
4594            * Thuban/UI/legend.py: The legend was cleared and repopulated any
4595            time something changed which caused some state to be lost such
4596            as which children were expanded or collapsed. Fixes RTBug #1901.
4597            (LegendTree._OnMsgMapLayersAdded): Add only new layers.
4598            (LegendTree.__OnMsgMapLayersRemoved): Remove layers that exist in
4599            the legend but not in the map.
4600            (LegendTree.__FillTree): Move main functionality out into smaller
4601            methods that can be used by other methods.
4602            (LegendTree.__FillTreeLayer): Reuse old slots in the image list
4603            if they are available.
4604            (LegendTree.DeleteAllItems): Renamed from __DeleteAllItems so
4605            that we override the wxTreeCtrl method. Iterate over children
4606            and call __RemoveLayer.
4607            (LegendTree.__AddLayer): New. Add a new layer to the legend.
4608            (LegendTree.__RemoveLayer): Remove a layer from the legend.
4609            (LegendTree.DeleteChildren): New, overrides wxTreeCtrl method.
4610            Should only be called with the id of a layer branch.
4611            (LegendTree.GetRootItem): New, overrides wxTreeCtrl method.
4612            Returns the root item or creates one if necessary.
4613    
4614            * Thuban/UI/renderer.py (MapRenderer.draw_raster_layer): Call
4615            ProjectRasterFile with tuple arguments instead of strings.
4616    
4617            * Thuban/UI/tableview.py (QueryTableFrame.OnQuery): Wrap code
4618            with try/finally. Fixes RTBug #1904.
4619    
4620            * Thuban/UI/view.py (MapCanvas.OnPaint): Wrap code
4621            with try/finally. Fixes RTBug #1904.
4622            (MapCanvas.FitSelectedToWindow): If a single point is selected
4623            simply center it on the display. Fixes RTBug #1849.
4624    
4625            * extensions/thuban/gdalwarp.cpp: Removed code that allowed gdalwarp
4626            to be compiled as a standalone app. Now the code can only be
4627            called from Python which simplifies the parameter passing.
4628            (ProjectRasterFile): Handle Python arguments. Remove code that
4629            checks for a destination dataset. Add more clean up code.
4630    
4631            * test/test_map.py (TestMapWithContents.test_raise_layer_top,
4632            TestMapWithContents.test_lower_layer_bottom):
4633            Test Map.MoveLayerToTop() and Map.MoveLayerToBottom() respectively.
4634            Fixes RTBug #1907.
4635    
4636            * Thuban/UI/mainwindow.py (MainWindow.ToggleLegend): Apply a full
4637            extent to the map when the legend is toggled. Fixes RTBug #1881.
4638    
4639    2003-05-29  Jan-Oliver Wagner <[email protected]>
4640    
4641            * Thuban/UI/tableview.py (LayerTableFrame.OnClose): Bug-fix: Now
4642            unsubscribes all that is subcribed in __init__.
4643    
4644    2003-05-28  Bernhard Herzog  <[email protected]>
4645    
4646            * Thuban/UI/mainwindow.py (MainWindow.DuplicateLayer)
4647            (MainWindow.CanDuplicateLayer): New methods to implement the
4648            Layer/Duplicate command.
4649            (layer_duplicate command): New.
4650            (main_menu): Add layer_duplicate to the Layer menu.
4651    
4652    2003-05-28  Bernhard Herzog  <[email protected]>
4653    
4654            * Thuban/UI/tableview.py (NullRenderer.Draw): New. Our own
4655            renderer so that NULL/None values get displayed differently (by a
4656            gray rectangle).
4657            (TableGrid.__init__): Override the default renderers
4658    
4659    2003-05-28  Bernhard Herzog  <[email protected]>
4660    
4661            * Thuban/Model/layer.py (Layer.SetShapeStore): Set the
4662            classification to "None" if the type of the field has changed.
4663    
4664            * test/test_layer.py (SetShapeStoreTests): New. Class with a few
4665            test for the Layer.SetShapeStore method
4666    
4667    2003-05-28  Jan-Oliver Wagner <[email protected]>
4668    
4669            * Thuban/Model/layer.py (Layer.TreeInfo): Fixed a bug (a layer
4670            does not necessarily have a filename).
4671    
4672    2003-05-28  Jan-Oliver Wagner <[email protected]>
4673    
4674            * Thuban/UI/mainwindow.py (MainWindow.TableClose, MainWindow.TableShow):
4675            sort the selection list for the dialog.
4676    
4677    2003-05-28  Frank Koormann  <[email protected]>
4678    
4679            * extensions/thuban/wxproj.cpp
4680            (project_point): Removed cast to int for projected point coordinates.
4681            (shape_centroid): Return last point if all polygon vertices fall
4682            to one point.
4683    
4684    2003-05-28  Bernhard Herzog  <[email protected]>
4685    
4686            * Thuban/UI/mainwindow.py (_can_unjoin): Add doc-string and cope
4687            with layers that don't have shapestores, i.e. raster layers.
4688    
4689    2003-05-28  Bernhard Herzog  <[email protected]>
4690    
4691            * Thuban/Model/table.py (DBFTable.__init__): Omit the extension
4692            when determining the title from the filename.
4693    
4694            * test/test_dbf_table.py (TestDBFTable.test_title): Update to
4695            reflect changes in the way the title is derived from the filename
4696    
4697    2003-05-28  Frank Koormann  <[email protected]>
4698    
4699            * Thuban/UI/mainwindow.py (MainWindow.TableShow):
4700            Added wxDEFAULT_DIALOG_STYLE to show table dialog styles.
4701    
4702    2003-05-27  Bernhard Herzog  <[email protected]>
4703    
4704            * Thuban/UI/mainwindow.py (MainWindow.delegated_messages): Also
4705            delegate SelectedLayer.
4706            (MainWindow.LayerUnjoinTable): Implement.
4707            (_can_unjoin): New. Helper function for the sensitivity of the
4708            layer/unjoin command.
4709    
4710            * Thuban/Model/data.py (ShapefileStore.OrigShapeStore)
4711            (DerivedShapeStore.OrigShapeStore): New. Return the original
4712            shapestore. Used to figure out how to unjoin.
4713            (DerivedShapeStore.Shapefile): Fix a typo.
4714    
4715    2003-05-27  Bernhard Herzog  <[email protected]>
4716    
4717            * Thuban/UI/join.py (JoinDialog): Extend to handle layer joins as
4718            well
4719            (JoinDialog.__init__): Use the layer parameter and only build the
4720            left choice when a layer is given
4721            (JoinDialog.OnJoin): Handle layer joins as well
4722            (JoinDialog.OnLeftTable, JoinDialog.OnRightTable): Handle the case
4723            that the user selects the "Select..." item. The sensitivitly
4724            updating is now in update_sensitivity
4725            (JoinDialog.y): New method to refactor the sensitivity update of
4726            the join button into its own method.
4727    
4728            * Thuban/UI/mainwindow.py (MainWindow.LayerJoinTable): Implement.
4729    
4730    2003-05-27  Bernhard Herzog  <[email protected]>
4731    
4732            * Thuban/UI/mainwindow.py (table_close command): Make it sensitive
4733            iff there are unreferenced tables in the session
4734    
4735    2003-05-27  Bernhard Herzog  <[email protected]>
4736    
4737            * Thuban/Model/messages.py (TABLE_REMOVED): New message.
4738    
4739            * Thuban/Model/session.py (Session.UnreferencedTables): New method
4740            to return tables that are not referenced by other tables or shape
4741            stores and can be removed.
4742            (Session.RemoveTable): Issue a TABLE_REMOVED message after
4743            removing the table
4744    
4745            * Thuban/UI/mainwindow.py: Remove unused imports
4746            (MainWindow.TableClose): Implement.
4747    
4748            * Thuban/UI/tableview.py (TableFrame.__init__): Subscribe to some
4749            messages so that the frame will be automatically closed when a new
4750            session is opened or the table is removed.
4751            (TableFrame.OnClose): Unsubscribe the Subscriptions made in
4752            __init__
4753            (TableFrame.close_on_session_replaced)
4754            (TableFrame.close_on_table_removed): New. Subscribers that close
4755            the window
4756    
4757            * test/test_session.py (TestSessionMessages.test_remove_table)
4758            (TestSessionSimple.test_remove_table): Move the test to
4759            TestSessionSimple and add test for the TABLE_REMOVED message
4760            (TestSessionBase.setUp): Also subscribe to TABLE_REMOVED
4761            (TestSessionSimple.test_unreferenced_tables) New. Test for the
4762            UnreferencedTables method.
4763            (UnreferencedTablesTests): New. Class with some more sophisticated
4764            tests for UnreferencedTables.
4765    
4766    2003-05-27  Frank Koormann  <[email protected]>
4767    
4768            * Thuban/UI/tableview.py (QueryTableFrame.__init__): The "_S_election"
4769            display has some unwanted side effects. Removed again.
4770    
4771    2003-05-27  Frank Koormann  <[email protected]>
4772    
4773            * Resources/Bitmaps/legend_icon_layer.xpm: New, icon for legend.
4774    
4775            * Thuban/UI/legend.py (LegendTree.__FillTree): Use "legend_icon_layer"
4776    
4777    2003-05-27  Jan-Oliver Wagner <[email protected]>
4778    
4779            * test/test_menu.py (MenuTest.test): Added test for
4780            Menu.RemoveItem().
4781    
4782            * Thuban/UI/menu.py (Menu.RemoveItem): New. Remove an item from
4783            the menu.
4784    
4785    2003-05-27  Frank Koormann  <[email protected]>
4786            
4787            Nonmodal dialogs without parent (i.e. they can fall behind the main
4788            window)
4789    
4790            * Thuban/UI/mainwindow.py (MainWindow.OnClose): Explicitly destroy
4791            all dialogs in the dialogs dictionary and the canvas.
4792    
4793            * Thuban/UI/dialogs.py (NonModalNonParentDialog): New class, without
4794            parent, i.e. can fall behind other windows.
4795            (NonModalDialog.OnClose): Check is dialog is in mainwindow.dialog
4796            dictionary before removing it.
4797    
4798            * Thuban/UI/classifier.py: Dialog derived from NonModalNonParentDialog
4799    
4800            * Thuban/UI/projdialog.py: Dialog derived from NonModalNonParentDialog
4801            * Thuban/UI/tableview.py: Dialog derived from NonModalNonParentDialog
4802            * Thuban/UI/tree.py: Dialog derived from NonModalNonParentDialog
4803    
4804    2003-05-27  Bernhard Herzog  <[email protected]>
4805    
4806            * Thuban/UI/mainwindow.py (MainWindow.ShowTableView): New. Open a
4807            tableview dialog
4808            (MainWindow.TableShow): Use ShowTableView to open the dialogs.
4809            Also, don't use the table's titles as the dialog names. The titles
4810            aren't guaranteed to be unique.
4811            (MainWindow.TableOpen): Open a table view dialog after opening the
4812            table
4813    
4814    2003-05-27  Bernhard Herzog  <[email protected]>
4815    
4816            * Thuban/UI/mainwindow.py: Remove the Table/Hide menu item. Its
4817            effect can be achieved by simply closing the window showing the
4818            table.
4819            (MainWindow.TableHide): Removed.
4820            (main_menu): Removed "table_hide"
4821    
4822    2003-05-27  Frank Koormann  <[email protected]>
4823    
4824            Fix legend tree display problems under Win32
4825    
4826            * Thuban/UI/legend.py:  BMP_SIZE_W = 15
4827            (LegendTree.__FillTree): Display "legend_icon_map.xpm" with layer title.
4828            (LegendTree.__FillTreeLayer): Explicitely set SelectedImage.
4829    
4830            * Resources/Bitmaps/legend_icon_map.xpm: New icon for legend.
4831    
4832    2003-05-27  Jan-Oliver Wagner <[email protected]>
4833    
4834            * Thuban/UI/menu.py (Menu.InsertSeparator): Additional optional parameter
4835            'after' now allows to insert separators almost anywhere in the menu.
4836    
4837    2003-05-27  Frank Koormann  <[email protected]>
4838    
4839            * Thuban/UI/tableview.py (QueryTableFrame.__init__): Underline the
4840            "S" of selection box label to hint on hot key (Alt-S). Works under
4841            Win32 but is ignored under GTK.
4842    
4843    2003-05-26  Frank Koormann  <[email protected]>
4844    
4845            * Thuban/UI/projdialog.py (ProjFrame.__do_layout, ProjPanel._DoLayout):
4846            Center Choices.
4847    
4848    2003-05-26  Bernhard Herzog  <[email protected]>
4849    
4850            Remove the Precision methods again. They're too DBF specific to be
4851            part of the table interface and they're only used in table_to_dbf
4852            anyway.
4853            
4854            * Thuban/Model/transientdb.py (TransientTableBase.Width):Use a
4855            fixed precision of 12 for doubles.
4856            (TransientTableBase.Precision): Removed
4857            (AutoTransientTable.Width): Delegate to self.table.
4858    
4859            * Thuban/Model/table.py (DBFTable.Precision)
4860            (MemoryTable.Precision): Removed.
4861            (MemoryTable.Width): Use a fixed precision of 12 for doubles.
4862            (table_to_dbf): Use a fixed precision of 12 for floats unless the
4863            column object specifies something else.
4864    
4865            * test/test_dbf_table.py (TestTableToDBF.test_table_to_dbf): New.
4866            test for table_to_dbf
4867    
4868    2003-05-26  Bernhard Herzog  <[email protected]>
4869    
4870            * test/test_transientdb.py
4871            (TestTransientTable.run_iceland_political_tests): Fix a comment.
4872    
4873    2003-05-26  Bernhard Herzog  <[email protected]>
4874    
4875            * Thuban/UI/mainwindow.py (MainWindow.TableOpen): Real
4876            implementation. Mark parts of the file format strings for
4877            localization.
4878    
4879            * Thuban/Model/session.py (Session.OpenTableFile): New. Open a dbf
4880            file and add the table to the tables managed by the session
4881    
4882            * test/test_session.py (TestSessionSimple.test_open_table_file):
4883            New. test case for OpenTableFile
4884    
4885    2003-05-26  Jan-Oliver Wagner <[email protected]>
4886    
4887            * Thuban/UI/controls.py, Thuban/UI/identifyview.py, Thuban/UI/join.py,
4888            Thuban/UI/labeldialog.py, Thuban/UI/mainwindow.py,
4889            Thuban/UI/proj4dialog.py, Thuban/UI/tableview.py, Thuban/UI/view.py:
4890            Replace the true/false of wxWindows by True/False of Python 2.2.1.
4891    
4892    2003-05-26  Jan-Oliver Wagner <[email protected]>
4893    
4894            * Thuban/UI/tableview.py (LayerTableFrame.__init__): If there is
4895            already a selection present, update the grid accordingly.
4896    
4897            * Thuban/UI/mainwindow.py (MainWindow.TableShow): Make the dialog
4898            resizeable and increase its initial size.
4899    
4900    2003-05-26  Frank Koormann  <[email protected]>
4901    
4902            Table export functionality
4903    
4904            * Thuban/Model/table.py (DBFTable.Width, MemoryTable.Width):
4905            Return width (in characters) for a column.
4906            (DBFTable.Precision, MemoryTable.Precision): Return decimal precision.
4907            (table_to_dbf): Write table to dbf file.
4908            (table_to_csv): Write table to csv file.
4909    
4910            * Thuban/Model/transientdb.py (TransientTableBase.Width,
4911            TransientTableBase.Precision): Return column width and precision.
4912    
4913            * Thuban/UI/tableview.py (QueryTableFrame.OnSaveAs): Call table_to_dbf
4914            or table_to_csv depending on file selection.
4915    
4916            * test/test_dbf_table.py:
4917            Test table_to_dbf (extension of former part of test).
4918    
4919            * test/test_csv_table.py:
4920            Test table_to_csv.
4921    
4922    2003-05-23  Jan-Oliver Wagner <[email protected]>
4923    
4924            * Thuban/UI/join.py (JoinDialog.OnJoin): Use _() for strings.
4925            Use QueryTableFrame instead of TableFrame.
4926    
4927            * Thuban/UI/mainwindow.py (MainWindow.LayerShowTable): Prefix the
4928            table window with 'Layer Table:' instead of 'Table:'.
4929    
4930    2003-05-23  Jan-Oliver Wagner <[email protected]>
4931    
4932            Give all tables a title via mix-in TitledObject.LayerShowTable
4933    
4934            * Thuban/Model/base.py (TitledObject.SetTitle): Call method 'issue'
4935            only if it exists.
4936    
4937            * Thuban/Model/table.py (DBFTable, MemoryTable): mix-in TitledObject
4938            and call its init-method with a default title. Remove Title() method.
4939    
4940            * Thuban/Model/transientdb.py (TransientTable, TransientJoinedTable,
4941            AutoTransientTable): mix-in TitledObject and call its init-method with
4942            a default title. Remove Title() method.
4943    
4944    2003-05-23  Bernhard Herzog  <[email protected]>
4945    
4946            * Thuban/Model/session.py (Session.AddShapeStore): Define
4947            AddShapeStore analogously to AddTable.
4948    
4949            * test/test_session.py (TestSessionSimple.test_add_shapestore):
4950            New. Test for AddShapeStore
4951    
4952    2003-05-23  Jan-Oliver Wagner <[email protected]>
4953    
4954            Introducing QueryTableFrame and a very coarse ShowTable implementation.
4955    
4956            * Thuban/UI/tableview.py (LayerTableFrame, QueryTableFrame): Split the
4957            class LayerTableFrame into two classes, LayerTableFrame and QueryTableFrame.
4958            The latter implements the selection GUI without dependency on a layer.
4959            LayerTableFrame now is derived from QueryTableFrame and connects
4960            to a layer.
4961    
4962            * Thuban/UI/mainwindow.py (MainWindow.TableShow): A very coarse
4963            implementation that still needs work.
4964    
4965            * Thuban/Model/layer.py (Layer.TreeInfo): Added filename.
4966    
4967    2003-05-22  Frank Koormann  <[email protected]>
4968    
4969            * Thuban/Model/transientdb.py (TransientJoinedTable.__init__):
4970            Added "outer_join = False" as optional parameter.
4971            (TransientJoinedTable.create): If outer join is true, perform a
4972            "LEFT OUTER JOIN" instead of "JOIN", which preserves all records of
4973            the left table. Records not matching are filled with 0 / None.
4974    
4975            * Thuban/UI/join.py (JoinDialog.__init__): Checkbox for outer join.
4976            (JoinDialog.OnJoin): Consider outer join check box.
4977    
4978    2003-05-22  Bernhard Herzog  <[email protected]>
4979    
4980            * Thuban/UI/join.py (JoinDialog.OnJoin): Use exc_info in a
4981            somewhat safer way. Storing the traceback in a local variable can
4982            lead to memory leaks
4983    
4984    2003-05-22  Bernhard Herzog  <[email protected]>
4985    
4986            * Thuban/UI/join.py (JoinDialog.OnJoin): Make sure to really call
4987            the wxMessageDialog's Destroy() method.
4988    
4989    2003-05-22  Frank Koormann  <[email protected]>
4990    
4991            * Thuban/UI/join.py (JoinDialog.__init__): Make use of
4992            TransientTable.Title()
4993    
4994    2003-05-22  Frank Koormann  <[email protected]>
4995    
4996            Join Dialog, initial version.
4997    
4998            * Thuban/UI/mainwindow.py (MainWindow.TableJoin): Removed print.
4999    
5000            * Thuban/UI/join.py (JoinDialog): Functional implementation of
5001            former framework. Renamed Table1/Table2 to LeftTable/RightTable
5002            in all occurences.
5003    
5004            * Thuban/Model/transientdb.py (TransientJoinedTable.__doc__):
5005            Typo fixed.
5006    
5007    2003-05-22  Bernhard Herzog  <[email protected]>
5008    
5009            Give the tables titles so that the GUI can display more meaningful
5010            names. For now the titles are fixed but depend on e.g. filenames
5011            or the titles of the joined tables.
5012    
5013            * Thuban/Model/transientdb.py (TransientTable.Title)
5014            (TransientJoinedTable.Title, AutoTransientTable.Title): New.
5015    
5016            * Thuban/Model/table.py (DBFTable.Title, MemoryTable.Title): New.
5017    
5018            * test/test_transientdb.py
5019            (TestTransientTable.test_auto_transient_table_title): New. Test
5020            for the Title method
5021            (TestTransientTable.test_transient_joined_table)
5022            (TestTransientTable.test_transient_table): Add test for the Title
5023            methods
5024    
5025            * test/test_memory_table.py (TestMemoryTable.test_title): New.
5026            Test for the Title method
5027    
5028            * test/test_dbf_table.py (TestDBFTable.test_title): New. Test for
5029            the Title method
5030    
5031    2003-05-22  Bernhard Herzog  <[email protected]>
5032    
5033            * test/test_layer.py (TestLayer.setUp, TestLayer.tearDown):
5034            Provide a better way to destroy the layers
5035            (TestLayer.test_base_layer, TestLayer.test_arc_layer)
5036            (TestLayer.test_point_layer, TestLayer.test_empty_layer)
5037            (TestLayer.test_polygon_layer, TestLayer.test_get_field_type): Use
5038            the new way to destroy the layers.
5039            (TestLayer.test_derived_store): New. Test for using a layer with a
5040            DerivedShapeStore
5041    
5042            * Thuban/Model/layer.py (Layer.SetShapeStore): Only set the
5043            filename if the shape store actually has one.
5044    
5045    2003-05-22  Bernhard Herzog  <[email protected]>
5046    
5047            * Thuban/Model/table.py (DBFTable.FileName): New. Accessor method
5048            for the filename
5049    
5050            * test/test_dbf_table.py (TestDBFTable.test_filename): New. Test
5051            for the FileName method
5052            (TestDBFTableWriting.test_write): Fix spelling of filename
5053    
5054    2003-05-22  Thomas Koester  <[email protected]>
5055    
5056            * Thuban/Model/range.py, test/test_range.py: Brought over new Range
5057            from SciParam that now really is immutable.
5058    
5059    2003-05-22  Frank Koormann  <[email protected]>
5060    
5061            Layer Top/Bottom placement added to legend.
5062    
5063            * Thuban/UI/legend.py
5064            (LegendPanel._OnMoveTop(), LayerPanel._OnMoveBottom): New, methods
5065            bound to tool events.
5066            (LegendTree.MoveCurrentItemTop(), LegendTree.MoveCurrentItemBottom):
5067            New, methods binding the event methods with the map methods.
5068    
5069            * Thuban/Model/map.py (Map.TopLayer(), Map.BottomLayer()): New, place
5070            layer at top/bottom of layer stack.
5071    
5072            * Resources/Bitmaps/top_layer.xpm: New button icon.
5073    
5074            * Resources/Bitmaps/bottom_layer.xpm: New button icon.
5075    
5076    2003-05-22  Bernhard Herzog  <[email protected]>
5077    
5078            * Thuban/Model/session.py (Session.RemoveTable): New method to
5079            remove tables
5080    
5081            * test/test_session.py (TestSessionSimple.test_remove_table): New.
5082            Test for RemoveTable
5083    
5084    2003-05-22  Thomas Koester  <[email protected]>
5085    
5086            * Thuban/Model/classgen.py: Added short module doc string and CVS id.
5087            (ClassGenerator.GenUniformDistribution): Use new Range __init__, too.
5088    
5089    2003-05-22  Bernhard Herzog  <[email protected]>
5090    
5091            Implement a way to discover dependencies between tables and
5092            shapestores.
5093    
5094            * Thuban/Model/transientdb.py (TransientTableBase.Dependencies)
5095            (TransientJoinedTable.Dependencies)
5096            (AutoTransientTable.SimpleQuery): New. Implement the dependencies
5097            interface
5098            (TransientJoinedTable.__init__): Keep tack of the original table
5099            objects in addition to the corresponding transient tables.
5100    
5101            * Thuban/Model/table.py (DBFTable.Dependencies)
5102            (MemoryTable.Dependencies): New. Implement the dependencies
5103            interface
5104    
5105            * Thuban/Model/data.py (ShapeTable): New. Helper class for
5106            ShapefileStore
5107            (ShapefileStore.__init__): Use ShapeTable instead of
5108            AutoTransientTable
5109            (ShapefileStore.Table, ShapefileStore.Shapefile): Add doc-strings
5110            (ShapefileStore.FileName, ShapefileStore.FileType): New. Accessor
5111            methods for filename and type
5112            (ShapefileStore.Dependencies): New. Implement the dependencies
5113            interface
5114            (DerivedShapeStore): New class to replace SimpleStore. The main
5115            difference to SimpleStore is that it depends not on a shapefile
5116            but another shapestore which expresses the dependencies a bit
5117            better
5118            (SimpleStore.__init__): Add deprecation warning.
5119    
5120            * test/test_dbf_table.py (TestDBFTable.test_dependencies): New.
5121            Test for the Dependencies method.
5122    
5123            * test/test_memory_table.py (TestMemoryTable.test_dependencies):
5124            New. Test for the Dependencies method.
5125    
5126            * test/test_transientdb.py
5127            (TestTransientTable.test_auto_transient_table_dependencies): New.
5128            Test for the Dependencies method.
5129            (TestTransientTable.test_transient_joined_table): Add test for the
5130            Dependencies method.
5131    
5132            * test/test_session.py (TestSessionSimple.setUp)
5133            (TestSessionSimple.tearDown): New. Implement a better way to
5134            destroy the sessions.
5135            (TestSessionSimple.test_initial_state)
5136            (TestSessionSimple.test_add_table): Bind session to self.session
5137            so that it's destroyed by tearDown
5138            (TestSessionSimple.test_open_shapefile): New. Test for
5139            OpenShapefile and the object it returns
5140    
5141    2003-05-22  Bernhard Herzog  <[email protected]>
5142    
5143            * Thuban/Model/session.py (Session.AddTable): New method to
5144            register tables with the session.
5145            (Session.Tables): Return the tables registered with AddTable too.
5146    
5147            * test/test_session.py (TestSessionSimple.test_add_table): New.
5148            Test case for the AddTable method
5149    
5150    2003-05-22  Frank Koormann  <[email protected]>
5151    
5152            UI polishing updates: Place main buttons (OK, Cancel, etc) in the
5153            lower right corner, center labels for selections, initialize controls
5154            in reasonable order for keyboard navigation.
5155    
5156            * Thuban/UI/projdialog.py (ProjFrame.__init__, ProjFrame.__doLayout)
5157            (ProjFrame.__DoOnProjAvail): Determine position of current projection
5158            using the wxListBox.FindString() method. Still a problem (#1886)
5159    
5160            * Thuban/UI/classifier.py
5161            (Classifier.__init__, SelectPropertiesDialog.__init__)
5162    
5163            * Thuban/UI/classgen.py (ClassGenDialog.__init__,
5164            (ClassGenDialog.__DoOnGenTypeSelect): Moved initialization of the
5165            different classification types from here to __init__.
5166            (GenUniquePanel.__init__): Set the column width of the first field
5167            in the Field ListCtrl to the full width.
5168    
5169            * Thuban/UI/tableview.py (LayerTableFrame.__init__): Rename 'Save As'
5170            Button to 'Export'. Center Buttons in Selection Box, set Focus to
5171            Grid.
5172            (LayerTableFrame.OnKeyDown()): New, bound to the grid with EVT_KEY_DOWN,
5173            changes focus to the Selection when pressing "Alt-S".
5174    
5175            * Thuban/UI/legend.py (LegendTree.__SetVisibilityStyle): Only gray out
5176            the text if not visible. The italic font sometimes exceeds the
5177            rendering area.
5178    
5179    2003-05-21  Jonathan Coles   <[email protected]>
5180    
5181            * Thuban/UI/dock.py (DockFrame): Rename references to _OnClose
5182            to OnClose so that Thuban closes correctly.
5183    
5184            * Thuban/UI/mainwindow.py (MainWindow.OnClose): Call
5185            DockFrame.OnClose, not DockFrame._OnClose.
5186    
5187    2003-05-21  Jonathan Coles   <[email protected]>
5188    
5189            * Thuban/Model/classgen.py (ClassGenerator.GenQuantiles): Remove
5190            references to 'inf' and use new Range __init__ to pass floats
5191            directly rather than converting them to strings first.
5192            Fixes RTBug #1876.
5193    
5194            * Thuban/Model/classification.py (ClassGroupRange.SetRange):
5195            Use new Range ___init__ to pass floats.
5196    
5197            * Thuban/Model/layer.py (RasterLayer.__init__): Test if the
5198            filename is a valid image file. Throw IOError otherwise.
5199    
5200            * Thuban/Model/range.py: Brought over new Range from SciParam that
5201            is immutable and has an __init__ which can accept floats.
5202    
5203            * Thuban/UI/mainwindow.py (MainWindow.AddLayer): Move OpenShapefile
5204            into try block. AddLayer doesn't throw any exceptions anymore.
5205            (MainWindow.AddRasterLayer): Move constructor of RasterLayer into
5206            try block.
5207    
5208            * Thuban/UI/projdialog.py (GeoPanel.__init__): Put Degrees as
5209            the first item in choices. Fixes RTBug #1882.
5210    
5211            * Thuban/UI/renderer.py (MapRenderer.render_map): Check if scale
5212            has gone to 0 which is a serious problem. abort.
5213            (MapRenderer.draw_raster_layer): Catch IOError seperately and
5214            print the error from GDAL.
5215    
5216            * Thuban/UI/tableview.py (TableGrid.__init__): Call
5217            ToggleEventListeners to turn on listening.
5218            (TableGrid.ToggleEventListeners): New. Turns event listening on
5219            and off so as to prevent excessive messages.
5220            (LayerTableFrame.OnQuery): Use TableGrid.ToggleEventListeners
5221            to suppress excessive messages when selecting many rows.
5222            Fixes RTBug #1880.
5223    
5224            * Thuban/UI/view.py: Added checks against if scale == 0. This
5225            is a serious problem that can occur when an image without
5226            geo data is loading and causes the map projection bounds to
5227            go to infinity. Right now, the solution is to simply try
5228            to recover.
5229    
5230            * extensions/thuban/cpl_mfile.cpp (MFILEClose): Make sure
5231            to set the MFILEReceiver attributes even if the data is NULL.
5232    
5233            * extensions/thuban/gdalwarp.cpp: Improved the error handling
5234            and passed GDAL messages back up to the Python layer. Also
5235            tried to fix some memory leaks that were present in the original
5236            utility but didn't matter because the program aborted.
5237    
5238            * test/test_range.py: Copied over tests from SciParam. Removed
5239            tests against importing. Fixes RTBug #1867.
5240    
5241    2003-05-21  Bernhard Herzog  <[email protected]>
5242    
5243            * test/test_load.py: Remove unused imports and restructure the
5244            test code
5245            (LoadSessionTest): Split into one class for each test and turn
5246            LoadSessionTest itself into the base class for all such session
5247            tests.
5248            (ClassificationTest): New base class for load tests that test
5249            classifications
5250            (TestSingleLayer, TestLayerVisibility, TestClassification)
5251            (TestLabels, TestLayerProjection, TestRasterLayer): New classes
5252            for the individual tests
5253    
5254            * test/support.py (FileLoadTestCase.filename): New base class for
5255            file loading tests
5256    
5257    2003-05-21  Jan-Oliver Wagner <[email protected]>
5258    
5259            * Resources/Projections/defaults.proj: Renamed 'Universal Transverse
5260            Mercator' to 'UTM Zone 32' as a more convenient example.
5261            Added 'Gauss Krueger Zone 6'.
5262    
5263            * Data/iceland_sample_raster.thuban: political polygon now
5264            filled transparent to have the raster image visible at once.
5265    
5266    2003-05-21  Frank Koormann  <[email protected]>
5267    
5268            * Thuban/UI/mainwindow.py (MainWindow): Renamed _OnClose() back to
5269            OnClose() to keep in sync with extensions. Internally Thuban
5270            still uses "underscored" names.
5271    
5272    2003-05-20  Jonathan Coles   <[email protected]>
5273    
5274            This puts back Raster layer support. These layers support projections
5275            through the GDAL library. Currently, the CVS version is being used.
5276            There are no Debian packages available although this may change soon.
5277            A GDAL driver was extended to support writing to memory rather to
5278            files.
5279    
5280            There is still some work that needs to be done, such as some error
5281            handling when loading invalid images or when there is a problem
5282            projecting the image. This putback simply checks in the majority
5283            of the work.
5284    
5285            * setup.py: Add gdalwarp library extension.
5286    
5287            * Thuban/Model/layer.py (BaseLayer.HasClassification): New.
5288            Defaults to False, but can be overridden by subclasses if they
5289            support classification.
5290            (RasterLayer): New. Defines a new layer that represents an
5291            image.
5292    
5293            * Thuban/Model/load.py (SessionLoader.__init__): Add rasterlayer
5294            tag handler.
5295            (SessionLoader.start_layer): Encode the filename.
5296            (SessionLoader.start_rasterlayer, SessionLoader.end_rasterlayer):
5297            New. Supports reading a rasterlayer tag.
5298    
5299            * Thuban/Model/map.py (Map.BoundingBox): Fix typo in comment.
5300    
5301            * Thuban/Model/save.py (XMLWriter.encode): Don't assume that we
5302            get a string in Latin1. If we get such as string convert it to
5303            unicode first, otherwise leave if alone before encoding.
5304            (SessionSaver.write_layer): Add support for writing both Layers
5305            and RasterLayers.
5306    
5307            * Thuban/Model/transientdb.py (AutoTransientTable.SimpleQuery):
5308            The right argument may not be a string, it could also be a Column.
5309    
5310            * Thuban/UI/application.py (ThubanApplication.CreateMainWindow):
5311            Make initial window size 600x400. Fixes RTBug #1872.
5312    
5313            * Thuban/UI/classifier.py (Classifier.__init__): Rearrange how
5314            the dialog is constructed so that we can support layers that
5315            do not have classifications.
5316            (Classifier._OnTry): Only build a classification if the layer
5317            supports one.
5318    
5319            * Thuban/UI/legend.py: Change all checks that a layer is an
5320            instance of Layer into checks against BaseLayer.
5321            (LegendTree.__FillTreeLayer): Only add children to a branch if
5322            the layer supports classification.
5323    
5324            * Thuban/UI/mainwindow.py (MainWindow.NewSession,
5325            MainWindow.OpenSession): Don't proceed with an action if the
5326            user chooses Cancel when they are asked to save changes.
5327            (MainWindow.AddRasterLayer): New. Open a dialog to allow the
5328            user to select an image file. Create a new RasterLayer and add
5329            it to the map.
5330    
5331            * Thuban/UI/renderer.py (MapRenderer.render_map): Add support
5332            for rendering RasterLayer layers.
5333            (MapRenderer.draw_raster_layer): Actually method that calls
5334            the GDALWarp python wrapper and constructs an image from the
5335            data returned.
5336    
5337            * Thuban/UI/tableview.py (LayerTableFrame.__init__): Change the
5338            Choices symbols to match those used in the table query method.
5339            Replace deprecated method calls on table with new method names.
5340    
5341            * Thuban/UI/view.py (MapCanvas.set_view_transform): Try to limit
5342            how small the scale can get. This still needs more testing.
5343    
5344            * extensions/thuban/bmpdataset.cpp: New, but copied from GDAL.
5345            Provides a driver to output in .bmp format.
5346    
5347            * extensions/thuban/cpl_mfile.cpp, extensions/thuban/cpl_mfile.h:
5348            New. Provides IO routines which write to memory, rather than a file.
5349    
5350            * extensions/thuban/gdalwarp.cpp: New, but basically a direct copy
5351            of the gdalwarp utility provided in GDAL. Added function calls
5352            that can be accessed from python.
5353    
5354            * Data/iceland_sample_raster.thuban: New. Sample file that uses
5355            a raster layer.
5356    
5357            * Data/iceland/island.tfw, Data/iceland/island.tif: New. Raster
5358            layer image data.
5359    
5360            * Doc/thuban.dtd: Added rasterlayer attribute definition.
5361    
5362            * test/test_layer.py, test/test_load.py, test/test_save.py: Added
5363            tests associated with the raster layer code.
5364    
5365            * test/test_transientdb.py
5366            (TestTransientTable.test_auto_transient_table_query): Added a test
5367            for using a Column object as the "right" parameter to a query.
5368    
5369    2003-05-19  Frank Koormann  <[email protected]>
5370    
5371            * Thuban/version.py (get_changelog_date):
5372            Catch exceptions if ChangeLog does not exist.
5373    
5374            * Thuban/UI/view.py (MapCanvas.Export): Bugfix
5375    
5376    2003-05-19  Frank Koormann  <[email protected]>
5377    
5378            Extended version information for Thuban
5379    
5380            * Thuban/version.py: New, version information for Thuban: Last
5381            modification date and last ChangeLog entry date.
5382    
5383            * Thuban/UI/mainwindow.py (MainWindow.About()): Extended version
5384            information: Display Thuban, wxPython and Python version.
5385    
5386    2003-05-16  Bernhard Herzog  <[email protected]>
5387    
5388            * Thuban/Model/save.py: Remove some unused imports including the
5389            __future__ import for nested_scopes as Thuban relies on Python 2.2
5390            now.
5391            (XMLWriter.encode): Remove the special case for a None argument.
5392            In the saver encode is always called with a string argument.
5393    
5394    2003-05-16  Bernhard Herzog  <[email protected]>
5395    
5396            * Thuban/UI/__init__.py: Remove the work-around for the locale bug
5397            in wxPython (at least when usinvg wxGTK) prior to 2.4. The symptom
5398            of the bug was that e.g. float("1.2") would fail. Thuban now
5399            requires 2.4.x.
5400            
5401    2003-05-16  Frank Koormann   <[email protected]>
5402    
5403            Printing enhancement and WMF export (under Win32)
5404    
5405            * Thuban/UI/renderer.py (ExportRenderer): New, derived from
5406            ScreenRenderer. Renders Map, Legend and Scalebar for export.
5407            (PrinterRenderer): New, derived from ExportRenderer. Replaces the old
5408            PrintRender.
5409    
5410            * Thuban/UI/view.py (MapPrintout.__init__): Enhanced parameter set
5411            to fullfil information needed for PrinterRenderer.
5412            (MapCanvas.Export): New. Export Map (currently only to WMF on Win32).
5413            (MapCanvas.Print): Adapted to new MapPrintout.
5414            (OutputTransform): General calculations to transform from canvas
5415            coordinates to export/printing devices.
5416    
5417            * Thuban/UI/mainwindow.py (MainWindow.ExportMap()): New. Added also
5418            new method_command to call ExportMap, with platform dependency (only
5419            __WXMSW__)
5420      
5421            * Thuban/UI/scalebar.py (ScaleBar.DrawScaleBar): Position and Size
5422            of scalebar drawing area as new parameters.
5423            
5424            * Thuban/Model/scalebar.py (roundInterval): round long instead of int
5425    
5426            * Thuban/UI/legend.py (ScalebarBitmap.__SetScale):
5427            Update to extended scalebar.DrawScalebar header.
5428    
5429            * test/test_export.py: New, test Thuban.UI.view.OutputTransform()
5430    
5431            * test/test_scalebar.py: Made test executable as standalone.
5432    
5433    2003-05-16  Bernhard Herzog  <[email protected]>
5434    
5435            * Thuban/Model/table.py (Table): Remove this compatibility alias
5436            for DBFTable.
5437    
5438            * test/test_table.py: Import DBFTable as Table because that alias
5439            doesn't exist anymore.
5440    
5441            * Thuban/UI/classgen.py: Remove some unused imports
5442    
5443    2003-05-14  Jonathan Coles   <[email protected]>
5444    
5445            * Thuban/Model/classgen.py (ClassGenerator.GenSingletonsFromList):
5446            Fix docstring.
5447            (ClassGenerator.GenUniformDistribution): Fix spelling of method name.
5448            (ClassGenerator.GenQuantiles): Use the left/right brackets and min/max
5449            values of the supplied range to determine the beginning and end
5450            bounds of the generated classes.
5451    
5452            * Thuban/Model/range.py (Range.number_re): Now accepts floats that
5453            do not have a leading 0 (.5 is now accepted as well as 0.5).
5454    
5455            * Thuban/UI/classgen.py (ClassGenDialog.OnOK): Fix name of method
5456            call to ClassGenerator.GenUniformDistribution.
5457    
5458            * Thuban/UI/projdialog.py (ProjFrame.__do_layout): Fix Windows
5459            layout bug with the 'Projection' label.
5460    
5461            * test/support.py (FloatTestCase): New. Needed for the Range tests.
5462    
5463            * test/test_range.py: New. Imported from SciParam.
5464    
5465    2003-05-12  Jonathan Coles   <[email protected]>
5466    
5467            * Thuban/UI/classgen.py (GenQuantilesPanel.GetList): Replace call
5468            to table.UniqueValues() with calls that retrieve all the values
5469            from the table. This will need to be replaced by a method on table
5470            which can simply return the list (perhaps more efficiently).
5471    
5472    2003-05-12  Jonathan Coles   <[email protected]>
5473    
5474            The return value of ClassGenerator.CalculateQuantiles has changed.
5475            Refer to the documentation for details.
5476    
5477            * test/test_classgen.py: Modified Quantile tests to use the
5478            new return values.
5479    
5480            * Thuban/Model/classgen.py
5481            (ClassGenerator.GenQuantiles): Add comments describing the parameters,
5482            use new return values from CalculateQuantiles to produce the correct
5483            range bounds in the Classification.
5484            (ClassGenerator.CalculateQuantiles): Add more comments describing
5485            the return values and parameters. Make minor adjustments to improve
5486            the legibility of the code. Fix problem with adjusted not being set
5487            in most cases.
5488    
5489    2003-05-12  Frank Koormann <[email protected]>
5490            
5491            * Thuban/Model/save.py (XMLWriter.encode()): Explicite call to unicode
5492            and latin1. Fixes #1851 finally.
5493    
5494    2003-05-09  Jonathan Coles   <[email protected]>
5495    
5496            * test/test_classgen.py: New. Tests the Quantile algorithm.
5497    
5498            * Thuban/Model/classgen.py (ClassGenerator.CalculateQuantiles):
5499            Clean up debugging statement, add comments, fix a small bug in the
5500            returned adjusted percentiles.
5501            
5502    2003-05-09  Jonathan Coles   <[email protected]>
5503    
5504            Introduces Range class from SciParam into the ClassGroupRange class,
5505            and such ranges can now be saved and loaded from disk.
5506    
5507            Quantiles are now available in the Classification Generator.
5508    
5509            Initial support for building Queries on a table. Doesn't do anything
5510            but run some tests.
5511    
5512            * Thuban/Model/classification.py: Explicit imports.
5513            (ClassGroupRange): Use the Range class to store the underlying
5514            range information. The interface remains the same, except for
5515            GetRange(), and you can also supply a Range object as the min
5516            parameter to SetRange or __init__.
5517    
5518            * Thuban/Model/load.py (XMLReader.encode): New. Encodes the given
5519            string appropriately for use in Thuban. Fixes RTbug #1851.
5520            (SessionLoader.end_projection): Handle the context of the
5521            projection tag a bit better by looking at what objects are not
5522            None. There was an assumption that a projection tag for a map
5523            could occur before any layers.
5524            (SessionLoader.start_clrange): Provide backward compatibility for
5525            reading min/max values as well as the new range parameter.
5526    
5527            * Thuban/Model/map.py: Explicit imports.
5528    
5529            * Thuban/Model/resource.py: Import _.
5530            (ProjFileSaver.write): write header using projfile.dtd.
5531    
5532            * Thuban/Model/save.py: Explicit imports.
5533            (XMLWriter.encode): New. Encode the given string from a format
5534            used by Thuban into UTF-8. Fixes RTbug #1851.
5535    
5536            * Thuban/UI/classgen.py: Explicit imports.
5537            (ClassGenDialog.__init__): Clean up the code and add support
5538            for Quantiles.
5539            (ClassGenDialog.OnOK): Add support for Quantiles.
5540            (GenQuantilesPanel): New. Input panel for Quantiles.
5541            (ClassGenerator, CustomRamp, MonochromaticRamp, GreyRamp, RedRamp,
5542            GreenRamp, BlueRamp, HotToColdRamp): Move to Thuban/Model/classgen.py
5543    
5544            * Thuban/Model/classgen.py: New. Contains all the classes named above.
5545    
5546            * Thuban/UI/classifier.py: Explicit imports.
5547            (ClassTable.GetValueAsCust, ClassTable.__ParseInput,
5548            ClassTable.SetValueAsCustom): Reworked to use new Range class.
5549    
5550            * Thuban/UI/legend.py: Explicit imports.
5551    
5552            * Thuban/UI/mainwindow.py: Add support for the Join Dialog. Added
5553            a Table menu and associated method calls.
5554            (MainWindow.choose_color): Removed. No longer needed.
5555    
5556            * Thuban/UI/projdialog.py (ProjFrame.__VerifyButtons): Save button
5557            should be disabled if no projection is selected in the available
5558            list.
5559    
5560            * Thuban/UI/renderer.py: Explicit imports.
5561    
5562            * Thuban/UI/tableview.py (TableGrid.OnRangeSelect): Fix some issues
5563            with correctly selecting the rows and issuing the right events.
5564            Be sure to call Skip() to allow the grid to do some of its own
5565            handling which allows the rows to actually be selected.
5566            (LayerTableGrid.select_shapes): Rename from select_shape. Supports
5567            selecting multiple shapes.
5568            (LayerTableFrame): Support for building Queries.
5569            (LayerTableFrame.select_shapes): Allow multiple shapes to be selected.
5570    
5571            * Thuban/UI/tree.py: Explicit imports.
5572    
5573            * Thuban/UI/view.py (MapCanvas): Delegate "SelectedShapes" so the
5574            table view can call it.
5575    
5576            * test/test_classification.py: Explicit imports.
5577            (TestClassification.test_ClassGroupRange): Fix test for new
5578            Range class.
5579    
5580            * Doc/thuban.dtd: Add range parameter for clrange.
5581    
5582            * Thuban/Model/range.py: Taken from SciParam. Used as the underlying
5583            object in ClassGroupRange, and also uesd for inputting ranges in
5584            the classifer table and elsewhere.
5585    
5586            * Thuban/UI/join.py: New. Initial Join dialog. No real functionality
5587            yet.
5588    
5589    2003-05-09  Frank Koormann <[email protected]>
5590    
5591            * Thuban/UI/scalebar.py (DrawScaleBar): Draw only if interval > 0.0.
5592    
5593    2003-05-08  Frank Koormann <[email protected]>
5594    
5595            Coding style updates
5596    
5597            * test/test_scalebar.py: Replaced tab indentation by spaces.
5598    
5599            * Thuban/UI/scalebar.py: Explicit imports.
5600    
5601    2003-05-08  Frank Koormann <[email protected]>
5602    
5603            * Thuban/UI/scalebar.py
5604            (ScaleBar.DrawScalebar): Format string bug fixed.
5605    
5606    2003-05-08  Frank Koormann <[email protected]>
5607    
5608            Reorganization of scalebar component (no wx in Thuban/Model)
5609    
5610            * Thuban/Model/scalebar.py: Rendering moved to Thuban/UI/scalebar.py
5611            (deriveInterval):
5612            Calculate scalebar interval and unit which fits in width for scale.
5613            (roundInterval): Round float.
5614    
5615            * Thuban/UI/scalebar.py (ScaleBar): Scalebar rendering
5616    
5617            * test/test_scalebar.py: Test for Thuban/Model/scalebar.py methods.
5618    
5619            * Thuban/UI/legend.py: Import Thuban.UI.scalebar
5620    
5621    2003-05-08  Frank Koormann <[email protected]>
5622    
5623            * Thuban/UI/legend.py (ScalebarBitmap.SetCanvas):
5624            Initialize ScaleBar with canvas.map
5625    
5626            * Thuban/Model/scalebar.py (ScaleBar.roundInterval()): New,
5627            round intervals to display smarter lengths
5628            (ScaleBar.DrawScalebar): Draw Scalebar only if the map contains a
5629            layer. If the maps has no projection applied grey the scalebar.
5630    
5631    2003-05-07  Frank Koormann <[email protected]>
5632            
5633            Basic Scalebar features added.
5634    
5635            * Thuban/Model/scalebar.py (ScaleBar): New, scalebar rendering.
5636    
5637            * Thuban/UI/legend.py (LegendPanel): Added scalebar bitmap
5638            (ScaleBarBitmap): New, links the scalebar bitmap with view messages
5639            and the renderer.
5640    
5641            * Thuban/UI/view.py (MapCanvas.set_view_transform): Issue SCALE_CHANGED.
5642    
5643            * Thuban/UI/messages.py: SCALE_CHANGED added.
5644    
5645    2003-05-07  Bernhard Herzog  <[email protected]>
5646    
5647            * Thuban/Model/session.py (Session.__init__): New instance
5648            variable shapestores to hold a list of all open shapestore objects
5649            (Session.ShapeStores): New. Accessor method for the shapestores
5650            list.
5651            (Session._add_shapestore, Session._clean_weak_store_refs): New.
5652            Internal methods to maintain the shapestores list.
5653            (Session.Tables): New. Return all tables open in the session.
5654            (Session.OpenShapefile): Insert the new ShapeStore into the
5655            shapestores list.
5656    
5657            * test/test_session.py (TestSessionSimple.test_initial_state): Add
5658            tests for ShapeStores and Tables
5659            (TestSessionWithContent.test_shape_stores)
5660            (TestSessionWithContent.test_tables): New. Test cases for
5661            ShapeStores and Tables
5662    
5663    2003-05-07  Bernhard Herzog  <[email protected]>
5664    
5665            * Thuban/Model/transientdb.py (TransientTableBase.ReadRowAsDict):
5666            Add comments about the optimizations used.
5667            (AutoTransientTable.ReadValue, TransientTableBase.ReadValue): New.
5668            Implement the ReadValue table interface method.
5669    
5670            * test/test_transientdb.py
5671            (TestTransientTable.run_iceland_political_tests)
5672            (TestTransientTable.test_transient_joined_table): Add tests for
5673            ReadValue
5674    
5675    2003-05-07  Frank Koormann <[email protected]>
5676    
5677            * Resources/Bitmaps/fulllayerextent.xpm,
5678            Resources/Bitmaps/fullselextent.xpm: Replaced the place holders with
5679            new icons.
5680    
5681    2003-05-06  Bernhard Herzog  <[email protected]>
5682    
5683            * Thuban/Model/transientdb.py (AutoTransientTable.SimpleQuery):
5684            New. Simply delegate to the transient table's version.
5685    
5686            * test/test_transientdb.py
5687            (TestTransientTable.test_auto_transient_table_query): New. Test
5688            case for AutoTransientTable's SimpleQuery
5689    
5690    2003-05-06  Bernhard Herzog  <[email protected]>
5691    
5692            * Thuban/Model/transientdb.py (TransientTableBase.SimpleQuery):
5693            Implement a simple query method for the query dialog
5694            (TransientTableBase.create): Add an INTEGER PRIMARY KEY that holds
5695            the row index or shapeid.
5696            (TransientTable.create): Insert the right value of the row index
5697            (TransientJoinedTable.create): Copy the row index of the left
5698            table to the joined result table
5699    
5700            * test/test_transientdb.py
5701            (TestTransientTable.test_transient_table_read_twice): Fix
5702            doc-string
5703            (TestTransientTable.test_transient_table_query): New. Test for the
5704            SimpleQuery method
5705    
5706    2003-05-06  Bernhard Herzog  <[email protected]>
5707    
5708            Convert all table users to use the new table interface. This only
5709            covers Thuban itself, not GREAT-ER or other applications built on
5710            Thuban yet, so the compatibility interface stays in place for the
5711            time being but it now issues DeprecationWarnings.
5712    
5713            Finally, the new Table interface has a new method, HasColumn.
5714    
5715            * Thuban/Model/table.py (OldTableInterfaceMixin): All methods
5716            issue deprecation warnings when they're. The warnings refer to the
5717            caller of the method.
5718            (OldTableInterfaceMixin.__deprecation_warning): New. Helper method
5719            for the deprecation warnings
5720    
5721            * test/test_table.py: Ignore the deprecation warnings for the old
5722            table in the tests in this module. The purpose of the tests is to
5723            test the old interface, after all.
5724    
5725            * test/test_transientdb.py
5726            (TestTransientTable.run_iceland_political_tests): Use the
5727            constants for the types. Add a test for HasColumn
5728            (TestTransientTable.test_transient_joined_table): Adapt to new
5729            table interface. Add a test for HasColumn
5730            (TestTransientTable.test_transient_table_read_twice): Adapt to new
5731            table interface
5732    
5733            * Thuban/UI/tableview.py (DataTable.SetTable, DataTable.GetValue):
5734            Adapt to new table interface
5735    
5736            * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Adapt to
5737            new table interface
5738    
5739            * Thuban/UI/controls.py (RecordListCtrl.fill_list)
5740            (RecordTable.SetTable): Adapt to new table interface
5741    
5742            * Thuban/UI/classifier.py (Classifier.__init__)
5743            (Classifier.__init__): Adapt to new table interface
5744    
5745            * Thuban/UI/classgen.py (ClassGenDialog.__init__)
5746            (GenUniformPanel._OnRetrieve, GenUniquePanel._OnRetrieve): Adapt
5747            to new table interface
5748    
5749            * Thuban/Model/transientdb.py (TransientTableBase.HasColumn)
5750            (AutoTransientTable.HasColumn): Implement the new table interface
5751            method
5752            (AutoTransientTable.ReadRowAsDict, AutoTransientTable.ValueRange)
5753            (AutoTransientTable.UniqueValues): Adapt to new table interface
5754    
5755            * Thuban/Model/layer.py (Layer.SetShapeStore, Layer.GetFieldType):
5756            Adapt to new table interface
5757    
5758            * test/test_layer.py (TestLayer.open_shapefile): Helper method to
5759            simplify opening shapefiles a bit easier.
5760            (TestLayer.test_arc_layer, TestLayer.test_polygon_layer)
5761            (TestLayer.test_point_layer): Use the new helper method
5762            (TestLayer.test_get_field_type): New. Test for the GetFieldType
5763            method
5764    
5765            * test/test_dbf_table.py (TestDBFTable.test_has_column): Test for
5766            the new table method
5767    
5768            * test/test_memory_table.py (TestMemoryTable.test_has_column):
5769            Test for the new table method HasColumn
5770    
5771    2003-05-06  Jonathan Coles   <[email protected]>
5772    
5773            Addresses the "Selection Extent" wish of RTbug #1787.
5774    
5775            * Resources/Bitmaps/fulllayerextent.xpm,
5776            Resources/Bitmaps/fullselextent.xpm: Bitmaps for layer and selection
5777            extent. These are just place holders for the real bitmaps.
5778    
5779            * Thuban/Model/layer.py (Shape): Since a Shape is immutable only
5780            calculate the bounding box once (the first time compute_bbox() is
5781            called).
5782            (Layer.ShapesBoundingBox): New. Given a list of shape ids, return
5783            the bounding box for the shapes in lat/long coordinates.
5784    
5785            * Thuban/UI/mainwindow.py: Added new "Full selection extent" menu
5786            option.
5787            (MainWindow.has_selected_shapes): New. Returns true if there are
5788            any selected shapes.
5789            (MainWindow.FullSelectionExtent): New. Calls
5790            MapCanvas.FitSelectedToWindow() when the user selects the menu option.
5791            (_has_selected_shapes): New. Returns true if there are any
5792            selected shapes.
5793    
5794            * Thuban/UI/selection.py (Selection.HasSelectedShapes): New. Returns
5795            true if there are any selected shapes.
5796    
5797            * Thuban/UI/view.py (MapCanvas): Added delegated method
5798            HasSelectedShapes.
5799            (MapCanvas.FitSelectedToWindow): New. Centers and scales any selected
5800            shapes on the canvas using the map projection (if any).
5801    
5802            * test/test_layer.py (TestLayer.test_arc_layer): Add some tests
5803            for Layer.ShapesBoundingBox().
5804    
5805    2003-05-06  Bernhard Herzog  <[email protected]>
5806    
5807            * Resources/Projections/defaults.proj: Fix spelling of Mercator
5808    
5809    2003-05-05  Jonathan Coles   <[email protected]>
5810    
5811            Addresses the "Full Layer Extent" wish of RTbug #1787.
5812    
5813            * Resources/Projections/defaults.proj: Added UK National Grid.
5814    
5815            * Thuban/UI/mainwindow.py: Added new "Full layer extent" menu option.
5816            (MainWindow.FullLayerExtent): New. Calls MapCanvas.FitLayerToWindow()
5817            when the user selects the menu option.
5818    
5819            * Thuban/UI/view.py (MapCanvas.FitLayerToWindow): New. Centers and
5820            scales the given layer on the canvas using the map projection.
5821    
5822    2003-05-05  Bernhard Herzog  <[email protected]>
5823    
5824            Convert the table implementations to a new table interface. All
5825            tables use a common mixin class to provide backwards compatibility
5826            until all table users have been updated.
5827    
5828            * Thuban/Model/table.py (OldTableInterfaceMixin): Mixin class to
5829            provide backwards compatibility for table classes implementing the
5830            new interface
5831            (DBFTable, MemoryTable): Implement the new table interface. Use
5832            OldTableInterfaceMixin as base for compatibility
5833            (DBFColumn, MemoryColumn): New. Column description for DBFTable
5834            and MemoryTable resp.
5835    
5836            * test/test_dbf_table.py: New. Test cases for the DBFTable with
5837            the new table interface.
5838    
5839            * test/test_memory_table.py: New. Test cases for the MemoryTable
5840            with the new table interface.
5841    
5842            * test/test_table.py: Document the all tests in this file as only
5843            for backwards compatibility. The equivalent tests for the new
5844            interface are in test_memory_table.py and test_dbf_table.py
5845            (MemoryTableTest.test_read): field_info should be returning tuples
5846            with four items
5847            (MemoryTableTest.test_write): Make doc-string a more precise.
5848    
5849            * Thuban/Model/transientdb.py (TransientTableBase): Convert to new
5850            table interface. Derive from from OldTableInterfaceMixin for
5851            compatibility.
5852            (TransientTableBase.create): New intance variable column_map to
5853            map from names and indices to column objects
5854            (TransientTable.create): Use the new table interface of the input
5855            table
5856            (AutoTransientTable): Convert to new table interface. Derive from
5857            from OldTableInterfaceMixin for compatibility.
5858            (AutoTransientTable.write_record): Removed. It's not implemented
5859            yet and we still have to decide how to handle writing with the new
5860            table and data framework.
5861    
5862            * test/test_transientdb.py
5863            (TestTransientTable.run_iceland_political_tests)
5864            (TestTransientTable.test_transient_joined_table): Use the new
5865            table interface
5866    
5867    2003-05-05  Jonathan Coles   <[email protected]>
5868    
5869            This is namely a collection of UI updates to improve user interactivity.
5870            Tabbing between controls now exists and you can use ESC to close dialog
5871            boxes; ENTER will active the default button.
5872    
5873            * Thuban/UI/classgen.py (ClassGenDialog.__init__): Rearrange the
5874            order that the controls are created so that tabbing works correctly.
5875            (ClassGenDialog.OnOK): Renamed from _OnGenerate() so that the
5876            wxDialog can handle the default button correctly.
5877            (ClassGenDialog.OnCancel): Renamed from _OnCloseBtn() for the
5878            same reasons as for OnOK.
5879            (GenUniformPanel._OnRetrieve): Call wxBeginBusyCursor/wxEndBusyCursor
5880            when we ask the table for the maximum/minimum values of a field
5881            which could take a very long time.
5882    
5883            * Thuban/UI/classifier.py (Classifier.__init__): Rearrange the
5884            order that the controls are created so that tabbing works correctly.
5885            (SelectPropertiesDialog.__init__): Rearrange the order that the
5886            controls are created so that tabbing works correctly.
5887    
5888            * Thuban/UI/dialogs.py: Copied NonModalDialog box and changed it
5889            to derive from a wxDialog but behave like the original implementation
5890            which was derived from a wxFrame. wxDialog provides useful key
5891            handling functionality like ESC calling OnCancel and ENTER calling
5892            OnOK which is lost with wxFrame.
5893    
5894            * Thuban/UI/mainwindow.py: Add "..." to menu items that will open
5895            new dialogs.
5896    
5897            * Thuban/UI/projdialog.py (ProjFrame.__init__): Rearrange the
5898            order that the controls are created so that tabbing works correctly.
5899            (ProjFrame.OnApply): Renamed from _OnTry() to use wxDialog behaviour.
5900            (ProjFrame.OnOK): Renamed from _OnOK() to use wxDialog behaviour.
5901            (ProjFrame.OnCancel): Renamed from _OnClose() to use wxDialog behaviour.
5902            (ProjPanel.__init__): Add "Airy" to the list of ellipsoids so we
5903            can provide the "UK National Grid" as a default projection.
5904            (UTMPanel.__init__): Rearrange the order that the controls are
5905            created so that tabbing works correctly.
5906    
5907    2003-05-05  Bernhard Herzog  <[email protected]>
5908    
5909            * extensions/thuban/wxproj.cpp: Fix some of the comments.
5910            (project_point): If a map projection but no layer projection is
5911            given, convert degrees to radians before applying the map
5912            projection.
5913    
5914            * Thuban/UI/tableview.py (TableGrid.disallow_messages)
5915            (TableGrid.allow_messages): New methods to make it possible to
5916            inhibit message sending.
5917            (TableGrid.issue): Only send the message if not inhibited.
5918            (LayerTableGrid.select_shape): Use the new methods to make sure
5919            that no ROW_SELECTED message is sent while we're updating the
5920            selected rows to match the selected shapes.
5921    
5922    2003-05-02  Jan-Oliver Wagner <[email protected]>
5923    
5924            Implementation of MemoryTable.
5925    
5926            * Thuban/Model/table.py (MemoryTable): New. Quite simple table
5927            implementation that operates on a list of tuples. All of the data
5928            are kept in the memory.
5929    
5930            * test/test_table.py (MemoryTableTest): New.
5931    
5932            * test/test_transientdb.py (SimpleTable): Removed.
5933            (TestTransientTable.test_transient_joined_table,
5934            (TestTransientTable.test_transient_table_read_twice): Replaced
5935            SimpleTable by MemoryTable.
5936    
5937    2003-04-30  Jonathan Coles   <[email protected]>
5938    
5939            * Data/iceland_sample.thuban: Now contains correct projections
5940            for each of the layers.
5941    
5942            * Resources/Projections/defaults.proj: Geographic projection
5943            contains unit conversion parameter.
5944    
5945    2003-04-30  Jonathan Coles   <[email protected]>
5946    
5947            The most important part of this putback is the projection changes.
5948            It should now be possible to specify the projection that a layer
5949            is in and then specify a different projection for the map. The
5950            projection dialog has an extra parameter for a geographic projection
5951            which lets the user select if the input is in degrees or radians.
5952    
5953            * Thuban/Model/layer.py (Layer.ShapesInRegion): Fix docstring
5954            to say that the parameter is a tuple of unprojected
5955            points (which is what the callers to this method were assuming).
5956            Also, since the points are unprojected we need to projected them.
5957    
5958            * Thuban/UI/legend.py (LegendTree.MoveCurrentItemUp,
5959            LegendTree.MoveCurrentItemDown): If the layer or any of the layer's
5960            groups are selected, move the layer up/down. Fixes RTbug #1833.
5961    
5962            * Thuban/UI/mainwindow.py: Move menu item map_rename up.
5963    
5964            * Thuban/UI/projdialog.py (ProjFrame._OnSave): Add missing
5965            parameter in call to SetClientData.
5966            (GeoPanel): Add support for selecting the units that the
5967            source data is in (Radians or Degrees).
5968    
5969            * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Optimize
5970            the rendering loop by reducing the number of if's, removing the
5971            unnecessary try/except block, and checking if the old group
5972            is the same as the new one (which happens a lot if there is
5973            no classification, or lots of shapes are in the same group).
5974    
5975            * Thuban/UI/view.py (MapCanvas.OnPaint): Add a try/except block
5976            around the redraw routine to try to catch problems that the user
5977            may create by selecting invalid projections for the data set and
5978            map. Clears the display if there are any problems and prints the
5979            error.
5980            (MapCanvas.do_redraw): Use DC.Clear() instead of drawing a filled
5981            rectangle.
5982    
5983            * extensions/thuban/wxproj.cpp (project_point): First invert the
5984            supplied point (which should be in projected coordinates) using
5985            the layer's projection and then project the point using the
5986            map's projection.
5987            (project_points): Use project_point() to project each point.
5988    
5989    2003-04-30  Jan-Oliver Wagner <[email protected]>
5990    
5991            * Thuban/Model/layer.py (Layer.SetShapeStore): Fixed a bug:
5992            don't set the Classification to None if the classfication field
5993            is None (ie only a DEFAULT).
5994    
5995    2003-04-30  Bernhard Herzog  <[email protected]>
5996    
5997            * Thuban/UI/view.py: Fix some typos.
5998    
5999            * Thuban/UI/mainwindow.py (MainWindow.identify_view_on_demand): Do
6000            not pop up the dialog if the selection becomes empty (this could
6001            happen if e.g. a new selection is opened while the identify tool
6002            is active and dialog had been closed)
6003    
6004    2003-04-30  Bernhard Herzog  <[email protected]>
6005    
6006            * Thuban/Model/transientdb.py (TransientTableBase.__init__): New
6007            instance variable read_record_last_result
6008            (TransientTableBase.read_record): Make sure reading the same
6009            record twice works. The implementation uses the new instance
6010            variable read_record_last_result
6011    
6012            * test/test_transientdb.py
6013            (TestTransientTable.test_transient_table_read_twice): New test
6014            case for the above bug-fix.
6015    
6016    2003-04-29  Jonathan Coles   <[email protected]>
6017    
6018            * Thuban/common.py: Removed. No longer needed Str2Num. RTbug #1832.
6019    
6020            * Thuban/UI/classgen.py: Remove all uses of Str2Num.
6021    
6022            * Thuban/UI/classifier.py: Remove all uses of Str2Num.
6023            (ClassTable.SetValueAsCustom): Rename keyword argument in
6024            ClassGroup* constructors to match argument name.
6025    
6026    2003-04-29  Bernhard Herzog  <[email protected]>
6027    
6028            * Thuban/Model/session.py (Session.Destroy): Explicitly close the
6029            transient DB if it exists to make sure it doesn't leave a journal
6030            file in the temp directory.
6031    
6032            * Thuban/Model/transientdb.py (TransientDatabase.close): Set
6033            self.conn to None after closing the connection to make sure it's
6034            not closed twice
6035    
6036    2003-04-29  Jonathan Coles   <[email protected]>
6037    
6038            Add a visible parameter in the layer XML tag. The default value is
6039            "true". If anything other than "false" is specified we also assume
6040            "true". Addresses RTbug #1025.
6041    
6042            * Doc/thuban.dtd: Add visible parameter to a layer.
6043    
6044            * Thuban/Model/layer.py (BaseLayer.__init__): Change default value
6045            of visible from 1 to True.
6046            (Layer.__init__): Change default value of visible from 1 to True.
6047    
6048            * Thuban/Model/load.py (SessionLoader.start_layer): Read visible
6049            parameter.
6050    
6051            * Thuban/Model/save.py (SessionSaver.write_layer): Save visible
6052            parameter.
6053    
6054            * test/test_load.py: Add new test data contents_test_visible.
6055            (LoadSessionTest.setUp): save test data.
6056            (LoadSessionTest.testLayerVisibility): Test if the visible flag
6057            is loaded correctly.
6058    
6059            * test/test_save.py (SaveSessionTest.testSingleLayer): Add test
6060            for saving an invisible layer.
6061    
6062    2003-04-29  Jonathan Coles   <[email protected]>
6063    
6064            * Thuban/UI/mainwindow.py (MainWindow.SetMap): Look up the
6065            legend dialog box and tell it to change its map to the one
6066            supplied to SetMap(). Fixes RTbug #1770.
6067    
6068    2003-04-29  Bernhard Herzog  <[email protected]>
6069    
6070            Next step of table implementation. Introduce a transient database
6071            using SQLite that some of the data is copied to on demand. This
6072            allows us to do joins and other operations that require an index
6073            for good performance with reasonable efficiency. Thuban now needs
6074            SQLite 2.8.0 and pysqlite 0.4.1. Older versions may work but I
6075            haven't tested that.
6076            
6077            * Thuban/Model/transientdb.py: New. Transient database
6078            implementation.
6079    
6080            * test/test_transientdb.py: New. Tests for the transient DB
6081            classes.
6082    
6083            * Thuban/Model/session.py (AutoRemoveFile, AutoRemoveDir): New
6084            classes to help automatically remove temporary files and
6085            directories.
6086            (Session.__init__): New instance variables temp_dir for the
6087            temporary directory and transient_db for the SQLite database
6088            (Session.temp_directory): New. Create a temporary directory if not
6089            yet done and return its name. Use AutoRemoveDir to have it
6090            automatically deleted
6091            (Session.TransientDB): Instantiate the transient database if not
6092            done yet and return it.
6093    
6094            * Thuban/Model/data.py (ShapefileStore.__init__): Use an
6095            AutoTransientTable so that data is copied to the transient DB on
6096            demand.
6097            (SimpleStore): New class that simply combines a table and a
6098            shapefile
6099    
6100            * Thuban/Model/table.py (Table, DBFTable): Rename Table into
6101            DBFTable and update its doc-string to reflect the fact that this
6102            is only the table interface to a DBF file. Table is now an alias
6103            for DBFTable for temporary backwards compatibility.
6104    
6105            * Thuban/UI/application.py (ThubanApplication.OnExit): Make sure
6106            the last reference to the session goes away so that the temporary
6107            files are removed properly.
6108    
6109            * test/test_load.py (LoadSessionTest.tearDown): Remove the
6110            reference to the session to make sure the temporary files are
6111            removed.
6112    
6113    2003-04-29  Bernhard Herzog  <[email protected]>
6114    
6115            * Thuban/Model/load.py (XMLReader.__init__, XMLReader.read): Turn
6116            the __parser instance variable into a normal local variable in
6117            read. It's only used there and read will never be called more than
6118            once. Plus it introduces a reference cycle that keeps can keep the
6119            session object alive for a long time.
6120    
6121    2003-04-29  Jonathan Coles   <[email protected]>
6122    
6123            * Thuban/Model/proj.py (Projection): Removed Set*() methods to make
6124            Projection an immutable item. Fixes RTbug #1825.
6125            (Projection.__init__): Initialize instance variables here.
6126            (ProjFile.Replace): New. Replace the given projection object with
6127            the new projection object. This solves the problem of needing the
6128            mutator Projection.SetProjection() in the ProjFrame class and
6129            allows a projection to change parameters without changing its
6130            location in the file.
6131    
6132            * Thuban/UI/mainwindow.py (MainWindow.SaveSessionAs): Dialog should
6133            be of type wxSAVE and should verify overwriting a file.
6134    
6135            * Thuban/UI/projdialog.py (ProjFrame._OnSave): Use the new
6136            ProjFile.Replace() method instead of the mutator
6137            Projection.SetProjection(). Also requires that we reassign the
6138            client data to the new projection.
6139    
6140            * test/test_proj.py (TestProjection.test): Test GetName() and
6141            GetAllParameters()
6142            (TestProjFile.test): Remove tests for Set*() methods. Add tests
6143            for Replace().
6144    
6145    2003-04-25  Jonathan Coles   <[email protected]>
6146    
6147            * Thuban/Model/save.py (SessionSaver.write_projection): Make sure
6148            to save the name of the projection.
6149    
6150            * test/test_save.py (SaveSessionTest.testLayerProjection): New
6151            test to verify layer projections are saved correctly.
6152    
6153    2003-04-25  Jonathan Coles   <[email protected]>
6154    
6155            * Thuban/Model/proj.py (Projection.SetName): Set the name
6156            to "Unknown" if name is None.
6157            (Projection.SetAllParameters): New. Set the projection's
6158            parameter list to the one supplied.
6159            (Projection.SetProjection): New. Set the projection's
6160            properties to those of the supplied Projection.
6161    
6162            * Thuban/UI/mainwindow.py (MainWindow.MapProjection): Set
6163            the dialog title to include the map's title.
6164            (MainWindow.LayerProjection): Set the dialog title to include
6165            the layer's title.
6166    
6167            * Thuban/UI/projdialog.py (ProjFrame.__ShowError): Consolidate
6168            error dialogs into a single method call.
6169            (ProjFrame.__VerifyButtons): Add more states to check.
6170            (ProjFrame.__GetProjection): Return the current state of an
6171            edited projection or None.
6172            (ProjFrame.__FillAvailList): Remove checks for states that
6173            shouldn't exist.
6174            (ProjFrame._OnNew): Clear all selected items and supply
6175            a projection panel if necessary.
6176    
6177            * test/test_proj.py (TestProjFile.test): Add tests for
6178            ProjFile.SetAllParameters, ProjFile.SetProjection,
6179            ProjFile.SetName.
6180    
6181    2003-04-25  Jonathan Coles   <[email protected]>
6182    
6183            * Thuban/UI/projdialog.py (ProjFrame.__FillAvailList): Now
6184            takes an optional argument to select the current projection.
6185            This does not guarantee that the item is visible due to
6186            limited wxWindows functionality. Fixes RTBug #1821.
6187    
6188    2003-04-25  Jonathan Coles   <[email protected]>
6189    
6190            * Thuban/Model/load.py (SessionLoader.start_projection): Remember
6191            the projection name and use it when constructing the Projection
6192            object.
6193    
6194            * Thuban/Model/proj.py (Projection.__init__): Change the default
6195            value for 'name' to None and then test if name is equal to None
6196            in the body of the constructor. This way the caller doesn't have to
6197            know what the default value should be. Namely, useful in load.py
6198            where we have to pick a default value if the 'name' parameter
6199            doesn't exist in the XML file.
6200    
6201            * test/test_load.py (LoadSessionTest.testLayerProjection): New.
6202            Tests a file where a layer has a projection.
6203    
6204    2003-04-25  Jonathan Coles   <[email protected]>
6205    
6206            * Thuban/Model/layer.py (Layer.TreeInfo): Add an item to the
6207            tree for projection information.
6208    
6209            * Thuban/Model/load.py (XMLReader.GetFilename): Renamed from
6210            XMLReader.GetFileName.
6211            (SessionLoader): Added support for loading projection tags that
6212            appear inside a layer.
6213    
6214            * Thuban/Model/proj.py (ProjFile): Document the class. Move
6215            back to using a list because the order of the projections in
6216            the file is important to maintain. Fixes RTbug #1817.
6217    
6218            * Thuban/Model/resource.py: Rename calls to ProjFile.GetFileName
6219            to ProjFile.GetFilename.
6220    
6221            * Thuban/Model/save.py (SessionSaver.write_layer): Save projection
6222            information.
6223    
6224            * Thuban/UI/projdialog.py (ProjFrame._OnAddToList): Renamed from
6225            ProjFrame._OnSaveAs. Removed old dead code from previous
6226            implementation.
6227            (ProjFrame._OnExport): Add support for exporting more than one
6228            projection to a single file.
6229            (ProjFrame.__FillAvailList): use string formatting (% operator)
6230            to build strings that are (partly) translated. Fixes RTbug #1818.
6231    
6232            * test/test_proj.py (TestProjFile.test): New. Tests the base ProjFile
6233            class.
6234    
6235    2003-04-24  Bernhard Herzog  <[email protected]>
6236    
6237            * po/es.po: Updated Spanish translation by Daniel Calvelo Aros
6238    
6239            * po/fr.po: New. French translation by Daniel Calvelo Aros
6240    
6241            * Thuban/UI/projdialog.py (ProjFrame._OnSaveAs): Don't translate
6242            empty strings.
6243    
6244    2003-04-24  Jonathan Coles   <[email protected]>
6245    
6246            * Thuban/Model/layer.py (Layer.GetProjection): New. Needed to
6247            implement the interface that the ProjFrame dialog expects.
6248    
6249            * Thuban/Model/proj.py (Projection.SetName): New. Allows the
6250            name of the projection to be changed.
6251            (ProjFile): Use a dictionary instead of a list so that removing
6252            projections is easier and we are sure about uniqueness.
6253            (ProjFile.Remove): Remove the given projection object.
6254    
6255            * Thuban/Model/resource.py (GetSystemProjFiles, GetUserProjFiles):
6256            Return a list with only one projection file instead of searching for
6257            any projection file. This simplifies many things if the user can
6258            only have one system file and one user file.
6259    
6260            * Thuban/UI/classgen.py: Change all references to
6261            genCombo to genChoice.
6262    
6263            * Thuban/UI/mainwindow.py: Add a Projection option under the
6264            layer menu.
6265            (MainWindow.LayerProjection): New. Open up a projection window
6266            for a layer.
6267    
6268            * Thuban/UI/projdialog.py: Large changes to how the dialog is
6269            laid out. Use three panels instead of one. One for the list of
6270            projections, one for the edit controls, and one for the buttons.
6271            Fixed resizing problems so that the dialog resizes correctly
6272            when the projection panel changes. Added import/export, save, and
6273            new buttons/functionality.
6274    
6275    2003-04-24  Bernhard Herzog  <[email protected]>
6276    
6277            First step towards table management. Introduce a simple data
6278            abstraction so that we replace the data a layer uses more easily
6279            in the next step.
6280    
6281            * Thuban/Model/data.py: New file with a simple data abstraction
6282            that bundles shapefile and dbffile into one object.
6283    
6284            * Thuban/Model/session.py (Session.OpenShapefile): New method to
6285            open shapefiles and return a shape store object
6286    
6287            * Thuban/Model/layer.py (Layer.__init__): Pass the data as a store
6288            object instead of a shapefile filename. This introduces a new
6289            instance variable store holding the datastore. For intermediate
6290            backwards compatibility keep the old instance variables.
6291            (open_shapefile): Removed. No longer needed with the shape store.
6292            (Layer.SetShapeStore, Layer.ShapeStore): New methods to set and
6293            get the shape store used by a layer.
6294            (Layer.Destroy): No need to explicitly destroy the shapefile or
6295            table anymore.
6296    
6297            * Thuban/UI/mainwindow.py (MainWindow.AddLayer)
6298            (MainWindow.AddLayer): Use the session's OpenShapefile method to
6299            open shapefiles
6300    
6301            * Thuban/Model/load.py (ProcessSession.start_layer): Use the
6302            session's OpenShapefile method to open shapefiles
6303    
6304            * test/test_classification.py
6305            (TestClassification.test_classification): Use the session's
6306            OpenShapefile method to open shapefiles and build the filename in
6307            a more platform independed way
6308    
6309            * test/test_layer.py (TestLayer.setUp, TestLayer.tearDown):
6310            Implement to have a session to use in the tests
6311            (TestLayer.test_arc_layer, TestLayer.test_polygon_layer)
6312            (TestLayer.test_point_layer, TestLayer.test_empty_layer): Use the
6313            session's OpenShapefile method to open shapefiles
6314            (TestLayerLegend.setUp): Instantiate a session so that we can use
6315            it to open shapefiles.
6316            (TestLayerLegend.tearDown): Make sure that all references to
6317            layers and session are removed otherwise we may get a resource
6318            leak
6319    
6320            * test/test_map.py (TestMapAddLayer.test_add_layer)
6321            (TestMapWithContents.setUp): Instantiate a session so that we can
6322            use it to open shapefiles.
6323            (TestMapWithContents.tearDown): Make sure that all references to
6324            layers, maps and sessions are removed otherwise we may get a
6325            resource leak
6326            ("__main__"): use support.run_tests() so that more info about
6327            uncollected garbage is printed
6328    
6329            * test/test_save.py (SaveSessionTest.testSingleLayer): Use the
6330            session's OpenShapefile method to open shapefiles
6331            ("__main__"): use support.run_tests() so that more info about
6332            uncollected garbage is printed
6333    
6334            * test/test_selection.py (TestSelection.tearDown): Make sure that
6335            all references to the session and the selection are removed
6336            otherwise we may get a resource leak
6337            (TestSelection.get_layer): Instantiate a session so that we can
6338            use it to open shapefiles.
6339            ("__main__"): use support.run_tests() so that more info about
6340            uncollected garbage is printed
6341    
6342            * test/test_session.py (TestSessionBase.tearDown)
6343            (TestSessionWithContent.tearDown): Make sure that all references
6344            to the session and layers are removed otherwise we may get a
6345            resource leak
6346            (TestSessionWithContent.setUp): Use the session's OpenShapefile
6347            method to open shapefiles
6348    
6349    2003-04-24  Jonathan Coles   <[email protected]>
6350    
6351            * Thuban/Model/load.py (XMLReader.read): Should have been checking
6352            if the file_or_filename object had the 'read' attribute.
6353    
6354    2003-04-23  Jonathan Coles   <[email protected]>
6355    
6356            * Thuban/Model/resource.py: Fixes RTbug #1813.
6357            (ReadProjFile): Add documentation about which exceptions are raised.
6358            Always pass the exceptions up to the caller.
6359            (GetProjFiles): If the directory can't be read return an empty list.
6360            If any of the proj files can't be read skip that file and go
6361            on to the next one.
6362    
6363            * test/test_proj.py: Added test cases to handle nonexistent files,
6364            unreadable files, and files that don't parse correctly.
6365    
6366    2003-04-23  Jonathan Coles   <[email protected]>
6367    
6368            Projection dialog. Allows the user to select from a list
6369            of projection templates and optionally edit them and save new ones.
6370    
6371            * Thuban/UI/projdialog.py (ProjFrame): New. Main dialog.
6372            (ProjPanel): Base class for projection specific panels.
6373            (TMPanel): Projection panel for Transverse Mercartor.
6374            (UTMPanel): Projection panel for Universal Transverse Mercartor.
6375            (LCCPanel): Projection panel for Lambert Conic Conformal.
6376            (GeoPanel): Projetion panel for Geographic Projection.
6377    
6378    2003-04-23  Jonathan Coles   <[email protected]>
6379    
6380            * Thuban/Model/load.py (XMLReader): Renamed from XMLProcessor to
6381            promote symmetry. There now exists XMLReader and XMLWriter.
6382            (XMLReader.read): New. Call to read the given file descriptor or
6383            filename.
6384            (XMLReader.close): New. Make sure the file is closed.
6385            (XMLReader.GetFileName): New. Return just the file name that is being
6386            read from.
6387            (XMLReader.GetDirectory): New. Return just the directory of the file
6388            that is being read.
6389            (XMLReader.AddDispatchers): New. Take a dictionary which contains
6390            the names of functions to call as the XML tree is parsed.
6391            (XMLReader.startElementNS): Updated to use new dispatcher dictionary.
6392            (XMLReader.endElementNS): Updated to use new dispatcher dictionary.
6393            (SessionLoader): Removed class variables start_dispatcher and
6394            end_dispatcher since this functionality is now part of a class
6395            instance. Fixes RTbug #1808.
6396            (SessionLoader.__init__): Add dispatcher functions.
6397            (load_xmlfile): Code was moved into the XMLReader.read().
6398            (load_session): Use modified SessionLoader.
6399    
6400            * Thuban/Model/map.py (Map.GetProjection): New. Returns the
6401            map's projection.
6402    
6403            * Thuban/Model/proj.py (Projection.GetParameters): Renamed to
6404            GetAllParameters.
6405            (Projection.GetParameter): Returns the value for the given parameter.
6406    
6407            * Thuban/Model/resource.py: Use XMLReader and XMLWriter.
6408            (GetProjFiles): Renamed from GetProjections. Now returns a list
6409            of ProjFile objects.
6410            (GetSystemProjFiles): Renamed from GetSuppliedProjections. Returns
6411            a list of ProjFile objects whose files are not user defined.
6412            (GetUserProjFiles): Renamed from GetUserProjections. Returns a
6413            list of ProjFile objects whose files are user defined.
6414            (ProjFileReader): Extend new XMLReader.
6415    
6416            * Thuban/Model/save.py (XMLWriter): Renamed from XMLSaver to
6417            promote symmetry.
6418    
6419            * Thuban/UI/classgen.py (ClassGenDialog.__init__): Use a wxChoice
6420            control instead of a wxComboBox. wxChoice controls do not generate
6421            events as the uses highlights possible choices which fixes problems
6422            with resizing the dialog when the use selects an option.
6423    
6424            * Thuban/UI/classifier.py (Classifier.__init__): Use a wxChoice
6425            control instead of a wxComboBox.
6426    
6427            * Thuban/UI/mainwindow.py (MainWindow.Projection): Use new projection
6428            dialog.
6429    
6430            * test/test_proj.py (TestProjection.test): New tests for GetParameter
6431            method.
6432    
6433    2003-04-22  Bernhard Herzog  <[email protected]>
6434    
6435            * Thuban/UI/mainwindow.py: Remove some unused imports and global
6436            constants
6437    
6438            * Thuban/UI/identifyview.py (IdentifyListCtrl.selected_shape)
6439            (IdentifyGridCtrl.selected_shape): Use table, not shapetable.
6440    
6441    2003-04-17  Bernhard Herzog  <[email protected]>
6442    
6443            * Thuban/Model/layer.py: Don't import LAYER_LEGEND_CHANGED.
6444            (Layer): Update doc-string since LAYER_LEGEND_CHANGED is not used
6445            anymore.
6446            (Layer.BoundingBox, Layer.GetFieldType, Layer.NumShapes)
6447            (Layer.ShapeType, Layer.Shape): No need to call
6448            self.open_shapefile since it's always called in __init__
6449    
6450            * Thuban/UI/application.py (ThubanApplication.MainLoop): Removed.
6451            In wxPython 2.4 there's no need to extend MainLoop anymore since
6452            wxPython itself makes sure OnExit is called.
6453    
6454    2003-04-16  Jonathan Coles   <[email protected]>
6455    
6456            Initial putback of projection management code. Includes new
6457            classes to read and write projection files. The current load
6458            and save classes were abstracted a bit so they could be reused.
6459            The Projection class was extended to provide new methods and
6460            have a name.
6461    
6462            * Thuban/Model/load.py (XMLProcessor): New. Contains all the
6463            general XML reading methods that were part of ProcessSession.
6464    
6465            * Thuban/Model/proj.py (Projection.__init__): Accepts an optional
6466            name.
6467            (ProjFile): New. Represents a file that contains projection
6468            information.
6469    
6470            * Thuban/Model/resource.py: New. Contains general utilities
6471            for read and writing projection files.
6472    
6473            * Thuban/Model/save.py (XMLSaver): New. Contains all the
6474            general XML writing methods that were part of SessionSaver.
6475            (SessionSaver): Renamed from Saver.
6476    
6477            * test/test_proj.py: New test cases for the projection
6478            file read and write functions.
6479    
6480    2003-04-16  Jonathan Coles   <[email protected]>
6481    
6482            * Thuban/Model/classification.py: Use repr() around values
6483            in the ClassGroup*.__repr__() methods so it is clearer when
6484            a value is a string and when it is a number.
6485    
6486            * test/test_load.py: Rework the classification test to test
6487            that we can load old files.
6488            (testLabels): Test a file where the groups have labels.
6489    
6490    2003-04-16  Bernhard Herzog  <[email protected]>
6491    
6492            Safer implementation of the performance enhancements of the
6493            low-level renderer:
6494            
6495            * extensions/thuban/wxproj.cpp (extract_projection)
6496            (extract_pointer): Rename extract_projection to extract_pointer
6497            and redefine its purpose to return the pointer stored in a CObject
6498            returned by the object's cobject method. Update all callers.
6499            (s_draw_info, free_draw_info, draw_polygon_init): Implement the
6500            handling of these low-level parameters so that each s_draw_info
6501            instance is handled as a CObject at python level that also
6502            contains real references to the actual python objects which
6503            contain the values in the struct. Add free_draw_info as the
6504            destructor.
6505            (draw_polygon_shape): Add the py_draw_info parameter which must a
6506            cobject containing an s_draw_info pointer.
6507    
6508            * Thuban/UI/renderer.py (MapRenderer.polygon_render_param): New
6509            method to instantiat the low-level render parameter
6510            (MapRenderer.draw_shape_layer): Use the new method. Remove some
6511            commented out code.
6512            (MapRenderer.draw_polygon_shape): Make the first parameter not the
6513            layer but the low-level render parameter
6514            (ScreenRenderer.draw_shape_layer): Use the low-level render
6515            parameter.
6516    
6517    2003-04-15  Jonathan Coles   <[email protected]>
6518    
6519            * Thuban/Model/classification.py: Implemented __repr__ for
6520            the ClassGroup* classes to make debugging a bit easier.
6521            (ClassGroup.SetLabel): Check that the string is an instance
6522            of StringTypes not StringType. Accounts for Unicode strings.
6523    
6524            * Thuban/Model/color.py: Implemented __repr__ to make
6525            debugging a bit easier.
6526    
6527            * Thuban/Model/save.py (Saver.write_classification): Need to
6528            save the group label.
6529    
6530            * test/test_load.py (testClassification): New. Loads the
6531            iceland_sample_test.thuban file and checks if it was loaded
6532            correctly.
6533    
6534    2003-04-15  Jonathan Coles   <[email protected]>
6535    
6536            * extensions/thuban/wxproj.cpp (draw_polygon_init): New. Used
6537            to improve rendering performance by initializing the variables
6538            that are not change each time draw_polygon_shape() is called.
6539            The values are stored in a global struct draw_info.
6540            (draw_polygon_shape): Removed initialization code that is
6541            now in draw_polygon_init().
6542    
6543            * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Make
6544            drawing initialization call to draw_polygon_init()
6545            (MapRenderer.draw_polygon_shape): Use new signature of
6546            draw_polygon_shape.
6547    
6548            * Thuban/UI/classgen.py (GenUniformPanel): Fix spin control
6549            weirdness by setting the range to (1, maxint).
6550    
6551            * Thuban/Model/classification.py (ClassGroupProperties): Make
6552            instance variables private and optimize comparison operator
6553            by first checking if the color references are the same.
6554            (ClassGroupSingleton): Make instance variables private.
6555            (ClassGroupRange): Make instance variables private.
6556    
6557            * HOWTO-Release: Filled in missing steps for releasing packages.
6558    
6559    2003-04-15  Bernhard Herzog  <[email protected]>
6560    
6561            First stab at internationalized messages:
6562    
6563            * Thuban/__init__.py (_): Implement the translation function for
6564            real using the python gettext module.
6565    
6566            * Thuban/UI/classifier.py (ClassTable.GetRowLabelValue): Don't
6567            translate empty strings.
6568    
6569            * Thuban/UI/application.py (ThubanApplication.read_startup_files):
6570            Add a missing space to a warning message
6571    
6572            * po/README: New. Notes about the management of the translation
6573            files.
6574    
6575            * po/Makefile: New. Makefile to help manage the translation files.
6576    
6577            * po/es.po: New. Spanish translation by Daniel Calvelo Aros
6578    
6579            * MANIFEST.in: Include the *.mo files in Resources/Locale and the
6580            translations and support files in po/
6581    
6582            * setup.py (data_files): Add the *.mo files to the data_files too
6583    
6584            * README: Add note about the translations when building from CVS
6585    
6586    2003-04-14  Jonathan Coles   <[email protected]>
6587    
6588            * Thuban/UI/dock.py: Fixes some window resizing problems most
6589            noticable under windows. Always assume the button bitmaps will
6590            be there. Code clean up.
6591            (DockabelWindow.Dock, DockableWindow.UnDock): Force all the
6592            images for the dock/undock button to the same images.
6593            Work around for RTbug #1801.
6594    
6595            * Thuban/UI/legend.py (LegendPanel.__init__): The toolbar should
6596            be allowed to grow within the sizer. Fixes a bug under Windows
6597            where the toolbar wasn't being drawn.
6598    
6599    2003-04-14  Frank Koormann   <[email protected]>
6600    
6601            * Resources/Bitmaps/dock_12.xpm, Resources/Bitmaps/undock_12.xpm:
6602            Updated design to try to make the button functionality more
6603            transparent.
6604    
6605    2003-04-14  Jonathan Coles   <[email protected]>
6606    
6607            * Thuban/UI/legend.py (LegendPanel.__init__): Call Create() to
6608            finalize the intialization of the panel.
6609    
6610            * Thuban/UI/dock.py (DockPanel.Create): New. Finalizes the
6611            creation of the panel. Should be the last thing called in the
6612            initializer of a subclass.
6613    
6614            * Thuban/UI/classgen.py (ClassGenDialog.__init__): Actively
6615            set the current selections in the combo boxes. This is needed
6616            under Windows.
6617    
6618            * Thuban/UI/classifier.py (Classifier.__init__): Add a top
6619            level panel to the dialog so that the background colors are
6620            consistent under Windows.
6621    
6622    2003-04-11  Jonathan Coles   <[email protected]>
6623    
6624            * Thuban/UI/classgen.py: Change color ramps to start at white
6625            not black.
6626    
6627            * Thuban/UI/legend.py: Enable/disable the legend buttons when
6628            the legend changes. Fixes RTbug #1793.
6629    
6630            * test/test_classification.py: Added test for copying of
6631            classifications.
6632    
6633    2003-04-11  Jonathan Coles   <[email protected]>
6634    
6635            * Thuban/UI/resource.py: New. Centralize the loading of resources
6636            such as bitmaps.
6637    
6638            * Thuban/UI/classgen.py (GenUniquePanel.__init__): Reordered buttons,
6639            added images to the move buttons, added 'reverse' button.
6640            (CustomRampPanel.__init__): Added images to the move buttons.
6641            (GreyRamp): New. Generates a ramp from white to black.
6642            (HotToColdRamp): New. Generates a ramp from cold to hot colors.
6643    
6644            * Thuban/UI/classifier.py: Refactored ID's from ID_CLASSIFY_* to
6645            ID_PROPERTY_*.
6646            (Classifier.__init__): Minor changes to the layout.
6647            (Classifier._OnTitleChanged): Listen for when the user edits the
6648            title and update the dialog's title and the layer's title.
6649    
6650            * Thuban/UI/dock.py: Use new bitmaps for the control buttons.
6651    
6652            * Thuban/UI/legend.py: Use new bitmaps for the control buttons.
6653            (LegendTree._OnMsgLayerTitleChanged): Change the displayed title
6654            if the layer's title changes.
6655    
6656            * Thuban/UI/mainwindow.py: Added new menu item and associated code
6657            to open a dialog to rename the map.
6658            (MainWindow): Use new resource class to import bitmaps.
6659    
6660    2003-04-11  Jonathan Coles   <[email protected]>
6661    
6662            * Resources/Bitmaps/close_12.xpm, Resources/Bitmaps/dock_12.xpm,
6663            Resources/Bitmaps/group_use.xpm, Resources/Bitmaps/group_use_all.xpm,
6664            Resources/Bitmaps/group_use_none.xpm,
6665            Resources/Bitmaps/group_use_not.xpm,
6666            Resources/Bitmaps/hide_layer.xpm,
6667            Resources/Bitmaps/layer_properties.xpm,
6668            Resources/Bitmaps/lower_layer.xpm, Resources/Bitmaps/raise_layer.xpm,
6669            Resources/Bitmaps/show_layer.xpm, Resources/Bitmaps/undock_12.xpm:
6670            New.
6671    
6672    2003-04-10  Jonathan Coles   <[email protected]>
6673    
6674            * Thuban/Model/classification.py: (ClassGroupRange.__init__):
6675            Should pass group to ClassGroup constructor.
6676    
6677    2003-04-10  Jonathan Coles   <[email protected]>
6678    
6679            * Thuban/Model/classification.py: (ClassGroup): Move all the common
6680            methods of the derived classes ([Set|Get]Properties(), __eq__, __ne__)
6681            here. Implement SetVisible(), IsVisible().
6682            (ClassGroup.__init__): Add group parameter which acts as a copy
6683            constructor.
6684    
6685            * Thuban/UI/classifier.py (ClassTable): Add a new column for the
6686            "Visible" check boxes.
6687            (Classifier): Rename the buttons and refactor the code to match
6688            the new labels.
6689    
6690            * Thuban/UI/legend.py: Classify button is now called "Properties".
6691            Refactored the code to change variable names.
6692            (LegendTree.__FillTreeLayer): Only list a group if it is visible.
6693    
6694            * Thuban/UI/mainwindow.py: MainWindow.OpenClassifier renamed to
6695            MainWindow.OpenLayerProperties. MainWindow.LayerEditProperties
6696            renamed to MainWindow.LayerEditProperties.
6697            (MainWindow.ToggleLegend): Don't include map name in legend title.
6698            (MainWindow.SetMap): Added the map name to the window title.
6699            (MainWindow.LayerFillColor, MainWindow.LayerTransparentFill,
6700            MainWindow.LayerOutlineColor, MainWindow.LayerNoOutline): Removed.
6701            Functionality is found in the layer properties dialog.
6702    
6703            * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Only
6704            draw visible groups.
6705    
6706    2003-04-09  Jonathan Coles   <[email protected]>
6707    
6708            * Thuban/UI/classgen.py: Modifications to allow simple
6709            addition and selection of new color schemes.
6710            (MonochromaticRamp): New. Generates a ramp between two colors.
6711            (RedRamp): New. Generates a ramp of all red.
6712            (GreenRamp): New. Generates a ramp of all green.
6713            (BlueRamp): New. Generates a ramp of all blue.
6714    
6715    2003-04-09  Jonathan Coles   <[email protected]>
6716    
6717            * Thuban/Model/classification.py (Classification.__deepcopy__):
6718            Need to copy over field and fieldType attributes.
6719    
6720            * Thuban/Model/table.py (Table.field_range): New. Retrive the
6721            maximum and minimum values over the entire table for a given
6722            field.
6723            (Table.GetUniqueValues): New. Retrieve all the unique values
6724            in the table for a given field.
6725    
6726            * Thuban/UI/classgen.py: Renamed GenRangePanel to GenUniformPanel.
6727            (GenUniquePanel): New. Controls to allow the user to select
6728            which unique field values they would like in the classification.
6729            (CustomRampPanel): Code that was in ClassGenDialog that allows
6730            the user to select the properties for a custom ramp.
6731            (ClassGenerator.GenUniformDistribution): Was called GenerateRanges.
6732    
6733            * Thuban/UI/classifier.py: Removed a lot of debugging code.
6734            (Classifier._SetClassification): Callback method so that the
6735            class generator can set the classification in the grid.
6736            (ClassGroupPropertiesCtrl): New. Encapsulates the drawing and
6737            editing of a group properties class into a wxWindows control.
6738    
6739            * Thuban/UI/dock.py: It was decided that if the user closes
6740            a dockable window the window should simply hide itself. That
6741            way if the user wants to show the dock again it appears in the
6742            same place as it was when it was closed.
6743            (DockableWindow.Destroy): Call renamed method OnDockDestroy().
6744            (DockableWindow._OnButtonClose): Hide the window instead of
6745            destroying it.
6746            (DockableWindow._OnClose): Hide the window instead of
6747            destroying it.
6748    
6749            * Thuban/UI/legend.py (LegendTree): Use a private method to
6750            consistently set the font and style of the text. Fixes RTbug #1786.
6751    
6752            * Thuban/UI/mainwindow.py: Import just the Classifier class.
6753    
6754    2003-04-07  Bernhard Herzog  <[email protected]>
6755    
6756            * Thuban/UI/mainwindow.py (main_menu): Move the toggle_legend item
6757            to the map module
6758    
6759    2003-04-07  Bernhard Herzog  <[email protected]>
6760    
6761            * Thuban/UI/mainwindow.py (MainWindow.ShowSessionTree): Removed in
6762            favor of ToggleSessionTree
6763            (MainWindow.ToggleSessionTree): New method to toggle visibility of
6764            the session tree.
6765            (MainWindow.SessionTreeShown): New method to return whether the
6766            session tree is currently shown.
6767            (MainWindow.ToggleLegend): New method to toggle visibility of the
6768            legend
6769            (MainWindow.ShowLegend): Implement in terms of ToggleLegend and
6770            LegendShown
6771            (MainWindow.LegendShown): New method to return whether the legend
6772            is currently shown.
6773            (_method_command): Add checked parameter so we can define check
6774            menu items
6775            (_has_tree_window_shown, _has_legend_shown): Use the appropriate
6776            mainwindow methods.
6777            (show_session_tree, show_legend commands): Removed.
6778            (toggle_session_tree, toggle_legend commands): New commands to
6779            toggle the visibility of the dialogs
6780    
6781    2003-04-07  Jonathan Coles   <[email protected]>
6782    
6783            * Thuban/UI/classgen.py: Fix Windows problem.
6784    
6785            * Thuban/UI/dock.py: Fix Windows problem.
6786    
6787            * Thuban/UI/mainwindow.py: Use False instead of false.
6788            (MainWindow.ShowLegend): Remove unnecessary switch parameter.
6789    
6790    2003-04-07  Jonathan Coles   <[email protected]>
6791    
6792            Since we now say that the order of the groups in a classification
6793            matters, it makes sense to be able to manipulate that order. Most
6794            of the changes to Thuban/Model/classification.py are to that end.
6795    
6796            * Thuban/Model/classification.py (Classification.AppendGroup,
6797            Classification.InsertGroup, Classification.ReplaceGroup,
6798            Classification.RemoveGroup, Classification.GetGroup): Do as the
6799            names imply.
6800            (Classification.FindGroup): This was called GetGroup, but GetGroup
6801            takes an index, while FindGroup takes a value.
6802            (Classification.__deepcopy__): Copy all the groups, BUT NOT THE LAYER
6803            REFERENCE. Currently there is a cyclic reference between the layer
6804            and its classification. If the classification doesn't need to know
6805            its owning layer we can change this, since it may make sense to be
6806            able to use the same classification with different layers.
6807    
6808            * Thuban/Model/load.py: Use Classification.AppendGroup(), not AddGroup()
6809    
6810            * Thuban/UI/classgen.py: Use Classification.AppendGroup(),
6811            not AddGroup()
6812    
6813            * Thuban/UI/classifier.py: Now that we can depend on the order in
6814            a Classification and have methods to manipulate that order we don't
6815            need to use our own data structures in the grid. We can simply make
6816            the grid/table access the information they need from a copy of
6817            the classification object.
6818            (Classifier._OnCloseBtn): Event handler for when the user clicks
6819            'Close'. This is needed so if the user applies changes and then
6820            continues to change the table the user has the option of discarding
6821            the most recent changes and keeping what they applied.
6822    
6823            * Thuban/UI/mainwindow.py: Put "Show Legend" and "Show Session Tree"
6824            into the same group.
6825    
6826            * extensions/thuban/wxproj.cpp (check_version): If Thuban is compiled
6827            with a really old version of proj, PJ_VERSION won't even be defined.
6828            If it isn't defined then just compile so that the function always
6829            returns Py_False.
6830    
6831            * test/test_classification.py: Fix tests to use the renamed methods.
6832            Still need to write tests for the new methods.
6833    
6834    2003-04-04  Jonathan Coles   <[email protected]>
6835    
6836            * Thuban/UI/classifier.py (Classifier.__SelectField): Move the
6837            call to SetSelection out of the method and before the call
6838            to __SelectField in __init__. This prevents a recursion of events
6839            when _OnFieldSelect is triggered by the user.
6840    
6841    2003-04-04  Jonathan Coles   <[email protected]>
6842    
6843            * Thuban/Model/classification.py: Rename Color.None to
6844            Color.Transparent.
6845            (ClassGroupProperties.SetLineColori, ClassGroupProperties.SetFill):
6846            Don't bother copying the color, since Colors are immutable.
6847    
6848            * Thuban/Model/color.py, Thuban/Model/layer.py, Thuban/Model/load.py,
6849            Thuban/UI/classifier.py, Thuban/UI/mainwindow.py,
6850            Thuban/UI/renderer.py, Thuban/UI/view.py:
6851            Rename Color.None to Color.Transparent.
6852        
6853            * test/test_classification.py, test/test_load.py: Rename Color.None
6854            to Color.Transparent.
6855    
6856    2003-04-04  Jonathan Coles   <[email protected]>
6857    
6858            * Thuban/Model/classification.py: Fix assert calls.
6859            (ClassGroupProperties.SetLineColor, ClassGroupProperties.SetFill):
6860            Copy the color parameter rather than hold onto a reference.
6861    
6862            * Thuban/Model/color.py (Color.__copy__, Color.__deepcopy): Copy
6863            the color object.
6864            (NoColor.__copy__, NoColor.__deepcopy): Return 'self' so that we
6865            are sure there exists only one refernce to Color.None in the system.
6866            This allows us to use 'is' rather than the comparision functions.
6867            
6868            * Thuban/Model/save.py: Fix assert calls.
6869            
6870            * Thuban/UI/classifier.py: Fix assert calls.
6871            (ClassGrid._OnCellDClick): Call up to the classifier to open the
6872            dialog to edit the groups properties.
6873            (ClassGrid._OnCellResize): Make sure that the scollbars are drawn
6874            correctly if a cell is resized.
6875            (ClassTable.SetClassification): New. Changes the classification
6876            that is in the table.
6877            (ClassTable.__SetRow): Allow groups to be prepended.
6878            (Classifier): New code for opening the EditProperties and
6879            GenerateRanges dialogs.
6880            (SelectPropertiesDialog.__GetColor): Only set the color in the
6881            color dialog if the current color is not None.
6882            
6883            * Thuban/UI/dock.py: Fix assert calls.
6884            
6885            * Thuban/UI/legend.py: Fix assert calls.
6886            
6887            * Thuban/UI/renderer.py: Fix assert calls.
6888            
6889            * Thuban/UI/classgen.py (ClassGenDialog): Dialog for generating
6890            classifications.
6891            (GenRangePanel): Panel specific to range generation.
6892            (GenSingletonPanel): Panel specific to singleton generation.
6893            (ClassGenerator): Class responsible for actually generating
6894            the classification from the data gathered in the dialog box.
6895            (PropertyRamp): Generates properties whose values range from
6896            a starting property to an ending property.
6897    
6898    2003-04-03  Bernhard Herzog  <[email protected]>
6899    
6900            * test/support.py (print_garbage_information): New function that
6901            prints information about still connected messages and memory
6902            leaks.
6903            (run_suite): Removed.
6904            (run_tests): New function for use as a replacement of
6905            unittest.main in the test_* files. This one calls
6906            print_garbage_information at the end.
6907    
6908            * test/runtests.py (main): Use support.print_garbage_information
6909    
6910            * test/test_layer.py: Use support.run_tests instead of
6911            unittest.main so we get memory leak information
6912            (TestLayer.test_arc_layer, TestLayer.test_polygon_layer)
6913            (TestLayer.test_point_layer, TestLayer.test_empty_layer)
6914            (TestLayerLegend.test_visibility): Call the layer's Destroy method
6915            to fix a memory leak.
6916    
6917            * test/test_classification.py: Use support.run_tests instead of
6918            unittest.main so we get memory leak information
6919            (TestClassification.test_classification): Call the layer's Destroy
6920            method to fix a memory leak.
6921    
6922    2003-04-02  Bernhard Herzog  <[email protected]>
6923    
6924            * extensions/thuban/wxproj.cpp (check_version, check_version_gtk):
6925            Handle the reference counts of the return value and errors in
6926            PyArg_ParseTuple correctly.
6927    
6928            * Thuban/UI/application.py (ThubanApplication.OpenSession): Make
6929            sure the filename is absolute to avoid problems when saving the
6930            session again
6931    
6932            * Thuban/Model/table.py: Remove unnecessary import. Fix a typo.
6933    
6934    2003-04-01  Jonathan Coles   <[email protected]>
6935    
6936            *  Thuban/UI/renderer.py (MapRenderer.draw_point_shape): Check
6937            that there actually are points in the returned list of points
6938            before trying to index into the list. The list may be empty if
6939            the shape is a Null Shape.
6940    
6941    2003-04-01  Bernhard Herzog  <[email protected]>
6942    
6943            * test/test_map.py: Don't use from <module> import *
6944    
6945    2003-04-01  Jonathan Coles   <[email protected]>
6946    
6947            * Thuban/Model/session.py: Use LAYER_CHANGED instead of
6948            LAYER_LEGEND_CHANGED
6949    
6950            * Thuban/UI/dock.py (DockableWindow._OnButtonClose): Call
6951            self.Destroy() to close the window after yesterday's changes.
6952    
6953            * test/test_map.py, test/test_session.py: Fix messages that
6954            are sent from maps and layers.
6955    
6956    2003-03-31  Jonathan Coles   <[email protected]>
6957    
6958            * Thuban/UI/classifier.py: Commented out some debugging statements.
6959            (ClassDataPreviewer.Draw): Draw rectangles for polygon layers per
6960            RTbug #1769.
6961    
6962            * Thuban/UI/dock.py (DockableWindow.UnDock): Restore size and
6963            position (although position doesn't work yet under GTK).
6964            (DockableWindow.Destroy): New. Called when the window must be
6965            closed. Namely needed when the DockFrame closes and must close
6966            its children.
6967            (DockFrame): Listen for EVT_CLOSE and destroy all children.
6968    
6969            * Thuban/UI/legend.py (LegendPanel.Destroy): New. Cleans up
6970            when then window is told to close.
6971            (LegendTree._OnMsgLayerChanged): Fixes a seg fault bug. See
6972            comment in source for more info.
6973    
6974            * Thuban/UI/main.py: Show the legend by default when Thuban starts.
6975    
6976            * Thuban/UI/mainwindow.py: Renamed OnClose to _OnClose for
6977            symmetry with other such methods.
6978            (MainWindow.ShowLegend): Show the legend docked by default.
6979    
6980    2003-03-28  Jonathan Coles   <[email protected]>
6981    
6982            * Thuban/UI/classifier.py: Support for highlighting a specific
6983            group within the grid when the classification dialog is opened.
6984            Also contains a lot of debugging printouts which will later
6985            be removed.
6986    
6987            * Thuban/UI/dock.py: Complete rework on the dock code so that
6988            that it is fairly removed from the rest of the Thuban application.
6989            It is easy to add new docks which the rest of the program having
6990            to be aware of them.
6991    
6992            * Thuban/UI/legend.py: Modifications to support selecting a
6993            specific group in the classification dialog. Changed how layers
6994            are drawn when the layer is visible/invisible.
6995    
6996            * Thuban/UI/mainwindow.py: Removed legend specific code and
6997            replaced it with calls to the new dock code.
6998    
6999            * Thuban/UI/renderer.py (MapRenderer.__init__): Added assert
7000            to check if scale > 0. Trying to track down a divide by zero.
7001    
7002    2003-03-26  Jonathan Coles   <[email protected]>
7003    
7004            * Thuban/UI/legend.py: Removed unnecessary LegendDialog class.
7005            (LegendPanel): Removed _OnDock()/_OnUnDock() methods which are
7006            now part of DockableWindow.
7007            (LegendPanel.DoOnSelChanged): Select the current layer in the
7008            map.
7009            (LegendTree._OnSelChanged): Call LegendPanel.DoOnSelChanged()
7010            with the selected layer and/or group.
7011    
7012    2003-03-26  Jonathan Coles   <[email protected]>
7013    
7014            This putback contains the code for dockable windows. There is
7015            no support in wxWindows as of this date for windows that can
7016            attach themselves to other windows.
7017    
7018            The current model contains a DockableWindow which has a parent
7019            window for when it is detached and a dock window that it puts
7020            its contents in when it is docked. The contents of a DockableWindow
7021            must be a DockPanel. DockPanel itself derives from wxPanel.
7022    
7023            * Thuban/Model/layer.py (Layer.ClassChanged): Send a LAYER_CHANGED
7024            message, not a LAYER_LEGEND_CHANGED message.
7025    
7026            * Thuban/Model/map.py (Map): Forward LAYER_CHANGED messages.
7027    
7028            * Thuban/UI/classifier.py (Classifier.__init__): Use wxADJUST_MINSIZE
7029            as one of the style properties for the fieldTypeText item to
7030            be sure that its size is correct when the text changes.
7031    
7032            * Thuban/UI/dock.py: New. Classes for the DockPanel and
7033            DockableWindow.
7034    
7035            * Thuban/UI/legend.py: Added some more buttons and made the
7036            LegendPanel a DockPanel.
7037    
7038            * Thuban/UI/mainwindow.py: Added sash windows to the main window
7039            and supporting functions for manipulating the sashes.
7040            (MainWindow.ShowLegend): Create a DockableWindow with the
7041            LegendPanel as the contents.
7042    
7043            * Thuban/UI/messages.py: Added DOCKABLE_* messages
7044    
7045            * Thuban/UI/view.py (MapCanves.SetMap): Listen for LAYER_CHANGED,
7046            not LAYER_LEGEND_CHANGED, messages.
7047    
7048    2003-03-25  Jonathan Coles   <[email protected]>
7049    
7050            * setup.py: Added custom script bdist_rpm_build_script so that
7051            when the rpm is built the path to wx-config is correct.
7052    
7053            * setup.cfg: Added line saying to use the custom build script
7054    
7055    2003-03-20  Jonathan Coles   <[email protected]>
7056    
7057            Initial implementation of the Legend.
7058    
7059            * Thuban/UI/legend.py: New. Creates a window that shows the map's
7060            Legend information and allows the user to add/modify classifications
7061            and how the layers are drawn on the map.
7062    
7063            * setup.py: New command 'build_docs' which currently uses
7064            happydoc to generate html documentation for Thuban.
7065    
7066            * Thuban/Model/classification.py (ClassGroup.GetDisplayText): New.
7067            Returns a string which is appropriately describes the group.
7068    
7069            * Thuban/Model/layer.py (Layer.SetClassification): Generate a
7070            LAYER_CHANGED event instead of a LAYER_LEGEND_CHANGED event.
7071    
7072            * Thuban/Model/map.py (Map): Rename messages and use new, more
7073            specific, messages.
7074    
7075            * Thuban/Model/messages.py: New message to indicate that a layer's
7076            data has changed (LAYER_CHANGED). New map messages to indicate
7077            when layers have been added/removed/changed or if the stacking order
7078            of the layers has changed.
7079    
7080            * Thuban/Model/session.py: Rename and use new messages.
7081    
7082            * Thuban/UI/classifier.py: Remember if any changes have actually
7083            been applied so that if the dialog is cancelled without an application
7084            of changes we don't have to set a new classification.
7085            (ClassDataPreviewer): Pulled out the window specific code and put it
7086            ClassDataPreviewWindow. ClassDataPreviewer can then be used to draw
7087            symbols on any DC.
7088            
7089            * Thuban/UI/mainwindow.py: New code to open the legend.
7090    
7091            * Thuban/UI/view.py: Use new message names.
7092    
7093    2003-03-19  Jonathan Coles   <[email protected]>
7094    
7095            * Thuban/UI/main.py (verify_versions): New. Checks the versions
7096            of Python, wxPython, and some other libraries.
7097    
7098            * extensions/thuban/wxproj.cpp (check_version): Checks the given
7099            version against what wxproj was compiled with.
7100            (check_version_gtk): If wxproj was compiled with gtk then check
7101            the given version against the version of the gtk library
7102            currently being used.
7103    
7104    2003-03-14  Bernhard Herzog  <[email protected]>
7105    
7106            * test/test_command.py: Run the tests when the module is run as a
7107            script
7108    
7109    2003-03-14  Bernhard Herzog  <[email protected]>
7110    
7111            Implement selection of multiple selected shapes in the same layer:
7112    
7113            - Introduce a new class to hold the selection. This basically
7114              replaces the interactor which was nothing more than the
7115              selection anyway. A major difference is of course that the new
7116              selection class supports multiple selected shapes in one layer
7117            
7118            - Move the object that represents the selection from the
7119              application to the canvas. The canvas is a better place than the
7120              application because the selection represents which shapes and
7121              layer of the map displayed by the canvas are selected and
7122              affects how the map is drawn.
7123    
7124            - Make the selection and its messages publicly available through
7125              the mainwindow.
7126    
7127            - The non-modal dialogs do not get a reference to the interactor
7128              anymore as they can simply refer to their parent, the
7129              mainwindow, for the what the interactor had to offer.
7130    
7131            * Thuban/UI/selection.py: New module with a class to represent the
7132            selection.
7133    
7134            * Thuban/UI/messages.py (SELECTED_TABLE, SELECTED_MAP): Remove
7135            these unused messages
7136    
7137            * Thuban/UI/application.py (ThubanApplication.OnInit)
7138            (ThubanApplication.OnExit, ThubanApplication.SetSession): The
7139            interactor is gone now.
7140            (ThubanApplication.CreateMainWindow): There is no interactor
7141            anymore so we pass None as the interactor argument for now for
7142            compatibility.
7143    
7144            * Thuban/UI/view.py (MapCanvas.delegated_messages)
7145            (MapCanvas.Subscribe, MapCanvas.Unsubscribe): In Subscribe and
7146            Unsubscribe, delegate messages according to the delegated_messages
7147            class variable.
7148            (MapCanvas.__getattr__, MapCanvas.delegated_methods): Get some
7149            attributes from instance variables as described with the
7150            delegated_methods class variable.
7151            (MapCanvas.__init__): New instance variable selection holding the
7152            current selection
7153            (MapCanvas.do_redraw): Deal with multiple selected shapes. Simply
7154            pass them on to the renderer
7155            (MapCanvas.SetMap): Clear the selection when a different map is
7156            selected.
7157            (MapCanvas.shape_selected): Simple force a complete redraw. The
7158            selection class now takes care of only issueing SHAPES_SELECTED
7159            messages when the set of selected shapes actually does change.
7160            (MapCanvas.SelectShapeAt): The selection is now managed in
7161            self.selection
7162    
7163            * Thuban/UI/mainwindow.py (MainWindow.delegated_messages)
7164            (MainWindow.Subscribe, MainWindow.Unsubscribe): In Subscribe and
7165            Unsubscribe, delegate messages according to the delegated_messages
7166            class variable.
7167            (MainWindow.delegated_methods, MainWindow.__getattr__): Get some
7168            attributes from instance variables as described with the
7169            delegated_methods class variable.
7170            (MainWindow.__init__): The interactor as ivar is gone. The
7171            parameter is still there for compatibility. The selection messages
7172            now come from the canvas.
7173            (MainWindow.current_layer, MainWindow.has_selected_layer):
7174            Delegate to the the canvas.
7175            (MainWindow.LayerShowTable, MainWindow.Classify)
7176            (MainWindow.identify_view_on_demand): The dialogs don't need the
7177            interactor parameter anymore.
7178    
7179            * Thuban/UI/tableview.py (TableFrame.__init__)
7180            (LayerTableFrame.__init__, LayerTableFrame.OnClose)
7181            (LayerTableFrame.row_selected): The interactor is gone. It's job
7182            from the dialog's point of view is now done by the mainwindow,
7183            i.e. the parent. Subscribe to SHAPES_SELECTED instead
7184            of SELECTED_SHAPE
7185            
7186            * Thuban/UI/dialogs.py (NonModalDialog.__init__): The interactor
7187            is gone. It's job from the dialog's point of view is now done by
7188            the mainwindow, i.e. the parent.
7189            
7190            * Thuban/UI/classifier.py (Classifier.__init__): The interactor is
7191            gone. It's job from the dialog's point of view is now done by the
7192            mainwindow, i.e. the parent.
7193    
7194            * Thuban/UI/tree.py (SessionTreeView.__init__): The interactor is
7195            gone. It's job from the dialog's point of view is now done by the
7196            mainwindow, i.e. the parent.
7197            (SessionTreeCtrl.__init__): New parameter mainwindow which is
7198            stored as self.mainwindow. The mainwindow is need so that the tree
7199            can still subscribe to the selection messages.
7200            (SessionTreeCtrl.__init__, SessionTreeCtrl.unsubscribe_all)
7201            (SessionTreeCtrl.update_tree, SessionTreeCtrl.OnSelChanged): The
7202            selection is now accessible through the mainwindow. Subscribe to
7203            SHAPES_SELECTED instead of SELECTED_SHAPE
7204    
7205            * Thuban/UI/identifyview.py (IdentifyView.__init__): Use the
7206            SHAPES_SELECTED message now.
7207            (IdentifyView.selected_shape): Now subscribed to SHAPES_SELECTED,
7208            so deal with multiple shapes
7209            (IdentifyView.__init__, IdentifyView.OnClose): The interactor is
7210            gone. It's job from the dialog's point of view is now done by the
7211            mainwindow, i.e. the parent.
7212    
7213            * Thuban/UI/controls.py (RecordListCtrl.fill_list): The second
7214            parameter is now a list of shape ids.
7215            (RecordTable.SetTable): The second parameter is now a list of
7216            indices.
7217    
7218            * Thuban/UI/renderer.py (ScreenRenderer.RenderMap): Rename the
7219            selected_shape parameter and ivar to selected_shapes. It's now a
7220            list of shape ids.
7221            (MapRenderer.draw_label_layer): Deal with multiple selected
7222            shapes. Rearrange the code a bit so that the setup and shape type
7223            distinctions are only executed once.
7224    
7225            * test/test_selection.py: Test cases for the selection class
7226    
7227    2003-03-11  Jonathan Coles   <[email protected]>
7228    
7229            * Thuban/Model/load.py: Temporary fix so that the xml reader
7230            doesn't cause Thuban to crash.
7231    
7232            * Thuban/Model/layer.py: Handle the cyclic references between
7233            a layer and its classification better, and be sure to disconnect
7234            the classification from the layer when the layer is destroyed
7235            so that we don't maintain a cyclic reference that may not be
7236            garbage collected.
7237    
7238            * Thuban/Model/classification.py: See comment for layer.py.
7239    
7240    2003-03-12  Jan-Oliver Wagner <[email protected]>
7241    
7242            * HOWTO-Release: New. Information on the steps for releasing
7243            a new version of Thuban.
7244    
7245    2003-03-11  Jonathan Coles   <[email protected]>
7246    
7247            * Thuban/UI/classifier.py: Add normal border to SelectPropertiesDialog.
7248            Use True instead of true.
7249            (Classifier): Should have a single panel in which all the controls lie.
7250    
7251            * Thuban/UI/proj4dialog.py: Add normal border.
7252    
7253            * Thuban/UI/tree.py: Fixed problem with bad item images under Windows.
7254    
7255            * Thuban/UI/mainwindow.py: Use True instead of true.
7256    
7257            * setup.py: Update some definitions to use wxWindows2.4 files
7258    
7259            * Data/iceland_sample_class.thuban: Fixed file so that the
7260            field_type information is present.
7261    
7262    2003-03-10  Jonathan Coles   <[email protected]>
7263    
7264            * Thuban/UI/classifier.py (Classifier.__init__): Make the
7265            field type label grow so that when the text changes the
7266            size is updated correctly. This may be a wxWindows bug.
7267    
7268    2003-03-10  Jonathan Coles   <[email protected]>
7269    
7270            * Thuban/UI/application.py: Changed SESSION_CHANGED to
7271            SESSION_REPLACED.
7272    
7273            * Thuban/UI/classifier.py: Wrap text with _().
7274            (ClassGrid.CreateTable): Set dimensions and size hints here,
7275            instead of in Reset, so we only set the size once.
7276    
7277            * Thuban/UI/dialogs.py: Don't need Shutdown(); just use Close()!
7278    
7279            * Thuban/UI/mainwindow.py (MainWindow.prepare_new_session):
7280            Call Close() instead of Shutdown().
7281    
7282            * Thuban/UI/messages.py: Changed SESSION_CHANGED to SESSION_REPLACED.
7283    
7284            * Thuban/UI/tree.py: Changed SESSION_CHANGED to SESSION_REPLACED.
7285            Go back to using OnClose() instead of Shutdown().
7286    
7287    2003-03-10  Jonathan Coles   <[email protected]>
7288    
7289            * Thuban/UI/classifier.py (Classifier): SelectField() needed
7290            to know the old field index as well as the new one.
7291    
7292    2003-03-10  Jonathan Coles   <[email protected]>
7293    
7294            * Thuban/UI/classifier.py (Classifier): Use __SelectField()
7295            to correctly set the table information and call this from
7296            __init__ and from _OnFieldSelect so that all the information
7297            is up to date when the dialog opens and when a field is changed.
7298    
7299    2003-03-10  Jonathan Coles   <[email protected]>
7300    
7301            * Thuban/Model/classification.py (Classification): Don't use
7302            layer's message function directly, use the ClassChanged() method
7303            when then classification changes. SetField/SetFieldType/SetLayer
7304            must keep the information about field name and field type in
7305            sync when an owning layer is set or removed.
7306    
7307            * Thuban/Model/layer.py: Added ClassChanged() so that the
7308            classification can tell the layer when its data has changed.
7309            (Layer.SetClassification): Accepts None as an arguement to
7310            remove the current classification and correctly handles
7311            adding a new classification.
7312    
7313            * Thuban/Model/load.py: Comment out print statement
7314    
7315            * test/test_classification.py, test/test_save.py: New and
7316            improved tests.
7317    
7318    2003-03-07  Jonathan Coles   <[email protected]>
7319    
7320            * Thuban/Model/classification.py: Implemented __copy__ and
7321            __deepcopy__ for ClassGroup* and ClassGroupProperites so
7322            they can easily be copied by the classifier dialog.
7323            (ClassGroupProperites.__init__): The default line color should
7324            have been Color.Black.
7325    
7326            * Thuban/UI/classifier.py: Setting and Getting table values now
7327            uses a consistent set of functions.
7328            (Classifier): Now non-modal. Has field type label which changes
7329            as the field changes. Keep track of buttons in a list so that
7330            we can enable/disable the buttons when the None field is selected.
7331            (SelectPropertiesDialog): Add buttons to make the colors transparent.
7332    
7333            * Thuban/UI/dialogs.py (NonModalDialog.Shutdown): New method which
7334            does what OnClose did, but can be called by the application to
7335            close a window. Needed when a session changes, and we have to
7336            close the classifier windows.
7337    
7338            * Thuban/UI/mainwindow.py (MainWindow.prepare_new_session):
7339            Shuts down open dialogs. Used when a new session is created
7340            or a session is opened.
7341            (MainWindow.SaveSession): Should only call application.SaveSession()
7342            if we don't call SaveSessionAs first.
7343            (MainWindow.Classify): Allow different classifier dialogs for
7344            different layers.
7345    
7346            * Thuban/UI/tree.py (SessionTreeView): Remove OnClose and let
7347            the parent class handle it. Add Shutdown() to unsubscibe from
7348            event notification and call the parent Shutdown(). This was
7349            necessary so the application can close the tree window.
7350    
7351    2003-03-06  Jonathan Coles   <[email protected]>
7352    
7353            * Thuban/Model/classification.py: Minor documentation changes,
7354            Addition of __eq__ and __ne__ methods.
7355            (Classification.SetLayer): prevent recursion between this method
7356            and Layer.SetClassification().
7357    
7358            * Thuban/Model/color.py: Addition of __eq__ and __ne__ methods.
7359    
7360            * Thuban/Model/layer.py (SetClassification): prevent recursion
7361            between this method and Classification.SetLayer().
7362    
7363            * test/test_classification.py, test/test_load.py,
7364            test/test_session.py: Fixed and added tests for the classification
7365            classes.
7366    
7367    2003-03-06  Bernhard Herzog  <[email protected]>
7368    
7369            * Thuban/UI/classifier.py (ClassGrid.__init__)
7370            (ClassGrid.CreateTable): Move the SetSelectionMode call to
7371            CreateTable because otherwise it triggers an assertion in
7372            wxPython/wxGTK 2.4.
7373    
7374    2003-03-05  Jonathan Coles   <[email protected]>
7375    
7376            * Thuban/common.py: Move FIELDTYPE constants back to table.py.
7377    
7378            * Thuban/Model/load.py: import FIELDTYPE constants from table.
7379    
7380            * Thuban/UI/classifier.py: import FIELDTYPE constants from table.
7381    
7382            * Thuban/Model/table.py: Put FIELDTYPE constants back.
7383    
7384    2003-03-05  Jonathan Coles   <[email protected]>
7385    
7386            * Thuban/UI/classifier.py: Added class documentation.
7387            Fixed RTbug #1713, #1714. Added Move[Up|Down] buttons.
7388            Store just the groups in the table and generate the other
7389            column information when it is requested. Add "None" field
7390            to pull-down to select no classification.
7391    
7392            * Thuban/common.py: Moved FIELDTYPE constants from table.py
7393            (Str2Num): Only catch ValueError exceptions.
7394    
7395            * Thuban/Model/classification.py: Class documentation. Renaming
7396            of methods with Stroke to Line. Groups are stored in a single
7397            list with the default as the first element. Groups are searched
7398            in the order they appear in the list.
7399    
7400            * Thuban/Model/color.py: Documentation.
7401    
7402            * Thuban/Model/layer.py (Layer): Add GetFieldType to retreive
7403            the kind of data represented by a field.
7404    
7405            * Thuban/Model/load.py (ProcessSession): Use proper string
7406            conversion function; fixes RTbug #1713.
7407    
7408            * Thuban/Model/save.py (Saver): Store field type information.
7409    
7410            * Thuban/Model/table.py: Put FIELDTYPE constants in common.py.
7411            (Table): Add field_info_by_name() to retrieve field information
7412            by specifying the field name, not the number.
7413    
7414            * Thuban/UI/mainwindow.py: Function name changes.
7415    
7416            * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Only
7417            get the layer classification once. Don't try to classify
7418            values when the field is None: just use the default properties.
7419    
7420            * Thuban/UI/view.py: Function name changes.
7421    
7422            * Doc/thuban.dtd: Add field_type attribute to a classification.
7423    
7424    2003-03-04  Bernhard Herzog  <[email protected]>
7425    
7426            * Doc/thuban.dtd: Use correct syntax for optional attributes. Make
7427            the fill and stroke layer attributes optional with suitable
7428            default values. Add the stroke_width layer attribute. Use correct
7429            syntax for empty elements. Make the attribute list for labels
7430            refer to the label element.
7431    
7432    2003-03-04  Bernhard Herzog  <[email protected]>
7433    
7434            * setup.py (thuban_build_py.build): Add a comment about distutils in
7435            Python 2.3 containing some of the functionality we implement in
7436            setup.py ourselves.
7437    
7438            * Thuban/UI/classifier.py (ClassGrid.__init__): Set the table
7439            before the selection mode. Doing it the other way round triggers
7440            an assertion in wxWindows.
7441    
7442            * Thuban/Model/save.py (escape): Fix typo in doc-string
7443    
7444            * Thuban/Model/classification.py: Remove unnecessary wxPython
7445            import
7446    
7447    2003-03-04  Jonathan Coles   <[email protected]>
7448    
7449            * Thuban/Model/classification.py (ClassGroupRange.GetProperties):
7450            Parameter 'value' should default to None.
7451    
7452            * Thuban/UI/mainwindow.py: Use Layer.GetClassification() since
7453            the class attribute __classification is now private.
7454    
7455            * Thuban/UI/classifier.py (ClassGrid): Moved OnCellDClick() from
7456            Classifier to ClassGrid. Added support for removing selected rows,
7457            which including code for keeping track of when cells are selected,
7458            and deselected.
7459            (ClassTable): Support for added/removing rows. Fixed a problem
7460            with __ParseInput whereby it would not allow strings (only numbers)
7461            to be entered.
7462            (Classifier): Added button and supporting code for removing
7463            selected rows.
7464    
7465    2003-02-27  Jonathan Coles   <[email protected]>
7466    
7467            * Thuban/common.py: Moved color conversion functions into
7468            Thuban/UI/common.py.
7469            (Str2Num): Now converts the float (not the string) to a long/int
7470            so that an exception isn't thrown.
7471    
7472            * Thuban/UI/common.py: Common functions used in several UI modules
7473    
7474            * Thuban/Model/classification.py: Changed the class hierarchy
7475            so that a Classification consists of Groups which return
7476            Properties when a value matches a Group.
7477    
7478            * Thuban/Model/layer.py: Fixed name resolution problem.
7479    
7480            * Thuban/Model/load.py: Use new Classification and Group functions.
7481    
7482            * Thuban/Model/save.py (Saver.write_attribs): Fixes a test case
7483            failure.
7484            (Saver.write_classification): Use new Classification and Group
7485            functions.
7486    
7487            * Thuban/UI/classifier.py: Changes to use new Classification and Group
7488            functions. Fix to create a tuple with a single value instead of
7489            simply returning the value.
7490    
7491            * Thuban/UI/renderer.py: Use new Classification and Group functions.
7492            Use common.py functions.
7493    
7494            * Thuban/UI/tree.py: Use common.py functions.
7495            
7496            * test/test_classification.py: Use new Classification and Group
7497            classes.
7498    
7499    2003-02-24  Jonathan Coles   <[email protected]>
7500    
7501            * Thuban/common.py (Color2wxColour, wxColour2Color): Conversion
7502            functions from Thuban color objects to wxWindow colour objects.
7503    
7504            * Thuban/Model/classification.py (Classification): Renamed
7505            GetProperties() to GetClassData(). Used the new iterator
7506            in TreeInfo().
7507            (ClassIterator): Iterator implementation to iterate over the
7508            ClassData objects in a classification object.
7509    
7510            * Thuban/Model/save.py (Saver.write_classificaton): Uses
7511            the new iterator to save the classification information.
7512    
7513            * Thuban/UI/classifier.py (SelectPropertiesDialog): Support
7514            for changing the stroke and fill colors and previewing the
7515            changes.
7516    
7517            * Thuban/UI/mainwindow.py (MainWindow.OpenSession,
7518            MainWindow.SaveSessionAs): Text string changes so the dialogs
7519            have more meaningful titles.
7520    
7521            * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Change
7522            Classification method name from GetProperties to GetClassData.
7523    
7524            * Thuban/UI/view.py (MapCanvas.find_shape_at): Use method calls
7525            instead of accessing now non-existent class variables.
7526    
7527    2003-02-24  Bernhard Herzog  <[email protected]>
7528    
7529            * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Remove
7530            unneeded Shape() call. Rendering is substantially faster without
7531            it and it avoids some problems with broken shape files.
7532    
7533    2003-02-20  Frank Koormann   <[email protected]>
7534    
7535            Force minimal size of identify and label dialogs. The autosizing
7536            looked too ugly.
7537    
7538            * Thuban/UI/controls.py (RecordListCtrl): Set minimal width for columns.
7539            * Thuban/UI/labeldialog.py (LabelDialog.dialog_layout):
7540            Set size of listctrl.
7541            * Thuban/UI/identifyview.py (IdentifyView.__init__):
7542            Set size of dialog.
7543    
7544    2003-02-19  Jonathan Coles   <[email protected]>
7545    
7546            * test/test_classification.py, test/test_layer.py,
7547            test/test_load.py, test/test_map.py, test/test_session.py:
7548            Updated the tests to use the new functions that are in the
7549            respective classes.
7550    
7551            * Thuban/Model/classification.py (Classification):
7552            Uses the new ClassData* classes. Modification messages are
7553            passed up to the parent layer (if it exists).
7554            (ClassData): New class to encapsulate the common data in each
7555            classification property.
7556            (ClassDataDefault): Represents the Default class. data.
7557            (ClassDataPoint): Represents a single class. data point
7558            (ClassDataRange): Represents a class. range
7559            (ClassDataMap): Represents a class. map (unused).
7560    
7561            * Thuban/Model/color.py: Added Color.None to represent something
7562            with no color. Color.Black represents the color black.
7563            (NoColor): Helper class derived from Color to represent something
7564            with no color.
7565    
7566            * Thuban/Model/layer.py (Layer): Removed references to fill, stroke,
7567            stroke_width attributes. Made the 'classification' attribute private.
7568            New methods for setting/getting the classification.
7569    
7570            * Thuban/Model/load.py (ProcessSession): Use new methods on Layer
7571            to get the classifcation and use the new ClassData* classes to
7572            hold the classification data. Use Str2Num to convert numbers
7573            properly.
7574    
7575            * Thuban/Model/save.py (Saver): Use new Color and Classification
7576            methods
7577    
7578            * Thuban/UI/classifier.py (ClassGrid): New class to represent a
7579            custom grid.
7580            (ClassTable): Support for editing Values and Labels and for
7581            changing what type (point or range) of data is stored in each
7582            property based on how the user enters the data.
7583            (Classifier): Support for saving the new classifications and
7584            launching the dialog to edit a property.
7585            (SelectPropertiesDialog): New class for editing the visual
7586            properties of a classification (stroke color, width, and fill color)
7587            (ClassPreviewer): Took the Draw method from ClassRenderer and
7588            made most of it into this new class. Intend to use this class in
7589            the SelectPropertiesDialog for previewing changes.
7590    
7591            * Thuban/UI/renderer.py: Use new Color and Classification methods.
7592    
7593            * Thuban/UI/tree.py: Formatting changes.
7594    
7595            * Doc/thuban.dtd: Add 'label' element
7596    
7597            * Thuban/common.py: New. Contains common routines used throughout
7598            the code.
7599            (Str2Num): Takes a string and converts it to the "best" type of
7600            number.
7601    
7602    2003-02-14  Bernhard Herzog  <[email protected]>
7603    
7604            * Thuban/UI/view.py (MapCanvas.OnLeftUp): Make sure that the
7605            dragging flag is always set to 0 even when the tool implementation
7606            raises an exception
7607    
7608    2003-02-11  Bernhard Herzog  <[email protected]>
7609    
7610            * Thuban/UI/application.py (ThubanApplication.splash_screen): New
7611            method to create a splash screen.
7612            (ThubanApplication.ShowMainWindow): New. Show the main window.
7613            Needed so the splash screen can display the mainwindow
7614            (ThubanApplication.OnInit): Call the
7615            new splash_screen method to determine whether the application
7616            should display a splash screen. If it displays a splash screen do
7617            not immediately show the main window.
7618    
7619    2003-02-11  Jonathan Coles  <[email protected]>
7620    
7621            * Thuban/Model/classification.py: Added import line to fix
7622            feature conflicts between running on python2.2 and python2.1.
7623    
7624            * Thuban/UI/classifier.py (ClassTable): Didn't need to hang
7625            onto the clinfo parameter, so removed the deepcopy().
7626    
7627    2003-02-10  Jonathan Coles  <[email protected]>
7628    
7629            * Thuban/Model/save.py (Saver.open_element, Saver.close_element):
7630            Added element_open variable to track opening and closing of tags
7631            so that tags that don't span more than one line are closed with
7632            /> instead of </tag_name>. Use the GetDefault*() methods of
7633            the Classification class.
7634    
7635            * Thuban/Model/classification.py (Classificaton): Added set and
7636            get methods for the default data. The class also takes a layer
7637            reference so that modification messages can be sent. Fixed the
7638            methods to use the new ClassData class.
7639            (ClassData): New class to encapsulate the classification data
7640    
7641            * Thuban/Model/layer.py (Layer): Remove the
7642            Set[Fill|Stroke|StrokeWidth]() methods. Code should call the
7643            SetDefault*() methods on the layer's classification object.
7644            (Layer.__init__): Use the new SetDefault*() methods in the
7645            Classification class.
7646    
7647            * Thuban/Model/load.py (ProcessSession): Use the new ClassData
7648            object instead of a dictionary.
7649    
7650            * Thuban/UI/classifier.py (ClassRenderer): New class to
7651            draw the classifications in the dialog box's table.
7652            (Classifier): Modified to use the ClassRenderer class.
7653    
7654            * Thuban/UI/mainwindow.py (MainWindow): Use the SetDefault*()
7655            methods of the Classification class.
7656    
7657            * Thuban/UI/renderer.py (MapRenderer): Use the Get*() methods
7658            of the ClassData class.
7659    
7660            * test/test_classification.py, test/test_layer.py,
7661            test/test_map.py, test/test_session.py: Fix the tests to work
7662            with the above code changes.
7663    
7664    2003-02-03  Jonathan Coles  <[email protected]>
7665    
7666            * Thuban/Model/classification.py (Classification): Added getNull()
7667            to return the NullData reference
7668    
7669            * Thuban/Model/layer.py (Layer.SetFill, Layer.SetStroke,
7670            Layer.SetStrokeWidth): Modified these functions to change the
7671            null data in the classification rather than keep these values
7672            directly in the Layer class. Menu options to change these values
7673            work again.
7674    
7675    2003-01-28  Jonathan Coles  <[email protected]>
7676    
7677            * Thuban/UI/classifier.py (Classifier): Resolved merging conflicts.
7678            Fixed crashing problem on some systems. Dialog box shows
7679            classification data.
7680    
7681            * Thuban/UI/tree.py (SessionTreeCtrl.add_items): Handle drawing
7682            Colors in the tree view.
7683    
7684            * Thuban/Model/layer.py (Layer.TreeInfo): Added a call to build
7685            the tree info for classifications. Commented out unnecessary lines.
7686    
7687            * Thuban/Model/classification.py (Classification.TreeInfo): New
7688            function to add information about the classification into the
7689            tree view.
7690    
7691    2003-01-27  Jan-Oliver Wagner <[email protected]>
7692    
7693            * Thuban/__init__.py (_): New.
7694    
7695            * Thuban/Model/classification.py, Thuban/Model/extension.py,
7696            Thuban/Model/layer.py, Thuban/Model/load.py, Thuban/Model/map.py,
7697            Thuban/Model/session.py, Thuban/UI/application.py,
7698            Thuban/UI/classifier.py, Thuban/UI/context.py, Thuban/UI/controls.py,
7699            Thuban/UI/identifyview.py, Thuban/UI/labeldialog.py,
7700            Thuban/UI/mainwindow.py, Thuban/UI/menu.py, Thuban/UI/proj4dialog.py,
7701            Thuban/UI/renderer.py, Thuban/UI/tree.py, Thuban/Lib/connector.py,
7702            Thuban/Lib/fileutil.py: Replace user string by _() for i18n.
7703    
7704    2003-01-27  Jonathan Coles  <[email protected]>
7705    
7706            * Thuban/Model/layer.py: Classification initialization calls.
7707    
7708            * Thuban/Model/classification.py: Created class to encapsulate
7709            a layer classification. Supports specific data points and
7710            ranges.
7711    
7712            * Thuban/Model/load.py: Added support for loading classification
7713            information.
7714    
7715            * Thuban/Model/save.py: Added support for saving classification
7716            information.
7717    
7718            * Thuban/UI/classifier.py: Initial class for a dialog box for
7719            specifying classification information.
7720    
7721            * Thuban/UI/mainwindows.py: Support for opening the classifier
7722            dialog.
7723    
7724            * Thuban/UI/renderer.py: Support for drawing a layer with the
7725            classification information.
7726    
7727            * Data/iceland_sample_class.thuban: iceland_sample with
7728            classification data.
7729    
7730            * test/test_classification: Tests for the Classification class.
7731    
7732    2002-12-09  Bernhard Herzog  <[email protected]>
7733    
7734            * test/test_command.py: New. Tests for the command classes.
7735    
7736            * Thuban/UI/command.py (ToolCommand): New class for tool commands.
7737            (Command.IsTool): New method to distinguish between command
7738            switching tools and other commands.
7739    
7740            * Thuban/UI/view.py (MapCanvas.SelectTool): New method to select
7741            the tool to avoid direct assignments to instance variables
7742            (MapCanvas.ZoomInTool, MapCanvas.ZoomOutTool, MapCanvas.PanTool)
7743            (MapCanvas.IdentifyTool, MapCanvas.LabelTool): Use SelectTool to
7744            change the tool
7745    
7746            * Thuban/UI/mainwindow.py (MainWindow.update_command_ui): If an
7747            active tool's command turns insensitive, disable the tool.
7748            (_tool_command): Use the new ToolCommand class
7749    
7750            * Examples/simple_extensions/simple_tool.py (simple_tool): Use the
7751            SelectTool method to change the tool
7752            (iconfile): Use the ToolCommand class
7753    
7754    2002-12-03  Bernhard Herzog  <[email protected]>
7755    
7756            * Thuban/UI/tree.py (SessionTreeCtrl.normalize_selection): Handle
7757            the case of selected items that are not children of Layers or Maps
7758            properly. Previously this bug would trigger an assertion in
7759            wxWindows.
7760    
7761    2002-11-06  Frank Koormann  <[email protected]>
7762    
7763            * Thuban/UI/mainwindow.py: Altered the order of tools in the
7764            toolbar: First now are all navigation tools (Zoom In/Out, Pan,
7765            Full Extent).
7766    
7767    2002-10-23  Bernhard Herzog  <[email protected]>
7768    
7769            * setup.py (setup call): version now 0.1.3
7770    
7771            * MANIFEST.in: Add the files in test/
7772    
7773            * test/README: Add note about tests requiring the iceland data
7774    
7775            * Thuban/UI/mainwindow.py (MainWindow.About): Add 2002 to
7776            copyright notice.
7777    
7778    2002-10-18  Bernhard Herzog  <[email protected]>
7779    
7780            * test/test_map.py
7781            (TestMapWithContents.test_projected_bounding_box): Use an explicit
7782            epsilon.
7783    
7784            * test/support.py (FloatComparisonMixin.assertFloatEqual)
7785            (FloatComparisonMixin.assertFloatSeqEqual): give a more useful
7786            message if the assertion fails and don't return the return value
7787            of self.assert_. In assertFloatSeqEqual the return meant that not
7788            all items of the sequence were compared.
7789    
7790    2002-09-20  Bernhard Herzog  <[email protected]>
7791    
7792            * test/test_fileutil.py: New. Test cases for Thuban.Lib.fileutil
7793    
7794            * Thuban/Lib/fileutil.py: Fixup some whitespace and typos
7795    
7796            * test/test_map.py (TestMapWithContents.test_tree_info): Create
7797            the string with the bounding box on the fly because of platform
7798            differences in the way %g is handled.
7799    
7800            * test/test_layer.py (TestLayer.test_empty_layer): Create an empty
7801            DBFfile too because Thuban layers can't yet cope missing DBF
7802            files.
7803    
7804    2002-09-20  Bernhard Herzog  <[email protected]>
7805    
7806            * test/test_menu.py: Use initthuban instead of
7807            add_thuban_dir_to_path to initialize Thuban.
7808    
7809            * test/support.py (FloatComparisonMixin.assertFloatEqual): New.
7810            Mixin class for float comparisons
7811            (SubscriberMixin): New. Mixin class to test messages sent through
7812            the Connector class
7813    
7814            * test/README: Fix a typo and add the -v flag to the command for
7815            individual tests
7816    
7817            * test/test_session.py: New. Test cases for Thuban.Model.session
7818    
7819            * test/test_proj.py: New. Test cases for Thuban.Model.proj
7820    
7821            * test/test_map.py: New. Test cases for Thuban.Model.map
7822    
7823            * test/test_layer.py: New. Test cases for Thuban.Model.layer
7824    
7825            * test/test_label.py: New. Test cases for Thuban.Model.label
7826    
7827            * test/test_connector.py: New. Test cases for Thuban.Lib.connector
7828    
7829            * test/test_color.py: New. Test cases for Thuban.Model.color
7830    
7831            * test/test_base.py: New. Test cases for Thuban.Model.base
7832    
7833    2002-09-13  Bernhard Herzog  <[email protected]>
7834    
7835            * Thuban/Model/session.py (Session.forwarded_channels): Forward
7836            the CHANGED channel too.
7837    
7838            * Thuban/Model/map.py (Map.forwarded_channels): Forward the
7839            CHANGED channel too.
7840            (Map.__init__): Call the Modifiable constructor as well.
7841    
7842            * Thuban/Model/base.py (Modifiable.UnsetModified): Issue a CHANGED
7843            event if the modified flag changes.
7844            (Modifiable.changed): Tweak the doc-string.
7845    
7846            * Thuban/UI/mainwindow.py (MainWindow.view_position_changed)
7847            (MainWindow.set_position_text): Put the code that puts the text
7848            with the mouse position into the status bar into the new method
7849            set_position_text so that it can overwritten in derived classes.
7850    
7851    2002-09-12  Bernhard Herzog  <[email protected]>
7852    
7853            * Thuban/UI/mainwindow.py (MainWindow.RunMessageBox): Center the
7854            message box on the main window.
7855    
7856    2002-09-11  Bernhard Herzog  <[email protected]>
7857    
7858            * Thuban/UI/mainwindow.py: Underline the 'x' in "Exit" instead of
7859            the 'E' because it's less likely to interfere with other menu
7860            entries.
7861            (MainWindow.build_menu): remove an incorrect comment.
7862    
7863    2002-09-10  Bernhard Herzog  <[email protected]>
7864    
7865            * Thuban/UI/mainwindow.py (MainWindow.Map): New.
7866            (_tool_command): Add sensitive parameter
7867            (_has_visible_map): Sensitivity callback to tools and other
7868            commands that require a visible map. Use it in map_zoom_in_tool,
7869            map_zoom_out_tool, map_pan_tool, map_identify_tool, map_label_tool
7870            and map_full_extent
7871    
7872    2002-09-06  Bernhard Herzog  <[email protected]>
7873    
7874            * Thuban/UI/mainwindow.py (MainWindow.OnClose): Unsubscribe
7875            VIEW_POSITION
7876    
7877    2002-09-04  Frank Koormann  <[email protected]>
7878    
7879            * Resources/Bitmaps/fullextent.xpm: Updated Icon (removed "potatoe")
7880    
7881    2002-09-02  Bernhard Herzog  <[email protected]>
7882    
7883            * Thuban/UI/view.py: Get rid of the idle redraw. This is done by
7884            wxWindows already and our implementation doesn't work correctly
7885            with wxGTK 2.3:
7886            (MapCanvas.__init__): Remove the instance variable
7887            (MapCanvas.OnPaint): Always call do_redraw when there's a map to
7888            be drawin
7889            (MapCanvas.OnIdle): Removed.
7890    
7891            * Thuban/UI/view.py (MapCanvas.unprojected_rect_around_point): Add
7892            a parameter to determine the size of the rectangle.
7893            (MapCanvas.find_shape_at): Create the box around the point on a
7894            layer by layer basis and make the size depend on the shape type.
7895            This solves a problem with the selection of point shapes at the
7896            border of the layer's bounding box
7897    
7898    2002-08-30  Bernhard Herzog  <[email protected]>
7899    
7900            * Thuban/UI/mainwindow.py (MainWindow.CanRemoveLayer): New method
7901            for the sensitivity  of remove layer.
7902            (_can_remove_layer): New. Sensitivity callback for remove layer
7903            (Command layer_remove): Use _can_remove_layer
7904    
7905            * Thuban/Model/map.py (Map.CanRemoveLayer): New method to
7906            determine whether a given layer can be deleted.
7907    
7908            * Thuban/UI/view.py (MapCanvas.__init__, MapCanvas.OnPaint)
7909            (MapCanvas.do_redraw): Get rid of the unused update_region
7910            instance variable
7911    
7912            * Thuban/UI/view.py: Add/update some doc-strings.
7913    
7914            * test/: new subdirectory with a bunch of unit tests.
7915    
7916            * test/README, test/test_table.py, test/test_save.py,
7917            test/test_menu.py, test/test_load.py: Initial set of tests and
7918            brief instructions on how to run them
7919    
7920    2002-08-29  Bernhard Herzog  <[email protected]>
7921    
7922            * Thuban/UI/renderer.py (ScreenRenderer.draw_shape_layer): Handle
7923            arcs with multiple parts.
7924    
7925            * Thuban/UI/view.py (ZoomInTool.MouseUp, ZoomOutTool.MouseUp):
7926            Handle degenrate rectangles.
7927    
7928            * Thuban/Model/table.py: Make writing records work correctly:
7929            (Table.__init__): Keep track of whether the DBF is open for
7930            writing
7931            (Table.write_record): Open the DBF file for writing when necessary
7932    
7933    2002-08-27  Bernhard Herzog  <[email protected]>
7934    
7935            * Thuban/Model/table.py (Table.write_record, Table.__init__): Open
7936            dbf files only for reading by default. Use a new writable dbf
7937            object for writing.
7938    
7939    2002-08-26  Bernhard Herzog  <[email protected]>
7940    
7941            * Thuban/UI/mainwindow.py: Refactor the context creation:
7942            (MainWindow.Context): New method to return a context
7943            (MainWindow.invoke_command, MainWindow.update_command_ui): Use the
7944            new method
7945    
7946            * Thuban/UI/tableview.py (TableGrid, LayerTableGrid): Split the
7947            layer table specific code from TableGrid into LayerTableGrid
7948            (TableFrame, LayerTableFrame): Split the layer table specific code
7949            from TableFrame into LayerTableFrame
7950            (LayerTableGrid.select_shape): Remove a debug print
7951    
7952            * Thuban/UI/mainwindow.py (MainWindow.LayerShowTable): Use the
7953            LayerTableFrame
7954    
7955    2002-08-23  Bernhard Herzog  <[email protected]>
7956    
7957            * Thuban/Model/layer.py (Layer.__init__): Make sure we have an
7958            absolute filename.
7959    
7960    2002-08-22  Bernhard Herzog  <[email protected]>
7961    
7962            * Thuban/Model/table.py (Table.write_record): New method to write
7963            records.
7964            (Table.__init__): Open the DBF file for writing too.
7965    
7966            * Thuban/UI/controls.py (RecordTable.SetValue): Write the value
7967            into the underlying table.
7968    
7969            * extensions/shapelib/shapefil.h (DBFCommit),
7970            extensions/shapelib/dbfopen.c (DBFCommit): New API function to
7971            commit any changes made to the DBF file.
7972    
7973            * Thuban/UI/mainwindow.py (make_check_current_tool)
7974            (_tool_command): Put the code that generates the "checked"
7975            callback into a separate function so that we can reuse it
7976            elsewhere
7977    
7978            * Thuban/Model/save.py (Saver): New class to handle serializing a
7979            session into an XML file. The main reason to introduce a class is
7980            that applications built on Thuban can derive from it so that they
7981            can save additional information in a session file.
7982            (save_session): Delegate almost all the work to the Saver class.
7983            Rename the filename argument to file because it may be a file like
7984            object now.
7985    
7986            * Thuban/Model/load.py: Get rid of the Python 1.5.2 compatibility
7987            code. Remove the little test code which would be executed when the
7988            module is run as a script which didn't work anymore since it can't
7989            import the other Thuban modules.
7990            (ProcessSession, load_session): Refactor the ProcessSession to
7991            have one method for each element start and end tag so that derived
7992            classes can easily override the processing of individual tags.
7993            Also, always parse with namespaces enabled because applications
7994            built on top of Thuban will likely use namespaces if they extend
7995            the session file format.
7996    
7997    2002-08-21  Bernhard Herzog  <[email protected]>
7998    
7999            * setup.py (ThubanInstall.run): Don't repr install_lib_orig
8000            because thubaninit_contents will do it for us.
8001    
8002    2002-08-16  Jan-Oliver Wagner <[email protected]>
8003    
8004            * Thuban/UI/mainwindow.py: menu item 'show session tree' now disable if
8005            tree window already open
8006    
8007    2002-08-15  Bernhard Herzog  <[email protected]>
8008    
8009            * Thuban/Model/layer.py (Layer.Destroy): Call the unboundd method
8010            with self.
8011    
8012            * Thuban/UI/view.py (MapCanvas.OnLeftUp): Only release the mouse
8013            when we have actually captured it.
8014    
8015            * Thuban/Model/layer.py (Layer.Destroy): New. Explicitly close the
8016            shapefile and destroy the table.
8017    
8018            * Thuban/Model/table.py (Table.Destroy): New. Close the DBF file.
8019    
8020    2002-08-14  Bernhard Herzog  <[email protected]>
8021    
8022            * Thuban/UI/controls.py (RecordTable.__init__): Remove the unused
8023            instance variable columns
8024            (RecordTable.GetTypeName): row and col may be negative in some
8025            cases.
8026    
8027            * setup.py (InstallLocal.initialize_options)
8028            (InstallLocal.finalize_options, InstallLocal.user_options): New
8029            option create-init-file to build a thubaninit.py when running
8030            install_local
8031            (InstallLocal.run): Create the thubaninit.py module when requested
8032            (thubaninit_contents): Split the template into several parts and
8033            create a new function thubaninit_contents that creates the
8034            contents of a thubaninit module.
8035            (ThubanInstall.run): Use the new function to create the thubaninit
8036            module.
8037    
8038    2002-07-30  Bernhard Herzog  <[email protected]>
8039    
8040            * Thuban/UI/application.py (ThubanApplication.OnExit): Do some
8041            cleanup.
8042            (ThubanApplication.MainLoop): Extend to automatically call OnExit.
8043    
8044            * Thuban/Model/session.py (Session.Destroy): Don't bypass the
8045            direct base class' Destroy method.
8046    
8047            * Thuban/Model/map.py (Map.ClearLayers): New method to delete all
8048            layers.
8049            (Map.Destroy): Destroy the label_layer as well and call the
8050            inherited Desatroymethod first so that no more messages are
8051            issued.
8052            (Map.RaiseLayer, Map.LowerLayer): Only issue LAYERS_CHANGED
8053            message if the stacking order actually has changed. Add
8054            doc-strings.
8055            (Map.BoundingBox): Correct the doc-string.
8056            (Map.AddLayer, Map.RemoveLayer, Map.Layers, Map.HasLayers)
8057            (Map.ProjectedBoundingBox, Map.SetProjection): Add doc-strings.
8058    
8059            * Thuban/Model/label.py (LabelLayer.ClearLabels): New to delete
8060            all labels.
8061    
8062    2002-07-29  Bernhard Herzog  <[email protected]>
8063    
8064            * Thuban/Model/map.py (Map.subscribe_layer_channels)
8065            (Map.unsubscribe_layer_channels): Put the code that (un)subscribes
8066            to a layer's channels into separate methods.
8067            (Map.RemoveLayer, Map.AddLayer): Call the new methods
8068            (Map.Destroy): Unsubscribe from a layer's channels before
8069            destroying it.
8070    
8071            * Thuban/UI/view.py (MapCanvas.find_shape_at): Change the
8072            selected_layer parameter to searched_layer which is the layer to
8073            search in.
8074            (MapCanvas.SelectShapeAt): New parameter layer to restrict the
8075            search to that layer. Return the selected layer and shape.
8076    
8077            * Examples/simple_extensions/simple_tool.py (simple_tool): Fix a
8078            typo
8079    
8080    2002-07-24  Bernhard Herzog  <[email protected]>
8081    
8082            * Thuban/UI/application.py (ThubanApplication.create_session):
8083            Extend the doc string.
8084            (ThubanApplication.subscribe_session)
8085            (ThubanApplication.unsubscribe_session): New methods to
8086            subscribe/unsubscribe to/from session channels.
8087            (ThubanApplication.SetSession): Call the new methods here.
8088            (ThubanApplication.maps_changed, ThubanApplication.set_map):
8089            Renamed set_map to maps_changed. Its now a subscriber for
8090            MAPS_CHANGED.
8091    
8092            * Thuban/UI/view.py (ZoomOutTool.MouseUp): Use the correct
8093            x-coordinate in case of simple clicks
8094    
8095            * Thuban/Model/base.py (Modifiable.changed): Apply the args tuple,
8096            don't pass it as a parameter
8097    
8098            * Thuban/Model/session.py (Session.RemoveMap): New
8099    
8100            * Thuban/UI/mainwindow.py (MainWindow.__init__): Turn the initial
8101            window size into a parameter.
8102    
8103    2002-07-23  Bernhard Herzog  <[email protected]>
8104    
8105            * Thuban/UI/menu.py (Menu.item_index): Also search for menus not
8106            just commands.
8107    
8108            * Thuban/UI/mainwindow.py (MainWindow.__init__): Change the
8109            parameter list a bit to allow setting the window title and the
8110            initial message in the status bar. Update the callers.
8111    
8112            * Thuban/UI/application.py (ThubanApplication.OnInit)
8113            (ThubanApplication.CreateMainWindow): Put the mainwindow
8114            instantiation into a separate method so that it can be overridden
8115            by a subclass.
8116    
8117    2002-07-19  Bernhard Herzog  <[email protected]>
8118    
8119            * Thuban/Model/session.py: Issue a CHANGED message every time
8120            another changed message is issued to make it easier to get
8121            notified of changes.
8122            (Session): Update the doc string
8123            (Session.forward): Issue changed-events as CHANGED as well.
8124            (Session.changed): Overwrite the inherited version to issue
8125            CHANGED events as well.
8126    
8127            * Thuban/UI/tree.py: We can now simply subscribe to the session's
8128            CHANGED channel to be informed of changes.
8129            (SessionTreeCtrl.session_channels): Not needed any longer.
8130            (SessionTreeCtrl.unsubscribe_all, SessionTreeCtrl.session_changed):
8131            Only have to (un)subscribe CHANGED
8132    
8133            * Thuban/Model/map.py (Map.TreeInfo): Deal better with empty maps.
8134    
8135            * Thuban/UI/main.py, Thuban/UI/__init__.py: Move the work-around
8136            for the wxPython locale bug to __init__.py so that it's
8137            automatically executed by anybody using UI code from Thuban.
8138    
8139    2002-07-18  Bernhard Herzog  <[email protected]>
8140    
8141            * Thuban/UI/main.py (main): app no longer needs to be global
8142    
8143            * Thuban/UI/mainwindow.py (MainWindow.__init__): Add application
8144            as parameter and store it in an instance variable
8145            (MainWindow.invoke_command, MainWindow.update_command_ui)
8146            (MainWindow.save_modified_session, MainWindow.NewSession)
8147            (MainWindow.OpenSession, MainWindow.SaveSession)
8148            (MainWindow.SaveSessionAs, MainWindow.ShowSessionTree): Use self's
8149            application object.
8150    
8151            * Thuban/UI/application.py (ThubanApplication.OnInit): Instantiate
8152            the main window with self.
8153    
8154            * Thuban/UI/context.py: New module with the context class
8155    
8156            * Thuban/UI/command.py (Command): Update doc string.
8157    
8158            * Thuban/UI/mainwindow.py (MainWindow.invoke_command,
8159            MainWindow.update_command_ui): Pass an instance of the context
8160            class to the command's methods
8161            (check_current_tool, call_method): Handle the new context
8162            implementation
8163    
8164            * Examples/simple_extensions/simple_tool.py (simple_tool,
8165            check_simple_tool): Handle the new context implementation
8166    
8167            * Examples/simple_extensions/simple_command.py (simple_command):
8168            Handle the new context implementation. Update the comments about
8169            the context.
8170    
8171            * Thuban/UI/application.py (ThubanApplication.SetSession): Add
8172            doc-string
8173            (ThubanApplication.Session): New method to return the session
8174            object
8175    
8176            * Thuban/UI/tree.py (SessionTreeCtrl.update_tree): The
8177            interactor's selected_layer may not be a layer of the current
8178            session when the tree is updated while a new session is being set.
8179    
8180    2002-07-17  Bernhard Herzog  <[email protected]>
8181    
8182            * Thuban/UI/tree.py (color_string): Removed. No longer used.
8183            (SessionTreeCtrl.update_tree, SessionTreeCtrl.add_items): Split
8184            update_tree into update_tree and add_items. The tree now uses a
8185            more generic way to display the contents of the tree.
8186            (SessionTreeCtrl): Add a doc string explaining the TreeInfo method
8187    
8188            * Thuban/Model/layer.py (Layer.TreeInfo),
8189            Thuban/Model/extension.py (Extension.TreeInfo),
8190            Thuban/Model/map.py (Map.TreeInfo),
8191            Thuban/Model/session.py (Session.TreeInfo):
8192            Add TreeInfo methods to implement the new tree view update scheme
8193    
8194    2002-07-16  Bernhard Herzog  <[email protected]>
8195    
8196            * Thuban/UI/application.py: Don't use "import from" for the
8197            MainWindow. It can't always be resolved.
8198            (ThubanApplication.OnInit): change reference to MainWindow
8199            accordingly.
8200    
8201            * Thuban/UI/menu.py (Menu.SetItems): New method to replace a menu
8202            completely
8203    
8204    2002-07-10  Bernhard Herzog  <[email protected]>
8205    
8206            * setup.py (create_init_module): New configurable variable whose
8207            default depends on the platform we're running on.
8208            (ThubanInstall.initialize_options): Initialize
8209            self.create_init_module from the global create_init_module
8210            (ThubanInstall.user_options): indictate that the options
8211            create-init-module and init-module-dir have arguments.
8212    
8213            * setup.py: In the setup call change the version number to include
8214            cvs.
8215    
8216            * MANIFEST.in: Add the files in Examples
8217    
8218    2002-07-09  Bernhard Herzog  <[email protected]>
8219    
8220            * setup.py: In the setup call, use the thuban homepage as the
8221            value of the url parameter.
8222    
8223            * Examples: New subdirectory for examples.
8224    
8225            * Examples/simple_extensions/simple_tool.xpm,
8226            Examples/simple_extensions/simple_tool.py,
8227            Examples/simple_extensions/simple_command.py,
8228            Examples/simple_extensions/README: Simple examples showing how to
8229            add new commands and tools.
8230    
8231            * setup.cfg (bdist_rpm): Add the default value for prefix and tell
8232            bdist_rpm that we also have an install script.
8233            (bdist_inno): Add 2002 to the copyright notice.
8234    
8235            * setup.py: Create a file in python's site-packages directory to
8236            make installation of Thuban as a library easier.
8237            (ThubanInstall.user_options): Add two new options,
8238            create-init-module and init-module-dir
8239            (ThubanInstall.expand_with_pure_python_dirs): New method to expand
8240            filenames for installation in the default directories.
8241            (ThubanInstall.select_scheme, ThubanInstall.convert_paths): Extend
8242            the inherited methods to capture some filenames before they're
8243            transformed too much by distutils.
8244            (ThubanInstall.run): Create the init module if requested.
8245            (ThubanInstall.thuban_init_filename): New method to return the
8246            full name of the init module.
8247            (ThubanInstall.get_outputs): Append the filename of the init
8248            module.
8249    
8250    2002-07-08  Bernhard Herzog  <[email protected]>
8251    
8252            * setup.py (thuban_bdist_rpm): Extend this version of bdist_rpm to
8253            handle the prefix properly which means that the default for the
8254            installation prefix should be /usr for RPMs and /usr/local when
8255            doing a normal source install.
8256            (bdist_rpm_install_script): Script to override the default install
8257            commands in the specfile generated by the bdist_rpm command.
8258            (thuban_bdist_rpm.user_options): Add a prefix option
8259            (thuban_bdist_rpm.initialize_options): Init the prefix option.
8260            Create the script files for the spec files as empty files here
8261            (thuban_bdist_rpm._make_spec_file): Override the inherited method
8262            to fill the script files with content.
8263    
8264            * Thuban/Model/save.py (relative_filename): Wrapper around
8265            Thuban.Lib.fileutil.relative_filename that accepts an empty dir
8266            argument. save_session now automatically uses this version,
8267            solving a problem when saving to a relative filename.
8268    
8269            * setup.py: In the setup call, make sure that the library
8270            directories are under $prefix/lib not directly under $prefix.
8271    
8272    2002-06-20  Jan-Oliver Wagner <[email protected]>
8273    
8274            * Thuban/Model/extension.py: new module to handle extension objects.
8275            * Thuban/Model/messages.py: new messages for extensions.
8276            * Thuban/Model/session.py (Session.Extensions, Session.HasExtensions,
8277            Session.AddExtension): new for handling extensions.
8278            Also some other minor changes to round up extension handling.
8279            * Thuban/UI/tree.py (SessionTreeCrtl:update_tree): Added visualization
8280            of Extension titles and title and names of its objects.
8281    
8282    2002-05-29  Bernhard Herzog  <[email protected]>
8283    
8284            * Thuban/UI/mainwindow.py (MainWindow.bind_command_events): Bind
8285            the events for a command.
8286            (MainWindow.add_toolbar_command, MainWindow.add_menu_command):
8287            Call bind_command_events to bind the events. add_toolbar_command
8288            can now bind events too so that it's possible to have commands
8289            that are only available through the toolbar.
8290            (MainWindow.init_ids): New instance variable events_bound to keep
8291            track of for which commands events have been bound.
8292    
8293    2002-05-28  Bernhard Herzog  <[email protected]>
8294    
8295            * Thuban/UI/menu.py: New module to build and manage menus.
8296    
8297            * Thuban/UI/mainwindow.py: Remove some unused imports.
8298            (MainWindow.__init__, main_menu): move the definition of the main
8299            menu from __init__ to the Menu instance main_menu.
8300            (MainWindow.build_menu_bar, MainWindow.build_menu): New methods to
8301            build the menu bar and sub-menus from a menu description.
8302    
8303            * Thuban/UI/application.py (ThubanApplication.OnInit): Read the
8304            startup file
8305            (ThubanApplication.read_startup_files): New method to run
8306            ~/.thuban/thubanstart.py
8307    
8308            * Thuban/UI/mainwindow.py (MainWindow.__init__, main_toolbar):
8309            Move the toolbar definition to the Menu instance main_toolbar.
8310            (MainWindow.build_toolbar): New method to build the toolbar
8311            similar to the build_menu methods
8312    
8313    2002-05-23  Bernhard Herzog  <[email protected]>
8314    
8315            * Thuban/UI/mainwindow.py (MainWindow.__init__): Fix spelling of
8316            layer_outline_color. Fix it in the definition of the command too.
8317    
8318            * Thuban/UI/command.py (Command): Fix typo in doc string
8319    
8320    2002-05-22  Bernhard Herzog  <[email protected]>
8321    
8322            * Thuban/UI/mainwindow.py (MainWindow.RunMessageBox): Fix a typo
8323            in the docstring
8324    
8325    2002-05-15  Bernhard Herzog  <[email protected]>
8326    
8327            * Thuban/Model/layer.py (Layer.open_shapefile): Set bbox to None
8328            when the shapefile is empty.
8329            (Layer.BoundingBox, Layer.LatLongBoundingBox): Both methods may
8330            now return None for empty shapefiles. Update doc-strings.
8331    
8332            * Thuban/Model/map.py (Map.BoundingBox): Add doc-string. Deal with
8333            the layer's bbox being None.
8334    
8335            * Thuban/UI/tree.py (SessionTreeCtrl.update_tree): Deal with the
8336            layer's bbox being None.
8337    
8338            * Thuban/UI/view.py (MapCanvas.shape_selected): Only redraw when
8339            necessary.
8340            (MapCanvas.__init__): New instance variables, last_selected_layer
8341            and last_selected_shape to determine how the selection has
8342            changed.
8343    
8344            * Thuban/UI/tableview.py (TableGrid.__init__): Do not call
8345            AutoSizeColumns because it will cause a traversal of the entire
8346            table which for large .dbf files will take a very long time.
8347    
8348    2002-05-14  Bernhard Herzog  <[email protected]>
8349    
8350            * Thuban/Model/layer.py (Layer.open_shapefile): Choose a better
8351            maximum depth for the tree than shapelib does by default.
8352    
8353    2002-05-10  Bernhard Herzog  <[email protected]>
8354    
8355            * setup.py (py_modules): The shptree modules doesn't have a
8356            wrapper, so don't include it in the py_modules
8357    
8358    2002-05-08  Bernhard Herzog  <[email protected]>
8359    
8360            * extensions/shapelib/shptree.c (compare_ints): Make arguments
8361            const void * as in the qsort prototype
8362            (SHPTreeFindLikelyShapes): Remove some unused variables.
8363    
8364            * Thuban/UI/view.py (PanTool.MouseMove): Use the bitmap the view
8365            maintains to redraw the window during a drag.
8366            (MapCanvas.unprojected_rect_around_point): New method to determine
8367            a small region around a point for hit-testing.
8368            (MapCanvas.find_shape_at): Only test the shapes in a small region
8369            around the point.
8370    
8371            * setup.py: Increment the version to 0.1.2
8372    
8373            * Thuban/UI/tree.py (SessionTreeCtrl.unsubscribe_all): Remove a
8374            debug print and set session to None after unsubscribing
8375    
8376    2002-05-07  Bernhard Herzog  <[email protected]>
8377    
8378            * Data/iceland_sample.session, Data/iceland_sample.thuban: Rename
8379            the file to have a .thuban extension.
8380    
8381            * Thuban/UI/tree.py (session_channels): New class constant with
8382            all the session channels to subscribe to to update the tree
8383            (SessionTreeCtrl.session_changed): Remember the session so that we
8384            can unsubscribe properly. Use the new class constant to
8385            unsubscribe from the old session and subscribe to the new one.
8386            (SessionTreeCtrl.unsubscribe_all): New method to unsubscribe all
8387            subscriptions of the SessionTreeCtrl.
8388            (SessionTreeView.OnClose): Call the tree's unsubscribe_all method.
8389    
8390            * Thuban/UI/mainwindow.py (MainWindow.__init__): Add the "Show
8391            Session Tree" command to the file menu.
8392    
8393            * Thuban/UI/view.py (MapCanvas.do_redraw): Pass the entire bitmap
8394            as update_region to the renderer.
8395    
8396            * Thuban/UI/renderer.py
8397            (ScreenRenderer.layer_ids, ScreenRenderer.draw_shape_layer): The
8398            update box is now directly a tuple, not a wxRect anymore.
8399    
8400            * Thuban/Model/layer.py (Layer.ShapesInRegion): Remove some debug
8401            prints.
8402    
8403    2002-05-07  Bernhard Herzog  <[email protected]>
8404    
8405            * setup.py: Add the shptree extension module. See
8406            extensions/pyshapelib/ChangeLog for more details.
8407    
8408            * extensions/shapelib/shpopen.c, extensions/shapelib/shapefil.h,
8409            extensions/shapelib/dbfopen.c: Really update to the versions of
8410            shapelib 1.2.9. For some reason it wasn't really done on
8411            2002-04-11.
8412    
8413            * extensions/shapelib/shptree.c: Modified version of shptree.c of
8414            shapelib 1.2.9. The only real difference is the use of qsort
8415            instead of a bubble sort implementation
8416    
8417            * Thuban/Model/layer.py (Layer.__init__): New instance variable
8418            shapetree to hold the shapelib quadtree for the shapefile
8419            (Layer.open_shapefile): Create the quad tree.
8420            (Layer.ShapesInRegion): New method to return the ids of shapes in
8421            a given region using the quad tree.
8422    
8423            * extensions/thuban/wxproj.cpp (project_points): Fix some typos in
8424            comment
8425            (draw_polygon_shape): Accept both arcs and polygons.
8426            (initwxproj): Use the new PYSHAPELIB_IMPORT_API macro to import
8427            the api.
8428    
8429            * Thuban/UI/renderer.py (MapRenderer.layer_ids): New method to
8430            return the shape ids to be rendered in a given layer.
8431            (MapRenderer.draw_shape_layer): Call layer_ids to get the list of
8432            ids. Use draw_polygon_shape to draw arc shapes as well.
8433            (ScreenRenderer.RenderMap): New parameter for the rectangle that
8434            has to be updated
8435            (ScreenRenderer.layer_ids): Make use of the layer's quadtree by
8436            calling it's ShapesInRegion method.
8437    
8438            * Thuban/UI/view.py (MapCanvas.__init__): New instance variable
8439            update_region for the update region.
8440            (MapCanvas.OnPaint): Maintain the update region
8441            (MapCanvas.do_redraw): Pass the bounding box of the update_region
8442            to the renderer when drawing the bitmap. Reset the update_region.
8443    
8444    2002-05-03  Bernhard Herzog  <[email protected]>
8445    
8446            * Thuban/UI/mainwindow.py (MainWindow.SaveSessionAs,
8447            MainWindow.OpenSession): Change the file extension of the session
8448            files to .thuban
8449    
8450            * Thuban/Model/session.py (Session.AddMap, forwarded_channels):
8451            Move the map channels to be forwarded by the session into the
8452            class constant with forwarded_channels. Also add
8453            LAYER_PROJECTION_CHANGED and LAYER_VISIBILITY_CHANGED to
8454            forwarded_channels
8455    
8456            * Thuban/Model/base.py (Modifiable.changed): Fix doc-string (a
8457            typo and some rewording).
8458    
8459    2002-05-02  Bernhard Herzog  <[email protected]>
8460    
8461            * Thuban/UI/view.py: Keep the temporary bitmap used during drawing
8462            around to speed up most redraws:
8463            (MapCanvas.__init__): New instance variable bitmap which holds the
8464            bitmap
8465            (MapCanvas.do_redraw): Redraw self.bitmap if necessary. Use
8466            self.bitmap to draw.
8467            (MapCanvas.full_redraw): New method to force a full redraw
8468            including the bitmap
8469            (MapCanvas.SetMap): Subscribe full_redraw instead of redraw to
8470            make sure the bitmap is redrawn.
8471            (MapCanvas.projection_changed, MapCanvas.set_view_transform,
8472            MapCanvas.shape_selected): Call full_redraw instead of readraw to
8473            make sure the bitmap is redrawn.
8474            (MapCanvas.OnSize): New method to handle size events so that the
8475            bitmap can be redrawn.
8476    
8477    2002-04-29  Bernhard Herzog  <[email protected]>
8478    
8479            * Thuban/UI/mainwindow.py (MainWindow.__init__): Subscribe to the
8480            canvas' VIEW_POSITION event
8481            (MainWindow.view_position_changed): Handler for VIEW_POSITION.
8482            Update the text in the status-bar accordingly.
8483    
8484            * Thuban/UI/view.py (MapCanvas): Derive from Publisher as well
8485            (MapCanvas.__del__): Implement because Publisher.__del__ has to be
8486            called.
8487            (MapCanvas.__init__): Bind EVT_LEAVE_WINDOW too. Initialize
8488            current_position
8489            (MapCanvas.set_current_position): New method to set
8490            current_position. Issue a VIEW_POSITION event
8491            (MapCanvas.CurrentPosition): New public method to return the value
8492            of current_position. Should be called when the VIEW_POSITION event
8493            is processed.
8494            (MapCanvas.OnLeftDown, MapCanvas.OnLeftUp, MapCanvas.OnMotion):
8495            Update the position.
8496            (MapCanvas.OnLeaveWindow): Set the position to None.
8497    
8498            * Thuban/UI/messages.py (VIEW_POSITION): New message for the
8499            position in the statusbar
8500    
8501    2002-04-26  Frank Koormann <[email protected]>
8502    
8503            * Thuban/UI/mainwindow.py: AddLayer, Dialog title s/session/data
8504    
8505    2002-04-24  Frank Koormann <[email protected]>
8506    
8507            * Resources/Bitmaps/identify.xpm: shadow added
8508    
8509            * Resources/Bitmaps/fullextent.xpm: new
8510    
8511    2002-04-22  Jan-Oliver Wagner <[email protected]>
8512    
8513            * Thuban/UI/tree.py (update_tree): added test for None on map bounding
8514            box
8515    
8516    2002-04-21  Jan-Oliver Wagner <[email protected]>
8517    
8518            * Thuban/UI/proj4dialog.py (UTMProposeZoneDialog): new
8519    
8520            * Thuban/UI/tree.py (update_tree): added added map extent
8521    
8522            * Thuban/UI/mainwindow.py (_method_command): extended by parameter
8523            icon; added map_full_extend as tool
8524    
8525    2002-04-19  Jan-Oliver Wagner <[email protected]>
8526    
8527            * Thuban/UI/mainwindow.py (SaveSession): launch save as dialog for
8528            saving _new_ sessions
8529    
8530            * Thuban/Model/session.py (create_empty_session): new session
8531            don't have a filename (set to None)
8532    
8533            * Thuban/UI/tree.py (update_tree): added filename and modified flag
8534    
8535            * Thuban/Model/load.py (ProcessSession): convert projection
8536            parameters from unicode to regular string
8537    
8538            * Data/iceland_sample.session: Added UTM Zone 26 projection.
8539    
8540    2002-04-11  Bernhard Herzog  <[email protected]>
8541    
8542            * extensions/shapelib/shapefil.h, extensions/shapelib/shpopen.c,
8543            extensions/shapelib/dbfopen.c: Update to the versions of shapelib
8544            1.2.9
8545    
8546            * setup.py (Lib.wxproj extension): Don't link shpopen.c and put
8547            the pyshapelib directoy into the list of include dirs, so that
8548            pyshapelib_api.h can be found.
8549    
8550            * extensions/thuban/wxproj.cpp (pyshapelib_api): New variable that
8551            holds the pyshapelib C-API
8552            (draw_polygon_shape, point_in_polygon_shape, shape_centroid): Use
8553            pyshapelib_api to access the shapelib functions.
8554            (initwxproj): Import the c_api from the shapelib module and
8555            initialize pyshapelib_api.
8556    
8557    2002-04-04  Bernhard Herzog  <[email protected]>
8558    
8559            * setup.py (thuban_bdist_rpm.initialize_options): Use
8560            initialize_options to create the scripts for the rpm.
8561    
8562            * extensions/pyprojection/setup.py (PROJ4_PREFIX): Just use /
8563    
8564    2002-04-03  Bernhard Herzog  <[email protected]>
8565    
8566            * setup.py: Increment version to 0.1.1
8567    
8568            * Thuban/UI/mainwindow.py (MainWindow.__init__): Move the "Add
8569            Layer" and "Remove Layer" commands from the layer menu to the map
8570            menu
8571    
8572    2002-02-15  Bernhard Herzog  <[email protected]>
8573    
8574            * Thuban/Model/layer.py (Layer.Shape): list append only takes one
8575            argument (python <= 1.5.2 erroneously accepted multiuple
8576            arguments)
8577    
8578    2002-02-04  Bernhard Herzog  <[email protected]>
8579    
8580            * Thuban/UI/identifyview.py (IdentifyGridCtrl): New class to use a
8581            RecordGrid in the identifyview.
8582            (IdentifyView.__init__): Use IdentifyGridCtrl instead of
8583            IdentifyListCtrl. The grid allows editing of the values.
8584    
8585            * Thuban/UI/controls.py (RecordTable, RecordGridCtrl): New classes
8586            implementing a grid for a single row of a thuban table.
8587    
8588            * Thuban/UI/view.py (MapCanvas.SelectShapeAt): Search through all
8589            layers by default. Easier to use than the previous default of only
8590            searching through the select layer which meant that if no layer
8591            was selected, you couldn't select a shape.
8592    
8593            * Thuban/UI/tableview.py (TableGrid.__init__): Fix typo
8594    
8595            * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Honour the
8596            stroke_width attribute
8597    
8598            * Thuban/Model/save.py (save_session): Write the new stroke_width
8599            attribute
8600    
8601            * Thuban/Model/load.py (ProcessSession.startElement): Read the
8602            stroke_width attribute
8603    
8604            * Thuban/Model/layer.py (Layer.__init__): New parameter and
8605            instance variable stroke_width
8606            (Layer.SetStrokeWidth): Set the stroke_width.
8607    
8608    2002-02-01  Bernhard Herzog  <[email protected]>
8609    
8610            * extensions/thuban/wxproj.cpp (project_points): Fix two
8611            off-by-one errors in the last loop that joins the various parts
8612            together.
8613    
8614    2002-01-14  Bernhard Herzog  <[email protected]>
8615    
8616            * setup.py (data_dist.make_distribution): Fix some typos
8617    
8618    2001-09-18  Bernhard Herzog  <[email protected]>
8619    
8620            * README: Slight tweaking in preparation for the 0.1 release
8621    
8622            * setup.cfg: Add section for sdist to create both tgz and zip
8623            archives
8624    
8625            * setup.py: increase version number to 0.1
8626            (data_dist): New command class for data distribution
8627    
8628    2001-09-14  Bernhard Herzog  <[email protected]>
8629    
8630            * Thuban/UI/identifyview.py (IdentifyListCtrl.selected_shape):
8631            Handle the case of no layer (i.e. layer is None) properly.
8632    
8633            * Thuban/UI/proj4dialog.py (UTMDialog.__init__, Proj4Dialog.__init__):
8634            Set the initial selection of the combo boxes to reflect the
8635            projection we're starting with in a way that works on windows,
8636            too.
8637    
8638            * Thuban/Lib/connector.py (Connector.print_connections): Print the
8639            puiblisher's ids in hex to make it easier to compare them to the
8640            standard repr of python methods
8641    
8642            * Thuban/Model/map.py (Map.Destroy): Unsubscribe the label_layer
8643            messages
8644    
8645    2001-09-13  Bernhard Herzog  <[email protected]>
8646    
8647            * Thuban/UI/tree.py (SessionTreeCtrl.OnSelChanged): Make sure to
8648            deselect the layer if no layer is selected
8649    
8650            * Thuban/UI/view.py (MapCanvas.OnPaint): Only delay drawing to
8651            idle time when there actually is something to draw. If there's
8652            nothing to draw simply clear the window
8653            (MapCanvas.do_redraw): Call dc.EndDrawing and add some comments.
8654            (MapCanvas.SetMap): force a redraw in all cases because
8655            FitMapToWindow doesn't always do it.
8656            (MapCanvas.ZoomFactor): Add an optional parameter, center, to
8657            specify the point to move into the center of the window
8658            (ZoomOutTool.MouseUp, ZoomInTool.MouseUp): If the mouse wasn't
8659            dragged, zoon in/out by a factor of 2
8660            (MapCanvas.find_shape_at): Iterate backwards (i.e. with decreasing
8661            index, i.e. reversed drawing order) so that objects appearing to
8662            be in from of others are selected first. This is probably mostly
8663            relevant for point shapes where the symbols used may overlap
8664    
8665            * Thuban/Model/session.py (create_empty_session): Unset the
8666            modified bit before returning it
8667    
8668            * Thuban/UI/mainwindow.py (MainWindow.NewSession): Use
8669            create_empty_session session to create the new, empty session.
8670    
8671            * Thuban/UI/mainwindow.py (MainWindow.__init__): Set the size of
8672            the tool bitmaps.
8673            (MainWindow.OnClose, MainWindow.save_modified_session): Separate
8674            the code that asks whether the session should be saved into the
8675            new method save_modified_session.
8676            (MainWindow.OpenSession, MainWindow.NewSession): Use the new
8677            method to save modified session here too.
8678    
8679  2001-09-11  Bernhard Herzog  <[email protected]>  2001-09-11  Bernhard Herzog  <[email protected]>
8680    
8681          * setup.py (InnoIconItem): fix typo          * setup.py (InnoIconItem): fix typo
# Line 62  Line 8740 
8740          (MainWindow.identify_view_on_demand): Store the interactor in an          (MainWindow.identify_view_on_demand): Store the interactor in an
8741          instvar and use that reference instead of going through main.app          instvar and use that reference instead of going through main.app
8742    
8743          * Thuban/UI/mainwindow.py (MainWindow.ShowSessionTree):          * Thuban/UI/mainwindow.py (MainWindow.ShowSessionTree):
8744          * Thuban/UI/application.py (ThubanApplication.OnInit):          * Thuban/UI/application.py (ThubanApplication.OnInit):
8745          * Thuban/UI/main.py (main): Create the session tree view in main          * Thuban/UI/main.py (main): Create the session tree view in main
8746          with the new mainwindow method ShowSessionTree and not directly          with the new mainwindow method ShowSessionTree and not directly
8747          the application's OnInit method          the application's OnInit method
# Line 79  Line 8757 
8757          layer to the tableview dialog.          layer to the tableview dialog.
8758    
8759          * Thuban/UI/tableview.py: Add some doc-strings          * Thuban/UI/tableview.py: Add some doc-strings
8760          (TableGrid):          (TableGrid):
8761          (TableGrid.OnRangeSelect):          (TableGrid.OnRangeSelect):
8762          (TableGrid.OnSelectCell):          (TableGrid.OnSelectCell):
8763          (TableFrame.__init__):          (TableFrame.__init__):
# Line 146  Line 8824 
8824  2001-09-05  Bernhard Herzog  <[email protected]>  2001-09-05  Bernhard Herzog  <[email protected]>
8825    
8826          * Thuban/UI/view.py (MapCanvas.__init__): New argument, interactor.          * Thuban/UI/view.py (MapCanvas.__init__): New argument, interactor.
8827            
8828          * Thuban/UI/mainwindow.py (MainWindow.__init__): New argument          * Thuban/UI/mainwindow.py (MainWindow.__init__): New argument
8829          interactor to pass through to the MapCanvas          interactor to pass through to the MapCanvas
8830            
8831          * Thuban/UI/application.py (ThubanApplication.OnInit): Use the new          * Thuban/UI/application.py (ThubanApplication.OnInit): Use the new
8832          argument to the MainWindow constructor to get rid of the ugly hack          argument to the MainWindow constructor to get rid of the ugly hack
8833          that made main.app available early just so that the mapcanvas          that made main.app available early just so that the mapcanvas
# Line 196  Line 8874 
8874          (ThubanInstall.run): Remove the leading install root from the          (ThubanInstall.run): Remove the leading install root from the
8875          script filename if an install root was specified and use the new          script filename if an install root was specified and use the new
8876          link_file method          link_file method
8877            
8878          * Thuban/UI/mainwindow.py (MainWindow.AddLayer): Fit the map to          * Thuban/UI/mainwindow.py (MainWindow.AddLayer): Fit the map to
8879          the window when the first layer is added to the map.          the window when the first layer is added to the map.
8880    
# Line 233  Line 8911 
8911          (InnoIconItem): Helper class for bdist_inno          (InnoIconItem): Helper class for bdist_inno
8912          (thuban_bdist_inno): Thuban specific version of bdist_inno. Added          (thuban_bdist_inno): Thuban specific version of bdist_inno. Added
8913          this together with the appropriate parameters, to the setup call.          this together with the appropriate parameters, to the setup call.
8914            
8915          * setup.cfg (bdist_inno): added new section for the inno setup          * setup.cfg (bdist_inno): added new section for the inno setup
8916          installer          installer
8917    

Legend:
Removed from v.55  
changed lines
  Added in v.2045

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26