/[thuban]/branches/WIP-pyshapelib-bramz/ChangeLog
ViewVC logotype

Annotation of /branches/WIP-pyshapelib-bramz/ChangeLog

Parent Directory Parent Directory | Revision Log Revision Log


Revision 2029 - (hide annotations)
Tue Dec 16 11:05:00 2003 UTC (21 years, 2 months ago) by silke
Original Path: trunk/thuban/ChangeLog
File size: 340767 byte(s)
Some changes to ensure compliance of debian package with FHS when build
from tarball

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

Properties

Name Value
svn:eol-style native
svn:keywords Author Date Id Revision

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26