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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 2042 - (hide annotations)
Tue Dec 23 11:59:18 2003 UTC (21 years, 2 months ago) by bh
Original Path: trunk/thuban/ChangeLog
File size: 343239 byte(s)
update ChangeLog

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

Properties

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

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26