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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 2087 - (hide annotations)
Fri Feb 20 20:09:40 2004 UTC (21 years ago) by bh
Original Path: trunk/thuban/ChangeLog
File size: 351337 byte(s)
update ChangeLog

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

Properties

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

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26