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

Legend:
Removed from v.186  
changed lines
  Added in v.2031

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26