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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 2026 - (hide annotations)
Tue Dec 9 16:17:01 2003 UTC (21 years, 3 months ago) by frank
Original Path: trunk/thuban/ChangeLog
File size: 340300 byte(s)
* Resources/Projections/defaults.proj:
	French projection sample with correct accents (UNICODE).

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

Properties

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

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26