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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 2073 - (hide annotations)
Tue Feb 17 13:15:22 2004 UTC (21 years ago) by bh
Original Path: trunk/thuban/ChangeLog
File size: 349617 byte(s)
update ChangeLog

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

Properties

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

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26