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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 2045 - (hide annotations)
Tue Dec 23 13:57:21 2003 UTC (21 years, 2 months ago) by bh
Original Path: trunk/thuban/ChangeLog
File size: 343369 byte(s)
update ChangeLog

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

Properties

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

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26