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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 2542 - (hide annotations)
Fri Jan 21 14:25:25 2005 UTC (20 years, 1 month ago) by jan
Original Path: trunk/thuban/ChangeLog
File size: 432235 byte(s)
Various formatting issues resolved,
e.g. superflous spaces,
but also added class names to method names
since some methods have the same name in
different classes.

1 jonathan 2537 2005-01-21 Jonathan Coles <[email protected]>
2 jan 2542
3     * Thuban/UI/baserenderer.py (proj_params_to_str): New. Takes
4     a projection and returns a formatted string representing the
5     parameters to feed to gdalwarp. This function eliminates
6     redundancy in draw_raster_layer().
7     (BaseRenderer.render_map_incrementally): Removed the optimization which
8     drew the top most raster layer first and then only those vector-
9     based layers that are above it. With the support for transparency
10     this optimization breaks correct behaviour.
11     (BaseRenderer.draw_raster_layer): Reorganize code to support possible
12     future enhancements to raster layer bounding box. The old behaviour has
13     not changed. Also, change calling parameters to draw_raster_data()
14     to specify new RAW data format and mask.
15     (BaseRenderer.draw_raster_data): Change signature to include an optional
16     parameter for mask information. Change documentation to mention
17     support for new parameter and added option for RAW data format.
18     The data argument is now a list of [width, height, data].
19    
20     * Thuban/UI/renderer.py (MapRenderer.draw_raster_data): Add new optional
21     mask parameter. Add new condition for RAW format, which
22     significantly reduces rendering time. Add condition for
23     mask parameter.
24    
25     * libraries/thuban/gdalwarp.cpp (GetImageData): New. Creates a
26 jonathan 2537 data array of RGB values from the projected image returned from
27     the gdal warping functions. In the case of palette based images, it
28 jan 2542 converts the NO_DATA index to the mask color.
29     (ProjectRasterFile): Removed all custom memory driver references
30     and replaced it with the standard in-memory dataset provided
31     by gdal. The return data is no longer a BMP file, but an array
32     of RGB values, one set triple per pixel.
33 jonathan 2537
34     * libraries/thuban/bmpdataset.cpp: Removed. Unnecessary.
35     * libraries/thuban/cpl_mfile.h: Removed. Unnecessary.
36     * libraries/thuban/cpl_mfile.cpp: Removed. Unnecessary.
37    
38 jan 2542 * setup.py (thuban_build_ext.finalize_options): Removed mention
39     of cpl_mfile.cpp and bmpdataset.cpp files in the list of source
40     files. These are obsolete with the new version of gdalwarp.cpp
41    
42     * test/test_baserenderer.py (SimpleRenderer.draw_raster_data):
43     Updated signature.
44     (TestBaseRenderer.test_raster_no_projection): Changed the test
45     data to be data in the uncompressed RAW format returned from
46     ProjectRasterFile.
47    
48 jan 2535 2005-01-21 Jan-Oliver Wagner <[email protected]>
49    
50 jan 2542 * Thuban/UI/mainwindow.py (MainWindow.view_position_changed): Made
51     string available for i18n.
52 jan 2535
53 russell 2532 2005-01-20 Russell Nelson <[email protected]>
54    
55     * Resources/Projections/defaults.proj: Ruin the speling of the
56 russell 2533 Lambert-93 projection so it doesn't run into the wx UTF-8 bug.
57     It's the wrong thing to do in the long run, but it's necessary for
58     those users until that bug is fixed. Otherwise the projection
59     dialog segfaults. Better to annoy some Lambert-93 users with a
60     spelling mistake than every Fedora Core 3 user of Thuban-CVS.
61 russell 2532
62 bernhard 2531 2005-01-20 Bernhard Reiter <[email protected]>
63    
64 jan 2542 * Thuban/UI/mainwindow.py (MainWindow.view_position_changed): Added
65     docstring and comment that the warning code here is a hack.
66 bernhard 2531
67 russell 2529 2005-01-20 Russell Nelson <[email protected]>
68    
69 jan 2542 * Thuban/UI/mainwindow.py (MainWindow.view_position_changed): Warn
70     user about misprojected layers when their lat/lon bounding
71 russell 2529 box exceeds rational lat/lon values.
72    
73 bernhard 2525 2005-01-20 Bernhard Reiter <[email protected]>
74    
75 jan 2542 * Thuban/UI/about.py (unicodeToLocale): Improved:
76 bernhard 2528 Use 'ascii' and then 'replace' for other characters
77     when getdefaultlocale returns None. Thanks to Bernhard H. .
78 jan 2542
79 bernhard 2528 2005-01-20 Bernhard Reiter <[email protected]>
80    
81 jan 2542 * Thuban/UI/classgen.py (GenQuantilesPanel.OnRetrieve): Added a comment
82 bernhard 2527 that OnRangeText might be called twice and using None as argument.
83 jan 2542
84 bernhard 2527 2005-01-20 Bernhard Reiter <[email protected]>
85    
86 jan 2542 * Thuban/UI/classgen.py (GenQuantilesPanel.OnRetrieve): Add a
87     OnRangeText(0) to work around a different in wx Behaviour noticed
88     on MacOSX, thanks to Lorenzo Moretti and Daniel Calvelo for the fix.
89    
90 bernhard 2526 2005-01-20 Bernhard Reiter <[email protected]>
91    
92     * Thuban/UI/about.py: take iso-8859-15 when getdefaultlocale returns
93 bernhard 2525 None. (Fixes rt#2910.)
94    
95 frank 2524 2005-01-18 Frank Koormann <[email protected]>
96    
97     New Extension: mouseposition
98     Tool to collect mouse click positions (map coordinates) in a dialog.
99    
100     * Extensions/mouseposition/__init__.py: New, extension registration
101    
102     * Extensions/mouseposition/mouseposition.py: New, implements the
103     dialog and adds a tool to Thuban mainwindow.
104    
105     * Extensions/mouseposition/position.xpm: New, icon for tool.
106    
107 jan 2522 2005-01-14 Jan-Oliver Wagner <[email protected]>
108    
109     * Doc/manual/thuban-manual-de.xml: More translations.
110    
111 frank 2520 2005-01-11 Frank Koormann <[email protected]>
112    
113     * Thuban/UI/mainwindow.py (MainWindow.DuplicateLayer):
114     Fix indention bug.
115    
116 frank 2517 2005-01-09 Frank Koormann <[email protected]>
117    
118     * Thuban/UI/mainwindow.py (MainWindow.DuplicateLayer):
119 frank 2520 BugFix 2901: Explicitly copy layers ClassificationColumn since it
120 frank 2517 is not part of the layers Classification.
121    
122 frank 2515 2005-01-03 Frank Koormann <[email protected]>
123    
124 frank 2517 * Thuban/UI/renderer.py (ScreenRendererdraw_selection_incrementally):
125     BugFix 2883: Former implementation only worked on classified point
126     layers: KeyError was raised, now use the default size if field is None.
127 frank 2515
128 bernhard 2513 2004-12-27 Bernhard Reiter <[email protected]>
129    
130     svgexport 1.0.0cvs: Fixed label export.
131    
132     * Extensions/svgexport/test/test_svgmapwriter.py:
133     class TestSVGRenderer(): New class; new test test_label_font().
134    
135     * Extensions/svgexport/svgmapwriter.py
136     (SVGRenderer.label_font()): initialised Font size with self.factor now,
137     makes test_label_font happy.
138    
139     * Extensions/svgexport/TODO: crossed out fixed label export item.
140     Added item for options.
141    
142     * Extensions/svgexport/__init__.py: Bumped version to 1.0.0cvs.
143    
144 russell 2511 2004-12-27 Russell Nelson <[email protected]>
145    
146 jan 2512 Middle mouse button pans.
147 russell 2511
148 jan 2512 * Thuban/UI/view.py (MapCanvas.__init__): Subscribe also
149     OnMiddleDown and OnMiddleUp events.
150     (MapCanvas.OnMiddleDown): New. Activate the pan tool and remember the
151     previously used tool.
152     (MapCanvas.OnMiddleUp): New. Reactivate the remebered tool used before
153     pressing the middle mouse button.
154    
155 jan 2509 2004-12-27 Jan-Oliver Wagner <[email protected]>
156    
157     * Doc/manual/thuban-manual-de.xml: More translations.
158    
159 jan 2506 2004-12-23 Jan-Oliver Wagner <[email protected]>
160    
161     * Thuban/UI/projdialog.py (ProjFrame.load_user_proj): Added a
162     \n to stderr after the warnings. Thanks to Russell Nelson.
163    
164 nhueffme 2493 2004-12-20 Nina Hueffmeyer <[email protected]>
165    
166     * Extensions/ogr/ogrshapes.py: Fixed some issues from
167     Bernhard (coding guidelines etc.). Additionally it is now possible to
168     display shapefiles containing feature collections (e.g.polygons
169     with holes). Works with gdal 1.2.1 now.
170    
171     * Extensions/ogr/test/test_OGRShapestore.py: Fixed some issues
172     from Bernhard (coding guidelines etc.). If ogr can't be imported,
173     tests are skipped now.
174    
175     * Extensions/ogr/ogrstart.py: Fixed some typings.
176    
177 bernhard 2490 2004-12-20 Bernhard Reiter <[email protected]>
178    
179     * Extensions/svgexport/TODO: updated to add support for
180     raster layers and labels for 1.0.1.
181    
182     * Extensions/svgexport/svgmapwriter.py (draw_raster_layer):
183     Issue a warning now.
184    
185 bernhard 2488 2004-12-19 Bernhard Reiter <[email protected]>
186    
187 bernhard 2489 * Extensions/svgexport/TODO: Added idea to support triggering
188     the application down the pipe.
189    
190     2004-12-19 Bernhard Reiter <[email protected]>
191    
192 bernhard 2488 svgexport: Improved code quality, mainly by better naming.
193    
194     * Extensions/svgexport/svgmapwriter.py:
195     DrawPath() renamed to DrawPolygonPath(),
196     added documentation, improved comments and variable names.
197    
198     * Extensions/svgexport/svgmapwriter.py,
199     Extensions/svgexport/test/test_svgmapwriter.py:
200     All using DrawPolygonPath() now, the default parameter closed=True
201     omitted.
202    
203     * Extensions/svgexport/test/test_svgmapwriter.py:
204     renamed test_polygon_opened() to test_polyline()
205     renamed test_transparent_polygon() to test_transparent_polyline()
206    
207 jan 2487 2004-12-18 Jan-Oliver Wagner <[email protected]>
208    
209     Some fixes of gns2shp extension.
210    
211     * Extensions/gns2shp/test/__init__.py: New. Make this directory a
212     package.
213    
214     * Extensions/gns2shp/test/test_gns2shp.py: Add some import paths
215     dynamically.
216    
217     * Extensions/gns2shp/test/README: Simplified description how to test.
218    
219     * Extensions/gns2shp/gns2shp.py (gns2shp): Fixed doc-string,
220     fixed some dimensions of fields according to the GNS documentation
221     which seems to change undocumented.
222     Now killing trailing \n and/or \r from MODIFY_DATE.
223     This fixes RT#2453.
224    
225 bernhard 2479 2004-12-18 Bernhard Reiter <[email protected]>
226 bernhard 2480
227 bernhard 2482 svgexport 1.0.0: Treats holes and islands nicely. Documentation added.
228    
229     * Extensions/svgexport/test/test_svgmapwriter.py:
230     Added new tests: test_export_polygon_with_hole()
231     and test_polygon_with_hole().
232    
233     * Extensions/svgexport/svgmapwriter.py
234     (draw_polygon_shape()): Uses DrawPath correctly now.
235    
236     * Doc/manual/thuban-manual.xml: Added documentation for stable
237     extention svgexport.
238     * Doc/manual/thuban-manual-de.xml: Copied English section about
239     svexport over.
240    
241 jan 2509 * Extensions/svgexport/__init__.py: Bumped version number to 1.0.0.
242 bernhard 2482
243     * Extensions/svgexport/svgsaver.py,maplegend.py:
244     Moved from experimental to stable extension menu.
245    
246     * Extensions/svgexport/TODO: updated.
247    
248    
249     2004-12-18 Bernhard Reiter <[email protected]>
250    
251 bernhard 2481 Added Extensions/svgexport/TODO
252    
253     2004-12-18 Bernhard Reiter <[email protected]>
254    
255 bernhard 2480 Refactored in svgexport:
256     DrawPath replaces DrawPolygon; added newline in front of "M" in paths.
257    
258     * Extensions/svgexport/svgmapwriter.py
259     Added verbosity level 3 to print out polygon points.
260     (class Point): added __repr__
261     (class Brush, __str__()): Added space after ,.
262     (DrawPolygon): Renamed to DrawPath()
263     (DrawPath): Takes list of polygons as input now, adds \n before "M"s.
264     (DrawLines): Using DrawPath now.
265    
266     * Extensions/svgexport/test/test_svgmapwriter.py:
267     Replaced DrawPolygon() calls with DrawPath() and put the first argument
268     inside another list. Adapted test data with a newline before "M".
269    
270     2004-12-18 Bernhard Reiter <[email protected]>
271 bernhard 2479
272     Refactored svgexport tests: 9 double tests runs eliminated;
273     code size reduced by 8 lines.
274    
275     * Extensions/svgexport/test/test_svgmapwriter.py:
276     (class TestWithDC): Renamed to BaseTestWithDC, moved to top.
277     (class BaseWithDCtools): New, subclass from BaseTestWithDC.
278     (class TestDrawSplines): now subclass from BaseTestWithDCtools,
279     this fixed the double running of the nine tests of TestVirtualDC.
280     (class TestVirtualDC): Using self.dc and self.file from setUp().
281    
282 bh 2478 2004-12-17 Bernhard Herzog <[email protected]>
283    
284     Two windows specific fixes ported from thuban-1­0-branch:
285    
286     * Thuban/UI/about.py (unicodeToLocale): Use getdefaultlocale
287     instead of getlocale because getlocale doesn't return a usable
288     encoding name on a german windows 2000
289    
290     * setup.py: windows build: Removed the absolute path names and
291     made all prfixes relative to the directory containing setup.py.
292     Makes it a little easier to adapt to a different system.
293    
294 bh 2470 2004-12-16 Bernhard Herzog <[email protected]>
295    
296 bernhard 2479 Add support for PostGIS tables with LINESTRING geometries.
297 bh 2472 Fixes RT#2299
298    
299     * Thuban/Model/postgisdb.py (shapetype_map): Add LINESTRING
300    
301     * test/postgissupport.py
302     (PostgreSQLServer.get_default_static_data_db): Rename the "roads"
303     table to "roads-multi" because it now uses MULTILINESTRING
304     geometries and introduce a new "roads" table that uses LINESTRING
305     (coords_to_multilinestring): Make the doc string more precise
306     (coords_to_linestring): New. Create a LINESTRING WKT
307     representatin
308     (wkt_converter): Add coords_to_linestring
309     (upload_shapefile): Rephrase the doc-string a bit.
310    
311     * test/test_postgis_db.py (TestPostGISShapestoreArc)
312     (LineStringTests)
313     (TestPostGISShapestoreLineString)
314     (TestPostGISShapestoreMultiLineString): Split
315     TestPostGISShapestoreArc into a base class LineStringTests and two
316     derived classes TestPostGISShapestoreLineString for LINESTRING
317     geometries and TestPostGISShapestoreMultiLineString for
318     MULTILINESTRING geometries. Most test methods are in the base
319     class with the exception of tests that explicitly check the raw
320     format.
321    
322     2004-12-16 Bernhard Herzog <[email protected]>
323    
324 bh 2471 Make the test suite work with PostGIS 0.8.2 and PostgreSQL 7.4
325    
326     * test/postgissupport.py (find_postgis_sql): Different postgis
327     versions put the postgis.sql file into slightly different places
328     so we have to look in both. The updated doc string describes this
329     is more detail.
330    
331     * test/test_postgis_db.py
332     (TestPostGISSpecialCases.test_column_name_quoting): The return
333     value of UniqueValues is unsorted, so it has to be sorted for
334     comparison.
335    
336     2004-12-16 Bernhard Herzog <[email protected]>
337    
338 bh 2470 Fix for RT#2237
339    
340     * Thuban/UI/projdialog.py (ProjFrame._show_proj_panel): If the
341     panel to be shown is the UnknownProjPanel disable the OK and Try
342     buttons. Otherwise enable them.
343     (ProjFrame.__GetProjection): The UnknownProjPanel returns None for
344     the parameters. In that case __GetProjection also returns None
345     now.
346    
347 bh 2459 2004-12-15 Bernhard Herzog <[email protected]>
348    
349 bh 2462 * Thuban/UI/classgen.py (GenQuantilesPanel.__init__): Set the
350     minimum number of classes to 2. The calculate_quantiles needs at
351     least two and raises an exception otherwise.
352     Fixes RT#2549
353    
354     2004-12-15 Bernhard Herzog <[email protected]>
355    
356 bh 2460 * test/postgissupport.py (PostgreSQLServer.execute_sql): Extend to
357     so that it returns a result for select statements.
358     (PostgreSQLServer.server_version): New. Return the version of the
359     server software.
360     (PostgreSQLServer.require_authentication): The format of
361     pg_hba.conf has changed between PostgrSQL 7.2 and 7.3. Check the
362     server version and generate the file in the correct format
363    
364     2004-12-15 Bernhard Herzog <[email protected]>
365    
366 bh 2459 * test/postgissupport.py (PostgreSQLServer.is_running): Fix typo
367     in the doc string and rephrase it a little.
368    
369 frank 2457 2004-12-15 Frank Koormann <[email protected]>
370    
371     * test/test_load.py (TestAltPath.checkSession): New, extended checks if
372     session has been loaded successfully. The check is called by the relevant
373     tests after executing load_session().
374    
375 bh 2450 2004-12-13 Bernhard Herzog <[email protected]>
376    
377 bh 2454 Make sure the region used to determine which shapes are visible
378     actually matches the region on the printed page. If this isn't
379     done properly some shapes might not be printed.
380     Fixes RT #2692
381    
382     * Thuban/UI/view.py (MapPrintout.draw_on_dc): The region for the
383     renderer has to be at the same position as the mapregion
384    
385     * Thuban/UI/renderer.py (ExportRenderer.RenderMap): self.region
386     has to be moved by (self.shiftx, self.shifty) too.
387    
388     2004-12-13 Bernhard Herzog <[email protected]>
389    
390 bh 2452 * libraries/pyprojection/Projection.i: Work around a bug in the
391     generated python code which leads to exception in the __del__
392     method when the constructor fails. See the comments in the code
393     for more details.
394    
395     * libraries/pyprojection/Projection.py: Updated from Projection.i
396     with SWIG.
397    
398     2004-12-13 Bernhard Herzog <[email protected]>
399    
400 bh 2451 * test/test_load.py (TestAltPath.test_01_single_path_error_fix)
401     (TestAltPath.test_02_path_error_fix_from_list)
402     (TestAltPath.test_05_path_error_fix_from_list_changed)
403     (TestAltPath.test_06_path_error_fix_from_list_fails): self.session
404     is destroyed in tearDown, so there's no need to do it in a test
405     case.
406    
407     * Thuban/Model/load.py (SessionLoader.open_shapefile): Remove a
408     debug print
409    
410     2004-12-13 Bernhard Herzog <[email protected]>
411    
412 bh 2450 * Extensions/svgexport/test/test_svgmapwriter.py
413     (TestDrawSplines.setUp): Do not use super with the unittest
414     classes because in Python 2.2 they're still old-style classes.
415    
416 frank 2448 2004-12-13 Frank Koormann <[email protected]>
417    
418     Alternative Path feature: When loading a (moved) session where
419     shapefiles cannot be found, ask the user. Use the specified path
420     if further shapefiles are missing. However, ask the usr for confirmation
421     in such cases.
422    
423     * test/test_load.py (TestAltPath): New, tests for alternative path feature
424     in load_session()
425     (Shapefile_CallBack): Helper, implements controllable callback.
426    
427     * Thuban/UI/application.py (ThubanApplication.OnInit):
428     Added "alt_path" to self.path
429     (ThubanApplication.OpenSession): Added shapefile_callback as second
430     callback similar to db_connection_callback.
431     (ThubanApplication.run_alt_path_dialog): New, implementaion of
432     shapefile_callback. In addition to raising the dialog the control of
433     self.path('alt_path') is implemented here.
434    
435     * Thuban/Model/load.py (SessionLoader.__init__): Added shapefile_callback.
436     (SessionLoader.open_shapefile): Open shapefile, eventually with
437     alternative path. This wrapps the "theSession.OpenShapefile(filename)"
438     formerly used in start_fileshapesource()/start_layer().
439     (SessionLoader.start_fileshapesource): Call open_shapefile().
440     (SessionLoader.start_layer): Call open_shapefile().
441     (load_session): Added shapefile_callback.
442    
443     * Thuban/UI/altpathdialog.py: New, implements dialogs for alternative path
444     feature (search / check).
445    
446     * Doc/manual/thuban-manual.xml: Added documentation of new feature.
447    
448 bernhard 2443 2004-12-11 Bernhard Reiter <[email protected]>
449    
450 bernhard 2445 svgexport 0.9.2: Point size supports for maps.
451    
452     * Extensions/svgexport/svgmapwriter.py: Added import of SHAPETYPE_POINT
453     (def draw_point_shape): new parameter size defaults to 2 as before.
454     (draw_shape_layer_incrementally): Moved draw_func log line higher.
455     Added draw_func call with size when dealing with a point layer.
456    
457     * Extensions/svgexport/__init__.py: bumped version to 0.9.2.
458    
459     2004-12-11 Bernhard Reiter <[email protected]>
460    
461 bernhard 2444 Made sure that newlines are inserted in the svg path d attributes
462     to raise the chance that the line length will be below 255 characters,
463     as recommended by REC SVG 1.1 in section 8.3.1.
464    
465     * Extensions/svgexport/svgmapwriter.py(DrawPolygon):
466     Adding \n before L's and changed whitespace handling.
467    
468     * Extensions/svgexport/test/test_svgmapwriter.py:
469     Adapted tests to new whitespace handling of DrawPolygon.
470    
471     2004-12-11 Bernhard Reiter <[email protected]>
472    
473 bernhard 2443 * Doc/technotes/coding_guidelines.txt: easy typo fixed.
474    
475     * Extensions/svgexport/test/test_svgmapwriter.py:
476     Removed test_drawbezier in favour of new test_drawspline3 and
477     test_drawspline4 within new class TestDrawSplines(TestVirtualDC).
478     All only to test DrawSpline.
479    
480     * Extensions/svgexport/svgmapwriter.py(DrawSpline):
481     New implementation now really using the strange algorithm of
482     xfig 3.1's approximated splines and its conversion to postscript
483     with one twist: SVG can do quadratic beziers, so skipped translation
484     to cubic beziers.
485     (TestWithDC): Typo in comment fixed.
486    
487 joey 2442 2004-12-09 Martin Schulze <[email protected]>
488    
489     * Thuban/Model/classgen.py: Added missing character encoding
490    
491     * Extensions/wms/properties.py (OpenWMSProperties): removed
492    
493     * Extensions/wms/parser.py (WMSCapabilitiesParser.error): Dropped
494     support for get_srs_discrepancies() since there are no
495     discrepancies anymore (was a thinko)
496    
497     * Extensions/wms/layer.py (WMSLayer.GetMapImg): Improved graphic
498     format priority now that more formats are supported globally by
499     the render engine.
500    
501 silke 2437 2004-12-08 Silke Reimer <[email protected]>
502     * Extensions/ogr/ogrshapes.py: Substituted ogr-method CloseRings
503     because it is not available in all versions of ogr
504    
505 bernhard 2436 2004-12-08 Bernhard Reiter <[email protected]>
506     * Extensions/ogr/__init__.py: Added empty __init__.py to heal
507     global tests until a real one is commited.
508    
509 nhueffme 2435 2004-12-07 Nina Hüffmeyer <[email protected]>
510    
511     * /Extensions/ogr/: Adding a new extension to read shapefiles with
512     ogr. It is planned to add other vector formats.
513    
514     * /test/runtests.py: Adding tests from /Extensions/ogr/test/.
515    
516 jan 2434 2004-12-07 Jan-Oliver Wagner <[email protected]>
517    
518     * /Extensions/svgexport/test/test_svgmapwriter.py: Reverting
519     part of a (non-)fix to renable that the tests are always
520     executed.
521    
522 bernhard 2432 2004-12-07 Bernhard Reiter <[email protected]>
523    
524     * Extensions/svgexport/test/test_svgmapwriter.py:
525     Added test_drawbezier() to test DrawSpline().
526    
527     * Extensions/svgexport/svgmapwriter.py(DrawSpline):
528     Really implemented bezier drawing.
529    
530     * Extensions/svgexport/__init__.py: Bumped version of svgexport
531     to 0.9.1 because now the legend examples lines styles
532     will be drawing with beziers.
533    
534 joey 2431 2004-12-05 Martin Schulze <[email protected]>
535    
536     * Thuban/UI/renderer.py (raster_format_map): Added PNG, TIFF and
537     GIF as supported bitmap image formats (helpful for the WMS extension)
538    
539 joey 2430 2004-11-30 Martin Schulze <[email protected]>
540    
541     * Extensions/wms/test/test_ogclib.py (TestOGCLib.test_compareURLs):
542     Improved the test for the internal compare method
543    
544 jan 2429 2004-11-27 Jan-Oliver Wagner <[email protected]>
545    
546     * Thuban/UI/about.py (About.__init__): Added
547     Norbert Solymosi for hungarian translation and Ole Rahn
548     as contrbutor. Moved Bernhard Reiter from Contributor
549     to Developer.
550    
551 bernhard 2425 2004-11-27 Bernhard Reiter <[email protected]>
552    
553     * Extensions/svgexport/test/test_svgmapwriter.py:
554     Removed Jan from author list as he did not change enough significant
555     lines yet.
556    
557     * Extensions/svgexport/__init__.py: Added Bernhard as author
558     of the Extension.
559    
560 jan 2422 2004-11-27 Jan-Oliver Wagner <[email protected]>
561    
562     * po/hu.po: New. Hungarian translation. Contributed
563     by Norbert Solymosi.
564    
565 bh 2419 2004-11-26 Bernhard Herzog <[email protected]>
566    
567     * Extensions/svgexport/test/test_svgmapwriter.py
568     (Testobjectexport.test_transparent_polygon): Commented out some
569     debug prints
570    
571 jan 2418 2004-11-24 Jan-Oliver Wagner <[email protected]>
572    
573     Fix broken tests for svg extension and added svg legend
574     to Experimental menu.
575    
576     * Extensions/svgexport/test/test_svgmapwriter.py: Fix to have
577     the test run correctly even if the extension is a package.
578     Also removed the "import Thuban" which makes no sense.
579    
580     * Extensions/svgexport/__init__.py: Fix to have the extensions'
581     test module also be executed from the global test routine.
582     This is done by looking for the absense of the DISPLAY variable.
583    
584     * Extensions/svgexport/maplegend.py: Moved the menu entry from Extensions
585     to Experimental menu since this module has yet not reached a stable
586     status (ie. 1.0).
587    
588 bernhard 2414 2004-11-22 Bernhard Reiter <[email protected]>
589    
590     * Extensions/svgexport/svgmapwriter.py:
591     Added verbose variable and some logging depending on it.
592     (class VirtualDC(XMLWriter)): Minor improvement in the polygon loop,
593     because counting i is not necessary.
594     (class Pen, class Brush): Added simple __str__ methods.
595     (SVGRenderer.draw_polygone_shape): Fix #2698 (transparent polygons are
596     not exported to svg file) Note: holes still unhandled.
597    
598     * Extensions/svgexport/test/test_svgmapwriter.py:
599     Made a baseclass TestWithDC for test needed a DC.
600     Added tests for bug #2698 (transparent polygons are not
601     exported to svg file):
602     Testobjectexport.test_transparent_polygon()
603    
604     * Thuban/Model/base.py (UnsetModified):
605     Fixed some typos in docstring.
606    
607     * Thuban/UI/baserenderer.py (BaseRenderer.draw_polygon_shape()):
608     Added hints on the used algorithm for handling holes.
609    
610 jan 2403 2004-11-20 Jan-Oliver Wagner <[email protected]>
611    
612 jan 2412 Some face lifting for the examples.
613    
614     * Examples/__init__.py: Make this directory a package.
615    
616     * Examples/simple_extensions/__init__.py: Make this directory a package.
617    
618     * Examples/simple_extensions/hello_world.py: Moved entry from Extensions
619     menu to Examples menu.
620    
621     * Examples/simple_extensions/simple_command.py: Some more comments,
622     minor changes.
623    
624     * Examples/simple_extensions/simple_tool.py: Minor changes.
625    
626     2004-11-20 Jan-Oliver Wagner <[email protected]>
627    
628 jan 2407 Changed way of extension registry for wms and added extension
629     registry for umn_mapserver extension.
630    
631     * Extensions/wms/__init__.py: Added registry entry and the importing
632     of the actual wms module. Included a test for the required PyOGCLib.
633    
634     * Extensions/wms/wms.py: Removed registry entry (moved to __init__.py).
635    
636     * Extensions/umn_mapserver/__init__.py: Added registry entry and the
637     importing of the actual umn mapserver management modules.
638     Included a test for the required Python MapScript.
639    
640     2004-11-20 Jan-Oliver Wagner <[email protected]>
641    
642 jan 2403 Changed way of extension registry for importAPR, bboxdump
643     and added extension registry for svgexport.extension registry for
644     svgexport.
645    
646     * Extensions/importAPR/__init__.py: Added registry entry and the importing
647     of the actual importAPR module.
648    
649     * Extensions/importAPR/importAPR.py: Removed registry entry (moved to
650     __init__.py).
651    
652     * Extensions/bboxdump/__init__.py: Added registry entry and the importing
653     »···of the actual bboxdump module.
654    
655     * Extensions/bboxdump/bboxdump.py: Removed registry entry (moved to
656     »···__init__.py).
657    
658     * Extensions/svgexport/__init__.py: Added registry entry and the importing
659     of the svgsaver module.
660    
661     * Extensions/svgexport/svgsaver.py: Moved the menu entry from Extensions
662     to Experimental menu since this module has yet not reached a stable
663     status (ie. 1.0).
664    
665 jan 2397 2004-11-18 Jan-Oliver Wagner <[email protected]>
666    
667     Now the hit test considers the size of point symbols.
668    
669     * Thuban/UI/viewport.py (ViewPort._hit_point): Added optional parameter
670     'size' defaulting to the previously fixed value 5.
671     Extended doc-string.
672     (Viewport._find_shape_in_layer): Resolved FIXME regarding flexibility
673     for symbols.
674     Now the size of the largest point symbol is determined to find out
675     about whether the point has been hit.
676     This fixes the problem that only clicks inside a fixed distance of
677     5 where found.
678    
679 jan 2395 2004-11-17 Jan-Oliver Wagner <[email protected]>
680    
681 jan 2397 Another open issue fixed regarding sizeable symbols: correct rendering of
682 jan 2395 selected symbols.
683    
684     * Thuban/UI/renderer.py (ScreenRenderer.draw_selection_incrementally):
685     Added consideration of the specific size of point symbols.
686     The property for each point symbol is retrieved and the size applied
687     for the rendering method.
688     Added doc-string.
689    
690 jan 2393 2004-11-16 Jan-Oliver Wagner <[email protected]>
691    
692     Changed way of Extension Registry for gns2shp and profiling.
693    
694     * Extensions/gns2shp/gns2shp.py: Removed registry entry (moved to
695     __init__.py).
696    
697     * Extensions/gns2shp/__init__.py: Added registry entry and the importing
698     of the actual gns2shp module.
699    
700     * Extensions/profiling/profiling.py: Removed registry entry (moved to
701     __init__.py).
702    
703     * Extensions/profiling/__init__.py: Added registry entry and the importing
704     of the actual profiling module.
705    
706 bernhard 2388 2004-10-28 Bernhard Reiter <[email protected]>
707    
708     * Extensions/svgexport/: Minor improvements to doc strings.
709    
710 jan 2387 2004-10-07 Jan-Oliver Wagner <[email protected]>
711    
712     Further elements for sizable point objects now
713     making this feature usable though not yet complete.
714    
715     * Thuban/Model/save.py (SessionSaver.write_classification): Write
716     attribute 'size' for cldata when the shape layer is of point type.
717     This also now make the test_load.py tests happy.
718    
719     * Thuban/Model/classgen.py (CustomRamp.GetProperties): Added size
720     gradient.
721    
722     * Thuban/UI/classifier.py (ID_SELPROP_SPINCTRL): Renamed to
723     ID_SELPROP_SPINCTRL_LINEWIDTH.
724     (ID_SELPROP_SPINCTRL_LINEWIDTH): New Id replaces ID_SELPROP_SPINCTRL.
725     (ID_SELPROP_SPINCTRL_SIZE): New Id.
726     (SelectPropertiesDialog.__init__): Added a second spin control
727     for the size in case the corresponding layer is of point type.
728     (SelectPropertiesDialog._OnSpin): Renamed to _OnSpinLineWidth.
729     (SelectPropertiesDialog._OnSpinLineWidth): New. Former _OnSpin.
730     (SelectPropertiesDialog._OnSpinSize): New. Set size of property
731     and refresh preview.
732    
733    
734    
735 joey 2381 2004-10-04 Martin Schulze <[email protected]>
736    
737     * Extensions/wms/test/test_parser.py
738     (TestWMSCapabilitiesParser.test_compareLists): Added missing
739     self-test for compareLists()
740     (TestWMSCapabilitiesParser.test_compareDicts): Added missing
741     self-test for compareDicts()
742 joey 2382 (TestWMSCapabilitiesParser.test_compareLists): Adding more tests
743     to verify the test routine fails with non-equal arguments
744     (TestWMSCapabilitiesParser.test_compareDicts): Adding more tests
745     to verify the test routine fails with non-equal arguments
746 joey 2381
747 jan 2370 2004-10-03 Jan-Oliver Wagner <[email protected]>
748    
749 jan 2380 First elements for sizeable point objects.
750    
751     * Resources/XML/thuban-1.1.dtd: Added size attribute to cldata.
752    
753     * Data/iceland_sample_size.thuban: New. Sample for sized point objects.
754    
755     * test/test_load.py (ClassificationTest.TestLayers): Added SetSize in case
756     of a corresponding argument is given.
757     (TestSymbolSize): New. Test the size attribute of cldata.
758    
759     * Thuban/Model/classification.py: Removed some trailing whitespaces.
760     (ClassGroupProperties.__init__): Set default size.
761     (ClassGroupProperties.SetProperties): Set the size.
762     (ClassGroupProperties.GetSize): New. Return the size.
763     (ClassGroupProperties.SetSize): New. Set the size.
764     (ClassGroupProperties__eq__): Compare also size.
765     (ClassGroupProperties__repr__): Print also size.
766    
767     * Thuban/Model/load.py (SessionLoader.start_cldata): Also parse
768     the size attribute.
769    
770     * Thuban/UI/classifier.py (ClassDataPreviewer.Draw): Added doc-string.
771     Also, now there is a return value that indicates whether the drawing
772     size exceeded the given rect extent and if so the new extent.
773     Finally, point objects are drawn depending on the size. If either
774     the width or height is exceeded, the new extent is returned.
775     (ClassRenderer.Draw): Now when calling the previewer drawing function,
776     evaluate the return value and, if not None, adapt the grid widget size
777     accordingly and redraw again.
778    
779     * Thuban/UI/baserenderer.py (BaseRenderer.draw_shape_layer_incrementally):
780     If the draw function is for points, call it with the size as additional
781     parameter.
782     (BaseRenderer.draw_point_shape): Added additional, optional parameter for
783     the size. Compute the radius using the size.
784    
785     * Extensions/importAPR/apr.py (APR_BMkSym.GetThubanProp): Now
786     that Thuban supports size, apply this correctly.
787    
788     * Extensions/importAPR/importAPR.py: Bumped version to 0.1.1.
789    
790     2004-10-03 Jan-Oliver Wagner <[email protected]>
791    
792 jan 2370 * Doc/manual/thuban-manual-de.xml: Started translation of
793     Map chapter.
794    
795 joey 2368 2004-10-01 Martin Schulze <[email protected]>
796    
797     * Extensions/wms/properties.py (wmsProperties.__init__): Extended
798     argument for general use through properties-dialog selector
799    
800     * Thuban/UI/classifier.py: Register properties dialog classes for
801     both provided layer classes/types.
802    
803     * Thuban/UI/mainwindow.py (MainWindow.OpenLayerProperties): The
804     map can be retrieved through the parent which is passed to the
805     constructor anyway and doesn't require an argument of its own,
806     required for the unification of arguments for general use through
807     properties-dialog selector.
808     (MainWindow.OpenOrRaiseDialog): Move the logic for checking
809     whether a dialog is already opened (and raising it to the users
810     attention) and creating a new dialog into a function of its own
811     (MainWindow.OpenLayerProperties): Use the new OpenOrRaiseDialog()
812     method
813     (MainWindow.OpenLayerProperties): Utilise the new ClassMapper for
814     global registration of properties dialog classes (which are indeed
815     layer-specific).
816    
817     * Thuban/UI/classifier.py (Classifier.__init__): Unify arguments
818     for general use through properties-dialog selector, the map can be
819     retrieved through the parent and doesn't require an argument of
820     its own.
821    
822     * Extensions/wms/wms.py: Register the properties dialog class for
823     the provided WMS layer
824    
825 jan 2358 2004-09-28 Jan-Oliver Wagner <[email protected]>
826    
827     New feature: Registry for Extensions.
828    
829     * Thuban/UI/extensionregistry.py: This module defines a registry for
830     Extensions.
831    
832     * Thuban/UI/about.py (About.__init__): Added description
833     of the registered extensions with all of the information.
834    
835     * Thuban/Model/extension.py (Extension): Improved doc-string.
836    
837     * Extensions/gns2shp/gns2shp.py, Extensions/importAPR/importAPR.py,
838     Extensions/bboxdump/bboxdump.py, Extensions/profiling/profiling.py,
839     Extensions/wms/wms.py: Added registration of the extension.
840    
841 bernhard 2352 2004-09-27 Bernhard Reiter <[email protected]>
842    
843     More fixes to svgexport to make used ids unique and
844     conforming to XML's Name production.
845    
846     * Extensions/svgexport/test/test_svgmapwriter.py: Added new tests
847     test_xml_id_constraints(), test_make_ide_nosetbaseid() and
848     test_make_id_nonintegersetid(). Switched SetID and SetBaseID.
849     Added Bernhard R. as author.
850     * Extensions/svgexport/svgmapwriter.py (make_id): Using "_" as
851     concatenation char now (makes test_make_ide_nosetbaseid() valid).
852     Also transform second id part with "%d" and catch the TypeError
853     to raise SVGMapWriterError (making test_make_id_nonintegersetid() ok).
854     Corrected typo inBernhard's author line.
855     (SetBaseID): Return the transformed base id. Transform characters
856     which are not alnum() or in ".-_" to binascii.b2a_hex(). Added
857     import binascii. If to be set string starts with "xml" or so, add "t".
858     (draw_shape_layer_incrementally): use the returned value of SetBaseID
859     for used_baseids checks.
860    
861 bh 2351 2004-09-25 Bernhard Herzog <[email protected]>
862    
863     * test/test_layer.py (TestLayer.test_arc_layer_with_projection):
864     Remove a debug print and some tab characters.
865    
866 bernhard 2350 2004-09-25 Bernhard Reiter <[email protected]>
867    
868     * Extensions/svgexport/svgmapwriter.py: Added Bernhard R. as Author.
869     (SetBaseID, SetID, make_id): Improved docstring comments to explain
870     the interaction of the three functions and the XML id contrains.
871    
872 bernhard 2352
873 jan 2346 2004-09-23 Jan-Oliver Wagner <[email protected]>
874    
875 jan 2349 * Doc/ThubanModel.xmi: New. UML file for Thuban Model
876     Module.
877    
878     * Doc/README: Added info on ThubanModel.xmi.
879    
880     2004-09-23 Jan-Oliver Wagner <[email protected]>
881    
882 jan 2346 * Doc/README: New. Some info about how to generate technical
883     documentation from the source code.
884     This text was send to the Thuban developer mailing list on
885     September 21st 2004 by Bernhard Reiter.
886    
887 bernhard 2344 2004-09-21 Bernhard Reiter <[email protected]>
888    
889     Improved the svgexport to only use unique ids. Will issues
890     an error message dialoge when two layer names are the same.
891     ShapeIDs are now added with a dash within the svg ids.
892    
893     * Extensions/svgexport/svgmapwriter.py (SVGMapWriterError): New.
894     * Extensions/svgexport/test/test_svgmapwriter.py: Added imports
895     (TestSVGRenderer): New test class with test_make_in() and
896     test_check_for_layer_name_clash()
897     * Extensions/svgexport/svgmapwriter.py (SVGRenderer): Fixed __init__()
898     and draw_shape_layer_incrementally() to not use a baseid twice,
899     satisfying test_check_for_layer_name_clash()
900     (VirtualDC.make_id): Use a dash between baseit and id, satisfies
901     test_make_in().
902     * Extensions/svexport/svgsaver.py: Import SVGMapWriterError, wxOK
903     and wxICON_HAND.
904     (write_to_svg): Put dc and rendering in a try statement and on
905     catching SVGmapWriterError notify the user and delete the target file.
906    
907 bernhard 2343 2004-09-20 Bernhard Reiter <[email protected]>
908    
909     * Model/base.by, Model/layer.py: Fixed typos in docstrings.
910    
911 jschuengel 2342 2004-09-03 Jan Schüngel <[email protected]>
912    
913     * Extensions/umn_mapserver/mapfile(MF_Class.add_thubanstyle): Fix a
914     small bug with the line color. Now the line color will now only set
915     if it is set in Thuban an not Transparent.
916    
917     * Extensions/umn_mapserver/mf_export(tblayer_to_map): Fixed a bug with
918     deleting the layers from mapfile. Now all layers will delete backwards
919     from the last.
920    
921 silke 2339 2004-08-20 Silke Reimer <[email protected]>
922 silke 2338
923 silke 2339 * Thuban/Model/layer.py:
924     Fixes bug in projection handling: Otherwise very large region might not
925     have valid values in the layer's projection.
926    
927     2004-08-20 Silke Reimer <[email protected]>
928    
929 silke 2338 * Thuban/UI/about.py:
930     small changes to be consistent with coding style.
931    
932 joey 2337 2004-08-13 Martin Schulze <[email protected]>
933    
934     * Extensions/wms/test/test_ogclib.py (TestOGCLib.compare_URLs):
935     Adjusted a comment
936    
937 silke 2335 2004-08-11 Silke Reimer <[email protected]>
938 silke 2334
939 silke 2335 * Thuban/UI/about.py: Small changes to encoding related stuff to avoid
940     too many and too enhanced imports of locale
941    
942 silke 2334 2004-08-10 Silke Reimer <[email protected]>
943    
944     * Thuban/UI/about.py: Fixed encoding problem of about dialog: Added
945 silke 2339 function unicodeToLocale() to convert special characters to users
946     locale encoding
947 silke 2334
948 jan 2333 2004-08-10 Jan-Oliver Wagner <[email protected]>
949    
950     * Doc/technotes/coding_guidelines.txt: Added rule 'Method names start with
951     lower case letter'
952    
953 jschuengel 2331 2004-08-09 Jan Schüngel <[email protected]>
954    
955     * ChangeLog: Rewrite the last ChangeLog entry to follow
956     the standard way.
957    
958     * Extensions/umn_mapserver/mapfile: Moved the import AnnotationLayer to
959     the function where it is needed, because it don't works if it stands
960     at the beginning.
961     (MF_Layer.__init__): Removed the extra numclassed variable. Now
962     numclasses from the mapscript will be used.
963     (MF_Layer.get_index): New. Return the index of the layer in mapfile.
964     (MF_Layer.set_classes): New. A Classlist will be set to the layer.
965     (MF_Layer.set_metadata): New. A Metadata mapscript object will set.
966     (MF_Layer.remove_allclasses): New. All class of the layer will remove.
967     (MF_Map.create_new_layer): New. A new Layer is created and associated
968     with the mapscript object.
969     (MF_Map.set_layerorder): New. The Layer order like in thuban is set in
970     the mapscript.
971     (MF_Map.add_thubanlayer): Now a new layerobj is created if no one is
972     linked to the layer in thuban, else the layerobject linked to the
973     thubanlayer will be used.
974     AnnotationLayer will now store the filename of the shapefile.
975     (MF_Map.remove_layer): If a layer is removed the associated object
976     must be set new.
977    
978     * Extensions/umn_mapserver/mf_export.py(tb_layer_to_map): Add all
979     layers which are exists in thuban to the mapobj. All removed Layers
980     will be removed from the mapobj.
981     Added comments to all functions.
982     (thuban_to_map): No layer will be removed here.
983    
984     * Extensions/umn_mapserver/mf_handle.py
985     (_has_umn_mapobj_and_selectedlayer): Activating the layer menu. Now
986     Layersettings for the mapserver kann be edited.
987    
988     * Extensions/umn_mapserver/mf_import.py: Now all layers which are
989     imported, will be linked with the associated MF_Layer.
990     (import_mapfile): All layers, which are not selected, will be removed.
991     Disable the "import layer from mapfile" menu option.
992    
993     * Extensions/umn_mapserver/sample/iceland.map: Set the status of the
994     Annotation Layer from DEFAULT to OFF. The DEFAULT setting turns the
995     layer on permanently.
996    
997 jschuengel 2323 2004-08-03 Jan Schüngel <[email protected]>
998    
999 jschuengel 2331 * Extensions/umn_mapserver/mapfile.py(MF_Metadata.remove_allmetadata):
1000     New. This function removes all metadata
1001     (MF_Layer.set_group): New. Set the group setting.
1002     (MF_Layer.get_group): New. Get the group setting.
1003     (MF_Map): Removed the extra numlayers variable, used the mapscript
1004     parameter instead.
1005     (MF_Map.get_numlayers): New. This get numlayers.
1006     (MF_Map.remove_all_layers): New. Removes all layers from the mapobj.
1007 jschuengel 2323 (MF_Map.add_thubanlayer): Replaced the exception handling by a check
1008     if the object is an instance. Also added the annotation layer here to
1009     export, but only the layer is created in the mapfile.
1010    
1011 jschuengel 2331 * Extensions/umn_mapserver/mf_export.py(export_mapfile): Removed
1012     the check if a mapobj exist, because its not needed anymore. The
1013     export function is only available if a mapobj exist.
1014     Use the new function to remove all layers.
1015 jschuengel 2323
1016 jschuengel 2331 * Extensions/umn_mapserver/mf_handle.py(Layer_Dialog): Added a group
1017     option and the metadata button. The layer dialog is temporary disabled.
1018     (Metadata_CustomDataTable): Added some functions to show the grid
1019 jschuengel 2323 correct.
1020    
1021 jschuengel 2331 * Extensions/umn_mapserver/mf_import.py: Moved the code for showing
1022     the number of layer from import_mapfile to this function.
1023     (AnnotationLayer): New. This Class shows the Annotation layer in
1024     thuban. The layer don't do anything. It's only to show the layer
1025     and to save the layer order.
1026     (add_annotationlayer): New. Import an annotation layer to thuban.
1027     (select_layer2import): New. Import only layers to thuban and not
1028     the other settings like projection or scalebar.
1029     (create_new_mapfile): Moved the _has_umn_mapobj function and the
1030     create_new_mapfile functions from mf_handle.py to mf_import.py.
1031 jschuengel 2323
1032     * Extensions/umn_mapserver/sample/iceland.map: Added the group
1033     parameter to the roads and cultural layers. Also added a new
1034     Annotation Layer for the cultural points.
1035    
1036     * Extensions/umn_mapserver/sample/iceland.html: Added the select
1037     option for the annotation layer.
1038    
1039     * Extensions/umn_mapserver/sample/index.html: Added the start
1040     parameter for the annotation layer.
1041    
1042 jan 2315 2004-08-01 Jan-Oliver Wagner <[email protected]>
1043    
1044     * Doc/manual/thuban-manual-de.xml (Chapter Session Management):
1045     translation completed.
1046    
1047     * Doc/manual/thuban-manual.xml (Chapter Session Management):
1048     Fixed unprecise description for Save Session.
1049    
1050 jan 2312 2004-07-31 Jan-Oliver Wagner <[email protected]>
1051    
1052     Started translation of Users Manual into german.
1053    
1054     * Doc/manual/thuban-manual-de.xml: New. German Users Manual.
1055    
1056     * Doc/manual/Makefile: Added build instructions for german
1057     users manual.
1058    
1059     * Doc/manual/thuban-manual.xml: Minor corrections in Introduction.
1060    
1061 jschuengel 2308 2004-07-28 Jan Schüngel <[email protected]>
1062    
1063     * Extensions/umn_mapserver/mapfile.py(MF_Metadata): Changed all class
1064     functions. Now all metadata will handle by the function and its not
1065     needed to initialize it from outside. Therefor the associated mapobj
1066     will be stored in the Metadata Object. So we can use the special
1067     functions from the associated mapobj to get the Metadata.
1068     Therefor all initialization code for the metadata is removed from the
1069     other classes.
1070     (MF_Layer): Added a function to get the metadata object.
1071     (MF_Map): Added a function to set the mappath, the path where
1072     the mapfile ist stored.
1073    
1074     * Extensions/umn_mapserver/mf_export.py(thuban_to_map): Changed the code
1075     to set the extent in the mapfile. Now the code is set by the displayed
1076     data in the Thuban-view.
1077     (export_mapfile): The shapepath is now set empty, until relative
1078     pathnames are supported.
1079    
1080     * Extension/umn_mapserver/mf_handle.py: Added a dialog to handle
1081     metadata. Yet only mapfile metadata are supported. Layer and class
1082     supported are not implemented.
1083     Added a dialog to handle layer informations. The dialog only shows the
1084     selected layer at the moment.
1085    
1086     * Extensions/umn_mapserver/mf_import.py(import_mapfile): Changed the
1087     code for setting the extent in thuban. Now the extent is set to the
1088     given extent from the mapfile.
1089     Fixed a logical mistake. Now the extent is set when realy a layer is
1090     loaded, and not if one is selected to load.
1091    
1092     * Extensions/umn_mapserver/sample/iceland.html: Added code to zoom and
1093     move the shown map in the browser.
1094    
1095     * Extensions/umn_mapserver/sample/iceland.map: Added a new metadata
1096     line to the mapobj and added metadata to the political layer.
1097    
1098     * Extensions/umn_mapserver/test/test_mapserver.py: Changed the test
1099     for Metadata.
1100    
1101 joey 2300 2004-07-26 Martin Schulze <[email protected]>
1102    
1103     * Thuban/Lib/classmapper.py (ClassMapper.has): Added the new
1104     ClassMapper
1105    
1106     * test/test_classmapper.py (TestMapping.test_mapper): Added a Test
1107     case for the new ClassMapper
1108    
1109    
1110 bh 2296 2004-07-22 Bernhard Herzog <[email protected]>
1111    
1112 bh 2297 * Thuban/UI/viewport.py (ViewPort.VisibleExtent): New. Return the
1113     visible extent of the map in projected coordinates
1114    
1115     * test/test_viewport.py (SimpleViewPortTest.test_default_size)
1116     (SimpleViewPortTest.test_init_with_size): Add some VisibleExtent()
1117     tests.
1118     (SimpleViewPortTest.test_visible_extent): New. The real test for
1119     VisibleExtent()
1120    
1121     2004-07-22 Bernhard Herzog <[email protected]>
1122    
1123 bh 2296 * test/test_viewport.py: Use support.run_tests as the main
1124     function when running asa script.
1125    
1126 jschuengel 2295 2004-07-22 Jan Schüngel <[email protected]>
1127    
1128     * Extensions/umn_mapserver/mf_export.py: Added "import os"
1129     Removed the old "import Thuban.UI.mainwindow" code.
1130     (tbextent_to_map): Removed the extra function and at the code direct
1131     to "thuban_to_map" function.
1132     (write_creatorcomment): Added. Now a short comment is added to the
1133     beginning of an generated mapfile.
1134     (export_mapfile): Now the Path and filename are saved in to variables,
1135     and not together in one variable. This is needed for the new
1136     write_creatorcomment function.
1137    
1138     * Extensions/umn_mapserver/mf_import.py (import_mapfile): Added the
1139     import module "re". Also added Range and the ClassGroupRange import
1140     from Thuban. Both are needed for the new range expression import.
1141     (create_rangeexpression): Added. Creates a Range Expression in Thuban
1142     style from a given mapfile expression.
1143     (added_rasterlayer): Make some small code changes. The shapepath is
1144     now stored in an extra variable and the clazz_name is set empty if no
1145     class name set in the mapfile.
1146     Changed the Error message for Range Expressions, becaus the new
1147     function create a error string which will be shown in the dialog.
1148    
1149     * Extensions/umn_mapserver/test/test_mapserver.py: Added a test for the
1150     range expression import.
1151 jan 2312
1152 jan 2291 2004-07-21 Jan-Oliver Wagner <[email protected]>
1153    
1154     * Extensions/umn_mapserver/README: Added hint that
1155     installation as root can be avoided. Removed all tabs.
1156    
1157 bh 2289 2004-07-16 Bernhard Herzog <[email protected]>
1158    
1159     * test/test_viewport.py
1160     (ViewPortTest.test_changing_map_projection): Check that changing
1161     the projection of an empty map shown in a viewport doesn't lead to
1162     exceptions in the viewport's handler for the
1163     MAP_PROJECTION_CHANGED messages
1164    
1165     * Thuban/UI/viewport.py (ViewPort.map_projection_changed): Only
1166     try to keep the same region visible when the map actually contains
1167     something
1168    
1169 jschuengel 2288 2004-07-15 Jan Schüngel <[email protected]>
1170    
1171     * Extensions/umn_mapserver/mapfile.py: Added a function to get the
1172     mappath directly from the mapobj. Is needed because of the changes
1173     in mf_import.py.
1174     (MF_Layer.add_thubanclass): Added a new comment.
1175     (MF_Map.set_extent): Fixed a bug with exporting empty mapobj. If the
1176     mapobj is empty there is no extent get from thuban an so no one can
1177     set to th mapobj.
1178    
1179     * Extensions/umn_mapserver/mf_import.py (import_mapfile): Updated
1180     the discription.
1181     Split the funktion in to three smaller ones. The new functions are
1182     add_rasterlayer, add_polygonlayer and select_layer2import.
1183     Removed the mapfilepath and filepath initialisation, because its know
1184     include in the new functions.
1185     Now nothing will be imported if cancel is pressed in the
1186     layer choice dialog.
1187    
1188 jschuengel 2285 2004-07-14 Jan Schüngel <[email protected]>
1189    
1190     * Extensions/umn_mapserver/mapfile.py: Added ClassGroupDefault to
1191     import.
1192     (MF_Symbolset): Removed the extra variable for numsymbols.
1193     (MF_Class.__init__): Added a comment to the exception clause.
1194     Removed the extent init, because it was not needed anymore.
1195     (MF_Layer.add_thubanclass): Added the code to set the class name to
1196     the expression value from thuban if no label is defined.
1197     Added the code to export Range expressions from thuban to the mapfile.
1198     (MF_Map.set_extent): Removed the exception and replace it by some if
1199     code. If the size of a map is not defined the size will be set to 1,1.
1200     This is necessary because if the extent is set, mapscript checks if
1201     the size is greater than zero.
1202     (MF_Web): Added the get and set function for the template.
1203    
1204     * Extensions/umn_mapserver/mf_export.py: Added the function to check
1205     if a mapobject exists and used it to set the status of the menu items.
1206     If no mapfile exists the settings could not be edditied.
1207     Define after which menuitem the exportitem will include.
1208    
1209     * Extensions/umn_mapserver/mf_handle.py: Removed the import
1210     Thuban.UI.mainwindow clause, because it is not needed.
1211     Added the command Refresh() to all "OnChangeColor()" functions,
1212     because the color preview window was not updated on a color change.
1213     Added the function to check if a mapobject exists and used it to set the
1214     status of the menu items. If no mapobject exists the settings could not
1215     be edditied.
1216     (Map_Dialog): Moved the imagetype selector from the
1217     Outputformat_Dialog to Map_Dialog and removed Outputformat_Dialog.
1218     (Web_Dialog): Removed the name label and added the template textbox.
1219    
1220     * Extensions/umn_mapserver/mf_import.py (import_mapfile): Replace
1221     the exception handling on loading the layers by an if statement. It
1222     is not necessary to us the exception there.
1223     The Filepath creation now use os.path.join to build the path.
1224    
1225     * Extensions/umn_mapserver/test/test_mapserver.py: Moved the testMap
1226     definition from global to the setUp function. Now the testMap will
1227     initialize new on each test.
1228    
1229     * Extensions/umn_mapserver/sample/iceland.map: Include three new
1230     classes in the Line Layer, to test logical Expressions.
1231     Set the status of the class "Point9" in the Point Layer to off
1232    
1233 bh 2278 2004-07-13 Bernhard Herzog <[email protected]>
1234    
1235     * Thuban/UI/baserenderer.py
1236     (BaseRenderer.render_map_incrementally): Fix a logic bug in the
1237     optimization that tries not to draw layers under a raster layer.
1238     The bug was harmless. All it effectively did was to produce The a
1239     strange messages about not being able to draw Layer instances for
1240     all vector layers below a raster layer which would be invisible
1241     anyway because the raster layer currently always covers the entire
1242     window
1243    
1244 jschuengel 2277 2004-07-08 Jan Schüngel <[email protected]>
1245    
1246     * Extensions/umn_mapserver/mapfile.py: Added code to generade and get
1247     a list of supported outputformats. This formats are not alle supported
1248     because there is no possibility to get the outputformat without the
1249     name known. Make some formal changes to the code.
1250     (MF_Map.set_name()): Fixed a bug if the name is None.
1251    
1252     * Extensions/umn_mapserver/mf_handle.py: Removed the image_type import
1253     statement, because its not needed anymore. The Outputformat is now
1254     given as string from the object. Make some formal changes to the code.
1255    
1256     * Extensions/umn_mapserver/test/test_mapserver.py: Added new test for
1257     most of the new setting which were added during the last changes.
1258     Removed the MF_Size Test.
1259    
1260     * Extensions/umn_mapserver/test/test.map: Added a new class to the
1261     cultural Layer to test expressions and the the status of that layer
1262     from on to default.
1263     Changed the data path the the correct Thuban Data
1264     Added the Outputformat Object and Symbol Object
1265    
1266 jschuengel 2272 2004-07-07 Jan Schüngel <[email protected]>
1267    
1268     * Extensions/umn_mapserver/mapfile.py: Added some new
1269     settings to edit (outputformat, label, imagetype)
1270    
1271     * Extensions/umn_mapserver/mf_handle.py: Added some setting to
1272     the Label Dialog and add the OutputDialog.
1273     Make some changes to the code order.
1274    
1275 jschuengel 2269 2004-07-06 Jan Schüngel <[email protected]>
1276    
1277     * Extensions/umn_mapserver/mapfile.py: Added the symbolObj, pointObj
1278     and line Obj and add the scalebar_status_type, scalebar_style_type and
1279     scalebar_position_type.
1280     Added the symbol- and symbolsetObject (MF_Symbol,MF_Symbolset). The
1281     are only used to create a Symbol like the circle in Thuban.
1282     Added the scalebarObject (MF_Scalebar)
1283     (MF_Class): Added set_status and get_status.
1284     (MF_Layer.add_thubanclass): Added code to set the class status
1285     (MF_Map): Added code to handle the symbols and scalebar
1286     (MF_Label): Added the set_partials and get_partials functions
1287    
1288     * Extensions/umn_mapserver/mf_export.py: Added MF_Symbol to import
1289     from mapfile. Added a function to create a circle object like the one
1290     from thuban if no one exists.
1291    
1292     * Extensions/umn_mapserver/mf_handle.py: All colors are now set when
1293     press ok in the assosiated dialog and not at the end of the
1294     colordialog.
1295     Added the Dialog for the Scalebar.
1296     (Label_Dialog): Added the offset option
1297    
1298     * Extensions/umn_mapserver/mf_import.py: Added code to import the
1299     status of the Classes.
1300     Fixed a bug with the projection. Now the to_meter parameter will be
1301     added to the Projection only if it doesn't exists.
1302    
1303 jschuengel 2264 2004-07-01 Jan Schüngel <[email protected]>
1304    
1305     Added the functionality to handle the content thuban is not
1306     able to handle directly.
1307    
1308     * Extensions/umn_mapserver/mf_handle.py: New. This module extents
1309     Thuban with the possibility to edit the mapfile content.
1310    
1311     * Extensions/umn_mapserver/mf_import.py: Added the possibility
1312     to import mapfiles without any layer selected. So it is possible
1313     to edit the other settings in a mapfile.
1314     (import_mapfile): Added code to use the editing functions.
1315     Added the possibility to import the projection to a layer if one
1316     is defined.
1317     Status settings (On,Off) will now set in thuban (visible, invisible).
1318     fixed a bug with with classnames. If no classname is set in mapfile
1319     the value in Thuban will set to the expression.
1320    
1321     * Extensions/umn_mapserver/mf_export.py(export_mapfile): Added the
1322     possibility to save a new mapfile or use the old one which is
1323     imported or new created.
1324     Added code to use the editing functions.
1325     Remove some not needed import statements
1326    
1327     * Extensions/umn_mapserver/mapfile.py: Added new types which are
1328     need for the editing functions.
1329     Added needed set-functions for the editing functions.
1330     Added the possibility to export rasterimages.
1331     Added new classes (MF_Web, MF_Label, MF_Legend, MF_Symbol,
1332     MF_SymbolSet). MF_Symbol and MF_SymbolSet are not needed at the
1333     moment.
1334     (MF_Class.set_thubanstyle): Now point layers will set to a default
1335     symbol to show a circle in mapserver and not only a 1px dot.
1336     (MF_Style.__init__): Fixed a bug with the color. Color was not set
1337     correct before.
1338     (MF_Size): Removed, because it is not needed.
1339    
1340     * Extensions/umn_mapserver/README: Added the hints to use the
1341     export and editing functions, too.
1342    
1343     * Extensions/umn_mapserver/sample/iceland.map: Added the
1344     new parameter "UNITS METERS".
1345     Change the political layer to status OFF.
1346    
1347     * Extensions/umn_mapserver/sample/README: Added some
1348     more details to setup the sample in the MapServer.
1349    
1350 bernhard 2256 2004-06-26 Bernhard Reiter <[email protected]>
1351    
1352     * Extensions/svgexport/test/test_svgmapwriter.py:
1353     Removed class VFile and used standard StringIO instead.
1354    
1355 jschuengel 2255 2004-06-23 Jan Schüngel <[email protected]>
1356    
1357     Add the export function to the umn_mapserver extension.
1358    
1359     * Extension/umn_mapserver/mf_export.py: New. This module extents
1360     Thuban with the possibility to export the Thuban content.
1361    
1362     * Extensions/umn_mapserver/mapfile.py: Expand the classes to use
1363     with the export module. Especially added the possibility to
1364     add thuban objects directly to the map objects.
1365    
1366     * Extensions/umn_mapserver/mf_import.py: Removed the wxCHANGE_DIR,
1367     because of the hint from Bernhard Herzog.
1368     Corrected the handling of absolute pathnames.
1369     Changed the Text of the Menu-Item, now the beginning is upper case.
1370    
1371     * Extensions/umn_mapserver/README: Added the --with-tiff statement.
1372    
1373 jschuengel 2250 2004-06-16 Jan Schüngel <[email protected]>
1374 jschuengel 2242
1375 jschuengel 2250 Add a sample and make some changes.
1376    
1377     * Extension/umn_mapserver/mf_import.py: Changed the wxPython.wx
1378     import from * to explicit used statements. Changed the
1379     Thuban.UI.mainwindow import phrase, too.
1380     (import_mapfile):Corrected a clerical mistake.
1381     Added wxCHANGE_DIR in OpenFile Dialog.
1382     Added a MultipleChoiceDialog, to select the layers to load from
1383     mapfile into thuban. Thereby the projection is only set if one layer
1384     is selected.
1385     Added the possibility to handle relative pathnames which uses
1386     up-level references.
1387     Removed some doubled code.
1388     Corrected an error with integer values used as label in thuban
1389     ClassGroup.
1390    
1391     * Extensions/umn_mapserver/sample: New.
1392    
1393     * Extensions/umn_mapserver/sample/README: New. Describes the
1394     usage of the sample files.
1395    
1396     * Extensions/umn_mapserver/sample/iceland.map: New. This is
1397     a suitable .map-file for the iceland data.
1398    
1399     * Extensions/umn_mapserver/sample/index.html: New. The template
1400     for the mapfile.
1401    
1402     * Extensions/umn_mapserver/sample/iceland.html: New. Initialisation
1403     file for the Iceland Application on web.
1404    
1405     * Extensions/umn_mapserver/README: Corrected a inaccuracy and added
1406     some details.
1407    
1408     * Extensions/umn_mapserver/test/test_mapserver
1409     (mapserver_import_Test_generalClasses.test_MF_Color):
1410     Corrected the thubancolor test.
1411    
1412     2004-06-15 Jan Schüngel <[email protected]>
1413    
1414 jschuengel 2242 * Extensions/umn_mapserver/README: New. Install instruction.
1415    
1416 bernhard 2240 2004-06-14 Bernhard Reiter <[email protected]>
1417    
1418     * libraries/thuban/cpl_mfile.h: Added copyright header.
1419    
1420     * libraries/thuban/ cpl_mfile.cpp, cpl_mfile.h: Added non-protecting
1421     Free Software License so that it is most useful with gdalwarp
1422     and bmpdataset.
1423    
1424 bh 2239 2004-06-14 Bernhard Herzog <[email protected]>
1425    
1426     * Thuban/UI/multiplechoicedialog.py (__version__): Add missing
1427     import of wxPython.wx itself (as opposed to the contents of
1428     wxPython.wx). For some reason wxPython.wx is available as
1429     wxPython.wx.wx in at least some 2.4 releases. Fixes RT#2482
1430     wrt. wxPython 2.4.
1431    
1432 jschuengel 2238 2004-06-10 Jan Schüngel <[email protected]>
1433    
1434     Initial version of new extension "umn_mapserver". This extension aims
1435     to manage configuration for the UMN MapServer application. This
1436     inital version just imports the .map-files and displays all, Thuban is
1437     capable of.
1438    
1439     * Extensions/umn_mapserver, Extensions/umn_mapserver/test: New.
1440    
1441     * Extensions/umn_mapserver/test/README: New. Describes how to run the
1442     tests.
1443    
1444     * Extensions/umn_mapserver/test/test.map: New. This is a test
1445     .map-file for automated tests of the umn_mapserver extension of
1446     Thuban.
1447    
1448     * Extensions/umn_mapserver/test/test_mapserver.py: New. Tests for
1449     UMN Mapserver classes.
1450    
1451     * Extensions/umn_mapserver/__init__.py: New. Init to make this
1452     directory a package.
1453    
1454     * Extensions/umn_mapserver/mapfile.py: New. Classes to represent
1455     '.map'-file objects.
1456    
1457     * Extensions/umn_mapserver/mf_import.py: New. This module extends
1458     Thuban with the possibility to handle UMN MapServer mapfiles.
1459    
1460 bh 2230 2004-06-03 Bernhard Herzog <[email protected]>
1461    
1462     * Thuban/Model/layer.py (Layer.TreeInfo): Convert the bounding box
1463     to a tuple before using it as arguments to the % operator. This
1464     fixes the formatting issue filed in RT#2239 on 2004-01-13 and
1465     reported today on thuban-list by Jan Schüngel
1466    
1467     * test/test_layer.py (TestLayerModification.setUp): Save the
1468     filename as an instance variable so we can refer to it in tests
1469     (TestLayerModification.test_tree_info): Uncomment this method
1470     again and make it work. This tests for the formatting issue
1471     filed in RT#2239 on 2004-01-13
1472    
1473 bh 2224 2004-05-28 Bernhard Herzog <[email protected]>
1474    
1475     * Thuban/UI/baserenderer.py: Fix some typos.
1476    
1477 jan 2217 2004-05-18 Jan-Oliver Wagner <[email protected]>
1478    
1479     * Extensions/gns2shp/gns2shp.py (gns2shp): Fixed a bug
1480     by increasing a field size.
1481    
1482 bh 2213 2004-05-17 Bernhard Herzog <[email protected]>
1483    
1484     Update to newest shapelib and get rid of Thuban specific
1485     extensions, i.e. use the new DBFUpdateHeader instead of our
1486     DBFCommit kludge
1487    
1488     * libraries/shapelib/shpopen.c: Update to version from current
1489     shapelib CVS.
1490    
1491     * libraries/shapelib/shapefil.h: Update to version from current
1492     shapelib CVS.
1493    
1494     * libraries/shapelib/dbfopen.c: Update to version from current
1495     shapelib CVS.
1496     (DBFCommit): Effectively removed since shapelib itself has
1497     DBFUpdateHeader now which is better for what DBFCommit wanted to
1498     achieve.
1499     We're now using an unmodified version of dbfopen.
1500    
1501     * setup.py (extensions): Add the HAVE_UPDATE_HEADER macro with
1502     value '1' to the Lib.dbflibc extension. This simply reflects the
1503     shapelib and pyshapelib updates
1504    
1505 jan 2211 2004-05-16 Jan-Oliver Wagner <[email protected]>
1506    
1507     Finished introduction of Menu.FindOrInsertMenu.
1508    
1509     * Extensions/drawshape/drawshape.py: Add the command
1510     to the experimental menu additionally to the toolbar.
1511    
1512     * Extensions/svgexport/svgsaver.py: Use FindOrInsertMenu() instead of
1513     finding menu on its own.
1514    
1515     * Doc/manual/thuban-manual.xml: updated sample file
1516     to use FindOrInsertMenu().
1517    
1518     * Examples/simple_extensions/hello_world.py: Use FindOrInsertMenu()
1519     instead of finding menu on its own.
1520    
1521 jan 2206 2004-05-11 Jan-Oliver Wagner <[email protected]>
1522    
1523     * test/test_menu.py (MenuTest.test): Added testing
1524     of method Menu.FindOrInsertMenu.
1525    
1526 jan 2204 2004-05-10 Jan-Oliver Wagner <[email protected]>
1527    
1528     Introduce and use Menu.FindOrInsertMenu.
1529    
1530     * Thuban/UI/menu.py (Menu.FindOrInsertMenu): New. Find a
1531     given menu or, if not found, insert it.
1532    
1533     * Extensions/bboxdump/bboxdump.py, /Extensions/gns2shp/gns2shp.py,
1534     /Extensions/importAPR/importAPR.py, Extensions/profiling/profiling.py,
1535     /Extensions/wms/wms.py: Use FindOrInsertMenu() instead of finding
1536     menu on its own.
1537    
1538 jan 2201 2004-05-06 Jan-Oliver Wagner <[email protected]>
1539    
1540     Introduce a abstract ColorDialog class and remove
1541     and outdated file.
1542    
1543     * Thuban/UI/proj4dialog.py: Removed. It is has been
1544     replaced by projdialog for quite a while and is not used
1545     anymore.
1546    
1547     * Thuban/UI/colordialog.py: New. Abstraction for color selection
1548     dialog(s).
1549    
1550     * Thuban/UI/classifier.py (SelectPropertiesDialog.__GetColor):
1551     Now calls the abstract ColorDialog instead of wxColourDialog.
1552     This also removed the dependency to Color class conversion
1553     from this function.
1554    
1555 frank 2197 2004-05-04 Frank Koormann <[email protected]>
1556    
1557     * Extensions/bboxdump/__init__.py: Fixed string left over from
1558     copying.
1559    
1560     * Extensions/bboxdump/bboxdump.py (bboxdump):
1561     Use layer.ShapeStore().AllShapes() to loop over shapes instead of
1562     xrange(layer.NumShapes()). Compile the bboxmessage from a list
1563     of formatted outputs (string.join) instead of appending to the
1564     message. Two progress bar dialogs to report progress on the sometimes
1565     lenghty processing.
1566    
1567 frank 2196 2004-04-22 Frank Koormann <[email protected]>
1568    
1569     New Extension to dump bounding boxes of all shapes of the selected
1570     layer. An optional column can be specified to group the objects,
1571     in this case the bounding box is a union of the separate boxes.
1572     Dump can be displayed in a ScrolledMessageDialog or written to file.
1573     The Extension is simply a combination of available and well tested
1574     Thuban functionality.
1575    
1576     * Extensions/bboxdump/__init__.py: New: Init to make this
1577     directory a package.
1578    
1579     * Extensions/bboxdump/bboxdump.py: New: Dump bounding boxes of
1580     all shapes of the selected layer.
1581    
1582 jan 2192 2004-04-22 Jan-Oliver Wagner <[email protected]>
1583    
1584     * Thuban/UI/classgen.py (GenUniquePanel.__init__): Fixed two
1585     strings to be i18n now.
1586    
1587 jan 2188 2004-04-18 Jan-Oliver Wagner <[email protected]>
1588    
1589     Changing popup menu of legend from direct building
1590     to using the Menu construction as used for the mainwindow.
1591    
1592     * Thuban/UI/mainwindow.py: New method commands: layer_to_top,
1593     layer_to_bottom, layer_visibility
1594     (MainWindow.LayerToTop): New. Put current layer to the top.
1595     (MainWindow.LayerToBottom): New. Put current layer to bottom.
1596     (MainWindow.HideLayer, MainWindow.ShowLayer, _has_visible_map):
1597     Replace 1,0 by True, False.
1598     (MainWindow.ToggleLayerVisibility): New. Toggle visibility of
1599     current layer.
1600     (MainWindow.LayerShowTable): Removed raising of dialog.
1601     (_has_selected_layer_visible): New. Support function.
1602    
1603     * Thuban/UI/legend.py: ID_POP_xxx: removed.
1604     (LegendPanel.__init__): Removed EVT_MENU bindings.
1605     (LegendTree._OnRightClick): Replace direct creation of
1606     menu via wx Classes by applying the menu definition
1607     as of Menu class of menu.py.
1608    
1609 jan 2185 2004-04-16 Jan-Oliver Wagner <[email protected]>
1610    
1611     * Thuban/UI/exceptiondialog.py (ExceptionDialog.dialog_layout): Improved
1612     button string to stronger clearify that Thuban will be closed when hitting
1613     the button.
1614    
1615     * Thuban/UI/mainwindow.py (MainWindow.LayerShowTable): Added docstring.
1616     Now for layers without a ShapeStore a corresponding message is given
1617     to the user, that this layer has no table to show.
1618    
1619 joey 2182 2004-04-15 Martin Schulze <[email protected]>
1620    
1621     * Extensions/wms/layer.py (WMSLayer.setWMSFormat): Need to
1622     recalculate the format for the internal render engine as well.
1623    
1624     * Extensions/wms/properties.py (wmsProperties): First start for a
1625     properties dialog. It's functional for a first selection of
1626     layers, but still has some weired wxWidgets/GTK problems but
1627     beautification can be done later.
1628    
1629     * Extensions/wms/layer.py: Added more documentation
1630     (WMSLayer.getFormats): New: Return list of supported image formats
1631     by the WMS server
1632     (WMSLayer.getLayers): New: Return the list of layer names
1633     supported by the WMS server
1634     (WMSLayer.getLayerTitle): New: Return the title of the named layer
1635     (WMSLayer.getWMSFormat): New: Return the image format that is used
1636     for WMS GetMap requests
1637     (WMSLayer.setWMSFormat): New: Set the image format that is used
1638     for WMS GetMap requests
1639     (WMSLayer.__init__): Move away from using only one layer to using
1640     a list of layers (unsorted at the moment, though).
1641     (WMSLayer.getVisibleLayers): New: Return the list of names for all
1642     visible layers
1643     (WMSLayer.setVisibleLayers): New: Set the list of names for all
1644     visible layers
1645    
1646     * Extensions/wms/wms.py: Moved the WMS layer into layer.py in
1647     order to establish a clean structure.
1648    
1649     * Extensions/wms/layer.py: Moved the WMS layer into a file on its
1650     own in order to establish a clean structure.
1651    
1652 joey 2174 2004-04-13 Martin Schulze <[email protected]>
1653    
1654     * Extensions/wms/parser.py (WMSCapabilitiesParser.grok): Added
1655     support for oldstyle (WMS 1.0 apparently) image format
1656     specification.
1657    
1658     * Extensions/wms/wms.py (WMSLayer.calcFormat): Reduce the list of
1659     supported graphic formats back to JPEG and BMP, PNG and others are
1660     too *cough* experimental... Sorry, I meant to filter this out
1661     before I committed this part. This should make the WMS extension
1662     run from CVS again.
1663     (wms_dialog): Reset an empty URL to None so that the subsequent
1664     program can depend on this, since the dialog will indeed return an
1665     empty URL, causing another declaration of love by Python.
1666    
1667     * Extensions/wms/parser.py (WMSCapabilitiesParser.getLayerBBox):
1668     Whenever a native BoundingBox request cannot be fulfilled, check
1669     whether the requested SRS is EPSG:3426, in which case return the
1670     LatLonBoundingBox values.
1671    
1672     * Extensions/wms/test/test_parser.py
1673     (TestWMSCapabilitiesParser.test_LayerSRS): Added a test for
1674     ignoring AUTO:* SRS.
1675     (TestWMSCapabilitiesParser.test_LatLonBoundingBoxes_as_bboxes):
1676     Added another test method to test whether the LatLonBoundingBox
1677     values will be returned if BoundingBox values are requested with
1678     SRS set to EPSG:3426.
1679    
1680     * Extensions/wms/parser.py (WMSCapabilitiesParser.peekLayers):
1681     Added rudimentary support for non-EPSG SRS, i.e. ignore them for
1682     the moment by placing them into a variable which is currently
1683     unused. Also test whether the EPSG SRS is numerical as it should
1684     be and add an error message if it is not.
1685    
1686     * Extensions/wms/test/sample.xml: Added AUTO:* SRS since they
1687     appear in the real world as well. Since we cannot handle them yet
1688     (OGCLib can't either), we will ignore them for the moment.
1689    
1690     * Extensions/wms/parser.py: Use a variable for denoting the sample
1691     filename
1692     (WMSCapabilitiesParser.peekLayers): Added support for error
1693     messages during grok(). They will be aggregated in an array and
1694     may be displayed later. We may have to add a classification
1695     "Warning" and "Error" to this. That requires more experience,
1696     though, since not every error may be lethal.
1697    
1698     * Thuban/UI/mainwindow.py (MainWindow.LayerShowTable): Raise the
1699     ShowTable() dialog/frame when the user attempts to display it
1700     while it has been opened before already and not closed again.
1701    
1702 joey 2161 2004-04-11 Martin Schulze <[email protected]>
1703    
1704     * Extensions/wms/infodialog.py: Adjusted the class documentation
1705    
1706     * Extensions/wms/wms.py (WMSLayer.__init__, WMSLayer.GetMapImg):
1707     Switch to using Thuban{Begin,End}BusyCursor instead of the pure
1708     wxWidgets variants.
1709     (WMSLayer.__init__): The epsg_id variable is named top_srs now.
1710    
1711     * Extensions/wms/infodialog.py: Added an information dialog that
1712     will display various information about the WMS current resource,
1713     so that additional information such as the title, the abstract,
1714     fees and access constraints can be displayed for the user if they
1715     are documented in the WMS XML.
1716    
1717 joey 2156 2004-04-10 Martin Schulze <[email protected]>
1718    
1719     * Extensions/wms/parser.py (WMSCapabilitiesParser.grok): Adjusted
1720     string handling. It's "foo".lower() and not lower(foo) without
1721     lower imported from strings or something.
1722    
1723     * Extensions/wms/wms.py (WMSLayer): Incorporated WMSCapabilities
1724     from capabilities.py and parser.py. Implement priority list for
1725     supported graphics formats, take care of wbmp != bmp. PNG, TIFF
1726     and GIF are supported here, but not yet by main Thuban. Hence,
1727     support for them may be removed later. Special contribution to
1728     usability: get wxWidgets to change the cursor when we're waiting
1729     for data from the network so the user won't start to worry. This
1730     causes a redrawing error/warning, though.
1731    
1732     * Extensions/wms/parser.py (WMSCapabilitiesParser.grok): Unlink
1733     the DOM object.
1734    
1735     2004-04-01 Martin Schulze <[email protected]>
1736    
1737     * Extensions/wms/capabilities.py: Adjusted documentation
1738     (WMSCapabilities.__init__): Improved documentation, fixed syntax
1739     (WMSCapabilities.saveCapabilities): Only catch IOError when
1740     handling files
1741     (WMSCapabilities.loadCapabilities): Only catch IOError when
1742     handling files
1743     __main__: corrected variable naming
1744     (WMSCapabilities.fetchCapabilities,loadCapabilities): Make this
1745     class a specialisation of WMSCapabilitiesParser as well. Also
1746     execute grok() after loading or fetching capabilities, if that
1747     went well, so that subsequent calls can already access the data.
1748     (WMSCapabilities.getVersion): Export the used version of the
1749     GetCapabilities request, so we can use it for subsequent calls,
1750     i.e. for GetMap requests.
1751     (WMSCapabilities.fetchCapabilities): Added proper error handling
1752     when the GetCapabilities request failed, so that the surrounding
1753     program can act accordingly.
1754    
1755 joey 2146 2004-03-30 Martin Schulze <[email protected]>
1756    
1757     * Extensions/wms/parser.py (WMSCapabilitiesParser.getLayerSRS):
1758     Adjusted the getLayerSRS method to return the list of SRSes
1759     extracted from <SRS> elements instead of <BoundingBox> elements.
1760     Added a bit of documentation as well.
1761     (WMSCapabilitiesParser.checkLayerSRS): Removed integrity test
1762     since it was only implemented due to a misunderstanding.
1763    
1764     * Extensions/wms/test/test_parser.py
1765     (TestWMSCapabilitiesParser.test_LayerSRS): Adjust the tests to
1766     reflect the corrected interpretation of the standard: i.e. a layer
1767     does not have to define a BoundingBox for all SRSes it supports.
1768     Hence the <SRS></SRS> specification is authoritative, not the list
1769     of BoundingBoxes.
1770     (TestWMSCapabilitiesParser.test_BoundingBoxes): Added a new test
1771     to ensure None is returned for a non-existing SRS.
1772     (TestWMSCapabilitiesParser.test_grok): Removed test_grok method
1773     since it is not applicable anymore. Listing more SRSes in <SRS>
1774     elements is valid according to the specs.
1775    
1776 bernhard 2140 2004-03-26 Bernhard Reiter <[email protected]>
1777 joey 2146
1778 bernhard 2140 * README: Nicer formatting of text. Improved descriptions.
1779     Reflected wxWidgets name change.
1780    
1781     * Thuban/UI/about.py: Extended copyright to 2004 and added
1782     information about the thuban-devel mailinglist.
1783    
1784 joey 2138 2004-03-24 Martin Schulze <[email protected]>
1785 joey 2120
1786 joey 2138 * Extensions/wms/capabilities.py: Renamed the class to contain
1787     'WMS', also added a linebreak where required
1788    
1789     * Extensions/wms/parser.py: Finally added the XML parser for the
1790     GetCapabilities response.
1791    
1792     * Extensions/wms/test/sample.xml: Adjusted the sample file so that
1793     <SRS> elements match the <BoundingBox> elements, except for the
1794     layer 'beschriftung'.
1795    
1796     * Extensions/wms/test/test_parser.py: Encode non-ascii strings
1797     since Python uses unicode strings internally, otherwise
1798     comparisons will fail. Removed tests for getLayerBBoxSRS() since
1799     the SRS will be calculated anyway and this method is obsoleted by
1800     getLayerSRS(). Denote SRS as strings and not as cardinal numbers.
1801     Move loading the sample file into the setUp method. Added a test
1802     for finding the integrity problem in the sample response.
1803     Improved formatting.
1804    
1805     * Extensions/wms/domutils.py: Added convenience routines for
1806     handling of Document Object Model (DOM) nodes.
1807    
1808     * Extensions/wms/test/test_domutils.py: Added a test for the
1809     domutils module
1810    
1811     2004-03-19 Martin Schulze <[email protected]>
1812    
1813 joey 2120 * Extensions/wms/test/test_parser.py (TestWMSCapabilitiesParser):
1814     Moved path detection and adding into a module of its own,
1815     adjustpath, which exports thubandir as main Thuban directory.
1816    
1817     * Extensions/wms/test/test_ogclib.py (TestWMSLib): Moved path
1818     detection and adding into a module of its own, adjustpath, which
1819     exports thubandir as main Thuban directory. Reorganised the
1820     module in order to support the SkipTest feature for Thuban test
1821     cases.
1822    
1823     * Extensions/wms/test/adjustpath.py: Moved path detection and
1824     adding into a module of its own.
1825    
1826 joey 2115 2004-03-18 Martin Schulze <[email protected]>
1827    
1828     * Extensions/wms/test/test_parser.py: Added another test for
1829     checking whether the WMS XML parser (to be implemented) returns
1830     the information we expect. This requires a sample WMS WML file
1831     (sample.xml) which has been extracted from the frida server and
1832     "improved" manually.
1833    
1834     * Extensions/wms/test/test_ogclib.py: Added legacy code to add the
1835     main Thuban directory to the path in order to be able to import
1836     random modules. Adjusted the PyOGCLib detection to reuse the
1837     information gathered. Also added a note about the PYTHONPATH
1838     environment variable.
1839    
1840     * Extensions/wms/test/test_ogclib.py: The format specification is
1841     a mime-type, not a graphic format, hence image/jpeg wou ld be the
1842     proper format and not JPEG. We'll also have to take care of the
1843     encoding of / as %2F.
1844    
1845 joey 2111 2004-03-16 Martin Schulze <[email protected]>
1846    
1847     * Extensions/wms/test/test_ogclib.py: Added a (hopefully)
1848     comprehensive test for the getMapURL method, built compare URLs
1849     according to the documentation in OGC 01-068r3
1850    
1851     * Extensions/wms/capabilities.py (WMSCapabilities): Added the
1852     class WMSCapabilities to manage capabilites, will incorporate
1853     parsing the capabilities response and provide details for other
1854     classes.
1855    
1856 bh 2105 2004-03-12 Bernhard Herzog <[email protected]>
1857    
1858 bh 2107 Support views in addition to normal tables in the postgis
1859     shapestore
1860    
1861     * Thuban/Model/postgisdb.py
1862     (PostGISShapeStore._fetch_table_information): Add a fallback for
1863     the case where the table name is not in the geometry_columns
1864     table. This is usually the case for views. Also, set
1865     self.shapestore here.
1866     (PostGISShapeStore.ShapeType): No need to query the database all
1867     the time. The shape type is now determined in
1868     _fetch_table_information
1869    
1870     * test/postgissupport.py (PostgreSQLServer.new_postgis_db)
1871     (PostgreSQLServer.get_static_data_db, PostGISDatabase.__init__):
1872     New parameter to specify views.
1873     (PostGISDatabase.has_data): Also compare the views. New views
1874     parameter
1875     (PostGISDatabase.initdb): Create the views.
1876     (PostgreSQLServer.get_default_static_data_db): Add the v_landmarks
1877     view
1878    
1879     * test/test_postgis_db.py
1880     (TestPostGISShapestorePointFromViews): New. Test a
1881     PostGISShapeStore with a view
1882     (TestPostGISShapestorePointOIDAsGIDColumn.setUp): Pass the name of
1883     the geometry_column explicitly to test whether that works
1884    
1885     2004-03-12 Bernhard Herzog <[email protected]>
1886    
1887 bh 2105 Final step for explicit id/geometry columns: Loading and saving
1888    
1889     * Resources/XML/thuban-1.1.dtd: New. Derived from thuban-1.0.dtd
1890     with the following changes:
1891     (dbshapesource): Two new attributes id_column and geometry_column
1892    
1893     * Thuban/Model/save.py (SessionSaver.write): Use the new dtd
1894     (SessionSaver.write_session): Use the new namespace
1895     (SessionSaver.write_data_containers): Write the new dbshapesource
1896     parameters
1897    
1898     * Thuban/Model/load.py (SessionLoader.__init__): New namespace for
1899     the new file format version
1900     (SessionLoader.start_dbshapesource): Handle the new db parameters
1901    
1902     * test/test_save.py: Update to the new dtd and namespace
1903     (SaveSessionTest.test_save_postgis): Update the NonConnectionStore
1904     mock object to provide a working IDColumn method.
1905    
1906     * test/test_load_1_0.py: New. Copy of the test_load.py before
1907     today's changes but with the round-trip tests removed.
1908    
1909     * test/test_load_0_9.py: Update doc-string.
1910    
1911     * test/test_load.py: Update all .thuban files to the new dtd and
1912     namespace.
1913     (TestPostGISLayer.file_contents): Add the new dbshapesource
1914     paramters
1915    
1916 bh 2100 2004-03-11 Bernhard Herzog <[email protected]>
1917    
1918 bh 2103 Next step for explicit id/geometry columns: User interaction
1919    
1920     * Thuban/UI/dbdialog.py (ChooseDBTableDialog.__init__): Rework how
1921     the dialog is constructed. Add combo boxes to select id and
1922     geometry column. Rename some instance variables.
1923     (ChooseDBTableDialog.GetTable): Return id and geometry column
1924     names
1925     (ChooseDBTableDialog.OnTableSelect): New. Event handler for
1926     selections in the table list
1927    
1928     * Thuban/UI/mainwindow.py (MainWindow.AddDBLayer): Use id_column
1929     and geometry_column
1930    
1931     * Thuban/Model/session.py (Session.OpenDBShapeStore): Add the new
1932     parameters for id_column and geometry column of PostGISShapeStore
1933     here as well.
1934    
1935     * Thuban/Model/postgisdb.py (type_map): Add ROWID psycog type.
1936     (_raw_type_map): New. Map raw PostgreSQL type ints to thuban types
1937     (PostGISConnection.GeometryTables): Use a better query to
1938     determine which relations in the database might be usable for
1939     shapestores. Now supports views as well but is more PostgreSQL
1940     specific
1941     (PostGISConnection.table_columns): New. Somewhat experimental
1942     method to let the db dialogs provide lists of columns to users so
1943     that they can select id and geometry columns.
1944     (PostGISTable.__init__): The default value of the id_column
1945     parameter is now None it still means "gid" effectively, though.
1946     (PostGISTable.IDColumn): New introspection method to return a
1947     column object for the id column
1948     (PostGISShapeStore.GeometryColumn): New introspection method to
1949     return a column object for the geometry column
1950    
1951     * test/test_postgis_db.py
1952     (TestPostGISConnection.test_gis_tables_non_empty):
1953     Removed. Subsumed by the new:
1954     (TestPostGISConnection.test_gis_tables_with_views_and_tables):
1955     New. Tes the GeometryTables and table_columns methods with actual
1956     tables and views.
1957     (PointTests.test_id_column, PointTests.test_geometry_column):
1958     New. tests for the new methods.
1959     (TestPostGISShapestorePoint.setUp)
1960     (TestPostGISShapestorePointSRID.setUp)
1961     (TestPostGISShapestorePointExplicitGIDColumn.setUp): Fill the
1962     instance variables needed by the new tests
1963    
1964     2004-03-11 Bernhard Herzog <[email protected]>
1965    
1966 bh 2100 * Thuban/UI/classgen.py (GenQuantilesPanel.GetList): The row
1967     numbers given to ReadValue are ordinals.
1968    
1969     2004-03-11 Bernhard Herzog <[email protected]>
1970    
1971     Elimiate the requirement for PostGIS tables to have a column
1972     called "gid".
1973    
1974     * Thuban/Model/postgisdb.py (PostGISTable.__init__): New parameter
1975     id_column to specify which column to use to identify rows. Also
1976     new instance variables id_column and quoted_id_column
1977     (PostGISTable.RowIdToOrdinal, PostGISTable.RowOrdinalToId)
1978     (PostGISTable.ReadRowAsDict, PostGISTable.ReadValue)
1979     (PostGISTable.SimpleQuery): Use the id column name provided to the
1980     constructor instead of "gid"
1981     (PostGISShapeStore.__init__): New parameter id_column analogously
1982     to PostGISTable.__init__. This parameter is simply passed through
1983     to the base class constructor
1984     (PostGISShapeStore._create_col_from_description): Fix typo in
1985     doc-string
1986     (PostGISShapeStore.Shape, PostGISShapeStore.AllShapes)
1987     (PostGISShapeStore.ShapesInRegion): Use the id column name
1988     provided to the constructor instead of "gid"
1989    
1990     * test/postgissupport.py
1991     (PostgreSQLServer.get_default_static_data_db): New static table
1992     landmarks_point_id with an id column != "gid. Update the comments
1993     a bit.
1994     (skip_if_addgeometrycolumn_does_not_use_quote_ident): Fix typo in
1995     doc-
1996     (upload_shapefile): New parameter gid_column to use a name other
1997     than "gid" for the column to store the shape ids
1998    
1999     * test/test_postgis_db.py (TableTests): New. Mixin-class
2000     containing all tests previously in TestPostGISTable. The actual
2001     tests are the same but the code is a bit more configurable to
2002     allow for different id columns etc.
2003     (TestPostGISTable): Derive from TableTests now for the actual
2004     tests.
2005     (TestPostGISTableExplicitGIDColumn): New. Like TestPostGISTable
2006     except that it the landmarks_point_id table to test the id_column
2007     parameter
2008     (PointTests): Extend the doc-string
2009     (TestPostGISShapestorePointExplicitGIDColumn)
2010     (TestPostGISShapestorePointOIDAsGIDColumn): New classes derived
2011     from PointTests to test the explicit id_column parameter. One
2012     tests with the name of the column holding the shape ids, the other
2013     uses PostgreSQL's OID column. For the latter a number of methods
2014     have to be overwritten to make them independent of the actual id
2015     values.
2016    
2017 silke 2095 2004-03-08 Silke Reimer <[email protected]>
2018    
2019     Update debian directory:
2020    
2021     * debian/changelog: Added new version.
2022     * deiban/rules: Updated management of patches (with cbds)
2023     * debian/control: Added cbds to dependencies
2024     * debian/patches/*: New. Adds better support for patches of thuban in
2025     debian
2026     * debian/menu: Syntax of menu changed slightly
2027     * debian/setup.py.patch: removed because it has been moved to
2028     debian/patechs/setup.py.patch
2029    
2030    
2031 bh 2094 2004-02-26 Bernhard Herzog <[email protected]>
2032    
2033     Create the Doc/technotes directory for text files with information
2034     for developers
2035    
2036     * Doc/technotes/README: New. README for the technotes
2037    
2038     * Doc/technotes/coding_guidelines.txt: New. Coding guidelines for
2039     Thuban
2040    
2041     * Doc/technotes/release_process.txt: New. Used to be
2042     HOWTO-Release. Now slightly adapted to technote formatting style.
2043    
2044     * HOWTO-Release: Removed. It's contents are now in
2045     Doc/technotes/release_process.txt
2046    
2047 bh 2089 2004-02-25 Bernhard Herzog <[email protected]>
2048    
2049     * libraries/thuban/wxproj.cpp (get_wx_version): New. Return the
2050     version of wxWindows the module was compiled with so we can check
2051     that against the wxPython version.
2052    
2053     * Thuban/version.py (thuban_branch, thuban_release): New variables
2054     controlling which and how Thuban versions are shown. See the
2055     comments for details.
2056     (verify_versions): Also check that the wx version that wxproj is
2057     compiled against matches that of the wxPython we use at runtime
2058    
2059 bh 2080 2004-02-20 Bernhard Herzog <[email protected]>
2060    
2061 bh 2087 * Extensions/wms/wms.py (epsg_code_to_projection): Use
2062     get_system_proj_file to read the epsg projections. The old way
2063     depended on the current directory being the top Thuban directory.
2064    
2065     2004-02-20 Bernhard Herzog <[email protected]>
2066    
2067 bh 2085 * Extensions/svgexport/test/test_svgmapwriter.py
2068     (TestVirtualDC.test_clippath): Remove a debug print
2069    
2070     2004-02-20 Bernhard Herzog <[email protected]>
2071    
2072 bh 2083 * Extensions/svgexport/__init__.py: New. Turn
2073     Extensions/svgexport into a package.
2074    
2075     * Extensions/svgexport/svgmapwriter.py: Reorder the imports and
2076     doc-string a bit. The doc-string must come first, otherwise it's
2077     not a doc-string. The __future__ import must be the first thing
2078     after the doc-string. Use only double quotes in doc-strings.
2079     Single quotes trip up emacs syntax highlighting if the text
2080     contains apostrophes.
2081    
2082     2004-02-20 Bernhard Herzog <[email protected]>
2083    
2084 bh 2080 * Extensions/svgexport/test/__init__.py,
2085     Extensions/svgexport/test/test_svgmapwriter.py: New. Initial test
2086     suite for svgexport
2087    
2088     * test/runtests.py (find_test_modules): New. Function with the
2089     module finding code from main.
2090     (main): Use find_test_modules to figure out the default test
2091     modules and take modules from Extensions.svgexport.test too.
2092    
2093 bh 2075 2004-02-19 Bernhard Herzog <[email protected]>
2094    
2095 bh 2077 * Thuban/UI/application.py (ThubanApplication.OnInit): Make sure
2096     the mainwindow has a reference to the map of the initial session.
2097     This fixes a bug introduced with the fix for RT#2245
2098    
2099     2004-02-19 Bernhard Herzog <[email protected]>
2100    
2101 bh 2075 * Extensions/svgexport/svgsaver.py,
2102     Extensions/svgexport/svgmapwriter.py,
2103     Extensions/svgexport/maplegend.py: Added again. This time in the
2104     correct place.
2105    
2106 bh 2070 2004-02-17 Bernhard Herzog <[email protected]>
2107    
2108 bh 2073 Fix for RT#2245
2109    
2110     * Thuban/UI/application.py (ThubanApplication.OnInit): Initialize
2111     instance variables before trying to create any windows. Creating
2112     windows can start an event loop if e.g. message boxes are popped
2113     up for some reason, and event handlers, especially EVT_UPDATE_UI
2114     may want to access things from the application.
2115     (ThubanApplication.maps_changed): The mainwindow may not have been
2116     created yet, so check whether it has been created before calling
2117     its methods
2118    
2119     * Thuban/UI/view.py (MapCanvas.OnIdle): Only try to redraw if we
2120     have a map
2121    
2122     2004-02-17 Bernhard Herzog <[email protected]>
2123    
2124 bh 2070 * test/test_svgmapwriter.py, Extensions/svgsaver.py,
2125     Extensions/svgmapwriter.py, Extensions/maplegend.py,
2126     extensions/svgexport/svgsaver.py,
2127     extensions/svgexport/svgmapwriter.py,
2128     extensions/svgexport/maplegend.py: Removed. These files were in
2129     the wrong places or didn't work at all.
2130    
2131 bh 2067 2004-02-16 Bernhard Herzog <[email protected]>
2132    
2133 bh 2069 * Thuban/UI/view.py (MapCanvas.Export): Remove accidentally added
2134     line
2135    
2136     2004-02-16 Bernhard Herzog <[email protected]>
2137    
2138 bh 2067 * Thuban/UI/view.py (MapCanvas.Export): Avoid UnboundLocalError.
2139    
2140 mrechtie 2064 2004-02-15 Markus Rechtien <[email protected]>
2141    
2142     * Extensions/svgexport/svgmapwriter.py: New. Adds the capability
2143     to write a session to a file in SVG format.
2144     * Extensions/svgexport/svgsaver.py: New. Uses svgmapwriter.py
2145     to write a SVG map of a session.
2146     * Extensions/svgexport/maplegend: New. Writes a basic maplegend
2147     in SVG format for the current session.
2148    
2149 bh 2062 2004-02-13 Bernhard Herzog <[email protected]>
2150    
2151     * Thuban/UI/mainwindow.py (MainWindow.AddDBLayer): When the layer
2152     can't be created, return immediately after displaying the error
2153     message.
2154    
2155 bh 2060 2004-02-11 Bernhard Herzog <[email protected]>
2156    
2157     Handle postgis tables with more than one geometry column.
2158    
2159     * Thuban/Model/postgisdb.py
2160     (PostGISTable._fetch_table_information): Delegate the creation of
2161     column objects to a different method so that we can extend that in
2162     derived classes
2163     (PostGISTable._create_col_from_description): New. Column object
2164     creation part of _fetch_table_information
2165     (PostGISShapeStore._create_col_from_description): New. Extend
2166     inherited method to handle geometry columns
2167     (PostGISShapeStore.__init__): New parameter geometry_column to
2168     specify which geometry column to use. Optional but mandatory for
2169     tables with more than one geometry column
2170     (PostGISShapeStore._fetch_table_information): Also use the name of
2171     the geometry column when looking for the srid
2172     (PostGISShapeStore.ShapeType): Also use the name of the geometry
2173     column when looking for the shape type
2174    
2175     * test/test_save.py (SaveSessionTest.test_save_postgis): Adapt
2176     NonConnectionStore to changes in the PostGISShapeStore
2177    
2178     * test/test_postgis_db.py
2179     (TestPostGISSpecialCases.test_shapestore_two_geom_cols): Test
2180     PostGISShapeStore with tables having two geometry columns.
2181    
2182 bh 2058 2004-02-10 Bernhard Herzog <[email protected]>
2183    
2184     Fix some postgis problems. What remains to be done is real
2185     handling of SRIDs as they affect how reprojection is done
2186    
2187     * Thuban/Model/postgisdb.py (quote_identifier): Fix typo in
2188     doc-string
2189     (PostGISShapeStore._fetch_table_information): New. Extend
2190     inherited method to retrieve srid
2191     (PostGISShapeStore.BoundingBox): Handle tables without data.
2192     extent yields NULL for those
2193     (PostGISShapeStore.ShapesInRegion): Use the srid of the table.
2194    
2195     * test/test_postgis_db.py
2196     (TestPostGISSpecialCases.test_shapestore_empty_table): New test
2197     for the special case of a table without any data
2198     (TestPostGISShapestorePointSRID): New class with tests for a table
2199     that uses srids
2200     (PolygonTests): Fix a doc-string typo
2201    
2202     * test/postgissupport.py (PostGISDatabase.__init__): New parameter
2203     reference_systems with a specification of spacial reference
2204     systems to create in the new db.
2205     (PostgreSQLServer.new_postgis_db)
2206     (PostgreSQLServer.get_static_data_db): New parameter
2207     reference_systems to be passed through ultimately to
2208     PostGISDatabase. In new_postgis_db also check whether an existing
2209     db already has the right srids
2210     (PostgreSQLServer.get_default_static_data_db): Add srids and a
2211     table that uses srids
2212     (PostGISDatabase.initdb): Create the entries for the reference
2213     systems
2214     (PostGISDatabase.has_data): Add reference_systems parameter to
2215     check for those too
2216     (upload_shapefile): New parameter srid to create tables with a
2217     specific srid
2218    
2219 frank 2055 2004-02-06 Frank Koormann <[email protected]>
2220    
2221     * po/pt_BR.po: Fixed charset
2222    
2223 frank 2054 2004-02-05 Frank Koormann <[email protected]>
2224    
2225     * po/pt_BR.po: Fixed format string for error message, missing %s
2226     added (Thuban/UI/application.py:273)
2227    
2228 frank 2053 2004-02-03 Frank Koormann <[email protected]>
2229    
2230     First version of Portuguese (Brazilian) translation
2231    
2232     * po/pt_BR.po: New, translation of pot (2004-01-15 16:07+0300) for
2233     Brazilian Portuguese by Eduardo Patto Kanegae.
2234    
2235     * Thuban/UI/about.py (About.__init.py__): Added Eduardo to the list of
2236     translators.
2237    
2238    
2239 frank 2052 2004-01-22 Frank Koormann <[email protected]>
2240    
2241     * Doc/manual/thuban-manual.xml: Added section on installation of
2242     Thuban under Win32 systems. Fixed image path references in the postgis
2243     section. Some minor source formattings.
2244    
2245 frank 2051 2004-01-21 Frank Koormann <[email protected]>
2246    
2247     Make Thuban remember path selections (at least for one application run).
2248    
2249     * Thuban/UI/application.py (Application.OnInit): Initialize path as a
2250     attribute of application object. Path is a dictionary of
2251     strings, currently with the items "data" and "projection".
2252     (Application.SetPath): New, stores path for the specified item.
2253     (Application.Path): New, return path for the specified item.
2254    
2255     * Thuban/UI/mainwindow.py
2256     (MainWindow.OpenSession, MainWindow.SaveSessionAs,
2257     MainWindow.AddLayer, MainWindow.AddRasterLayer,
2258     MainWindow.TableOpen): Access "data" path information of the
2259     application.
2260    
2261     * Thuban/UI/projdialog.py (ProjFrame._OnImport, ProjFrame._OnExport):
2262     Access "projection" path information of the application.
2263    
2264 bh 2048 2004-01-05 Bernhard Herzog <[email protected]>
2265    
2266 bh 2050 * po/ru.po: Updated translations from Alex Shevlakov
2267    
2268     2004-01-05 Bernhard Herzog <[email protected]>
2269    
2270 bh 2048 * po/Makefile, po/README: Move the description of how to generate
2271     the translation statistics to the README.
2272    
2273 bh 2042 2003-12-23 Bernhard Herzog <[email protected]>
2274    
2275 bh 2045 * NEWS: Update for 1.0.0
2276    
2277     * po/it.po: Another update from Maurizio Napolitano
2278    
2279     2003-12-23 Bernhard Herzog <[email protected]>
2280    
2281 bh 2042 * po/it.po: Updated translation from Maurizio Napolitano
2282    
2283     2003-12-23 Bernhard Herzog <[email protected]>
2284    
2285     * Thuban/UI/join.py (JoinDialog.__init__): Mark one more string
2286     for translation
2287    
2288     * Thuban/UI/mainwindow.py (MainWindow.TableRename)
2289     (MainWindow.RenameMap, MainWindow.RenameLayer): Mark some more
2290     strings for translation
2291    
2292     * po/de.po: Update with the newly marked strings.
2293    
2294 bh 2033 2003-12-22 Bernhard Herzog <[email protected]>
2295    
2296 bh 2039 * HOWTO-Release: Fix the places where version numbers have to be
2297     updated
2298    
2299     2003-12-22 Bernhard Herzog <[email protected]>
2300    
2301 bh 2037 * setup.py (setup call): 1.0.0, yeah!
2302    
2303     * Thuban/version.py (longversion): 1.0.0, yeah!
2304    
2305     * Thuban/Model/load.py (SessionLoader.__init__): Accept the
2306     1.0.0 namespace too
2307    
2308     * Thuban/Model/save.py (SessionSaver.write_session): Save with
2309     1.0.0 namespace
2310    
2311     * test/test_load.py (LoadSessionTest.dtd)
2312     (TestSingleLayer.file_contents)
2313     (TestNonAsciiColumnName.file_contents)
2314     (TestLayerVisibility.file_contents)
2315     (TestClassification.file_contents, TestLabels.file_contents)
2316     (TestLayerProjection.file_contents)
2317     (TestRasterLayer.file_contents, TestJoinedTable.file_contents)
2318     (TestLabelLayer.file_contents, TestPostGISLayer.file_contents)
2319     (TestPostGISLayerPassword.file_contents)
2320     (TestLoadError.file_contents, TestLoadError.test): Update for
2321     1.0.0 namespace
2322    
2323     * test/test_save.py (SaveSessionTest.dtd)
2324     (SaveSessionTest.testEmptySession)
2325     (SaveSessionTest.testSingleLayer)
2326     (SaveSessionTest.testLayerProjection)
2327     (SaveSessionTest.testRasterLayer)
2328     (SaveSessionTest.testClassifiedLayer)
2329     (SaveSessionTest.test_dbf_table)
2330     (SaveSessionTest.test_joined_table)
2331     (SaveSessionTest.test_save_postgis): Update for 1.0.0 namespace
2332    
2333     2003-12-22 Bernhard Herzog <[email protected]>
2334    
2335 bh 2035 * Thuban/Model/load.py (SessionLoader.start_label): Make sure the
2336     alignment flags are byte strings not unicode and that they have
2337     valid values
2338    
2339     * test/test_load.py (TestLabelLayer): New. Test loading (and
2340     indirectly saving) of maps with labels.
2341    
2342     2003-12-22 Bernhard Herzog <[email protected]>
2343    
2344 bh 2033 * Thuban/UI/tableview.py (TableGrid.OnDestroy)
2345     (TableGrid.__init__): Handle EVT_WINDOW_DESTROY in the grid to
2346     unsubscribe all subscribers.
2347     (LayerTableFrame.OnDestroy): Do not unsubscribe any messages from
2348     self.grid since it may already have been destroyed.
2349     Fixes RT #2256
2350    
2351 bh 2031 2003-12-19 Bernhard Herzog <[email protected]>
2352    
2353     * po/fr.po, po/es.po: Updated translations from Daniel Calvelo
2354    
2355 bh 2028 2003-12-16 Bernhard Herzog <[email protected]>
2356 silke 2029
2357     * debian/bitmappath.patch, debian/setup.py.patch:
2358     added to ensure compliance with FHS for debian
2359     * debian/rules, debian/changelog:
2360     added patches in rules to ensure compliance with FHS for debian
2361 bh 2028
2362 silke 2029 2003-12-16 Bernhard Herzog <[email protected]>
2363    
2364 bh 2028 * po/Makefile (mo): Make the output a bit nicer so that it prints
2365     statistics about the translations. Add a comment how produce even
2366     nicer statistics with sed.
2367    
2368 frank 2026 2003-12-09 Frank Koormann <[email protected]>
2369    
2370     * Resources/Projections/defaults.proj:
2371     French projection sample with correct accents (UNICODE).
2372    
2373 bh 2025 2003-12-05 Bernhard Herzog <[email protected]>
2374    
2375     * MANIFEST.in: Add the devtools directory
2376    
2377     * setup.py (setup call): Use license instead of licence. This
2378     silences a deprecation warning on Python 2.3
2379    
2380 frank 2022 2003-12-05 Frank Koormann <[email protected]>
2381    
2382 frank 2023 Documentation synced with 1.0rc1
2383    
2384     * Doc/manual/thuban-manual.xml:
2385     Minor formatting changes and references to database layers .
2386     Introduction.Internationalization: New section on i18n.
2387     MapManagement.AddingandRemovingLayers: Added item on database layers.
2388     MapManagement.TheLegend: Added section and screenshot on popup menu.
2389     ProjectionManagement: Updated screenshot and sentence on EPSG.
2390     Appendix.SupportedDataSources: Added PostGIS.
2391     Appendix.WorkingwithPostGIS: New section.
2392    
2393     * Doc/manual/images/6_projection.png: Updated screenshot including
2394     EPSG checkboxes.
2395    
2396     * Doc/manual/images/3_5_popup_menu.png: New, popup menu screenshot.
2397    
2398     * Doc/manual/images/app_postgis_add_layer.png,
2399     Doc/manual/images/app_postgis_db_add.png,
2400     Doc/manual/images/app_postgis_db_management.png:
2401     New screenshots focussing on database layers
2402    
2403     2003-12-05 Frank Koormann <[email protected]>
2404    
2405 frank 2022 * Thuban/UI/projdialog.py (load_user_proj): If user.proj is missing
2406     write warning to stderr instead of rising a warning dialog
2407    
2408 bh 2016 2003-12-03 Bernhard Herzog <[email protected]>
2409    
2410 bh 2021 Fix for RT #2243
2411    
2412 bh 2020 * Thuban/UI/mainwindow.py (MainWindow.has_selected_shape_layer):
2413     New. Like has_selected_layer but for shape layers only
2414     (_has_selected_shape_layer): New. Like _has_selected_layer but for
2415     shape layers only
2416     (layer_show_table command, layer_jointable command): Use these
2417     commands should only be available for shape layers
2418    
2419     2003-12-03 Bernhard Herzog <[email protected]>
2420    
2421 bh 2018 * Thuban/UI/mainwindow.py (MainWindow.Unsubscribe): Deal with
2422     publishers that are wx objects and may have been destroyed by wx
2423     already. Fixes RT #2242.
2424    
2425     2003-12-03 Bernhard Herzog <[email protected]>
2426    
2427 bh 2016 * po/ru.po: Updates from Alex Shevlakov
2428    
2429 silke 2013 2003-12-03 Silke Reimer <silkeintevation.de>
2430    
2431     * debian/control, debian/changelog: Added gdal-support to
2432     debian package, updated to new thuban version
2433    
2434    
2435 bh 2012 2003-12-03 Bernhard Herzog <[email protected]>
2436    
2437     * Thuban/Lib/version.py: New. Module for version number
2438     manipulations. The version of make_tuple here also deals better
2439     with more unusual version number strings, such as e.g.
2440     "1.2+cvs20031111"
2441    
2442     * Thuban/version.py (make_tuple): Removed. It's now in
2443     Thuban.Lib.version. Use that implementation instead.
2444    
2445     * test/test_lib_version.py: New. Tests for Thuban/Lib/version.py
2446    
2447 bh 2005 2003-12-02 Bernhard Herzog <[email protected]>
2448    
2449 bh 2010 * MANIFEST.in: Add debian files
2450    
2451 bh 2008 * setup.py (setup call): Add packages for the Extensions so that
2452     they're installed too
2453     (data_files): Add READMEs and sample data from some Extensions
2454    
2455     * NEWS: Add note about the extensions in binary packages
2456    
2457     2003-12-02 Bernhard Herzog <[email protected]>
2458    
2459 bh 2005 * Thuban/Model/save.py (SessionSaver.write_session): Save files
2460     with the thuban-1.0rc1
2461    
2462     * Thuban/Model/load.py (SessionLoader.__init__): Recognize the
2463     thuban-1.0rc1 namespace too
2464    
2465     * test/test_save.py (SaveSessionTest.dtd)
2466     (SaveSessionTest.testEmptySession)
2467     (SaveSessionTest.testSingleLayer)
2468     (SaveSessionTest.testLayerProjection)
2469     (SaveSessionTest.testRasterLayer)
2470     (SaveSessionTest.testClassifiedLayer)
2471     (SaveSessionTest.test_dbf_table)
2472     (SaveSessionTest.test_joined_table)
2473     (SaveSessionTest.test_save_postgis): Update to thuban-1.0rc1
2474     namespace
2475    
2476     * test/test_load.py (LoadSessionTest.dtd): Update to thuban-1.0rc1
2477     namespace
2478     (TestSingleLayer.file_contents)
2479     (TestNonAsciiColumnName.file_contents)
2480     (TestLayerVisibility.file_contents)
2481     (TestClassification.file_contents, TestLabels.file_contents)
2482     (TestLayerProjection.file_contents)
2483     (TestRasterLayer.file_contents, TestJoinedTable.file_contents)
2484     (TestPostGISLayer.file_contents)
2485     (TestPostGISLayerPassword.file_contents)
2486     (TestLoadError.file_contents, TestLoadError.test): Update to
2487     thuban-1.0rc1 namespace
2488    
2489 bh 1996 2003-12-01 Bernhard Herzog <[email protected]>
2490    
2491 bh 2003 * setup.py (proj4_prefix, wx_prefix, gdal_prefix): Fix these for
2492     nt to better match Intevation's current w32 setup
2493    
2494 bh 2001 * HOWTO-Release: Add note about updating MANIFEST.in
2495    
2496     * MANIFEST.in: Add the Extensions
2497    
2498 bh 1998 * NEWS: Update for 1.0rc1
2499    
2500     2003-12-01 Bernhard Herzog <[email protected]>
2501    
2502 bh 1996 * Thuban/UI/mainwindow.py (MainWindow.AddLayer): Change the wild
2503     cards for the dialog so that shapefiles ending in all uppercase
2504     SHP are listed too
2505    
2506 bh 1988 2003-11-28 Bernhard Herzog <[email protected]>
2507    
2508 bh 1996 * Thuban/version.py (longversion): Update to 1.0rc1
2509    
2510     * setup.py (setup call): Update version to 1.0rc1. Use the
2511     [email protected] email address as author email instead of my
2512     personal one.
2513    
2514     2003-11-28 Bernhard Herzog <[email protected]>
2515    
2516 bh 1992 * po/de.po: Update german translation.
2517    
2518     2003-11-28 Bernhard Herzog <[email protected]>
2519    
2520 bh 1990 Unify the filenames stored in .thuban files so that the .thuban
2521     files are more platform independend
2522    
2523     * Thuban/Model/save.py (unify_filename): New. Unify filenames so
2524     that they can be used on both windows and unix
2525     (SessionSaver.prepare_filename): New. Handle all filename
2526     transformations for filenames stored in the thuban file
2527     (SessionSaver.write_data_containers, SessionSaver.write_layer):
2528     Use prepare_filename
2529    
2530     * test/test_save.py (SaveSessionTest.testSingleLayer)
2531     (SaveSessionTest.testLayerProjection)
2532     (SaveSessionTest.testRasterLayer)
2533     (SaveSessionTest.testClassifiedLayer)
2534     (SaveSessionTest.test_dbf_table)
2535     (SaveSessionTest.test_joined_table): Filenames are always stored
2536     with slashes on all currently supported platforms so adapt all
2537     tests to this
2538    
2539     * test/test_load.py (LoadSessionTest.filenames): With the new
2540     filename scheme the filenames in the tests should be
2541     understandable on all currently supported platforms so we turn
2542     this into an empty list because we don't have to normalize them
2543     anymore
2544    
2545     2003-11-28 Bernhard Herzog <[email protected]>
2546    
2547 bh 1988 * test/test_layer.py (TestLayer.test_arc_layer_with_projection):
2548     Add the ellipsoid to the projection since some Proj versions
2549     complain if it's missing.
2550    
2551 bh 1984 2003-11-27 Bernhard Herzog <[email protected]>
2552    
2553     Corect some bounding box projection problems
2554    
2555     * Thuban/Model/proj.py (Projection.InverseBBox): New. Inverse
2556     version of ForwardBBox
2557     (Projection._transform_bbox): New. common implementation of
2558     ForwardBBox and InverseBBox
2559     (Projection.ForwardBBox): Use _transform_bbox.
2560    
2561     * test/test_proj.py (TestProjection.test): Add test for
2562     InverseBBox
2563    
2564     * Thuban/Model/layer.py (Layer.LatLongBoundingBox)
2565     (Layer.ShapesBoundingBox, RasterLayer.LatLongBoundingBox): Use the
2566     new InverseBBox method to determine the unprojected bounding box
2567     (Layer.ShapesInRegion): Use the ForwardBBox method to project the
2568     bbox.
2569    
2570     * test/test_layer.py (TestLayer.test_point_layer_with_projection):
2571     Removed.
2572     (TestLayer.test_arc_layer_with_projection): New. This test is
2573     better able to test whether bounding boxes are projected correctly
2574     than test_point_layer_with_projection
2575    
2576 bh 1986 * Thuban/UI/viewport.py (ViewPort.map_projection_changed): Use
2577     InverseBBox to unproject bboxes
2578    
2579 bh 1975 2003-11-25 Bernhard Herzog <[email protected]>
2580    
2581 bh 1981 * Thuban/UI/about.py (About.__init__): Make sure we have ASCII
2582     source code.
2583    
2584     2003-11-25 Bernhard Herzog <[email protected]>
2585    
2586 bh 1979 * Thuban/Model/layer.py (Layer.__getattr__): Removed. It was only
2587     there for backwards compatibility and all code relying on that
2588     should have been updated by now.
2589    
2590     2003-11-25 Bernhard Herzog <[email protected]>
2591    
2592 bh 1977 * test/test_load.py (TestClassification.test): Add the missing
2593     round trip test.
2594     (TestClassification.file_contents): Update to the newest file
2595     format
2596    
2597     2003-11-25 Bernhard Herzog <[email protected]>
2598    
2599 bh 1975 Add very experimental (and possibly dangerous) extension to draw
2600     polygons:
2601    
2602     * Extensions/drawshape/README: New. Brief installation
2603     instructions
2604    
2605     * Extensions/drawshape/drawshape.py: New. Implementation of the
2606     drawshape extensions
2607    
2608     * Extensions/drawshape/patch.diff: Patch to apply before the
2609     extension can be used.
2610    
2611 bh 1971 2003-11-24 Bernhard Herzog <[email protected]>
2612    
2613 bh 1973 * Thuban/Model/data.py (ShapefileStore._open_shapefile)
2614     (ShapefileStore.__init__): Factor opening the shapefile into a
2615     separate method (the new _open_shapefile). This makes the code a
2616     bit more readable but the real reason is that it makes some evil
2617     hacks easier. :-)
2618    
2619     2003-11-24 Bernhard Herzog <[email protected]>
2620    
2621 bh 1971 * Thuban/Model/load.py (SessionLoader.check_attrs): If no
2622     converter is specified for an attribute assume it's a string
2623     containing only Latin1 characters. Update doc-string accordingly.
2624     This change should fix many places where unicode objects might
2625     accidentally enter Thuban.
2626    
2627     * test/test_load.py (TestNonAsciiColumnName): New test to check
2628     what happens with column names in DBF files that contain non-ascii
2629     characters
2630    
2631 bh 1969 2003-11-21 Bernhard Herzog <[email protected]>
2632    
2633     Enable the experimental attribute editing again and introduce a
2634     command line switch to actually activate it
2635    
2636     * Thuban/UI/main.py (options): New. Container for options set on
2637     the commmand line
2638     (main): Add the --enable-attribute-editing flag.
2639    
2640     * Thuban/UI/identifyview.py (IdentifyView.__init__): If attribute
2641     editing is enabled use the grid ctrl which allows editing of the
2642     values
2643    
2644     * Thuban/Model/transientdb.py (AutoTransientTable.write_record):
2645     New. Just delegate this to the underlying table.
2646    
2647 bh 1967 2003-11-20 Bernhard Herzog <[email protected]>
2648    
2649     * test/test_proj.py (ProjFileReadTests.test_read_unreadable_file):
2650     Skip this test if run under non-posix systems since it only works
2651     there
2652    
2653 bh 1960 2003-11-19 Bernhard Herzog <[email protected]>
2654    
2655 bh 1965 * Thuban/Model/resource.py: Rework the way gdal support is
2656     determined so that we can give a reason in the about why gdal is
2657     not supported.
2658     (gdal_support_status): New. Variable holding a string with the
2659     reason for no gdal support
2660    
2661     * Thuban/UI/about.py (About.__init__): Add the reason why gdal is
2662     not supported to the message
2663    
2664     2003-11-19 Bernhard Herzog <[email protected]>
2665    
2666 bh 1963 Remove the old table interface and its test cases
2667    
2668     * Thuban/Model/table.py (OldTableInterfaceMixin): Removed.
2669     (DBFTable, MemoryTable): Do not derive from OldTableInterfaceMixin
2670     anymore
2671    
2672     * Thuban/Model/transientdb.py (TransientTableBase)
2673     (AutoTransientTable): Do not derive from OldTableInterfaceMixin
2674     anymore
2675    
2676     * test/test_table.py: Removed since the old interface it tests is
2677     gone.
2678    
2679     * test/runtests.py (main): The old table interface is gone and
2680     with it the deprecation warnings so remove the code that turns
2681     these warnings into errors
2682    
2683     2003-11-19 Bernhard Herzog <[email protected]>
2684    
2685 bh 1960 * test/test_table.py: Revert to revision 1.5 again. Changing the
2686     tests to use the new table interface is completely wrong since the
2687     whole purpose of the tests in this module is to test the old
2688     interface.
2689    
2690 bh 1954 2003-11-18 Bernhard Herzog <[email protected]>
2691    
2692 bh 1958 * Thuban/Model/postgisdb.py (PostGISConnection.MatchesParameters):
2693     New. Test whether the connection matches a set of connection
2694     parameters
2695    
2696     * Thuban/UI/dbdialog.py (DBFrame.conns_changed): Fix doc-string
2697     (DBFrame.OnAdd): Use the new MatchesParameters method when looking
2698     for existing connections with the same parameters and break out of
2699     the loop correctly.
2700    
2701     * test/test_postgis_db.py (TestBriefDescription)
2702     (TestPostGISSimple.test_brief_description): Rename
2703     TestBriefDescription to TestPostGISSimple and the test method to
2704     test_brief_description so that we can add more test methods.
2705     (TestPostGISSimple.test_matches_parameters): New. Test the new
2706     MatchesParameters method
2707    
2708     2003-11-18 Bernhard Herzog <[email protected]>
2709    
2710 bh 1960 * Thuban/Lib/connector.py (Publisher): Introduce a new flag,
2711 bh 1954 _was_destroyed, to indicate whether an publisher instance has
2712     already been destroyed.
2713     (Publisher.Unsubscribe): Only disconnect if the publisher has not
2714     been destroyed yet.
2715     (Publisher.Destroy): Set the _was_destroyed flag to true.
2716    
2717     * test/test_connector.py
2718     (TestPublisher.test_unsubscribe_after_destroy): New. Test that
2719     calling Unsubscribe after Destroy doesn't raise an exception
2720    
2721 bh 1951 2003-11-14 Bernhard Herzog <[email protected]>
2722    
2723     * Thuban/UI/identifyview.py (IdentifyView.selected_shape): Fix
2724     typo in doc-string
2725    
2726 bh 1949 2003-11-13 Bernhard Herzog <[email protected]>
2727    
2728     Quote table and column names properly for postgis.
2729    
2730     * Thuban/Model/postgisdb.py (quote_identifier): New. Function to
2731     quote an identifier for use in an sql statement
2732     (PostGISColumn.__init__): Add the quoted_name attribute
2733     (PostGISTable.__init__): New instance variable quoted_tablename
2734     (PostGISTable._fetch_table_information): Use the quoted table
2735     name. New isntance variable quoted_geo_col with a quoted version
2736     of geometry_column
2737     (PostGISTable.NumRows, PostGISTable.RowIdToOrdinal)
2738     (PostGISTable.RowOrdinalToId): Use the quoted table name
2739     (PostGISTable.ReadValue, PostGISTable.ValueRange)
2740     (PostGISTable.UniqueValues, PostGISTable.SimpleQuery)
2741     (PostGISShapeStore.BoundingBox, PostGISShapeStore.Shape)
2742     (PostGISShapeStore.AllShapes, PostGISShapeStore.ShapesInRegion):
2743     Use quoted table and column names
2744    
2745     * test/test_postgis_db.py (TestPostGISSpecialCases)
2746     (TestPostGISIgnoredColumns): Rename the class to
2747     TestPostGISSpecialCases because that better describes the new
2748     cases
2749     (TestPostGISSpecialCases.test_unsupported_types)
2750     (TestPostGISSpecialCases.test): Rename the method to
2751     test_unsupported_types because we need a more descriptive name now
2752     that there are more methods
2753     (TestPostGISSpecialCases.test_table_name_quoting)
2754     (TestPostGISSpecialCases.test_column_name_quoting)
2755     (TestPostGISSpecialCases.test_shapestore_name_quoting): New test
2756     cases to test quoting of table and column names in PostGISTable
2757     and PostGISShapeStore
2758    
2759     * test/postgissupport.py
2760     (skip_if_addgeometrycolumn_does_not_use_quote_ident): New. Skip if
2761     AddGeometryColumn desn't support table or column names with sapces
2762     or double quotes
2763    
2764 jan 1945 2003-11-12 Jan-Oliver Wagner <[email protected]>
2765    
2766     * Extensions/wms/__init__.py: New: Init to make this
2767     directory a package.
2768    
2769     * Extensions/wms/wms.py: New: Provide layers via OGC WMS.
2770    
2771 bh 1932 2003-11-11 Bernhard Herzog <[email protected]>
2772    
2773 bh 1942 * Thuban/Model/resource.py (EPSG_DEPRECATED_PROJ_FILE): New.
2774     Constant for the file woth deprecated epsg projections
2775     (get_system_proj_file): Update doc-string
2776    
2777     * Thuban/UI/projdialog.py (ProjFrame.build_dialog): Add a space
2778     above the EPS widgets, introduce a check box for the deprecated
2779     eps projections and a label for the epsg widgets
2780     (ProjFrame._OnShowEPSG): Handle the deprecated EPSG projections
2781     too
2782    
2783     2003-11-11 Bernhard Herzog <[email protected]>
2784    
2785 bh 1939 Avoid warnings when run under Python 2.3
2786    
2787     * Thuban/UI/baserenderer.py (BaseRenderer.draw_point_shape)
2788     (BaseRenderer.draw_label_layer): Coordinates must be ints.
2789    
2790     * Thuban/UI/renderer.py (MapRenderer.make_point): Turn this into a
2791     real method so that we can convert to int.
2792     (MapRenderer.label_font): The font size mist be an int.
2793    
2794     * Thuban/UI/common.py (Color2wxColour): The color values must be
2795     ints. Also, remove the unnecessary asserts.
2796    
2797     * test/test_load_0_8.py (TestUnicodeStrings.file_contents)
2798     (TestUnicodeStrings.test): Python source code should not contain
2799     non-ascii characters unless an encoding is specified in the file.
2800     Therefore use \x escapes in the string literals for non-ascii
2801     characters.
2802    
2803     2003-11-11 Bernhard Herzog <[email protected]>
2804    
2805 bh 1934 * Thuban/Model/resource.py (get_system_proj_file): Add a filename
2806     parameter so that this function can be used for all proj files in
2807     Resource/Projections
2808     (DEFAULT_PROJ_FILE, EPSG_PROJ_FILE): New. Predefined filenames for
2809     get_system_proj_file
2810    
2811     * Thuban/UI/projdialog.py (ProjFrame.__init__): Instead of one
2812     ProjFile self.__sysProjFile use a dictionary of system ProjFile
2813     objects self._sys_proj_files
2814     (ProjFrame.build_dialog): Adapt to the new changes in the
2815     ProjectionList constructor. Add a check button to toggle whether
2816     EPSG projections are shown
2817     (ProjFrame._OnShowEPSG): New. Handler for the epsg check button
2818     events.
2819     (ProjFrame.load_user_proj, ProjFrame.load_system_proj): Only show
2820     the busy cursor if the files have not yet been loaded by the
2821     dialog.
2822     (ProjFrame.load_system_proj): Add a parameter for the name of the
2823     proj file. Maintain the dictionary of system projections
2824     self._sys_proj_files
2825    
2826     * Thuban/UI/projlist.py (ProjectionList): Merge the system_projs,
2827     user_projs parameters into one parameter proj_files which is a
2828     list of proj files.
2829     (ProjectionList._subscribe_proj_files)
2830     (ProjectionList._unsubscribe_proj_files): New. Move
2831     subscription/unsubscription of projfile messages to separate
2832     methods
2833     (ProjectionList.Destroy): The unsubscribe is now done in
2834     _unsubscribe_proj_files
2835     (ProjectionList.update_projections): We now have a list of proj
2836     file objects
2837     (ProjectionList.SetProjFiles): New method to set a new list of
2838     proj file objects
2839    
2840     * test/test_proj.py (ProjFileReadTests.test_get_system_proj_file):
2841     Specify explicitly which system proj file to load.
2842    
2843     2003-11-11 Bernhard Herzog <[email protected]>
2844    
2845 bh 1932 * Thuban/Model/load.py (SessionLoader.Destroy): New. Clear all
2846     instance variables to cut cyclic references. The GC would have
2847     collected the loader eventually but it can happen that it doesn't
2848     run at all until thuban is closed (2.3 but not 2.2 tries a bit
2849     harder and forces a collection when the interpreter terminates)
2850     (load_session): Call the handler's Destroy method to make sure
2851     that it gets garbage collected early. Otherwise it will be
2852     collected very late if at all and it holds some references to e.g.
2853     shapestores and the session which can lead to leaks (of e.g. the
2854     temporary files)
2855    
2856     * test/test_load.py (TestSingleLayer.test_leak): New. test for the
2857     resource leak in load_session
2858    
2859 bh 1929 2003-11-10 Bernhard Herzog <[email protected]>
2860    
2861     * Thuban/UI/baserenderer.py: Add a way to specify how layers in
2862     extensions are to be rendered.
2863     (_renderer_extensions): New. List with renderer for layers in
2864     extensions
2865     (add_renderer_extension): New. Add a renderer extension
2866     (init_renderer_extensions): New. Init the renderer extensions
2867     (BaseRenderer.render_map_incrementally): Search
2868     _renderer_extensions for how to draw unknown layer types
2869     (BaseRenderer.draw_raster_data): Add format parameter so that
2870     formats other than BMP can be drawn
2871     (BaseRenderer.draw_raster_layer): Pass an explicit format to
2872     draw_raster_data
2873    
2874     * Thuban/UI/renderer.py (raster_format_map): New. Mapping form the
2875     strings of the format parameter of draw_raster_data method to wx
2876     constants
2877     (MapRenderer.draw_raster_data): Add the format parameter and use
2878     raster_format_map to map it to the right wxwindows constant for
2879     wxImageFromStream
2880    
2881     * test/test_baserenderer.py (SimpleRenderer.draw_raster_data): Add
2882     the format parameter and record it
2883     (TestBaseRenderer.test_raster_no_projection): check the format
2884     paramter of the draw_raster_data method
2885     (TestBaseRenderer.test_renderer_extension): New. Test the renderer
2886     extension facility
2887    
2888 bh 1925 2003-11-07 Bernhard Herzog <[email protected]>
2889    
2890     Tweak the usage of the sqlite database to make common use cases
2891     more responsive. In most cases copying the data to the sqlite
2892     database takes so long that using sqlite doesn't have enough
2893     advantages.
2894    
2895     * Thuban/Model/transientdb.py (TransientTableBase.ValueRange): Add
2896     comments about performance and query the min and max in separate
2897     statements because only that way will indexes be used.
2898     (TransientTableBase.UniqueValues): Add some comments about
2899     performance.
2900     (AutoTransientTable.ValueRange, AutoTransientTable.UniqueValues):
2901     Do not copy the data to the transient DB but use the transient
2902     copy if it exists. See the new comments for the performance trade
2903     offs
2904    
2905     * test/test_transientdb.py
2906     (TestTransientTable.test_auto_transient_table): Make sure that the
2907     data is copied to the transient database at some point.
2908    
2909 bh 1913 2003-11-03 Bernhard Herzog <[email protected]>
2910    
2911 bh 1922 * Thuban/Model/data.py (ShapefileStore.ShapesInRegion): Bind some
2912     globals to locals so that it's a bit faster
2913    
2914     2003-11-03 Bernhard Herzog <[email protected]>
2915    
2916 bh 1920 * Thuban/UI/baserenderer.py
2917     (BaseRenderer.draw_shape_layer_incrementally): Use the ReadValue
2918     method. ReadValue is faster than ReadRowAsDict since it only reads
2919     one cell especially now that the dbf file objects actually
2920     implement it.
2921    
2922     * Thuban/Model/table.py (DBFTable.ReadValue): Use the new
2923     read_attribute method of the dbf objects
2924    
2925     2003-11-03 Bernhard Herzog <[email protected]>
2926    
2927 bh 1916 * Extensions/profiling/profiling.py (popup_dialog_box): New config
2928     variable to indicate whether the result should be shown in a
2929     dialog box
2930     (profile_screen_renderer, time_screen_renderer): Only show a
2931     dialog box if popup_dialog_box is true.
2932     (profile_screen_renderer): Flush stdout after the printing the
2933     first part of the "profiling..." message
2934    
2935     * Thuban/UI/baserenderer.py
2936     (BaseRenderer.draw_shape_layer_incrementally): Cache the pens and
2937     brushes for the groups so that they're not created over and over
2938     again
2939    
2940 bh 1913 * Thuban/Model/classification.py (Classification.__getattr__)
2941     (Classification._compile_classification)
2942     (Classification._clear_compiled_classification): New. Methods to
2943     manage a 'compiled' representation of the classification groups
2944     which is created on demand
2945     (Classification.InsertGroup, Classification.RemoveGroup)
2946     (Classification.ReplaceGroup): reset the compiled representation
2947     (Classification.FindGroup): Use the compiled representation to
2948     find the matching group
2949     (ClassGroupRange.GetRangeTuple): New. Return the range as a tuple
2950    
2951 bh 1904 2003-10-31 Bernhard Herzog <[email protected]>
2952    
2953 bh 1911 * Thuban/Model/classification.py (Classification.SetDefaultGroup):
2954     Send a CLASS_CHANGED message
2955     (Classification.RemoveGroup): Send a CLASS_CHANGED message and do
2956     not return the removed group since it wasn't used.
2957    
2958     * test/test_classification.py
2959     (TestClassification.test_set_default_group): New. Test the
2960     SetDefaultGroup method
2961     (TestClassification.test_insert_group): New. Test the InsertGroup
2962     method
2963     (TestClassification.test_remove_group): New. Test the RemoveGroup
2964     method
2965     (TestClassification.test_replace_group): New. Test the
2966     ReplaceGroup method
2967    
2968     2003-10-31 Bernhard Herzog <[email protected]>
2969    
2970 bh 1908 * test/test_classification.py (TestClassification.setUp):
2971     Subscribe to the CLASS_CHANGED messages
2972     (TestClassification.tearDown): New. Destroy the classification
2973     properly
2974     (TestClassification.test_defaults): Add tests for the default line
2975     width and whether no messages were sent yet
2976     (TestClassification.test_set_default_properties): Add tests for
2977     messages and setting the default line width
2978     (TestClassification.test_add_singleton)
2979     (TestClassification.test_add_range)
2980     (TestClassification.test_multiple_groups): Add tests for messages
2981    
2982     2003-10-31 Bernhard Herzog <[email protected]>
2983    
2984 bh 1906 Some more refactoring in preparation for new tests:
2985    
2986     * test/test_classification.py (TestClassification.setUp): New.
2987     Instantiate the classification here. Update the test methods
2988     accordingly.
2989     (TestClassification.test_multiple_groups): Make sure that the two
2990     singletons matching 1 are considered different.
2991    
2992     2003-10-31 Bernhard Herzog <[email protected]>
2993    
2994 bh 1904 * test/test_classification.py (red, green, blue): New. These
2995     constants were used in several cases. Update the relevant methods.
2996     (TestClassification.test_defaults)
2997     (TestClassification.test_set_default_properties)
2998     (TestClassification.test_add_singleton)
2999     (TestClassification.test_add_range)
3000     (TestClassification.test_multiple_groups)
3001     (TestClassification.test_deepcopy): New. These were formerly all
3002     part of the single method test.
3003     (TestClassification.test_deepcopy): Removed.
3004     (TestClassIterator): Removed. The test case is now a method of
3005     TestClassification since it tests part of the public interface of
3006     Classification
3007     (TestClassification.test_iterator): New. Used to be
3008     TestClassIterator effectively
3009    
3010 jan 1902 2003-10-31 Jan-Oliver Wagner <[email protected]>
3011    
3012     GUIfied the functions of the profiling extension.
3013    
3014     * /Extensions/profiling/__init__.py: New: Init to make this
3015     directory a package.
3016    
3017     * Extensions/profiling/profiling.py: Moved menu entries to
3018     the Extensions menu. Applied _() for strings.
3019     (profile_screen_renderer): Catch the detailed printout and present
3020     it in a dialog.
3021 bh 1904 (time_screen_renderer): Raise a dialog to present the result instead
3022 jan 1902 of printing it to stdout.
3023    
3024 bh 1897 2003-10-31 Bernhard Herzog <[email protected]>
3025    
3026 bh 1899 * test/test_classification.py (TestClassGroupProperties)
3027     (TestClassGroup, TestClassGroupDefault, TestClassGroupRange)
3028     (TestClassGroupSingleton, TestClassIterator, TestClassification):
3029     Split TestClassification into several classes, one for each class
3030     being tested. TestClassification itself now only tests
3031     Classification. This split makes changes to the tests a bit easier
3032    
3033     2003-10-31 Bernhard Herzog <[email protected]>
3034    
3035 bh 1897 * Extensions/profiling/profiling.py: New. Extension to measure
3036     Thuban performance
3037    
3038 frank 1895 2003-10-31 Frank Koormann <[email protected]>
3039    
3040     Added two items to legend popup menu: Remove Layer and Show Layer Table
3041    
3042     * Thuban/UI/legend.py (LegendPanel._OnRemoveLayer,
3043     LegendPanel._OnShowTable): New event handlers, call the corresponding
3044     mainwindow methods.
3045     (LegendTree._OnRightClick): Added items to popup menu.
3046    
3047 bh 1894 2003-10-30 Bernhard Herzog <[email protected]>
3048    
3049     * Thuban/UI/dialogs.py (ThubanFrame.__init__): Handle
3050     EVT_WINDOW_DESTROY
3051     (ThubanFrame.OnDestroy): New. Handler for EVT_WINDOW_DESTROY. Does
3052     nothing but is convenient for the derived classes.
3053    
3054     * Thuban/UI/tableview.py
3055     (TableFrame.OnDestroy, LayerTableFrame.OnDestroy): New.
3056     Unsubscribe the messages here not in OnClose because that might
3057     get called multiple times. Fixes RT #2196
3058     (TableFrame.OnClose, LayerTableFrame.OnClose): Removed. Not needed
3059     anymore.
3060    
3061     * README: Update the minimum requirement for wxPython. Since we
3062     now use the EVT_WINDOW_DESTROY event, we need at least 2.4.0.4,
3063     the version in which that was introduced for all platforms
3064    
3065 frank 1890 2003-10-30 Frank Koormann <[email protected]>
3066    
3067     * Thuban/UI/join.py (JoinDialog.OnJoin): Wrapped the major parts of
3068     the join process in a ThubanBeginBusyCursor, ThubanEndBusyCursor
3069     frame.
3070    
3071 jan 1889 2003-10-30 Jan-Oliver Wagner <[email protected]>
3072    
3073     Improved APR import extension, added further EPSG definitions
3074     and some cleanup regarding string class.
3075    
3076     * test/test_proj.py (TestProjection.test_get_projection_units_geo):
3077     Added test for alias 'longlat'.
3078    
3079     * Resources/Projections/epsg-deprecated.proj: New. Contains
3080     deprecated EPSG definitions.
3081    
3082     * Extensions/importAPR/odb.py (ODBBaseObject.TreeInfo): Added
3083     the variable names for objects.
3084    
3085     * Extensions/importAPR/apr.py (APR_BLnSym, APR_BMkSym, APR_BShSym): New.
3086     Copied from importAPR and provided with documentation.
3087    
3088     * Extensions/importAPR/importAPR.py (APR_BLnSym, APR_BMkSym, APR_BShSym):
3089     Moved to apr.py.
3090     (APR_View): Added object ref 'ITheme'.
3091    
3092     * Thuban/Lib/fileutil.py, Thuban/UI/proj4dialog.py: Replaced string
3093     split function by corresponding use of the string class method.
3094    
3095     * Thuban/Model/xmlwriter.py: Replaced string replace function by
3096     corresponding string method.
3097    
3098 bh 1880 2003-10-29 Bernhard Herzog <[email protected]>
3099    
3100     * Thuban/UI/baserenderer.py
3101     (BaseRenderer.draw_shape_layer_incrementally): Speed up the
3102     special case of a classification that only has the default group
3103    
3104 bh 1868 2003-10-27 Bernhard Herzog <[email protected]>
3105    
3106 bh 1878 * po/fr.po, po/es.po: Updated translations from Daniel Calvelo
3107    
3108 bh 1876 * po/de.po: Update.
3109    
3110     * Thuban/UI/application.py
3111     (ThubanApplication.ShowExceptionDialog): Handle translation of the
3112     dialog message properly
3113    
3114     2003-10-27 Bernhard Herzog <[email protected]>
3115    
3116 bh 1873 Rework how localization works so that we use wx's translation
3117     functions when running Thuban as a normal application but not when
3118     we don't need any UI, such as in the test suite. See the comment
3119     in Thuban/__init__.py for details
3120    
3121     * Thuban/__init__.py (_): Add one level of indirection to make the
3122     translation handling more flexible and to make it possible to use
3123     either wx's translation services or not.
3124     (gettext_identity, translation_function_installed)
3125     (install_translation_function): New function to help with this
3126    
3127     * Thuban/UI/__init__.py: Install the wx specific translation
3128     function if it's OK to do that
3129    
3130     * test/support.py (initthuban): Install a dummy translation
3131     function so that importing Thuban.UI doesn't install a wx specific
3132     one for which would need to import wxPython
3133    
3134     2003-10-27 Bernhard Herzog <[email protected]>
3135    
3136 bh 1870 * HOWTO-Release: Source archives should be created first and the
3137     binary packages should be created from the source archives.
3138     There's an official debian package now so there's no need to test
3139     the rpm on debian anymore
3140    
3141     2003-10-27 Bernhard Herzog <[email protected]>
3142    
3143 bh 1868 Several rendering changes:
3144    
3145     - Render the selection into a separate bitmap so that only that
3146     bitmap needs to be redrawn when the selection changes
3147    
3148     - Render incrementally showing previews and allowing interaction
3149     before rendering is complete
3150    
3151     - Update the renderer interface a bit. Most parameters of
3152     RenderMap are now parameters of the constructor
3153    
3154     * Thuban/UI/baserenderer.py (BaseRenderer.__init__): Add the map
3155     and the update region as parameters. Update the doc-string
3156     (BaseRenderer.render_map_incrementally): New. Generator function
3157     to renders the map incrementally
3158     (BaseRenderer.render_map): Remove the map argument (it's now in
3159     the constructor) and simply iterate over the
3160     render_map_incrementally generator to draw the map.
3161     (BaseRenderer.draw_shape_layer_incrementally)
3162     (BaseRenderer.draw_shape_layer): Renamed to
3163     draw_shape_layer_incrementally and changed into a generator that
3164     yields True every 500 shapes. Used by render_map_incrementally to
3165     render shape layers incrementally
3166    
3167     * Thuban/UI/renderer.py (ScreenRenderer.RenderMap): Removed the
3168     map and region parameters which are now in the constructor
3169     (ScreenRenderer.RenderMapIncrementally): New. Public frontend for
3170     the inherited render_map_incrementally.
3171     (BaseRenderer.draw_shape_layer): Removed.
3172     (ScreenRenderer.draw_selection_incrementally): New. The selection
3173     drawing part of the removed draw_shape_layer as a generator
3174     (ScreenRenderer.layer_shapes): Update because of the region
3175     parameter change
3176     (ExportRenderer.__init__): New. Extend the inherited constructor
3177     with the destination region for the drawing
3178     (ExportRenderer.RenderMap): Removed the map and region parameters
3179     which are now in the constructor
3180    
3181     * Thuban/UI/view.py (MapCanvas.PreviewBitmap): New. Return a
3182     bitmap suitable for a preview in a tool
3183     (CanvasPanTool.MouseMove): Use the PreviewBitmap method to get the
3184     bitmap
3185     (MapPrintout.draw_on_dc): Adapt to new renderer interface
3186     (MapCanvas.OnPaint): Handle drawing the selection bitmap if it
3187     exists
3188     (MapCanvas.OnIdle): Update the logic to deal with incremental
3189     rendering and the selection bitmap
3190     (MapCanvas._do_redraw): Handle the instantiation of the render
3191     iterator and the redraws during rendering
3192     (MapCanvas._render_iterator): New. Generator to incrementally
3193     redraw both bitmaps
3194     (MapCanvas.Export): Adapt to new renderer interface.
3195     (MapCanvas.full_redraw): Reset the selection bitmap and the
3196     renderer iterator too
3197     (MapCanvas.redraw_selection): New. Force a redraw of the selection
3198     bitmap
3199     (MapCanvas.shape_selected): Only redraw the selection bitmap
3200    
3201     * test/test_baserenderer.py
3202     (TestBaseRenderer.test_polygon_no_projection)
3203     (TestBaseRenderer.test_raster_no_projection)
3204     (TestBaseRenderer.test_point_map_projection)
3205     (TestBaseRenderer.test_point_layer_and_map_projection)
3206     (TestBaseRenderer.test_point_layer_projection)
3207     (TestBaseRenderer.test_point_with_classification): Adapt to new
3208     renderer interface
3209    
3210 bh 1865 2003-10-24 Bernhard Herzog <[email protected]>
3211    
3212     * libraries/thuban/wxproj.cpp (draw_polygon_shape)
3213     (point_in_polygon_shape, shape_centroid): Raise an exception if
3214     the shape can't be read. Previously invalid shape ids would lead
3215     to a segfault.
3216    
3217     * test/test_wxproj.py (TestShapeCentroid.test_invalid_shape_id):
3218     New. test whether an exception is raised for invalid shape ids
3219    
3220 jan 1857 2003-10-24 Jan-Oliver Wagner <[email protected]>
3221    
3222 jan 1862 * Thuban/Model/proj.py (Projection.GetProjectedUnits): Added 'longlat'
3223     as alias for 'latlong'.
3224    
3225     * Thuban/UI/projdialog.py (ProjFrame.__init__): Added 'longlat'
3226     as alias for 'latlong'.
3227    
3228     2003-10-24 Jan-Oliver Wagner <[email protected]>
3229    
3230 jan 1859 * Thuban/UI/projdialog.py (ProjFrame.proj_selection_changed): Set
3231     the projection even for the UnknownPanel.
3232     (UnknownProjPanel.__init__): Define the text and create the textctrl
3233     widget.
3234     (UnknownProjPanel._DoLayout): Replaced static text widget by the
3235     textctrl created in __init__.
3236     (UnknownProjPanel.SetProjection): Set the text for the text ctrl
3237     including the parameters of the projection.
3238    
3239     2003-10-24 Jan-Oliver Wagner <[email protected]>
3240    
3241 jan 1857 * Resources/Projections/epsg.proj: New. This is a list of
3242     EPSG codes with parameters for proj. The list has been
3243     generated using devtools/create_epsg.py based on the
3244     file nad/epsg of the proj 4.4.7 package. Four projection
3245     definitions have been deleted as they are not accepted by proj:
3246     "CH1903+ / LV95", "Bern 1898 (Bern) / LV03C", "CH1903 / LV03"
3247     and "HD72 / EOV".
3248    
3249 bh 1855 2003-10-22 Bernhard Herzog <[email protected]>
3250    
3251     Some more tweaks to the projection dialog which should fix RT
3252     #1886.
3253    
3254     * Thuban/UI/projlist.py (ProjectionList.Destroy): Unsubscribe from
3255     the ProjFile's messages and call the base class methods correctly
3256     (ProjectionList.SelectProjection): Set the wxLIST_STATE_FOCUSED
3257     flag on the newly selected item too. Otherwise some other item is
3258     focused and the first time the focus is moved with the keyboard
3259     the selection moves in unexpected ways.
3260    
3261     * Thuban/UI/projdialog.py (ProjFrame.__init__): Do not set the
3262     focus on the OK button, only on the projection list. That way the
3263     list really has the focus initially
3264     (ProjFrame.OnClose): Call the projection list's Destroy method to
3265     make it unsubscribe all messages
3266    
3267 bh 1840 2003-10-21 Bernhard Herzog <[email protected]>
3268    
3269 bh 1852 Rework the projection dialog to fix a few bugs, including RT 2166
3270     and most of 2168
3271    
3272     * Thuban/UI/projlist.py: New. The class ProjectionList is a
3273     special wxListCtrl to show a list of projections in a more MVC
3274     fashion
3275    
3276     * Thuban/UI/projdialog.py (ProjFrame): Substantial changes
3277     throughout the class. The main change is to use the ProjectionList
3278     class instead of a normal wxListBox. Also, add an explicit
3279     "Unknown" projection to the projection choice control.
3280     (ProjPanel.__init__): Add an "unknown" ellipsoid
3281     (TMPanel.__init__, LCCPanel.__init__): Tweak the order of
3282     instantiation of the panel's controls to make the tab-order more
3283     natural
3284    
3285     2003-10-21 Bernhard Herzog <[email protected]>
3286    
3287 bh 1849 * test/test_load.py (TestSingleLayer.file_contents)
3288     (TestSingleLayer.test): Add non-ascii characters to the titles of
3289     session, map and layer. This is effectively a port of the
3290     TestUnicodeStrings test in test_load_0_8.py which for some reason
3291     was only added there.
3292    
3293     * test/test_load_0_9.py (TestSingleLayer.file_contents)
3294     (TestSingleLayer.test): Same as in test_load.py: add non-ascii
3295     characters to the titles of session, map and layer,.
3296    
3297     2003-10-21 Bernhard Herzog <[email protected]>
3298    
3299 bh 1847 Add EPSG projection handling to .thuban files
3300    
3301     * test/test_save.py (SaveSessionTest.dtd)
3302     (SaveSessionTest.testEmptySession)
3303     (SaveSessionTest.testLayerProjection)
3304     (SaveSessionTest.testRasterLayer)
3305     (SaveSessionTest.testClassifiedLayer)
3306     (SaveSessionTest.test_dbf_table)
3307     (SaveSessionTest.test_joined_table)
3308     (SaveSessionTest.test_save_postgis): Update to 1.0-dev namespace
3309     (SaveSessionTest.testSingleLayer): Update to 1.0-dev namespace and
3310     use a and epsg projection to test saving them
3311    
3312     * test/test_load.py (LoadSessionTest.dtd): Update to 1.0-dev
3313     namespace
3314     (TestLayerVisibility.file_contents, TestLabels.file_contents)
3315     (TestLayerProjection.file_contents)
3316     (TestRasterLayer.file_contents, TestJoinedTable.file_contents)
3317     (TestPostGISLayer.file_contents)
3318     (TestPostGISLayerPassword.file_contents)
3319     (TestLoadError.file_contents, TestLoadError.test): Update to use
3320     1.0-dev namespace
3321     (TestSingleLayer.file_contents, TestSingleLayer.test): Update to
3322     use 1.0-dev namespace and use an EPSG projection to test whether
3323     loading it works
3324    
3325     * test/test_load_0_9.py: New. Effectively a copy of test_load.py
3326     as of Thuban 0.9. These are now tests to determine whether Thuban
3327     can still read files generated by Thuban 0.9
3328    
3329     * Thuban/Model/save.py (SessionSaver.write)
3330     (SessionSaver.write_session): Use the 1.0 dtd and 1.0-dev
3331     namespace
3332     (SessionSaver.write_projection): Write the projection's epsg
3333     attribute
3334    
3335     * Thuban/Model/load.py (SessionLoader.__init__): Also accept the
3336     thuban-1.0-dev.dtd namespace
3337     (SessionLoader.check_attrs): Allow a callable object as conversion
3338     too
3339     (SessionLoader.start_projection, SessionLoader.end_projection)
3340     (SessionLoader.start_parameter): Handle the epsg attribute and
3341     rename a few instance variables to lower case
3342    
3343     * Resources/XML/thuban-1.0.dtd: New. Only difference to
3344     thuban-0.9.dtd is the epsg attribute for projections.
3345    
3346     2003-10-21 Bernhard Herzog <[email protected]>
3347    
3348 bh 1840 * test/runtests.py (main): Let the user specify which tests to run
3349     on the command line
3350    
3351     * test/support.py (ThubanTestResult.getDescription): Override to
3352     give a better short description. The description can be used as a
3353     parameter to run_tests to run that particular test in isolation.
3354    
3355 frank 1837 2003-10-21 Frank Koormann <[email protected]>
3356    
3357     Popup menu for legend. Scheduled for the 1.2 release this was too
3358     simple to implement: The popup menu is bound to the legend tree, while
3359     the events are hanlded by its anchestor, the legend panel. This
3360     allows reuse of all the event handlers already implemented for the
3361     legend toolbar buttons.
3362    
3363     * Thuban/UI/legend.py (LegendPanel.__init__): EVT_MENU macros
3364     to add handlers for the events issued by the popup menu.
3365     (LegendPanel._OnToggleVisibility): Handler for toggling layer
3366     visibility event
3367     (LegendPanel._OnProjection): Handler for layer projection event.
3368     (LegendTree.__init__): Added EVT_TREE_ITEM_RIGHT_CLICK
3369     (LegendTree._OnRightClick): Event handler for right click, select item
3370     and pop up menu.
3371     (LegendTree.ToggleVisibility): Toggle layer visibility
3372     (LegendTree.LayerProjection): Raise layer projection dialog for
3373     current layer.
3374    
3375 bh 1836 2003-10-21 Bernhard Herzog <[email protected]>
3376    
3377     * Resources/Projections/defaults.proj: Use correct DOCTYPE
3378     declaration. The top-level element is projectionlist not projfile
3379    
3380 bh 1834 2003-10-20 Bernhard Herzog <[email protected]>
3381    
3382     * Thuban/UI/projdialog.py (ProjFrame.write_proj_file): New. helper
3383     method to write a projfile and display a busy cursor and error
3384     dialogs.
3385     (ProjFrame._OnSave, ProjFrame._OnAddToList, ProjFrame._OnImport)
3386     (ProjFrame._OnExport, ProjFrame._OnRemove): Use write_proj_file
3387     (ProjFrame.__FillAvailList): Translate "<None>" too and display a
3388     busy cursor while loading the user and system prj files.
3389    
3390 bh 1832 2003-10-16 Bernhard Herzog <[email protected]>
3391    
3392     * Thuban/Model/resource.py (projfile_cache): Introduce a cache for
3393     ProjFile objects
3394     (clear_proj_file_cache): New function to clear the cache. Mainly
3395     useful for use by the test suite
3396     (read_proj_file): Use the cache.
3397    
3398     * test/test_proj.py (TestProjFile): Clarify the doc-string
3399     (ProjFileReadTests): Update doc-string
3400     (ProjFileReadTests.test_get_system_proj_file): Check whether the
3401     system proj files is cached.
3402     (ProjFileLoadTestCase): New base class for the proj file tests
3403     derived from support.FileLoadTestCase to provide some common
3404     behavior.
3405     (TestLoadingProjFile)
3406     (TestLoadingProjFileWithEmptyProjectionlist.file_contents)
3407     (TestProjFileWithInvalidParameters.file_contents): Derive from
3408     ProjFileLoadTestCase
3409     (TestLoadingProjFile.test_caching): New. Test whether the cache
3410     works
3411    
3412 silke 1829 2003-10-16 Silke Reimer <[email protected]>
3413    
3414     * debian/*: New directory with configuration files for building a thuban
3415     deb-package.
3416    
3417 bh 1822 2003-10-14 Bernhard Herzog <[email protected]>
3418    
3419 bh 1828 * test/test_proj.py: Execute support.run_tests when run as
3420     __main__ so that missing unsubscribes are detected
3421     (TestProjFile.tearDown): Destroy the proj_file properly
3422    
3423     2003-10-14 Bernhard Herzog <[email protected]>
3424    
3425 bh 1826 * Thuban/Model/messages.py (PROJECTION_ADDED)
3426     (PROJECTION_REPLACED, PROJECTION_REMOVED): New message types for
3427     the ProjFile objects
3428    
3429     * Thuban/Model/proj.py (ProjFile): Derive from Publisher so we can
3430     easily send messages when the projections change
3431     (ProjFile.Add, ProjFile.Remove, ProjFile.Replace): Issue messages
3432     when the change was successful
3433    
3434     * test/test_proj.py (TestProjFile.setUp): Subscribe to some of the
3435     proj file messages
3436     (TestProjFile.test_add_remove)
3437     (TestProjFile.test_remove_non_existing)
3438     (TestProjFile.test_replace)
3439     (TestProjFile.test_replace_non_existing): Test whether the right
3440     messages are sent
3441    
3442     2003-10-14 Bernhard Herzog <[email protected]>
3443    
3444 bh 1822 * test/test_proj.py (TestProjFile.test): Refactor into several
3445     tests
3446     (TestProjFile.test_add_remove)
3447     (TestProjFile.test_remove_non_existing)
3448     (TestProjFile.test_replace)
3449     (TestProjFile.test_replace_non_existing): Some of the new
3450     individual test cases
3451     (TestProjFileSimple): New class for the rest of the test cases
3452     that came out of the refactoring
3453     (ProjFileTest): Derive from xmlsupport.ValidationTest so that the
3454     derived classes don't have to
3455    
3456 bh 1812 2003-10-13 Bernhard Herzog <[email protected]>
3457    
3458 bh 1820 Add an optional EPSG code to the projection objects and extend the
3459     .proj file format accordingly.
3460    
3461     * Resources/XML/projfile.dtd (element projection): Add epsg
3462     attribute
3463    
3464     * Thuban/Model/proj.py (Projection.__init__): New parameter and
3465     instance variable epsg. Update doc-string
3466     (Projection.EPSGCode, Projection.Label): New methods to provide
3467     access to EPSG code and a label for use in dialogs
3468    
3469     * Thuban/Model/resource.py (ProjFileReader.start_projection)
3470     (ProjFileReader.end_projection, ProjFileSaver.write_projfile):
3471     Handle the epsg code attribute when reading or writing proj files
3472    
3473     * Thuban/UI/projdialog.py (ProjFrame._OnSave)
3474     (ProjFrame._OnAddToList, ProjFrame.__DoOnProjAvail)
3475     (ProjFrame.__FillAvailList): Use the projection's Label method to
3476     get the string for the list box
3477    
3478     * test/test_proj.py (TestProjection.test_label)
3479     (TestProjection.test_label_epsg)
3480     (TestProjection.test_epsgcode_for_non_epsg_projection)
3481     (TestProjection.test_epsgcode_for_real_epsg_projection): New tests
3482     for the label and EPSGCode methods
3483     (WriteProjFileTests.doTestWrite, WriteProjFileTests.test_write)
3484     (WriteProjFileTests.test_write_empty_file): Create the ProjFile
3485     objects in the test cases and put the expected contents into the
3486     test case methods too. Update doTestWrite accordingly
3487     (TestLoadingProjFile)
3488     (TestLoadingProjFileWithEmptyProjectionlist): New classes with the
3489     read tests from TestProjFile.
3490     (TestProjFile.doTestRead, TestProjFile.testRead): Removed. These
3491     tests are now in the new classes.
3492     (sample_projfile, sample_projfile_data)
3493     (sample_projfile2, sample_projfile_data2): Removed. Not used
3494     anymore.
3495     (TestProjFile.test_read_unreadable_file): No need to reset the
3496     permissions at the end anymore since we use a unique filename
3497    
3498     2003-10-13 Bernhard Herzog <[email protected]>
3499    
3500 bh 1814 * test/test_proj.py: Some more refactoring of the test cases
3501     (ProjFileTest): New base class for the proj file tests.
3502     (TestProjFile): Derive from ProjFileTest
3503     (TestProjFile.test_read_unreadable_file)
3504     (TestProjFile.test_read_empty_file, TestProjFile.doTestRead): Use
3505     the new filename method to get a unique filename
3506     (TestProjFile.doTestWrite, TestProjFile.testWrite): Removed.
3507     (WriteProjFileTests): New class for proj file write tests.
3508     Contains the write test that were in TestProjFile originally.
3509    
3510     2003-10-13 Bernhard Herzog <[email protected]>
3511    
3512 bh 1812 * test/test_proj.py (TestProjFile.testRead)
3513     (TestProjFile.test_read_non_existing_file)
3514     (TestProjFile.test_read_unreadable_file)
3515     (TestProjFile.test_read_empty_file): Split into several methods.
3516    
3517 bh 1805 2003-10-10 Bernhard Herzog <[email protected]>
3518    
3519 bh 1810 * Thuban/UI/sizers.py: New file with custom sizers.
3520    
3521     * Thuban/UI/projdialog.py (ProjFrame.build_dialog): Instantiate
3522     all projection type specific panels and put them into a
3523     NotebookLikeSizer. This way the dialog doesn't change its size
3524     when a different projection is selected
3525     (ProjFrame.__init__): Rename projection_panels
3526     projection_panel_defs and reuse projection_panels for a list of
3527     the instantiated panels.
3528     (ProjFrame._show_proj_panel, ProjFrame.__DoOnProjAvail)
3529     (ProjFrame.__DoOnProjChoice): Changes due to the new handling of
3530     the panels
3531     (UnknownProjPanel._DoLayout): Place the newlines in the message
3532     differently to make the panel narrower.
3533     (TMPanel._DoLayout): Layout the parameters in one column.
3534    
3535     2003-10-10 Bernhard Herzog <[email protected]>
3536    
3537 bh 1807 * Thuban/UI/projdialog.py (ProjFrame.build_dialog): New method
3538     that contains all the setup for the dialog's widgets, layout and
3539     event handling.
3540     (__): Call build_dialog to build the dialog.
3541     (ProjFrame.__set_properties, ProjFrame.__do_layout): Removed.
3542     Their functionality is now in build_dialog
3543     (ProjFrame.__VerifyButtons, ProjFrame.__VerifyButtons)
3544     (ProjFrame.__DoOnProjAvail, ProjFrame.__DoOnProjAvail)
3545     (ProjFrame.__DoOnProjChoice): Small updates due to slightly
3546     different widget names and hierarchy introduced with build_dialog.
3547    
3548     2003-10-10 Bernhard Herzog <[email protected]>
3549    
3550 bh 1805 * README: Fix typo.
3551    
3552 bh 1803 2003-10-09 Bernhard Herzog <[email protected]>
3553    
3554     * Thuban/Model/proj.py (ProjFile.Add): Do not check whether the
3555     projection is already in the list. This is *a lot* faster when
3556     loading files with hundreds of projections since it saves a linear
3557     search. OTOH this will allow adding the same projection to the
3558     user.proj file multiple times in the projection dialog but we'll
3559     deal with that later
3560    
3561 jan 1801 2003-10-09 Jan-Oliver Wagner <[email protected]>
3562    
3563     * devtools: New. Directory for developer tools that are not intended
3564     for the regular user.
3565    
3566     * devtools/create_epsg.py: New. Convert the epsg file of proj into
3567     a python .proj file.
3568    
3569 bh 1799 2003-10-09 Bernhard Herzog <[email protected]>
3570    
3571     * test/test_proj.py
3572     (TestProjection.test_get_parameter_without_equals_sign): New. Test
3573     whether GetParameter handles parameters without "=" sign correctly
3574    
3575     * Thuban/Model/proj.py (Projection.GetParameter): Handle
3576     parameters that do not contain a "=". Update the doc-string
3577    
3578 bh 1794 2003-10-08 Bernhard Herzog <[email protected]>
3579    
3580 bh 1796 * Thuban/UI/projdialog.py (ProjFrame.__set_properties): Remove the
3581     length limit on the projname text control
3582    
3583     2003-10-08 Bernhard Herzog <[email protected]>
3584    
3585 bh 1794 * test/test_proj.py (TestProjection.test_get_projection_units_geo)
3586     (TestProjection.test_get_projection_units_normal): New. Tests for
3587     the Projection.GetProjectedUnits method
3588    
3589 jan 1792 2003-10-08 Jan-Oliver Wagner <[email protected]>
3590    
3591     * Thuban/Model/resource.py (get_user_proj_file): small bug-fix:
3592     Added missing 'val' parameter.
3593    
3594 bh 1788 2003-10-08 Bernhard Herzog <[email protected]>
3595    
3596 bh 1790 * Thuban/UI/projdialog.py (ProjFrame.__DoOnProjAvail): When the
3597     projection type of the currently selected projection is not known,
3598     i.e. there's no panel for it, use the UnknownProjPanel
3599     (ProjFrame.__DoOnProjChoice, ProjFrame._show_proj_panel): Split
3600     the actual replacing of the proj panel into the new method
3601     _show_proj_panel.
3602     (UnknownProjPanel): Add doc-string.
3603     (UnknownProjPanel._DoLayout): Insert a newline into the text so
3604     that the panel is not so wide.
3605    
3606     2003-10-08 Bernhard Herzog <[email protected]>
3607    
3608 bh 1788 * Thuban/Model/resource.py (read_proj_file): Return the warnings
3609     too. Update the doc-string
3610     (get_proj_files): Removed. It wasn't used anywhere
3611     (get_system_proj_files, get_system_proj_file): Rename to
3612     get_system_proj_file and return the ProjFile object and not a list
3613     of ProjFile objects. Update the callers.
3614     (get_user_proj_files, get_user_proj_file): Rename to
3615     get_user_proj_file return the ProjFile object and not a list of
3616     ProjFile objects. Update the callers.
3617     (ProjFileReader.__init__): New instance variable for the warnings.
3618     Rename the __pf ivar to projfile. Update the methods referring to
3619     __pf
3620     (ProjFileReader.end_projection): Catch any errors raised when
3621     instantiating the projection and record that as an error. The
3622     projection will not be in the final ProjFile object.
3623     (ProjFileReader.GetWarnings): New method to return the warnings.
3624    
3625     * Thuban/UI/projdialog.py (ProjFrame.show_warnings): New method to
3626     show the warnings from the projfile reader
3627     (ProjFrame._OnImport): Deal with any warnings returned by
3628     read_proj_file
3629     (ProjFrame.__FillAvailList): Deal with any warnings returned by
3630     get_system_proj_file or get_user_proj_file.
3631    
3632     * test/test_proj.py (TestProjFile.doTestRead): Check the warnings.
3633     (TestProjFileWithInvalidParameters.file_contents): New test cases
3634     to test whether read_proj_file handles invalid projection
3635     parameters correctly
3636     (TestProjFile.test_get_system_proj_file): New. Simple test for
3637     resource.get_system_proj_file
3638    
3639 bh 1785 2003-10-07 Bernhard Herzog <[email protected]>
3640    
3641     * test/test_derivedshapestore.py
3642     (TestDerivedShapeStoreExceptions.tearDown): Clear the session
3643     properly so that the temporary directories get deleted correctly
3644    
3645 bh 1773 2003-10-06 Bernhard Herzog <[email protected]>
3646    
3647 bh 1783 Handle the title changes in a proper MVC way.
3648    
3649     * Thuban/UI/mainwindow.py (MainWindow.__init__): Subscribe to the
3650     canvas' TITLE_CHANGED messages
3651     (MainWindow.update_title): New. Update the main window's title
3652     (MainWindow.__SetTitle): Removed. Use update_title instead.
3653     (MainWindow.SetMap): Use update_title instead of __SetTitle
3654     (MainWindow.RenameMap): Do change the window title explicitly
3655     here. That's handled in a proper MVC way now.
3656     (MainWindow.title_changed): New. Subscriber for the TITLE_CHANGED
3657     messages
3658    
3659     * Thuban/Lib/connector.py (Conduit): New class to help classes
3660     that forward messages
3661    
3662     * Thuban/UI/viewport.py: Forward the map's TITLE_CHANGED messages
3663     (ViewPort): Derive from Conduit instead of Publisher
3664     (ViewPort.Subscribe, ViewPort.Unsubscribe): Use the new base class
3665     when calling the inherited versions
3666     (ViewPort._subscribe_map, ViewPort._unsubscribe_map): New helper
3667     methods to subscribe and unsubscribe map messages
3668     (ViewPort.SetMap, ViewPort.Destroy): Use the new helper methods to
3669     handle the map subscriptions
3670     (ViewPort.Map, ViewPort.map_projection_changed)
3671     (ViewPort.layer_projection_changed): Add or update doc-strings
3672    
3673     * test/test_connector.py (TestPublisher.test_issue_simple): Fix
3674     typo
3675     (MyConduit): Helper class for the Conduit test.
3676     (TestConduit): Test cases for Conduit
3677    
3678     * test/test_connector.py: Use support.run_tests as main.
3679    
3680     * test/test_viewport.py (ViewPortTest.setUp): Also subscribe to
3681     the TITLE_CHANGED messages
3682     (ViewPortTest.test_forwarding_title_changed): New test to check
3683     whether the viewport forwards the map's TITLE_CHANGED messages
3684     (TestViewportWithPostGIS.tearDown): Call the map's Destroy method
3685     after the port's because the latter may require a still functional
3686     map.
3687    
3688     2003-10-06 Bernhard Herzog <[email protected]>
3689    
3690 bh 1777 * Thuban/UI/application.py (ThubanApplication.maps_changed): Add
3691     doc-string
3692    
3693     2003-10-06 Bernhard Herzog <[email protected]>
3694    
3695 bh 1775 * test/test_viewport.py (ViewPortTest.setUp)
3696     (SimpleViewPortTest.test_init_with_size): Move the test for the
3697     initial size as a constructor parameter from ViewPortTest.setUp
3698     method to a new separate test in SimpleViewPortTest.
3699    
3700     2003-10-06 Bernhard Herzog <[email protected]>
3701    
3702 bh 1773 * test/test_viewport.py (MockView): New class derived from
3703     ViewPort with a mock implementation of GetTextExtent to be used in
3704     the test cases
3705     (ViewPortTest.setUp): Use MockView instead of ViewPort
3706    
3707     * Thuban/UI/viewport.py (ViewPort.GetTextExtent): Turn this method
3708     into what would be a "pure virtual function" in C++: always raise
3709     NotImplementedError. Mock implementations for test cases don't
3710     belong into the real code
3711    
3712 bh 1770 2003-10-02 Bernhard Herzog <[email protected]>
3713    
3714     * test/test_layer.py (TestLayer.test_empty_layer): Explicitly
3715     close the dbf file we create so that it's contents have been
3716     written properly.
3717    
3718     * libraries/shapelib/shptree.c, libraries/shapelib/shpopen.c,
3719     libraries/shapelib/shapefil.h, libraries/shapelib/dbfopen.c:
3720     Update to shapelib 1.2.10
3721    
3722 jan 1767 2003-10-01 Jan-Oliver Wagner <[email protected]>
3723    
3724     * Thuban/UI/tree.py, Thuban/UI/main.py: Remove the #! line as
3725     it annoys lintian which warns about these files not being
3726     executable. The #! isn't necessary here since if you absolutely
3727     must execute them you can always say "python <filename>".
3728    
3729 bh 1757 2003-09-26 Bernhard Herzog <[email protected]>
3730    
3731 bh 1760 * Thuban/Model/classgen.py (GenQuantiles0): Removed since it's
3732     only used in GREAT-ER but not used in Thuban itself. When GREAT-ER
3733     is ported to a newer the import will fail, so it should be noticed
3734     immediately that this function is gone.
3735     Fixes RT#1919
3736    
3737     2003-09-26 Bernhard Herzog <[email protected]>
3738    
3739 bh 1757 Add a DTD for the projection files and make thuban write valid
3740     projection files
3741    
3742     * Resources/XML/projfile.dtd: New. DTD for thuban's projection
3743     files
3744    
3745     * Thuban/Model/resource.py (ProjFileSaver.write): Use
3746     'projectionlist' as the name in the document type declaration so
3747     that it matches the element type of the root element.
3748    
3749     * test/test_proj.py (sample_projfile, sample_projfile2): Use
3750     'projectionlist' as the name in the document type declaration just
3751     as it is done now in the files thuban would write
3752     (sample_projfile, sample_projfile_data): Fix spelling of
3753     "Mercator"
3754     (TestProjFile.doTestWrite): Validate the written and the expected
3755     XML data
3756     (TestProjFile): Derive from ValidationTest so that we can run xml
3757     validation tests
3758    
3759 bh 1751 2003-09-24 Bernhard Herzog <[email protected]>
3760    
3761     * Thuban/UI/renderer.py (ExportRenderer.render_legend): Do not
3762     modify the list returned by map.Layers() in place since it is the
3763     actual list of layers used by the map.
3764    
3765 jan 1745 2003-09-23 Jan-Oliver Wagner <[email protected]>
3766    
3767     * Doc/manual/thuban-manual.xml: Added subsection to chapter
3768     Extensions to describe the extensions coming with the Thuban
3769     standard package (gns2shp and importAPR).
3770    
3771 bh 1743 2003-09-23 Bernhard Herzog <[email protected]>
3772    
3773     * libraries/thuban/wxproj.cpp (project_point): if there's an
3774     inverse but no forward projection, convert to degrees after
3775     applying the inverse projection. Fixes RT#2096
3776    
3777     * test/test_wxproj.py: New. Test cases for wxproj.so. One test
3778     implicitly tests for the fix to RT#2096
3779    
3780     * test/support.py (FloatComparisonMixin.assertFloatSeqEqual):
3781     Check that the sequences have the same lengths
3782    
3783     * Resources/Projections/defaults.proj (Geographic projection): Use
3784     a much more precise value for the to_meter attribute.
3785    
3786 bh 1737 2003-09-22 Bernhard Herzog <[email protected]>
3787    
3788     * test/support.py (initthuban): Make sure to unset the LANG env.
3789     var. so that tests that compare translated strings work. Solves RT
3790     #2094
3791    
3792 jan 1730 2003-09-22 Jan-Oliver Wagner <[email protected]>
3793    
3794 jan 1735 Small improvement of APR import.
3795    
3796     * Extensions/importAPR/test/test_apr.py (aprTest.test_LClass):
3797     Added tests for text-ranges.
3798    
3799     * Extensions/importAPR/apr.py (APR_LClass.GetThubanRange): Now
3800     returns a string object if the range is based on text.
3801    
3802     * Extensions/importAPR/importAPR.py (import_apr_dialog): Unified
3803     range retrieval.
3804    
3805     2003-09-22 Jan-Oliver Wagner <[email protected]>
3806    
3807 jan 1730 Initial version of the importAPR extension which is in
3808     experimental state.
3809    
3810     * /Extensions/importAPR/, /Extensions/importAPR/samples/,
3811     /Extensions/importAPR/test/: New directories.
3812    
3813     * /Extensions/importAPR/samples/README: New: Howto load the samples.
3814    
3815     * /Extensions/importAPR/samples/iceland.apr: New: A sample APR
3816     file which refers to the Thuban Iceland demo data.
3817    
3818     * /Extensions/importAPR/test/README: New: Howto execute the tests.
3819    
3820     * /Extensions/importAPR/test/test_apr.py: New: Tests for APR classes.
3821    
3822     * /Extensions/importAPR/apr.py: New: Classes for ArcView Objects
3823     as in '.apr'-files.
3824    
3825     * /Extensions/importAPR/odb.py: New: Classes for generic ArcView
3826     ODB Objects as in '.apr', '.avl' and other files.
3827    
3828     * /Extensions/importAPR/__init__.py: New: Init to make this
3829     directory a package.
3830    
3831     * /Extensions/importAPR/importAPR.py: New: Import a ArcView
3832     project file (.apr) and convert it to Thuban.
3833    
3834     2003-09-22 Jan-Oliver Wagner <[email protected]>
3835    
3836     * Extensions/gns2shp.gns2shp.py: The main module of gns2shp.
3837    
3838 jan 1720 2003-09-19 Jan-Oliver Wagner <[email protected]>
3839    
3840     * Doc/manual/thuban-manual.xml: Extended section 'Installation'
3841     with description on RPM installation and RPM binary package
3842     creation.
3843    
3844 bh 1718 2003-09-18 Bernhard Herzog <[email protected]>
3845    
3846     * setup.py (data_files): Only add the mo files if the Locales
3847     directory actually exists, so that setup.py works with a fresh CVS
3848     checkout
3849    
3850 jan 1716 2003-09-12 Jan-Oliver Wagner <[email protected]>
3851    
3852     * Examples/simple_extensions/simple_tool.py: bugfix: Tool is now
3853     in viewport, not anymore in view
3854    
3855 jan 1714 2003-09-04 Jan-Oliver Wagner <[email protected]>
3856    
3857     Introducing first Extension (gns2shp).
3858    
3859     * Extensions, Extensions/gns2shp, Extensions/gns2shp/test: New.
3860    
3861     * Extensions/__init__.py: New. init to make this dir a package.
3862    
3863     * Extensions/gns2shp/__init__.py: New. init to make this dir a package.
3864    
3865     * Extensions/gns2shp/test/README: New. some info on this test directory.
3866    
3867     * Extensions/gns2shp/test/ls.txt: New. test data set (Liechtenstein).
3868    
3869     * Extensions/gns2shp/test/test_gns2shp.py: New. Test for correct creation
3870     of Shapefile from GNS text file format
3871    
3872 jan 1705 2003-09-03 Jan-Oliver Wagner <[email protected]>
3873    
3874 jan 1707 Fix/workaround for bug #2019:
3875     https://intevation.de/rt/webrt?serial_num=2019
3876    
3877     * Thuban/UI/identifyview.py (IdentifyView.ID_STOP): New.
3878     (IdentifyView.__init__): Added another button that allows to
3879     stop the identify mode.
3880     (IdentifyView.OnStop): New. Stops the identify mode.
3881    
3882     2003-09-03 Jan-Oliver Wagner <[email protected]>
3883    
3884 jan 1705 Introducing a new exception dialog that allows to exit the
3885     application immediately.
3886     This fixes bug #2060: https://intevation.de/rt/webrt?serial_num=2060
3887    
3888     * Thuban/UI/exceptiondialog.py: New. A special exception dialog.
3889    
3890     * Thuban/UI/application.py (ThubanApplication.ShowExceptionDialog):
3891     Made strings available to translations. Exchanged the simple
3892     ScrolledMessageDialog by the new ExceptionDialog.
3893    
3894 bh 1694 2003-09-01 Bernhard Herzog <[email protected]>
3895    
3896 bh 1701 * NEWS: New. Summary of changes and release notes.
3897    
3898     * MANIFEST.in: Add NEWS
3899    
3900     2003-09-01 Bernhard Herzog <[email protected]>
3901    
3902 bh 1699 * MANIFEST.in: Correct the include statement for the mo-files and
3903     include the documentation too.
3904    
3905     * setup.py (data_files): Add the .mo files
3906     (setup call): Up to version 0.9.0
3907    
3908     2003-09-01 Bernhard Herzog <[email protected]>
3909    
3910 bh 1696 * Thuban/UI/dbdialog.py (ChooseDBTableDialog.__init__): Change the
3911     parameter list to just parent and session
3912     (ChooseDBTableDialog.__set_properties): Removed. Setting the
3913     selection of empty list boxes is not allowed (and produces C++
3914     assertion errors) and the rest of the setup is better done in
3915     __init__ anyway.
3916     (ChooseDBTableDialog.OnCancel, ChooseDBTableDialog.OnOK)
3917     (ChooseDBTableDialog.OnLBDClick, DBDialog.OnOK): Use the Python
3918     builtins True/False for booleans to avoid warnings from wxPython
3919    
3920     * Thuban/UI/mainwindow.py (MainWindow.AddDBLayer): Adapt to new
3921     ChooseDBTableDialog constructor parameters.
3922    
3923     2003-09-01 Bernhard Herzog <[email protected]>
3924    
3925 bh 1694 * Thuban/Model/postgisdb.py
3926     (PostGISTable): Extend doc-string
3927     (PostGISTable._fetch_table_information): Set the column index
3928     correctly, pretending ignored columns don't exist.
3929    
3930     * test/test_postgis_db.py (TestPostGISIgnoredColumns): New tests
3931     for postgis tables with data types not yet supported by thuban.
3932    
3933 bh 1692 2003-08-29 Bernhard Herzog <[email protected]>
3934    
3935     * HOWTO-Release: Tweak item about running the tests.
3936    
3937 jan 1690 2003-08-29 Jan-Oliver Wagner <[email protected]>
3938    
3939     * /Doc/manual/thuban-manual.xml: updated to version 1.0pre2.
3940    
3941 bh 1688 2003-08-29 Bernhard Herzog <[email protected]>
3942    
3943     Add some missing parameters to projections. Proj complains about
3944     them on windows but for some reason not on Linux.
3945    
3946     * test/test_save.py (SaveSessionTest.testLayerProjection): Add
3947     missing required projection parameters
3948    
3949     * test/test_proj.py (TestProjFile.test): Add missing required
3950     projection parameters
3951    
3952     * test/test_load_0_8.py (TestLayerProjection.file_contents)
3953     (TestLayerProjection.test): Add missing required projection
3954     parameters and tests for them
3955    
3956     * test/test_load.py (TestLayerProjection.file_contents)
3957     (TestLayerProjection.test): Add missing required projection
3958     parameters and tests for them
3959    
3960     * test/test_layer.py (TestLayer.test_base_layer): Add missing
3961     required projection parameters
3962    
3963     2003-08-29 Bernhard Herzog <[email protected]>
3964    
3965     * libraries/pyprojection/Projection.i: Use pj_get_errno_ref to
3966     access the pj_errno because directly accessing pj_errno doesn't
3967     work on windows if the proj library is in a DLL
3968    
3969     * libraries/pyprojection/Projection_wrap.c: Update from Projection.i
3970    
3971 bh 1672 2003-08-28 Bernhard Herzog <[email protected]>
3972    
3973 bh 1685 * test/test_proj.py: Import things from Thuban after calling
3974     initthuban
3975    
3976     * test/test_load.py (LoadSessionTest.filenames): New class
3977     variable with the filename attributes to normalize
3978     (LoadSessionTest.check_format): Pass self.filenames to
3979     sax_eventlist to normalize the filename attributes
3980    
3981     * test/xmlsupport.py: Add cvs keywords
3982     (SaxEventLister.__init__): New parameter filenames which indicates
3983     attributes that contain filenames
3984     (SaxEventLister.startElementNS): Normalize the filename attributes
3985     with os.path.normpath
3986     (sax_eventlist): New parameter filenames to pass through to
3987     SaxEventLister
3988    
3989     * test/test_derivedshapestore.py: Make this file callable as a
3990     program to execute the tests
3991     (TestDerivedShapeStoreExceptions.test_table_with_wrong_size): Bind
3992     the session to self.session so that it gets destroyed properly
3993    
3994     * test/test_layer.py (TestLayer.tearDown): Call the session's
3995     Destroy method
3996    
3997     * test/test_map.py (TestMapBase.tearDown): Destroy self.session
3998     too if it exists
3999     (TestMapAddLayer.test_add_layer): Bind the session to self.session
4000     so that it gets destroyed properly
4001    
4002     * test/postgissupport.py (reason_for_not_running_tests): Add a
4003     test for the existence of popen2.Popen4.
4004    
4005     * test/test_save.py (SaveSessionTest.tearDown): New. Provide a
4006     reliable way to destroy the sessions created in the test cases
4007     (SaveSessionTest.test_dbf_table): Bind the session to self.session
4008     so that it gets destroyed properly
4009     (SaveSessionTest.testLayerProjection): Bind the session to
4010     self.session so that it gets destroyed properly
4011    
4012     * test/test_session.py (UnreferencedTablesTests.tearDown): Make
4013     sure that the session is destroyed properly
4014    
4015     * test/test_shapefilestore.py: Make this callable as a program to
4016     execute the tests
4017    
4018     * test/test_scalebar.py: Remove unnecessary import of _ from
4019     Thuban
4020    
4021     * test/support.py (print_garbage_information): Call initthuban
4022     here because it may be called indirectly from test cases that test
4023     test support modules which do not use anything from thuban itself
4024     (ThubanTestProgram.runTests): Remove unnecessary debug print
4025    
4026     2003-08-28 Bernhard Herzog <[email protected]>
4027    
4028 bh 1672 * Thuban/version.py (longversion): Update to 0.9
4029    
4030     * Thuban/UI/mainwindow.py: Remove some unused imports
4031    
4032     * README: Add section about required additional software. Add date
4033     and revision CVS keywords
4034    
4035     * HOWTO-Release: Add item about the translations. Add date and
4036     revision CVs keywords and change formatting to match README a bit
4037     better
4038    
4039     * po/de.po: Update for 0.9
4040    
4041     * test/README: Tweak the wording a little because many tests are
4042     not really unittest.
4043    
4044 bh 1663 2003-08-27 Bernhard Herzog <[email protected]>
4045    
4046 bh 1665 As preparation for the 0.9 release, switch thuban files to a
4047     non-dev namespace
4048    
4049     * Thuban/Model/save.py (SessionSaver.write_session): Write files
4050     with the http://thuban.intevation.org/dtds/thuban-0.9.dtd
4051     namespace
4052    
4053     * Thuban/Model/load.py (SessionLoader.__init__): Accept the
4054     http://thuban.intevation.org/dtds/thuban-0.9.dtd namespace too
4055    
4056     * test/test_save.py (SaveSessionTest.dtd)
4057     (SaveSessionTest.testEmptySession)
4058     (SaveSessionTest.testSingleLayer)
4059     (SaveSessionTest.testLayerProjection)
4060     (SaveSessionTest.testRasterLayer)
4061     (SaveSessionTest.testClassifiedLayer)
4062     (SaveSessionTest.test_dbf_table)
4063     (SaveSessionTest.test_joined_table)
4064     (SaveSessionTest.test_save_postgis): Update for new namespace
4065    
4066     * test/test_load.py (LoadSessionTest.dtd, TestSingleLayer)
4067     (TestLayerVisibility.file_contents, TestLabels.file_contents)
4068     (TestLayerProjection.file_contents)
4069     (TestRasterLayer.file_contents, TestJoinedTable.file_contents)
4070     (TestPostGISLayer.file_contents)
4071     (TestPostGISLayerPassword.file_contents)
4072     (TestLoadError.file_contents, TestLoadError.test): Update for new
4073     namespace
4074    
4075     2003-08-27 Bernhard Herzog <[email protected]>
4076    
4077 bh 1663 Make the table interface distinguish between row ids (an integer
4078     that uniquely identifies a row) and row ordinals (a simple row
4079     count from 0 to NumRows() - 1)
4080    
4081     * Thuban/Model/postgisdb.py (PostGISTable.RowIdToOrdinal)
4082     (PostGISTable.RowOrdinalToId): New methods to conver between row
4083     ids and row ordinals
4084     (PostGISTable.ReadRowAsDict, PostGISTable.ReadValue): New keyword
4085     parameter row_is_ordinal to indicate whether the row parameter is
4086     the row id or the ordinal
4087    
4088     * Thuban/Model/transientdb.py (TransientTableBase.RowIdToOrdinal)
4089     (TransientTableBase.RowOrdinalToId)
4090     (AutoTransientTable.RowIdToOrdinal)
4091     (AutoTransientTable.RowOrdinalToId): Same new methods as in
4092     PostGISTable.
4093     (TransientTableBase.ReadRowAsDict, TransientTableBase.ReadValue)
4094     (AutoTransientTable.ReadRowAsDict, AutoTransientTable.ReadValue):
4095     Same new parameter as in PostGISTable.
4096    
4097     * Thuban/Model/table.py (DBFTable.RowIdToOrdinal)
4098     (DBFTable.RowOrdinalToId, MemoryTable.RowIdToOrdinal)
4099     (MemoryTable.RowOrdinalToId): Same new methods as in PostGISTable.
4100     (DBFTable.ReadValue, DBFTable.ReadRowAsDict)
4101     (MemoryTable.ReadValue, MemoryTable.ReadRowAsDict): Same new
4102     parameter as in PostGISTable.
4103    
4104     * Thuban/UI/tableview.py (DataTable.RowIdToOrdinal)
4105     (DataTable.RowOrdinalToId): New methods to convert between row ids
4106     and row ordinals.
4107     (TableGrid.SelectRowById): New method to select a row based on its
4108     ID as opposed to its ordinal
4109     (DataTable.GetValue, TableGrid.OnRangeSelect)
4110     (TableGrid.OnSelectCell, LayerTableGrid.select_shapes)
4111     (QueryTableFrame.OnQuery, QueryTableFrame.get_selected)
4112     (LayerTableFrame.__init__): Convert between row ids and row
4113     ordinals as appropriate
4114    
4115     * test/postgissupport.py (PostGISDatabase.__init__): Add
4116     doc-string.
4117     (PostGISDatabase.initdb): The optional third item in a tuple in
4118     tables is now a (key, value) list with additional arguments to
4119     pass to upload_shapefile
4120     (upload_shapefile): New parameter gid_offset to allow gids that
4121     are not the same as the shapeids in the shapefile
4122     (PostgreSQLServer.get_default_static_data_db): Use the new
4123     gid_offset to make the gids in landmarks 1000 higher than the
4124     shapeids in the shapefile
4125    
4126     * test/test_viewport.py
4127     (TestViewportWithPostGIS.test_find_shape_at_point): Adapt to the
4128     new shapeids in the landmarks table
4129    
4130     * test/test_transientdb.py
4131     (TestTransientTable.run_iceland_political_tests)
4132     (TestTransientTable.test_transient_joined_table): Add tests for
4133     the new table methods and new keywords arguments.
4134    
4135     * test/test_postgis_db.py
4136     (TestPostGISTable.test_read_row_as_dict_row_count_mode)
4137     (TestPostGISTable.test_read_value_row_count_mode)
4138     (TestPostGISTable.test_row_id_to_ordinal)
4139     (TestPostGISTable.test_row_oridnal_to_id): New test for the new
4140     table methods and the new arguments
4141     (TestPostGISShapestorePoint.test_shapes_in_region)
4142     (TestPostGISShapestorePoint.test_shape_raw_data)
4143     (TestPostGISShapestorePoint.test_shape_points)
4144     (TestPostGISShapestorePoint.test_shape_shapeid)
4145     (TestPostGISShapestorePoint.test_all_shapes)
4146     (TestPostGISTable.test_simple_query)
4147     (TestPostGISTable.test_simple_query)
4148     (TestPostGISTable.test_simple_query)
4149     (TestPostGISTable.test_read_value)
4150     (TestPostGISTable.test_read_row_as_dict): Adapt to the new
4151     shapeids in the landmarks table
4152    
4153     * test/test_memory_table.py
4154     (TestMemoryTable.test_read_row_as_dict_row_count_mode)
4155     (TestMemoryTable.test_read_value_row_count_mode)
4156     (TestMemoryTable.test_row_id_to_ordinal)
4157     (TestMemoryTable.test_row_oridnal_to_id): New test for the new
4158     table methods and the new arguments
4159    
4160     * test/test_dbf_table.py
4161     (TestDBFTable.test_read_row_as_dict_row_count_mode)
4162     (TestDBFTable.test_read_value_row_count_mode)
4163     (TestDBFTable.test_row_id_to_ordinal)
4164     (TestDBFTable.test_row_oridnal_to_id): New test for the new table
4165     methods and the new arguments
4166    
4167 bh 1659 2003-08-26 Bernhard Herzog <[email protected]>
4168    
4169 bh 1661 * Thuban/Model/postgisdb.py (PostGISShapeStore.BoundingBox): Use a
4170     more postgis specific but much faster method to get the bounding
4171     box
4172    
4173     2003-08-26 Bernhard Herzog <[email protected]>
4174    
4175 bh 1659 * Thuban/Model/postgisdb.py (PostGISTable.Title)
4176     (PostGISShapeStore.AllShapes): Add these missing methods.
4177     (PostGISShapeStore.ShapesInRegion): No need to raise
4178     StopIteration. We can simply return
4179    
4180     * test/test_postgis_db.py (TestPostGISTable.test_title)
4181     (TestPostGISShapestorePoint.test_all_shapes): New tests for the
4182     new methods
4183    
4184 bh 1643 2003-08-25 Bernhard Herzog <[email protected]>
4185    
4186 bh 1657 * Thuban/Model/postgisdb.py (shapetype_map): Add MUTLIPOLYGON.
4187    
4188     * test/test_postgis_db.py (PolygonTests): New class containing
4189     those tests from TestPostGISShapestorePolygon that can also be
4190     used to test MUTLIPOLYGON tables
4191     (TestPostGISShapestorePolygon): Most tests are now in PolygonTests
4192     so derive from that
4193     (TestPostGISShapestoreMultiPolygon): New class with tests for
4194     MUTLIPOLYGON tables
4195    
4196     * test/postgissupport.py (PostGISDatabase.initdb): Allow the
4197     tables argument to have tuples with three items to override the
4198     WKT type used.
4199     (PostgreSQLServer.get_default_static_data_db): Use the above to
4200     create a polygon table with MUTLIPOLYGONs
4201     (point_to_wkt, coords_to_point, polygon_to_wkt, coords_to_polygon)
4202     (arc_to_wkt, coords_to_multilinestring): Rename from *_to_wkt to
4203     coords_to*
4204     (coords_to_multipolygon): New. Convert to MUTLIPOLYGON
4205     (wkt_converter): New. Map WKT types to converters
4206     (upload_shapefile): New parameter force_wkt_type to use a
4207     different WKT type than the default
4208    
4209     2003-08-25 Bernhard Herzog <[email protected]>
4210    
4211 bh 1655 * Thuban/UI/application.py
4212     (ThubanApplication.run_db_param_dialog): New. Suitable as a
4213     db_connection_callback. Main difference is that the dialog run
4214     from this method doesn't have a parent so it can be used even when
4215     there is no main window
4216     (ThubanApplication.OpenSession): Use self.run_db_param_dialog if
4217     no db_connection_callback was given. This way the dialog pops up
4218     even when the .thuban file was given as a command line parameter.
4219    
4220     2003-08-25 Bernhard Herzog <[email protected]>
4221    
4222 bh 1653 * Thuban/UI/view.py (MapCanvas.OnLeftUp): Release the the mouse
4223     before calling MouseLeftUp. MouseLeftUp may pop up modal dialogs
4224     which leads to an effectively frozen X session because the user
4225     can only interact with the dialog but the mouse is still grabbed
4226     by the canvas.
4227     Also, call the tool's Hide method before MouseLeftUp because
4228     MouseLeftUp may change the tool's coordinates.
4229    
4230     2003-08-25 Bernhard Herzog <[email protected]>
4231    
4232 bh 1651 * Thuban/UI/application.py (ThubanApplication.OpenSession): Catch
4233     LoadCancelled exceptions and handle them by returning immediately.
4234    
4235     2003-08-25 Bernhard Herzog <[email protected]>
4236    
4237 bh 1649 GUI part of loading sessions with postgis connections which may
4238     require user interaction to get passwords or updated parameters
4239    
4240     * Thuban/UI/dbdialog.py (DBDialog): Reimplement to make it look a
4241     bit nucer and be more generic.
4242     (DBFrame.OnAdd): Adapt to new DBDialog interface
4243    
4244     * Thuban/UI/application.py (ThubanApplication.OpenSession): New
4245     optional parameter db_connection_callback which is passed to
4246     load_session.
4247    
4248     * Thuban/UI/mainwindow.py (MainWindow.run_db_param_dialog): New.
4249     Suitable as a db_connection_callback
4250     (MainWindow.OpenSession): Use self.run_db_param_dialog as the
4251     db_connection_callback of the application's OpenSession method
4252    
4253    
4254     2003-08-25 Bernhard Herzog <[email protected]>
4255    
4256 bh 1647 Basic loading of sessions containing postgis connections:
4257    
4258     * Thuban/Model/load.py (LoadError): Add doc-string
4259     (LoadCancelled): New exception class to indicate a cancelled load
4260     (SessionLoader.__init__): Add the db_connection_callback parameter
4261     which will be used by the loader to get updated parameters and a
4262     password for a database connection
4263     (SessionLoader.__init__): Add the new XML elements to the
4264     dispatchers dictionary
4265     (SessionLoader.check_attrs): Two new conversions, ascii to convert
4266     to a byte-string object and idref as a generic id reference
4267     (SessionLoader.start_dbconnection)
4268     (SessionLoader.start_dbshapesource): New. Handlers for the new XML
4269     elements
4270     (load_session): Add the db_connection_callback to pass through the
4271     SessionLoader
4272    
4273     * test/test_load.py (TestPostGISLayer, TestPostGISLayerPassword):
4274     New classes to test loading of sessions with postgis database
4275     connections.
4276    
4277     2003-08-25 Bernhard Herzog <[email protected]>
4278    
4279 bh 1645 * Thuban/UI/mainwindow.py (__ThubanVersion__): Remove this and
4280     replace it and the comment with __BuildDate__ by the Source: and
4281     Id: cvs keywords as used in the other files.
4282    
4283     2003-08-25 Bernhard Herzog <[email protected]>
4284    
4285 bh 1643 * Thuban/Model/load.py (SessionLoader.check_attrs): Raise a
4286     LoadError when a required attribute is missing. The code used to
4287     be commented out for some reason, but probably should have been
4288     active.
4289    
4290     * test/test_load.py (TestLoadError.test): Test the message in the
4291     LoadError too to make sure it really is about the missing
4292     attribute
4293    
4294 bh 1632 2003-08-22 Bernhard Herzog <[email protected]>
4295 bh 1641
4296     * test/test_save.py (SaveSessionTest.test_dbf_table)
4297     (SaveSessionTest.test_joined_table): Add XML validation tests.
4298    
4299     2003-08-22 Bernhard Herzog <[email protected]>
4300    
4301 bh 1639 Implement saving a session with a postgis connection
4302 bh 1632
4303 bh 1639 * Resources/XML/thuban-0.9.dtd (dbconnection, dbshapesource) New
4304     elements for database connections and shapestores using db
4305     connections
4306     (session): Add the dbconnections to the content model
4307    
4308     * Thuban/Model/save.py (SessionSaver.write_db_connections): New.
4309     Write the db connections
4310     (SessionSaver.write_session): Call write_db_connections to write
4311     the connection before the data sources
4312     (SessionSaver.write_data_containers): Handle postgis shapestores
4313    
4314     * test/test_save.py (SaveSessionTest.thubanids)
4315     (SaveSessionTest.thubanidrefs): Update for new DTD
4316     (SaveSessionTest.test_save_postgis): New. Test saving a session
4317     with postgis connections
4318    
4319     * Thuban/Model/postgisdb.py (PostGISTable.DBConnection)
4320     (PostGISTable.TableName): New accessor methods for the connection
4321     and table name
4322    
4323     * test/test_postgis_db.py (TestPostGISTable.test_dbconn)
4324     (TestPostGISTable.test_dbname): New methods to test the new
4325     PostGISConnection methods
4326    
4327     2003-08-22 Bernhard Herzog <[email protected]>
4328    
4329 bh 1637 * Thuban/Model/postgisdb.py (ConnectionError): New exception class
4330     for exceptions occurring when establishing a Database connection
4331     (PostGISConnection.connect): Catch psycopg.OperationalError during
4332     connects and raise ConnectionError.
4333    
4334     * test/test_postgis_db.py (TestPostgisDBExceptions): New class for
4335     tests for database exceptions
4336    
4337     2003-08-22 Bernhard Herzog <[email protected]>
4338    
4339 bh 1635 Prepare the test suite for tests with required authentication
4340    
4341     * test/postgissupport.py (PostgreSQLServer.__init__): Add instance
4342     variables with two predefined users/passwords, one for the admin
4343     and one for a non-privileged user.
4344     (PostgreSQLServer.createdb): Pass the admin name to initdb and add
4345     the non-privileged user to the database and set the admin password
4346     (PostgreSQLServer.wait_for_postmaster): Use the admin user name.
4347     Better error reporting
4348     (PostgreSQLServer.connection_params)
4349     (PostgreSQLServer.connection_string): New methods to return
4350     information about how to connect to the server
4351     (PostgreSQLServer.execute_sql): New. Convenience method to execute
4352     SQL statements
4353     (PostgreSQLServer.require_authentication): Toggle whether the
4354     server requires authentication
4355     (PostgreSQLServer.create_user, PostgreSQLServer.alter_user): New.
4356     Add or alter users
4357     (PostGISDatabase.initdb): Pass the admin name one the
4358     subprocesses' command lines. Grant select rights on
4359     geometry_columns to everybody.
4360     (upload_shapefile): Use the admin name and password when
4361     connecting. Grant select rights on the new table to everybody.
4362    
4363     * test/test_viewport.py (TestViewportWithPostGIS.setUp): Use the
4364     server's new methods to get the connection parameters.
4365    
4366     * test/test_postgis_session.py (TestSessionWithPostGIS.setUp)
4367     (TestSessionWithPostGIS.test_remove_dbconn_exception): Use the
4368     server's new methods to get the connection parameters.
4369    
4370     * test/test_postgis_db.py
4371     (TestPostGISConnection.test_gis_tables_empty)
4372     (TestPostGISConnection.test_gis_tables_non_empty)
4373     (PostGISStaticTests.setUp): Use the server's new methods to get
4374     the connection parameters.
4375    
4376     2003-08-22 Bernhard Herzog <[email protected]>
4377    
4378 bh 1632 * Thuban/UI/about.py (About.__init__): Add the psycopg version.
4379    
4380     * Thuban/version.py: Add psycopg version
4381    
4382     * Thuban/Model/postgisdb.py (psycopg_version): New. Return the
4383     version of the psycopg module
4384    
4385     2003-08-22 Bernhard Herzog <[email protected]>
4386    
4387     * Thuban/UI/dbdialog.py (DBPwdDlg): Removed because it's not used.
4388     (DBFrame.OnEdit): Removed because it's not used and wouldn't work
4389     at the moment. The functionality should probably be implemented
4390     some time, though.
4391 bh 1633 (DBFrame.OnRemove): Display a message if the connection can't be
4392     removed because it's still in use.
4393 bh 1632
4394 jan 1629 2003-08-22 Jan-Oliver Wagner <[email protected]>
4395    
4396     * Thuban/UI/about.py (About.__init__): split up the huge about
4397     text into elements/lists for easier translation. This fixes bug
4398     https://intevation.de/rt/webrt?serial_num=2058
4399     Also, made some forgotten string available for the i18n.
4400    
4401 bh 1627 2003-08-21 Bernhard Herzog <[email protected]>
4402    
4403     Make postgis support really optional including insensitive menu
4404     items.
4405    
4406     * Thuban/Model/postgisdb.py (has_postgis_support): New. Return
4407     whether the postgis is supported.
4408    
4409     * Thuban/UI/dbdialog.py: Put the psycopg import into try..except
4410     to make postgis support optional
4411    
4412     * Thuban/UI/mainwindow.py (_has_postgis_support): New. Context
4413     version of Thuban.Model.postgisdb.has_postgis_support
4414     (database_management command): Make it only sensitive if postgis
4415     is supported.
4416    
4417 jan 1623 2003-08-21 Jan-Oliver Wagner <[email protected]>
4418    
4419 jan 1626 * Doc/manual/thuban-manual.xml: Added CVS revision for rev-history.
4420     (section Adding and Removing Layers): Added text and described
4421     multi-selection.
4422     (chapter Extensions): New.
4423    
4424     2003-08-21 Jan-Oliver Wagner <[email protected]>
4425    
4426 jan 1623 * Thuban/UI/mainwindow.py (MainWindow.AddLayer): Changed dialog
4427     settings to allow multiple files to load into the map.
4428     Also reduced selection to *.shp as a default.
4429    
4430 bh 1621 2003-08-20 Bernhard Herzog <[email protected]>
4431    
4432     Add dialogs and commands to open database connections and add
4433     database layers.
4434    
4435     * Thuban/UI/mainwindow.py (MainWindow.DatabaseManagement): New
4436     method to open the database connection management dialog
4437     (MainWindow.AddDBLayer): New method to add a layer from a database
4438     (_has_dbconnections): New helper function to use for sensitivity
4439     (database_management command, layer_add_db command): New commands
4440     that call the above new methods.
4441     (main_menu): Add the new commands to the menu.
4442    
4443     * Thuban/Model/postgisdb.py (PostGISConnection.__init__)
4444     (PostGISConnection.connect): Establish the actual connection in a
4445     separate method and call it in __init__. This makes it easier to
4446     override the behavior in test cases
4447     (PostGISConnection.BriefDescription): New method to return a brief
4448     description for use in dialogs.
4449    
4450     * test/test_postgis_db.py (NonConnection): DB connection that
4451     doesn't actually connect
4452     (TestBriefDescription): New class with tests for the new
4453     BriefDescription method
4454    
4455 jan 1619 2003-08-19 Jan-Oliver Wagner <[email protected]>
4456    
4457     Moved anything from extensions to libraries.
4458    
4459     * libraries: New.
4460    
4461     * libraries/ pyprojection, pyshapelib, shapelib, thuban: New.
4462    
4463     * libraries/pyprojection/ LICENSE, MANIFEST.in, Projection.i,
4464     Projection.py, Projection_wrap.c, setup.py, swighelp.txt: These files have
4465     been moved here from thuban/extensions/pyprojection/
4466     See there in the Attic for the older history.
4467    
4468     * libraries/pyshapelib/ COPYING, ChangeLog, NEWS, README, dbflib.i,
4469     dbflib.py, dbflib_wrap.c, pyshapelib_api.h, pytest.py, setup.py,
4470     shapelib.i, shapelib.py, shapelib_wrap.c, shptreemodule.c: These files
4471     have been moved here from thuban/extensions/pyshapelib/
4472     See there in the Attic for the older history.
4473    
4474     * libraries/shapelib/ dbfopen.c, shapefil.h, shpopen.c, shptree.c: These
4475     files have been moved here from thuban/extensions/shapelib/
4476     See there in the Attic for the older history.
4477    
4478     * libraries/thuban/ bmpdataset.cpp, cpl_mfile.cpp, cpl_mfile.h,
4479     gdalwarp.cpp, wxproj.cpp: These files have been moved here from
4480     thuban/extensions/thuban/
4481     See there in the Attic for the older history.
4482    
4483     * MANIFEST.in, setup.cfg, setup.py: renamed extensions to libraries.
4484    
4485     * extensions/thuban/ bmpdataset.cpp, cpl_mfile.cpp, cpl_mfile.h,
4486     gdalwarp.cpp, wxproj.cpp: Moved to libraries/thuban.
4487    
4488     * extensions/shapelib/ dbfopen.c, shapefil.h, shpopen.c, shptree.c:
4489     Moved to libraries/shapelib.
4490    
4491     * extensions/pyshapelib/ COPYING, NEWS, dbflib.py, pytest.py,
4492     shapelib.py, README, dbflib_wrap.c, setup.py, shapelib_wrap.c,
4493     ChangeLog, dbflib.i, pyshapelib_api.h, shapelib.i, shptreemodule.c:
4494     Moved to libraries/pyshapelib.
4495    
4496     * extensions/pyprojection/ MANIFEST.in, Projection.py, setup.py,
4497     LICENSE, Projection.i, Projection_wrap.c, swighelp.txt:
4498     Moved to libraries/pyprojection.
4499    
4500     * extensions/ pyprojection, pyshapelib, shapelib, thuban: Removed.
4501    
4502     * extensions: Removed.
4503    
4504 bh 1606 2003-08-19 Bernhard Herzog <[email protected]>
4505    
4506 bh 1609 * test/test_viewport.py (ViewPortTest): We don't use the
4507     facilities of FileTestMixin so don't derive from it.
4508     (TestViewportWithPostGIS): New class with tests for using a
4509     viewport on a map with postgis layers.
4510    
4511     2003-08-19 Bernhard Herzog <[email protected]>
4512    
4513     Add the db connection management to the session.
4514    
4515     * Thuban/Model/session.py (Session.__init__): New instance
4516     variable db_connections
4517     (Session.AddDBConnection, Session.DBConnections)
4518     (Session.HasDBConnections, Session.CanRemoveDBConnection)
4519     (Session.RemoveDBConnection): New methods to manage and query the
4520     db connections managed by the session
4521     (Session.OpenDBShapeStore): New method to open a shapestore from a
4522     db connection
4523    
4524     * Thuban/Model/messages.py (DBCONN_REMOVED, DBCONN_ADDED): New
4525     messages for the db connection handling in the session
4526    
4527     * test/test_postgis_session.py: New. test cases for the session's
4528     db connection handling with postgis connections
4529    
4530     2003-08-19 Bernhard Herzog <[email protected]>
4531    
4532 bh 1606 Add very basic postgis database support and the corresponding test
4533     cases. The test cases require a PostgreSQL + postgis installation
4534     but no existing database. The database will be created
4535     automatically by the test cases
4536    
4537     * test/README: Add note about skipped tests and the requirements
4538     of the postgis tests.
4539    
4540     * Thuban/Model/postgisdb.py: New. Basic postgis database support.
4541    
4542     * test/test_postgis_db.py: New. Test cases for the postgis
4543     support.
4544    
4545     * Thuban/Model/wellknowntext.py: New. Parser for well-known-text
4546     format
4547    
4548     * test/test_wellknowntext.py: New. Test cases for the
4549     wellknowntext parser
4550    
4551     * test/postgissupport.py: New. Support module for tests involving
4552     a postgis database.
4553    
4554     * test/support.py (execute_as_testsuite): Shut down the postmaster
4555     if it's still running after the tests
4556    
4557     * Thuban/Model/data.py (RAW_WKT): New constant for raw data in
4558     well known text format
4559    
4560 jan 1604 2003-08-19 Jan-Oliver Wagner <[email protected]>
4561    
4562     * Examples/simple_extensions/hello_world.py: New. Raises a Hello World
4563     message dialog.
4564    
4565 bh 1600 2003-08-18 Bernhard Herzog <[email protected]>
4566    
4567 bh 1602 * test/support.py (ThubanTestResult.printErrors): Indent the
4568     reason for the skips in the output to make it a bit more readable.
4569     (execute_as_testsuite): New helper function to run a test suite
4570     and print some more information.
4571     (run_tests): Use execute_as_testsuite to run the tests
4572    
4573     * test/runtests.py (main): Use execute_as_testsuite to run the
4574     tests
4575    
4576     2003-08-18 Bernhard Herzog <[email protected]>
4577    
4578 bh 1600 Fix some bugs in Thuban and the test suite that were uncovered by
4579     changes introduced in Python 2.3:
4580    
4581     * Thuban/Model/table.py (DBFTable.__init__): Make sure the
4582     filename is an absolute name
4583    
4584     * Thuban/Model/layer.py (RasterLayer.__init__): Make sure the
4585     filename is an absolute name
4586    
4587     * test/test_save.py (SaveSessionTest.testRasterLayer): Use a
4588     unique filename to save to and use the correct relative filename
4589     in the expected output.
4590     (SaveSessionTest.test_dbf_table): Use the correct relative
4591     filename in the expected output.
4592    
4593     * test/test_layer.py (TestLayer.test_raster_layer): Update the
4594     test to check whether the filename is absolute.
4595    
4596 jan 1596 2003-08-18 Jan-Oliver Wagner <[email protected]>
4597    
4598     * Thuban/UI/about.py (About.__init__): Added Silke Reimer.
4599    
4600 bh 1586 2003-08-15 Bernhard Herzog <[email protected]>
4601    
4602 bh 1594 Change the way shapes are returned by a shape store. The
4603     ShapesInRegion method returns an iterator over actual shape
4604     objects instead of a list of shape ids.
4605    
4606     * Thuban/Model/data.py (ShapefileShape.ShapeID): New. Return shape
4607     id.
4608     (ShapefileStore.ShapesInRegion): Return an iterator over the
4609     shapes which yields shape objects instead of returning a list of
4610     shape ids
4611     (ShapefileStore.AllShapes): New. Return an iterator over all
4612     shapes in the shape store
4613     (DerivedShapeStore.AllShapes): New. Like in ShapefileStore
4614    
4615     * Thuban/Model/layer.py (Layer.ShapesInRegion): Update
4616     doc-string.
4617    
4618     * Thuban/UI/baserenderer.py
4619     (BaseRenderer.layer_ids, BaseRenderer.layer_shapes): Rename to
4620     layer_shapes and make it return an iterator containg shapes
4621     instead of a list of ids.
4622     (BaseRenderer.draw_shape_layer): Update doc-string; Adapt to
4623     layer_shapes() change
4624    
4625     * Thuban/UI/renderer.py (ScreenRenderer.layer_ids)
4626     (ScreenRenderer.layer_shapes): Rename as in BaseRenderer
4627    
4628     * Thuban/UI/viewport.py (ViewPort._find_shape_in_layer): Adapt to
4629     changes in the ShapesInRegion return value.
4630     (ViewPort._get_hit_tester): Remove commented out code
4631    
4632     * test/mockgeo.py (SimpleShapeStore.ShapesInRegion): Adapt to the
4633     new return value.
4634     (SimpleShapeStore.AllShapes): New. Implement this method too.
4635    
4636     * test/test_layer.py (TestLayer.test_arc_layer)
4637     (TestLayer.test_polygon_layer, TestLayer.test_point_layer)
4638     (TestLayer.test_point_layer_with_projection)
4639     (TestLayer.test_derived_store): Adapt to changes in the
4640     ShapesInRegion return value.
4641    
4642     * test/test_shapefilestore.py
4643     (TestShapefileStoreArc.test_shapes_in_region)
4644     (TestShapefileStorePolygon.test_shapes_in_region)
4645     (TestShapefileStorePoint.test_shapes_in_region): Adapt to changes
4646     in the ShapesInRegion return value.
4647     (TestShapefileStorePoint.test_all_shapes)
4648     (TestShapefileStoreArc.test_shape_shapeid): New tests for the new
4649     methods
4650    
4651     * test/test_derivedshapestore.py
4652     (TestDerivedShapeStore.test_shapes_in_region): Adapt to changes in
4653     the ShapesInRegion return value.
4654     (TestDerivedShapeStore.test_all_shapes)
4655     (TestDerivedShapeStore.test_shape_shapeid): New tests for the new
4656     methods
4657    
4658     2003-08-15 Bernhard Herzog <[email protected]>
4659    
4660 bh 1592 Make the renderers deal correctly with raw vs. python level
4661     representation of shape geometries
4662    
4663     * Thuban/UI/baserenderer.py (BaseRenderer.low_level_renderer):
4664     Return a flag useraw in addition to the callable and the parameter
4665     to indicate whether the callable can deal with the raw shape data
4666     or uses the higher level python lists of coordinates. The callable
4667     now should accept either the raw data or the return value of the
4668     shape's Points() method.
4669     (BaseRenderer.draw_shape_layer): Adapt to the low_level_renderer
4670     change
4671     (BaseRenderer.projected_points): Instead of the shape id use the
4672     points list as parameter.
4673     (BaseRenderer.draw_polygon_shape, BaseRenderer.draw_arc_shape)
4674     (BaseRenderer.draw_point_shape): Adapt to projected_points()
4675     change and accept the points list as parameter instead of the
4676     shape id.
4677    
4678     * Thuban/UI/renderer.py (MapRenderer.low_level_renderer): Return
4679     the useraw flag as required by the BaseRenderer
4680     (ScreenRenderer.draw_shape_layer): Adapt to low-level renderer
4681     changes.
4682    
4683     * test/test_baserenderer.py
4684     (TestBaseRenderer.test_point_with_classification): New test for
4685     rendering a map with classifications.
4686    
4687     2003-08-15 Bernhard Herzog <[email protected]>
4688    
4689 bh 1590 * Thuban/UI/viewport.py (ViewPort.find_shape_at)
4690     (ViewPort._find_shape_in_layer, ViewPort._find_shape_in_layer)
4691     (ViewPort._get_hit_tester, ViewPort.projected_points)
4692     (ViewPort._hit_point, ViewPort._hit_arc, ViewPort._hit_polygon)
4693     (ViewPort._find_label_at): Split the find_shape_at method into
4694     several new methods and use the functions in the hit-test module.
4695    
4696     * Thuban/UI/hittest.py: New module with Python-level hit-testing
4697     functions
4698    
4699     * test/test_hittest.py: New. Test for the new hittest module
4700    
4701     2003-08-15 Bernhard Herzog <[email protected]>
4702    
4703 bh 1588 * Thuban/Model/layer.py (Layer.ShapesInRegion): Apply the layer
4704     projection to all corners of the bounding box to get a better
4705     approximation of the projected bounding box
4706    
4707     * test/test_layer.py (TestLayer.test_point_layer_with_projection):
4708     New. Test coordinate handling of a layer with a projection.
4709     Catches the bug fixed in Layer.ShapesInRegion
4710    
4711     2003-08-15 Bernhard Herzog <[email protected]>
4712    
4713 bh 1586 Move some of the mock objects in test_baserenderer into their own
4714     module so they can easily be used from other tests
4715    
4716     * test/mockgeo.py: New test helper module with some mock objects
4717     for geometry related things like shapes, shapestores and
4718     projections.
4719    
4720     * test/test_mockgeo.py: New. Tests for the new helper module
4721    
4722     * test/test_baserenderer.py: Some of the mock-objects are in
4723     mockgeo now.
4724    
4725 jan 1584 2003-08-12 Jan-Oliver Wagner <[email protected]>
4726    
4727     * Thuban/UI/about.py (About.__init__): Added Björn Broscheit.
4728    
4729 bh 1580 2003-08-12 Bernhard Herzog <[email protected]>
4730    
4731 bh 1582 * po/de.po: New. German translations by Bjoern Broscheit
4732    
4733     2003-08-12 Bernhard Herzog <[email protected]>
4734    
4735 bh 1580 * Thuban/UI/projdialog.py (UnknownProjPanel._DoLayout): Translated
4736     strings have to be one string literal.
4737    
4738 bh 1573 2003-08-11 Bernhard Herzog <[email protected]>
4739    
4740 bh 1578 * test/support.py (FloatComparisonMixin.assertPointListEquals):
4741     New. This method was used in various derived classes, but it's
4742     better to have it here.
4743    
4744     * test/test_shapefilestore.py
4745     (ShapefileStoreTests.assertPointListEquals): Removed. It's now in
4746     FloatComparisonMixin
4747    
4748     * test/test_layer.py (TestLayer.assertPointListEquals): Removed.
4749     It's now in FloatComparisonMixin
4750    
4751     * test/test_derivedshapestore.py
4752     (TestDerivedShapeStore.assertPointListEquals): Removed. It's now
4753     in FloatComparisonMixin
4754    
4755     2003-08-11 Bernhard Herzog <[email protected]>
4756    
4757 bh 1573 * Thuban/UI/join.py (JoinDialog.OnJoin): Add missing space to
4758     error message
4759    
4760 jan 1569 2003-08-08 Jan-Oliver Wagner <[email protected]>
4761    
4762 jan 1571 * Doc/manual/thuban-manual.xml: Now use authorgroup. Added revhistory
4763     with version number.
4764     Changed title to reflect version number of Thuban.
4765    
4766     2003-08-08 Jan-Oliver Wagner <[email protected]>
4767    
4768 jan 1569 * Thuban/UI/about.py (About.__init__): Reworked the hall of fame. Now
4769     the list corresponds to the "About" web page.
4770    
4771 bh 1567 2003-08-08 Bernhard Herzog <[email protected]>
4772    
4773     * Thuban/UI/projdialog.py (UTMProposeZoneDialog.dialogLayout):
4774     Make sure translated strings are recognized as one string literal.
4775    
4776     * Thuban/UI/proj4dialog.py (UTMProposeZoneDialog.dialogLayout):
4777     Make sure translated strings are recognized as one string literal.
4778    
4779     * Thuban/UI/classgen.py (ClassGenDialog.OnOK): Make sure
4780     translated strings are recognized as one string literal.
4781    
4782     * Thuban/UI/application.py (ThubanApplication.OpenSession): Make
4783     sure translated strings are recognized as one string literal.
4784    
4785 bh 1556 2003-08-07 Bernhard Herzog <[email protected]>
4786    
4787 bh 1565 * Thuban/Model/data.py (DerivedShapeStore.RawShapeFormat): New.
4788     Simply delegates to the original shapestore.
4789    
4790     * test/test_derivedshapestore.py
4791     (TestDerivedShapeStore.test_raw_format): New. Test case for
4792     DerivedShapeStore.RawShapeFormat
4793    
4794     2003-08-07 Bernhard Herzog <[email protected]>
4795    
4796 bh 1561 Add raw data interface to shape objects.
4797    
4798     * Thuban/Model/data.py (ShapefileShape, Shape): Rname the shape
4799     class to ShapefileShape which now holds shapefile specific
4800     information.
4801     (ShapefileShape.compute_bbox): Simplified to not cache any
4802     information. The way this method is used that shouldn't matter
4803     performance wise.
4804     (ShapefileShape.RawData): New. Return the shapeid which is the raw
4805     data format for shapes from shapefiles.
4806     (ShapefileStore.RawShapeFormat): New. Return the raw datatype used
4807     in the shape objects returned by a shapestore. For a
4808     ShapefileStore this is always RAW_SHAPEFILE.
4809     (RAW_PYTHON, RAW_SHAPEFILE): Constants for the RawShapeFormat
4810     method.
4811    
4812     * test/test_shapefilestore.py
4813     (TestShapefileStore.test_raw_format): New test to test the raw
4814     format feature of shapes.
4815    
4816 bh 1560 * Thuban/Model/layer.py: Remove the unused import of Shape from
4817     data. It was only there for interface compatibility but it's not
4818 bh 1561 used inside of Thuban and the generic Shape class has gone away.
4819 bh 1560
4820 bh 1563 * Thuban/UI/renderer.py (MapRenderer.low_level_renderer): Check
4821     the raw data format and only use an optimized version of its a
4822     shapefile.
4823    
4824 bh 1561 2003-08-07 Bernhard Herzog <[email protected]>
4825    
4826 bh 1559 * test/test_baserenderer.py (SimpleShape): Shape class for the
4827     tests.
4828     (SimpleShapeStore.Shape): Use SimpleShape instead of
4829     Thuban.Model.data.Shape to make the tests independed of the coming
4830     changes.
4831    
4832     2003-08-07 Bernhard Herzog <[email protected]>
4833    
4834 bh 1556 * test/support.py (SkipTest, ThubanTestResult, ThubanTestRunner)
4835     (ThubanTestProgram): New classes that extend the respective
4836     classes from unittest. These new version support skipping tests
4837     under certain expected conditions. In the Thuban test suite we
4838     uses this for tests that require the optional gdal support.
4839     (run_tests): Use ThubanTestProgram instead of the unittest.main()
4840    
4841     * test/runtests.py (main): Use the new ThubanTestRunner instead of
4842     the normal one from unittest
4843    
4844     * test/test_layer.py (TestLayer.test_raster_layer): If this test
4845     is not run because gdal support isn't available report this to the
4846     runner.
4847    
4848     * test/test_baserenderer.py
4849     (TestBaseRenderer.test_raster_no_projection): Do not run this test
4850     if gdal support isn't available and report this to the runner.
4851    
4852 bh 1553 2003-08-06 Bernhard Herzog <[email protected]>
4853    
4854     Rearrange the renderers a bit, partly in preparation for changes
4855     required for the postgis merge, partly to make it more testable.
4856     Also make the representation of coordinates in Shapes more
4857     consistent.
4858    
4859     * Thuban/UI/renderer.py (MapRenderer): Most of the code/methods in
4860     this class is now in BaseRenderer. This class is now practically
4861     only a specialization of BaseRenderer for rendering to an actual
4862     wx DC.
4863     (ScreenRenderer.draw_shape_layer): Use self.low_level_renderer()
4864     to get the shapetype specific rendering functions.
4865    
4866     * Thuban/UI/baserenderer.py: New file with the basic rendering
4867     logic. The code in this file is completely independend of wx.
4868     (BaseRenderer): Class with the basic rendering logic
4869    
4870     * test/test_baserenderer.py: New. Test cases for BaseRenderer
4871    
4872     * Thuban/UI/view.py (MapCanvas.__init__): New instance variable
4873     error_on_redraw to guard agains endless loops and stack overflows
4874     when there's a bug in the rendering code that raises exceptions.
4875     (MapCanvas.OnIdle, MapCanvas._do_redraw): Split the actual
4876     rendering into a separate method _do_redraw so that error handling
4877     is a bit easier. When an exception occurs, set error_on_redraw to
4878     true. When it's true on entry to OnIdle do nothing and return
4879     immediately.
4880    
4881     * Thuban/Model/data.py (ShapefileStore.Shape): For consistency, a
4882     Shape object will always have the coordinates as a list of list of
4883     coordinate pairs (tuples).
4884     (Shape.compute_bbox): Adapt to new representation.
4885    
4886     * Thuban/UI/viewport.py (ViewPort.find_shape_at)
4887     (ViewPort.LabelShapeAt): Adapt to new coordinate representation in
4888     Shape objects.
4889    
4890     * test/test_shapefilestore.py
4891     (ShapefileStoreTests.assertFloatTuplesEqual)
4892     (ShapefileStoreTests.assertPointListEquals): Rename to
4893     assertPointListEquals and change purpose to checking equality of
4894     the lists returned by Shape.Points().
4895     (TestShapefileStoreArc.test_shape)
4896     (TestShapefileStorePolygon.test_shape)
4897     (TestShapefileStorePoint.test_shape): Use the new
4898     assertPointListEquals instead of assertFloatTuplesEqual
4899    
4900     * test/test_layer.py (TestLayer.assertFloatTuplesEqual)
4901     (TestLayer.assertPointListEquals): Rename to assertPointListEquals
4902     and change purpose to checking equality of the lists returned by
4903     Shape.Points().
4904     (TestLayer.test_arc_layer, TestLayer.test_arc_layer)
4905     (TestLayer.test_polygon_layer, TestLayer.test_point_layer)
4906     (TestLayer.test_derived_store): Use the new assertPointListEquals
4907     instead of assertFloatTuplesEqual
4908    
4909     * test/test_derivedshapestore.py
4910     (TestDerivedShapeStore.assertFloatTuplesEqual)
4911     (TestDerivedShapeStore.assertPointListEquals): Rename to
4912     assertPointListEquals and change purpose to checking equality of
4913     the lists returned by Shape.Points().
4914     (TestDerivedShapeStore.test_shape): Use the new
4915     assertPointListEquals instead of assertFloatTuplesEqual
4916    
4917 jan 1550 2003-08-06 Jan-Oliver Wagner <[email protected]>
4918    
4919     * Thuban/UI/projdialog.py (UTMPanel._OnPropose): Added test for
4920     a bounding box. A dialog is raised in case, no bounding box
4921     is found. This fixes bug #2043:
4922     https://intevation.de/rt/webrt?serial_num=2043
4923    
4924 bh 1548 2003-08-05 Bernhard Herzog <[email protected]>
4925    
4926     * Thuban/Model/color.py (Color.__repr__): Make the repr of a color
4927     object look like a Color instantiation. Formerly it looked like a
4928     tuple.
4929    
4930     * test/test_color.py (TestColor.test_repr)
4931     (TestColor.test_equality, TestColor.test_inequality): New. test
4932     some more apects of the Color class
4933     (TestTransparent.test_repr, TestTransparent.test_hex)
4934     (TestTransparent.test_equality): New. Test cases for the
4935     Transparent object.
4936    
4937 jan 1545 2003-08-04 Jan-Oliver Wagner <[email protected]>
4938    
4939     * Doc/manual/thuban-manual.xml: a number of small improvements.
4940     The resulting file is the version submitted for GREAT-ER II.
4941    
4942 bh 1540 2003-08-01 Bernhard Herzog <[email protected]>
4943    
4944 bh 1543 * Thuban/UI/resource.py, Thuban/UI/projdialog.py,
4945     Thuban/UI/join.py, Thuban/UI/classgen.py, Thuban/UI/about.py,
4946     Thuban/Model/resource.py: Insert cvs keywords and doc-strings.
4947    
4948     * Thuban/UI/common.py: Insert cvs keywords and doc-strings.
4949     (Color2wxColour, wxColour2Color, ThubanBeginBusyCursor)
4950     (ThubanEndBusyCursor): Add doc-strings
4951    
4952     2003-08-01 Bernhard Herzog <[email protected]>
4953    
4954 bh 1540 First step towards PostGIS integration. More abstraction by movin
4955     more code from the layer to the shapestore. More methods of the
4956     layer are now simply delegated to the equivalent method of the
4957     shapestore. The SHAPETYPE_* constants are now in data not in
4958     layer.
4959    
4960     * Thuban/Model/data.py (SHAPETYPE_POLYGON, SHAPETYPE_ARC)
4961     (SHAPETYPE_POINT, Shape): Move these constants and classes from
4962     layer.py to data.py
4963     (ShapefileStore.__init__): More Initialization for the new methods
4964     and functionality.
4965     (ShapefileStore.ShapeType, ShapefileStore.NumShapes)
4966     (ShapefileStore.BoundingBox, ShapefileStore.ShapesInRegion)
4967     (ShapefileStore.Shape): New methods that were formerly implemented
4968     in the layer.
4969     (DerivedShapeStore.Shape, DerivedShapeStore.ShapesInRegion)
4970     (DerivedShapeStore.ShapeType, DerivedShapeStore.NumShapes)
4971     (DerivedShapeStore.BoundingBox): New. DerivedShapeStore
4972     equivalents of the new shape methods. These versions are simply
4973     delegated to the original shapstore.
4974    
4975     * Thuban/Model/layer.py (SHAPETYPE_POLYGON, SHAPETYPE_ARC)
4976     (SHAPETYPE_POINT, Shape): Removed. They're now in data.py
4977     (Layer.SetShapeStore): Removed the initializatin of instance
4978     variables that were needed for the stuff that's now in
4979     ShapefileStore
4980     (Layer.BoundingBox, Layer.NumShapes, Layer.ShapeType)
4981     (Layer.Shape, Layer.ShapesInRegion): Simply delegate to the
4982     shapestore.
4983    
4984     * Thuban/UI/classifier.py, Thuban/UI/renderer.py,
4985     Thuban/UI/viewport.py: Import the SHAPETYPE_* constants from data
4986     instead of layer.
4987    
4988     * test/test_shapefilestore.py: New. Tests for ShapefileStore.
4989    
4990     * test/test_derivedshapestore.py: New. Tests for DerivedShapeStore.
4991    
4992     * test/test_layer.py: Import the SHAPETYPE_* constants from data
4993     instead of layer.
4994     (TestLayer.test_derived_store): Remove the test for the exception
4995     when instantiating the DerivedShapeStore with an incompatible
4996     table which is now in test_derivedshapestore.py. Add some more
4997     tests of the layer methods to determine whether they work for a
4998     DerivedShapeStore as well.
4999    
5000 jonathan 1534 2003-07-31 Jonathan Coles <[email protected]>
5001    
5002     * Doc/manual/thuban-manual.xml: Fix the list of required packages
5003     by just listing the name and where they can be found.
5004    
5005 frank 1532 2003-07-31 Frank Koormann <[email protected]>
5006    
5007     * Doc/manual/thuban-manual.xml:
5008     Changed the screenshot elements to figure.
5009     Changed some variablelist elements to itemizedlist.
5010     Added section on GDAL formats.
5011    
5012 jonathan 1531 2003-07-31 Jonathan Coles <[email protected]>
5013    
5014     * Doc/manual/thuban-manual.xml: Added a few sentences about
5015     the Fix Border Color option when generating classes.
5016    
5017 jonathan 1529 2003-07-30 Jonathan Coles <[email protected]>
5018    
5019     * Thuban/Model/classgen.py: Add docstrings. Rename specific
5020     Ramp instances to use lower_case_style.
5021    
5022     * Thuban/UI/classgen.py: Use renamed Ramp instances.
5023    
5024     * Thuban/UI/classifier.py: Add docstrings.
5025    
5026     * Thuban/UI/dock.py: Add docstrings.
5027    
5028     * test/test_classgen.py: Use renamed Ramp instances.
5029    
5030 bh 1522 2003-07-30 Bernhard Herzog <[email protected]>
5031    
5032 bh 1524 * Thuban/Lib/connector.py (QueueingPublisher): Removed. This class
5033     was never used in Thuban.
5034    
5035     2003-07-30 Bernhard Herzog <[email protected]>
5036    
5037 bh 1522 * Thuban/UI/join.py (JoinDialog.__init__): Use the table's Title()
5038     method directly instead of going through the transient_table
5039     method. This faster because transient_table may force the copy of
5040     a DBF file into the transient database and setting a table's title
5041     doesnm't affect the title of the associated transient table, so
5042     this fixes RT #2042
5043    
5044     * Thuban/UI/main.py (__version__): Don't import the already
5045     removed show_exception_dialog.
5046    
5047 jonathan 1517 2003-07-29 Jonathan Coles <[email protected]>
5048    
5049 jonathan 1519 * Thuban/UI/application.py (ThubanApplication.ShowExceptionDialog):
5050     Put back this method and remove the equivalent function since we
5051     are setting the exception hook from within this class (OnInit).
5052    
5053     2003-07-29 Jonathan Coles <[email protected]>
5054    
5055 jonathan 1517 * Doc/manual/images/5_2_custom_ramp.png,
5056     Doc/manual/images/5_2_quantiles.png,
5057     Doc/manual/images/5_2_uniform_dist.png,
5058     Doc/manual/images/5_2_unique_values.png,
5059     Doc/manual/images/8_int_error.png: New screen shots.
5060    
5061     * Doc/manual/thuban-manual.xml: Fixed typos and wording, clarified
5062     some points, and added more screen shots.
5063    
5064 bh 1512 2003-07-29 Bernhard Herzog <[email protected]>
5065    
5066 bh 1516 * Thuban/Model/data.py: Remove the now unused import of warnings
5067    
5068     2003-07-29 Bernhard Herzog <[email protected]>
5069    
5070 bh 1514 * Thuban/Model/data.py (SimpleStore): Removed. This class has been
5071     deprecated since before the 0.8 release and isn't used in Thuban
5072     itself anymore.
5073    
5074 bh 1512 * Thuban/Model/transientdb.py: Remove some unnecessary imports
5075    
5076 jonathan 1503 2003-07-29 Jonathan Coles <[email protected]>
5077 jonathan 1506
5078     * Thuban/UI/application.py (ThubanApplication.OnInit): set the
5079     python exception hook here so that we are sure to catch any
5080     Thuban exception that happen during initialization.
5081    
5082     * Thuban/UI/main.py (main): Don't set the exception hook here,
5083     it will get set in ThubanApplication.OnInit.
5084    
5085     2003-07-29 Jonathan Coles <[email protected]>
5086 jonathan 1503
5087     * Thuban/UI/application.py (ThubanApplication.ShowExceptionDialog):
5088     Removed and called it show_exception_dialog() so that the exception
5089     handler can be set before the class is created.
5090    
5091     * Thuban/UI/main.py (main): Install the exception handler before
5092     a ThubanApplication is created.
5093    
5094 bh 1500 2003-07-29 Bernhard Herzog <[email protected]>
5095    
5096     * po/it.po: New. Italian translation by Maurizio Napolitano
5097    
5098     * po/ru.po: New. Russian translation by Alex Shevlakov
5099    
5100 frank 1497 2003-07-29 Frank Koormann <[email protected]>
5101    
5102 frank 1508 * Doc/manual/thuban-manual.xml: Extended section on supported
5103     projections.
5104    
5105     2003-07-29 Frank Koormann <[email protected]>
5106    
5107 frank 1497 * Doc/manual/thuban-manual.xml: gaspell-checked.
5108    
5109 jonathan 1493 2003-07-29 Jonathan Coles <[email protected]>
5110    
5111 jonathan 1495 * Doc/manual/images/3_5_legend.png: Added border to improve look
5112     on white background.
5113    
5114     2003-07-29 Jonathan Coles <[email protected]>
5115    
5116 jonathan 1493 * Doc/manual/thuban-manual.xml: Fixed grammar and typos. Added
5117     descriptions for the legend toolbar.
5118    
5119     * Doc/manual/images/4_2_raster_layer_properties.png: Removed
5120     cursor from dialog box.
5121    
5122     2003-07-28 Jonathan Coles <[email protected]>
5123    
5124     * Doc/manual/thuban-manual.xml: More screenshots and more chapters.
5125    
5126     * Doc/manual/images/2_4_session_tree.png,
5127     Doc/manual/images/3_5_legend.png, Doc/manual/images/3_rename_map.png,
5128     Doc/manual/images/4_2_layer_properties.png,
5129     Doc/manual/images/4_2_raster_layer_properties.png,
5130     Doc/manual/images/5_3_genclass.png,
5131     Doc/manual/images/5_classification.png,
5132     Doc/manual/images/6_projection.png,
5133     Doc/manual/images/7_1_table_view.png,
5134     Doc/manual/images/7_2_5_join.png: New screenshots.
5135    
5136     2003-07-24 Jonathan Coles <[email protected]>
5137    
5138     * Doc/manual/thuban-manual.xml: Chapter on Projection Management.
5139    
5140     2003-07-24 Jonathan Coles <[email protected]>
5141    
5142     * Doc/manual/thuban-manual.xml: Added EPS images and wrote
5143     chapter on Layer Management.
5144    
5145     * Doc/manual/Makefile: New. Makefile to generate all formats for the
5146     manual and images.
5147    
5148 bh 1483 2003-07-24 Bernhard Herzog <[email protected]>
5149    
5150     * Thuban/Model/range.py, Thuban/version.py: Remove the #! line as
5151     it annoys lintian which warns about these files not being
5152 jan 1767 executable. The #! isn't necessary here since if you absolutely
5153 bh 1483 must execute them you can always say "python <filename>".
5154    
5155     * Thuban/UI/renderer.py (ScreenRenderer.draw_shape_layer): Remove
5156     superfluous code to set brush and pen for point shapes
5157    
5158     * Thuban/UI/viewport.py: Remove commented out code that wouldn't
5159     belong in viewport anyway
5160    
5161 frank 1479 2003-07-24 Frank Koormann <[email protected]>
5162    
5163     * Doc/manual/thuban-manual.xml: Added section on table management.
5164    
5165 bh 1477 2003-07-24 Bernhard Herzog <[email protected]>
5166    
5167     * test/runtests.py (main): Recognize the long "verbose" option
5168     correctly.
5169    
5170 jonathan 1470 2003-07-22 Jonathan Coles <[email protected]>
5171    
5172     * Doc/manual/thuban-manual.xml: Continue to write first revision
5173     of the manual.
5174    
5175     * Thuban/UI/renderer.py (MapRenderer.render_map): Wrap method
5176     with Begin/EndDrawing() calls to ensure we aren't doing to
5177     many updates to the dc during rendering.
5178     (ScreenRenderer.draw_shape_layer): self.draw_point_shape takes
5179     a pen and brush argument so they need to be passed to the function.
5180    
5181     * Thuban/UI/viewport.py (ViewPort.calc_min_max_scales): New.
5182     Calculates the minimum and maximum scale values. Factored out
5183     of set_view_transform so that it could be used to zoom all the
5184     way into a single point.
5185     (ViewPort.set_view_transform): Call calc_min_max_scales().
5186     (ViewPort.FitSelectedToWindow): Zoom to the maximum scale
5187     if only a single point is selected.
5188    
5189     * Doc/manual/images/1_2_legend_close.png,
5190     Doc/manual/images/1_2_legend_dock.png,
5191     Doc/manual/images/1_2_mainwindow.png,
5192     Doc/manual/images/1_2_mainwindow.ps,
5193     Doc/manual/images/1_2_mainwindow.sk,
5194     Doc/manual/images/3_2_fullextent.png,
5195     Doc/manual/images/3_2_fulllayerextent.png,
5196     Doc/manual/images/3_2_fullshapeextent.png,
5197     Doc/manual/images/3_2_pan.png,
5198     Doc/manual/images/3_2_zoomin.png,
5199     Doc/manual/images/3_2_zoomout.png,
5200     Doc/manual/images/3_3_identify.png,
5201     Doc/manual/images/3_3_label.png,
5202     Doc/manual/images/3_5_invisible.png,
5203     Doc/manual/images/3_5_movedown.png,
5204     Doc/manual/images/3_5_moveup.png,
5205     Doc/manual/images/3_5_props.png,
5206     Doc/manual/images/3_5_tobottom.png,
5207     Doc/manual/images/3_5_totop.png,
5208     Doc/manual/images/3_5_visible.png: New. Images for the documentation.
5209    
5210 bh 1451 2003-07-18 Bernhard Herzog <[email protected]>
5211    
5212 bh 1465 * Thuban/UI/messages.py (MAP_REPLACED): New message.
5213    
5214     * Thuban/UI/viewport.py (ViewPort.SetMap): Issue MAP_REPLACED
5215     after the new map has been assigned
5216    
5217     * Thuban/UI/mainwindow.py (MainWindow.delegated_messages):
5218     Delegate MAP_REPLACED to the canvas too
5219     (MainWindow.prepare_new_session): Removed. Thanks to the new
5220     MAP_REPLACED message it's no longer needed
5221     (MainWindow.OpenSession, MainWindow.NewSession):
5222     prepare_new_session has been removed.
5223    
5224     * Thuban/UI/classifier.py (Classifier.__init__): Subscribe to
5225     MAP_REPLACED so that we can close the dialog if a new map is set.
5226     (Classifier.unsubscribe_messages): Unsubscribe from MAP_REPLACED
5227     (Classifier.map_replaced): Handle MAP_REPLACED by closing the
5228     dialog
5229    
5230     * test/test_viewport.py (SimpleViewPortTest)
5231     (SimpleViewPortTest.test_default_size): Add doc-strings
5232     (ViewPortTest.setUp): Bind map to self.map so we can use it in
5233     tests. Subscribe to MAP_REPLACED messages too.
5234     (ViewPortTest.tearDown): No need to explicitly unsubscribe
5235     (ViewPortTest.test_set_map): New test for the SetMap method.
5236    
5237     2003-07-18 Bernhard Herzog <[email protected]>
5238    
5239 bh 1463 * test/test_viewport.py (SimpleViewPortTest.test_default_size):
5240     Move this test from ViewPortTest.setUp to this new separate test
5241     case. setUp is not the place for the actual tests.
5242     (ViewPortTest.test_inital_settings, ViewPortTest.setUp): Move some
5243     more of the test from setUp to the new test test_inital_settings.
5244     (ViewPortTest.test_win_to_proj, ViewPortTest.test_proj_to_win)
5245     (ViewPortTest.test_proj_conv): Split test_proj_conv into
5246     test_win_to_proj and test_proj_to_win and make the tests easier to
5247     understand
5248     (ViewPortTest.testFitRectToWindow, ViewPortTest.testZoomFactor)
5249     (ViewPortTest.testZoomOutToRect, ViewPortTest.testTranslate)
5250     (ViewPortTest.test_unprojected_rect_around_point)
5251     (ViewPortTest.test_find_shape_at, ViewPortTest.testTools):
5252     Reformat to increase readability.
5253    
5254     2003-07-18 Bernhard Herzog <[email protected]>
5255    
5256 bh 1461 * Thuban/UI/view.py (MapCanvas.OnLeftDown): Capture the mouse.
5257    
5258     2003-07-18 Bernhard Herzog <[email protected]>
5259    
5260 bh 1459 * test/runtests.py: The test suite can now be run without an X
5261     connection. To make sure this remains true, remove the DISPLAY
5262     environment variable so that an error occurs if the wxGTK is
5263     imported accidentally
5264    
5265     2003-07-18 Bernhard Herzog <[email protected]>
5266    
5267 bh 1457 * Thuban/UI/viewport.py: Remove unused imports
5268    
5269     * Thuban/UI/view.py: Remove unused imports
5270    
5271     2003-07-18 Bernhard Herzog <[email protected]>
5272    
5273 bh 1455 * test/test_export.py Remove unused imports. The OutputTransform
5274     function is now in viewport.py and is called output_transform
5275     (TestScalebar.test_output_transform)
5276     (TestScalebar.test_OutputTransform): Renamed to
5277     test_output_transform and updated to use output_transform instead
5278     of OutputTransform
5279    
5280     * Thuban/UI/view.py (OutputTransform): Moved to viewport.py and
5281     renamed.
5282     (MapCanvas.Export, MapPrintout.draw_on_dc): OutputTransform was
5283     renamed to output_transform
5284    
5285     * Thuban/UI/viewport.py (OutputTransform, output_transform):
5286     Rename to output_transform
5287    
5288     2003-07-18 Bernhard Herzog <[email protected]>
5289    
5290 bh 1453 * Thuban/Model/layer.py (Layer.__init__): Rename
5291     classificationField to classificatin_column and init it here so
5292     that it can be used in SetClassificationColumn
5293     (Layer.GetClassificationColumn, Layer.GetClassificationField):
5294     Rename to GetClassificationColumn.
5295     (Layer.SetClassificationColumn, Layer.SetClassificationField):
5296     Rename to SetClassificationColumn and issue a LAYER_CHANGED
5297     message if the column changes.
5298     (Layer._classification_changed, Layer.ClassChanged): Rename to
5299     _classification_changed. Update the callers.
5300     (Layer.SetShapeStore): Further field->column renames.
5301    
5302     * Thuban/Model/load.py (SessionLoader.start_classification)
5303     (SessionLoader.start_clpoint): Updates because of
5304     field->column method name changes in the Layer class
5305    
5306     * Thuban/Model/save.py (SessionSaver.write_classification): Updates
5307     because of field->column method name changes in the Layer class
5308    
5309     * Thuban/UI/classifier.py (Classifier.__init__)
5310     (Classifier._OnTry, Classifier._OnRevert): Updates because of
5311     field->column method name changes in the Layer class
5312    
5313     * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Updates
5314     because of field->column method name changes in the Layer class
5315    
5316     * Thuban/UI/viewport.py (ViewPort.find_shape_at): Updates because
5317     of field->column method name changes in the Layer class
5318    
5319     * test/test_save.py (SaveSessionTest.testClassifiedLayer)
5320     (SaveSessionTest.testClassifiedLayer): Update because of
5321     field->column method name changes in the Layer class
5322    
5323     * test/test_layer.py (SetShapeStoreTests.setUp)
5324     (SetShapeStoreTests.test_sanity): Update because of field->column
5325     method name changes in the Layer class
5326     (TestLayerModification.setUp): Subscribe to LAYER_CHANGED as well
5327     (TestLayerModification.test_sanity)
5328     (TestLayerModification.test_initial_settings): remove unsued code
5329     and rename to test_sanity.
5330     (TestLayerModification.test_set_classification): New test for
5331     SetClassification and SetClassificationField.
5332    
5333     2003-07-18 Bernhard Herzog <[email protected]>
5334    
5335 bh 1451 * test/test_classgen.py (TestFixedRamp.test): Extend test to check
5336     the non-fixed values as well. The old test would have accepted a
5337     fixed ramp that only returnes the fixed properties
5338    
5339 jonathan 1449 2003-07-17 Jonathan Coles <[email protected]>
5340    
5341     * Doc/manual/mainwindow.png, Doc/manual/mainwindow.xcf: Screen
5342     shots for the manual. The XCF file is the source image and
5343     has additional layers to support changes.
5344    
5345     * Doc/manual/thuban-manual.xml: Wrote an initial Introduction.
5346    
5347     * Thuban/UI/classifier.py (Classifier.__BuildClassification):
5348     Return both the new class and the field name.
5349    
5350     * Thuban/UI/mainwindow.py (MainWindow.ToggleLegend): Don't
5351     fit the map to the window as this changes any zoom level that
5352     the user may have set.
5353    
5354 jonathan 1442 2003-07-16 Jonathan Coles <[email protected]>
5355    
5356     * Thuban/Model/classgen.py (generate_singletons,
5357     generate_uniform_distribution, generate_quantiles): Remove
5358     fixes parameter, but maintain the same functionality by having
5359     the calling function pass a FixedRamp object for the ramp.
5360     (FixedRamp): New. Adapts a ramp to have fixed property values.
5361    
5362     * Thuban/Model/classification.py: Use new CLASS_CHANGED message.
5363     (Classification): Inherit from Publisher.
5364     (Classification.__init__): Remove the layer parameter.
5365     Classifications no longer need to have a parent layer.
5366     (Classification.GetField, Classification.GetFieldType,
5367     Classification.SetFieldInfo): Removed. The field name is stored
5368     in the layer, and the type can be retreived by calling
5369     Layer.GetFieldType().
5370     (Classification._set_layer, Classification.GetLayer): Removed.
5371     Classifications no longer have a parent layer.
5372    
5373     * Thuban/Model/layer.py (Layer.Destroy): Unsubscribe from the
5374     classification.
5375     (Layer.SetShapeStore): Reset the classification first while
5376     we still have the old shape store to work with.
5377     (Layer.GetClassificationField, Layer.SetClassificationField):
5378     New. Method for getting/setting the field to classify on.
5379     (Layer.SetClassification): Simplified now that the layer
5380     simply has to hold a reference to the classification and not
5381     tell the classification who owns it.
5382     Fixes RTbug #2023.
5383    
5384     * Thuban/Model/load.py (SessionLoader.start_classification):
5385     Set the field name on the layer, not the classification.
5386    
5387     * Thuban/Model/messages.py: Add CLASS_CHANGED for when a
5388     classification is modified.
5389    
5390     * Thuban/Model/save.py (SessionSaver.write_classification):
5391     Get the field name and type from the layer.
5392    
5393     * Thuban/Model/table.py (table_to_dbf, table_to_csv): Renamed
5394     parameter records to rows and add docstring. Fixes RTbug #1997.
5395    
5396     * Thuban/UI/classgen.py (ClassGenDialog.OnOK): Use a fixed
5397     ramp when we need to fix certain values of a ramp rather than
5398     using the old fixes parameter. Fixes RTbug #2024.
5399    
5400     * Thuban/UI/classifier.py (ClassGrid.CreateTable): Add fieldType
5401     parameter.
5402     (ClassTable.Reset): Add fieldType parameter and use it, rather
5403     than asking the classification.
5404     (Classifier.__init__): Remember the original class's field
5405     and ask the layer for the field type, rather than the classification.
5406     (Classifier.__SetGridTable): Retrieve the field and field type
5407     for the table because they are not in the classification.
5408     (Classifier._OnTry, Classifier._OnRevert): Set the classification
5409     field on the layer in addition to the classification itself.
5410    
5411     * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Get the
5412     classification field from layer.
5413    
5414     * Thuban/UI/viewport.py (ViewPort.find_shape_at): Get the
5415     classification field from layer. Split up tests and remove
5416     *-imports. Fixes RTbug #1992.
5417    
5418     * test/test_classgen.py (TestFixedRamp): Test for the FixedRamp class.
5419    
5420     * test/test_classification.py
5421     (TestClassification.test_classification): Remove tests for methods
5422     that no longer exist.
5423    
5424     * test/test_layer.py (SetShapeStoreTests.setUp): Classification
5425     __init__ no longer has a field parameter, use SetClassificationField.
5426     (SetShapeStoreTests.test_sanity): Use layer object to get class
5427     field info.
5428    
5429     * test/test_save.py (SaveSessionTest.testClassifiedLayer): Use
5430     SetClassificationField on layer to set class field info.
5431    
5432     * test/test_viewport.py: Renamed from test/test_view.py.
5433    
5434 jan 1424 2003-07-16 Jan-Oliver Wagner <[email protected]>
5435    
5436     * Doc/manual/thuban-manual.xml: Added authors and an initial
5437     coarse structure.
5438    
5439 bh 1418 2003-07-15 Bernhard Herzog <[email protected]>
5440    
5441 bh 1422 * test/support.py (FloatComparisonMixin): This is a mix-in class
5442     and therefore should not be derived from any other class.
5443    
5444     * test/test_range.py (RangeTest): FloatComparisonMixin is a
5445     mix-in, so derive from TestCase as well.
5446    
5447     2003-07-15 Bernhard Herzog <[email protected]>
5448    
5449 bh 1420 * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Rework the
5450     draw_func handling a bit to remove one layer of indirection. This
5451     makes the renderer about 10% faster in the non-classifying case
5452     and the code a bit cleaner
5453     (MapRenderer.draw_point_shape): Add the pen and brush parameters
5454     and set them in the dc. Now the draw_point_shape method and
5455     wxproj's draw_polygon_shape function have basically the same
5456     signature so that both can be directly used as draw_func
5457    
5458     2003-07-15 Bernhard Herzog <[email protected]>
5459    
5460 bh 1418 * Thuban/Model/save.py (SessionSaver.write_classification): Encode
5461     string values (in addition to the labels) as UTF 8
5462    
5463     * Thuban/Model/load.py (SessionLoader.start_clpoint): Decode the
5464     values if the field type is string
5465    
5466     * test/test_save.py (SaveSessionTest.testClassifiedLayer): Test
5467     saving a session with non-ascii string classification values.
5468    
5469     * test/test_load.py (TestClassification.file_contents)
5470     (TestClassification.test): Check for non-ascii values in string
5471     classifications
5472    
5473 jonathan 1416 2003-07-14 Jonathan Coles <[email protected]>
5474    
5475     * test/test_view.py: New. Tests for ViewPort.
5476    
5477 frank 1409 2003-07-14 Frank Koormann <[email protected]>
5478    
5479     * Thuban/Model/load.py (SessionLoader.start_map): Encode map
5480     title to latin1. Fixes https://intevation.de/rt/webrt?serial_num=2013
5481    
5482 frank 1411 * test/test_load_0_8.py (TestUnicodeStrings): New, test load of
5483     unicode strings from session file: session title, map title and
5484     projection name.
5485    
5486 jonathan 1403 2003-07-10 Jonathan Coles <[email protected]>
5487    
5488 jonathan 1406 * Thuban/UI/viewport.py (Tool.MouseUp): Should have called
5489     drag_stop, not drag_move when the mouse is released.
5490    
5491     2003-07-10 Jonathan Coles <[email protected]>
5492    
5493 jonathan 1403 The most important part of this is the seperation of view.py into
5494     two pieces. viewport.py now has a class called ViewPort which
5495     contains all the non-wx parts of view.py and can therefore be
5496     tested. view.py contains only the wx-specific parts and is fairly
5497     simple.
5498    
5499     * Thuban/UI/view.py: Stripped out all non-wx functionality. Fixes
5500     RTTbug #1992.
5501     * Thuban/UI/viewport.py: New. Contains non-wx view functionality.
5502     RTTbug #1992.
5503    
5504     * Thuban/Model/classgen.py (generate_singletons,
5505     generate_uniform_distribution, generate_quantiles):
5506     Added 'fixes' parameter so that property attributes can
5507     be held constant over the generated classification groups.
5508     (CustomRamp.GetProperties): Remove unused variables.
5509    
5510     * Thuban/Model/map.py (Map.SetProjection): Send the old
5511     projection as an argument to listeners of the MAP_PROJECTION_CHANGED
5512     event.
5513    
5514     * Thuban/Model/table.py (table_to_dbf, table_to_csv): Added 'records'
5515     parameter which is a list of records that restricts which
5516     records are saved. Fixes RTbug #1997.
5517    
5518     * Thuban/UI/application.py (ThubanApplication.ShowExceptionDialog):
5519     Port exception dialog from GREAT-ER. Fixes RTbug #1993.
5520    
5521     * Thuban/UI/classgen.py (ClassGenDialog.__init__): Add controls
5522     to allow the user to fix line color/width on generated groups.
5523     (ClassGenDialog.OnOK): Use new 'fixes' parameter of the generate_*
5524     functions to optionally fix group properties.
5525    
5526     * Thuban/UI/main.py (main): Set exception hook to the
5527     ShowExceptionDialog. Fixes RTbug #1993.
5528    
5529     * Thuban/UI/mainwindow.py (MainWindow.ShowTableView): Raise
5530     the table window when it is selectd to be shown.
5531    
5532     * Thuban/UI/tableview.py (QueryTableFrame.__init__): Add an
5533     Export Selection button and move the export buttons underneath
5534     the table.
5535     (QueryTableFrame.UpdateStatusText): Added event argument so
5536     that it can respond to grid selection events. The status text
5537     is now updated even when the table is not associated with a
5538     layer as was previously assumed.
5539     (QueryTableFrame.OnGridSelectRange, OnGridSelectCell): Removed.
5540     UpdateStatusText responds to these events.
5541     (QueryTableFrame.OnSaveAs): Renamed to doExport.
5542     (QueryTableFrame.doExport): Helper function that saves the
5543     entire table, or selected rows, to a file.
5544     (QueryTableFrame.OnExport, QueryTableFrame.OnExportSel): New.
5545     Respond to export button events and call doExport.
5546    
5547     * extensions/thuban/gdalwarp.cpp (ProjectRasterFile): Make sure
5548     the function doesn't return NULL without first setting a Python
5549     Error.
5550    
5551     * test/runtests.py (main): Only print "Unknown option" for
5552     unsupported options.
5553    
5554     * test/support.py (FloatComparisonMixin.assertFloatEqual): Take
5555     optional epsilon argument to specify floating point accuracy.
5556     (FloatComparisonMixin.assertFloatSeqEqual): Call assertFloatEqual
5557     for each item test.
5558    
5559     * test/test_csv_table.py (TestCSVTable.test_table_to_cvs): Add
5560     tests for saving selected records.
5561    
5562     * test/test_dbf_table.py (TestTableToDBF.test_table_to_dbf): Add
5563     tests for saving selected records.
5564    
5565     * test/test_map.py (TestMapWithContents.test_set_projection):
5566     MAP_PROJECTION_CHANGED events send the old projection.
5567    
5568     * test/test_session.py
5569     (TestSessionWithContent.test_forward_map_projection):
5570     MAP_PROJECTION_CHANGED events send the old projection.
5571    
5572     * test/test_table.py (TableTest): Update tests to use non-deprecated
5573     functions.
5574    
5575 bh 1376 2003-07-08 Bernhard Herzog <[email protected]>
5576    
5577 bh 1382 * Thuban/Model/transientdb.py (TransientTableBase.Width): The type
5578     constants in the column objects are the standard ones defined in
5579     the table module.
5580    
5581     * test/test_transientdb.py
5582     (TestTransientTable.test_transienttable_to_dbf): New. Test whether
5583     exporting transient tables as DBF works. This should catch the bug
5584     just fixed in TransientTableBase.Width.
5585    
5586     2003-07-08 Bernhard Herzog <[email protected]>
5587    
5588 bh 1380 * Thuban/Model/classgen.py (CustomRamp.GetProperties): Compute the
5589     interpolated colors correctly.
5590    
5591     * test/test_classgen.py (TestCustomRamp.test_color_interpolation):
5592     New. Test case for the fix in classgen.py
5593    
5594     2003-07-08 Bernhard Herzog <[email protected]>
5595    
5596 bh 1378 * test/runtests.py (main): Make the default output less verbose
5597     and add a verbosity option (-v) to get the old output
5598    
5599     2003-07-08 Bernhard Herzog <[email protected]>
5600    
5601 bh 1376 * Resources/XML/thuban-0.9.dtd: New. This will become the DTD for
5602     0.9.
5603    
5604     * Thuban/Model/transientdb.py (TransientJoinedTable.JoinType):
5605     New. Return the join type
5606    
5607     * Thuban/Model/save.py (SessionSaver.write_session): Use new 0.9
5608     DTD
5609     (SessionSaver.write_data_containers): Save the join type for
5610     joined tables
5611    
5612     * Thuban/Model/load.py (SessionLoader.__init__): Add the new 0.9
5613     namespace
5614     (SessionLoader.start_jointable): Handle the jointype attribute
5615    
5616     * test/test_load_0_8.py: New. Effectively a copy of test_load.py
5617     as of Thuban 0.8. These are now tests to determine whether Thuban
5618     can still read files generated by Thuban 0.8
5619    
5620     * test/test_load.py (LoadSessionTest.dtd)
5621     (TestSingleLayer.file_contents)
5622     (TestLayerVisibility.file_contents, TestLabels.file_contents)
5623     (TestLayerProjection.file_contents)
5624     (TestRasterLayer.file_contents, TestJoinedTable.file_contents)
5625     (TestJoinedTable.file_contents)
5626     (TestLoadError.file_contents): Update for new DTD
5627     (TestJoinedTable.file_contents, TestJoinedTable.setUp): Add test
5628     for new join type attribute
5629    
5630     * test/test_save.py (SaveSessionTest.dtd)
5631     (SaveSessionTest.testEmptySession)
5632     (SaveSessionTest.testSingleLayer)
5633     (SaveSessionTest.testLayerProjection)
5634     (SaveSessionTest.testRasterLayer)
5635     (SaveSessionTest.testClassifiedLayer)
5636     (SaveSessionTest.test_dbf_table)
5637     (SaveSessionTest.test_joined_table): Update for new DTD
5638     (SaveSessionTest.test_joined_table): Add test for new join type
5639     attribute
5640    
5641 bh 1372 2003-07-04 Bernhard Herzog <[email protected]>
5642    
5643     * Thuban/Model/table.py (_find_dbf_column_names): New. Helper
5644     function for table_to_dbf
5645     (table_to_dbf): Deal with names longer than the 10 character limit
5646    
5647     * test/test_dbf_table.py (TestTableToDBF.test_table_to_dbf): Add
5648     doc-string
5649     (TestTableToDBF.test_table_to_dbf_long_col_names): New test for
5650     long column names
5651    
5652 bh 1365 2003-07-03 Bernhard Herzog <[email protected]>
5653    
5654 bh 1370 * Doc/manual/thuban-manual.xml: Fix the CVS Revision Tag syntax
5655    
5656     2003-07-03 Bernhard Herzog <[email protected]>
5657    
5658 bh 1368 * Doc/manual/thuban-manual.xml, Doc/manual/README: New. Skeleton
5659     for the Thuban manual and README with some basic information about
5660     the manual
5661    
5662     2003-07-03 Bernhard Herzog <[email protected]>
5663    
5664 bh 1365 * Thuban/Model/transientdb.py (TransientJoinedTable.__init__):
5665     Update doc-string
5666     (TransientJoinedTable.create): Do not modify the column objects of
5667     the input tables in place and copy all columns of the input tables
5668     into the joined table after all.
5669    
5670     * test/test_transientdb.py
5671     (TestTransientTable.test_transient_joined_table_same_column_name):
5672     Update to reflect the new behavior
5673     (TestTransientTable.test_transient_joined_table_with_equal_column_names):
5674     Update to reflect the new behavior
5675     (TestTransientTable.test_transient_joined_table_name_collisions_dont_modify_in_place):
5676     New test case for a bug which modified the column objects in place
5677    
5678 jonathan 1360 2003-07-02 Jonathan Coles <[email protected]>
5679 jonathan 1349
5680 jonathan 1360 * Thuban/Model/classgen.py (generate_singletons,
5681     generate_uniform_distribution, generate_quantiles,
5682 jonathan 1363 GenQuantiles0): Make sure maxValue isn't less than
5683     one, otherwise we could divide by zero.
5684    
5685     * test/test_classgen.py (ClassGenTest.doClassRangeTest,
5686     ClassGenTest.doClassSingleTest): Call doBoundsTest to
5687     check the end classification groups against the
5688     proper property values.
5689     (ClassGenTest.doBoundsTest): New. Checks the first and
5690     last classification groups to make sure their properties
5691     are the correct upper and lower bounds for a color ramp.
5692    
5693     2003-07-02 Jonathan Coles <[email protected]>
5694    
5695     * Thuban/Model/classgen.py (generate_singletons,
5696     generate_uniform_distribution, generate_quantiles,
5697 jonathan 1360 GenQuantiles0): The denominator was one to high when
5698     calculating the index for the ramp causing the index
5699     to never to reach one.
5700    
5701     2003-07-02 Jonathan Coles <[email protected]>
5702    
5703 jonathan 1358 Changed the singature of ClassGroupRange.__init__ and
5704     ClassGroupRange.SetRange() so that the min/max values are
5705     passed as a tuple. This makes a better calling scheme for
5706     when a Range object is passed instead.
5707    
5708     * Thuban/Model/classgen.py: Fixed parameters to
5709     ClassGroupRange constructor.
5710    
5711     * Thuban/Model/classification.py (ClassGroupRange.__init__):
5712     Consolidate the min/max parameters into a single _range which
5713     can either be a tuple or a Range object.
5714     (ClassGroupRange.SetRange): Consolidate the min/max parameters
5715     into a single _range which can either be a tuple or a Range object.
5716    
5717     * Thuban/Model/load.py (SessionLoader.start_clrange): Fix
5718     call to ClassGroupRange constructor to use a tuple.
5719    
5720     * Thuban/Model/layer.py (Layer.SetClassification): Switch
5721     the classification instance variable to the new class
5722     before calling _set_layer otherwise subscribers to a
5723     LAYER_CHANGED event will not see any difference.
5724    
5725     * test/test_classification.py: Fix tests of ClassGroupRange
5726     so that they use the new signature.
5727    
5728     * test/test_load.py: Fix use of ClassGroupRange so that it
5729     uses the new signature.
5730    
5731     * test/test_load_0_2.py: Fix use of ClassGroupRange so that it
5732     uses the new signature.
5733    
5734     * test/test_save.py: Fix use of ClassGroupRange so that it
5735     uses the new signature.
5736    
5737    
5738     2003-07-01 Jonathan Coles <[email protected]>
5739    
5740 jonathan 1349 * Thuban/Model/classgen.py: Fixes RTbug #1972, 1971.
5741     Import used objects/class from color.
5742     (generate_singletons): We don't
5743     need the numGroups parameter anymore because we are using
5744     the new ramps with GetProperties().
5745     (generate_uniform_distribution): Use new ramp method
5746     GetProperties().
5747     (generate_quantiles, GenQuantiles0): Use new ramp method
5748     GetProperties().
5749     (CustomRamp.SetNumGroups): Removed. The ramps now map
5750     a value from 0 to 1 to class properties so the number
5751     of groups is not needed ahead of time.
5752     (CustomRamp.next): Removed. CustomRamp does not support
5753     interation anymore.
5754     (CustomRamp.GetProperties): Returns a ClassGroupProperties
5755     object based on the index value from 0 to 1 that is
5756     passed to it.
5757     (GreyRamp, RedRamp, GreenRamp, BlueRamp, GreenToRedRamp):
5758     Made into instances of Monochromatic class instread of
5759     deriving from it.
5760     (HotToCold.SetNumGroups): Removed. See CustomRamp.
5761     (HotToCold.next): Removed. See CustomRamp.
5762    
5763     * Thuban/Model/classification.py: Fixes RTbug #1973, 1971.
5764     (Classification.SetField, Classification.SetFieldType):
5765     Replaced with SetFieldInfo.
5766     (Classification.SetFieldInfo): New. Does a better job of
5767     what SetField and SetFieldType used to do by combining
5768     their function since they should really always be done
5769     at the same time.
5770     (Classification.SetLayer): Renamed to _set_layer.
5771     (Classification._set_layer): Should only be called from
5772     Layer's SetClassification. This does not cause a recursive
5773     call as SetLayer did because we know that Layer knows about
5774     the classification.
5775    
5776     * Thuban/Model/color.py: Fixes RTbug #1971.
5777     (_Transparent): Renamed from Transparent so it doesn't
5778     conflict with the module variable.
5779     (Transparent, Black): Renamed from Color.Transparent,
5780     Color.Black so they are not class variables.
5781    
5782     * Thuban/Model/layer.py: Fixes RTbug #1971, 1973.
5783     (Layer.Destroy): We don't need to call SetClassification
5784     anymore to clear out the back reference in the classifcation
5785     to the layer. It's better to set it to None using _set_layer,
5786     and we won't be creating another clas object too.
5787     (Layer.SetClassification): Classification._set_layer is not
5788     recursive so remove all the locking variables. Also clean
5789     up the code so that it remains unchanged if something fails.
5790    
5791     * Thuban/Model/load.py: Fixes RTbug #1971.
5792     (SessionLoader.start_classification): Call
5793     Classification.SetFieldInfo().
5794    
5795     * Thuban/Model/save.py: Removed import of Color which wasn't
5796     being used.
5797    
5798     * Thuban/UI/classgen.py: Fixes RTbug #1972.
5799     (ClassGenDialog.__init__): Color ramps are now instances
5800     already so we don't need to create any new objects.
5801     (ClassGenDialog.OnOK): Check for numGroups is no longer
5802     necessary because we never use it.
5803    
5804     * Thuban/UI/classifier.py: Fixes RTbug #1971.
5805     (Classifier.__BuildClassification, Classifier.__SetGridTable):
5806     Call Classification.SetFieldInfo() instead of SetFieldType.
5807    
5808     * Thuban/UI/renderer.py: Fixes RTbug #1971.
5809    
5810     * Thuban/UI/view.py: Fixes RTbug #1974, 1971.
5811     (MapCanvas.__init__): Subscribe to the idle time event. Set
5812     background color to white.
5813     (MapCanvas.OnPaint): Set a flag indicating that we should
5814     render the map during idle time. If we already have a bitmap
5815     just draw it now.
5816     (MapCanvas.OnIdle): New. Render the map only during idle time.
5817     This also fixes a problem with the busy cursor under gtk.
5818    
5819     * test/test_classgen.py (ClassGenTest.test_generate_singletons):
5820     Fix calls to generate_singletons because the signature changed.
5821    
5822     * test/test_classification.py: Fix color references and
5823     change calls to Classification.[SetField|SetFieldType] to
5824     SetFieldInfo.
5825    
5826     * test/test_load.py: Fix color references.
5827    
5828     * test/test_load_0_2.py: Fix color references.
5829    
5830     * test/test_save.py (SaveSessionTest.testClassifiedLayer):
5831     Change calls to Classification.[SetField|SetFieldType] to
5832     SetFieldInfo.
5833    
5834 frank 1334 2003-07-01 Frank Koormann <[email protected]>
5835    
5836     MERGE from the greater-ms3 branch.
5837    
5838     * test/test_transientdb.py
5839     (TestTransientTable.test_transient_joined_table_with_equal_column_names):
5840     New. Test join of two tables with partly equal column names.
5841    
5842     * Thuban/Model/transientdb.py (TransientJoinedTable.create):
5843     If duplicates in left and right tables column names are found,
5844     append '_' (underscores) to the name until it is unique.
5845     Create always new internal names for the resulting table and reference
5846     columns in the join statement with <table>.<column>
5847    
5848 bh 1329 2003-07-01 Bernhard Herzog <[email protected]>
5849    
5850     * test/test_transientdb.py
5851     (TestTransientTable.test_transient_joined_table_same_column_name):
5852     New. Test whether joining on columns with the same names in both
5853     tables works.
5854 frank 1334
5855 bh 1329 * Thuban/Model/transientdb.py (TransientJoinedTable.create): Make
5856     sure to use the right internal names even when joining on field
5857     with the same names in both tables. Also, detect duplicate names
5858     in the joined table correctly.
5859    
5860 frank 1325 2003-07-01 Frank Koormann <[email protected]>
5861    
5862     * Thuban/UI/renderer.py (ExportRenderer.render_legend):
5863     Reverse List of layers to render in same order as in desktop legend.
5864    
5865 jonathan 1318 2003-06-30 Jonathan Coles <[email protected]>
5866    
5867 jonathan 1349 * Thuban/version.py (make_tuple): Takes a version string
5868     and splits it into a tuple of at most three integers.
5869     Used make_tuple() to make tuple versions of the version
5870     numbers.
5871    
5872     * Thuban/UI/about.py: Add Thuban email addresses.
5873    
5874     2003-06-30 Jonathan Coles <[email protected]>
5875    
5876 jonathan 1320 * Thuban/version.py: SQLite/PySQLite version dependencies
5877     were too high.
5878    
5879     2003-06-30 Jonathan Coles <[email protected]>
5880    
5881 jonathan 1318 * Thuban/version.py: Update version to 0.8.1
5882    
5883     * MANIFEST.in: Added Projections so that default.proj is
5884     included.
5885    
5886 jonathan 1312 2003-06-26 Jonathan Coles <[email protected]>
5887    
5888     New About box with lots more information including library
5889     versions and credits. More/better version checking before
5890     Thuban starts.
5891    
5892     * Thuban/UI/about.py: New. New About box that displays
5893     library version information and credits.
5894    
5895     * Thuban/version.py: Added new 'versions' dictionary which
5896     contains the verions of various libraries which are checked
5897     when the module loads.
5898     (verify_versions): Check all version numbers and returns
5899     a list of errors.
5900    
5901     * Thuban/UI/classifier.py (Classifier.__EnableButtons):
5902     Reset the status of the buttons as the situation warrants,
5903     but in a better more reliable way by not relying on the
5904     current status to determine what needs to change.
5905    
5906     * Thuban/UI/main.py (wxCHECK_VERSION): Removed. Not needed.
5907     (verify_versions): Remove most of the code since it is
5908     now in Thuban.version.verify_versions.o
5909    
5910     * Thuban/UI/mainwindow.py (MainWindow.About): Call new
5911     About box in Thuban.UI.about.
5912    
5913     * extensions/thuban/gdalwarp.cpp (get_gdal_version): New.
5914     Returns the version of gdal library being used as a string.
5915    
5916     * extensions/thuban/wxproj.cpp (check_version, check_version_gtk):
5917     Removed.
5918     (get_proj_version): Return the version of PROJ that the file
5919     was compiled with.
5920     (get_gtk_version): Return th version of GTK that the file
5921     was compiled with.
5922    
5923 jonathan 1304 2003-06-25 Jonathan Coles <[email protected]>
5924    
5925     * Thuban/UI/classifier.py (Classifier.EditSymbol): The parent
5926     of the SelectPropertiesDialog should be self so the window
5927     appears on top.
5928     (ClassGroupPropertiesCtrl.DoEdit): The parent
5929     of the SelectPropertiesDialog should be self so the window
5930     appears on top.
5931    
5932     * Thuban/UI/resource.py: Cleaned up how we determine file
5933     extensions.
5934     (GetImageResource): Return an wxImage from our Resources.
5935    
5936 jonathan 1299 2003-06-24 Jonathan Coles <[email protected]>
5937    
5938     * Thuban/UI/renderer.py (ExportRenderer.render_legend):
5939     Check that a layer has a classification before trying
5940     to get it. Raster layers don't have classifications.
5941    
5942 jonathan 1286 2003-06-23 Jonathan Coles <[email protected]>
5943 jonathan 1297
5944     * setup.py: Add Resources/XML to resource list.
5945    
5946     2003-06-23 Jonathan Coles <[email protected]>
5947 jonathan 1286
5948 jonathan 1297 * setup.cfg: Fix copyright dates
5949    
5950     2003-06-23 Jonathan Coles <[email protected]>
5951    
5952 jonathan 1294 * MANIFEST.in: Update with Resources/XML
5953    
5954     * setup.py: Don't include Locale resources yet as we don't
5955     have any and it causes problems building the distribution
5956     for Windows. Update version to 0.8.0.
5957    
5958     * Doc/thuban.dtd: Removed since it is now in Resources/XML.
5959    
5960     * Thuban/UI/mainwindow.py: Add blank line at the end because
5961     file was not being read correctly building the Windows
5962     distribution.
5963    
5964     2003-06-23 Jonathan Coles <[email protected]>
5965    
5966 jonathan 1289 * Thuban/UI/mainwindow.py (MainWindow.About): Fix text.
5967    
5968     * Thuban/version.py: Temporarily update longversion for
5969     the 0.8 release so that it doesn't have the cvs revision.
5970    
5971     2003-06-23 Jonathan Coles <[email protected]>
5972    
5973 jonathan 1286 * Thuban/UI/common.py (ThubanBeginBusyCursor): Call wxSafeYield
5974     to make sure that we don't create reentrant possibilities with
5975     wxYield.
5976    
5977     * Thuban/UI/view.py (MapCanvas.OnPaint): Call wxBeginBusyCursor()
5978     directly to avoid the wxSafeYield() call which generates an
5979     OnPaint event causing infinite recursion. Don't try to catch
5980     exception anymore. This was for before there were limits on map
5981     scaling.
5982    
5983 bh 1283 2003-06-23 Bernhard Herzog <[email protected]>
5984    
5985     Bug fix for RT #1961:
5986    
5987     * Thuban/Model/load.py (SessionLoader.start_derivedshapesource):
5988     Register DerivedShapestores with the session
5989    
5990     * Thuban/Model/session.py (Session.Tables): Make sure each table
5991     is only listed once.
5992    
5993     * test/test_load.py (TestJoinedTable.test): Add check_format call.
5994     Update file contents to match the one written out.
5995    
5996 bh 1281 2003-06-20 Bernhard Herzog <[email protected]>
5997    
5998     * test/xmlsupport.py (SaxEventLister.startElementNS)
5999     (SaxEventLister.endElementNS): Do not include the qname. Python
6000     2.2.1 and 2.2.2 and 2.2.3 differ in this regard. In 2.2.1 qname it
6001     is (presumably incorrectly) None, whereas it's a string with the
6002     element name in the later versions.
6003    
6004     * test/test_xmlsupport.py (TestEventList.test_even_list_simple)
6005     (TestEventList.test_even_list_namespace): Update tests to reflect
6006     the new behaviour
6007     (TestEventList.test_even_list_id_normalization): Fix doc-string
6008    
6009 jonathan 1272 2003-06-20 Jonathan Coles <[email protected]>
6010    
6011 jonathan 1279 * Thuban/Model/layer.py (BaseLayer.HasShapes): New. Overridden
6012     by deriving classes to determine if that layer supports shapes.
6013     (Layer): Override HasShapes and return true.
6014    
6015     * Thuban/UI/classgen.py: Use Thuban[Begin|End]BusyCursor()
6016     instead of a direct call to wx[Begin|End]CusyCursor().
6017     (GenUniquePanel._OnRetrieve): Set busy cursor while retrieving
6018     table data.
6019    
6020     * Thuban/UI/common.py (ThubanBeginBusyCursor, ThubanEndBusyCursor):
6021     New. Wrappers around the wxWindows functions that allow us to
6022     make additional calls such as wxYield which gives the native
6023     system a chance to update the cursor correctly.
6024    
6025     * Thuban/UI/tableview.py: Use Thuban[Begin|End]BusyCursor()
6026     instead of a direct call to wx[Begin|End]CusyCursor().
6027    
6028     * Thuban/UI/view.py: Use Thuban[Begin|End]BusyCursor()
6029     instead of a direct call to wx[Begin|End]CusyCursor().
6030     (MapCanvas.find_shape_at): Check if the current search layer
6031     support shapes, otherwise go on to the next layer.
6032    
6033     * test/test_layer.py: Add tests in each type of layer for
6034     HasClassification() and HasShapes()
6035    
6036     2003-06-20 Jonathan Coles <[email protected]>
6037    
6038 jonathan 1272 * Thuban/UI/view.py (MapCanvas.OnPaint): Call wxYield after
6039     turning on the busy cursor to allow the system to change the
6040     cursor before we begin painting. This fixes a problem that
6041     was occuring only under GTK. Fixes RTbug #1840.
6042    
6043 bh 1270 2003-06-20 Bernhard Herzog <[email protected]>
6044    
6045     * Resources/XML/thuban-0.8.dtd: New DTD for the new file format
6046     version.
6047    
6048     * Thuban/Model/save.py (sort_data_stores): New. Make topological
6049     sort of the data sources so they can be written with sources that
6050     data sources that depend on other data sources come after the
6051     sources they depend on.
6052     (SessionSaver.__init__): Add idmap instance variable to map from
6053     objects to the ids used in the file.
6054     (SessionSaver.get_id, SessionSaver.define_id)
6055     (SessionSaver.has_id): New. Methods to manage the idmap
6056     (SessionSaver.write): Use thuban-0.8.dtd
6057     (SessionSaver.write_session): Add a namespace on the session and
6058     write out the data sources before the maps.
6059     (SessionSaver.write_data_containers): New. Write the data
6060     containers.
6061     (SessionSaver.write_layer): Layer elements now refer to a
6062     shapestore and don't contain filenames anymore.
6063    
6064     * Thuban/Model/load.py (LoadError): Exception class to raise when
6065     errors in the files are discovered
6066     (SessionLoader.__init__): Define dispatchers for elements with a
6067     thuban-0.8 namespace too.
6068     (SessionLoader.check_attrs): New helper method to check and
6069     convert attributes
6070     (AttrDesc): New. Helper class for SessionLoader.check_attrs
6071     (SessionLoader.start_fileshapesource)
6072     (SessionLoader.start_derivedshapesource)
6073     (SessionLoader.start_filetable, SessionLoader.start_jointable):
6074     Handlers for the new elements in the new fileformat
6075     (SessionLoader.start_layer): Handle the shapestore attribute in
6076     addition to filename.
6077     (SessionLoader.start_table, SessionLoader.end_table): Removed.
6078     They were never used in the old formats and aren't needed for the
6079     new.
6080    
6081     * Thuban/Model/session.py (Session.DataContainers): New method to
6082     return all "data containers", i.e. shapestores and tables
6083    
6084     * test/xmlsupport.py (SaxEventLister.__init__)
6085     (SaxEventLister.startElementNS, sax_eventlist): Add support to
6086     normalize IDs.
6087    
6088     * test/test_xmlsupport.py
6089     (TestEventList.test_even_list_id_normalization): New test case for
6090     id normalization
6091    
6092     * test/test_load.py (LoadSessionTest.check_format): Use ID
6093     normalization
6094     (LoadSessionTest.thubanids, LoadSessionTest.thubanidrefs): New
6095     class atrributes used for ID normalization
6096     (TestSingleLayer, TestLayerVisibility, TestLabels.test)
6097     (TestLayerProjection.test, TestRasterLayer.test): Adapt to new
6098     file format
6099     (TestJoinedTable): New test for loading sessions with joined
6100     tables.
6101     (TestLoadError): New. Test whether missing required attributes
6102     cause a LoadError.
6103    
6104     * test/test_save.py (SaveSessionTest.thubanids)
6105     (SaveSessionTest.thubanidrefs): New class attributes for ID
6106     normalization in .thuban files.
6107     (SaveSessionTest.compare_xml): Use id-normalization.
6108     (SaveSessionTest.testEmptySession)
6109     (SaveSessionTest.testLayerProjection)
6110     (SaveSessionTest.testRasterLayer)
6111     (SaveSessionTest.testClassifiedLayer): Adapt to new file format.
6112     (SaveSessionTest.testLayerProjection): The filename used was the
6113     same as for testSingleLayer. Use a different one.
6114     (SaveSessionTest.test_dbf_table)
6115     (SaveSessionTest.test_joined_table): New test cases for saving the
6116     new data sources structures.
6117     (TestStoreSort, MockDataStore): Classes to test the sorting of the
6118     data stores for writing.
6119    
6120     * test/runtests.py: Add CVS keywords
6121    
6122 jonathan 1265 2003-06-20 Jonathan Coles <[email protected]>
6123    
6124 jonathan 1267 * test/test_session.py
6125     (UnreferencedTablesTests.test_unreferenced_tables_with_joins):
6126     Use the cultural_landmark-point.dbf file for the store so that
6127     the table rows and shape count match.
6128    
6129     2003-06-20 Jonathan Coles <[email protected]>
6130    
6131 jonathan 1265 * Thuban/Model/data.py (DerivedShapeStore.__init__): Raise
6132     an exception if the number of shapes is different from the
6133     number of rows in the table. Address RTbug #1933.
6134    
6135     * test/test_layer.py (TestLayer.test_derived_store): Add
6136     a test for the new exception in DerivedShapeStore.__init__.
6137    
6138     * test/support.py (FloatTestCase): Removed since there is
6139     already FloatComparisonMixin. Fixes RTbug #1954.
6140     (FloatComparisonMixin.assertFloatEqual): Include test for
6141     infinity that was part of FloatTestCase.
6142    
6143     * test/test_range.py (RangeTest): Inherit from
6144     support.FloatComparisonMixin now that we don't have
6145     support.FloatTestCase.
6146    
6147 bh 1256 2003-06-20 Bernhard Herzog <[email protected]>
6148    
6149 bh 1260 * test/test_save.py (SaxEventLister, sax_eventlist): Removed. Use
6150     the implementation in xmlsupport instead.
6151     (SaveSessionTest.compare_xml): sax_eventlist is now in xmlsupport
6152    
6153     * test/test_proj.py: Import sax_eventlist from xmlsupport instead
6154     of test_save
6155    
6156     2003-06-20 Bernhard Herzog <[email protected]>
6157    
6158 bh 1258 * test/test_load.py (LoadSessionTest.check_format): New helper
6159     method to make sure the test files we load might have been written
6160     by the current thuban version.
6161     (ClassificationTest.TestLayers, TestSingleLayer.test)
6162     (TestLayerVisibility.test, TestClassification.test)
6163     (TestLabels.test, TestLayerProjection.test, TestRasterLayer.test):
6164     Add check_format() calls and fix the thuban data to match the data
6165     that would be written by saving the session loaded from it.
6166    
6167     * test/xmlsupport.py (SaxEventLister, sax_eventlist): Copies of
6168     the same class and function in test_save.
6169    
6170     * test/test_xmlsupport.py (TestEventList): New. test cases for
6171     sax_eventlist
6172    
6173     2003-06-20 Bernhard Herzog <[email protected]>
6174    
6175 bh 1256 * Resources/XML/thuban.dtd: Add comment about which versions of
6176     Thuban are covered by this DTD
6177     (map): Fix content model for layers and raster layers. There can
6178     be any number or layers and raster layers in any order.
6179    
6180 jonathan 1254 2003-06-20 Jonathan Coles <[email protected]>
6181    
6182 jonathan 1265 This is mainly about fixing RTbug #1949.
6183    
6184 jonathan 1254 * Thuban/Model/classification.py: Remove "from __future__"
6185     import statement since python 2.2 is the earliest supported
6186     version.
6187    
6188     * Thuban/Model/proj.py (Projection.GetProjectedUnits): New.
6189     Currently returns PROJ_UNITS_METERS or PROJ_UNITS_DEGREES
6190     depending on the units this projection *forwards* into.
6191    
6192     * Thuban/Model/save.py (SessionSaver.write_classification):
6193     Remove unnecessary use of lambdas and nested functions.
6194    
6195     * Thuban/UI/legend.py (ScaleBarBitmap.__SetScale): Do scale
6196     adjustment here if the map projection uses degrees.
6197    
6198     * Thuban/UI/scalebar.py (ScaleBar.DrawScaleBar): Remove
6199     scale adjust code since it is now done before calling
6200     this method. Don't do anything if the map projection
6201     is None.
6202    
6203 bh 1244 2003-06-19 Bernhard Herzog <[email protected]>
6204    
6205 bh 1248 Move version specific load tests to their own file.
6206    
6207     * test/test_load.py: Expand the doc-string to explain a bit how to
6208     handle file format changes.
6209     (TestClassification.test): Update the docstring as this test is
6210     not about Thuban 0.2 anymore.
6211    
6212     * test/test_load_0_2.py: New file with the load tests for thuban
6213     files created with Thuban 0.2 and earlier.
6214    
6215     2003-06-19 Bernhard Herzog <[email protected]>
6216    
6217 bh 1246 Add XML validation to some of the tests. Validation will only be
6218     done if pyRXP is installed (http://reportlab.com/xml/pyrxp.html).
6219     To make the DTD available to the test cases it's moved into
6220     Resources/XML
6221    
6222     * Resources/XML/thuban.dtd: New. This is now the real Thuban DTD
6223     for versions up to and including 0.2. Two slight changes: added an
6224     encoding specification and fixed the comment which refered to
6225     GRASS, not Thuban
6226    
6227     * test/xmlsupport.py: New support module for tests involving XML.
6228     Currently there's a mix-in class for XML validation.
6229    
6230     * test/test_xmlsupport.py: New. Tests for the xmlsupport module
6231    
6232     * test/test_save.py (SaveSessionTest): Derive from ValidationTest
6233     so that we can validate the
6234     (SaveSessionTest.testEmptySession)
6235     (SaveSessionTest.testSingleLayer)
6236     (SaveSessionTest.testSingleLayer)
6237     (SaveSessionTest.testLayerProjection)
6238     (SaveSessionTest.testRasterLayer)
6239     (SaveSessionTest.testClassifiedLayer): Validate the generated XML
6240    
6241     * test/runtests.py (main): Call print_additional_summary instead
6242     of print_garbage_information
6243    
6244     * test/support.py (resource_dir): New function to return the
6245     "Resource" subdirectory
6246     (print_additional_summary): New function to combine several
6247     summary functions
6248     (run_tests): Use print_additional_summary instead of calling
6249     print_garbage_information directly
6250    
6251     2003-06-19 Bernhard Herzog <[email protected]>
6252    
6253 bh 1244 * Doc/thuban.dtd (classification): Correct the content model of
6254     the classification element.
6255     (projection): Add the "name" attribute
6256    
6257 frank 1242 2003-06-19 Frank Koormann <[email protected]>
6258    
6259     MERGE from the greater-ms3 branch.
6260    
6261     * Thuban/UI/scalebar.py (ScaleBar.DrawScaleBar): Apply conversion to
6262     scale if projection is latlong to get better estimate.
6263    
6264     Fix problem of hidden properties dialog under windows after double
6265     click on layer tree:
6266     The tree control always gets an Expanded / Collapsed event after
6267 joey 2162 the ItemActivated on double click, which raises the main window again.
6268     We add a second ItemActivated event to the queue, which simply
6269 frank 1242 raises the already displayed window.
6270    
6271     * Thuban/UI/legend.py (LegendTree.__init__): Instance variable
6272     raiseProperties initialized to prevent endless loops
6273     (LegendTree._OnItemActivated): Depending on self.raiseProperties
6274     simply raise the properties or open the dialog and issue a second
6275     event.
6276    
6277 jonathan 1235 2003-06-18 Jonathan Coles <[email protected]>
6278    
6279 jonathan 1239 * setup.py: Fix a few problems that occured under Windows.
6280    
6281     2003-06-18 Jonathan Coles <[email protected]>
6282    
6283 jonathan 1235 When Thuban loaded the map was redrawn twice because the
6284     legend was being opened after the mainwindow was created
6285     and not during its creation. This meant the map was drawn
6286     initially and then had to be redrawn when the legend
6287     caused the display to change. Now the legend is opened
6288     in the mainwindow constructor which resolves this issue.
6289    
6290     Also, although we were checking for the existence of
6291     gdal and gdalwarp modules, the gdalwarp extension was
6292     still being compiled (which may fail if the system doesn't
6293     have gdal installed). the build_ext command to setup.py
6294     now accepts the flags --with-gdal and --without-gdal.
6295     If --without-gdal is specified setup.py will try to
6296     use the gdal parameters specified by gdal-config. Under
6297     windows, those parameters have to be set in setup.py
6298     as with proj4 an wxWindows.
6299    
6300     * setup.py: Use a list instead of seperate variables for
6301     extension parameters so we can create a generic function
6302     that runs an appropriate *-config script.
6303     (run_cs_script): Renamed from run_wx_script and modified
6304     to accept a second argument which is a list of lists to
6305     be filled in by the values returned from running the command.
6306     (thuban_build_ext): New. Extends the build_ext command and
6307     provides the options --with-gdal/--without-gdal which then
6308     optionally includes the gdalwarp extension.
6309    
6310     * Thuban/Model/resource.py: First check if we can import
6311     the gdalwarp Thuban extension before checking for gdal.
6312     Also added some comments.
6313    
6314     * Thuban/UI/legend.py (ScaleBarBitmap.__SetScale): Check if
6315     the map is None which may be the case if none has been loaded
6316     yet.
6317    
6318     * Thuban/UI/main.py (main): Remove call to ShowLegend.
6319    
6320     * Thuban/UI/mainwindow.py (MainWindow.__init__): Call ShowLegend().
6321    
6322     * Thuban/UI/renderer.py: Check for gdal support before importing
6323     gdalwarp.
6324     (MapRenderer.render_map): Only try to optimize if we have gdal
6325     support otherwise nothing will get drawn.
6326    
6327 jonathan 1237 * Thuban/UI/view.py (MapCanvas.FitMapToWindow): This may be called
6328     during startup before a map has been created. Check if map is None
6329     before using it and do nothing if it is.
6330    
6331 jonathan 1224 2003-06-17 Jonathan Coles <[email protected]>
6332    
6333     Fix the problem with raster layers under Windows that caused
6334     Thuban to crash. The view should respond to layer projection
6335     changed events to update the display. Changes to a projection
6336     should not cause the map to be set to full extent.
6337    
6338     * Thuban/UI/view.py (MapCanvas.__init__): New instance variable
6339     current_map_proj to remember the current map projection so that
6340     when the projection changes we know what the previous projection
6341     was.
6342     (MapCanvas.SetMap): Unsubscribe and subscribe to
6343     LAYER_PROJECTION_CHANGED events.
6344     (MapCanvas.projection_changed): Split into two methods that respond
6345     to map and layer projection changes.
6346     (MapCanvas.map_projection_changed): New. Takes the current view and
6347     projects it using the new projection. This does not cause the
6348     map to be redrawn at full extent.
6349     (MapCanvas.layer_projection_changed): New. Cause a redraw which
6350     will draw each layer in its new projection.
6351    
6352     * extensions/thuban/bmpdataset.cpp (BMPDataset::Open): Call
6353     VSIFClose() not VSIFCloseL() to close the file. Fixes a crash
6354     under Windows.
6355    
6356     * extensions/thuban/gdalwarp.cpp (MFILENAME): Padding should be
6357     to twice sizeof(void*) because there are two digits for each
6358     hex byte.
6359    
6360 bh 1220 2003-06-16 Bernhard Herzog <[email protected]>
6361    
6362     Update to the layer interface: Direct access to the table,
6363     shapetable, shapefile and filename attributes is now actively
6364     deprecated by issuing deprecation warnings for all places where
6365     this happens.
6366    
6367     * Thuban/Model/layer.py (Layer.__getattr__): New. Implement access
6368     to the instance variables table, shapetable, shapefile and
6369     filename via __getattr__ so that we can issue a deprecation
6370     warning.
6371     (Layer.SetShapeStore): Don't set the deprecated instance variables
6372     any more
6373     (Layer.SetShapeStore): Don't use deprecated layer instance
6374     variables
6375     (Layer.Destroy): No need to explicitly remove the instance
6376     variables any more
6377     (Layer.GetFieldType, Layer.Shape): Don't use deprecated layer
6378     instance variables
6379    
6380     * Thuban/UI/classgen.py (ClassGenDialog.__init__)
6381     (GenUniformPanel._OnRetrieve, GenUniquePanel._OnRetrieve)
6382     (GenQuantilesPanel.GetList, GenQuantilesPanel.OnRetrieve): Don't
6383     use deprecated layer instance variables
6384    
6385     * Thuban/UI/classifier.py (Classifier.__init__): Don't use
6386     deprecated layer instance variables
6387    
6388     * Thuban/UI/identifyview.py (IdentifyListCtrl.selected_shape)
6389     (IdentifyGridCtrl.selected_shape): Don't set the deprecated layer
6390     instance variables
6391    
6392     * Thuban/UI/tableview.py (LayerTableGrid.select_shapes): Don't use
6393     deprecated layer instance variables
6394    
6395     * Thuban/UI/mainwindow.py (MainWindow.LayerShowTable): Don't use
6396     deprecated layer instance variables
6397    
6398     * Thuban/Model/save.py (SessionSaver.write_layer): Don't use
6399     deprecated layer instance variables
6400    
6401     * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer)
6402     (MapRenderer.polygon_render_param): Don't use deprecated layer instance
6403     variables
6404    
6405     * test/runtests.py (main): Turn Thuban's deprecation warnings into
6406     errors so that they're cought by the tests
6407    
6408     * test/test_load.py (TestSingleLayer.test): Don't use deprecated
6409     layer instance variables
6410    
6411 jonathan 1212 2003-06-16 Jonathan Coles <[email protected]>
6412    
6413     Fix a problem under Windows whereby if the user double-clicks on a
6414     layer in the legend that tree item will expand or collapse as well
6415     as open the layer properties dialog. The state of the tree item
6416     should not be affected.
6417    
6418     * Thuban/UI/legend.py (LegendTree.__init__): Add instance variable
6419     preventExpandCollapse and subscribe to expanding and collapsing
6420     events.
6421     (LegendTree.OnItemExpandCollapse): New. Responds to expanding and
6422     collapsing events and will veto the event if it has been triggered
6423     by the user double clicking on a layer.
6424     (LegendTree._OnItemActivated): Set preventExpandCollapse to indicate
6425     that an expanding/collapsing event should be vetoed.
6426    
6427 bh 1208 2003-06-13 Bernhard Herzog <[email protected]>
6428    
6429     * Thuban/UI/classifier.py (Classifier.OnClose)
6430     (Classifier.map_layers_removed)
6431     (Classifier.layer_shapestore_replaced): Unsubscribe the messages
6432     in OnClose and not in map_layers_removed or
6433     layer_shapestore_replaced to make sure it always happens when the
6434     dialog is closed
6435    
6436 jonathan 1201 2003-06-13 Jonathan Coles <[email protected]>
6437    
6438 jonathan 1203 This puts back a fix for Windows where a panel is needed so that
6439     the background of the table view appears correctly.
6440    
6441     * Thuban/UI/tableview.py (TableFrame.__init__): Add a panel
6442     object that can be used by derived classes to place any
6443     controls (including the grid) onto.
6444     (QueryTableFrame.__init__): Use the panel as the parent window
6445     for all the controls. Reparent the grid so that the panel is
6446     the parent. Call UpdateStatusText() to correctly initialize
6447     the status bar.
6448    
6449     2003-06-13 Jonathan Coles <[email protected]>
6450    
6451 jonathan 1201 * Thuban/UI/dialogs.py (ThubanFrame): New: a class that inherits
6452     from wxFrame (as opposed to wxDialog like the other classes)
6453     but otherwise behaves like the other classes. This is needed
6454     for the TableView which isn't really a dialog and needs to
6455     have a status bar and control buttons.
6456    
6457     * Thuban/UI/tableview.py (TableGrid.__init__): Create an
6458     instance variable to keep track of how many rows are selected.
6459     Subscribe once to the the events we are interested in.
6460     (ThubanGrid.OnRangeSelect): Only handle event if event handling
6461     hasn't been turned off.
6462     (ThubanGrid.OnSelectCell): Only handle event if event handling
6463     hasn't been turned off.
6464     (ThubanGrid.ToggleEventListeners): Rather than subscribe None
6465     as an event listener (which changes the event handler stack)
6466     simply set an instance variable to False. This is checked in
6467     the event handlers.
6468     (ThubanGrid.GetNumberSelected): Return the number of currently
6469     selected rows.
6470     (TableFrame): Inherit from ThubanFrame so we can have a
6471     status bar and control buttons.
6472     (QueryTableFrame.__init__): Create a status bar. Fixes RTbug #1942.
6473     Explicitly set which items are selected in the operator choice and
6474     action choice so there is always a valid selection. Fixes RTbug #1941.
6475     Subscribe to grid cell selection events so we can update the
6476     status bar.
6477     (QueryTableFrame.UpdateStatusText): Update the status bar with
6478     how many rows are in the grid, how many columns, and how many
6479     rows are selected.
6480     (QueryTableFrame.OnGridSelectRange, QueryTableFrame.OnGridSelectCell):
6481     Call UpdateStatusText when cells are (de)selected.
6482     (QueryTableFrame.OnQuery): Use the string value in the value
6483     combo if either the selected item index is 0 or if the string
6484     cannot be found in the predefined list (this happens if the
6485     user changes the text). Fixes RTbug #1940.
6486     Only turn off the grid event listeners if there a query comes
6487     back with a none empty list of ids. in the case that the list
6488     is empty this causes a grid.ClearSelection() call to actually
6489     clear the grid selection which causes the selected items in
6490     the map to be deselected. Fixes RTbug #1939.
6491    
6492     * test/test_save.py (XMLWriterTest.Encode): Check return values.
6493     Fixes RTbug #1851.
6494    
6495 bh 1195 2003-06-13 Bernhard Herzog <[email protected]>
6496    
6497     * Thuban/UI/identifyview.py (IdentifyView.__init__): Call
6498     self.selected_shape with the current selection to make sure the
6499     contents of the dialog are up to date when it's shown for the
6500     first time.
6501     The dialog used to work without this by luck. The recent fix to
6502     the connector module 'broke' a 'feature' the identify view was
6503     relying on, i.e that subscribing to a message in response to
6504     receiving a message of that type would mean that the new
6505     subscriber would also be called for the same message.
6506    
6507 jonathan 1169 2003-06-12 Jonathan Coles <[email protected]>
6508 jonathan 1175
6509 jonathan 1193 * extensions/thuban/gdalwarp.cpp: Removed debug printing as
6510     the image is rendered. Fixes RTbug #1937.
6511    
6512     2003-06-12 Jonathan Coles <[email protected]>
6513    
6514 jonathan 1191 * Thuban/Lib/fileutil.py: As is done under Windows, create the
6515 jonathan 1193 user directory if it doesn't exist on a posix system.
6516     Fixes RTbug #1815.
6517 jonathan 1191
6518     * Thuban/Model/resource.py (get_user_proj_files): Moved the
6519     called to get_application_dir here, so that the directory
6520     will only be called if this method is invoked.
6521    
6522     * Thuban/UI/projdialog.py (ProjFrame.__DoOnProjAvail): Clear
6523     the projfilepath if no projection is selected.
6524    
6525     2003-06-12 Jonathan Coles <[email protected]>
6526    
6527 jonathan 1182 * Thuban/UI/legend.py (ScaleBarBitmap.__SetScale): Don't draw
6528     the scalebar if the current map has no projection set.
6529    
6530     * Thuban/UI/projdialog.py (ProjFrame.__DoOnProjAvail): Set the
6531     projfilepath label to just the basename of the projection file
6532     rather than include the entire path.
6533    
6534     * Thuban/Model/resource.py: Fix missed proj functions that
6535     needed to be renamed.
6536    
6537     2003-06-12 Jonathan Coles <[email protected]>
6538    
6539 jonathan 1178 * Thuban/Model/classification.py: Removed assert statements that
6540     tested if the variable was an instance of Color.
6541    
6542     * Thuban/Model/color.py (Color): Remove commented code that isn't
6543     used.
6544     (Transparent): Renamed from NoColor. Doesn't inherit from Color.
6545     Fixes RTbug #1835.
6546     (Transparent.__eq__, Transparent.__ne, Transparent.__repr): New.
6547     Needed now that the class doesn't inherit from Color.
6548    
6549     2003-06-12 Jonathan Coles <[email protected]>
6550    
6551 jonathan 1175 * test/test_save.py (XMLWriterTest.testEncode): Explicitly
6552     check unicode strings.
6553    
6554     * test/test_layer.py: Check for existence of gdal.
6555    
6556     2003-06-12 Jonathan Coles <[email protected]>
6557 jonathan 1172
6558     * Thuban/Model/xmlreader.py: New. Contains the XMLReader class
6559     that was in load.py
6560 jonathan 1169
6561 jonathan 1172 * Thuban/Model/xmlwriter.py: New. Contains the XMLWriter class
6562     that was in save.py
6563    
6564     2003-06-12 Jonathan Coles <[email protected]>
6565    
6566 jonathan 1169 This is largely a collection of bug fixes. We also handle the
6567     case where gdal is not on the system. The XMLReader and XMLWriter
6568     classes were moved into there own files to resolve some circular
6569     import references and because they shouldn't really be in the
6570     file that is dediciated to reading/writing session files since
6571     they are also used elsewhere.
6572    
6573     * Thuban/Model/classgen.py: Renamed functions to follow the
6574     function_names_with_underscores style. Fixes RTbug #1903.
6575     (calculate_quantiles): Raise ValueError if 'percents' is invalid.
6576    
6577     * Thuban/Model/layer.py: Import gdal only if it available.
6578     (RasterLayer): Handle the case where the gdal library is unavailable.
6579     Addresses RTbug #1877.
6580    
6581     * Thuban/Model/load.py (XMLReader): Moved into seperate file
6582     xmlreader.py.
6583    
6584 jonathan 1172 2003-06-12 Jonathan Coles <[email protected]>
6585    
6586     This is largely a collection of bug fixes. We also handle the
6587     case where gdal is not on the system. The XMLReader and XMLWriter
6588     classes were moved into there own files to resolve some circular
6589     import references and because they shouldn't really be in the
6590     file that is dediciated to reading/writing session files since
6591     they are also used elsewhere.
6592    
6593     * Thuban/Model/classgen.py: Renamed functions to follow the
6594     function_names_with_underscores style. Fixes RTbug #1903.
6595     (calculate_quantiles): Raise ValueError if 'percents' is invalid.
6596    
6597     * Thuban/Model/layer.py: Import gdal only if it available.
6598     (RasterLayer): Handle the case where the gdal library is unavailable.
6599     Addresses RTbug #1877.
6600    
6601     * Thuban/Model/load.py (XMLReader): Moved into seperate file
6602     xmlreader.py.
6603    
6604 jonathan 1169 * Thuban/Model/save.py (escape, XMLWriter): Moved into seperate
6605     file xmlwriter.py.
6606    
6607     * Thuban/Model/resource.py: Renamed functions to following the
6608     function_names_with_underscores style.
6609     (has_gdal_support): New function that returns true if the gdal
6610     library is available. Addresses RTbug #1877.
6611    
6612     * Thuban/UI/application.py (ThubanApplication.OpenSession):
6613     Display a message box if the gdal library is not available, but
6614     only if there are any layers that would use it. Addresses RTbug #1877.
6615    
6616     * Thuban/UI/classgen.py: Use renamed projection resource functions.
6617     (GenUniformPanel.__CalcStepping): Fix a slight discrepency
6618     when using integers versus floats.
6619    
6620     * Thuban/UI/mainwindow.py (_has_gdal_support): New. Used to
6621     determine if the "Add Image Layer" menu option should be
6622     greyed out or not. Addresses RTbug #1877.
6623    
6624     * Thuban/UI/projdialog.py: Use renamed projection resource functions.
6625    
6626     * Thuban/UI/renderer.py (MapRenderer.render_map): Only try to
6627     optimize if a raster layer is visible. Fixes RTbug #1931.
6628     Only draw the raster layer if the gdal library is available.
6629     Addresses RTbug #1877.
6630    
6631     * test/test_classgen.py: Add tests for generate_singletons,
6632     generate_uniform_distribution, generate_quantiles. Fixes RTbug #1903.
6633     (test_calculate_quantiles): Fix some tests to catch the new
6634     ValueError that is raised.
6635    
6636     * test/test_proj.py: Use renamed projection resource functions.
6637    
6638     * test/test_save.py (SaveSessionTest.testClassifiedLayer): New
6639     test for saving classified layers. Fixes RTbug #1902.
6640     (XMLWriterTest): New. Tests the XMLWriter class. Fixes RTbug #1851.
6641    
6642 jan 1156 2003-06-12 Jan-Oliver Wagner <[email protected]>
6643    
6644     Fix for http://intevation.de/rt/webrt?serial_num=1900.
6645    
6646     * Thuban/UI/multiplechoicedialog.py: New. A multiple choice dialog.
6647    
6648     * Thuban/UI/mainwindow.py: import wxMultipleChoiceDialog from
6649     multiplechoicedialog.py rather than from the wxPython library.
6650    
6651 frank 1151 2003-06-11 Frank Koormann <[email protected]>
6652    
6653 frank 1152 * Thuban/Lib/fileutil.py (get_application_dir): Minor stability
6654     update.
6655    
6656     2003-06-11 Frank Koormann <[email protected]>
6657    
6658 frank 1151 * Thuban/Lib/fileutil.py (get_application_dir): New function to
6659     determine the absolute .thuban/thuban directory under
6660     "posix" (os.expanduser) and "nt" (read AppData registry key).
6661    
6662     * Thuban/Model/resource.py: Use get_application_dir
6663    
6664     * Thuban/UI/application.py (ThubanApplication.read_startup_files):
6665     Use get_application_dir.
6666    
6667 bh 1143 2003-06-10 Bernhard Herzog <[email protected]>
6668    
6669 bh 1147 * Thuban/UI/tableview.py (LayerTableFrame.__init__): Subscribe to
6670     the messages MAP_LAYERS_REMOVED messages
6671     (LayerTableFrame.OnClose): Unsubscribe from it.
6672     (LayerTableFrame.map_layers_removed): New. Receiver for
6673     MAP_LAYERS_REMOVED. Close the dialog when the layer whose the
6674     dialog is showing is removed.
6675    
6676     2003-06-10 Bernhard Herzog <[email protected]>
6677    
6678 bh 1145 * Thuban/Lib/connector.py (Connector.Issue): Iterate over a copy
6679     of the receivers list so that unsubscribing in a receiver doesn't
6680     modify it while iterating over it.
6681    
6682     * test/test_connector.py
6683     (ConnectorTest.test_disconnect_in_receiver): New. Test whether
6684     unsubscribing in a receiver works correctly. See docstring for
6685     details
6686    
6687     2003-06-10 Bernhard Herzog <[email protected]>
6688    
6689 bh 1143 * Thuban/Model/messages.py (LAYER_SHAPESTORE_REPLACED): New
6690     message.
6691    
6692     * Thuban/Model/layer.py (Layer.SetShapeStore): Send
6693     LAYER_SHAPESTORE_REPLACED when the shapestore changes. A
6694     LAYER_CHANGED will still be sent if the classification changes.
6695    
6696     * Thuban/UI/classifier.py (Classifier.__init__): Add the map as
6697     parameter so we can subscribe to some of its messages
6698     (Classifier.__init__): Subscribe to the map's MAP_LAYERS_REMOVED
6699     and the layer's LAYER_SHAPESTORE_REPLACED
6700     (Classifier.unsubscribe_messages): New. Unsubscribe from message
6701     subscribed to in __init__
6702     (Classifier.map_layers_removed)
6703     (Classifier.layer_shapestore_replaced): receivers for the messages
6704     subscribed to in __init__. Unsubscribe and close the dialog
6705    
6706     * Thuban/UI/mainwindow.py (MainWindow.OpenLayerProperties): Pass
6707     the map to the Classifier dialog
6708    
6709     * test/test_layer.py (SetShapeStoreTests): Derive from
6710     SubscriberMixin as well so we can test messages
6711     (SetShapeStoreTests.setUp): Subscribe to some of the layer's
6712     messages
6713     (SetShapeStoreTests.tearDown): Clear the messages again
6714     (SetShapeStoreTests.test_sanity): Expand the doc-string and check
6715     for the modified flag too
6716     (SetShapeStoreTests.test_set_shape_store_modified_flag): New test
6717     to check whether SetShapeStore sets the modified flag
6718     (SetShapeStoreTests.test_set_shape_store_different_field_name)
6719     (SetShapeStoreTests.test_set_shape_store_same_field)
6720     (SetShapeStoreTests.test_set_shape_store_same_field_different_type):
6721     Add tests for the messages. This checks both the new
6722     LAYER_SHAPESTORE_REPLACED and the older LAYER_CHANGED
6723    
6724 jan 1141 2003-06-06 Jan-Oliver Wagner <[email protected]>
6725    
6726     * Thuban/UI/mainwindow.py: Improved and partly added help texts for
6727     the menu items.
6728    
6729 frank 1134 2003-06-05 Frank Koormann <[email protected]>
6730    
6731 frank 1139 * Thuban/UI/identifyview.py (IdentifyView.__init__):
6732     Layout reimplemented without panel. Make life easier to fit the list
6733     in the dialog.
6734    
6735     2003-06-05 Frank Koormann <[email protected]>
6736    
6737 frank 1137 * Thuban/UI/projdialog.py (ProjFrame.__init__): Fill the projchoice
6738     once on initialisation (Former implementation resulted in multiple
6739     entries for each projection).
6740     (ProjFrame.__FillAvailList): selectProj as second optional parameter,
6741     if set, select the projection found under the specified name. This
6742     overwrites any other selection estimate.
6743     Removed projchoice filling from this method.
6744     (ProjFrame._OnSave, ProjFrame._OnAddToList):
6745     Updated call of ProjFrame.__FillAvailList
6746     (LCCPanel._DoLayout): Moved parameter controls in more common order.
6747    
6748     * Resources/Projections/defaults.proj: Extended defaults representing
6749     various common European projections.
6750    
6751     2003-06-05 Frank Koormann <[email protected]>
6752    
6753 frank 1134 * Thuban/UI/identifyview.py (IdentifyView.__init__):
6754     Use ListCtrl instead of GridCtrl
6755    
6756     * Thuban/Model/resource.py:
6757     Guess location of .thuban directory from tempdir parent directory.
6758    
6759     * Thuban/UI/application.py (ThubanApplication.read_startup_files):
6760     Guess location of .thuban directory from tempdir parent directory.
6761    
6762 bh 1130 2003-06-04 Bernhard Herzog <[email protected]>
6763    
6764     Do not cache the values returned by the tree widget's
6765     GetFirstChild and GetNextChild methods because it led to lots of
6766     segfaults. The new way requires more brute force but is more
6767     reliable.
6768    
6769     * Thuban/UI/legend.py (LegendTree.__init__): Remove instance
6770     variable layer2id
6771     (LegendTree.find_layer): New method to do with brute force what
6772     layer2id tried to accomplish
6773     (LegendTree._OnMsgLayerChanged)
6774     (LegendTree._OnMsgLayerTitleChanged, LegendTree.__ShowHideLayer):
6775     Use find_layer instead of layer2id
6776     (LegendTree.__RemoveLayer, LegendTree.__AddLayer): No need to
6777     update layer2id anymore
6778     (LegendTree._OnMsgMapLayersRemoved)
6779     (LegendTree._OnMsgMapLayersAdded): Get by without layer2id.
6780    
6781 tkoester 1128 2003-06-03 Thomas Koester <[email protected]>
6782    
6783     * Thuban/Model/classgen.py (GenQuantiles0): New function.
6784    
6785 bh 1120 2003-06-02 Bernhard Herzog <[email protected]>
6786    
6787 bh 1127 * Thuban/UI/mainwindow.py (layer_rename command, table_rename command):
6788     New commands.
6789     (main_menu): Add the new commands.
6790     (MainWindow.TableRename): New. Implementation of the table_rename
6791     command.
6792     (MainWindow.RenameLayer): New. Implementation of the layer_rename
6793     command.
6794    
6795     * Thuban/Model/session.py (Session.AddTable): call self.changed to
6796     set the modified flag
6797    
6798     * test/test_session.py (TestSessionSimple.test_add_table): Test
6799     whether the modified flag is set properly
6800    
6801     * Thuban/Model/base.py (TitledObject.SetTitle): Call changed
6802     instead of issue so that the modified flags get updated.
6803    
6804     * test/test_base.py (SomeTitledObject): Derive from Modifiable
6805     instead of Publisher to reflect reality better and to accomodate
6806     the fact that SetTitle now calls changed instead of issue
6807    
6808     2003-06-02 Bernhard Herzog <[email protected]>
6809    
6810     * Thuban/UI/classgen.py (GenQuantilesPanel.GetList): Resource
6811     acquisition has to happen before the try in a try-finally.
6812    
6813     2003-06-02 Bernhard Herzog <[email protected]>
6814    
6815 bh 1120 * Thuban/UI/legend.py (LegendTree._OnMsgMapLayersRemoved): It's
6816     possible that a layer is removed that is not currently selected in
6817     the legend so don't check for this.
6818    
6819 bh 1112 2003-05-30 Bernhard Herzog <[email protected]>
6820    
6821 bh 1118 * Thuban/Model/layer.py (Layer.Destroy): Set all instance
6822     variables to None that have direct or indirect references to
6823     shapefiles or dbf files to make sure that they do go away and the
6824     files are closed.
6825    
6826     2003-05-30 Bernhard Herzog <[email protected]>
6827    
6828 bh 1116 * Thuban/UI/legend.py (LegendTree.GetRootItem): Reset
6829     availImgListIndices when a new image list is created
6830    
6831     2003-05-30 Bernhard Herzog <[email protected]>
6832    
6833 bh 1114 * Thuban/UI/legend.py (LegendTree.__init__): New instance variable
6834     changing_selection to indicate whether the LegendTree code itself
6835     is currently changing the selection
6836     (LegendTree.normalize_selection): New method to normalize the
6837     selection by selecting the layer item even if the user clicked on
6838     the classification.
6839     (LegendTree._OnSelChanged): normalize the selection. This works
6840     around a bug in wx which doesn't keep track of the selection
6841     properly when subtrees are deleted.
6842    
6843     2003-05-30 Bernhard Herzog <[email protected]>
6844    
6845 bh 1112 * Thuban/UI/view.py (MapCanvas.set_view_transform): Limit the
6846     maximum and minimum scale factors.
6847    
6848     * test/test_classgen.py (ClassGenTest.test): Update to reflect the
6849     changes in classgen.py
6850    
6851 jonathan 1109 2003-05-30 Jonathan Coles <[email protected]>
6852    
6853     * Thuban/Model/classgen.py: Remove ClassGenerator class but make
6854     all the methods functions. Fixes RTBug #1903.
6855    
6856     * Thuban/Model/map.py (Map.TopLayer, Map.BottomLayer): Renamed
6857     to MoveLayerToTop and MoveLayerToBottom respectively. Fixes
6858     RTBug #1907.
6859    
6860     * Thuban/UI/classgen.py: Use classgen functions that were part
6861     of the ClassGenerator class. Put try/finally blocks around
6862     code that uses wxBeginBusyCursor()/wxEndBusyCursor(). Fixes
6863     RTBug #1904.
6864    
6865     * Thuban/UI/classifier.py: Remove unused import of ClassGenerator.
6866    
6867     * Thuban/UI/legend.py: The legend was cleared and repopulated any
6868     time something changed which caused some state to be lost such
6869     as which children were expanded or collapsed. Fixes RTBug #1901.
6870     (LegendTree._OnMsgMapLayersAdded): Add only new layers.
6871     (LegendTree.__OnMsgMapLayersRemoved): Remove layers that exist in
6872     the legend but not in the map.
6873     (LegendTree.__FillTree): Move main functionality out into smaller
6874     methods that can be used by other methods.
6875     (LegendTree.__FillTreeLayer): Reuse old slots in the image list
6876     if they are available.
6877     (LegendTree.DeleteAllItems): Renamed from __DeleteAllItems so
6878     that we override the wxTreeCtrl method. Iterate over children
6879     and call __RemoveLayer.
6880     (LegendTree.__AddLayer): New. Add a new layer to the legend.
6881     (LegendTree.__RemoveLayer): Remove a layer from the legend.
6882     (LegendTree.DeleteChildren): New, overrides wxTreeCtrl method.
6883     Should only be called with the id of a layer branch.
6884     (LegendTree.GetRootItem): New, overrides wxTreeCtrl method.
6885     Returns the root item or creates one if necessary.
6886    
6887     * Thuban/UI/renderer.py (MapRenderer.draw_raster_layer): Call
6888     ProjectRasterFile with tuple arguments instead of strings.
6889    
6890     * Thuban/UI/tableview.py (QueryTableFrame.OnQuery): Wrap code
6891     with try/finally. Fixes RTBug #1904.
6892    
6893     * Thuban/UI/view.py (MapCanvas.OnPaint): Wrap code
6894     with try/finally. Fixes RTBug #1904.
6895     (MapCanvas.FitSelectedToWindow): If a single point is selected
6896     simply center it on the display. Fixes RTBug #1849.
6897    
6898     * extensions/thuban/gdalwarp.cpp: Removed code that allowed gdalwarp
6899     to be compiled as a standalone app. Now the code can only be
6900     called from Python which simplifies the parameter passing.
6901     (ProjectRasterFile): Handle Python arguments. Remove code that
6902     checks for a destination dataset. Add more clean up code.
6903    
6904     * test/test_map.py (TestMapWithContents.test_raise_layer_top,
6905     TestMapWithContents.test_lower_layer_bottom):
6906     Test Map.MoveLayerToTop() and Map.MoveLayerToBottom() respectively.
6907     Fixes RTBug #1907.
6908    
6909     * Thuban/UI/mainwindow.py (MainWindow.ToggleLegend): Apply a full
6910     extent to the map when the legend is toggled. Fixes RTBug #1881.
6911    
6912 jan 1097 2003-05-29 Jan-Oliver Wagner <[email protected]>
6913    
6914     * Thuban/UI/tableview.py (LayerTableFrame.OnClose): Bug-fix: Now
6915     unsubscribes all that is subcribed in __init__.
6916    
6917 bh 1089 2003-05-28 Bernhard Herzog <[email protected]>
6918    
6919 bh 1095 * Thuban/UI/mainwindow.py (MainWindow.DuplicateLayer)
6920     (MainWindow.CanDuplicateLayer): New methods to implement the
6921     Layer/Duplicate command.
6922     (layer_duplicate command): New.
6923     (main_menu): Add layer_duplicate to the Layer menu.
6924    
6925     2003-05-28 Bernhard Herzog <[email protected]>
6926    
6927 bh 1093 * Thuban/UI/tableview.py (NullRenderer.Draw): New. Our own
6928     renderer so that NULL/None values get displayed differently (by a
6929     gray rectangle).
6930     (TableGrid.__init__): Override the default renderers
6931    
6932     2003-05-28 Bernhard Herzog <[email protected]>
6933    
6934 bh 1089 * Thuban/Model/layer.py (Layer.SetShapeStore): Set the
6935     classification to "None" if the type of the field has changed.
6936    
6937     * test/test_layer.py (SetShapeStoreTests): New. Class with a few
6938     test for the Layer.SetShapeStore method
6939    
6940 jan 1087 2003-05-28 Jan-Oliver Wagner <[email protected]>
6941 jan 1085
6942 jan 1087 * Thuban/Model/layer.py (Layer.TreeInfo): Fixed a bug (a layer
6943     does not necessarily have a filename).
6944    
6945     2003-05-28 Jan-Oliver Wagner <[email protected]>
6946    
6947 jan 1085 * Thuban/UI/mainwindow.py (MainWindow.TableClose, MainWindow.TableShow):
6948     sort the selection list for the dialog.
6949    
6950 frank 1083 2003-05-28 Frank Koormann <[email protected]>
6951    
6952     * extensions/thuban/wxproj.cpp
6953     (project_point): Removed cast to int for projected point coordinates.
6954     (shape_centroid): Return last point if all polygon vertices fall
6955     to one point.
6956    
6957 bh 1079 2003-05-28 Bernhard Herzog <[email protected]>
6958    
6959 bh 1081 * Thuban/UI/mainwindow.py (_can_unjoin): Add doc-string and cope
6960     with layers that don't have shapestores, i.e. raster layers.
6961    
6962     2003-05-28 Bernhard Herzog <[email protected]>
6963    
6964 bh 1079 * Thuban/Model/table.py (DBFTable.__init__): Omit the extension
6965     when determining the title from the filename.
6966    
6967     * test/test_dbf_table.py (TestDBFTable.test_title): Update to
6968     reflect changes in the way the title is derived from the filename
6969    
6970 frank 1077 2003-05-28 Frank Koormann <[email protected]>
6971    
6972     * Thuban/UI/mainwindow.py (MainWindow.TableShow):
6973     Added wxDEFAULT_DIALOG_STYLE to show table dialog styles.
6974    
6975 bh 1069 2003-05-27 Bernhard Herzog <[email protected]>
6976    
6977 bh 1075 * Thuban/UI/mainwindow.py (MainWindow.delegated_messages): Also
6978     delegate SelectedLayer.
6979     (MainWindow.LayerUnjoinTable): Implement.
6980     (_can_unjoin): New. Helper function for the sensitivity of the
6981     layer/unjoin command.
6982    
6983     * Thuban/Model/data.py (ShapefileStore.OrigShapeStore)
6984     (DerivedShapeStore.OrigShapeStore): New. Return the original
6985     shapestore. Used to figure out how to unjoin.
6986     (DerivedShapeStore.Shapefile): Fix a typo.
6987    
6988     2003-05-27 Bernhard Herzog <[email protected]>
6989    
6990 bh 1073 * Thuban/UI/join.py (JoinDialog): Extend to handle layer joins as
6991     well
6992     (JoinDialog.__init__): Use the layer parameter and only build the
6993     left choice when a layer is given
6994     (JoinDialog.OnJoin): Handle layer joins as well
6995     (JoinDialog.OnLeftTable, JoinDialog.OnRightTable): Handle the case
6996     that the user selects the "Select..." item. The sensitivitly
6997     updating is now in update_sensitivity
6998     (JoinDialog.y): New method to refactor the sensitivity update of
6999     the join button into its own method.
7000    
7001     * Thuban/UI/mainwindow.py (MainWindow.LayerJoinTable): Implement.
7002    
7003     2003-05-27 Bernhard Herzog <[email protected]>
7004    
7005 bh 1071 * Thuban/UI/mainwindow.py (table_close command): Make it sensitive
7006     iff there are unreferenced tables in the session
7007    
7008     2003-05-27 Bernhard Herzog <[email protected]>
7009    
7010 bh 1069 * Thuban/Model/messages.py (TABLE_REMOVED): New message.
7011    
7012     * Thuban/Model/session.py (Session.UnreferencedTables): New method
7013     to return tables that are not referenced by other tables or shape
7014     stores and can be removed.
7015     (Session.RemoveTable): Issue a TABLE_REMOVED message after
7016     removing the table
7017    
7018     * Thuban/UI/mainwindow.py: Remove unused imports
7019     (MainWindow.TableClose): Implement.
7020    
7021     * Thuban/UI/tableview.py (TableFrame.__init__): Subscribe to some
7022     messages so that the frame will be automatically closed when a new
7023     session is opened or the table is removed.
7024     (TableFrame.OnClose): Unsubscribe the Subscriptions made in
7025     __init__
7026     (TableFrame.close_on_session_replaced)
7027     (TableFrame.close_on_table_removed): New. Subscribers that close
7028     the window
7029    
7030     * test/test_session.py (TestSessionMessages.test_remove_table)
7031     (TestSessionSimple.test_remove_table): Move the test to
7032     TestSessionSimple and add test for the TABLE_REMOVED message
7033     (TestSessionBase.setUp): Also subscribe to TABLE_REMOVED
7034     (TestSessionSimple.test_unreferenced_tables) New. Test for the
7035     UnreferencedTables method.
7036     (UnreferencedTablesTests): New. Class with some more sophisticated
7037     tests for UnreferencedTables.
7038    
7039 frank 1065 2003-05-27 Frank Koormann <[email protected]>
7040    
7041 frank 1067 * Thuban/UI/tableview.py (QueryTableFrame.__init__): The "_S_election"
7042     display has some unwanted side effects. Removed again.
7043    
7044     2003-05-27 Frank Koormann <[email protected]>
7045    
7046 frank 1065 * Resources/Bitmaps/legend_icon_layer.xpm: New, icon for legend.
7047    
7048     * Thuban/UI/legend.py (LegendTree.__FillTree): Use "legend_icon_layer"
7049    
7050 jan 1062 2003-05-27 Jan-Oliver Wagner <[email protected]>
7051    
7052 bh 1069 * test/test_menu.py (MenuTest.test): Added test for
7053     Menu.RemoveItem().
7054 jan 1062
7055 bh 1069 * Thuban/UI/menu.py (Menu.RemoveItem): New. Remove an item from
7056     the menu.
7057 jan 1062
7058 frank 1059 2003-05-27 Frank Koormann <[email protected]>
7059    
7060     Nonmodal dialogs without parent (i.e. they can fall behind the main
7061     window)
7062    
7063     * Thuban/UI/mainwindow.py (MainWindow.OnClose): Explicitly destroy
7064     all dialogs in the dialogs dictionary and the canvas.
7065    
7066     * Thuban/UI/dialogs.py (NonModalNonParentDialog): New class, without
7067     parent, i.e. can fall behind other windows.
7068     (NonModalDialog.OnClose): Check is dialog is in mainwindow.dialog
7069     dictionary before removing it.
7070    
7071     * Thuban/UI/classifier.py: Dialog derived from NonModalNonParentDialog
7072    
7073     * Thuban/UI/projdialog.py: Dialog derived from NonModalNonParentDialog
7074     * Thuban/UI/tableview.py: Dialog derived from NonModalNonParentDialog
7075     * Thuban/UI/tree.py: Dialog derived from NonModalNonParentDialog
7076    
7077 bh 1053 2003-05-27 Bernhard Herzog <[email protected]>
7078    
7079 bh 1055 * Thuban/UI/mainwindow.py (MainWindow.ShowTableView): New. Open a
7080     tableview dialog
7081     (MainWindow.TableShow): Use ShowTableView to open the dialogs.
7082     Also, don't use the table's titles as the dialog names. The titles
7083     aren't guaranteed to be unique.
7084     (MainWindow.TableOpen): Open a table view dialog after opening the
7085     table
7086    
7087     2003-05-27 Bernhard Herzog <[email protected]>
7088    
7089 bh 1053 * Thuban/UI/mainwindow.py: Remove the Table/Hide menu item. Its
7090     effect can be achieved by simply closing the window showing the
7091     table.
7092     (MainWindow.TableHide): Removed.
7093     (main_menu): Removed "table_hide"
7094    
7095 frank 1051 2003-05-27 Frank Koormann <[email protected]>
7096    
7097     Fix legend tree display problems under Win32
7098    
7099     * Thuban/UI/legend.py: BMP_SIZE_W = 15
7100     (LegendTree.__FillTree): Display "legend_icon_map.xpm" with layer title.
7101     (LegendTree.__FillTreeLayer): Explicitely set SelectedImage.
7102    
7103     * Resources/Bitmaps/legend_icon_map.xpm: New icon for legend.
7104    
7105 jan 1048 2003-05-27 Jan-Oliver Wagner <[email protected]>
7106    
7107     * Thuban/UI/menu.py (Menu.InsertSeparator): Additional optional parameter
7108     'after' now allows to insert separators almost anywhere in the menu.
7109    
7110 frank 1046 2003-05-27 Frank Koormann <[email protected]>
7111    
7112     * Thuban/UI/tableview.py (QueryTableFrame.__init__): Underline the
7113     "S" of selection box label to hint on hot key (Alt-S). Works under
7114     Win32 but is ignored under GTK.
7115    
7116     2003-05-26 Frank Koormann <[email protected]>
7117    
7118     * Thuban/UI/projdialog.py (ProjFrame.__do_layout, ProjPanel._DoLayout):
7119     Center Choices.
7120    
7121 bh 1038 2003-05-26 Bernhard Herzog <[email protected]>
7122    
7123 bh 1044 Remove the Precision methods again. They're too DBF specific to be
7124     part of the table interface and they're only used in table_to_dbf
7125     anyway.
7126    
7127     * Thuban/Model/transientdb.py (TransientTableBase.Width):Use a
7128     fixed precision of 12 for doubles.
7129     (TransientTableBase.Precision): Removed
7130     (AutoTransientTable.Width): Delegate to self.table.
7131    
7132     * Thuban/Model/table.py (DBFTable.Precision)
7133     (MemoryTable.Precision): Removed.
7134     (MemoryTable.Width): Use a fixed precision of 12 for doubles.
7135     (table_to_dbf): Use a fixed precision of 12 for floats unless the
7136     column object specifies something else.
7137    
7138     * test/test_dbf_table.py (TestTableToDBF.test_table_to_dbf): New.
7139     test for table_to_dbf
7140    
7141     2003-05-26 Bernhard Herzog <[email protected]>
7142    
7143     * test/test_transientdb.py
7144     (TestTransientTable.run_iceland_political_tests): Fix a comment.
7145    
7146     2003-05-26 Bernhard Herzog <[email protected]>
7147    
7148 bh 1038 * Thuban/UI/mainwindow.py (MainWindow.TableOpen): Real
7149     implementation. Mark parts of the file format strings for
7150     localization.
7151    
7152     * Thuban/Model/session.py (Session.OpenTableFile): New. Open a dbf
7153     file and add the table to the tables managed by the session
7154    
7155 bh 1040 * test/test_session.py (TestSessionSimple.test_open_table_file):
7156     New. test case for OpenTableFile
7157    
7158 jan 1033 2003-05-26 Jan-Oliver Wagner <[email protected]>
7159    
7160 jan 1035 * Thuban/UI/controls.py, Thuban/UI/identifyview.py, Thuban/UI/join.py,
7161     Thuban/UI/labeldialog.py, Thuban/UI/mainwindow.py,
7162     Thuban/UI/proj4dialog.py, Thuban/UI/tableview.py, Thuban/UI/view.py:
7163     Replace the true/false of wxWindows by True/False of Python 2.2.1.
7164    
7165     2003-05-26 Jan-Oliver Wagner <[email protected]>
7166    
7167 bh 1038 * Thuban/UI/tableview.py (LayerTableFrame.__init__): If there is
7168     already a selection present, update the grid accordingly.
7169 jan 1033
7170     * Thuban/UI/mainwindow.py (MainWindow.TableShow): Make the dialog
7171     resizeable and increase its initial size.
7172    
7173 frank 1030 2003-05-26 Frank Koormann <[email protected]>
7174    
7175     Table export functionality
7176    
7177     * Thuban/Model/table.py (DBFTable.Width, MemoryTable.Width):
7178     Return width (in characters) for a column.
7179     (DBFTable.Precision, MemoryTable.Precision): Return decimal precision.
7180     (table_to_dbf): Write table to dbf file.
7181     (table_to_csv): Write table to csv file.
7182    
7183     * Thuban/Model/transientdb.py (TransientTableBase.Width,
7184     TransientTableBase.Precision): Return column width and precision.
7185    
7186     * Thuban/UI/tableview.py (QueryTableFrame.OnSaveAs): Call table_to_dbf
7187     or table_to_csv depending on file selection.
7188    
7189     * test/test_dbf_table.py:
7190     Test table_to_dbf (extension of former part of test).
7191    
7192     * test/test_csv_table.py:
7193     Test table_to_csv.
7194    
7195 jan 1021 2003-05-23 Jan-Oliver Wagner <[email protected]>
7196    
7197 jan 1024 * Thuban/UI/join.py (JoinDialog.OnJoin): Use _() for strings.
7198     Use QueryTableFrame instead of TableFrame.
7199 jan 1021
7200 jan 1024 * Thuban/UI/mainwindow.py (MainWindow.LayerShowTable): Prefix the
7201     table window with 'Layer Table:' instead of 'Table:'.
7202    
7203     2003-05-23 Jan-Oliver Wagner <[email protected]>
7204    
7205     Give all tables a title via mix-in TitledObject.LayerShowTable
7206    
7207 jan 1021 * Thuban/Model/base.py (TitledObject.SetTitle): Call method 'issue'
7208     only if it exists.
7209    
7210     * Thuban/Model/table.py (DBFTable, MemoryTable): mix-in TitledObject
7211     and call its init-method with a default title. Remove Title() method.
7212    
7213     * Thuban/Model/transientdb.py (TransientTable, TransientJoinedTable,
7214     AutoTransientTable): mix-in TitledObject and call its init-method with
7215     a default title. Remove Title() method.
7216    
7217 bh 1017 2003-05-23 Bernhard Herzog <[email protected]>
7218    
7219     * Thuban/Model/session.py (Session.AddShapeStore): Define
7220     AddShapeStore analogously to AddTable.
7221    
7222     * test/test_session.py (TestSessionSimple.test_add_shapestore):
7223     New. Test for AddShapeStore
7224    
7225 jan 1015 2003-05-23 Jan-Oliver Wagner <[email protected]>
7226    
7227     Introducing QueryTableFrame and a very coarse ShowTable implementation.
7228    
7229     * Thuban/UI/tableview.py (LayerTableFrame, QueryTableFrame): Split the
7230     class LayerTableFrame into two classes, LayerTableFrame and QueryTableFrame.
7231     The latter implements the selection GUI without dependency on a layer.
7232     LayerTableFrame now is derived from QueryTableFrame and connects
7233     to a layer.
7234    
7235     * Thuban/UI/mainwindow.py (MainWindow.TableShow): A very coarse
7236     implementation that still needs work.
7237    
7238     * Thuban/Model/layer.py (Layer.TreeInfo): Added filename.
7239    
7240 frank 1011 2003-05-22 Frank Koormann <[email protected]>
7241    
7242     * Thuban/Model/transientdb.py (TransientJoinedTable.__init__):
7243     Added "outer_join = False" as optional parameter.
7244     (TransientJoinedTable.create): If outer join is true, perform a
7245     "LEFT OUTER JOIN" instead of "JOIN", which preserves all records of
7246     the left table. Records not matching are filled with 0 / None.
7247    
7248     * Thuban/UI/join.py (JoinDialog.__init__): Checkbox for outer join.
7249     (JoinDialog.OnJoin): Consider outer join check box.
7250    
7251 bh 1006 2003-05-22 Bernhard Herzog <[email protected]>
7252    
7253 bh 1008 * Thuban/UI/join.py (JoinDialog.OnJoin): Use exc_info in a
7254     somewhat safer way. Storing the traceback in a local variable can
7255     lead to memory leaks
7256    
7257     2003-05-22 Bernhard Herzog <[email protected]>
7258    
7259 bh 1006 * Thuban/UI/join.py (JoinDialog.OnJoin): Make sure to really call
7260     the wxMessageDialog's Destroy() method.
7261    
7262 frank 1004 2003-05-22 Frank Koormann <[email protected]>
7263    
7264     * Thuban/UI/join.py (JoinDialog.__init__): Make use of
7265     TransientTable.Title()
7266    
7267     2003-05-22 Frank Koormann <[email protected]>
7268    
7269     Join Dialog, initial version.
7270    
7271     * Thuban/UI/mainwindow.py (MainWindow.TableJoin): Removed print.
7272    
7273     * Thuban/UI/join.py (JoinDialog): Functional implementation of
7274     former framework. Renamed Table1/Table2 to LeftTable/RightTable
7275     in all occurences.
7276    
7277     * Thuban/Model/transientdb.py (TransientJoinedTable.__doc__):
7278     Typo fixed.
7279    
7280 bh 995 2003-05-22 Bernhard Herzog <[email protected]>
7281    
7282 bh 999 Give the tables titles so that the GUI can display more meaningful
7283     names. For now the titles are fixed but depend on e.g. filenames
7284     or the titles of the joined tables.
7285    
7286     * Thuban/Model/transientdb.py (TransientTable.Title)
7287     (TransientJoinedTable.Title, AutoTransientTable.Title): New.
7288    
7289     * Thuban/Model/table.py (DBFTable.Title, MemoryTable.Title): New.
7290    
7291     * test/test_transientdb.py
7292     (TestTransientTable.test_auto_transient_table_title): New. Test
7293     for the Title method
7294     (TestTransientTable.test_transient_joined_table)
7295     (TestTransientTable.test_transient_table): Add test for the Title
7296     methods
7297    
7298     * test/test_memory_table.py (TestMemoryTable.test_title): New.
7299     Test for the Title method
7300    
7301     * test/test_dbf_table.py (TestDBFTable.test_title): New. Test for
7302     the Title method
7303    
7304     2003-05-22 Bernhard Herzog <[email protected]>
7305    
7306 bh 997 * test/test_layer.py (TestLayer.setUp, TestLayer.tearDown):
7307     Provide a better way to destroy the layers
7308     (TestLayer.test_base_layer, TestLayer.test_arc_layer)
7309     (TestLayer.test_point_layer, TestLayer.test_empty_layer)
7310     (TestLayer.test_polygon_layer, TestLayer.test_get_field_type): Use
7311     the new way to destroy the layers.
7312     (TestLayer.test_derived_store): New. Test for using a layer with a
7313     DerivedShapeStore
7314    
7315     * Thuban/Model/layer.py (Layer.SetShapeStore): Only set the
7316     filename if the shape store actually has one.
7317    
7318     2003-05-22 Bernhard Herzog <[email protected]>
7319    
7320 bh 995 * Thuban/Model/table.py (DBFTable.FileName): New. Accessor method
7321     for the filename
7322    
7323     * test/test_dbf_table.py (TestDBFTable.test_filename): New. Test
7324     for the FileName method
7325     (TestDBFTableWriting.test_write): Fix spelling of filename
7326    
7327 tkoester 993 2003-05-22 Thomas Koester <[email protected]>
7328    
7329     * Thuban/Model/range.py, test/test_range.py: Brought over new Range
7330     from SciParam that now really is immutable.
7331    
7332 frank 992 2003-05-22 Frank Koormann <[email protected]>
7333    
7334     Layer Top/Bottom placement added to legend.
7335    
7336     * Thuban/UI/legend.py
7337     (LegendPanel._OnMoveTop(), LayerPanel._OnMoveBottom): New, methods
7338     bound to tool events.
7339     (LegendTree.MoveCurrentItemTop(), LegendTree.MoveCurrentItemBottom):
7340     New, methods binding the event methods with the map methods.
7341    
7342     * Thuban/Model/map.py (Map.TopLayer(), Map.BottomLayer()): New, place
7343     layer at top/bottom of layer stack.
7344    
7345     * Resources/Bitmaps/top_layer.xpm: New button icon.
7346    
7347     * Resources/Bitmaps/bottom_layer.xpm: New button icon.
7348    
7349 bh 988 2003-05-22 Bernhard Herzog <[email protected]>
7350    
7351     * Thuban/Model/session.py (Session.RemoveTable): New method to
7352     remove tables
7353    
7354     * test/test_session.py (TestSessionSimple.test_remove_table): New.
7355     Test for RemoveTable
7356    
7357 tkoester 986 2003-05-22 Thomas Koester <[email protected]>
7358    
7359     * Thuban/Model/classgen.py: Added short module doc string and CVS id.
7360     (ClassGenerator.GenUniformDistribution): Use new Range __init__, too.
7361    
7362 bh 983 2003-05-22 Bernhard Herzog <[email protected]>
7363    
7364 bh 985 Implement a way to discover dependencies between tables and
7365     shapestores.
7366    
7367     * Thuban/Model/transientdb.py (TransientTableBase.Dependencies)
7368     (TransientJoinedTable.Dependencies)
7369     (AutoTransientTable.SimpleQuery): New. Implement the dependencies
7370     interface
7371     (TransientJoinedTable.__init__): Keep tack of the original table
7372     objects in addition to the corresponding transient tables.
7373    
7374     * Thuban/Model/table.py (DBFTable.Dependencies)
7375     (MemoryTable.Dependencies): New. Implement the dependencies
7376     interface
7377    
7378     * Thuban/Model/data.py (ShapeTable): New. Helper class for
7379     ShapefileStore
7380     (ShapefileStore.__init__): Use ShapeTable instead of
7381     AutoTransientTable
7382     (ShapefileStore.Table, ShapefileStore.Shapefile): Add doc-strings
7383     (ShapefileStore.FileName, ShapefileStore.FileType): New. Accessor
7384     methods for filename and type
7385     (ShapefileStore.Dependencies): New. Implement the dependencies
7386     interface
7387     (DerivedShapeStore): New class to replace SimpleStore. The main
7388     difference to SimpleStore is that it depends not on a shapefile
7389     but another shapestore which expresses the dependencies a bit
7390     better
7391     (SimpleStore.__init__): Add deprecation warning.
7392    
7393     * test/test_dbf_table.py (TestDBFTable.test_dependencies): New.
7394     Test for the Dependencies method.
7395    
7396     * test/test_memory_table.py (TestMemoryTable.test_dependencies):
7397     New. Test for the Dependencies method.
7398    
7399     * test/test_transientdb.py
7400     (TestTransientTable.test_auto_transient_table_dependencies): New.
7401     Test for the Dependencies method.
7402     (TestTransientTable.test_transient_joined_table): Add test for the
7403     Dependencies method.
7404    
7405     * test/test_session.py (TestSessionSimple.setUp)
7406     (TestSessionSimple.tearDown): New. Implement a better way to
7407     destroy the sessions.
7408     (TestSessionSimple.test_initial_state)
7409     (TestSessionSimple.test_add_table): Bind session to self.session
7410     so that it's destroyed by tearDown
7411     (TestSessionSimple.test_open_shapefile): New. Test for
7412     OpenShapefile and the object it returns
7413    
7414     2003-05-22 Bernhard Herzog <[email protected]>
7415    
7416 bh 983 * Thuban/Model/session.py (Session.AddTable): New method to
7417     register tables with the session.
7418     (Session.Tables): Return the tables registered with AddTable too.
7419    
7420     * test/test_session.py (TestSessionSimple.test_add_table): New.
7421     Test case for the AddTable method
7422    
7423 frank 981 2003-05-22 Frank Koormann <[email protected]>
7424    
7425     UI polishing updates: Place main buttons (OK, Cancel, etc) in the
7426     lower right corner, center labels for selections, initialize controls
7427     in reasonable order for keyboard navigation.
7428    
7429     * Thuban/UI/projdialog.py (ProjFrame.__init__, ProjFrame.__doLayout)
7430     (ProjFrame.__DoOnProjAvail): Determine position of current projection
7431     using the wxListBox.FindString() method. Still a problem (#1886)
7432    
7433     * Thuban/UI/classifier.py
7434     (Classifier.__init__, SelectPropertiesDialog.__init__)
7435    
7436     * Thuban/UI/classgen.py (ClassGenDialog.__init__,
7437     (ClassGenDialog.__DoOnGenTypeSelect): Moved initialization of the
7438     different classification types from here to __init__.
7439     (GenUniquePanel.__init__): Set the column width of the first field
7440     in the Field ListCtrl to the full width.
7441    
7442     * Thuban/UI/tableview.py (LayerTableFrame.__init__): Rename 'Save As'
7443     Button to 'Export'. Center Buttons in Selection Box, set Focus to
7444     Grid.
7445     (LayerTableFrame.OnKeyDown()): New, bound to the grid with EVT_KEY_DOWN,
7446     changes focus to the Selection when pressing "Alt-S".
7447    
7448     * Thuban/UI/legend.py (LegendTree.__SetVisibilityStyle): Only gray out
7449     the text if not visible. The italic font sometimes exceeds the
7450     rendering area.
7451    
7452 jonathan 972 2003-05-21 Jonathan Coles <[email protected]>
7453 jonathan 971
7454 jonathan 975 * Thuban/UI/dock.py (DockFrame): Rename references to _OnClose
7455     to OnClose so that Thuban closes correctly.
7456    
7457     * Thuban/UI/mainwindow.py (MainWindow.OnClose): Call
7458     DockFrame.OnClose, not DockFrame._OnClose.
7459    
7460     2003-05-21 Jonathan Coles <[email protected]>
7461    
7462 jonathan 971 * Thuban/Model/classgen.py (ClassGenerator.GenQuantiles): Remove
7463     references to 'inf' and use new Range __init__ to pass floats
7464     directly rather than converting them to strings first.
7465     Fixes RTBug #1876.
7466    
7467     * Thuban/Model/classification.py (ClassGroupRange.SetRange):
7468     Use new Range ___init__ to pass floats.
7469    
7470     * Thuban/Model/layer.py (RasterLayer.__init__): Test if the
7471     filename is a valid image file. Throw IOError otherwise.
7472    
7473     * Thuban/Model/range.py: Brought over new Range from SciParam that
7474     is immutable and has an __init__ which can accept floats.
7475    
7476     * Thuban/UI/mainwindow.py (MainWindow.AddLayer): Move OpenShapefile
7477     into try block. AddLayer doesn't throw any exceptions anymore.
7478     (MainWindow.AddRasterLayer): Move constructor of RasterLayer into
7479     try block.
7480    
7481     * Thuban/UI/projdialog.py (GeoPanel.__init__): Put Degrees as
7482     the first item in choices. Fixes RTBug #1882.
7483    
7484     * Thuban/UI/renderer.py (MapRenderer.render_map): Check if scale
7485     has gone to 0 which is a serious problem. abort.
7486     (MapRenderer.draw_raster_layer): Catch IOError seperately and
7487     print the error from GDAL.
7488    
7489     * Thuban/UI/tableview.py (TableGrid.__init__): Call
7490     ToggleEventListeners to turn on listening.
7491     (TableGrid.ToggleEventListeners): New. Turns event listening on
7492     and off so as to prevent excessive messages.
7493     (LayerTableFrame.OnQuery): Use TableGrid.ToggleEventListeners
7494     to suppress excessive messages when selecting many rows.
7495     Fixes RTBug #1880.
7496    
7497     * Thuban/UI/view.py: Added checks against if scale == 0. This
7498     is a serious problem that can occur when an image without
7499     geo data is loading and causes the map projection bounds to
7500     go to infinity. Right now, the solution is to simply try
7501     to recover.
7502    
7503     * extensions/thuban/cpl_mfile.cpp (MFILEClose): Make sure
7504     to set the MFILEReceiver attributes even if the data is NULL.
7505    
7506     * extensions/thuban/gdalwarp.cpp: Improved the error handling
7507     and passed GDAL messages back up to the Python layer. Also
7508     tried to fix some memory leaks that were present in the original
7509     utility but didn't matter because the program aborted.
7510    
7511     * test/test_range.py: Copied over tests from SciParam. Removed
7512     tests against importing. Fixes RTBug #1867.
7513    
7514 bh 958 2003-05-21 Bernhard Herzog <[email protected]>
7515    
7516     * test/test_load.py: Remove unused imports and restructure the
7517     test code
7518     (LoadSessionTest): Split into one class for each test and turn
7519     LoadSessionTest itself into the base class for all such session
7520     tests.
7521     (ClassificationTest): New base class for load tests that test
7522     classifications
7523     (TestSingleLayer, TestLayerVisibility, TestClassification)
7524     (TestLabels, TestLayerProjection, TestRasterLayer): New classes
7525     for the individual tests
7526    
7527     * test/support.py (FileLoadTestCase.filename): New base class for
7528     file loading tests
7529    
7530 jan 955 2003-05-21 Jan-Oliver Wagner <[email protected]>
7531    
7532     * Resources/Projections/defaults.proj: Renamed 'Universal Transverse
7533     Mercator' to 'UTM Zone 32' as a more convenient example.
7534     Added 'Gauss Krueger Zone 6'.
7535    
7536     * Data/iceland_sample_raster.thuban: political polygon now
7537     filled transparent to have the raster image visible at once.
7538    
7539 frank 952 2003-05-21 Frank Koormann <[email protected]>
7540    
7541     * Thuban/UI/mainwindow.py (MainWindow): Renamed _OnClose() back to
7542     OnClose() to keep in sync with extensions. Internally Thuban
7543     still uses "underscored" names.
7544    
7545 jonathan 949 2003-05-20 Jonathan Coles <[email protected]>
7546    
7547     This puts back Raster layer support. These layers support projections
7548     through the GDAL library. Currently, the CVS version is being used.
7549     There are no Debian packages available although this may change soon.
7550     A GDAL driver was extended to support writing to memory rather to
7551     files.
7552    
7553     There is still some work that needs to be done, such as some error
7554     handling when loading invalid images or when there is a problem
7555     projecting the image. This putback simply checks in the majority
7556     of the work.
7557    
7558     * setup.py: Add gdalwarp library extension.
7559    
7560     * Thuban/Model/layer.py (BaseLayer.HasClassification): New.
7561     Defaults to False, but can be overridden by subclasses if they
7562     support classification.
7563     (RasterLayer): New. Defines a new layer that represents an
7564     image.
7565    
7566     * Thuban/Model/load.py (SessionLoader.__init__): Add rasterlayer
7567     tag handler.
7568     (SessionLoader.start_layer): Encode the filename.
7569     (SessionLoader.start_rasterlayer, SessionLoader.end_rasterlayer):
7570     New. Supports reading a rasterlayer tag.
7571    
7572     * Thuban/Model/map.py (Map.BoundingBox): Fix typo in comment.
7573    
7574     * Thuban/Model/save.py (XMLWriter.encode): Don't assume that we
7575     get a string in Latin1. If we get such as string convert it to
7576     unicode first, otherwise leave if alone before encoding.
7577     (SessionSaver.write_layer): Add support for writing both Layers
7578     and RasterLayers.
7579    
7580     * Thuban/Model/transientdb.py (AutoTransientTable.SimpleQuery):
7581     The right argument may not be a string, it could also be a Column.
7582    
7583     * Thuban/UI/application.py (ThubanApplication.CreateMainWindow):
7584     Make initial window size 600x400. Fixes RTBug #1872.
7585    
7586     * Thuban/UI/classifier.py (Classifier.__init__): Rearrange how
7587     the dialog is constructed so that we can support layers that
7588     do not have classifications.
7589     (Classifier._OnTry): Only build a classification if the layer
7590     supports one.
7591    
7592     * Thuban/UI/legend.py: Change all checks that a layer is an
7593     instance of Layer into checks against BaseLayer.
7594     (LegendTree.__FillTreeLayer): Only add children to a branch if
7595     the layer supports classification.
7596    
7597     * Thuban/UI/mainwindow.py (MainWindow.NewSession,
7598     MainWindow.OpenSession): Don't proceed with an action if the
7599     user chooses Cancel when they are asked to save changes.
7600     (MainWindow.AddRasterLayer): New. Open a dialog to allow the
7601     user to select an image file. Create a new RasterLayer and add
7602     it to the map.
7603    
7604     * Thuban/UI/renderer.py (MapRenderer.render_map): Add support
7605     for rendering RasterLayer layers.
7606     (MapRenderer.draw_raster_layer): Actually method that calls
7607     the GDALWarp python wrapper and constructs an image from the
7608     data returned.
7609    
7610     * Thuban/UI/tableview.py (LayerTableFrame.__init__): Change the
7611     Choices symbols to match those used in the table query method.
7612     Replace deprecated method calls on table with new method names.
7613    
7614     * Thuban/UI/view.py (MapCanvas.set_view_transform): Try to limit
7615     how small the scale can get. This still needs more testing.
7616    
7617     * extensions/thuban/bmpdataset.cpp: New, but copied from GDAL.
7618     Provides a driver to output in .bmp format.
7619    
7620     * extensions/thuban/cpl_mfile.cpp, extensions/thuban/cpl_mfile.h:
7621     New. Provides IO routines which write to memory, rather than a file.
7622    
7623     * extensions/thuban/gdalwarp.cpp: New, but basically a direct copy
7624     of the gdalwarp utility provided in GDAL. Added function calls
7625     that can be accessed from python.
7626    
7627     * Data/iceland_sample_raster.thuban: New. Sample file that uses
7628     a raster layer.
7629    
7630     * Data/iceland/island.tfw, Data/iceland/island.tif: New. Raster
7631     layer image data.
7632    
7633     * Doc/thuban.dtd: Added rasterlayer attribute definition.
7634    
7635     * test/test_layer.py, test/test_load.py, test/test_save.py: Added
7636     tests associated with the raster layer code.
7637    
7638     * test/test_transientdb.py
7639     (TestTransientTable.test_auto_transient_table_query): Added a test
7640     for using a Column object as the "right" parameter to a query.
7641    
7642 frank 924 2003-05-19 Frank Koormann <[email protected]>
7643    
7644 frank 927 * Thuban/version.py (get_changelog_date):
7645     Catch exceptions if ChangeLog does not exist.
7646    
7647     * Thuban/UI/view.py (MapCanvas.Export): Bugfix
7648    
7649     2003-05-19 Frank Koormann <[email protected]>
7650    
7651 frank 924 Extended version information for Thuban
7652    
7653     * Thuban/version.py: New, version information for Thuban: Last
7654     modification date and last ChangeLog entry date.
7655    
7656     * Thuban/UI/mainwindow.py (MainWindow.About()): Extended version
7657     information: Display Thuban, wxPython and Python version.
7658    
7659 bh 919 2003-05-16 Bernhard Herzog <[email protected]>
7660    
7661 bh 921 * Thuban/Model/save.py: Remove some unused imports including the
7662     __future__ import for nested_scopes as Thuban relies on Python 2.2
7663     now.
7664     (XMLWriter.encode): Remove the special case for a None argument.
7665     In the saver encode is always called with a string argument.
7666    
7667     2003-05-16 Bernhard Herzog <[email protected]>
7668    
7669 bh 919 * Thuban/UI/__init__.py: Remove the work-around for the locale bug
7670     in wxPython (at least when usinvg wxGTK) prior to 2.4. The symptom
7671     of the bug was that e.g. float("1.2") would fail. Thuban now
7672     requires 2.4.x.
7673    
7674 frank 917 2003-05-16 Frank Koormann <[email protected]>
7675    
7676     Printing enhancement and WMF export (under Win32)
7677    
7678     * Thuban/UI/renderer.py (ExportRenderer): New, derived from
7679     ScreenRenderer. Renders Map, Legend and Scalebar for export.
7680     (PrinterRenderer): New, derived from ExportRenderer. Replaces the old
7681     PrintRender.
7682    
7683     * Thuban/UI/view.py (MapPrintout.__init__): Enhanced parameter set
7684     to fullfil information needed for PrinterRenderer.
7685     (MapCanvas.Export): New. Export Map (currently only to WMF on Win32).
7686     (MapCanvas.Print): Adapted to new MapPrintout.
7687     (OutputTransform): General calculations to transform from canvas
7688     coordinates to export/printing devices.
7689    
7690     * Thuban/UI/mainwindow.py (MainWindow.ExportMap()): New. Added also
7691     new method_command to call ExportMap, with platform dependency (only
7692     __WXMSW__)
7693    
7694     * Thuban/UI/scalebar.py (ScaleBar.DrawScaleBar): Position and Size
7695     of scalebar drawing area as new parameters.
7696    
7697     * Thuban/Model/scalebar.py (roundInterval): round long instead of int
7698    
7699     * Thuban/UI/legend.py (ScalebarBitmap.__SetScale):
7700     Update to extended scalebar.DrawScalebar header.
7701    
7702     * test/test_export.py: New, test Thuban.UI.view.OutputTransform()
7703    
7704     * test/test_scalebar.py: Made test executable as standalone.
7705    
7706 bh 908 2003-05-16 Bernhard Herzog <[email protected]>
7707    
7708     * Thuban/Model/table.py (Table): Remove this compatibility alias
7709     for DBFTable.
7710    
7711     * test/test_table.py: Import DBFTable as Table because that alias
7712     doesn't exist anymore.
7713    
7714     * Thuban/UI/classgen.py: Remove some unused imports
7715    
7716 jonathan 906 2003-05-14 Jonathan Coles <[email protected]>
7717    
7718     * Thuban/Model/classgen.py (ClassGenerator.GenSingletonsFromList):
7719     Fix docstring.
7720     (ClassGenerator.GenUniformDistribution): Fix spelling of method name.
7721     (ClassGenerator.GenQuantiles): Use the left/right brackets and min/max
7722     values of the supplied range to determine the beginning and end
7723     bounds of the generated classes.
7724    
7725     * Thuban/Model/range.py (Range.number_re): Now accepts floats that
7726     do not have a leading 0 (.5 is now accepted as well as 0.5).
7727    
7728     * Thuban/UI/classgen.py (ClassGenDialog.OnOK): Fix name of method
7729     call to ClassGenerator.GenUniformDistribution.
7730    
7731     * Thuban/UI/projdialog.py (ProjFrame.__do_layout): Fix Windows
7732     layout bug with the 'Projection' label.
7733    
7734     * test/support.py (FloatTestCase): New. Needed for the Range tests.
7735    
7736     * test/test_range.py: New. Imported from SciParam.
7737    
7738 jonathan 897 2003-05-12 Jonathan Coles <[email protected]>
7739    
7740 jonathan 899 * Thuban/UI/classgen.py (GenQuantilesPanel.GetList): Replace call
7741     to table.UniqueValues() with calls that retrieve all the values
7742     from the table. This will need to be replaced by a method on table
7743     which can simply return the list (perhaps more efficiently).
7744    
7745     2003-05-12 Jonathan Coles <[email protected]>
7746    
7747 jonathan 897 The return value of ClassGenerator.CalculateQuantiles has changed.
7748     Refer to the documentation for details.
7749    
7750     * test/test_classgen.py: Modified Quantile tests to use the
7751     new return values.
7752    
7753     * Thuban/Model/classgen.py
7754     (ClassGenerator.GenQuantiles): Add comments describing the parameters,
7755     use new return values from CalculateQuantiles to produce the correct
7756     range bounds in the Classification.
7757     (ClassGenerator.CalculateQuantiles): Add more comments describing
7758     the return values and parameters. Make minor adjustments to improve
7759     the legibility of the code. Fix problem with adjusted not being set
7760     in most cases.
7761    
7762 frank 893 2003-05-12 Frank Koormann <[email protected]>
7763    
7764     * Thuban/Model/save.py (XMLWriter.encode()): Explicite call to unicode
7765     and latin1. Fixes #1851 finally.
7766    
7767 jonathan 889 2003-05-09 Jonathan Coles <[email protected]>
7768    
7769 jonathan 897 * test/test_classgen.py: New. Tests the Quantile algorithm.
7770    
7771     * Thuban/Model/classgen.py (ClassGenerator.CalculateQuantiles):
7772     Clean up debugging statement, add comments, fix a small bug in the
7773     returned adjusted percentiles.
7774    
7775     2003-05-09 Jonathan Coles <[email protected]>
7776    
7777 jonathan 889 Introduces Range class from SciParam into the ClassGroupRange class,
7778     and such ranges can now be saved and loaded from disk.
7779    
7780     Quantiles are now available in the Classification Generator.
7781    
7782     Initial support for building Queries on a table. Doesn't do anything
7783     but run some tests.
7784    
7785     * Thuban/Model/classification.py: Explicit imports.
7786     (ClassGroupRange): Use the Range class to store the underlying
7787     range information. The interface remains the same, except for
7788     GetRange(), and you can also supply a Range object as the min
7789     parameter to SetRange or __init__.
7790    
7791     * Thuban/Model/load.py (XMLReader.encode): New. Encodes the given
7792     string appropriately for use in Thuban. Fixes RTbug #1851.
7793     (SessionLoader.end_projection): Handle the context of the
7794     projection tag a bit better by looking at what objects are not
7795     None. There was an assumption that a projection tag for a map
7796     could occur before any layers.
7797     (SessionLoader.start_clrange): Provide backward compatibility for
7798     reading min/max values as well as the new range parameter.
7799    
7800     * Thuban/Model/map.py: Explicit imports.
7801    
7802     * Thuban/Model/resource.py: Import _.
7803     (ProjFileSaver.write): write header using projfile.dtd.
7804    
7805     * Thuban/Model/save.py: Explicit imports.
7806     (XMLWriter.encode): New. Encode the given string from a format
7807     used by Thuban into UTF-8. Fixes RTbug #1851.
7808    
7809     * Thuban/UI/classgen.py: Explicit imports.
7810     (ClassGenDialog.__init__): Clean up the code and add support
7811     for Quantiles.
7812     (ClassGenDialog.OnOK): Add support for Quantiles.
7813     (GenQuantilesPanel): New. Input panel for Quantiles.
7814     (ClassGenerator, CustomRamp, MonochromaticRamp, GreyRamp, RedRamp,
7815     GreenRamp, BlueRamp, HotToColdRamp): Move to Thuban/Model/classgen.py
7816    
7817     * Thuban/Model/classgen.py: New. Contains all the classes named above.
7818    
7819     * Thuban/UI/classifier.py: Explicit imports.
7820     (ClassTable.GetValueAsCust, ClassTable.__ParseInput,
7821     ClassTable.SetValueAsCustom): Reworked to use new Range class.
7822    
7823     * Thuban/UI/legend.py: Explicit imports.
7824    
7825     * Thuban/UI/mainwindow.py: Add support for the Join Dialog. Added
7826     a Table menu and associated method calls.
7827     (MainWindow.choose_color): Removed. No longer needed.
7828    
7829     * Thuban/UI/projdialog.py (ProjFrame.__VerifyButtons): Save button
7830     should be disabled if no projection is selected in the available
7831     list.
7832    
7833     * Thuban/UI/renderer.py: Explicit imports.
7834    
7835     * Thuban/UI/tableview.py (TableGrid.OnRangeSelect): Fix some issues
7836     with correctly selecting the rows and issuing the right events.
7837     Be sure to call Skip() to allow the grid to do some of its own
7838     handling which allows the rows to actually be selected.
7839     (LayerTableGrid.select_shapes): Rename from select_shape. Supports
7840     selecting multiple shapes.
7841     (LayerTableFrame): Support for building Queries.
7842     (LayerTableFrame.select_shapes): Allow multiple shapes to be selected.
7843    
7844     * Thuban/UI/tree.py: Explicit imports.
7845    
7846     * Thuban/UI/view.py (MapCanvas): Delegate "SelectedShapes" so the
7847     table view can call it.
7848    
7849     * test/test_classification.py: Explicit imports.
7850     (TestClassification.test_ClassGroupRange): Fix test for new
7851     Range class.
7852    
7853     * Doc/thuban.dtd: Add range parameter for clrange.
7854    
7855     * Thuban/Model/range.py: Taken from SciParam. Used as the underlying
7856     object in ClassGroupRange, and also uesd for inputting ranges in
7857     the classifer table and elsewhere.
7858    
7859     * Thuban/UI/join.py: New. Initial Join dialog. No real functionality
7860     yet.
7861    
7862 frank 872 2003-05-09 Frank Koormann <[email protected]>
7863    
7864     * Thuban/UI/scalebar.py (DrawScaleBar): Draw only if interval > 0.0.
7865    
7866 frank 860 2003-05-08 Frank Koormann <[email protected]>
7867    
7868 frank 870 Coding style updates
7869    
7870     * test/test_scalebar.py: Replaced tab indentation by spaces.
7871    
7872     * Thuban/UI/scalebar.py: Explicit imports.
7873    
7874     2003-05-08 Frank Koormann <[email protected]>
7875    
7876 frank 867 * Thuban/UI/scalebar.py
7877     (ScaleBar.DrawScalebar): Format string bug fixed.
7878    
7879     2003-05-08 Frank Koormann <[email protected]>
7880    
7881 frank 865 Reorganization of scalebar component (no wx in Thuban/Model)
7882    
7883     * Thuban/Model/scalebar.py: Rendering moved to Thuban/UI/scalebar.py
7884     (deriveInterval):
7885     Calculate scalebar interval and unit which fits in width for scale.
7886     (roundInterval): Round float.
7887    
7888     * Thuban/UI/scalebar.py (ScaleBar): Scalebar rendering
7889    
7890     * test/test_scalebar.py: Test for Thuban/Model/scalebar.py methods.
7891    
7892     * Thuban/UI/legend.py: Import Thuban.UI.scalebar
7893    
7894     2003-05-08 Frank Koormann <[email protected]>
7895    
7896 frank 860 * Thuban/UI/legend.py (ScalebarBitmap.SetCanvas):
7897     Initialize ScaleBar with canvas.map
7898    
7899     * Thuban/Model/scalebar.py (ScaleBar.roundInterval()): New,
7900     round intervals to display smarter lengths
7901     (ScaleBar.DrawScalebar): Draw Scalebar only if the map contains a
7902     layer. If the maps has no projection applied grey the scalebar.
7903    
7904 frank 857 2003-05-07 Frank Koormann <[email protected]>
7905    
7906     Basic Scalebar features added.
7907    
7908     * Thuban/Model/scalebar.py (ScaleBar): New, scalebar rendering.
7909    
7910     * Thuban/UI/legend.py (LegendPanel): Added scalebar bitmap
7911     (ScaleBarBitmap): New, links the scalebar bitmap with view messages
7912     and the renderer.
7913    
7914     * Thuban/UI/view.py (MapCanvas.set_view_transform): Issue SCALE_CHANGED.
7915    
7916     * Thuban/UI/messages.py: SCALE_CHANGED added.
7917    
7918 bh 850 2003-05-07 Bernhard Herzog <[email protected]>
7919    
7920 bh 852 * Thuban/Model/session.py (Session.__init__): New instance
7921     variable shapestores to hold a list of all open shapestore objects
7922     (Session.ShapeStores): New. Accessor method for the shapestores
7923     list.
7924     (Session._add_shapestore, Session._clean_weak_store_refs): New.
7925     Internal methods to maintain the shapestores list.
7926     (Session.Tables): New. Return all tables open in the session.
7927     (Session.OpenShapefile): Insert the new ShapeStore into the
7928     shapestores list.
7929    
7930     * test/test_session.py (TestSessionSimple.test_initial_state): Add
7931     tests for ShapeStores and Tables
7932     (TestSessionWithContent.test_shape_stores)
7933     (TestSessionWithContent.test_tables): New. Test cases for
7934     ShapeStores and Tables
7935    
7936     2003-05-07 Bernhard Herzog <[email protected]>
7937    
7938 bh 850 * Thuban/Model/transientdb.py (TransientTableBase.ReadRowAsDict):
7939     Add comments about the optimizations used.
7940     (AutoTransientTable.ReadValue, TransientTableBase.ReadValue): New.
7941     Implement the ReadValue table interface method.
7942    
7943     * test/test_transientdb.py
7944     (TestTransientTable.run_iceland_political_tests)
7945     (TestTransientTable.test_transient_joined_table): Add tests for
7946     ReadValue
7947    
7948 frank 848 2003-05-07 Frank Koormann <[email protected]>
7949    
7950     * Resources/Bitmaps/fulllayerextent.xpm,
7951     Resources/Bitmaps/fullselextent.xpm: Replaced the place holders with
7952     new icons.
7953    
7954 bh 840 2003-05-06 Bernhard Herzog <[email protected]>
7955    
7956 bh 846 * Thuban/Model/transientdb.py (AutoTransientTable.SimpleQuery):
7957     New. Simply delegate to the transient table's version.
7958    
7959     * test/test_transientdb.py
7960     (TestTransientTable.test_auto_transient_table_query): New. Test
7961     case for AutoTransientTable's SimpleQuery
7962    
7963     2003-05-06 Bernhard Herzog <[email protected]>
7964    
7965 bh 843 * Thuban/Model/transientdb.py (TransientTableBase.SimpleQuery):
7966     Implement a simple query method for the query dialog
7967     (TransientTableBase.create): Add an INTEGER PRIMARY KEY that holds
7968     the row index or shapeid.
7969     (TransientTable.create): Insert the right value of the row index
7970     (TransientJoinedTable.create): Copy the row index of the left
7971     table to the joined result table
7972    
7973     * test/test_transientdb.py
7974     (TestTransientTable.test_transient_table_read_twice): Fix
7975     doc-string
7976     (TestTransientTable.test_transient_table_query): New. Test for the
7977     SimpleQuery method
7978    
7979     2003-05-06 Bernhard Herzog <[email protected]>
7980    
7981 bh 840 Convert all table users to use the new table interface. This only
7982     covers Thuban itself, not GREAT-ER or other applications built on
7983     Thuban yet, so the compatibility interface stays in place for the
7984     time being but it now issues DeprecationWarnings.
7985    
7986     Finally, the new Table interface has a new method, HasColumn.
7987    
7988     * Thuban/Model/table.py (OldTableInterfaceMixin): All methods
7989     issue deprecation warnings when they're. The warnings refer to the
7990     caller of the method.
7991     (OldTableInterfaceMixin.__deprecation_warning): New. Helper method
7992     for the deprecation warnings
7993    
7994     * test/test_table.py: Ignore the deprecation warnings for the old
7995     table in the tests in this module. The purpose of the tests is to
7996     test the old interface, after all.
7997    
7998     * test/test_transientdb.py
7999     (TestTransientTable.run_iceland_political_tests): Use the
8000     constants for the types. Add a test for HasColumn
8001     (TestTransientTable.test_transient_joined_table): Adapt to new
8002     table interface. Add a test for HasColumn
8003     (TestTransientTable.test_transient_table_read_twice): Adapt to new
8004     table interface
8005    
8006     * Thuban/UI/tableview.py (DataTable.SetTable, DataTable.GetValue):
8007     Adapt to new table interface
8008    
8009     * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Adapt to
8010     new table interface
8011    
8012     * Thuban/UI/controls.py (RecordListCtrl.fill_list)
8013     (RecordTable.SetTable): Adapt to new table interface
8014    
8015     * Thuban/UI/classifier.py (Classifier.__init__)
8016     (Classifier.__init__): Adapt to new table interface
8017    
8018     * Thuban/UI/classgen.py (ClassGenDialog.__init__)
8019     (GenUniformPanel._OnRetrieve, GenUniquePanel._OnRetrieve): Adapt
8020     to new table interface
8021    
8022     * Thuban/Model/transientdb.py (TransientTableBase.HasColumn)
8023     (AutoTransientTable.HasColumn): Implement the new table interface
8024     method
8025     (AutoTransientTable.ReadRowAsDict, AutoTransientTable.ValueRange)
8026     (AutoTransientTable.UniqueValues): Adapt to new table interface
8027    
8028     * Thuban/Model/layer.py (Layer.SetShapeStore, Layer.GetFieldType):
8029     Adapt to new table interface
8030    
8031     * test/test_layer.py (TestLayer.open_shapefile): Helper method to
8032     simplify opening shapefiles a bit easier.
8033     (TestLayer.test_arc_layer, TestLayer.test_polygon_layer)
8034     (TestLayer.test_point_layer): Use the new helper method
8035     (TestLayer.test_get_field_type): New. Test for the GetFieldType
8036     method
8037    
8038     * test/test_dbf_table.py (TestDBFTable.test_has_column): Test for
8039     the new table method
8040    
8041     * test/test_memory_table.py (TestMemoryTable.test_has_column):
8042     Test for the new table method HasColumn
8043    
8044 jonathan 833 2003-05-06 Jonathan Coles <[email protected]>
8045    
8046     Addresses the "Selection Extent" wish of RTbug #1787.
8047    
8048     * Resources/Bitmaps/fulllayerextent.xpm,
8049     Resources/Bitmaps/fullselextent.xpm: Bitmaps for layer and selection
8050     extent. These are just place holders for the real bitmaps.
8051    
8052     * Thuban/Model/layer.py (Shape): Since a Shape is immutable only
8053     calculate the bounding box once (the first time compute_bbox() is
8054     called).
8055     (Layer.ShapesBoundingBox): New. Given a list of shape ids, return
8056     the bounding box for the shapes in lat/long coordinates.
8057    
8058     * Thuban/UI/mainwindow.py: Added new "Full selection extent" menu
8059     option.
8060     (MainWindow.has_selected_shapes): New. Returns true if there are
8061     any selected shapes.
8062     (MainWindow.FullSelectionExtent): New. Calls
8063     MapCanvas.FitSelectedToWindow() when the user selects the menu option.
8064     (_has_selected_shapes): New. Returns true if there are any
8065     selected shapes.
8066    
8067     * Thuban/UI/selection.py (Selection.HasSelectedShapes): New. Returns
8068     true if there are any selected shapes.
8069    
8070     * Thuban/UI/view.py (MapCanvas): Added delegated method
8071     HasSelectedShapes.
8072     (MapCanvas.FitSelectedToWindow): New. Centers and scales any selected
8073     shapes on the canvas using the map projection (if any).
8074    
8075     * test/test_layer.py (TestLayer.test_arc_layer): Add some tests
8076     for Layer.ShapesBoundingBox().
8077    
8078 bh 826 2003-05-06 Bernhard Herzog <[email protected]>
8079    
8080     * Resources/Projections/defaults.proj: Fix spelling of Mercator
8081    
8082 jonathan 823 2003-05-05 Jonathan Coles <[email protected]>
8083    
8084     Addresses the "Full Layer Extent" wish of RTbug #1787.
8085    
8086     * Resources/Projections/defaults.proj: Added UK National Grid.
8087    
8088     * Thuban/UI/mainwindow.py: Added new "Full layer extent" menu option.
8089     (MainWindow.FullLayerExtent): New. Calls MapCanvas.FitLayerToWindow()
8090     when the user selects the menu option.
8091    
8092     * Thuban/UI/view.py (MapCanvas.FitLayerToWindow): New. Centers and
8093     scales the given layer on the canvas using the map projection.
8094    
8095 bh 819 2003-05-05 Bernhard Herzog <[email protected]>
8096    
8097     Convert the table implementations to a new table interface. All
8098     tables use a common mixin class to provide backwards compatibility
8099     until all table users have been updated.
8100    
8101     * Thuban/Model/table.py (OldTableInterfaceMixin): Mixin class to
8102     provide backwards compatibility for table classes implementing the
8103     new interface
8104     (DBFTable, MemoryTable): Implement the new table interface. Use
8105     OldTableInterfaceMixin as base for compatibility
8106     (DBFColumn, MemoryColumn): New. Column description for DBFTable
8107     and MemoryTable resp.
8108    
8109     * test/test_dbf_table.py: New. Test cases for the DBFTable with
8110     the new table interface.
8111    
8112     * test/test_memory_table.py: New. Test cases for the MemoryTable
8113     with the new table interface.
8114    
8115     * test/test_table.py: Document the all tests in this file as only
8116     for backwards compatibility. The equivalent tests for the new
8117     interface are in test_memory_table.py and test_dbf_table.py
8118     (MemoryTableTest.test_read): field_info should be returning tuples
8119     with four items
8120     (MemoryTableTest.test_write): Make doc-string a more precise.
8121    
8122     * Thuban/Model/transientdb.py (TransientTableBase): Convert to new
8123     table interface. Derive from from OldTableInterfaceMixin for
8124     compatibility.
8125     (TransientTableBase.create): New intance variable column_map to
8126     map from names and indices to column objects
8127     (TransientTable.create): Use the new table interface of the input
8128     table
8129     (AutoTransientTable): Convert to new table interface. Derive from
8130     from OldTableInterfaceMixin for compatibility.
8131     (AutoTransientTable.write_record): Removed. It's not implemented
8132     yet and we still have to decide how to handle writing with the new
8133     table and data framework.
8134    
8135     * test/test_transientdb.py
8136     (TestTransientTable.run_iceland_political_tests)
8137     (TestTransientTable.test_transient_joined_table): Use the new
8138     table interface
8139    
8140 jonathan 817 2003-05-05 Jonathan Coles <[email protected]>
8141    
8142     This is namely a collection of UI updates to improve user interactivity.
8143     Tabbing between controls now exists and you can use ESC to close dialog
8144     boxes; ENTER will active the default button.
8145    
8146     * Thuban/UI/classgen.py (ClassGenDialog.__init__): Rearrange the
8147     order that the controls are created so that tabbing works correctly.
8148     (ClassGenDialog.OnOK): Renamed from _OnGenerate() so that the
8149     wxDialog can handle the default button correctly.
8150     (ClassGenDialog.OnCancel): Renamed from _OnCloseBtn() for the
8151     same reasons as for OnOK.
8152     (GenUniformPanel._OnRetrieve): Call wxBeginBusyCursor/wxEndBusyCursor
8153     when we ask the table for the maximum/minimum values of a field
8154     which could take a very long time.
8155    
8156     * Thuban/UI/classifier.py (Classifier.__init__): Rearrange the
8157     order that the controls are created so that tabbing works correctly.
8158     (SelectPropertiesDialog.__init__): Rearrange the order that the
8159     controls are created so that tabbing works correctly.
8160    
8161     * Thuban/UI/dialogs.py: Copied NonModalDialog box and changed it
8162     to derive from a wxDialog but behave like the original implementation
8163     which was derived from a wxFrame. wxDialog provides useful key
8164     handling functionality like ESC calling OnCancel and ENTER calling
8165     OnOK which is lost with wxFrame.
8166    
8167     * Thuban/UI/mainwindow.py: Add "..." to menu items that will open
8168     new dialogs.
8169    
8170     * Thuban/UI/projdialog.py (ProjFrame.__init__): Rearrange the
8171     order that the controls are created so that tabbing works correctly.
8172     (ProjFrame.OnApply): Renamed from _OnTry() to use wxDialog behaviour.
8173     (ProjFrame.OnOK): Renamed from _OnOK() to use wxDialog behaviour.
8174     (ProjFrame.OnCancel): Renamed from _OnClose() to use wxDialog behaviour.
8175     (ProjPanel.__init__): Add "Airy" to the list of ellipsoids so we
8176     can provide the "UK National Grid" as a default projection.
8177     (UTMPanel.__init__): Rearrange the order that the controls are
8178     created so that tabbing works correctly.
8179    
8180 bh 809 2003-05-05 Bernhard Herzog <[email protected]>
8181    
8182 bh 811 * extensions/thuban/wxproj.cpp: Fix some of the comments.
8183     (project_point): If a map projection but no layer projection is
8184     given, convert degrees to radians before applying the map
8185     projection.
8186    
8187 bh 809 * Thuban/UI/tableview.py (TableGrid.disallow_messages)
8188     (TableGrid.allow_messages): New methods to make it possible to
8189     inhibit message sending.
8190     (TableGrid.issue): Only send the message if not inhibited.
8191     (LayerTableGrid.select_shape): Use the new methods to make sure
8192     that no ROW_SELECTED message is sent while we're updating the
8193     selected rows to match the selected shapes.
8194    
8195 jan 807 2003-05-02 Jan-Oliver Wagner <[email protected]>
8196    
8197     Implementation of MemoryTable.
8198    
8199     * Thuban/Model/table.py (MemoryTable): New. Quite simple table
8200     implementation that operates on a list of tuples. All of the data
8201     are kept in the memory.
8202    
8203     * test/test_table.py (MemoryTableTest): New.
8204    
8205     * test/test_transientdb.py (SimpleTable): Removed.
8206     (TestTransientTable.test_transient_joined_table,
8207     (TestTransientTable.test_transient_table_read_twice): Replaced
8208     SimpleTable by MemoryTable.
8209    
8210 jonathan 793 2003-04-30 Jonathan Coles <[email protected]>
8211    
8212 jonathan 803 * Data/iceland_sample.thuban: Now contains correct projections
8213     for each of the layers.
8214    
8215     * Resources/Projections/defaults.proj: Geographic projection
8216     contains unit conversion parameter.
8217    
8218     2003-04-30 Jonathan Coles <[email protected]>
8219    
8220 jonathan 793 The most important part of this putback is the projection changes.
8221     It should now be possible to specify the projection that a layer
8222     is in and then specify a different projection for the map. The
8223     projection dialog has an extra parameter for a geographic projection
8224     which lets the user select if the input is in degrees or radians.
8225    
8226     * Thuban/Model/layer.py (Layer.ShapesInRegion): Fix docstring
8227     to say that the parameter is a tuple of unprojected
8228     points (which is what the callers to this method were assuming).
8229     Also, since the points are unprojected we need to projected them.
8230    
8231     * Thuban/UI/legend.py (LegendTree.MoveCurrentItemUp,
8232     LegendTree.MoveCurrentItemDown): If the layer or any of the layer's
8233     groups are selected, move the layer up/down. Fixes RTbug #1833.
8234    
8235     * Thuban/UI/mainwindow.py: Move menu item map_rename up.
8236    
8237     * Thuban/UI/projdialog.py (ProjFrame._OnSave): Add missing
8238     parameter in call to SetClientData.
8239     (GeoPanel): Add support for selecting the units that the
8240     source data is in (Radians or Degrees).
8241    
8242     * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Optimize
8243     the rendering loop by reducing the number of if's, removing the
8244     unnecessary try/except block, and checking if the old group
8245     is the same as the new one (which happens a lot if there is
8246     no classification, or lots of shapes are in the same group).
8247    
8248     * Thuban/UI/view.py (MapCanvas.OnPaint): Add a try/except block
8249     around the redraw routine to try to catch problems that the user
8250     may create by selecting invalid projections for the data set and
8251     map. Clears the display if there are any problems and prints the
8252     error.
8253     (MapCanvas.do_redraw): Use DC.Clear() instead of drawing a filled
8254     rectangle.
8255    
8256     * extensions/thuban/wxproj.cpp (project_point): First invert the
8257     supplied point (which should be in projected coordinates) using
8258     the layer's projection and then project the point using the
8259     map's projection.
8260     (project_points): Use project_point() to project each point.
8261    
8262 jan 792 2003-04-30 Jan-Oliver Wagner <[email protected]>
8263    
8264     * Thuban/Model/layer.py (Layer.SetShapeStore): Fixed a bug:
8265     don't set the Classification to None if the classfication field
8266     is None (ie only a DEFAULT).
8267    
8268 bh 786 2003-04-30 Bernhard Herzog <[email protected]>
8269    
8270 bh 790 * Thuban/UI/view.py: Fix some typos.
8271    
8272 bh 788 * Thuban/UI/mainwindow.py (MainWindow.identify_view_on_demand): Do
8273     not pop up the dialog if the selection becomes empty (this could
8274     happen if e.g. a new selection is opened while the identify tool
8275     is active and dialog had been closed)
8276    
8277     2003-04-30 Bernhard Herzog <[email protected]>
8278    
8279 bh 786 * Thuban/Model/transientdb.py (TransientTableBase.__init__): New
8280     instance variable read_record_last_result
8281     (TransientTableBase.read_record): Make sure reading the same
8282     record twice works. The implementation uses the new instance
8283     variable read_record_last_result
8284    
8285     * test/test_transientdb.py
8286     (TestTransientTable.test_transient_table_read_twice): New test
8287     case for the above bug-fix.
8288    
8289 jonathan 793 2003-04-29 Jonathan Coles <[email protected]>
8290    
8291     * Thuban/common.py: Removed. No longer needed Str2Num. RTbug #1832.
8292    
8293     * Thuban/UI/classgen.py: Remove all uses of Str2Num.
8294    
8295     * Thuban/UI/classifier.py: Remove all uses of Str2Num.
8296     (ClassTable.SetValueAsCustom): Rename keyword argument in
8297     ClassGroup* constructors to match argument name.
8298    
8299 bh 779 2003-04-29 Bernhard Herzog <[email protected]>
8300    
8301     * Thuban/Model/session.py (Session.Destroy): Explicitly close the
8302     transient DB if it exists to make sure it doesn't leave a journal
8303     file in the temp directory.
8304    
8305     * Thuban/Model/transientdb.py (TransientDatabase.close): Set
8306     self.conn to None after closing the connection to make sure it's
8307     not closed twice
8308    
8309 jonathan 767 2003-04-29 Jonathan Coles <[email protected]>
8310    
8311 jonathan 769 Add a visible parameter in the layer XML tag. The default value is
8312     "true". If anything other than "false" is specified we also assume
8313 jonathan 776 "true". Addresses RTbug #1025.
8314 jonathan 769
8315     * Doc/thuban.dtd: Add visible parameter to a layer.
8316    
8317     * Thuban/Model/layer.py (BaseLayer.__init__): Change default value
8318     of visible from 1 to True.
8319     (Layer.__init__): Change default value of visible from 1 to True.
8320    
8321     * Thuban/Model/load.py (SessionLoader.start_layer): Read visible
8322     parameter.
8323    
8324     * Thuban/Model/save.py (SessionSaver.write_layer): Save visible
8325     parameter.
8326    
8327     * test/test_load.py: Add new test data contents_test_visible.
8328     (LoadSessionTest.setUp): save test data.
8329     (LoadSessionTest.testLayerVisibility): Test if the visible flag
8330     is loaded correctly.
8331    
8332     * test/test_save.py (SaveSessionTest.testSingleLayer): Add test
8333     for saving an invisible layer.
8334    
8335     2003-04-29 Jonathan Coles <[email protected]>
8336    
8337 jonathan 767 * Thuban/UI/mainwindow.py (MainWindow.SetMap): Look up the
8338     legend dialog box and tell it to change its map to the one
8339     supplied to SetMap(). Fixes RTbug #1770.
8340    
8341 bh 764 2003-04-29 Bernhard Herzog <[email protected]>
8342    
8343 bh 766 Next step of table implementation. Introduce a transient database
8344     using SQLite that some of the data is copied to on demand. This
8345     allows us to do joins and other operations that require an index
8346     for good performance with reasonable efficiency. Thuban now needs
8347     SQLite 2.8.0 and pysqlite 0.4.1. Older versions may work but I
8348     haven't tested that.
8349    
8350     * Thuban/Model/transientdb.py: New. Transient database
8351     implementation.
8352    
8353     * test/test_transientdb.py: New. Tests for the transient DB
8354     classes.
8355    
8356     * Thuban/Model/session.py (AutoRemoveFile, AutoRemoveDir): New
8357     classes to help automatically remove temporary files and
8358     directories.
8359     (Session.__init__): New instance variables temp_dir for the
8360     temporary directory and transient_db for the SQLite database
8361     (Session.temp_directory): New. Create a temporary directory if not
8362     yet done and return its name. Use AutoRemoveDir to have it
8363     automatically deleted
8364     (Session.TransientDB): Instantiate the transient database if not
8365     done yet and return it.
8366    
8367     * Thuban/Model/data.py (ShapefileStore.__init__): Use an
8368     AutoTransientTable so that data is copied to the transient DB on
8369     demand.
8370     (SimpleStore): New class that simply combines a table and a
8371     shapefile
8372    
8373     * Thuban/Model/table.py (Table, DBFTable): Rename Table into
8374     DBFTable and update its doc-string to reflect the fact that this
8375     is only the table interface to a DBF file. Table is now an alias
8376     for DBFTable for temporary backwards compatibility.
8377    
8378     * Thuban/UI/application.py (ThubanApplication.OnExit): Make sure
8379     the last reference to the session goes away so that the temporary
8380     files are removed properly.
8381    
8382     * test/test_load.py (LoadSessionTest.tearDown): Remove the
8383     reference to the session to make sure the temporary files are
8384     removed.
8385    
8386     2003-04-29 Bernhard Herzog <[email protected]>
8387    
8388 bh 764 * Thuban/Model/load.py (XMLReader.__init__, XMLReader.read): Turn
8389     the __parser instance variable into a normal local variable in
8390     read. It's only used there and read will never be called more than
8391     once. Plus it introduces a reference cycle that keeps can keep the
8392     session object alive for a long time.
8393    
8394 jonathan 767 2003-04-29 Jonathan Coles <[email protected]>
8395 jonathan 735
8396 jonathan 762 * Thuban/Model/proj.py (Projection): Removed Set*() methods to make
8397     Projection an immutable item. Fixes RTbug #1825.
8398     (Projection.__init__): Initialize instance variables here.
8399     (ProjFile.Replace): New. Replace the given projection object with
8400     the new projection object. This solves the problem of needing the
8401     mutator Projection.SetProjection() in the ProjFrame class and
8402     allows a projection to change parameters without changing its
8403     location in the file.
8404    
8405     * Thuban/UI/mainwindow.py (MainWindow.SaveSessionAs): Dialog should
8406     be of type wxSAVE and should verify overwriting a file.
8407    
8408     * Thuban/UI/projdialog.py (ProjFrame._OnSave): Use the new
8409     ProjFile.Replace() method instead of the mutator
8410     Projection.SetProjection(). Also requires that we reassign the
8411     client data to the new projection.
8412    
8413     * test/test_proj.py (TestProjection.test): Test GetName() and
8414     GetAllParameters()
8415     (TestProjFile.test): Remove tests for Set*() methods. Add tests
8416     for Replace().
8417    
8418     2003-04-25 Jonathan Coles <[email protected]>
8419    
8420 jonathan 756 * Thuban/Model/save.py (SessionSaver.write_projection): Make sure
8421     to save the name of the projection.
8422    
8423     * test/test_save.py (SaveSessionTest.testLayerProjection): New
8424     test to verify layer projections are saved correctly.
8425    
8426     2003-04-25 Jonathan Coles <[email protected]>
8427    
8428 jonathan 753 * Thuban/Model/proj.py (Projection.SetName): Set the name
8429     to "Unknown" if name is None.
8430     (Projection.SetAllParameters): New. Set the projection's
8431     parameter list to the one supplied.
8432     (Projection.SetProjection): New. Set the projection's
8433     properties to those of the supplied Projection.
8434    
8435     * Thuban/UI/mainwindow.py (MainWindow.MapProjection): Set
8436     the dialog title to include the map's title.
8437     (MainWindow.LayerProjection): Set the dialog title to include
8438     the layer's title.
8439    
8440     * Thuban/UI/projdialog.py (ProjFrame.__ShowError): Consolidate
8441     error dialogs into a single method call.
8442     (ProjFrame.__VerifyButtons): Add more states to check.
8443     (ProjFrame.__GetProjection): Return the current state of an
8444     edited projection or None.
8445     (ProjFrame.__FillAvailList): Remove checks for states that
8446     shouldn't exist.
8447     (ProjFrame._OnNew): Clear all selected items and supply
8448     a projection panel if necessary.
8449    
8450     * test/test_proj.py (TestProjFile.test): Add tests for
8451     ProjFile.SetAllParameters, ProjFile.SetProjection,
8452     ProjFile.SetName.
8453    
8454     2003-04-25 Jonathan Coles <[email protected]>
8455    
8456 jonathan 748 * Thuban/UI/projdialog.py (ProjFrame.__FillAvailList): Now
8457     takes an optional argument to select the current projection.
8458     This does not guarantee that the item is visible due to
8459     limited wxWindows functionality. Fixes RTBug #1821.
8460    
8461     2003-04-25 Jonathan Coles <[email protected]>
8462    
8463 jonathan 743 * Thuban/Model/load.py (SessionLoader.start_projection): Remember
8464     the projection name and use it when constructing the Projection
8465     object.
8466    
8467     * Thuban/Model/proj.py (Projection.__init__): Change the default
8468     value for 'name' to None and then test if name is equal to None
8469     in the body of the constructor. This way the caller doesn't have to
8470     know what the default value should be. Namely, useful in load.py
8471     where we have to pick a default value if the 'name' parameter
8472     doesn't exist in the XML file.
8473    
8474     * test/test_load.py (LoadSessionTest.testLayerProjection): New.
8475     Tests a file where a layer has a projection.
8476    
8477     2003-04-25 Jonathan Coles <[email protected]>
8478    
8479 jonathan 735 * Thuban/Model/layer.py (Layer.TreeInfo): Add an item to the
8480     tree for projection information.
8481    
8482     * Thuban/Model/load.py (XMLReader.GetFilename): Renamed from
8483     XMLReader.GetFileName.
8484     (SessionLoader): Added support for loading projection tags that
8485     appear inside a layer.
8486    
8487     * Thuban/Model/proj.py (ProjFile): Document the class. Move
8488     back to using a list because the order of the projections in
8489     the file is important to maintain. Fixes RTbug #1817.
8490    
8491     * Thuban/Model/resource.py: Rename calls to ProjFile.GetFileName
8492     to ProjFile.GetFilename.
8493    
8494     * Thuban/Model/save.py (SessionSaver.write_layer): Save projection
8495     information.
8496    
8497     * Thuban/UI/projdialog.py (ProjFrame._OnAddToList): Renamed from
8498     ProjFrame._OnSaveAs. Removed old dead code from previous
8499     implementation.
8500     (ProjFrame._OnExport): Add support for exporting more than one
8501     projection to a single file.
8502     (ProjFrame.__FillAvailList): use string formatting (% operator)
8503     to build strings that are (partly) translated. Fixes RTbug #1818.
8504    
8505     * test/test_proj.py (TestProjFile.test): New. Tests the base ProjFile
8506     class.
8507    
8508 bh 734 2003-04-24 Bernhard Herzog <[email protected]>
8509    
8510     * po/es.po: Updated Spanish translation by Daniel Calvelo Aros
8511    
8512     * po/fr.po: New. French translation by Daniel Calvelo Aros
8513    
8514     * Thuban/UI/projdialog.py (ProjFrame._OnSaveAs): Don't translate
8515     empty strings.
8516    
8517 jonathan 735 2003-04-24 Jonathan Coles <[email protected]>
8518 jonathan 724
8519     * Thuban/Model/layer.py (Layer.GetProjection): New. Needed to
8520     implement the interface that the ProjFrame dialog expects.
8521    
8522     * Thuban/Model/proj.py (Projection.SetName): New. Allows the
8523     name of the projection to be changed.
8524     (ProjFile): Use a dictionary instead of a list so that removing
8525     projections is easier and we are sure about uniqueness.
8526     (ProjFile.Remove): Remove the given projection object.
8527    
8528     * Thuban/Model/resource.py (GetSystemProjFiles, GetUserProjFiles):
8529     Return a list with only one projection file instead of searching for
8530     any projection file. This simplifies many things if the user can
8531     only have one system file and one user file.
8532    
8533     * Thuban/UI/classgen.py: Change all references to
8534     genCombo to genChoice.
8535    
8536     * Thuban/UI/mainwindow.py: Add a Projection option under the
8537     layer menu.
8538     (MainWindow.LayerProjection): New. Open up a projection window
8539     for a layer.
8540    
8541     * Thuban/UI/projdialog.py: Large changes to how the dialog is
8542     laid out. Use three panels instead of one. One for the list of
8543     projections, one for the edit controls, and one for the buttons.
8544     Fixed resizing problems so that the dialog resizes correctly
8545     when the projection panel changes. Added import/export, save, and
8546     new buttons/functionality.
8547    
8548 bh 723 2003-04-24 Bernhard Herzog <[email protected]>
8549    
8550     First step towards table management. Introduce a simple data
8551     abstraction so that we replace the data a layer uses more easily
8552     in the next step.
8553    
8554     * Thuban/Model/data.py: New file with a simple data abstraction
8555     that bundles shapefile and dbffile into one object.
8556    
8557     * Thuban/Model/session.py (Session.OpenShapefile): New method to
8558     open shapefiles and return a shape store object
8559    
8560     * Thuban/Model/layer.py (Layer.__init__): Pass the data as a store
8561     object instead of a shapefile filename. This introduces a new
8562     instance variable store holding the datastore. For intermediate
8563     backwards compatibility keep the old instance variables.
8564     (open_shapefile): Removed. No longer needed with the shape store.
8565     (Layer.SetShapeStore, Layer.ShapeStore): New methods to set and
8566     get the shape store used by a layer.
8567     (Layer.Destroy): No need to explicitly destroy the shapefile or
8568     table anymore.
8569    
8570     * Thuban/UI/mainwindow.py (MainWindow.AddLayer)
8571     (MainWindow.AddLayer): Use the session's OpenShapefile method to
8572     open shapefiles
8573    
8574     * Thuban/Model/load.py (ProcessSession.start_layer): Use the
8575     session's OpenShapefile method to open shapefiles
8576    
8577     * test/test_classification.py
8578     (TestClassification.test_classification): Use the session's
8579     OpenShapefile method to open shapefiles and build the filename in
8580     a more platform independed way
8581    
8582     * test/test_layer.py (TestLayer.setUp, TestLayer.tearDown):
8583     Implement to have a session to use in the tests
8584     (TestLayer.test_arc_layer, TestLayer.test_polygon_layer)
8585     (TestLayer.test_point_layer, TestLayer.test_empty_layer): Use the
8586     session's OpenShapefile method to open shapefiles
8587     (TestLayerLegend.setUp): Instantiate a session so that we can use
8588     it to open shapefiles.
8589     (TestLayerLegend.tearDown): Make sure that all references to
8590     layers and session are removed otherwise we may get a resource
8591     leak
8592    
8593     * test/test_map.py (TestMapAddLayer.test_add_layer)
8594     (TestMapWithContents.setUp): Instantiate a session so that we can
8595     use it to open shapefiles.
8596     (TestMapWithContents.tearDown): Make sure that all references to
8597     layers, maps and sessions are removed otherwise we may get a
8598     resource leak
8599     ("__main__"): use support.run_tests() so that more info about
8600     uncollected garbage is printed
8601    
8602     * test/test_save.py (SaveSessionTest.testSingleLayer): Use the
8603     session's OpenShapefile method to open shapefiles
8604     ("__main__"): use support.run_tests() so that more info about
8605     uncollected garbage is printed
8606    
8607     * test/test_selection.py (TestSelection.tearDown): Make sure that
8608     all references to the session and the selection are removed
8609     otherwise we may get a resource leak
8610     (TestSelection.get_layer): Instantiate a session so that we can
8611     use it to open shapefiles.
8612     ("__main__"): use support.run_tests() so that more info about
8613     uncollected garbage is printed
8614    
8615     * test/test_session.py (TestSessionBase.tearDown)
8616     (TestSessionWithContent.tearDown): Make sure that all references
8617     to the session and layers are removed otherwise we may get a
8618     resource leak
8619     (TestSessionWithContent.setUp): Use the session's OpenShapefile
8620     method to open shapefiles
8621    
8622 jonathan 721 2003-04-24 Jonathan Coles <[email protected]>
8623    
8624     * Thuban/Model/load.py (XMLReader.read): Should have been checking
8625     if the file_or_filename object had the 'read' attribute.
8626    
8627 jonathan 715 2003-04-23 Jonathan Coles <[email protected]>
8628    
8629 jonathan 720 * Thuban/Model/resource.py: Fixes RTbug #1813.
8630     (ReadProjFile): Add documentation about which exceptions are raised.
8631     Always pass the exceptions up to the caller.
8632     (GetProjFiles): If the directory can't be read return an empty list.
8633     If any of the proj files can't be read skip that file and go
8634     on to the next one.
8635    
8636     * test/test_proj.py: Added test cases to handle nonexistent files,
8637     unreadable files, and files that don't parse correctly.
8638    
8639     2003-04-23 Jonathan Coles <[email protected]>
8640    
8641 jonathan 716 Projection dialog. Allows the user to select from a list
8642     of projection templates and optionally edit them and save new ones.
8643    
8644     * Thuban/UI/projdialog.py (ProjFrame): New. Main dialog.
8645     (ProjPanel): Base class for projection specific panels.
8646     (TMPanel): Projection panel for Transverse Mercartor.
8647     (UTMPanel): Projection panel for Universal Transverse Mercartor.
8648     (LCCPanel): Projection panel for Lambert Conic Conformal.
8649     (GeoPanel): Projetion panel for Geographic Projection.
8650    
8651     2003-04-23 Jonathan Coles <[email protected]>
8652    
8653 jonathan 715 * Thuban/Model/load.py (XMLReader): Renamed from XMLProcessor to
8654     promote symmetry. There now exists XMLReader and XMLWriter.
8655     (XMLReader.read): New. Call to read the given file descriptor or
8656     filename.
8657     (XMLReader.close): New. Make sure the file is closed.
8658     (XMLReader.GetFileName): New. Return just the file name that is being
8659     read from.
8660     (XMLReader.GetDirectory): New. Return just the directory of the file
8661     that is being read.
8662     (XMLReader.AddDispatchers): New. Take a dictionary which contains
8663     the names of functions to call as the XML tree is parsed.
8664     (XMLReader.startElementNS): Updated to use new dispatcher dictionary.
8665     (XMLReader.endElementNS): Updated to use new dispatcher dictionary.
8666     (SessionLoader): Removed class variables start_dispatcher and
8667     end_dispatcher since this functionality is now part of a class
8668     instance. Fixes RTbug #1808.
8669     (SessionLoader.__init__): Add dispatcher functions.
8670     (load_xmlfile): Code was moved into the XMLReader.read().
8671     (load_session): Use modified SessionLoader.
8672    
8673     * Thuban/Model/map.py (Map.GetProjection): New. Returns the
8674     map's projection.
8675    
8676     * Thuban/Model/proj.py (Projection.GetParameters): Renamed to
8677     GetAllParameters.
8678     (Projection.GetParameter): Returns the value for the given parameter.
8679    
8680     * Thuban/Model/resource.py: Use XMLReader and XMLWriter.
8681     (GetProjFiles): Renamed from GetProjections. Now returns a list
8682     of ProjFile objects.
8683     (GetSystemProjFiles): Renamed from GetSuppliedProjections. Returns
8684     a list of ProjFile objects whose files are not user defined.
8685     (GetUserProjFiles): Renamed from GetUserProjections. Returns a
8686     list of ProjFile objects whose files are user defined.
8687     (ProjFileReader): Extend new XMLReader.
8688    
8689     * Thuban/Model/save.py (XMLWriter): Renamed from XMLSaver to
8690     promote symmetry.
8691    
8692     * Thuban/UI/classgen.py (ClassGenDialog.__init__): Use a wxChoice
8693     control instead of a wxComboBox. wxChoice controls do not generate
8694     events as the uses highlights possible choices which fixes problems
8695     with resizing the dialog when the use selects an option.
8696    
8697     * Thuban/UI/classifier.py (Classifier.__init__): Use a wxChoice
8698     control instead of a wxComboBox.
8699    
8700     * Thuban/UI/mainwindow.py (MainWindow.Projection): Use new projection
8701     dialog.
8702    
8703     * test/test_proj.py (TestProjection.test): New tests for GetParameter
8704     method.
8705    
8706 bh 703 2003-04-22 Bernhard Herzog <[email protected]>
8707    
8708 bh 705 * Thuban/UI/mainwindow.py: Remove some unused imports and global
8709     constants
8710    
8711 bh 703 * Thuban/UI/identifyview.py (IdentifyListCtrl.selected_shape)
8712     (IdentifyGridCtrl.selected_shape): Use table, not shapetable.
8713    
8714 bh 700 2003-04-17 Bernhard Herzog <[email protected]>
8715    
8716 bh 701 * Thuban/Model/layer.py: Don't import LAYER_LEGEND_CHANGED.
8717     (Layer): Update doc-string since LAYER_LEGEND_CHANGED is not used
8718     anymore.
8719     (Layer.BoundingBox, Layer.GetFieldType, Layer.NumShapes)
8720     (Layer.ShapeType, Layer.Shape): No need to call
8721     self.open_shapefile since it's always called in __init__
8722    
8723 bh 700 * Thuban/UI/application.py (ThubanApplication.MainLoop): Removed.
8724     In wxPython 2.4 there's no need to extend MainLoop anymore since
8725     wxPython itself makes sure OnExit is called.
8726    
8727 jonathan 688 2003-04-16 Jonathan Coles <[email protected]>
8728    
8729 jonathan 693 Initial putback of projection management code. Includes new
8730     classes to read and write projection files. The current load
8731     and save classes were abstracted a bit so they could be reused.
8732     The Projection class was extended to provide new methods and
8733     have a name.
8734    
8735     * Thuban/Model/load.py (XMLProcessor): New. Contains all the
8736     general XML reading methods that were part of ProcessSession.
8737    
8738     * Thuban/Model/proj.py (Projection.__init__): Accepts an optional
8739     name.
8740     (ProjFile): New. Represents a file that contains projection
8741     information.
8742    
8743     * Thuban/Model/resource.py: New. Contains general utilities
8744     for read and writing projection files.
8745    
8746     * Thuban/Model/save.py (XMLSaver): New. Contains all the
8747     general XML writing methods that were part of SessionSaver.
8748     (SessionSaver): Renamed from Saver.
8749    
8750     * test/test_proj.py: New test cases for the projection
8751     file read and write functions.
8752    
8753     2003-04-16 Jonathan Coles <[email protected]>
8754    
8755 jonathan 688 * Thuban/Model/classification.py: Use repr() around values
8756     in the ClassGroup*.__repr__() methods so it is clearer when
8757     a value is a string and when it is a number.
8758    
8759     * test/test_load.py: Rework the classification test to test
8760     that we can load old files.
8761     (testLabels): Test a file where the groups have labels.
8762    
8763 bh 687 2003-04-16 Bernhard Herzog <[email protected]>
8764    
8765     Safer implementation of the performance enhancements of the
8766     low-level renderer:
8767    
8768     * extensions/thuban/wxproj.cpp (extract_projection)
8769     (extract_pointer): Rename extract_projection to extract_pointer
8770     and redefine its purpose to return the pointer stored in a CObject
8771     returned by the object's cobject method. Update all callers.
8772     (s_draw_info, free_draw_info, draw_polygon_init): Implement the
8773     handling of these low-level parameters so that each s_draw_info
8774     instance is handled as a CObject at python level that also
8775     contains real references to the actual python objects which
8776     contain the values in the struct. Add free_draw_info as the
8777     destructor.
8778     (draw_polygon_shape): Add the py_draw_info parameter which must a
8779     cobject containing an s_draw_info pointer.
8780    
8781     * Thuban/UI/renderer.py (MapRenderer.polygon_render_param): New
8782     method to instantiat the low-level render parameter
8783     (MapRenderer.draw_shape_layer): Use the new method. Remove some
8784     commented out code.
8785     (MapRenderer.draw_polygon_shape): Make the first parameter not the
8786     layer but the low-level render parameter
8787     (ScreenRenderer.draw_shape_layer): Use the low-level render
8788     parameter.
8789    
8790 jonathan 673 2003-04-15 Jonathan Coles <[email protected]>
8791    
8792 jonathan 680 * Thuban/Model/classification.py: Implemented __repr__ for
8793     the ClassGroup* classes to make debugging a bit easier.
8794     (ClassGroup.SetLabel): Check that the string is an instance
8795     of StringTypes not StringType. Accounts for Unicode strings.
8796    
8797     * Thuban/Model/color.py: Implemented __repr__ to make
8798     debugging a bit easier.
8799    
8800     * Thuban/Model/save.py (Saver.write_classification): Need to
8801     save the group label.
8802    
8803     * test/test_load.py (testClassification): New. Loads the
8804     iceland_sample_test.thuban file and checks if it was loaded
8805     correctly.
8806    
8807     2003-04-15 Jonathan Coles <[email protected]>
8808    
8809 jonathan 673 * extensions/thuban/wxproj.cpp (draw_polygon_init): New. Used
8810     to improve rendering performance by initializing the variables
8811     that are not change each time draw_polygon_shape() is called.
8812     The values are stored in a global struct draw_info.
8813     (draw_polygon_shape): Removed initialization code that is
8814     now in draw_polygon_init().
8815    
8816     * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Make
8817 jonathan 674 drawing initialization call to draw_polygon_init()
8818     (MapRenderer.draw_polygon_shape): Use new signature of
8819     draw_polygon_shape.
8820 jonathan 673
8821 jonathan 674 * Thuban/UI/classgen.py (GenUniformPanel): Fix spin control
8822     weirdness by setting the range to (1, maxint).
8823 jonathan 673
8824 jonathan 674 * Thuban/Model/classification.py (ClassGroupProperties): Make
8825     instance variables private and optimize comparison operator
8826     by first checking if the color references are the same.
8827     (ClassGroupSingleton): Make instance variables private.
8828     (ClassGroupRange): Make instance variables private.
8829 jonathan 673
8830 jonathan 674 * HOWTO-Release: Filled in missing steps for releasing packages.
8831    
8832 bh 672 2003-04-15 Bernhard Herzog <[email protected]>
8833    
8834     First stab at internationalized messages:
8835    
8836     * Thuban/__init__.py (_): Implement the translation function for
8837     real using the python gettext module.
8838    
8839     * Thuban/UI/classifier.py (ClassTable.GetRowLabelValue): Don't
8840     translate empty strings.
8841    
8842     * Thuban/UI/application.py (ThubanApplication.read_startup_files):
8843     Add a missing space to a warning message
8844    
8845     * po/README: New. Notes about the management of the translation
8846     files.
8847    
8848     * po/Makefile: New. Makefile to help manage the translation files.
8849    
8850     * po/es.po: New. Spanish translation by Daniel Calvelo Aros
8851    
8852     * MANIFEST.in: Include the *.mo files in Resources/Locale and the
8853     translations and support files in po/
8854    
8855     * setup.py (data_files): Add the *.mo files to the data_files too
8856    
8857     * README: Add note about the translations when building from CVS
8858    
8859 jonathan 669 2003-04-14 Jonathan Coles <[email protected]>
8860    
8861     * Thuban/UI/dock.py: Fixes some window resizing problems most
8862     noticable under windows. Always assume the button bitmaps will
8863     be there. Code clean up.
8864     (DockabelWindow.Dock, DockableWindow.UnDock): Force all the
8865     images for the dock/undock button to the same images.
8866     Work around for RTbug #1801.
8867    
8868     * Thuban/UI/legend.py (LegendPanel.__init__): The toolbar should
8869     be allowed to grow within the sizer. Fixes a bug under Windows
8870     where the toolbar wasn't being drawn.
8871    
8872 frank 664 2003-04-14 Frank Koormann <[email protected]>
8873    
8874     * Resources/Bitmaps/dock_12.xpm, Resources/Bitmaps/undock_12.xpm:
8875     Updated design to try to make the button functionality more
8876     transparent.
8877    
8878 jonathan 662 2003-04-14 Jonathan Coles <[email protected]>
8879    
8880     * Thuban/UI/legend.py (LegendPanel.__init__): Call Create() to
8881     finalize the intialization of the panel.
8882    
8883     * Thuban/UI/dock.py (DockPanel.Create): New. Finalizes the
8884     creation of the panel. Should be the last thing called in the
8885     initializer of a subclass.
8886    
8887     * Thuban/UI/classgen.py (ClassGenDialog.__init__): Actively
8888     set the current selections in the combo boxes. This is needed
8889     under Windows.
8890    
8891     * Thuban/UI/classifier.py (Classifier.__init__): Add a top
8892     level panel to the dialog so that the background colors are
8893     consistent under Windows.
8894    
8895 jonathan 646 2003-04-11 Jonathan Coles <[email protected]>
8896    
8897 jonathan 662 * Thuban/UI/classgen.py: Change color ramps to start at white
8898     not black.
8899    
8900     * Thuban/UI/legend.py: Enable/disable the legend buttons when
8901     the legend changes. Fixes RTbug #1793.
8902    
8903     * test/test_classification.py: Added test for copying of
8904     classifications.
8905    
8906     2003-04-11 Jonathan Coles <[email protected]>
8907    
8908 jonathan 647 * Thuban/UI/resource.py: New. Centralize the loading of resources
8909     such as bitmaps.
8910    
8911     * Thuban/UI/classgen.py (GenUniquePanel.__init__): Reordered buttons,
8912     added images to the move buttons, added 'reverse' button.
8913     (CustomRampPanel.__init__): Added images to the move buttons.
8914     (GreyRamp): New. Generates a ramp from white to black.
8915     (HotToColdRamp): New. Generates a ramp from cold to hot colors.
8916    
8917     * Thuban/UI/classifier.py: Refactored ID's from ID_CLASSIFY_* to
8918     ID_PROPERTY_*.
8919     (Classifier.__init__): Minor changes to the layout.
8920     (Classifier._OnTitleChanged): Listen for when the user edits the
8921     title and update the dialog's title and the layer's title.
8922    
8923     * Thuban/UI/dock.py: Use new bitmaps for the control buttons.
8924    
8925     * Thuban/UI/legend.py: Use new bitmaps for the control buttons.
8926     (LegendTree._OnMsgLayerTitleChanged): Change the displayed title
8927     if the layer's title changes.
8928    
8929     * Thuban/UI/mainwindow.py: Added new menu item and associated code
8930     to open a dialog to rename the map.
8931     (MainWindow): Use new resource class to import bitmaps.
8932    
8933     2003-04-11 Jonathan Coles <[email protected]>
8934    
8935 jonathan 646 * Resources/Bitmaps/close_12.xpm, Resources/Bitmaps/dock_12.xpm,
8936 jonathan 647 Resources/Bitmaps/group_use.xpm, Resources/Bitmaps/group_use_all.xpm,
8937     Resources/Bitmaps/group_use_none.xpm,
8938     Resources/Bitmaps/group_use_not.xpm,
8939     Resources/Bitmaps/hide_layer.xpm,
8940     Resources/Bitmaps/layer_properties.xpm,
8941     Resources/Bitmaps/lower_layer.xpm, Resources/Bitmaps/raise_layer.xpm,
8942     Resources/Bitmaps/show_layer.xpm, Resources/Bitmaps/undock_12.xpm:
8943     New.
8944 jonathan 646
8945 jonathan 636 2003-04-10 Jonathan Coles <[email protected]>
8946    
8947 jonathan 644 * Thuban/Model/classification.py: (ClassGroupRange.__init__):
8948     Should pass group to ClassGroup constructor.
8949    
8950     2003-04-10 Jonathan Coles <[email protected]>
8951    
8952 jonathan 636 * Thuban/Model/classification.py: (ClassGroup): Move all the common
8953     methods of the derived classes ([Set|Get]Properties(), __eq__, __ne__)
8954     here. Implement SetVisible(), IsVisible().
8955     (ClassGroup.__init__): Add group parameter which acts as a copy
8956     constructor.
8957    
8958     * Thuban/UI/classifier.py (ClassTable): Add a new column for the
8959     "Visible" check boxes.
8960     (Classifier): Rename the buttons and refactor the code to match
8961     the new labels.
8962    
8963     * Thuban/UI/legend.py: Classify button is now called "Properties".
8964     Refactored the code to change variable names.
8965     (LegendTree.__FillTreeLayer): Only list a group if it is visible.
8966    
8967     * Thuban/UI/mainwindow.py: MainWindow.OpenClassifier renamed to
8968     MainWindow.OpenLayerProperties. MainWindow.LayerEditProperties
8969     renamed to MainWindow.LayerEditProperties.
8970     (MainWindow.ToggleLegend): Don't include map name in legend title.
8971     (MainWindow.SetMap): Added the map name to the window title.
8972     (MainWindow.LayerFillColor, MainWindow.LayerTransparentFill,
8973     MainWindow.LayerOutlineColor, MainWindow.LayerNoOutline): Removed.
8974     Functionality is found in the layer properties dialog.
8975    
8976     * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Only
8977     draw visible groups.
8978    
8979 jonathan 626 2003-04-09 Jonathan Coles <[email protected]>
8980    
8981 jonathan 634 * Thuban/UI/classgen.py: Modifications to allow simple
8982     addition and selection of new color schemes.
8983     (MonochromaticRamp): New. Generates a ramp between two colors.
8984     (RedRamp): New. Generates a ramp of all red.
8985     (GreenRamp): New. Generates a ramp of all green.
8986     (BlueRamp): New. Generates a ramp of all blue.
8987    
8988     2003-04-09 Jonathan Coles <[email protected]>
8989    
8990 jonathan 626 * Thuban/Model/classification.py (Classification.__deepcopy__):
8991     Need to copy over field and fieldType attributes.
8992    
8993     * Thuban/Model/table.py (Table.field_range): New. Retrive the
8994     maximum and minimum values over the entire table for a given
8995     field.
8996     (Table.GetUniqueValues): New. Retrieve all the unique values
8997     in the table for a given field.
8998    
8999     * Thuban/UI/classgen.py: Renamed GenRangePanel to GenUniformPanel.
9000     (GenUniquePanel): New. Controls to allow the user to select
9001     which unique field values they would like in the classification.
9002     (CustomRampPanel): Code that was in ClassGenDialog that allows
9003     the user to select the properties for a custom ramp.
9004     (ClassGenerator.GenUniformDistribution): Was called GenerateRanges.
9005    
9006     * Thuban/UI/classifier.py: Removed a lot of debugging code.
9007     (Classifier._SetClassification): Callback method so that the
9008     class generator can set the classification in the grid.
9009     (ClassGroupPropertiesCtrl): New. Encapsulates the drawing and
9010     editing of a group properties class into a wxWindows control.
9011    
9012     * Thuban/UI/dock.py: It was decided that if the user closes
9013     a dockable window the window should simply hide itself. That
9014     way if the user wants to show the dock again it appears in the
9015     same place as it was when it was closed.
9016     (DockableWindow.Destroy): Call renamed method OnDockDestroy().
9017     (DockableWindow._OnButtonClose): Hide the window instead of
9018     destroying it.
9019     (DockableWindow._OnClose): Hide the window instead of
9020     destroying it.
9021    
9022     * Thuban/UI/legend.py (LegendTree): Use a private method to
9023     consistently set the font and style of the text. Fixes RTbug #1786.
9024    
9025     * Thuban/UI/mainwindow.py: Import just the Classifier class.
9026    
9027 bh 623 2003-04-07 Bernhard Herzog <[email protected]>
9028    
9029 bh 625 * Thuban/UI/mainwindow.py (main_menu): Move the toggle_legend item
9030     to the map module
9031    
9032     2003-04-07 Bernhard Herzog <[email protected]>
9033    
9034 bh 623 * Thuban/UI/mainwindow.py (MainWindow.ShowSessionTree): Removed in
9035     favor of ToggleSessionTree
9036     (MainWindow.ToggleSessionTree): New method to toggle visibility of
9037     the session tree.
9038     (MainWindow.SessionTreeShown): New method to return whether the
9039     session tree is currently shown.
9040     (MainWindow.ToggleLegend): New method to toggle visibility of the
9041     legend
9042     (MainWindow.ShowLegend): Implement in terms of ToggleLegend and
9043     LegendShown
9044     (MainWindow.LegendShown): New method to return whether the legend
9045     is currently shown.
9046     (_method_command): Add checked parameter so we can define check
9047     menu items
9048     (_has_tree_window_shown, _has_legend_shown): Use the appropriate
9049     mainwindow methods.
9050     (show_session_tree, show_legend commands): Removed.
9051     (toggle_session_tree, toggle_legend commands): New commands to
9052     toggle the visibility of the dialogs
9053    
9054 jonathan 612 2003-04-07 Jonathan Coles <[email protected]>
9055    
9056 jonathan 619 * Thuban/UI/classgen.py: Fix Windows problem.
9057    
9058     * Thuban/UI/dock.py: Fix Windows problem.
9059    
9060     * Thuban/UI/mainwindow.py: Use False instead of false.
9061     (MainWindow.ShowLegend): Remove unnecessary switch parameter.
9062    
9063     2003-04-07 Jonathan Coles <[email protected]>
9064    
9065 jonathan 612 Since we now say that the order of the groups in a classification
9066     matters, it makes sense to be able to manipulate that order. Most
9067     of the changes to Thuban/Model/classification.py are to that end.
9068    
9069     * Thuban/Model/classification.py (Classification.AppendGroup,
9070     Classification.InsertGroup, Classification.ReplaceGroup,
9071     Classification.RemoveGroup, Classification.GetGroup): Do as the
9072     names imply.
9073     (Classification.FindGroup): This was called GetGroup, but GetGroup
9074     takes an index, while FindGroup takes a value.
9075     (Classification.__deepcopy__): Copy all the groups, BUT NOT THE LAYER
9076     REFERENCE. Currently there is a cyclic reference between the layer
9077     and its classification. If the classification doesn't need to know
9078     its owning layer we can change this, since it may make sense to be
9079     able to use the same classification with different layers.
9080    
9081     * Thuban/Model/load.py: Use Classification.AppendGroup(), not AddGroup()
9082    
9083     * Thuban/UI/classgen.py: Use Classification.AppendGroup(),
9084     not AddGroup()
9085    
9086     * Thuban/UI/classifier.py: Now that we can depend on the order in
9087     a Classification and have methods to manipulate that order we don't
9088     need to use our own data structures in the grid. We can simply make
9089     the grid/table access the information they need from a copy of
9090     the classification object.
9091     (Classifier._OnCloseBtn): Event handler for when the user clicks
9092     'Close'. This is needed so if the user applies changes and then
9093     continues to change the table the user has the option of discarding
9094     the most recent changes and keeping what they applied.
9095    
9096     * Thuban/UI/mainwindow.py: Put "Show Legend" and "Show Session Tree"
9097     into the same group.
9098    
9099     * extensions/thuban/wxproj.cpp (check_version): If Thuban is compiled
9100     with a really old version of proj, PJ_VERSION won't even be defined.
9101     If it isn't defined then just compile so that the function always
9102     returns Py_False.
9103    
9104     * test/test_classification.py: Fix tests to use the renamed methods.
9105     Still need to write tests for the new methods.
9106    
9107 jonathan 601 2003-04-04 Jonathan Coles <[email protected]>
9108 jonathan 608
9109 jonathan 612 * Thuban/UI/classifier.py (Classifier.__SelectField): Move the
9110     call to SetSelection out of the method and before the call
9111     to __SelectField in __init__. This prevents a recursion of events
9112     when _OnFieldSelect is triggered by the user.
9113    
9114     2003-04-04 Jonathan Coles <[email protected]>
9115    
9116 jonathan 608 * Thuban/Model/classification.py: Rename Color.None to
9117     Color.Transparent.
9118     (ClassGroupProperties.SetLineColori, ClassGroupProperties.SetFill):
9119     Don't bother copying the color, since Colors are immutable.
9120    
9121     * Thuban/Model/color.py, Thuban/Model/layer.py, Thuban/Model/load.py,
9122     Thuban/UI/classifier.py, Thuban/UI/mainwindow.py,
9123     Thuban/UI/renderer.py, Thuban/UI/view.py:
9124     Rename Color.None to Color.Transparent.
9125    
9126     * test/test_classification.py, test/test_load.py: Rename Color.None
9127     to Color.Transparent.
9128    
9129     2003-04-04 Jonathan Coles <[email protected]>
9130 jonathan 603
9131     * Thuban/Model/classification.py: Fix assert calls.
9132     (ClassGroupProperties.SetLineColor, ClassGroupProperties.SetFill):
9133     Copy the color parameter rather than hold onto a reference.
9134 jonathan 601
9135 jonathan 603 * Thuban/Model/color.py (Color.__copy__, Color.__deepcopy): Copy
9136     the color object.
9137     (NoColor.__copy__, NoColor.__deepcopy): Return 'self' so that we
9138     are sure there exists only one refernce to Color.None in the system.
9139     This allows us to use 'is' rather than the comparision functions.
9140    
9141     * Thuban/Model/save.py: Fix assert calls.
9142    
9143     * Thuban/UI/classifier.py: Fix assert calls.
9144     (ClassGrid._OnCellDClick): Call up to the classifier to open the
9145     dialog to edit the groups properties.
9146     (ClassGrid._OnCellResize): Make sure that the scollbars are drawn
9147     correctly if a cell is resized.
9148     (ClassTable.SetClassification): New. Changes the classification
9149     that is in the table.
9150     (ClassTable.__SetRow): Allow groups to be prepended.
9151     (Classifier): New code for opening the EditProperties and
9152     GenerateRanges dialogs.
9153     (SelectPropertiesDialog.__GetColor): Only set the color in the
9154     color dialog if the current color is not None.
9155    
9156     * Thuban/UI/dock.py: Fix assert calls.
9157    
9158     * Thuban/UI/legend.py: Fix assert calls.
9159    
9160     * Thuban/UI/renderer.py: Fix assert calls.
9161    
9162     * Thuban/UI/classgen.py (ClassGenDialog): Dialog for generating
9163     classifications.
9164     (GenRangePanel): Panel specific to range generation.
9165     (GenSingletonPanel): Panel specific to singleton generation.
9166     (ClassGenerator): Class responsible for actually generating
9167     the classification from the data gathered in the dialog box.
9168     (PropertyRamp): Generates properties whose values range from
9169     a starting property to an ending property.
9170 jonathan 601
9171 bh 600 2003-04-03 Bernhard Herzog <[email protected]>
9172    
9173     * test/support.py (print_garbage_information): New function that
9174     prints information about still connected messages and memory
9175     leaks.
9176     (run_suite): Removed.
9177     (run_tests): New function for use as a replacement of
9178     unittest.main in the test_* files. This one calls
9179     print_garbage_information at the end.
9180    
9181     * test/runtests.py (main): Use support.print_garbage_information
9182    
9183     * test/test_layer.py: Use support.run_tests instead of
9184     unittest.main so we get memory leak information
9185     (TestLayer.test_arc_layer, TestLayer.test_polygon_layer)
9186     (TestLayer.test_point_layer, TestLayer.test_empty_layer)
9187     (TestLayerLegend.test_visibility): Call the layer's Destroy method
9188     to fix a memory leak.
9189    
9190     * test/test_classification.py: Use support.run_tests instead of
9191     unittest.main so we get memory leak information
9192     (TestClassification.test_classification): Call the layer's Destroy
9193     method to fix a memory leak.
9194    
9195 bh 591 2003-04-02 Bernhard Herzog <[email protected]>
9196    
9197 bh 595 * extensions/thuban/wxproj.cpp (check_version, check_version_gtk):
9198     Handle the reference counts of the return value and errors in
9199     PyArg_ParseTuple correctly.
9200    
9201 bh 593 * Thuban/UI/application.py (ThubanApplication.OpenSession): Make
9202     sure the filename is absolute to avoid problems when saving the
9203     session again
9204    
9205 bh 591 * Thuban/Model/table.py: Remove unnecessary import. Fix a typo.
9206    
9207 jonathan 587 2003-04-01 Jonathan Coles <[email protected]>
9208    
9209 jonathan 589 * Thuban/UI/renderer.py (MapRenderer.draw_point_shape): Check
9210 jonathan 587 that there actually are points in the returned list of points
9211     before trying to index into the list. The list may be empty if
9212     the shape is a Null Shape.
9213    
9214 bh 586 2003-04-01 Bernhard Herzog <[email protected]>
9215    
9216     * test/test_map.py: Don't use from <module> import *
9217    
9218 jonathan 581 2003-04-01 Jonathan Coles <[email protected]>
9219    
9220     * Thuban/Model/session.py: Use LAYER_CHANGED instead of
9221     LAYER_LEGEND_CHANGED
9222    
9223     * Thuban/UI/dock.py (DockableWindow._OnButtonClose): Call
9224     self.Destroy() to close the window after yesterday's changes.
9225    
9226     * test/test_map.py, test/test_session.py: Fix messages that
9227     are sent from maps and layers.
9228    
9229 jonathan 575 2003-03-31 Jonathan Coles <[email protected]>
9230    
9231     * Thuban/UI/classifier.py: Commented out some debugging statements.
9232     (ClassDataPreviewer.Draw): Draw rectangles for polygon layers per
9233     RTbug #1769.
9234    
9235     * Thuban/UI/dock.py (DockableWindow.UnDock): Restore size and
9236     position (although position doesn't work yet under GTK).
9237     (DockableWindow.Destroy): New. Called when the window must be
9238     closed. Namely needed when the DockFrame closes and must close
9239     its children.
9240     (DockFrame): Listen for EVT_CLOSE and destroy all children.
9241    
9242     * Thuban/UI/legend.py (LegendPanel.Destroy): New. Cleans up
9243     when then window is told to close.
9244     (LegendTree._OnMsgLayerChanged): Fixes a seg fault bug. See
9245     comment in source for more info.
9246    
9247     * Thuban/UI/main.py: Show the legend by default when Thuban starts.
9248    
9249     * Thuban/UI/mainwindow.py: Renamed OnClose to _OnClose for
9250     symmetry with other such methods.
9251     (MainWindow.ShowLegend): Show the legend docked by default.
9252    
9253 jonathan 569 2003-03-28 Jonathan Coles <[email protected]>
9254    
9255     * Thuban/UI/classifier.py: Support for highlighting a specific
9256     group within the grid when the classification dialog is opened.
9257     Also contains a lot of debugging printouts which will later
9258     be removed.
9259    
9260     * Thuban/UI/dock.py: Complete rework on the dock code so that
9261     that it is fairly removed from the rest of the Thuban application.
9262     It is easy to add new docks which the rest of the program having
9263     to be aware of them.
9264    
9265     * Thuban/UI/legend.py: Modifications to support selecting a
9266     specific group in the classification dialog. Changed how layers
9267     are drawn when the layer is visible/invisible.
9268    
9269     * Thuban/UI/mainwindow.py: Removed legend specific code and
9270     replaced it with calls to the new dock code.
9271    
9272     * Thuban/UI/renderer.py (MapRenderer.__init__): Added assert
9273     to check if scale > 0. Trying to track down a divide by zero.
9274    
9275 jonathan 557 2003-03-26 Jonathan Coles <[email protected]>
9276    
9277 jonathan 567 * Thuban/UI/legend.py: Removed unnecessary LegendDialog class.
9278     (LegendPanel): Removed _OnDock()/_OnUnDock() methods which are
9279     now part of DockableWindow.
9280     (LegendPanel.DoOnSelChanged): Select the current layer in the
9281     map.
9282     (LegendTree._OnSelChanged): Call LegendPanel.DoOnSelChanged()
9283     with the selected layer and/or group.
9284    
9285     2003-03-26 Jonathan Coles <[email protected]>
9286    
9287 jonathan 557 This putback contains the code for dockable windows. There is
9288     no support in wxWindows as of this date for windows that can
9289     attach themselves to other windows.
9290    
9291     The current model contains a DockableWindow which has a parent
9292     window for when it is detached and a dock window that it puts
9293     its contents in when it is docked. The contents of a DockableWindow
9294     must be a DockPanel. DockPanel itself derives from wxPanel.
9295    
9296     * Thuban/Model/layer.py (Layer.ClassChanged): Send a LAYER_CHANGED
9297     message, not a LAYER_LEGEND_CHANGED message.
9298    
9299     * Thuban/Model/map.py (Map): Forward LAYER_CHANGED messages.
9300    
9301     * Thuban/UI/classifier.py (Classifier.__init__): Use wxADJUST_MINSIZE
9302     as one of the style properties for the fieldTypeText item to
9303     be sure that its size is correct when the text changes.
9304    
9305     * Thuban/UI/dock.py: New. Classes for the DockPanel and
9306     DockableWindow.
9307    
9308     * Thuban/UI/legend.py: Added some more buttons and made the
9309     LegendPanel a DockPanel.
9310    
9311     * Thuban/UI/mainwindow.py: Added sash windows to the main window
9312     and supporting functions for manipulating the sashes.
9313     (MainWindow.ShowLegend): Create a DockableWindow with the
9314     LegendPanel as the contents.
9315    
9316     * Thuban/UI/messages.py: Added DOCKABLE_* messages
9317    
9318     * Thuban/UI/view.py (MapCanves.SetMap): Listen for LAYER_CHANGED,
9319     not LAYER_LEGEND_CHANGED, messages.
9320    
9321 jonathan 554 2003-03-25 Jonathan Coles <[email protected]>
9322    
9323     * setup.py: Added custom script bdist_rpm_build_script so that
9324     when the rpm is built the path to wx-config is correct.
9325    
9326     * setup.cfg: Added line saying to use the custom build script
9327    
9328 jonathan 552 2003-03-20 Jonathan Coles <[email protected]>
9329    
9330     Initial implementation of the Legend.
9331    
9332     * Thuban/UI/legend.py: New. Creates a window that shows the map's
9333     Legend information and allows the user to add/modify classifications
9334     and how the layers are drawn on the map.
9335    
9336     * setup.py: New command 'build_docs' which currently uses
9337     happydoc to generate html documentation for Thuban.
9338    
9339     * Thuban/Model/classification.py (ClassGroup.GetDisplayText): New.
9340     Returns a string which is appropriately describes the group.
9341    
9342     * Thuban/Model/layer.py (Layer.SetClassification): Generate a
9343     LAYER_CHANGED event instead of a LAYER_LEGEND_CHANGED event.
9344    
9345     * Thuban/Model/map.py (Map): Rename messages and use new, more
9346     specific, messages.
9347    
9348     * Thuban/Model/messages.py: New message to indicate that a layer's
9349     data has changed (LAYER_CHANGED). New map messages to indicate
9350     when layers have been added/removed/changed or if the stacking order
9351     of the layers has changed.
9352    
9353     * Thuban/Model/session.py: Rename and use new messages.
9354    
9355     * Thuban/UI/classifier.py: Remember if any changes have actually
9356     been applied so that if the dialog is cancelled without an application
9357     of changes we don't have to set a new classification.
9358     (ClassDataPreviewer): Pulled out the window specific code and put it
9359     ClassDataPreviewWindow. ClassDataPreviewer can then be used to draw
9360     symbols on any DC.
9361    
9362     * Thuban/UI/mainwindow.py: New code to open the legend.
9363    
9364     * Thuban/UI/view.py: Use new message names.
9365    
9366 jonathan 541 2003-03-19 Jonathan Coles <[email protected]>
9367    
9368     * Thuban/UI/main.py (verify_versions): New. Checks the versions
9369     of Python, wxPython, and some other libraries.
9370    
9371     * extensions/thuban/wxproj.cpp (check_version): Checks the given
9372     version against what wxproj was compiled with.
9373     (check_version_gtk): If wxproj was compiled with gtk then check
9374     the given version against the version of the gtk library
9375     currently being used.
9376    
9377 bh 538 2003-03-14 Bernhard Herzog <[email protected]>
9378    
9379     * test/test_command.py: Run the tests when the module is run as a
9380     script
9381    
9382     2003-03-14 Bernhard Herzog <[email protected]>
9383    
9384     Implement selection of multiple selected shapes in the same layer:
9385    
9386     - Introduce a new class to hold the selection. This basically
9387     replaces the interactor which was nothing more than the
9388     selection anyway. A major difference is of course that the new
9389     selection class supports multiple selected shapes in one layer
9390    
9391     - Move the object that represents the selection from the
9392     application to the canvas. The canvas is a better place than the
9393     application because the selection represents which shapes and
9394     layer of the map displayed by the canvas are selected and
9395     affects how the map is drawn.
9396    
9397     - Make the selection and its messages publicly available through
9398     the mainwindow.
9399    
9400     - The non-modal dialogs do not get a reference to the interactor
9401     anymore as they can simply refer to their parent, the
9402     mainwindow, for the what the interactor had to offer.
9403    
9404     * Thuban/UI/selection.py: New module with a class to represent the
9405     selection.
9406    
9407     * Thuban/UI/messages.py (SELECTED_TABLE, SELECTED_MAP): Remove
9408     these unused messages
9409    
9410     * Thuban/UI/application.py (ThubanApplication.OnInit)
9411     (ThubanApplication.OnExit, ThubanApplication.SetSession): The
9412     interactor is gone now.
9413     (ThubanApplication.CreateMainWindow): There is no interactor
9414     anymore so we pass None as the interactor argument for now for
9415     compatibility.
9416    
9417     * Thuban/UI/view.py (MapCanvas.delegated_messages)
9418     (MapCanvas.Subscribe, MapCanvas.Unsubscribe): In Subscribe and
9419     Unsubscribe, delegate messages according to the delegated_messages
9420     class variable.
9421     (MapCanvas.__getattr__, MapCanvas.delegated_methods): Get some
9422     attributes from instance variables as described with the
9423     delegated_methods class variable.
9424     (MapCanvas.__init__): New instance variable selection holding the
9425     current selection
9426     (MapCanvas.do_redraw): Deal with multiple selected shapes. Simply
9427     pass them on to the renderer
9428     (MapCanvas.SetMap): Clear the selection when a different map is
9429     selected.
9430     (MapCanvas.shape_selected): Simple force a complete redraw. The
9431     selection class now takes care of only issueing SHAPES_SELECTED
9432     messages when the set of selected shapes actually does change.
9433     (MapCanvas.SelectShapeAt): The selection is now managed in
9434     self.selection
9435    
9436     * Thuban/UI/mainwindow.py (MainWindow.delegated_messages)
9437     (MainWindow.Subscribe, MainWindow.Unsubscribe): In Subscribe and
9438     Unsubscribe, delegate messages according to the delegated_messages
9439     class variable.
9440     (MainWindow.delegated_methods, MainWindow.__getattr__): Get some
9441     attributes from instance variables as described with the
9442     delegated_methods class variable.
9443     (MainWindow.__init__): The interactor as ivar is gone. The
9444     parameter is still there for compatibility. The selection messages
9445     now come from the canvas.
9446     (MainWindow.current_layer, MainWindow.has_selected_layer):
9447     Delegate to the the canvas.
9448     (MainWindow.LayerShowTable, MainWindow.Classify)
9449     (MainWindow.identify_view_on_demand): The dialogs don't need the
9450     interactor parameter anymore.
9451    
9452     * Thuban/UI/tableview.py (TableFrame.__init__)
9453     (LayerTableFrame.__init__, LayerTableFrame.OnClose)
9454     (LayerTableFrame.row_selected): The interactor is gone. It's job
9455     from the dialog's point of view is now done by the mainwindow,
9456     i.e. the parent. Subscribe to SHAPES_SELECTED instead
9457     of SELECTED_SHAPE
9458    
9459     * Thuban/UI/dialogs.py (NonModalDialog.__init__): The interactor
9460     is gone. It's job from the dialog's point of view is now done by
9461     the mainwindow, i.e. the parent.
9462    
9463     * Thuban/UI/classifier.py (Classifier.__init__): The interactor is
9464     gone. It's job from the dialog's point of view is now done by the
9465     mainwindow, i.e. the parent.
9466    
9467     * Thuban/UI/tree.py (SessionTreeView.__init__): The interactor is
9468     gone. It's job from the dialog's point of view is now done by the
9469     mainwindow, i.e. the parent.
9470     (SessionTreeCtrl.__init__): New parameter mainwindow which is
9471     stored as self.mainwindow. The mainwindow is need so that the tree
9472     can still subscribe to the selection messages.
9473     (SessionTreeCtrl.__init__, SessionTreeCtrl.unsubscribe_all)
9474     (SessionTreeCtrl.update_tree, SessionTreeCtrl.OnSelChanged): The
9475     selection is now accessible through the mainwindow. Subscribe to
9476     SHAPES_SELECTED instead of SELECTED_SHAPE
9477    
9478     * Thuban/UI/identifyview.py (IdentifyView.__init__): Use the
9479     SHAPES_SELECTED message now.
9480     (IdentifyView.selected_shape): Now subscribed to SHAPES_SELECTED,
9481     so deal with multiple shapes
9482     (IdentifyView.__init__, IdentifyView.OnClose): The interactor is
9483     gone. It's job from the dialog's point of view is now done by the
9484     mainwindow, i.e. the parent.
9485    
9486     * Thuban/UI/controls.py (RecordListCtrl.fill_list): The second
9487     parameter is now a list of shape ids.
9488     (RecordTable.SetTable): The second parameter is now a list of
9489     indices.
9490    
9491     * Thuban/UI/renderer.py (ScreenRenderer.RenderMap): Rename the
9492     selected_shape parameter and ivar to selected_shapes. It's now a
9493     list of shape ids.
9494     (MapRenderer.draw_label_layer): Deal with multiple selected
9495     shapes. Rearrange the code a bit so that the setup and shape type
9496     distinctions are only executed once.
9497    
9498     * test/test_selection.py: Test cases for the selection class
9499    
9500 jonathan 527 2003-03-11 Jonathan Coles <[email protected]>
9501    
9502     * Thuban/Model/load.py: Temporary fix so that the xml reader
9503     doesn't cause Thuban to crash.
9504    
9505     * Thuban/Model/layer.py: Handle the cyclic references between
9506     a layer and its classification better, and be sure to disconnect
9507     the classification from the layer when the layer is destroyed
9508     so that we don't maintain a cyclic reference that may not be
9509     garbage collected.
9510    
9511     * Thuban/Model/classification.py: See comment for layer.py.
9512    
9513 jan 523 2003-03-12 Jan-Oliver Wagner <[email protected]>
9514    
9515     * HOWTO-Release: New. Information on the steps for releasing
9516     a new version of Thuban.
9517    
9518 jonathan 514 2003-03-11 Jonathan Coles <[email protected]>
9519    
9520     * Thuban/UI/classifier.py: Add normal border to SelectPropertiesDialog.
9521     Use True instead of true.
9522     (Classifier): Should have a single panel in which all the controls lie.
9523    
9524     * Thuban/UI/proj4dialog.py: Add normal border.
9525    
9526     * Thuban/UI/tree.py: Fixed problem with bad item images under Windows.
9527    
9528     * Thuban/UI/mainwindow.py: Use True instead of true.
9529    
9530     * setup.py: Update some definitions to use wxWindows2.4 files
9531    
9532     * Data/iceland_sample_class.thuban: Fixed file so that the
9533     field_type information is present.
9534    
9535 jonathan 490 2003-03-10 Jonathan Coles <[email protected]>
9536    
9537 jonathan 505 * Thuban/UI/classifier.py (Classifier.__init__): Make the
9538     field type label grow so that when the text changes the
9539     size is updated correctly. This may be a wxWindows bug.
9540    
9541     2003-03-10 Jonathan Coles <[email protected]>
9542    
9543 jonathan 499 * Thuban/UI/application.py: Changed SESSION_CHANGED to
9544     SESSION_REPLACED.
9545    
9546     * Thuban/UI/classifier.py: Wrap text with _().
9547     (ClassGrid.CreateTable): Set dimensions and size hints here,
9548     instead of in Reset, so we only set the size once.
9549    
9550     * Thuban/UI/dialogs.py: Don't need Shutdown(); just use Close()!
9551    
9552     * Thuban/UI/mainwindow.py (MainWindow.prepare_new_session):
9553     Call Close() instead of Shutdown().
9554    
9555     * Thuban/UI/messages.py: Changed SESSION_CHANGED to SESSION_REPLACED.
9556    
9557     * Thuban/UI/tree.py: Changed SESSION_CHANGED to SESSION_REPLACED.
9558     Go back to using OnClose() instead of Shutdown().
9559    
9560     2003-03-10 Jonathan Coles <[email protected]>
9561    
9562 jonathan 497 * Thuban/UI/classifier.py (Classifier): SelectField() needed
9563     to know the old field index as well as the new one.
9564    
9565     2003-03-10 Jonathan Coles <[email protected]>
9566    
9567 jonathan 495 * Thuban/UI/classifier.py (Classifier): Use __SelectField()
9568     to correctly set the table information and call this from
9569     __init__ and from _OnFieldSelect so that all the information
9570     is up to date when the dialog opens and when a field is changed.
9571    
9572     2003-03-10 Jonathan Coles <[email protected]>
9573    
9574 jonathan 490 * Thuban/Model/classification.py (Classification): Don't use
9575     layer's message function directly, use the ClassChanged() method
9576     when then classification changes. SetField/SetFieldType/SetLayer
9577     must keep the information about field name and field type in
9578     sync when an owning layer is set or removed.
9579    
9580     * Thuban/Model/layer.py: Added ClassChanged() so that the
9581     classification can tell the layer when its data has changed.
9582     (Layer.SetClassification): Accepts None as an arguement to
9583     remove the current classification and correctly handles
9584     adding a new classification.
9585    
9586     * Thuban/Model/load.py: Comment out print statement
9587    
9588     * test/test_classification.py, test/test_save.py: New and
9589     improved tests.
9590    
9591 jonathan 483 2003-03-07 Jonathan Coles <[email protected]>
9592    
9593     * Thuban/Model/classification.py: Implemented __copy__ and
9594     __deepcopy__ for ClassGroup* and ClassGroupProperites so
9595     they can easily be copied by the classifier dialog.
9596     (ClassGroupProperites.__init__): The default line color should
9597     have been Color.Black.
9598    
9599     * Thuban/UI/classifier.py: Setting and Getting table values now
9600     uses a consistent set of functions.
9601     (Classifier): Now non-modal. Has field type label which changes
9602     as the field changes. Keep track of buttons in a list so that
9603     we can enable/disable the buttons when the None field is selected.
9604     (SelectPropertiesDialog): Add buttons to make the colors transparent.
9605    
9606     * Thuban/UI/dialogs.py (NonModalDialog.Shutdown): New method which
9607     does what OnClose did, but can be called by the application to
9608     close a window. Needed when a session changes, and we have to
9609     close the classifier windows.
9610    
9611     * Thuban/UI/mainwindow.py (MainWindow.prepare_new_session):
9612     Shuts down open dialogs. Used when a new session is created
9613     or a session is opened.
9614     (MainWindow.SaveSession): Should only call application.SaveSession()
9615     if we don't call SaveSessionAs first.
9616     (MainWindow.Classify): Allow different classifier dialogs for
9617     different layers.
9618    
9619     * Thuban/UI/tree.py (SessionTreeView): Remove OnClose and let
9620     the parent class handle it. Add Shutdown() to unsubscibe from
9621     event notification and call the parent Shutdown(). This was
9622     necessary so the application can close the tree window.
9623    
9624 jonathan 478 2003-03-06 Jonathan Coles <[email protected]>
9625    
9626     * Thuban/Model/classification.py: Minor documentation changes,
9627     Addition of __eq__ and __ne__ methods.
9628     (Classification.SetLayer): prevent recursion between this method
9629     and Layer.SetClassification().
9630    
9631     * Thuban/Model/color.py: Addition of __eq__ and __ne__ methods.
9632    
9633     * Thuban/Model/layer.py (SetClassification): prevent recursion
9634     between this method and Classification.SetLayer().
9635    
9636     * test/test_classification.py, test/test_load.py,
9637     test/test_session.py: Fixed and added tests for the classification
9638     classes.
9639    
9640 bh 477 2003-03-06 Bernhard Herzog <[email protected]>
9641    
9642     * Thuban/UI/classifier.py (ClassGrid.__init__)
9643     (ClassGrid.CreateTable): Move the SetSelectionMode call to
9644     CreateTable because otherwise it triggers an assertion in
9645     wxPython/wxGTK 2.4.
9646    
9647 jonathan 459 2003-03-05 Jonathan Coles <[email protected]>
9648    
9649 jonathan 475 * Thuban/common.py: Move FIELDTYPE constants back to table.py.
9650 jonathan 471
9651 jonathan 475 * Thuban/Model/load.py: import FIELDTYPE constants from table.
9652 jonathan 471
9653 jonathan 475 * Thuban/UI/classifier.py: import FIELDTYPE constants from table.
9654 jonathan 471
9655 jonathan 475 * Thuban/Model/table.py: Put FIELDTYPE constants back.
9656 jonathan 471
9657     2003-03-05 Jonathan Coles <[email protected]>
9658    
9659 jonathan 459 * Thuban/UI/classifier.py: Added class documentation.
9660     Fixed RTbug #1713, #1714. Added Move[Up|Down] buttons.
9661     Store just the groups in the table and generate the other
9662     column information when it is requested. Add "None" field
9663     to pull-down to select no classification.
9664    
9665     * Thuban/common.py: Moved FIELDTYPE constants from table.py
9666     (Str2Num): Only catch ValueError exceptions.
9667    
9668     * Thuban/Model/classification.py: Class documentation. Renaming
9669     of methods with Stroke to Line. Groups are stored in a single
9670     list with the default as the first element. Groups are searched
9671     in the order they appear in the list.
9672    
9673     * Thuban/Model/color.py: Documentation.
9674    
9675     * Thuban/Model/layer.py (Layer): Add GetFieldType to retreive
9676     the kind of data represented by a field.
9677    
9678     * Thuban/Model/load.py (ProcessSession): Use proper string
9679     conversion function; fixes RTbug #1713.
9680    
9681     * Thuban/Model/save.py (Saver): Store field type information.
9682    
9683     * Thuban/Model/table.py: Put FIELDTYPE constants in common.py.
9684     (Table): Add field_info_by_name() to retrieve field information
9685     by specifying the field name, not the number.
9686    
9687     * Thuban/UI/mainwindow.py: Function name changes.
9688    
9689     * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Only
9690     get the layer classification once. Don't try to classify
9691     values when the field is None: just use the default properties.
9692    
9693     * Thuban/UI/view.py: Function name changes.
9694    
9695     * Doc/thuban.dtd: Add field_type attribute to a classification.
9696    
9697 bh 456 2003-03-04 Bernhard Herzog <[email protected]>
9698    
9699 bh 458 * Doc/thuban.dtd: Use correct syntax for optional attributes. Make
9700     the fill and stroke layer attributes optional with suitable
9701     default values. Add the stroke_width layer attribute. Use correct
9702     syntax for empty elements. Make the attribute list for labels
9703     refer to the label element.
9704    
9705     2003-03-04 Bernhard Herzog <[email protected]>
9706    
9707 bh 456 * setup.py (thuban_build_py.build): Add a comment about distutils in
9708     Python 2.3 containing some of the functionality we implement in
9709     setup.py ourselves.
9710    
9711     * Thuban/UI/classifier.py (ClassGrid.__init__): Set the table
9712     before the selection mode. Doing it the other way round triggers
9713     an assertion in wxWindows.
9714    
9715     * Thuban/Model/save.py (escape): Fix typo in doc-string
9716    
9717     * Thuban/Model/classification.py: Remove unnecessary wxPython
9718     import
9719    
9720 jonathan 448 2003-03-04 Jonathan Coles <[email protected]>
9721    
9722     * Thuban/Model/classification.py (ClassGroupRange.GetProperties):
9723     Parameter 'value' should default to None.
9724    
9725     * Thuban/UI/mainwindow.py: Use Layer.GetClassification() since
9726     the class attribute __classification is now private.
9727    
9728     * Thuban/UI/classifier.py (ClassGrid): Moved OnCellDClick() from
9729     Classifier to ClassGrid. Added support for removing selected rows,
9730     which including code for keeping track of when cells are selected,
9731     and deselected.
9732     (ClassTable): Support for added/removing rows. Fixed a problem
9733     with __ParseInput whereby it would not allow strings (only numbers)
9734     to be entered.
9735     (Classifier): Added button and supporting code for removing
9736     selected rows.
9737    
9738 jonathan 445 2003-02-27 Jonathan Coles <[email protected]>
9739 jonathan 434
9740     * Thuban/common.py: Moved color conversion functions into
9741     Thuban/UI/common.py.
9742     (Str2Num): Now converts the float (not the string) to a long/int
9743     so that an exception isn't thrown.
9744    
9745     * Thuban/UI/common.py: Common functions used in several UI modules
9746    
9747     * Thuban/Model/classification.py: Changed the class hierarchy
9748     so that a Classification consists of Groups which return
9749     Properties when a value matches a Group.
9750    
9751     * Thuban/Model/layer.py: Fixed name resolution problem.
9752    
9753     * Thuban/Model/load.py: Use new Classification and Group functions.
9754    
9755     * Thuban/Model/save.py (Saver.write_attribs): Fixes a test case
9756     failure.
9757     (Saver.write_classification): Use new Classification and Group
9758     functions.
9759    
9760     * Thuban/UI/classifier.py: Changes to use new Classification and Group
9761 jonathan 445 functions. Fix to create a tuple with a single value instead of
9762     simply returning the value.
9763 jonathan 434
9764     * Thuban/UI/renderer.py: Use new Classification and Group functions.
9765     Use common.py functions.
9766    
9767 jonathan 445 * Thuban/UI/tree.py: Use common.py functions.
9768 jonathan 447
9769     * test/test_classification.py: Use new Classification and Group
9770     classes.
9771 jonathan 434
9772 jonathan 426 2003-02-24 Jonathan Coles <[email protected]>
9773    
9774     * Thuban/common.py (Color2wxColour, wxColour2Color): Conversion
9775     functions from Thuban color objects to wxWindow colour objects.
9776    
9777     * Thuban/Model/classification.py (Classification): Renamed
9778     GetProperties() to GetClassData(). Used the new iterator
9779     in TreeInfo().
9780     (ClassIterator): Iterator implementation to iterate over the
9781     ClassData objects in a classification object.
9782    
9783     * Thuban/Model/save.py (Saver.write_classificaton): Uses
9784     the new iterator to save the classification information.
9785    
9786     * Thuban/UI/classifier.py (SelectPropertiesDialog): Support
9787     for changing the stroke and fill colors and previewing the
9788     changes.
9789    
9790     * Thuban/UI/mainwindow.py (MainWindow.OpenSession,
9791     MainWindow.SaveSessionAs): Text string changes so the dialogs
9792     have more meaningful titles.
9793    
9794     * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Change
9795     Classification method name from GetProperties to GetClassData.
9796    
9797     * Thuban/UI/view.py (MapCanvas.find_shape_at): Use method calls
9798     instead of accessing now non-existent class variables.
9799    
9800 bh 425 2003-02-24 Bernhard Herzog <[email protected]>
9801    
9802     * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Remove
9803     unneeded Shape() call. Rendering is substantially faster without
9804     it and it avoids some problems with broken shape files.
9805    
9806 frank 423 2003-02-20 Frank Koormann <[email protected]>
9807    
9808     Force minimal size of identify and label dialogs. The autosizing
9809     looked too ugly.
9810    
9811     * Thuban/UI/controls.py (RecordListCtrl): Set minimal width for columns.
9812     * Thuban/UI/labeldialog.py (LabelDialog.dialog_layout):
9813     Set size of listctrl.
9814     * Thuban/UI/identifyview.py (IdentifyView.__init__):
9815     Set size of dialog.
9816    
9817 jonathan 408 2003-02-19 Jonathan Coles <[email protected]>
9818    
9819     * test/test_classification.py, test/test_layer.py,
9820     test/test_load.py, test/test_map.py, test/test_session.py:
9821     Updated the tests to use the new functions that are in the
9822     respective classes.
9823    
9824     * Thuban/Model/classification.py (Classification):
9825     Uses the new ClassData* classes. Modification messages are
9826     passed up to the parent layer (if it exists).
9827     (ClassData): New class to encapsulate the common data in each
9828     classification property.
9829     (ClassDataDefault): Represents the Default class. data.
9830     (ClassDataPoint): Represents a single class. data point
9831     (ClassDataRange): Represents a class. range
9832     (ClassDataMap): Represents a class. map (unused).
9833    
9834     * Thuban/Model/color.py: Added Color.None to represent something
9835     with no color. Color.Black represents the color black.
9836     (NoColor): Helper class derived from Color to represent something
9837     with no color.
9838    
9839     * Thuban/Model/layer.py (Layer): Removed references to fill, stroke,
9840     stroke_width attributes. Made the 'classification' attribute private.
9841     New methods for setting/getting the classification.
9842    
9843     * Thuban/Model/load.py (ProcessSession): Use new methods on Layer
9844     to get the classifcation and use the new ClassData* classes to
9845     hold the classification data. Use Str2Num to convert numbers
9846     properly.
9847    
9848     * Thuban/Model/save.py (Saver): Use new Color and Classification
9849     methods
9850    
9851     * Thuban/UI/classifier.py (ClassGrid): New class to represent a
9852     custom grid.
9853     (ClassTable): Support for editing Values and Labels and for
9854     changing what type (point or range) of data is stored in each
9855     property based on how the user enters the data.
9856     (Classifier): Support for saving the new classifications and
9857     launching the dialog to edit a property.
9858     (SelectPropertiesDialog): New class for editing the visual
9859     properties of a classification (stroke color, width, and fill color)
9860     (ClassPreviewer): Took the Draw method from ClassRenderer and
9861     made most of it into this new class. Intend to use this class in
9862     the SelectPropertiesDialog for previewing changes.
9863    
9864     * Thuban/UI/renderer.py: Use new Color and Classification methods.
9865    
9866     * Thuban/UI/tree.py: Formatting changes.
9867    
9868     * Doc/thuban.dtd: Add 'label' element
9869    
9870     * Thuban/common.py: New. Contains common routines used throughout
9871     the code.
9872     (Str2Num): Takes a string and converts it to the "best" type of
9873     number.
9874    
9875 bh 405 2003-02-14 Bernhard Herzog <[email protected]>
9876    
9877     * Thuban/UI/view.py (MapCanvas.OnLeftUp): Make sure that the
9878     dragging flag is always set to 0 even when the tool implementation
9879     raises an exception
9880    
9881 bh 402 2003-02-11 Bernhard Herzog <[email protected]>
9882    
9883     * Thuban/UI/application.py (ThubanApplication.splash_screen): New
9884     method to create a splash screen.
9885     (ThubanApplication.ShowMainWindow): New. Show the main window.
9886     Needed so the splash screen can display the mainwindow
9887     (ThubanApplication.OnInit): Call the
9888     new splash_screen method to determine whether the application
9889     should display a splash screen. If it displays a splash screen do
9890     not immediately show the main window.
9891    
9892 jonathan 399 2003-02-11 Jonathan Coles <[email protected]>
9893    
9894     * Thuban/Model/classification.py: Added import line to fix
9895     feature conflicts between running on python2.2 and python2.1.
9896    
9897     * Thuban/UI/classifier.py (ClassTable): Didn't need to hang
9898     onto the clinfo parameter, so removed the deepcopy().
9899    
9900 jonathan 396 2003-02-10 Jonathan Coles <[email protected]>
9901    
9902 tkoester 403 * Thuban/Model/save.py (Saver.open_element, Saver.close_element):
9903 jonathan 396 Added element_open variable to track opening and closing of tags
9904     so that tags that don't span more than one line are closed with
9905     /> instead of </tag_name>. Use the GetDefault*() methods of
9906     the Classification class.
9907    
9908     * Thuban/Model/classification.py (Classificaton): Added set and
9909     get methods for the default data. The class also takes a layer
9910     reference so that modification messages can be sent. Fixed the
9911     methods to use the new ClassData class.
9912     (ClassData): New class to encapsulate the classification data
9913    
9914     * Thuban/Model/layer.py (Layer): Remove the
9915 tkoester 403 Set[Fill|Stroke|StrokeWidth]() methods. Code should call the
9916 jonathan 396 SetDefault*() methods on the layer's classification object.
9917 tkoester 403 (Layer.__init__): Use the new SetDefault*() methods in the
9918 jonathan 396 Classification class.
9919    
9920     * Thuban/Model/load.py (ProcessSession): Use the new ClassData
9921     object instead of a dictionary.
9922    
9923 tkoester 403 * Thuban/UI/classifier.py (ClassRenderer): New class to
9924 jonathan 396 draw the classifications in the dialog box's table.
9925     (Classifier): Modified to use the ClassRenderer class.
9926    
9927 tkoester 403 * Thuban/UI/mainwindow.py (MainWindow): Use the SetDefault*()
9928     methods of the Classification class.
9929 jonathan 396
9930     * Thuban/UI/renderer.py (MapRenderer): Use the Get*() methods
9931     of the ClassData class.
9932    
9933     * test/test_classification.py, test/test_layer.py,
9934     test/test_map.py, test/test_session.py: Fix the tests to work
9935     with the above code changes.
9936    
9937 jonathan 387 2003-02-03 Jonathan Coles <[email protected]>
9938    
9939     * Thuban/Model/classification.py (Classification): Added getNull()
9940     to return the NullData reference
9941    
9942     * Thuban/Model/layer.py (Layer.SetFill, Layer.SetStroke,
9943     Layer.SetStrokeWidth): Modified these functions to change the
9944     null data in the classification rather than keep these values
9945     directly in the Layer class. Menu options to change these values
9946     work again.
9947    
9948 jonathan 380 2003-01-28 Jonathan Coles <[email protected]>
9949    
9950 jonathan 384 * Thuban/UI/classifier.py (Classifier): Resolved merging conflicts.
9951 tkoester 403 Fixed crashing problem on some systems. Dialog box shows
9952 jonathan 380 classification data.
9953    
9954 jonathan 384 * Thuban/UI/tree.py (SessionTreeCtrl.add_items): Handle drawing
9955     Colors in the tree view.
9956    
9957     * Thuban/Model/layer.py (Layer.TreeInfo): Added a call to build
9958     the tree info for classifications. Commented out unnecessary lines.
9959    
9960     * Thuban/Model/classification.py (Classification.TreeInfo): New
9961     function to add information about the classification into the
9962     tree view.
9963    
9964 tkoester 403 2003-01-27 Jan-Oliver Wagner <[email protected]>
9965 jan 375
9966 tkoester 403 * Thuban/__init__.py (_): New.
9967 jan 375
9968     * Thuban/Model/classification.py, Thuban/Model/extension.py,
9969     Thuban/Model/layer.py, Thuban/Model/load.py, Thuban/Model/map.py,
9970 tkoester 403 Thuban/Model/session.py, Thuban/UI/application.py,
9971     Thuban/UI/classifier.py, Thuban/UI/context.py, Thuban/UI/controls.py,
9972     Thuban/UI/identifyview.py, Thuban/UI/labeldialog.py,
9973     Thuban/UI/mainwindow.py, Thuban/UI/menu.py, Thuban/UI/proj4dialog.py,
9974     Thuban/UI/renderer.py, Thuban/UI/tree.py, Thuban/Lib/connector.py,
9975     Thuban/Lib/fileutil.py: Replace user string by _() for i18n.
9976 jan 375
9977 jonathan 370 2003-01-27 Jonathan Coles <[email protected]>
9978    
9979 tkoester 403 * Thuban/Model/layer.py: Classification initialization calls.
9980 jonathan 370
9981 tkoester 403 * Thuban/Model/classification.py: Created class to encapsulate
9982     a layer classification. Supports specific data points and
9983     ranges.
9984 jonathan 370
9985 tkoester 403 * Thuban/Model/load.py: Added support for loading classification
9986     information.
9987 jonathan 370
9988 tkoester 403 * Thuban/Model/save.py: Added support for saving classification
9989     information.
9990 jonathan 370
9991 tkoester 403 * Thuban/UI/classifier.py: Initial class for a dialog box for
9992     specifying classification information.
9993 jonathan 370
9994 tkoester 403 * Thuban/UI/mainwindows.py: Support for opening the classifier
9995     dialog.
9996 jonathan 370
9997 tkoester 403 * Thuban/UI/renderer.py: Support for drawing a layer with the
9998     classification information.
9999 jonathan 370
10000 tkoester 403 * Data/iceland_sample_class.thuban: iceland_sample with
10001     classification data.
10002 jonathan 370
10003 tkoester 403 * test/test_classification: Tests for the Classification class.
10004 jonathan 370
10005 bh 359 2002-12-09 Bernhard Herzog <[email protected]>
10006    
10007 bh 361 * test/test_command.py: New. Tests for the command classes.
10008    
10009 bh 359 * Thuban/UI/command.py (ToolCommand): New class for tool commands.
10010     (Command.IsTool): New method to distinguish between command
10011     switching tools and other commands.
10012    
10013     * Thuban/UI/view.py (MapCanvas.SelectTool): New method to select
10014     the tool to avoid direct assignments to instance variables
10015     (MapCanvas.ZoomInTool, MapCanvas.ZoomOutTool, MapCanvas.PanTool)
10016     (MapCanvas.IdentifyTool, MapCanvas.LabelTool): Use SelectTool to
10017     change the tool
10018    
10019     * Thuban/UI/mainwindow.py (MainWindow.update_command_ui): If an
10020     active tool's command turns insensitive, disable the tool.
10021     (_tool_command): Use the new ToolCommand class
10022    
10023     * Examples/simple_extensions/simple_tool.py (simple_tool): Use the
10024     SelectTool method to change the tool
10025     (iconfile): Use the ToolCommand class
10026    
10027 bh 354 2002-12-03 Bernhard Herzog <[email protected]>
10028    
10029     * Thuban/UI/tree.py (SessionTreeCtrl.normalize_selection): Handle
10030     the case of selected items that are not children of Layers or Maps
10031     properly. Previously this bug would trigger an assertion in
10032     wxWindows.
10033    
10034 frank 352 2002-11-06 Frank Koormann <[email protected]>
10035    
10036 bh 354 * Thuban/UI/mainwindow.py: Altered the order of tools in the
10037     toolbar: First now are all navigation tools (Zoom In/Out, Pan,
10038     Full Extent).
10039 tkoester 403
10040 bh 349 2002-10-23 Bernhard Herzog <[email protected]>
10041    
10042     * setup.py (setup call): version now 0.1.3
10043    
10044     * MANIFEST.in: Add the files in test/
10045    
10046     * test/README: Add note about tests requiring the iceland data
10047    
10048     * Thuban/UI/mainwindow.py (MainWindow.About): Add 2002 to
10049     copyright notice.
10050    
10051 bh 344 2002-10-18 Bernhard Herzog <[email protected]>
10052    
10053     * test/test_map.py
10054     (TestMapWithContents.test_projected_bounding_box): Use an explicit
10055     epsilon.
10056    
10057     * test/support.py (FloatComparisonMixin.assertFloatEqual)
10058     (FloatComparisonMixin.assertFloatSeqEqual): give a more useful
10059     message if the assertion fails and don't return the return value
10060     of self.assert_. In assertFloatSeqEqual the return meant that not
10061     all items of the sequence were compared.
10062    
10063 bh 326 2002-09-20 Bernhard Herzog <[email protected]>
10064    
10065 bh 341 * test/test_fileutil.py: New. Test cases for Thuban.Lib.fileutil
10066    
10067     * Thuban/Lib/fileutil.py: Fixup some whitespace and typos
10068    
10069 bh 338 * test/test_map.py (TestMapWithContents.test_tree_info): Create
10070     the string with the bounding box on the fly because of platform
10071     differences in the way %g is handled.
10072    
10073     * test/test_layer.py (TestLayer.test_empty_layer): Create an empty
10074     DBFfile too because Thuban layers can't yet cope missing DBF
10075     files.
10076    
10077     2002-09-20 Bernhard Herzog <[email protected]>
10078    
10079 bh 326 * test/test_menu.py: Use initthuban instead of
10080     add_thuban_dir_to_path to initialize Thuban.
10081    
10082     * test/support.py (FloatComparisonMixin.assertFloatEqual): New.
10083     Mixin class for float comparisons
10084     (SubscriberMixin): New. Mixin class to test messages sent through
10085     the Connector class
10086    
10087     * test/README: Fix a typo and add the -v flag to the command for
10088     individual tests
10089    
10090 bh 335 * test/test_session.py: New. Test cases for Thuban.Model.session
10091    
10092     * test/test_proj.py: New. Test cases for Thuban.Model.proj
10093    
10094     * test/test_map.py: New. Test cases for Thuban.Model.map
10095    
10096     * test/test_layer.py: New. Test cases for Thuban.Model.layer
10097    
10098     * test/test_label.py: New. Test cases for Thuban.Model.label
10099    
10100     * test/test_connector.py: New. Test cases for Thuban.Lib.connector
10101    
10102     * test/test_color.py: New. Test cases for Thuban.Model.color
10103    
10104     * test/test_base.py: New. Test cases for Thuban.Model.base
10105    
10106 bh 322 2002-09-13 Bernhard Herzog <[email protected]>
10107    
10108     * Thuban/Model/session.py (Session.forwarded_channels): Forward
10109     the CHANGED channel too.
10110    
10111     * Thuban/Model/map.py (Map.forwarded_channels): Forward the
10112     CHANGED channel too.
10113     (Map.__init__): Call the Modifiable constructor as well.
10114    
10115     * Thuban/Model/base.py (Modifiable.UnsetModified): Issue a CHANGED
10116     event if the modified flag changes.
10117     (Modifiable.changed): Tweak the doc-string.
10118    
10119     * Thuban/UI/mainwindow.py (MainWindow.view_position_changed)
10120     (MainWindow.set_position_text): Put the code that puts the text
10121     with the mouse position into the status bar into the new method
10122     set_position_text so that it can overwritten in derived classes.
10123    
10124 bh 317 2002-09-12 Bernhard Herzog <[email protected]>
10125    
10126     * Thuban/UI/mainwindow.py (MainWindow.RunMessageBox): Center the
10127     message box on the main window.
10128    
10129 bh 313 2002-09-11 Bernhard Herzog <[email protected]>
10130    
10131     * Thuban/UI/mainwindow.py: Underline the 'x' in "Exit" instead of
10132     the 'E' because it's less likely to interfere with other menu
10133     entries.
10134 bh 315 (MainWindow.build_menu): remove an incorrect comment.
10135 bh 313
10136 bh 311 2002-09-10 Bernhard Herzog <[email protected]>
10137    
10138     * Thuban/UI/mainwindow.py (MainWindow.Map): New.
10139     (_tool_command): Add sensitive parameter
10140     (_has_visible_map): Sensitivity callback to tools and other
10141     commands that require a visible map. Use it in map_zoom_in_tool,
10142     map_zoom_out_tool, map_pan_tool, map_identify_tool, map_label_tool
10143     and map_full_extent
10144    
10145 bh 308 2002-09-06 Bernhard Herzog <[email protected]>
10146    
10147     * Thuban/UI/mainwindow.py (MainWindow.OnClose): Unsubscribe
10148     VIEW_POSITION
10149    
10150 tkoester 403 2002-09-04 Frank Koormann <[email protected]>
10151 frank 306
10152     * Resources/Bitmaps/fullextent.xpm: Updated Icon (removed "potatoe")
10153    
10154 bh 302 2002-09-02 Bernhard Herzog <[email protected]>
10155    
10156 bh 304 * Thuban/UI/view.py: Get rid of the idle redraw. This is done by
10157     wxWindows already and our implementation doesn't work correctly
10158     with wxGTK 2.3:
10159     (MapCanvas.__init__): Remove the instance variable
10160     (MapCanvas.OnPaint): Always call do_redraw when there's a map to
10161     be drawin
10162     (MapCanvas.OnIdle): Removed.
10163    
10164 bh 302 * Thuban/UI/view.py (MapCanvas.unprojected_rect_around_point): Add
10165     a parameter to determine the size of the rectangle.
10166     (MapCanvas.find_shape_at): Create the box around the point on a
10167     layer by layer basis and make the size depend on the shape type.
10168     This solves a problem with the selection of point shapes at the
10169     border of the layer's bounding box
10170    
10171 bh 292 2002-08-30 Bernhard Herzog <[email protected]>
10172    
10173 bh 300 * Thuban/UI/mainwindow.py (MainWindow.CanRemoveLayer): New method
10174     for the sensitivity of remove layer.
10175     (_can_remove_layer): New. Sensitivity callback for remove layer
10176     (Command layer_remove): Use _can_remove_layer
10177    
10178     * Thuban/Model/map.py (Map.CanRemoveLayer): New method to
10179     determine whether a given layer can be deleted.
10180    
10181 bh 297 * Thuban/UI/view.py (MapCanvas.__init__, MapCanvas.OnPaint)
10182     (MapCanvas.do_redraw): Get rid of the unused update_region
10183     instance variable
10184    
10185 bh 294 * Thuban/UI/view.py: Add/update some doc-strings.
10186    
10187 bh 292 * test/: new subdirectory with a bunch of unit tests.
10188    
10189     * test/README, test/test_table.py, test/test_save.py,
10190     test/test_menu.py, test/test_load.py: Initial set of tests and
10191     brief instructions on how to run them
10192    
10193 bh 287 2002-08-29 Bernhard Herzog <[email protected]>
10194    
10195 bh 291 * Thuban/UI/renderer.py (ScreenRenderer.draw_shape_layer): Handle
10196     arcs with multiple parts.
10197    
10198 bh 289 * Thuban/UI/view.py (ZoomInTool.MouseUp, ZoomOutTool.MouseUp):
10199     Handle degenrate rectangles.
10200    
10201 bh 287 * Thuban/Model/table.py: Make writing records work correctly:
10202     (Table.__init__): Keep track of whether the DBF is open for
10203     writing
10204     (Table.write_record): Open the DBF file for writing when necessary
10205    
10206 bh 285 2002-08-27 Bernhard Herzog <[email protected]>
10207    
10208     * Thuban/Model/table.py (Table.write_record, Table.__init__): Open
10209     dbf files only for reading by default. Use a new writable dbf
10210     object for writing.
10211    
10212 bh 278 2002-08-26 Bernhard Herzog <[email protected]>
10213    
10214 bh 282 * Thuban/UI/mainwindow.py: Refactor the context creation:
10215     (MainWindow.Context): New method to return a context
10216     (MainWindow.invoke_command, MainWindow.update_command_ui): Use the
10217     new method
10218    
10219 bh 278 * Thuban/UI/tableview.py (TableGrid, LayerTableGrid): Split the
10220     layer table specific code from TableGrid into LayerTableGrid
10221     (TableFrame, LayerTableFrame): Split the layer table specific code
10222     from TableFrame into LayerTableFrame
10223 bh 280 (LayerTableGrid.select_shape): Remove a debug print
10224 bh 278
10225     * Thuban/UI/mainwindow.py (MainWindow.LayerShowTable): Use the
10226     LayerTableFrame
10227    
10228 bh 277 2002-08-23 Bernhard Herzog <[email protected]>
10229    
10230     * Thuban/Model/layer.py (Layer.__init__): Make sure we have an
10231     absolute filename.
10232    
10233 bh 269 2002-08-22 Bernhard Herzog <[email protected]>
10234    
10235 bh 275 * Thuban/Model/table.py (Table.write_record): New method to write
10236     records.
10237 tkoester 403 (Table.__init__): Open the DBF file for writing too.
10238 bh 275
10239     * Thuban/UI/controls.py (RecordTable.SetValue): Write the value
10240     into the underlying table.
10241    
10242     * extensions/shapelib/shapefil.h (DBFCommit),
10243     extensions/shapelib/dbfopen.c (DBFCommit): New API function to
10244     commit any changes made to the DBF file.
10245    
10246 bh 271 * Thuban/UI/mainwindow.py (make_check_current_tool)
10247     (_tool_command): Put the code that generates the "checked"
10248     callback into a separate function so that we can reuse it
10249     elsewhere
10250    
10251 bh 269 * Thuban/Model/save.py (Saver): New class to handle serializing a
10252     session into an XML file. The main reason to introduce a class is
10253     that applications built on Thuban can derive from it so that they
10254     can save additional information in a session file.
10255     (save_session): Delegate almost all the work to the Saver class.
10256     Rename the filename argument to file because it may be a file like
10257     object now.
10258    
10259     * Thuban/Model/load.py: Get rid of the Python 1.5.2 compatibility
10260     code. Remove the little test code which would be executed when the
10261     module is run as a script which didn't work anymore since it can't
10262     import the other Thuban modules.
10263     (ProcessSession, load_session): Refactor the ProcessSession to
10264     have one method for each element start and end tag so that derived
10265     classes can easily override the processing of individual tags.
10266     Also, always parse with namespaces enabled because applications
10267     built on top of Thuban will likely use namespaces if they extend
10268     the session file format.
10269    
10270 bh 266 2002-08-21 Bernhard Herzog <[email protected]>
10271    
10272     * setup.py (ThubanInstall.run): Don't repr install_lib_orig
10273     because thubaninit_contents will do it for us.
10274    
10275 tkoester 403 2002-08-16 Jan-Oliver Wagner <[email protected]>
10276 jan 265
10277     * Thuban/UI/mainwindow.py: menu item 'show session tree' now disable if
10278     tree window already open
10279    
10280 bh 259 2002-08-15 Bernhard Herzog <[email protected]>
10281    
10282 bh 263 * Thuban/Model/layer.py (Layer.Destroy): Call the unboundd method
10283     with self.
10284    
10285     * Thuban/UI/view.py (MapCanvas.OnLeftUp): Only release the mouse
10286     when we have actually captured it.
10287    
10288 bh 259 * Thuban/Model/layer.py (Layer.Destroy): New. Explicitly close the
10289     shapefile and destroy the table.
10290    
10291     * Thuban/Model/table.py (Table.Destroy): New. Close the DBF file.
10292    
10293 bh 254 2002-08-14 Bernhard Herzog <[email protected]>
10294    
10295 bh 256 * Thuban/UI/controls.py (RecordTable.__init__): Remove the unused
10296     instance variable columns
10297     (RecordTable.GetTypeName): row and col may be negative in some
10298     cases.
10299    
10300 bh 254 * setup.py (InstallLocal.initialize_options)
10301     (InstallLocal.finalize_options, InstallLocal.user_options): New
10302     option create-init-file to build a thubaninit.py when running
10303     install_local
10304     (InstallLocal.run): Create the thubaninit.py module when requested
10305     (thubaninit_contents): Split the template into several parts and
10306     create a new function thubaninit_contents that creates the
10307     contents of a thubaninit module.
10308     (ThubanInstall.run): Use the new function to create the thubaninit
10309     module.
10310    
10311 bh 252 2002-07-30 Bernhard Herzog <[email protected]>
10312    
10313     * Thuban/UI/application.py (ThubanApplication.OnExit): Do some
10314     cleanup.
10315     (ThubanApplication.MainLoop): Extend to automatically call OnExit.
10316    
10317     * Thuban/Model/session.py (Session.Destroy): Don't bypass the
10318     direct base class' Destroy method.
10319    
10320     * Thuban/Model/map.py (Map.ClearLayers): New method to delete all
10321     layers.
10322     (Map.Destroy): Destroy the label_layer as well and call the
10323     inherited Desatroymethod first so that no more messages are
10324     issued.
10325     (Map.RaiseLayer, Map.LowerLayer): Only issue LAYERS_CHANGED
10326     message if the stacking order actually has changed. Add
10327     doc-strings.
10328     (Map.BoundingBox): Correct the doc-string.
10329     (Map.AddLayer, Map.RemoveLayer, Map.Layers, Map.HasLayers)
10330     (Map.ProjectedBoundingBox, Map.SetProjection): Add doc-strings.
10331    
10332     * Thuban/Model/label.py (LabelLayer.ClearLabels): New to delete
10333     all labels.
10334    
10335 bh 247 2002-07-29 Bernhard Herzog <[email protected]>
10336    
10337     * Thuban/Model/map.py (Map.subscribe_layer_channels)
10338     (Map.unsubscribe_layer_channels): Put the code that (un)subscribes
10339     to a layer's channels into separate methods.
10340     (Map.RemoveLayer, Map.AddLayer): Call the new methods
10341     (Map.Destroy): Unsubscribe from a layer's channels before
10342     destroying it.
10343    
10344     * Thuban/UI/view.py (MapCanvas.find_shape_at): Change the
10345     selected_layer parameter to searched_layer which is the layer to
10346     search in.
10347     (MapCanvas.SelectShapeAt): New parameter layer to restrict the
10348     search to that layer. Return the selected layer and shape.
10349    
10350     * Examples/simple_extensions/simple_tool.py (simple_tool): Fix a
10351     typo
10352    
10353 bh 238 2002-07-24 Bernhard Herzog <[email protected]>
10354    
10355 bh 243 * Thuban/UI/application.py (ThubanApplication.create_session):
10356     Extend the doc string.
10357     (ThubanApplication.subscribe_session)
10358     (ThubanApplication.unsubscribe_session): New methods to
10359     subscribe/unsubscribe to/from session channels.
10360     (ThubanApplication.SetSession): Call the new methods here.
10361     (ThubanApplication.maps_changed, ThubanApplication.set_map):
10362     Renamed set_map to maps_changed. Its now a subscriber for
10363     MAPS_CHANGED.
10364    
10365     * Thuban/UI/view.py (ZoomOutTool.MouseUp): Use the correct
10366     x-coordinate in case of simple clicks
10367    
10368     * Thuban/Model/base.py (Modifiable.changed): Apply the args tuple,
10369     don't pass it as a parameter
10370    
10371     * Thuban/Model/session.py (Session.RemoveMap): New
10372    
10373 bh 238 * Thuban/UI/mainwindow.py (MainWindow.__init__): Turn the initial
10374     window size into a parameter.
10375    
10376 bh 235 2002-07-23 Bernhard Herzog <[email protected]>
10377    
10378 bh 237 * Thuban/UI/menu.py (Menu.item_index): Also search for menus not
10379     just commands.
10380    
10381 bh 235 * Thuban/UI/mainwindow.py (MainWindow.__init__): Change the
10382     parameter list a bit to allow setting the window title and the
10383     initial message in the status bar. Update the callers.
10384    
10385     * Thuban/UI/application.py (ThubanApplication.OnInit)
10386     (ThubanApplication.CreateMainWindow): Put the mainwindow
10387     instantiation into a separate method so that it can be overridden
10388     by a subclass.
10389    
10390 bh 230 2002-07-19 Bernhard Herzog <[email protected]>
10391    
10392 bh 234 * Thuban/Model/session.py: Issue a CHANGED message every time
10393     another changed message is issued to make it easier to get
10394     notified of changes.
10395     (Session): Update the doc string
10396     (Session.forward): Issue changed-events as CHANGED as well.
10397     (Session.changed): Overwrite the inherited version to issue
10398     CHANGED events as well.
10399    
10400     * Thuban/UI/tree.py: We can now simply subscribe to the session's
10401     CHANGED channel to be informed of changes.
10402     (SessionTreeCtrl.session_channels): Not needed any longer.
10403 tkoester 403 (SessionTreeCtrl.unsubscribe_all, SessionTreeCtrl.session_changed):
10404 bh 234 Only have to (un)subscribe CHANGED
10405    
10406     * Thuban/Model/map.py (Map.TreeInfo): Deal better with empty maps.
10407    
10408 bh 230 * Thuban/UI/main.py, Thuban/UI/__init__.py: Move the work-around
10409     for the wxPython locale bug to __init__.py so that it's
10410     automatically executed by anybody using UI code from Thuban.
10411    
10412 bh 225 2002-07-18 Bernhard Herzog <[email protected]>
10413    
10414 bh 228 * Thuban/UI/main.py (main): app no longer needs to be global
10415    
10416     * Thuban/UI/mainwindow.py (MainWindow.__init__): Add application
10417     as parameter and store it in an instance variable
10418     (MainWindow.invoke_command, MainWindow.update_command_ui)
10419     (MainWindow.save_modified_session, MainWindow.NewSession)
10420     (MainWindow.OpenSession, MainWindow.SaveSession)
10421     (MainWindow.SaveSessionAs, MainWindow.ShowSessionTree): Use self's
10422     application object.
10423    
10424     * Thuban/UI/application.py (ThubanApplication.OnInit): Instantiate
10425     the main window with self.
10426    
10427 bh 225 * Thuban/UI/context.py: New module with the context class
10428    
10429     * Thuban/UI/command.py (Command): Update doc string.
10430    
10431     * Thuban/UI/mainwindow.py (MainWindow.invoke_command,
10432     MainWindow.update_command_ui): Pass an instance of the context
10433     class to the command's methods
10434     (check_current_tool, call_method): Handle the new context
10435     implementation
10436    
10437     * Examples/simple_extensions/simple_tool.py (simple_tool,
10438     check_simple_tool): Handle the new context implementation
10439    
10440     * Examples/simple_extensions/simple_command.py (simple_command):
10441     Handle the new context implementation. Update the comments about
10442     the context.
10443    
10444     * Thuban/UI/application.py (ThubanApplication.SetSession): Add
10445     doc-string
10446     (ThubanApplication.Session): New method to return the session
10447     object
10448    
10449     * Thuban/UI/tree.py (SessionTreeCtrl.update_tree): The
10450     interactor's selected_layer may not be a layer of the current
10451     session when the tree is updated while a new session is being set.
10452    
10453 bh 217 2002-07-17 Bernhard Herzog <[email protected]>
10454    
10455     * Thuban/UI/tree.py (color_string): Removed. No longer used.
10456     (SessionTreeCtrl.update_tree, SessionTreeCtrl.add_items): Split
10457     update_tree into update_tree and add_items. The tree now uses a
10458     more generic way to display the contents of the tree.
10459     (SessionTreeCtrl): Add a doc string explaining the TreeInfo method
10460    
10461     * Thuban/Model/layer.py (Layer.TreeInfo),
10462     Thuban/Model/extension.py (Extension.TreeInfo),
10463     Thuban/Model/map.py (Map.TreeInfo),
10464 tkoester 403 Thuban/Model/session.py (Session.TreeInfo):
10465 bh 217 Add TreeInfo methods to implement the new tree view update scheme
10466    
10467 bh 216 2002-07-16 Bernhard Herzog <[email protected]>
10468    
10469     * Thuban/UI/application.py: Don't use "import from" for the
10470     MainWindow. It can't always be resolved.
10471     (ThubanApplication.OnInit): change reference to MainWindow
10472     accordingly.
10473    
10474     * Thuban/UI/menu.py (Menu.SetItems): New method to replace a menu
10475     completely
10476    
10477 bh 213 2002-07-10 Bernhard Herzog <[email protected]>
10478    
10479     * setup.py (create_init_module): New configurable variable whose
10480     default depends on the platform we're running on.
10481     (ThubanInstall.initialize_options): Initialize
10482     self.create_init_module from the global create_init_module
10483     (ThubanInstall.user_options): indictate that the options
10484     create-init-module and init-module-dir have arguments.
10485    
10486     * setup.py: In the setup call change the version number to include
10487     cvs.
10488    
10489     * MANIFEST.in: Add the files in Examples
10490    
10491 bh 205 2002-07-09 Bernhard Herzog <[email protected]>
10492    
10493 bh 210 * setup.py: In the setup call, use the thuban homepage as the
10494     value of the url parameter.
10495    
10496 bh 208 * Examples: New subdirectory for examples.
10497    
10498     * Examples/simple_extensions/simple_tool.xpm,
10499     Examples/simple_extensions/simple_tool.py,
10500     Examples/simple_extensions/simple_command.py,
10501     Examples/simple_extensions/README: Simple examples showing how to
10502     add new commands and tools.
10503    
10504 bh 207 * setup.cfg (bdist_rpm): Add the default value for prefix and tell
10505     bdist_rpm that we also have an install script.
10506     (bdist_inno): Add 2002 to the copyright notice.
10507    
10508 bh 205 * setup.py: Create a file in python's site-packages directory to
10509     make installation of Thuban as a library easier.
10510     (ThubanInstall.user_options): Add two new options,
10511     create-init-module and init-module-dir
10512     (ThubanInstall.expand_with_pure_python_dirs): New method to expand
10513     filenames for installation in the default directories.
10514     (ThubanInstall.select_scheme, ThubanInstall.convert_paths): Extend
10515     the inherited methods to capture some filenames before they're
10516     transformed too much by distutils.
10517     (ThubanInstall.run): Create the init module if requested.
10518     (ThubanInstall.thuban_init_filename): New method to return the
10519     full name of the init module.
10520     (ThubanInstall.get_outputs): Append the filename of the init
10521     module.
10522    
10523 bh 202 2002-07-08 Bernhard Herzog <[email protected]>
10524    
10525 bh 205 * setup.py (thuban_bdist_rpm): Extend this version of bdist_rpm to
10526     handle the prefix properly which means that the default for the
10527     installation prefix should be /usr for RPMs and /usr/local when
10528     doing a normal source install.
10529     (bdist_rpm_install_script): Script to override the default install
10530     commands in the specfile generated by the bdist_rpm command.
10531     (thuban_bdist_rpm.user_options): Add a prefix option
10532     (thuban_bdist_rpm.initialize_options): Init the prefix option.
10533     Create the script files for the spec files as empty files here
10534     (thuban_bdist_rpm._make_spec_file): Override the inherited method
10535     to fill the script files with content.
10536    
10537 bh 202 * Thuban/Model/save.py (relative_filename): Wrapper around
10538     Thuban.Lib.fileutil.relative_filename that accepts an empty dir
10539     argument. save_session now automatically uses this version,
10540     solving a problem when saving to a relative filename.
10541    
10542     * setup.py: In the setup call, make sure that the library
10543     directories are under $prefix/lib not directly under $prefix.
10544    
10545 tkoester 403 2002-06-20 Jan-Oliver Wagner <[email protected]>
10546 jan 199
10547     * Thuban/Model/extension.py: new module to handle extension objects.
10548     * Thuban/Model/messages.py: new messages for extensions.
10549     * Thuban/Model/session.py (Session.Extensions, Session.HasExtensions,
10550     Session.AddExtension): new for handling extensions.
10551     Also some other minor changes to round up extension handling.
10552     * Thuban/UI/tree.py (SessionTreeCrtl:update_tree): Added visualization
10553     of Extension titles and title and names of its objects.
10554    
10555 bh 194 2002-05-29 Bernhard Herzog <[email protected]>
10556    
10557     * Thuban/UI/mainwindow.py (MainWindow.bind_command_events): Bind
10558 bh 202 the events for a command.
10559 bh 194 (MainWindow.add_toolbar_command, MainWindow.add_menu_command):
10560     Call bind_command_events to bind the events. add_toolbar_command
10561     can now bind events too so that it's possible to have commands
10562     that are only available through the toolbar.
10563     (MainWindow.init_ids): New instance variable events_bound to keep
10564     track of for which commands events have been bound.
10565    
10566 bh 190 2002-05-28 Bernhard Herzog <[email protected]>
10567    
10568     * Thuban/UI/menu.py: New module to build and manage menus.
10569    
10570     * Thuban/UI/mainwindow.py: Remove some unused imports.
10571     (MainWindow.__init__, main_menu): move the definition of the main
10572     menu from __init__ to the Menu instance main_menu.
10573     (MainWindow.build_menu_bar, MainWindow.build_menu): New methods to
10574     build the menu bar and sub-menus from a menu description.
10575    
10576     * Thuban/UI/application.py (ThubanApplication.OnInit): Read the
10577     startup file
10578     (ThubanApplication.read_startup_files): New method to run
10579     ~/.thuban/thubanstart.py
10580    
10581 bh 192 * Thuban/UI/mainwindow.py (MainWindow.__init__, main_toolbar):
10582     Move the toolbar definition to the Menu instance main_toolbar.
10583     (MainWindow.build_toolbar): New method to build the toolbar
10584     similar to the build_menu methods
10585    
10586 bh 184 2002-05-23 Bernhard Herzog <[email protected]>
10587    
10588 bh 186 * Thuban/UI/mainwindow.py (MainWindow.__init__): Fix spelling of
10589     layer_outline_color. Fix it in the definition of the command too.
10590    
10591 bh 184 * Thuban/UI/command.py (Command): Fix typo in doc string
10592    
10593 bh 182 2002-05-22 Bernhard Herzog <[email protected]>
10594    
10595     * Thuban/UI/mainwindow.py (MainWindow.RunMessageBox): Fix a typo
10596     in the docstring
10597    
10598 bh 175 2002-05-15 Bernhard Herzog <[email protected]>
10599    
10600 bh 180 * Thuban/Model/layer.py (Layer.open_shapefile): Set bbox to None
10601     when the shapefile is empty.
10602     (Layer.BoundingBox, Layer.LatLongBoundingBox): Both methods may
10603     now return None for empty shapefiles. Update doc-strings.
10604    
10605     * Thuban/Model/map.py (Map.BoundingBox): Add doc-string. Deal with
10606     the layer's bbox being None.
10607    
10608     * Thuban/UI/tree.py (SessionTreeCtrl.update_tree): Deal with the
10609     layer's bbox being None.
10610    
10611 bh 175 * Thuban/UI/view.py (MapCanvas.shape_selected): Only redraw when
10612     necessary.
10613     (MapCanvas.__init__): New instance variables, last_selected_layer
10614     and last_selected_shape to determine how the selection has
10615     changed.
10616    
10617     * Thuban/UI/tableview.py (TableGrid.__init__): Do not call
10618     AutoSizeColumns because it will cause a traversal of the entire
10619     table which for large .dbf files will take a very long time.
10620    
10621 bh 172 2002-05-14 Bernhard Herzog <[email protected]>
10622    
10623     * Thuban/Model/layer.py (Layer.open_shapefile): Choose a better
10624     maximum depth for the tree than shapelib does by default.
10625    
10626 bh 165 2002-05-10 Bernhard Herzog <[email protected]>
10627    
10628     * setup.py (py_modules): The shptree modules doesn't have a
10629     wrapper, so don't include it in the py_modules
10630    
10631 bh 163 2002-05-08 Bernhard Herzog <[email protected]>
10632    
10633     * extensions/shapelib/shptree.c (compare_ints): Make arguments
10634     const void * as in the qsort prototype
10635     (SHPTreeFindLikelyShapes): Remove some unused variables.
10636    
10637     * Thuban/UI/view.py (PanTool.MouseMove): Use the bitmap the view
10638     maintains to redraw the window during a drag.
10639     (MapCanvas.unprojected_rect_around_point): New method to determine
10640     a small region around a point for hit-testing.
10641     (MapCanvas.find_shape_at): Only test the shapes in a small region
10642     around the point.
10643    
10644     * setup.py: Increment the version to 0.1.2
10645    
10646     * Thuban/UI/tree.py (SessionTreeCtrl.unsubscribe_all): Remove a
10647     debug print and set session to None after unsubscribing
10648    
10649 bh 146 2002-05-07 Bernhard Herzog <[email protected]>
10650    
10651 bh 154 * Data/iceland_sample.session, Data/iceland_sample.thuban: Rename
10652     the file to have a .thuban extension.
10653    
10654 bh 152 * Thuban/UI/tree.py (session_channels): New class constant with
10655     all the session channels to subscribe to to update the tree
10656     (SessionTreeCtrl.session_changed): Remember the session so that we
10657     can unsubscribe properly. Use the new class constant to
10658     unsubscribe from the old session and subscribe to the new one.
10659     (SessionTreeCtrl.unsubscribe_all): New method to unsubscribe all
10660     subscriptions of the SessionTreeCtrl.
10661     (SessionTreeView.OnClose): Call the tree's unsubscribe_all method.
10662    
10663     * Thuban/UI/mainwindow.py (MainWindow.__init__): Add the "Show
10664     Session Tree" command to the file menu.
10665    
10666     * Thuban/UI/view.py (MapCanvas.do_redraw): Pass the entire bitmap
10667     as update_region to the renderer.
10668    
10669     * Thuban/UI/renderer.py
10670     (ScreenRenderer.layer_ids, ScreenRenderer.draw_shape_layer): The
10671     update box is now directly a tuple, not a wxRect anymore.
10672    
10673     * Thuban/Model/layer.py (Layer.ShapesInRegion): Remove some debug
10674     prints.
10675    
10676     2002-05-07 Bernhard Herzog <[email protected]>
10677    
10678 bh 146 * setup.py: Add the shptree extension module. See
10679     extensions/pyshapelib/ChangeLog for more details.
10680    
10681     * extensions/shapelib/shpopen.c, extensions/shapelib/shapefil.h,
10682     extensions/shapelib/dbfopen.c: Really update to the versions of
10683     shapelib 1.2.9. For some reason it wasn't really done on
10684     2002-04-11.
10685    
10686     * extensions/shapelib/shptree.c: Modified version of shptree.c of
10687     shapelib 1.2.9. The only real difference is the use of qsort
10688     instead of a bubble sort implementation
10689    
10690     * Thuban/Model/layer.py (Layer.__init__): New instance variable
10691     shapetree to hold the shapelib quadtree for the shapefile
10692     (Layer.open_shapefile): Create the quad tree.
10693     (Layer.ShapesInRegion): New method to return the ids of shapes in
10694     a given region using the quad tree.
10695    
10696     * extensions/thuban/wxproj.cpp (project_points): Fix some typos in
10697     comment
10698     (draw_polygon_shape): Accept both arcs and polygons.
10699     (initwxproj): Use the new PYSHAPELIB_IMPORT_API macro to import
10700     the api.
10701    
10702     * Thuban/UI/renderer.py (MapRenderer.layer_ids): New method to
10703     return the shape ids to be rendered in a given layer.
10704     (MapRenderer.draw_shape_layer): Call layer_ids to get the list of
10705     ids. Use draw_polygon_shape to draw arc shapes as well.
10706     (ScreenRenderer.RenderMap): New parameter for the rectangle that
10707     has to be updated
10708     (ScreenRenderer.layer_ids): Make use of the layer's quadtree by
10709     calling it's ShapesInRegion method.
10710    
10711     * Thuban/UI/view.py (MapCanvas.__init__): New instance variable
10712     update_region for the update region.
10713     (MapCanvas.OnPaint): Maintain the update region
10714     (MapCanvas.do_redraw): Pass the bounding box of the update_region
10715     to the renderer when drawing the bitmap. Reset the update_region.
10716    
10717 bh 129 2002-05-03 Bernhard Herzog <[email protected]>
10718    
10719 bh 131 * Thuban/UI/mainwindow.py (MainWindow.SaveSessionAs,
10720     MainWindow.OpenSession): Change the file extension of the session
10721     files to .thuban
10722    
10723 bh 129 * Thuban/Model/session.py (Session.AddMap, forwarded_channels):
10724     Move the map channels to be forwarded by the session into the
10725 bh 146 class constant with forwarded_channels. Also add
10726     LAYER_PROJECTION_CHANGED and LAYER_VISIBILITY_CHANGED to
10727     forwarded_channels
10728 bh 129
10729     * Thuban/Model/base.py (Modifiable.changed): Fix doc-string (a
10730     typo and some rewording).
10731    
10732 bh 126 2002-05-02 Bernhard Herzog <[email protected]>
10733    
10734     * Thuban/UI/view.py: Keep the temporary bitmap used during drawing
10735     around to speed up most redraws:
10736     (MapCanvas.__init__): New instance variable bitmap which holds the
10737     bitmap
10738     (MapCanvas.do_redraw): Redraw self.bitmap if necessary. Use
10739     self.bitmap to draw.
10740     (MapCanvas.full_redraw): New method to force a full redraw
10741     including the bitmap
10742     (MapCanvas.SetMap): Subscribe full_redraw instead of redraw to
10743     make sure the bitmap is redrawn.
10744     (MapCanvas.projection_changed, MapCanvas.set_view_transform,
10745     MapCanvas.shape_selected): Call full_redraw instead of readraw to
10746     make sure the bitmap is redrawn.
10747     (MapCanvas.OnSize): New method to handle size events so that the
10748     bitmap can be redrawn.
10749    
10750 bh 124 2002-04-29 Bernhard Herzog <[email protected]>
10751    
10752     * Thuban/UI/mainwindow.py (MainWindow.__init__): Subscribe to the
10753     canvas' VIEW_POSITION event
10754     (MainWindow.view_position_changed): Handler for VIEW_POSITION.
10755     Update the text in the status-bar accordingly.
10756    
10757     * Thuban/UI/view.py (MapCanvas): Derive from Publisher as well
10758     (MapCanvas.__del__): Implement because Publisher.__del__ has to be
10759     called.
10760     (MapCanvas.__init__): Bind EVT_LEAVE_WINDOW too. Initialize
10761     current_position
10762     (MapCanvas.set_current_position): New method to set
10763     current_position. Issue a VIEW_POSITION event
10764     (MapCanvas.CurrentPosition): New public method to return the value
10765     of current_position. Should be called when the VIEW_POSITION event
10766     is processed.
10767     (MapCanvas.OnLeftDown, MapCanvas.OnLeftUp, MapCanvas.OnMotion):
10768     Update the position.
10769     (MapCanvas.OnLeaveWindow): Set the position to None.
10770    
10771     * Thuban/UI/messages.py (VIEW_POSITION): New message for the
10772     position in the statusbar
10773    
10774 tkoester 403 2002-04-26 Frank Koormann <[email protected]>
10775 frank 120
10776     * Thuban/UI/mainwindow.py: AddLayer, Dialog title s/session/data
10777    
10778 tkoester 403 2002-04-24 Frank Koormann <[email protected]>
10779    
10780 frank 118 * Resources/Bitmaps/identify.xpm: shadow added
10781    
10782     * Resources/Bitmaps/fullextent.xpm: new
10783 jan 116
10784 tkoester 403 2002-04-22 Jan-Oliver Wagner <[email protected]>
10785 jan 116
10786 tkoester 403 * Thuban/UI/tree.py (update_tree): added test for None on map bounding
10787     box
10788 jan 114
10789 tkoester 403 2002-04-21 Jan-Oliver Wagner <[email protected]>
10790    
10791 jan 114 * Thuban/UI/proj4dialog.py (UTMProposeZoneDialog): new
10792    
10793     * Thuban/UI/tree.py (update_tree): added added map extent
10794    
10795     * Thuban/UI/mainwindow.py (_method_command): extended by parameter
10796 tkoester 403 icon; added map_full_extend as tool
10797 jan 114
10798 tkoester 403 2002-04-19 Jan-Oliver Wagner <[email protected]>
10799 jan 107
10800     * Thuban/UI/mainwindow.py (SaveSession): launch save as dialog for
10801     saving _new_ sessions
10802    
10803     * Thuban/Model/session.py (create_empty_session): new session
10804     don't have a filename (set to None)
10805    
10806     * Thuban/UI/tree.py (update_tree): added filename and modified flag
10807    
10808     * Thuban/Model/load.py (ProcessSession): convert projection
10809     parameters from unicode to regular string
10810    
10811     * Data/iceland_sample.session: Added UTM Zone 26 projection.
10812    
10813 bh 100 2002-04-11 Bernhard Herzog <[email protected]>
10814    
10815     * extensions/shapelib/shapefil.h, extensions/shapelib/shpopen.c,
10816     extensions/shapelib/dbfopen.c: Update to the versions of shapelib
10817     1.2.9
10818    
10819     * setup.py (Lib.wxproj extension): Don't link shpopen.c and put
10820     the pyshapelib directoy into the list of include dirs, so that
10821     pyshapelib_api.h can be found.
10822    
10823     * extensions/thuban/wxproj.cpp (pyshapelib_api): New variable that
10824     holds the pyshapelib C-API
10825     (draw_polygon_shape, point_in_polygon_shape, shape_centroid): Use
10826     pyshapelib_api to access the shapelib functions.
10827     (initwxproj): Import the c_api from the shapelib module and
10828     initialize pyshapelib_api.
10829    
10830 bh 89 2002-04-04 Bernhard Herzog <[email protected]>
10831    
10832 bh 91 * setup.py (thuban_bdist_rpm.initialize_options): Use
10833     initialize_options to create the scripts for the rpm.
10834    
10835 bh 89 * extensions/pyprojection/setup.py (PROJ4_PREFIX): Just use /
10836    
10837 bh 85 2002-04-03 Bernhard Herzog <[email protected]>
10838    
10839 bh 87 * setup.py: Increment version to 0.1.1
10840    
10841 bh 85 * Thuban/UI/mainwindow.py (MainWindow.__init__): Move the "Add
10842     Layer" and "Remove Layer" commands from the layer menu to the map
10843     menu
10844    
10845 bh 83 2002-02-15 Bernhard Herzog <[email protected]>
10846    
10847     * Thuban/Model/layer.py (Layer.Shape): list append only takes one
10848     argument (python <= 1.5.2 erroneously accepted multiuple
10849     arguments)
10850    
10851 bh 81 2002-02-04 Bernhard Herzog <[email protected]>
10852    
10853     * Thuban/UI/identifyview.py (IdentifyGridCtrl): New class to use a
10854     RecordGrid in the identifyview.
10855     (IdentifyView.__init__): Use IdentifyGridCtrl instead of
10856     IdentifyListCtrl. The grid allows editing of the values.
10857    
10858     * Thuban/UI/controls.py (RecordTable, RecordGridCtrl): New classes
10859     implementing a grid for a single row of a thuban table.
10860    
10861     * Thuban/UI/view.py (MapCanvas.SelectShapeAt): Search through all
10862     layers by default. Easier to use than the previous default of only
10863     searching through the select layer which meant that if no layer
10864     was selected, you couldn't select a shape.
10865    
10866     * Thuban/UI/tableview.py (TableGrid.__init__): Fix typo
10867    
10868     * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Honour the
10869     stroke_width attribute
10870    
10871     * Thuban/Model/save.py (save_session): Write the new stroke_width
10872     attribute
10873    
10874     * Thuban/Model/load.py (ProcessSession.startElement): Read the
10875     stroke_width attribute
10876    
10877     * Thuban/Model/layer.py (Layer.__init__): New parameter and
10878     instance variable stroke_width
10879     (Layer.SetStrokeWidth): Set the stroke_width.
10880    
10881 bh 72 2002-02-01 Bernhard Herzog <[email protected]>
10882    
10883     * extensions/thuban/wxproj.cpp (project_points): Fix two
10884     off-by-one errors in the last loop that joins the various parts
10885     together.
10886    
10887 bh 71 2002-01-14 Bernhard Herzog <[email protected]>
10888    
10889     * setup.py (data_dist.make_distribution): Fix some typos
10890    
10891 bh 70 2001-09-18 Bernhard Herzog <[email protected]>
10892    
10893     * README: Slight tweaking in preparation for the 0.1 release
10894    
10895     * setup.cfg: Add section for sdist to create both tgz and zip
10896     archives
10897    
10898     * setup.py: increase version number to 0.1
10899     (data_dist): New command class for data distribution
10900    
10901 bh 64 2001-09-14 Bernhard Herzog <[email protected]>
10902    
10903 bh 70 * Thuban/UI/identifyview.py (IdentifyListCtrl.selected_shape):
10904     Handle the case of no layer (i.e. layer is None) properly.
10905    
10906 tkoester 403 * Thuban/UI/proj4dialog.py (UTMDialog.__init__, Proj4Dialog.__init__):
10907 bh 70 Set the initial selection of the combo boxes to reflect the
10908     projection we're starting with in a way that works on windows,
10909     too.
10910    
10911 bh 64 * Thuban/Lib/connector.py (Connector.print_connections): Print the
10912     puiblisher's ids in hex to make it easier to compare them to the
10913     standard repr of python methods
10914    
10915     * Thuban/Model/map.py (Map.Destroy): Unsubscribe the label_layer
10916     messages
10917    
10918 bh 59 2001-09-13 Bernhard Herzog <[email protected]>
10919    
10920 bh 64 * Thuban/UI/tree.py (SessionTreeCtrl.OnSelChanged): Make sure to
10921     deselect the layer if no layer is selected
10922    
10923 bh 59 * Thuban/UI/view.py (MapCanvas.OnPaint): Only delay drawing to
10924     idle time when there actually is something to draw. If there's
10925     nothing to draw simply clear the window
10926     (MapCanvas.do_redraw): Call dc.EndDrawing and add some comments.
10927     (MapCanvas.SetMap): force a redraw in all cases because
10928     FitMapToWindow doesn't always do it.
10929     (MapCanvas.ZoomFactor): Add an optional parameter, center, to
10930     specify the point to move into the center of the window
10931     (ZoomOutTool.MouseUp, ZoomInTool.MouseUp): If the mouse wasn't
10932     dragged, zoon in/out by a factor of 2
10933 bh 64 (MapCanvas.find_shape_at): Iterate backwards (i.e. with decreasing
10934     index, i.e. reversed drawing order) so that objects appearing to
10935     be in from of others are selected first. This is probably mostly
10936     relevant for point shapes where the symbols used may overlap
10937 bh 59
10938     * Thuban/Model/session.py (create_empty_session): Unset the
10939     modified bit before returning it
10940    
10941     * Thuban/UI/mainwindow.py (MainWindow.NewSession): Use
10942     create_empty_session session to create the new, empty session.
10943    
10944     * Thuban/UI/mainwindow.py (MainWindow.__init__): Set the size of
10945     the tool bitmaps.
10946     (MainWindow.OnClose, MainWindow.save_modified_session): Separate
10947     the code that asks whether the session should be saved into the
10948     new method save_modified_session.
10949     (MainWindow.OpenSession, MainWindow.NewSession): Use the new
10950     method to save modified session here too.
10951    
10952 bh 55 2001-09-11 Bernhard Herzog <[email protected]>
10953    
10954     * setup.py (InnoIconItem): fix typo
10955    
10956     (thuban_bdist_inno.run):
10957     (bdist_inno.run): Move the decision not to create symlinks on
10958     non-nt platforms to thuban_bdist_inno and do it unconditinally
10959     since we never want to create the symlinks here
10960    
10961 bh 48 2001-09-10 Bernhard Herzog <[email protected]>
10962    
10963 bh 53 * Thuban/UI/mainwindow.py (MainWindow.IdentifyTool): Popup the
10964     identify view immediately
10965    
10966     * Thuban/UI/controls.py: New file with two classes RecordListCtrl
10967     and SelectableRecordListCtrl that implement the code shared by the
10968     identify view and the label dialog
10969    
10970     * Thuban/UI/identifyview.py (IdentifyListCtrl): Derive from the
10971     new class RecordListCtrl
10972    
10973     * Thuban/UI/labeldialog.py (LabelDialog.OnOK): Check whether the
10974     return value of GetValue is None instead of using it as a boolean
10975     directly so that Zero numbers are handled properly.
10976     (LabelListCtrl): Derive from the new class
10977     SelectableRecordListCtrl
10978    
10979 bh 48 * Thuban/UI/proj4dialog.py (Proj4Dialog.__init__):
10980     (Proj4Dialog.dialogLayout): Make the window resizable and set the
10981     size of the text control explicitly to make the sizers work on
10982     both Windows and X.
10983    
10984 bh 44 2001-09-07 Bernhard Herzog <[email protected]>
10985    
10986     * Thuban/UI/view.py (MapCanvas.find_shape_at):Add a new parameter
10987     that can limit the search to the currently selected layer.
10988     (MapCanvas.SelectShapeAt): Make sure that the currently selected
10989     layer stays selected even when no shape is found
10990 bh 46 (MapCanvas.FitRectToWindow): If the rect has zero with or zero
10991     height do nothing (avoids zero division errors)
10992 bh 44
10993 bh 32 2001-09-06 Bernhard Herzog <[email protected]>
10994    
10995 bh 42 * Thuban/UI/tree.py (SessionTreeCtrl, SessionTreeView.__init__):
10996     Correct the spelling of SessionTreeCtrl. dabbrev is too damn
10997     convenient :-)
10998     (SessionTreeCtrl.__init__, SessionTreeCtrl.update_tree): Introduce
10999     a new instvar layer_to_item to map layers to tree items
11000     (SessionTreeCtrl.layer_selected): Select the appropriate tree item
11001     to match the current selection in the interactor
11002    
11003 bh 40 * Thuban/UI/interactor.py (Interactor.SelectedLayer):
11004     (Interactor.HasSelectedLayer): New methods to query the current
11005     selection
11006    
11007     * Thuban/UI/mainwindow.py (MainWindow.current_layer):
11008     (MainWindow.has_selected_layer): Simply call the appropriate
11009     interactor method
11010    
11011     * Thuban/UI/mainwindow.py (MainWindow.__init__):
11012     (MainWindow.LayerShowTable):
11013     (MainWindow.identify_view_on_demand): Store the interactor in an
11014     instvar and use that reference instead of going through main.app
11015    
11016 tkoester 403 * Thuban/UI/mainwindow.py (MainWindow.ShowSessionTree):
11017     * Thuban/UI/application.py (ThubanApplication.OnInit):
11018 bh 40 * Thuban/UI/main.py (main): Create the session tree view in main
11019     with the new mainwindow method ShowSessionTree and not directly
11020     the application's OnInit method
11021    
11022     * Thuban/UI/tree.py (myTreeCtrlPanel):
11023     (SessioinTreeCtrl): Rename to SessioinTreeCtrl and turn it into a
11024     TreeCtrl isntead of a panel. This affects most method since we now
11025     refer to self instead of self.tree
11026     (SessionTreeView): New class implementing a non-modal dialog
11027     showing the session tree.
11028    
11029 bh 35 * Thuban/UI/mainwindow.py (MainWindow.LayerShowTable): Pass the
11030     layer to the tableview dialog.
11031    
11032     * Thuban/UI/tableview.py: Add some doc-strings
11033 tkoester 403 (TableGrid):
11034 bh 35 (TableGrid.OnRangeSelect):
11035     (TableGrid.OnSelectCell):
11036     (TableFrame.__init__):
11037     (TableFrame.row_selected):
11038     Selecting rows in the grid view now updates the selected shapes
11039     through the TableFrame. To achieve this we derive TableGrid from
11040     Publisher and introduce the message type ROW_SELECTED which the
11041     TableFrame subscribes to and which is issued by OnRangeSelect and
11042     OnSelectCell
11043    
11044     (DataTable.SelectRow): Removed because it's no longer needed in
11045     the row/shape selection scheme
11046    
11047 bh 32 * Thuban/UI/dialogs.py: New file implementing common classes for
11048     dialogs
11049    
11050     * Thuban/UI/tableview.py (TableGrid.__init__): Don't subscribe to
11051     the SELECTED_SHAPE message anymore. This is now handled by the
11052     parent.
11053     (TableGrid.select_shape): Only update the selection if the shape
11054     is not None.
11055     (TableFrame): Inherit from the new NonModalDialog class.
11056     (TableFrame.__init__, TableFrame.select_shape): Handle the
11057     SELECT_SHAPE message.
11058     (TableFrame.OnClose): Extend the inherited method to unsubscribe
11059     SELECT_SHAPE
11060    
11061     * Thuban/UI/mainwindow.py (MainWindow.init_dialogs):
11062     (MainWindow.add_dialog):
11063     (MainWindow.dialog_open):
11064     (MainWindow.remove_dialog):
11065     (MainWindow.get_open_dialog): New methods to maintain a dictionary
11066     of opened non-modal dialogs.
11067    
11068     (MainWindow.__init__): Initialize the new non-modal dictionary
11069     management code
11070     (MainWindow.LayerShowTable): maintain separate dialogs for each
11071     table using the non-modal dialog management code to only open a
11072     view once for each table.
11073    
11074     (MainWindow.IdentifyTool):
11075     (MainWindow.__init__):
11076     (MainWindow.identify_view_on_demand): Don't open the identify view
11077     in IdentifyTool anymore. This will be done automatically by the
11078     new method identify_view_on_demand which handles the
11079     SELECTED_SHAPE message so that the identify view will be opened on
11080     demand
11081    
11082     * Thuban/UI/identifyview.py (IdentifyListCtrl.__init__): Remove
11083     the interactor argument. The SELECTED_SHAPE message is now handled
11084     by the parent.
11085     (IdentifyView.__init__): Add the interactor argument so that we
11086     can handle the SELECTED_SHAPE message here
11087     (IdentifyView.selected_shape): New method to handle the
11088     SELECTED_SHAPE messages
11089    
11090     * Thuban/UI/identifyview.py (IdentifyView): Derive from the new
11091     NonModalDialog class
11092     (IdentifyView.OnClose): Extend the inherited version to
11093     unsubscribe SELECT_SHAPE
11094    
11095     * Thuban/Model/session.py (Session.UnsetModified): Remove debug prints
11096    
11097 bh 26 2001-09-05 Bernhard Herzog <[email protected]>
11098    
11099     * Thuban/UI/view.py (MapCanvas.__init__): New argument, interactor.
11100 tkoester 403
11101 bh 26 * Thuban/UI/mainwindow.py (MainWindow.__init__): New argument
11102     interactor to pass through to the MapCanvas
11103 tkoester 403
11104 bh 26 * Thuban/UI/application.py (ThubanApplication.OnInit): Use the new
11105     argument to the MainWindow constructor to get rid of the ugly hack
11106     that made main.app available early just so that the mapcanvas
11107     could access the interactor object.
11108    
11109 bh 19 2001-09-04 Bernhard Herzog <[email protected]>
11110    
11111 bh 22 * Thuban/UI/mainwindow.py (MainWindow.RunMessageBox): New method
11112     that runs a modal message box
11113     (MainWindow.OnClose): Use the new method
11114     (MainWindow.RemoveLayer): Just do nothing in case no layer is
11115     selected. The command should be grayed out anyway, so there's no
11116     need to pop up a message box.
11117     (MainWindow.AddLayer): Pop up a message box with an error message
11118     if the shape file can't be opened
11119    
11120     * Thuban/Model/layer.py (Layer.__init__): Open the shapefile
11121     immediately. This will cause an exception in case the file can't
11122     be opened and we can display an appropriate message.
11123    
11124 bh 19 * MANIFEST.in: Add extensions/pyprojection/LICENSE
11125    
11126     * setup.py (thuban_bdist_rpm): New class implementing a Thuban
11127     specific bdist_rpm command.
11128    
11129     * Thuban/UI/main.py: Catch ImportError exceptions when importing
11130     the locale module because it may not be available on some
11131     installations.
11132    
11133     * extensions/pyprojection/LICENSE: Copy of the license text in
11134     Projection.i. Having it in a separate file makes it easier to
11135     refer to license text in e.g. RPMs
11136    
11137 bh 18 2001-09-03 Bernhard Herzog <[email protected]>
11138    
11139 bh 19 * setup.py: use wx-config instead of wxgtk-config because it's
11140     more generic
11141    
11142     * setup.py (ThubanInstall.get_outputs): Add the symlink in
11143     <prefix>/bin to the outputs
11144     (ThubanInstall.link_file): New method to link files. We need this
11145     because the standard copy_files refuses to link non-existing
11146     files.
11147     (ThubanInstall.run): Remove the leading install root from the
11148     script filename if an install root was specified and use the new
11149     link_file method
11150 tkoester 403
11151 bh 18 * Thuban/UI/mainwindow.py (MainWindow.AddLayer): Fit the map to
11152     the window when the first layer is added to the map.
11153    
11154     * setup.py (ThubanInstall.run): Honor the build root (self.root)
11155     when linking thuban.py to <prefix>/bin
11156    
11157 bh 16 2001-08-31 Bernhard Herzog <[email protected]>
11158    
11159     * setup.py: In the setup call, the install parameters shouldn't
11160     have trailing slashes because distutils on non-posix platforms
11161     doesn't like that. The same applies to other directories like
11162     "Resources/Bitmaps"
11163    
11164     In the configuration section for nt, move the wxWindows directory
11165     optins into the part clearly marked as editable.
11166    
11167     (InstallLocal.initialize_options):
11168     (InstallLocal.user_options): remove the currently unused debug
11169     flag
11170     (thuban_build_py.find_all_modules): Add this method so that it
11171     works for our case of having packages and modules in one
11172     distribution as well.
11173     (ThubanInstall.initialize_options):
11174     (ThubanInstall.finalize_options):
11175     (ThubanInstall.user_options):
11176     (ThubanInstall.boolean_options): Add new options, do-symlink and
11177     extra files. Since these are the first ThubanInstall specific
11178     options, override user_options and boolean_options
11179     (ThubanInstall.run): Honor the new do-symlink and extra-files
11180     options.
11181     (ThubanInstall.get_outputs): Add to override the base-class's
11182     version and add the extra-files to the outputs
11183     (bdist_inno): New class for windows distributions with Inno Setup
11184     (InnoIconItem): Helper class for bdist_inno
11185     (thuban_bdist_inno): Thuban specific version of bdist_inno. Added
11186     this together with the appropriate parameters, to the setup call.
11187 tkoester 403
11188 bh 16 * setup.cfg (bdist_inno): added new section for the inno setup
11189     installer
11190    
11191     * Thuban/UI/tree.py (myTreeCtrlPanel.__init__): New inst var
11192     changing_selection to avoid recursive selection events when
11193     modifying the selection in response to a selection event.
11194     (myTreeCtrlPanel.normalize_selection): Set the new inst var when
11195     changing the tree's selection.
11196     (myTreeCtrlPanel.OnSelChanged): Only normalize the selection when
11197     we're not being called indirectly from normalize_selection.
11198    
11199     * Thuban/UI/mainwindow.py (MainWindow.update_command_ui): Call
11200     event.Check only if the command is actuall checkable.
11201     (MainWindow.__init__): Call the toolbar's Realize method to make
11202     sure that the items are actually shown
11203    
11204 bh 7 2001-08-28 Bernhard Herzog <[email protected]>
11205    
11206 bh 9 * setup.py: Fix some doc strings
11207    
11208 bh 7 * ChangeLog: started
11209    

Properties

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

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26