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

Legend:
Removed from v.59  
changed lines
  Added in v.2029

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26