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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 2535 - (hide annotations)
Fri Jan 21 08:31:43 2005 UTC (20 years, 1 month ago) by jan
Original Path: trunk/thuban/ChangeLog
File size: 429846 byte(s)
string fix.

1 jan 2535 2005-01-21 Jan-Oliver Wagner <[email protected]>
2    
3     * Thuban/UI/mainwindow.py (view_position_changed): Made string
4     available for i18n.
5    
6 russell 2532 2005-01-20 Russell Nelson <[email protected]>
7    
8     * Resources/Projections/defaults.proj: Ruin the speling of the
9 russell 2533 Lambert-93 projection so it doesn't run into the wx UTF-8 bug.
10     It's the wrong thing to do in the long run, but it's necessary for
11     those users until that bug is fixed. Otherwise the projection
12     dialog segfaults. Better to annoy some Lambert-93 users with a
13     spelling mistake than every Fedora Core 3 user of Thuban-CVS.
14 russell 2532
15 bernhard 2531 2005-01-20 Bernhard Reiter <[email protected]>
16    
17     * Thuban/UI/mainwindow.py(view_position_changed): Added docstring
18     and comment that the warning code here is a hack.
19    
20 russell 2529 2005-01-20 Russell Nelson <[email protected]>
21    
22 bernhard 2530 * Thuban/UI/mainwindow.py(view_position_changed): Warn user about
23     misprojected layers when their lat/lon bounding
24 russell 2529 box exceeds rational lat/lon values.
25    
26 bernhard 2525 2005-01-20 Bernhard Reiter <[email protected]>
27    
28 bernhard 2528 * Thuban/UI/about.py (unicodeToLocale()): Improved:
29     Use 'ascii' and then 'replace' for other characters
30     when getdefaultlocale returns None. Thanks to Bernhard H. .
31    
32     2005-01-20 Bernhard Reiter <[email protected]>
33    
34 bernhard 2527 * Thuban/UI/classgen.py (OnRetrieve()): Added a comment
35     that OnRangeText might be called twice and using None as argument.
36    
37     2005-01-20 Bernhard Reiter <[email protected]>
38    
39 bernhard 2526 * Thuban/UI/classgen.py (OnRetrieve()): Add a OnRangeText(0)
40     to work around a different in wx Behaviour noticed on MacOSX,
41     thanks to Lorenzo Moretti and Daniel Calvelo for the fix.
42    
43     2005-01-20 Bernhard Reiter <[email protected]>
44    
45     * Thuban/UI/about.py: take iso-8859-15 when getdefaultlocale returns
46 bernhard 2525 None. (Fixes rt#2910.)
47    
48 frank 2524 2005-01-18 Frank Koormann <[email protected]>
49    
50     New Extension: mouseposition
51     Tool to collect mouse click positions (map coordinates) in a dialog.
52    
53     * Extensions/mouseposition/__init__.py: New, extension registration
54    
55     * Extensions/mouseposition/mouseposition.py: New, implements the
56     dialog and adds a tool to Thuban mainwindow.
57    
58     * Extensions/mouseposition/position.xpm: New, icon for tool.
59    
60 jan 2522 2005-01-14 Jan-Oliver Wagner <[email protected]>
61    
62     * Doc/manual/thuban-manual-de.xml: More translations.
63    
64 frank 2520 2005-01-11 Frank Koormann <[email protected]>
65    
66     * Thuban/UI/mainwindow.py (MainWindow.DuplicateLayer):
67     Fix indention bug.
68    
69 frank 2517 2005-01-09 Frank Koormann <[email protected]>
70    
71     * Thuban/UI/mainwindow.py (MainWindow.DuplicateLayer):
72 frank 2520 BugFix 2901: Explicitly copy layers ClassificationColumn since it
73 frank 2517 is not part of the layers Classification.
74    
75 frank 2515 2005-01-03 Frank Koormann <[email protected]>
76    
77 frank 2517 * Thuban/UI/renderer.py (ScreenRendererdraw_selection_incrementally):
78     BugFix 2883: Former implementation only worked on classified point
79     layers: KeyError was raised, now use the default size if field is None.
80 frank 2515
81 bernhard 2513 2004-12-27 Bernhard Reiter <[email protected]>
82    
83     svgexport 1.0.0cvs: Fixed label export.
84    
85     * Extensions/svgexport/test/test_svgmapwriter.py:
86     class TestSVGRenderer(): New class; new test test_label_font().
87    
88     * Extensions/svgexport/svgmapwriter.py
89     (SVGRenderer.label_font()): initialised Font size with self.factor now,
90     makes test_label_font happy.
91    
92     * Extensions/svgexport/TODO: crossed out fixed label export item.
93     Added item for options.
94    
95     * Extensions/svgexport/__init__.py: Bumped version to 1.0.0cvs.
96    
97 russell 2511 2004-12-27 Russell Nelson <[email protected]>
98    
99 jan 2512 Middle mouse button pans.
100 russell 2511
101 jan 2512 * Thuban/UI/view.py (MapCanvas.__init__): Subscribe also
102     OnMiddleDown and OnMiddleUp events.
103     (MapCanvas.OnMiddleDown): New. Activate the pan tool and remember the
104     previously used tool.
105     (MapCanvas.OnMiddleUp): New. Reactivate the remebered tool used before
106     pressing the middle mouse button.
107    
108 jan 2509 2004-12-27 Jan-Oliver Wagner <[email protected]>
109    
110     * Doc/manual/thuban-manual-de.xml: More translations.
111    
112 jan 2506 2004-12-23 Jan-Oliver Wagner <[email protected]>
113    
114     * Thuban/UI/projdialog.py (ProjFrame.load_user_proj): Added a
115     \n to stderr after the warnings. Thanks to Russell Nelson.
116    
117 nhueffme 2493 2004-12-20 Nina Hueffmeyer <[email protected]>
118    
119     * Extensions/ogr/ogrshapes.py: Fixed some issues from
120     Bernhard (coding guidelines etc.). Additionally it is now possible to
121     display shapefiles containing feature collections (e.g.polygons
122     with holes). Works with gdal 1.2.1 now.
123    
124     * Extensions/ogr/test/test_OGRShapestore.py: Fixed some issues
125     from Bernhard (coding guidelines etc.). If ogr can't be imported,
126     tests are skipped now.
127    
128     * Extensions/ogr/ogrstart.py: Fixed some typings.
129    
130 bernhard 2490 2004-12-20 Bernhard Reiter <[email protected]>
131    
132     * Extensions/svgexport/TODO: updated to add support for
133     raster layers and labels for 1.0.1.
134    
135     * Extensions/svgexport/svgmapwriter.py (draw_raster_layer):
136     Issue a warning now.
137    
138 bernhard 2488 2004-12-19 Bernhard Reiter <[email protected]>
139    
140 bernhard 2489 * Extensions/svgexport/TODO: Added idea to support triggering
141     the application down the pipe.
142    
143     2004-12-19 Bernhard Reiter <[email protected]>
144    
145 bernhard 2488 svgexport: Improved code quality, mainly by better naming.
146    
147     * Extensions/svgexport/svgmapwriter.py:
148     DrawPath() renamed to DrawPolygonPath(),
149     added documentation, improved comments and variable names.
150    
151     * Extensions/svgexport/svgmapwriter.py,
152     Extensions/svgexport/test/test_svgmapwriter.py:
153     All using DrawPolygonPath() now, the default parameter closed=True
154     omitted.
155    
156     * Extensions/svgexport/test/test_svgmapwriter.py:
157     renamed test_polygon_opened() to test_polyline()
158     renamed test_transparent_polygon() to test_transparent_polyline()
159    
160 jan 2487 2004-12-18 Jan-Oliver Wagner <[email protected]>
161    
162     Some fixes of gns2shp extension.
163    
164     * Extensions/gns2shp/test/__init__.py: New. Make this directory a
165     package.
166    
167     * Extensions/gns2shp/test/test_gns2shp.py: Add some import paths
168     dynamically.
169    
170     * Extensions/gns2shp/test/README: Simplified description how to test.
171    
172     * Extensions/gns2shp/gns2shp.py (gns2shp): Fixed doc-string,
173     fixed some dimensions of fields according to the GNS documentation
174     which seems to change undocumented.
175     Now killing trailing \n and/or \r from MODIFY_DATE.
176     This fixes RT#2453.
177    
178 bernhard 2479 2004-12-18 Bernhard Reiter <[email protected]>
179 bernhard 2480
180 bernhard 2482 svgexport 1.0.0: Treats holes and islands nicely. Documentation added.
181    
182     * Extensions/svgexport/test/test_svgmapwriter.py:
183     Added new tests: test_export_polygon_with_hole()
184     and test_polygon_with_hole().
185    
186     * Extensions/svgexport/svgmapwriter.py
187     (draw_polygon_shape()): Uses DrawPath correctly now.
188    
189     * Doc/manual/thuban-manual.xml: Added documentation for stable
190     extention svgexport.
191     * Doc/manual/thuban-manual-de.xml: Copied English section about
192     svexport over.
193    
194 jan 2509 * Extensions/svgexport/__init__.py: Bumped version number to 1.0.0.
195 bernhard 2482
196     * Extensions/svgexport/svgsaver.py,maplegend.py:
197     Moved from experimental to stable extension menu.
198    
199     * Extensions/svgexport/TODO: updated.
200    
201    
202     2004-12-18 Bernhard Reiter <[email protected]>
203    
204 bernhard 2481 Added Extensions/svgexport/TODO
205    
206     2004-12-18 Bernhard Reiter <[email protected]>
207    
208 bernhard 2480 Refactored in svgexport:
209     DrawPath replaces DrawPolygon; added newline in front of "M" in paths.
210    
211     * Extensions/svgexport/svgmapwriter.py
212     Added verbosity level 3 to print out polygon points.
213     (class Point): added __repr__
214     (class Brush, __str__()): Added space after ,.
215     (DrawPolygon): Renamed to DrawPath()
216     (DrawPath): Takes list of polygons as input now, adds \n before "M"s.
217     (DrawLines): Using DrawPath now.
218    
219     * Extensions/svgexport/test/test_svgmapwriter.py:
220     Replaced DrawPolygon() calls with DrawPath() and put the first argument
221     inside another list. Adapted test data with a newline before "M".
222    
223     2004-12-18 Bernhard Reiter <[email protected]>
224 bernhard 2479
225     Refactored svgexport tests: 9 double tests runs eliminated;
226     code size reduced by 8 lines.
227    
228     * Extensions/svgexport/test/test_svgmapwriter.py:
229     (class TestWithDC): Renamed to BaseTestWithDC, moved to top.
230     (class BaseWithDCtools): New, subclass from BaseTestWithDC.
231     (class TestDrawSplines): now subclass from BaseTestWithDCtools,
232     this fixed the double running of the nine tests of TestVirtualDC.
233     (class TestVirtualDC): Using self.dc and self.file from setUp().
234    
235 bh 2478 2004-12-17 Bernhard Herzog <[email protected]>
236    
237     Two windows specific fixes ported from thuban-1­0-branch:
238    
239     * Thuban/UI/about.py (unicodeToLocale): Use getdefaultlocale
240     instead of getlocale because getlocale doesn't return a usable
241     encoding name on a german windows 2000
242    
243     * setup.py: windows build: Removed the absolute path names and
244     made all prfixes relative to the directory containing setup.py.
245     Makes it a little easier to adapt to a different system.
246    
247 bh 2470 2004-12-16 Bernhard Herzog <[email protected]>
248    
249 bernhard 2479 Add support for PostGIS tables with LINESTRING geometries.
250 bh 2472 Fixes RT#2299
251    
252     * Thuban/Model/postgisdb.py (shapetype_map): Add LINESTRING
253    
254     * test/postgissupport.py
255     (PostgreSQLServer.get_default_static_data_db): Rename the "roads"
256     table to "roads-multi" because it now uses MULTILINESTRING
257     geometries and introduce a new "roads" table that uses LINESTRING
258     (coords_to_multilinestring): Make the doc string more precise
259     (coords_to_linestring): New. Create a LINESTRING WKT
260     representatin
261     (wkt_converter): Add coords_to_linestring
262     (upload_shapefile): Rephrase the doc-string a bit.
263    
264     * test/test_postgis_db.py (TestPostGISShapestoreArc)
265     (LineStringTests)
266     (TestPostGISShapestoreLineString)
267     (TestPostGISShapestoreMultiLineString): Split
268     TestPostGISShapestoreArc into a base class LineStringTests and two
269     derived classes TestPostGISShapestoreLineString for LINESTRING
270     geometries and TestPostGISShapestoreMultiLineString for
271     MULTILINESTRING geometries. Most test methods are in the base
272     class with the exception of tests that explicitly check the raw
273     format.
274    
275     2004-12-16 Bernhard Herzog <[email protected]>
276    
277 bh 2471 Make the test suite work with PostGIS 0.8.2 and PostgreSQL 7.4
278    
279     * test/postgissupport.py (find_postgis_sql): Different postgis
280     versions put the postgis.sql file into slightly different places
281     so we have to look in both. The updated doc string describes this
282     is more detail.
283    
284     * test/test_postgis_db.py
285     (TestPostGISSpecialCases.test_column_name_quoting): The return
286     value of UniqueValues is unsorted, so it has to be sorted for
287     comparison.
288    
289     2004-12-16 Bernhard Herzog <[email protected]>
290    
291 bh 2470 Fix for RT#2237
292    
293     * Thuban/UI/projdialog.py (ProjFrame._show_proj_panel): If the
294     panel to be shown is the UnknownProjPanel disable the OK and Try
295     buttons. Otherwise enable them.
296     (ProjFrame.__GetProjection): The UnknownProjPanel returns None for
297     the parameters. In that case __GetProjection also returns None
298     now.
299    
300 bh 2459 2004-12-15 Bernhard Herzog <[email protected]>
301    
302 bh 2462 * Thuban/UI/classgen.py (GenQuantilesPanel.__init__): Set the
303     minimum number of classes to 2. The calculate_quantiles needs at
304     least two and raises an exception otherwise.
305     Fixes RT#2549
306    
307     2004-12-15 Bernhard Herzog <[email protected]>
308    
309 bh 2460 * test/postgissupport.py (PostgreSQLServer.execute_sql): Extend to
310     so that it returns a result for select statements.
311     (PostgreSQLServer.server_version): New. Return the version of the
312     server software.
313     (PostgreSQLServer.require_authentication): The format of
314     pg_hba.conf has changed between PostgrSQL 7.2 and 7.3. Check the
315     server version and generate the file in the correct format
316    
317     2004-12-15 Bernhard Herzog <[email protected]>
318    
319 bh 2459 * test/postgissupport.py (PostgreSQLServer.is_running): Fix typo
320     in the doc string and rephrase it a little.
321    
322 frank 2457 2004-12-15 Frank Koormann <[email protected]>
323    
324     * test/test_load.py (TestAltPath.checkSession): New, extended checks if
325     session has been loaded successfully. The check is called by the relevant
326     tests after executing load_session().
327    
328 bh 2450 2004-12-13 Bernhard Herzog <[email protected]>
329    
330 bh 2454 Make sure the region used to determine which shapes are visible
331     actually matches the region on the printed page. If this isn't
332     done properly some shapes might not be printed.
333     Fixes RT #2692
334    
335     * Thuban/UI/view.py (MapPrintout.draw_on_dc): The region for the
336     renderer has to be at the same position as the mapregion
337    
338     * Thuban/UI/renderer.py (ExportRenderer.RenderMap): self.region
339     has to be moved by (self.shiftx, self.shifty) too.
340    
341     2004-12-13 Bernhard Herzog <[email protected]>
342    
343 bh 2452 * libraries/pyprojection/Projection.i: Work around a bug in the
344     generated python code which leads to exception in the __del__
345     method when the constructor fails. See the comments in the code
346     for more details.
347    
348     * libraries/pyprojection/Projection.py: Updated from Projection.i
349     with SWIG.
350    
351     2004-12-13 Bernhard Herzog <[email protected]>
352    
353 bh 2451 * test/test_load.py (TestAltPath.test_01_single_path_error_fix)
354     (TestAltPath.test_02_path_error_fix_from_list)
355     (TestAltPath.test_05_path_error_fix_from_list_changed)
356     (TestAltPath.test_06_path_error_fix_from_list_fails): self.session
357     is destroyed in tearDown, so there's no need to do it in a test
358     case.
359    
360     * Thuban/Model/load.py (SessionLoader.open_shapefile): Remove a
361     debug print
362    
363     2004-12-13 Bernhard Herzog <[email protected]>
364    
365 bh 2450 * Extensions/svgexport/test/test_svgmapwriter.py
366     (TestDrawSplines.setUp): Do not use super with the unittest
367     classes because in Python 2.2 they're still old-style classes.
368    
369 frank 2448 2004-12-13 Frank Koormann <[email protected]>
370    
371     Alternative Path feature: When loading a (moved) session where
372     shapefiles cannot be found, ask the user. Use the specified path
373     if further shapefiles are missing. However, ask the usr for confirmation
374     in such cases.
375    
376     * test/test_load.py (TestAltPath): New, tests for alternative path feature
377     in load_session()
378     (Shapefile_CallBack): Helper, implements controllable callback.
379    
380     * Thuban/UI/application.py (ThubanApplication.OnInit):
381     Added "alt_path" to self.path
382     (ThubanApplication.OpenSession): Added shapefile_callback as second
383     callback similar to db_connection_callback.
384     (ThubanApplication.run_alt_path_dialog): New, implementaion of
385     shapefile_callback. In addition to raising the dialog the control of
386     self.path('alt_path') is implemented here.
387    
388     * Thuban/Model/load.py (SessionLoader.__init__): Added shapefile_callback.
389     (SessionLoader.open_shapefile): Open shapefile, eventually with
390     alternative path. This wrapps the "theSession.OpenShapefile(filename)"
391     formerly used in start_fileshapesource()/start_layer().
392     (SessionLoader.start_fileshapesource): Call open_shapefile().
393     (SessionLoader.start_layer): Call open_shapefile().
394     (load_session): Added shapefile_callback.
395    
396     * Thuban/UI/altpathdialog.py: New, implements dialogs for alternative path
397     feature (search / check).
398    
399     * Doc/manual/thuban-manual.xml: Added documentation of new feature.
400    
401 bernhard 2443 2004-12-11 Bernhard Reiter <[email protected]>
402    
403 bernhard 2445 svgexport 0.9.2: Point size supports for maps.
404    
405     * Extensions/svgexport/svgmapwriter.py: Added import of SHAPETYPE_POINT
406     (def draw_point_shape): new parameter size defaults to 2 as before.
407     (draw_shape_layer_incrementally): Moved draw_func log line higher.
408     Added draw_func call with size when dealing with a point layer.
409    
410     * Extensions/svgexport/__init__.py: bumped version to 0.9.2.
411    
412     2004-12-11 Bernhard Reiter <[email protected]>
413    
414 bernhard 2444 Made sure that newlines are inserted in the svg path d attributes
415     to raise the chance that the line length will be below 255 characters,
416     as recommended by REC SVG 1.1 in section 8.3.1.
417    
418     * Extensions/svgexport/svgmapwriter.py(DrawPolygon):
419     Adding \n before L's and changed whitespace handling.
420    
421     * Extensions/svgexport/test/test_svgmapwriter.py:
422     Adapted tests to new whitespace handling of DrawPolygon.
423    
424     2004-12-11 Bernhard Reiter <[email protected]>
425    
426 bernhard 2443 * Doc/technotes/coding_guidelines.txt: easy typo fixed.
427    
428     * Extensions/svgexport/test/test_svgmapwriter.py:
429     Removed test_drawbezier in favour of new test_drawspline3 and
430     test_drawspline4 within new class TestDrawSplines(TestVirtualDC).
431     All only to test DrawSpline.
432    
433     * Extensions/svgexport/svgmapwriter.py(DrawSpline):
434     New implementation now really using the strange algorithm of
435     xfig 3.1's approximated splines and its conversion to postscript
436     with one twist: SVG can do quadratic beziers, so skipped translation
437     to cubic beziers.
438     (TestWithDC): Typo in comment fixed.
439    
440 joey 2442 2004-12-09 Martin Schulze <[email protected]>
441    
442     * Thuban/Model/classgen.py: Added missing character encoding
443    
444     * Extensions/wms/properties.py (OpenWMSProperties): removed
445    
446     * Extensions/wms/parser.py (WMSCapabilitiesParser.error): Dropped
447     support for get_srs_discrepancies() since there are no
448     discrepancies anymore (was a thinko)
449    
450     * Extensions/wms/layer.py (WMSLayer.GetMapImg): Improved graphic
451     format priority now that more formats are supported globally by
452     the render engine.
453    
454 silke 2437 2004-12-08 Silke Reimer <[email protected]>
455     * Extensions/ogr/ogrshapes.py: Substituted ogr-method CloseRings
456     because it is not available in all versions of ogr
457    
458 bernhard 2436 2004-12-08 Bernhard Reiter <[email protected]>
459     * Extensions/ogr/__init__.py: Added empty __init__.py to heal
460     global tests until a real one is commited.
461    
462 nhueffme 2435 2004-12-07 Nina Hüffmeyer <[email protected]>
463    
464     * /Extensions/ogr/: Adding a new extension to read shapefiles with
465     ogr. It is planned to add other vector formats.
466    
467     * /test/runtests.py: Adding tests from /Extensions/ogr/test/.
468    
469 jan 2434 2004-12-07 Jan-Oliver Wagner <[email protected]>
470    
471     * /Extensions/svgexport/test/test_svgmapwriter.py: Reverting
472     part of a (non-)fix to renable that the tests are always
473     executed.
474    
475 bernhard 2432 2004-12-07 Bernhard Reiter <[email protected]>
476    
477     * Extensions/svgexport/test/test_svgmapwriter.py:
478     Added test_drawbezier() to test DrawSpline().
479    
480     * Extensions/svgexport/svgmapwriter.py(DrawSpline):
481     Really implemented bezier drawing.
482    
483     * Extensions/svgexport/__init__.py: Bumped version of svgexport
484     to 0.9.1 because now the legend examples lines styles
485     will be drawing with beziers.
486    
487 joey 2431 2004-12-05 Martin Schulze <[email protected]>
488    
489     * Thuban/UI/renderer.py (raster_format_map): Added PNG, TIFF and
490     GIF as supported bitmap image formats (helpful for the WMS extension)
491    
492 joey 2430 2004-11-30 Martin Schulze <[email protected]>
493    
494     * Extensions/wms/test/test_ogclib.py (TestOGCLib.test_compareURLs):
495     Improved the test for the internal compare method
496    
497 jan 2429 2004-11-27 Jan-Oliver Wagner <[email protected]>
498    
499     * Thuban/UI/about.py (About.__init__): Added
500     Norbert Solymosi for hungarian translation and Ole Rahn
501     as contrbutor. Moved Bernhard Reiter from Contributor
502     to Developer.
503    
504 bernhard 2425 2004-11-27 Bernhard Reiter <[email protected]>
505    
506     * Extensions/svgexport/test/test_svgmapwriter.py:
507     Removed Jan from author list as he did not change enough significant
508     lines yet.
509    
510     * Extensions/svgexport/__init__.py: Added Bernhard as author
511     of the Extension.
512    
513 jan 2422 2004-11-27 Jan-Oliver Wagner <[email protected]>
514    
515     * po/hu.po: New. Hungarian translation. Contributed
516     by Norbert Solymosi.
517    
518 bh 2419 2004-11-26 Bernhard Herzog <[email protected]>
519    
520     * Extensions/svgexport/test/test_svgmapwriter.py
521     (Testobjectexport.test_transparent_polygon): Commented out some
522     debug prints
523    
524 jan 2418 2004-11-24 Jan-Oliver Wagner <[email protected]>
525    
526     Fix broken tests for svg extension and added svg legend
527     to Experimental menu.
528    
529     * Extensions/svgexport/test/test_svgmapwriter.py: Fix to have
530     the test run correctly even if the extension is a package.
531     Also removed the "import Thuban" which makes no sense.
532    
533     * Extensions/svgexport/__init__.py: Fix to have the extensions'
534     test module also be executed from the global test routine.
535     This is done by looking for the absense of the DISPLAY variable.
536    
537     * Extensions/svgexport/maplegend.py: Moved the menu entry from Extensions
538     to Experimental menu since this module has yet not reached a stable
539     status (ie. 1.0).
540    
541 bernhard 2414 2004-11-22 Bernhard Reiter <[email protected]>
542    
543     * Extensions/svgexport/svgmapwriter.py:
544     Added verbose variable and some logging depending on it.
545     (class VirtualDC(XMLWriter)): Minor improvement in the polygon loop,
546     because counting i is not necessary.
547     (class Pen, class Brush): Added simple __str__ methods.
548     (SVGRenderer.draw_polygone_shape): Fix #2698 (transparent polygons are
549     not exported to svg file) Note: holes still unhandled.
550    
551     * Extensions/svgexport/test/test_svgmapwriter.py:
552     Made a baseclass TestWithDC for test needed a DC.
553     Added tests for bug #2698 (transparent polygons are not
554     exported to svg file):
555     Testobjectexport.test_transparent_polygon()
556    
557     * Thuban/Model/base.py (UnsetModified):
558     Fixed some typos in docstring.
559    
560     * Thuban/UI/baserenderer.py (BaseRenderer.draw_polygon_shape()):
561     Added hints on the used algorithm for handling holes.
562    
563 jan 2403 2004-11-20 Jan-Oliver Wagner <[email protected]>
564    
565 jan 2412 Some face lifting for the examples.
566    
567     * Examples/__init__.py: Make this directory a package.
568    
569     * Examples/simple_extensions/__init__.py: Make this directory a package.
570    
571     * Examples/simple_extensions/hello_world.py: Moved entry from Extensions
572     menu to Examples menu.
573    
574     * Examples/simple_extensions/simple_command.py: Some more comments,
575     minor changes.
576    
577     * Examples/simple_extensions/simple_tool.py: Minor changes.
578    
579     2004-11-20 Jan-Oliver Wagner <[email protected]>
580    
581 jan 2407 Changed way of extension registry for wms and added extension
582     registry for umn_mapserver extension.
583    
584     * Extensions/wms/__init__.py: Added registry entry and the importing
585     of the actual wms module. Included a test for the required PyOGCLib.
586    
587     * Extensions/wms/wms.py: Removed registry entry (moved to __init__.py).
588    
589     * Extensions/umn_mapserver/__init__.py: Added registry entry and the
590     importing of the actual umn mapserver management modules.
591     Included a test for the required Python MapScript.
592    
593     2004-11-20 Jan-Oliver Wagner <[email protected]>
594    
595 jan 2403 Changed way of extension registry for importAPR, bboxdump
596     and added extension registry for svgexport.extension registry for
597     svgexport.
598    
599     * Extensions/importAPR/__init__.py: Added registry entry and the importing
600     of the actual importAPR module.
601    
602     * Extensions/importAPR/importAPR.py: Removed registry entry (moved to
603     __init__.py).
604    
605     * Extensions/bboxdump/__init__.py: Added registry entry and the importing
606     »···of the actual bboxdump module.
607    
608     * Extensions/bboxdump/bboxdump.py: Removed registry entry (moved to
609     »···__init__.py).
610    
611     * Extensions/svgexport/__init__.py: Added registry entry and the importing
612     of the svgsaver module.
613    
614     * Extensions/svgexport/svgsaver.py: Moved the menu entry from Extensions
615     to Experimental menu since this module has yet not reached a stable
616     status (ie. 1.0).
617    
618 jan 2397 2004-11-18 Jan-Oliver Wagner <[email protected]>
619    
620     Now the hit test considers the size of point symbols.
621    
622     * Thuban/UI/viewport.py (ViewPort._hit_point): Added optional parameter
623     'size' defaulting to the previously fixed value 5.
624     Extended doc-string.
625     (Viewport._find_shape_in_layer): Resolved FIXME regarding flexibility
626     for symbols.
627     Now the size of the largest point symbol is determined to find out
628     about whether the point has been hit.
629     This fixes the problem that only clicks inside a fixed distance of
630     5 where found.
631    
632 jan 2395 2004-11-17 Jan-Oliver Wagner <[email protected]>
633    
634 jan 2397 Another open issue fixed regarding sizeable symbols: correct rendering of
635 jan 2395 selected symbols.
636    
637     * Thuban/UI/renderer.py (ScreenRenderer.draw_selection_incrementally):
638     Added consideration of the specific size of point symbols.
639     The property for each point symbol is retrieved and the size applied
640     for the rendering method.
641     Added doc-string.
642    
643 jan 2393 2004-11-16 Jan-Oliver Wagner <[email protected]>
644    
645     Changed way of Extension Registry for gns2shp and profiling.
646    
647     * Extensions/gns2shp/gns2shp.py: Removed registry entry (moved to
648     __init__.py).
649    
650     * Extensions/gns2shp/__init__.py: Added registry entry and the importing
651     of the actual gns2shp module.
652    
653     * Extensions/profiling/profiling.py: Removed registry entry (moved to
654     __init__.py).
655    
656     * Extensions/profiling/__init__.py: Added registry entry and the importing
657     of the actual profiling module.
658    
659 bernhard 2388 2004-10-28 Bernhard Reiter <[email protected]>
660    
661     * Extensions/svgexport/: Minor improvements to doc strings.
662    
663 jan 2387 2004-10-07 Jan-Oliver Wagner <[email protected]>
664    
665     Further elements for sizable point objects now
666     making this feature usable though not yet complete.
667    
668     * Thuban/Model/save.py (SessionSaver.write_classification): Write
669     attribute 'size' for cldata when the shape layer is of point type.
670     This also now make the test_load.py tests happy.
671    
672     * Thuban/Model/classgen.py (CustomRamp.GetProperties): Added size
673     gradient.
674    
675     * Thuban/UI/classifier.py (ID_SELPROP_SPINCTRL): Renamed to
676     ID_SELPROP_SPINCTRL_LINEWIDTH.
677     (ID_SELPROP_SPINCTRL_LINEWIDTH): New Id replaces ID_SELPROP_SPINCTRL.
678     (ID_SELPROP_SPINCTRL_SIZE): New Id.
679     (SelectPropertiesDialog.__init__): Added a second spin control
680     for the size in case the corresponding layer is of point type.
681     (SelectPropertiesDialog._OnSpin): Renamed to _OnSpinLineWidth.
682     (SelectPropertiesDialog._OnSpinLineWidth): New. Former _OnSpin.
683     (SelectPropertiesDialog._OnSpinSize): New. Set size of property
684     and refresh preview.
685    
686    
687    
688 joey 2381 2004-10-04 Martin Schulze <[email protected]>
689    
690     * Extensions/wms/test/test_parser.py
691     (TestWMSCapabilitiesParser.test_compareLists): Added missing
692     self-test for compareLists()
693     (TestWMSCapabilitiesParser.test_compareDicts): Added missing
694     self-test for compareDicts()
695 joey 2382 (TestWMSCapabilitiesParser.test_compareLists): Adding more tests
696     to verify the test routine fails with non-equal arguments
697     (TestWMSCapabilitiesParser.test_compareDicts): Adding more tests
698     to verify the test routine fails with non-equal arguments
699 joey 2381
700 jan 2370 2004-10-03 Jan-Oliver Wagner <[email protected]>
701    
702 jan 2380 First elements for sizeable point objects.
703    
704     * Resources/XML/thuban-1.1.dtd: Added size attribute to cldata.
705    
706     * Data/iceland_sample_size.thuban: New. Sample for sized point objects.
707    
708     * test/test_load.py (ClassificationTest.TestLayers): Added SetSize in case
709     of a corresponding argument is given.
710     (TestSymbolSize): New. Test the size attribute of cldata.
711    
712     * Thuban/Model/classification.py: Removed some trailing whitespaces.
713     (ClassGroupProperties.__init__): Set default size.
714     (ClassGroupProperties.SetProperties): Set the size.
715     (ClassGroupProperties.GetSize): New. Return the size.
716     (ClassGroupProperties.SetSize): New. Set the size.
717     (ClassGroupProperties__eq__): Compare also size.
718     (ClassGroupProperties__repr__): Print also size.
719    
720     * Thuban/Model/load.py (SessionLoader.start_cldata): Also parse
721     the size attribute.
722    
723     * Thuban/UI/classifier.py (ClassDataPreviewer.Draw): Added doc-string.
724     Also, now there is a return value that indicates whether the drawing
725     size exceeded the given rect extent and if so the new extent.
726     Finally, point objects are drawn depending on the size. If either
727     the width or height is exceeded, the new extent is returned.
728     (ClassRenderer.Draw): Now when calling the previewer drawing function,
729     evaluate the return value and, if not None, adapt the grid widget size
730     accordingly and redraw again.
731    
732     * Thuban/UI/baserenderer.py (BaseRenderer.draw_shape_layer_incrementally):
733     If the draw function is for points, call it with the size as additional
734     parameter.
735     (BaseRenderer.draw_point_shape): Added additional, optional parameter for
736     the size. Compute the radius using the size.
737    
738     * Extensions/importAPR/apr.py (APR_BMkSym.GetThubanProp): Now
739     that Thuban supports size, apply this correctly.
740    
741     * Extensions/importAPR/importAPR.py: Bumped version to 0.1.1.
742    
743     2004-10-03 Jan-Oliver Wagner <[email protected]>
744    
745 jan 2370 * Doc/manual/thuban-manual-de.xml: Started translation of
746     Map chapter.
747    
748 joey 2368 2004-10-01 Martin Schulze <[email protected]>
749    
750     * Extensions/wms/properties.py (wmsProperties.__init__): Extended
751     argument for general use through properties-dialog selector
752    
753     * Thuban/UI/classifier.py: Register properties dialog classes for
754     both provided layer classes/types.
755    
756     * Thuban/UI/mainwindow.py (MainWindow.OpenLayerProperties): The
757     map can be retrieved through the parent which is passed to the
758     constructor anyway and doesn't require an argument of its own,
759     required for the unification of arguments for general use through
760     properties-dialog selector.
761     (MainWindow.OpenOrRaiseDialog): Move the logic for checking
762     whether a dialog is already opened (and raising it to the users
763     attention) and creating a new dialog into a function of its own
764     (MainWindow.OpenLayerProperties): Use the new OpenOrRaiseDialog()
765     method
766     (MainWindow.OpenLayerProperties): Utilise the new ClassMapper for
767     global registration of properties dialog classes (which are indeed
768     layer-specific).
769    
770     * Thuban/UI/classifier.py (Classifier.__init__): Unify arguments
771     for general use through properties-dialog selector, the map can be
772     retrieved through the parent and doesn't require an argument of
773     its own.
774    
775     * Extensions/wms/wms.py: Register the properties dialog class for
776     the provided WMS layer
777    
778 jan 2358 2004-09-28 Jan-Oliver Wagner <[email protected]>
779    
780     New feature: Registry for Extensions.
781    
782     * Thuban/UI/extensionregistry.py: This module defines a registry for
783     Extensions.
784    
785     * Thuban/UI/about.py (About.__init__): Added description
786     of the registered extensions with all of the information.
787    
788     * Thuban/Model/extension.py (Extension): Improved doc-string.
789    
790     * Extensions/gns2shp/gns2shp.py, Extensions/importAPR/importAPR.py,
791     Extensions/bboxdump/bboxdump.py, Extensions/profiling/profiling.py,
792     Extensions/wms/wms.py: Added registration of the extension.
793    
794 bernhard 2352 2004-09-27 Bernhard Reiter <[email protected]>
795    
796     More fixes to svgexport to make used ids unique and
797     conforming to XML's Name production.
798    
799     * Extensions/svgexport/test/test_svgmapwriter.py: Added new tests
800     test_xml_id_constraints(), test_make_ide_nosetbaseid() and
801     test_make_id_nonintegersetid(). Switched SetID and SetBaseID.
802     Added Bernhard R. as author.
803     * Extensions/svgexport/svgmapwriter.py (make_id): Using "_" as
804     concatenation char now (makes test_make_ide_nosetbaseid() valid).
805     Also transform second id part with "%d" and catch the TypeError
806     to raise SVGMapWriterError (making test_make_id_nonintegersetid() ok).
807     Corrected typo inBernhard's author line.
808     (SetBaseID): Return the transformed base id. Transform characters
809     which are not alnum() or in ".-_" to binascii.b2a_hex(). Added
810     import binascii. If to be set string starts with "xml" or so, add "t".
811     (draw_shape_layer_incrementally): use the returned value of SetBaseID
812     for used_baseids checks.
813    
814 bh 2351 2004-09-25 Bernhard Herzog <[email protected]>
815    
816     * test/test_layer.py (TestLayer.test_arc_layer_with_projection):
817     Remove a debug print and some tab characters.
818    
819 bernhard 2350 2004-09-25 Bernhard Reiter <[email protected]>
820    
821     * Extensions/svgexport/svgmapwriter.py: Added Bernhard R. as Author.
822     (SetBaseID, SetID, make_id): Improved docstring comments to explain
823     the interaction of the three functions and the XML id contrains.
824    
825 bernhard 2352
826 jan 2346 2004-09-23 Jan-Oliver Wagner <[email protected]>
827    
828 jan 2349 * Doc/ThubanModel.xmi: New. UML file for Thuban Model
829     Module.
830    
831     * Doc/README: Added info on ThubanModel.xmi.
832    
833     2004-09-23 Jan-Oliver Wagner <[email protected]>
834    
835 jan 2346 * Doc/README: New. Some info about how to generate technical
836     documentation from the source code.
837     This text was send to the Thuban developer mailing list on
838     September 21st 2004 by Bernhard Reiter.
839    
840 bernhard 2344 2004-09-21 Bernhard Reiter <[email protected]>
841    
842     Improved the svgexport to only use unique ids. Will issues
843     an error message dialoge when two layer names are the same.
844     ShapeIDs are now added with a dash within the svg ids.
845    
846     * Extensions/svgexport/svgmapwriter.py (SVGMapWriterError): New.
847     * Extensions/svgexport/test/test_svgmapwriter.py: Added imports
848     (TestSVGRenderer): New test class with test_make_in() and
849     test_check_for_layer_name_clash()
850     * Extensions/svgexport/svgmapwriter.py (SVGRenderer): Fixed __init__()
851     and draw_shape_layer_incrementally() to not use a baseid twice,
852     satisfying test_check_for_layer_name_clash()
853     (VirtualDC.make_id): Use a dash between baseit and id, satisfies
854     test_make_in().
855     * Extensions/svexport/svgsaver.py: Import SVGMapWriterError, wxOK
856     and wxICON_HAND.
857     (write_to_svg): Put dc and rendering in a try statement and on
858     catching SVGmapWriterError notify the user and delete the target file.
859    
860 bernhard 2343 2004-09-20 Bernhard Reiter <[email protected]>
861    
862     * Model/base.by, Model/layer.py: Fixed typos in docstrings.
863    
864 jschuengel 2342 2004-09-03 Jan Schüngel <[email protected]>
865    
866     * Extensions/umn_mapserver/mapfile(MF_Class.add_thubanstyle): Fix a
867     small bug with the line color. Now the line color will now only set
868     if it is set in Thuban an not Transparent.
869    
870     * Extensions/umn_mapserver/mf_export(tblayer_to_map): Fixed a bug with
871     deleting the layers from mapfile. Now all layers will delete backwards
872     from the last.
873    
874 silke 2339 2004-08-20 Silke Reimer <[email protected]>
875 silke 2338
876 silke 2339 * Thuban/Model/layer.py:
877     Fixes bug in projection handling: Otherwise very large region might not
878     have valid values in the layer's projection.
879    
880     2004-08-20 Silke Reimer <[email protected]>
881    
882 silke 2338 * Thuban/UI/about.py:
883     small changes to be consistent with coding style.
884    
885 joey 2337 2004-08-13 Martin Schulze <[email protected]>
886    
887     * Extensions/wms/test/test_ogclib.py (TestOGCLib.compare_URLs):
888     Adjusted a comment
889    
890 silke 2335 2004-08-11 Silke Reimer <[email protected]>
891 silke 2334
892 silke 2335 * Thuban/UI/about.py: Small changes to encoding related stuff to avoid
893     too many and too enhanced imports of locale
894    
895 silke 2334 2004-08-10 Silke Reimer <[email protected]>
896    
897     * Thuban/UI/about.py: Fixed encoding problem of about dialog: Added
898 silke 2339 function unicodeToLocale() to convert special characters to users
899     locale encoding
900 silke 2334
901 jan 2333 2004-08-10 Jan-Oliver Wagner <[email protected]>
902    
903     * Doc/technotes/coding_guidelines.txt: Added rule 'Method names start with
904     lower case letter'
905    
906 jschuengel 2331 2004-08-09 Jan Schüngel <[email protected]>
907    
908     * ChangeLog: Rewrite the last ChangeLog entry to follow
909     the standard way.
910    
911     * Extensions/umn_mapserver/mapfile: Moved the import AnnotationLayer to
912     the function where it is needed, because it don't works if it stands
913     at the beginning.
914     (MF_Layer.__init__): Removed the extra numclassed variable. Now
915     numclasses from the mapscript will be used.
916     (MF_Layer.get_index): New. Return the index of the layer in mapfile.
917     (MF_Layer.set_classes): New. A Classlist will be set to the layer.
918     (MF_Layer.set_metadata): New. A Metadata mapscript object will set.
919     (MF_Layer.remove_allclasses): New. All class of the layer will remove.
920     (MF_Map.create_new_layer): New. A new Layer is created and associated
921     with the mapscript object.
922     (MF_Map.set_layerorder): New. The Layer order like in thuban is set in
923     the mapscript.
924     (MF_Map.add_thubanlayer): Now a new layerobj is created if no one is
925     linked to the layer in thuban, else the layerobject linked to the
926     thubanlayer will be used.
927     AnnotationLayer will now store the filename of the shapefile.
928     (MF_Map.remove_layer): If a layer is removed the associated object
929     must be set new.
930    
931     * Extensions/umn_mapserver/mf_export.py(tb_layer_to_map): Add all
932     layers which are exists in thuban to the mapobj. All removed Layers
933     will be removed from the mapobj.
934     Added comments to all functions.
935     (thuban_to_map): No layer will be removed here.
936    
937     * Extensions/umn_mapserver/mf_handle.py
938     (_has_umn_mapobj_and_selectedlayer): Activating the layer menu. Now
939     Layersettings for the mapserver kann be edited.
940    
941     * Extensions/umn_mapserver/mf_import.py: Now all layers which are
942     imported, will be linked with the associated MF_Layer.
943     (import_mapfile): All layers, which are not selected, will be removed.
944     Disable the "import layer from mapfile" menu option.
945    
946     * Extensions/umn_mapserver/sample/iceland.map: Set the status of the
947     Annotation Layer from DEFAULT to OFF. The DEFAULT setting turns the
948     layer on permanently.
949    
950 jschuengel 2323 2004-08-03 Jan Schüngel <[email protected]>
951    
952 jschuengel 2331 * Extensions/umn_mapserver/mapfile.py(MF_Metadata.remove_allmetadata):
953     New. This function removes all metadata
954     (MF_Layer.set_group): New. Set the group setting.
955     (MF_Layer.get_group): New. Get the group setting.
956     (MF_Map): Removed the extra numlayers variable, used the mapscript
957     parameter instead.
958     (MF_Map.get_numlayers): New. This get numlayers.
959     (MF_Map.remove_all_layers): New. Removes all layers from the mapobj.
960 jschuengel 2323 (MF_Map.add_thubanlayer): Replaced the exception handling by a check
961     if the object is an instance. Also added the annotation layer here to
962     export, but only the layer is created in the mapfile.
963    
964 jschuengel 2331 * Extensions/umn_mapserver/mf_export.py(export_mapfile): Removed
965     the check if a mapobj exist, because its not needed anymore. The
966     export function is only available if a mapobj exist.
967     Use the new function to remove all layers.
968 jschuengel 2323
969 jschuengel 2331 * Extensions/umn_mapserver/mf_handle.py(Layer_Dialog): Added a group
970     option and the metadata button. The layer dialog is temporary disabled.
971     (Metadata_CustomDataTable): Added some functions to show the grid
972 jschuengel 2323 correct.
973    
974 jschuengel 2331 * Extensions/umn_mapserver/mf_import.py: Moved the code for showing
975     the number of layer from import_mapfile to this function.
976     (AnnotationLayer): New. This Class shows the Annotation layer in
977     thuban. The layer don't do anything. It's only to show the layer
978     and to save the layer order.
979     (add_annotationlayer): New. Import an annotation layer to thuban.
980     (select_layer2import): New. Import only layers to thuban and not
981     the other settings like projection or scalebar.
982     (create_new_mapfile): Moved the _has_umn_mapobj function and the
983     create_new_mapfile functions from mf_handle.py to mf_import.py.
984 jschuengel 2323
985     * Extensions/umn_mapserver/sample/iceland.map: Added the group
986     parameter to the roads and cultural layers. Also added a new
987     Annotation Layer for the cultural points.
988    
989     * Extensions/umn_mapserver/sample/iceland.html: Added the select
990     option for the annotation layer.
991    
992     * Extensions/umn_mapserver/sample/index.html: Added the start
993     parameter for the annotation layer.
994    
995 jan 2315 2004-08-01 Jan-Oliver Wagner <[email protected]>
996    
997     * Doc/manual/thuban-manual-de.xml (Chapter Session Management):
998     translation completed.
999    
1000     * Doc/manual/thuban-manual.xml (Chapter Session Management):
1001     Fixed unprecise description for Save Session.
1002    
1003 jan 2312 2004-07-31 Jan-Oliver Wagner <[email protected]>
1004    
1005     Started translation of Users Manual into german.
1006    
1007     * Doc/manual/thuban-manual-de.xml: New. German Users Manual.
1008    
1009     * Doc/manual/Makefile: Added build instructions for german
1010     users manual.
1011    
1012     * Doc/manual/thuban-manual.xml: Minor corrections in Introduction.
1013    
1014 jschuengel 2308 2004-07-28 Jan Schüngel <[email protected]>
1015    
1016     * Extensions/umn_mapserver/mapfile.py(MF_Metadata): Changed all class
1017     functions. Now all metadata will handle by the function and its not
1018     needed to initialize it from outside. Therefor the associated mapobj
1019     will be stored in the Metadata Object. So we can use the special
1020     functions from the associated mapobj to get the Metadata.
1021     Therefor all initialization code for the metadata is removed from the
1022     other classes.
1023     (MF_Layer): Added a function to get the metadata object.
1024     (MF_Map): Added a function to set the mappath, the path where
1025     the mapfile ist stored.
1026    
1027     * Extensions/umn_mapserver/mf_export.py(thuban_to_map): Changed the code
1028     to set the extent in the mapfile. Now the code is set by the displayed
1029     data in the Thuban-view.
1030     (export_mapfile): The shapepath is now set empty, until relative
1031     pathnames are supported.
1032    
1033     * Extension/umn_mapserver/mf_handle.py: Added a dialog to handle
1034     metadata. Yet only mapfile metadata are supported. Layer and class
1035     supported are not implemented.
1036     Added a dialog to handle layer informations. The dialog only shows the
1037     selected layer at the moment.
1038    
1039     * Extensions/umn_mapserver/mf_import.py(import_mapfile): Changed the
1040     code for setting the extent in thuban. Now the extent is set to the
1041     given extent from the mapfile.
1042     Fixed a logical mistake. Now the extent is set when realy a layer is
1043     loaded, and not if one is selected to load.
1044    
1045     * Extensions/umn_mapserver/sample/iceland.html: Added code to zoom and
1046     move the shown map in the browser.
1047    
1048     * Extensions/umn_mapserver/sample/iceland.map: Added a new metadata
1049     line to the mapobj and added metadata to the political layer.
1050    
1051     * Extensions/umn_mapserver/test/test_mapserver.py: Changed the test
1052     for Metadata.
1053    
1054 joey 2300 2004-07-26 Martin Schulze <[email protected]>
1055    
1056     * Thuban/Lib/classmapper.py (ClassMapper.has): Added the new
1057     ClassMapper
1058    
1059     * test/test_classmapper.py (TestMapping.test_mapper): Added a Test
1060     case for the new ClassMapper
1061    
1062    
1063 bh 2296 2004-07-22 Bernhard Herzog <[email protected]>
1064    
1065 bh 2297 * Thuban/UI/viewport.py (ViewPort.VisibleExtent): New. Return the
1066     visible extent of the map in projected coordinates
1067    
1068     * test/test_viewport.py (SimpleViewPortTest.test_default_size)
1069     (SimpleViewPortTest.test_init_with_size): Add some VisibleExtent()
1070     tests.
1071     (SimpleViewPortTest.test_visible_extent): New. The real test for
1072     VisibleExtent()
1073    
1074     2004-07-22 Bernhard Herzog <[email protected]>
1075    
1076 bh 2296 * test/test_viewport.py: Use support.run_tests as the main
1077     function when running asa script.
1078    
1079 jschuengel 2295 2004-07-22 Jan Schüngel <[email protected]>
1080    
1081     * Extensions/umn_mapserver/mf_export.py: Added "import os"
1082     Removed the old "import Thuban.UI.mainwindow" code.
1083     (tbextent_to_map): Removed the extra function and at the code direct
1084     to "thuban_to_map" function.
1085     (write_creatorcomment): Added. Now a short comment is added to the
1086     beginning of an generated mapfile.
1087     (export_mapfile): Now the Path and filename are saved in to variables,
1088     and not together in one variable. This is needed for the new
1089     write_creatorcomment function.
1090    
1091     * Extensions/umn_mapserver/mf_import.py (import_mapfile): Added the
1092     import module "re". Also added Range and the ClassGroupRange import
1093     from Thuban. Both are needed for the new range expression import.
1094     (create_rangeexpression): Added. Creates a Range Expression in Thuban
1095     style from a given mapfile expression.
1096     (added_rasterlayer): Make some small code changes. The shapepath is
1097     now stored in an extra variable and the clazz_name is set empty if no
1098     class name set in the mapfile.
1099     Changed the Error message for Range Expressions, becaus the new
1100     function create a error string which will be shown in the dialog.
1101    
1102     * Extensions/umn_mapserver/test/test_mapserver.py: Added a test for the
1103     range expression import.
1104 jan 2312
1105 jan 2291 2004-07-21 Jan-Oliver Wagner <[email protected]>
1106    
1107     * Extensions/umn_mapserver/README: Added hint that
1108     installation as root can be avoided. Removed all tabs.
1109    
1110 bh 2289 2004-07-16 Bernhard Herzog <[email protected]>
1111    
1112     * test/test_viewport.py
1113     (ViewPortTest.test_changing_map_projection): Check that changing
1114     the projection of an empty map shown in a viewport doesn't lead to
1115     exceptions in the viewport's handler for the
1116     MAP_PROJECTION_CHANGED messages
1117    
1118     * Thuban/UI/viewport.py (ViewPort.map_projection_changed): Only
1119     try to keep the same region visible when the map actually contains
1120     something
1121    
1122 jschuengel 2288 2004-07-15 Jan Schüngel <[email protected]>
1123    
1124     * Extensions/umn_mapserver/mapfile.py: Added a function to get the
1125     mappath directly from the mapobj. Is needed because of the changes
1126     in mf_import.py.
1127     (MF_Layer.add_thubanclass): Added a new comment.
1128     (MF_Map.set_extent): Fixed a bug with exporting empty mapobj. If the
1129     mapobj is empty there is no extent get from thuban an so no one can
1130     set to th mapobj.
1131    
1132     * Extensions/umn_mapserver/mf_import.py (import_mapfile): Updated
1133     the discription.
1134     Split the funktion in to three smaller ones. The new functions are
1135     add_rasterlayer, add_polygonlayer and select_layer2import.
1136     Removed the mapfilepath and filepath initialisation, because its know
1137     include in the new functions.
1138     Now nothing will be imported if cancel is pressed in the
1139     layer choice dialog.
1140    
1141 jschuengel 2285 2004-07-14 Jan Schüngel <[email protected]>
1142    
1143     * Extensions/umn_mapserver/mapfile.py: Added ClassGroupDefault to
1144     import.
1145     (MF_Symbolset): Removed the extra variable for numsymbols.
1146     (MF_Class.__init__): Added a comment to the exception clause.
1147     Removed the extent init, because it was not needed anymore.
1148     (MF_Layer.add_thubanclass): Added the code to set the class name to
1149     the expression value from thuban if no label is defined.
1150     Added the code to export Range expressions from thuban to the mapfile.
1151     (MF_Map.set_extent): Removed the exception and replace it by some if
1152     code. If the size of a map is not defined the size will be set to 1,1.
1153     This is necessary because if the extent is set, mapscript checks if
1154     the size is greater than zero.
1155     (MF_Web): Added the get and set function for the template.
1156    
1157     * Extensions/umn_mapserver/mf_export.py: Added the function to check
1158     if a mapobject exists and used it to set the status of the menu items.
1159     If no mapfile exists the settings could not be edditied.
1160     Define after which menuitem the exportitem will include.
1161    
1162     * Extensions/umn_mapserver/mf_handle.py: Removed the import
1163     Thuban.UI.mainwindow clause, because it is not needed.
1164     Added the command Refresh() to all "OnChangeColor()" functions,
1165     because the color preview window was not updated on a color change.
1166     Added the function to check if a mapobject exists and used it to set the
1167     status of the menu items. If no mapobject exists the settings could not
1168     be edditied.
1169     (Map_Dialog): Moved the imagetype selector from the
1170     Outputformat_Dialog to Map_Dialog and removed Outputformat_Dialog.
1171     (Web_Dialog): Removed the name label and added the template textbox.
1172    
1173     * Extensions/umn_mapserver/mf_import.py (import_mapfile): Replace
1174     the exception handling on loading the layers by an if statement. It
1175     is not necessary to us the exception there.
1176     The Filepath creation now use os.path.join to build the path.
1177    
1178     * Extensions/umn_mapserver/test/test_mapserver.py: Moved the testMap
1179     definition from global to the setUp function. Now the testMap will
1180     initialize new on each test.
1181    
1182     * Extensions/umn_mapserver/sample/iceland.map: Include three new
1183     classes in the Line Layer, to test logical Expressions.
1184     Set the status of the class "Point9" in the Point Layer to off
1185    
1186 bh 2278 2004-07-13 Bernhard Herzog <[email protected]>
1187    
1188     * Thuban/UI/baserenderer.py
1189     (BaseRenderer.render_map_incrementally): Fix a logic bug in the
1190     optimization that tries not to draw layers under a raster layer.
1191     The bug was harmless. All it effectively did was to produce The a
1192     strange messages about not being able to draw Layer instances for
1193     all vector layers below a raster layer which would be invisible
1194     anyway because the raster layer currently always covers the entire
1195     window
1196    
1197 jschuengel 2277 2004-07-08 Jan Schüngel <[email protected]>
1198    
1199     * Extensions/umn_mapserver/mapfile.py: Added code to generade and get
1200     a list of supported outputformats. This formats are not alle supported
1201     because there is no possibility to get the outputformat without the
1202     name known. Make some formal changes to the code.
1203     (MF_Map.set_name()): Fixed a bug if the name is None.
1204    
1205     * Extensions/umn_mapserver/mf_handle.py: Removed the image_type import
1206     statement, because its not needed anymore. The Outputformat is now
1207     given as string from the object. Make some formal changes to the code.
1208    
1209     * Extensions/umn_mapserver/test/test_mapserver.py: Added new test for
1210     most of the new setting which were added during the last changes.
1211     Removed the MF_Size Test.
1212    
1213     * Extensions/umn_mapserver/test/test.map: Added a new class to the
1214     cultural Layer to test expressions and the the status of that layer
1215     from on to default.
1216     Changed the data path the the correct Thuban Data
1217     Added the Outputformat Object and Symbol Object
1218    
1219 jschuengel 2272 2004-07-07 Jan Schüngel <[email protected]>
1220    
1221     * Extensions/umn_mapserver/mapfile.py: Added some new
1222     settings to edit (outputformat, label, imagetype)
1223    
1224     * Extensions/umn_mapserver/mf_handle.py: Added some setting to
1225     the Label Dialog and add the OutputDialog.
1226     Make some changes to the code order.
1227    
1228 jschuengel 2269 2004-07-06 Jan Schüngel <[email protected]>
1229    
1230     * Extensions/umn_mapserver/mapfile.py: Added the symbolObj, pointObj
1231     and line Obj and add the scalebar_status_type, scalebar_style_type and
1232     scalebar_position_type.
1233     Added the symbol- and symbolsetObject (MF_Symbol,MF_Symbolset). The
1234     are only used to create a Symbol like the circle in Thuban.
1235     Added the scalebarObject (MF_Scalebar)
1236     (MF_Class): Added set_status and get_status.
1237     (MF_Layer.add_thubanclass): Added code to set the class status
1238     (MF_Map): Added code to handle the symbols and scalebar
1239     (MF_Label): Added the set_partials and get_partials functions
1240    
1241     * Extensions/umn_mapserver/mf_export.py: Added MF_Symbol to import
1242     from mapfile. Added a function to create a circle object like the one
1243     from thuban if no one exists.
1244    
1245     * Extensions/umn_mapserver/mf_handle.py: All colors are now set when
1246     press ok in the assosiated dialog and not at the end of the
1247     colordialog.
1248     Added the Dialog for the Scalebar.
1249     (Label_Dialog): Added the offset option
1250    
1251     * Extensions/umn_mapserver/mf_import.py: Added code to import the
1252     status of the Classes.
1253     Fixed a bug with the projection. Now the to_meter parameter will be
1254     added to the Projection only if it doesn't exists.
1255    
1256 jschuengel 2264 2004-07-01 Jan Schüngel <[email protected]>
1257    
1258     Added the functionality to handle the content thuban is not
1259     able to handle directly.
1260    
1261     * Extensions/umn_mapserver/mf_handle.py: New. This module extents
1262     Thuban with the possibility to edit the mapfile content.
1263    
1264     * Extensions/umn_mapserver/mf_import.py: Added the possibility
1265     to import mapfiles without any layer selected. So it is possible
1266     to edit the other settings in a mapfile.
1267     (import_mapfile): Added code to use the editing functions.
1268     Added the possibility to import the projection to a layer if one
1269     is defined.
1270     Status settings (On,Off) will now set in thuban (visible, invisible).
1271     fixed a bug with with classnames. If no classname is set in mapfile
1272     the value in Thuban will set to the expression.
1273    
1274     * Extensions/umn_mapserver/mf_export.py(export_mapfile): Added the
1275     possibility to save a new mapfile or use the old one which is
1276     imported or new created.
1277     Added code to use the editing functions.
1278     Remove some not needed import statements
1279    
1280     * Extensions/umn_mapserver/mapfile.py: Added new types which are
1281     need for the editing functions.
1282     Added needed set-functions for the editing functions.
1283     Added the possibility to export rasterimages.
1284     Added new classes (MF_Web, MF_Label, MF_Legend, MF_Symbol,
1285     MF_SymbolSet). MF_Symbol and MF_SymbolSet are not needed at the
1286     moment.
1287     (MF_Class.set_thubanstyle): Now point layers will set to a default
1288     symbol to show a circle in mapserver and not only a 1px dot.
1289     (MF_Style.__init__): Fixed a bug with the color. Color was not set
1290     correct before.
1291     (MF_Size): Removed, because it is not needed.
1292    
1293     * Extensions/umn_mapserver/README: Added the hints to use the
1294     export and editing functions, too.
1295    
1296     * Extensions/umn_mapserver/sample/iceland.map: Added the
1297     new parameter "UNITS METERS".
1298     Change the political layer to status OFF.
1299    
1300     * Extensions/umn_mapserver/sample/README: Added some
1301     more details to setup the sample in the MapServer.
1302    
1303 bernhard 2256 2004-06-26 Bernhard Reiter <[email protected]>
1304    
1305     * Extensions/svgexport/test/test_svgmapwriter.py:
1306     Removed class VFile and used standard StringIO instead.
1307    
1308 jschuengel 2255 2004-06-23 Jan Schüngel <[email protected]>
1309    
1310     Add the export function to the umn_mapserver extension.
1311    
1312     * Extension/umn_mapserver/mf_export.py: New. This module extents
1313     Thuban with the possibility to export the Thuban content.
1314    
1315     * Extensions/umn_mapserver/mapfile.py: Expand the classes to use
1316     with the export module. Especially added the possibility to
1317     add thuban objects directly to the map objects.
1318    
1319     * Extensions/umn_mapserver/mf_import.py: Removed the wxCHANGE_DIR,
1320     because of the hint from Bernhard Herzog.
1321     Corrected the handling of absolute pathnames.
1322     Changed the Text of the Menu-Item, now the beginning is upper case.
1323    
1324     * Extensions/umn_mapserver/README: Added the --with-tiff statement.
1325    
1326 jschuengel 2250 2004-06-16 Jan Schüngel <[email protected]>
1327 jschuengel 2242
1328 jschuengel 2250 Add a sample and make some changes.
1329    
1330     * Extension/umn_mapserver/mf_import.py: Changed the wxPython.wx
1331     import from * to explicit used statements. Changed the
1332     Thuban.UI.mainwindow import phrase, too.
1333     (import_mapfile):Corrected a clerical mistake.
1334     Added wxCHANGE_DIR in OpenFile Dialog.
1335     Added a MultipleChoiceDialog, to select the layers to load from
1336     mapfile into thuban. Thereby the projection is only set if one layer
1337     is selected.
1338     Added the possibility to handle relative pathnames which uses
1339     up-level references.
1340     Removed some doubled code.
1341     Corrected an error with integer values used as label in thuban
1342     ClassGroup.
1343    
1344     * Extensions/umn_mapserver/sample: New.
1345    
1346     * Extensions/umn_mapserver/sample/README: New. Describes the
1347     usage of the sample files.
1348    
1349     * Extensions/umn_mapserver/sample/iceland.map: New. This is
1350     a suitable .map-file for the iceland data.
1351    
1352     * Extensions/umn_mapserver/sample/index.html: New. The template
1353     for the mapfile.
1354    
1355     * Extensions/umn_mapserver/sample/iceland.html: New. Initialisation
1356     file for the Iceland Application on web.
1357    
1358     * Extensions/umn_mapserver/README: Corrected a inaccuracy and added
1359     some details.
1360    
1361     * Extensions/umn_mapserver/test/test_mapserver
1362     (mapserver_import_Test_generalClasses.test_MF_Color):
1363     Corrected the thubancolor test.
1364    
1365     2004-06-15 Jan Schüngel <[email protected]>
1366    
1367 jschuengel 2242 * Extensions/umn_mapserver/README: New. Install instruction.
1368    
1369 bernhard 2240 2004-06-14 Bernhard Reiter <[email protected]>
1370    
1371     * libraries/thuban/cpl_mfile.h: Added copyright header.
1372    
1373     * libraries/thuban/ cpl_mfile.cpp, cpl_mfile.h: Added non-protecting
1374     Free Software License so that it is most useful with gdalwarp
1375     and bmpdataset.
1376    
1377 bh 2239 2004-06-14 Bernhard Herzog <[email protected]>
1378    
1379     * Thuban/UI/multiplechoicedialog.py (__version__): Add missing
1380     import of wxPython.wx itself (as opposed to the contents of
1381     wxPython.wx). For some reason wxPython.wx is available as
1382     wxPython.wx.wx in at least some 2.4 releases. Fixes RT#2482
1383     wrt. wxPython 2.4.
1384    
1385 jschuengel 2238 2004-06-10 Jan Schüngel <[email protected]>
1386    
1387     Initial version of new extension "umn_mapserver". This extension aims
1388     to manage configuration for the UMN MapServer application. This
1389     inital version just imports the .map-files and displays all, Thuban is
1390     capable of.
1391    
1392     * Extensions/umn_mapserver, Extensions/umn_mapserver/test: New.
1393    
1394     * Extensions/umn_mapserver/test/README: New. Describes how to run the
1395     tests.
1396    
1397     * Extensions/umn_mapserver/test/test.map: New. This is a test
1398     .map-file for automated tests of the umn_mapserver extension of
1399     Thuban.
1400    
1401     * Extensions/umn_mapserver/test/test_mapserver.py: New. Tests for
1402     UMN Mapserver classes.
1403    
1404     * Extensions/umn_mapserver/__init__.py: New. Init to make this
1405     directory a package.
1406    
1407     * Extensions/umn_mapserver/mapfile.py: New. Classes to represent
1408     '.map'-file objects.
1409    
1410     * Extensions/umn_mapserver/mf_import.py: New. This module extends
1411     Thuban with the possibility to handle UMN MapServer mapfiles.
1412    
1413 bh 2230 2004-06-03 Bernhard Herzog <[email protected]>
1414    
1415     * Thuban/Model/layer.py (Layer.TreeInfo): Convert the bounding box
1416     to a tuple before using it as arguments to the % operator. This
1417     fixes the formatting issue filed in RT#2239 on 2004-01-13 and
1418     reported today on thuban-list by Jan Schüngel
1419    
1420     * test/test_layer.py (TestLayerModification.setUp): Save the
1421     filename as an instance variable so we can refer to it in tests
1422     (TestLayerModification.test_tree_info): Uncomment this method
1423     again and make it work. This tests for the formatting issue
1424     filed in RT#2239 on 2004-01-13
1425    
1426 bh 2224 2004-05-28 Bernhard Herzog <[email protected]>
1427    
1428     * Thuban/UI/baserenderer.py: Fix some typos.
1429    
1430 jan 2217 2004-05-18 Jan-Oliver Wagner <[email protected]>
1431    
1432     * Extensions/gns2shp/gns2shp.py (gns2shp): Fixed a bug
1433     by increasing a field size.
1434    
1435 bh 2213 2004-05-17 Bernhard Herzog <[email protected]>
1436    
1437     Update to newest shapelib and get rid of Thuban specific
1438     extensions, i.e. use the new DBFUpdateHeader instead of our
1439     DBFCommit kludge
1440    
1441     * libraries/shapelib/shpopen.c: Update to version from current
1442     shapelib CVS.
1443    
1444     * libraries/shapelib/shapefil.h: Update to version from current
1445     shapelib CVS.
1446    
1447     * libraries/shapelib/dbfopen.c: Update to version from current
1448     shapelib CVS.
1449     (DBFCommit): Effectively removed since shapelib itself has
1450     DBFUpdateHeader now which is better for what DBFCommit wanted to
1451     achieve.
1452     We're now using an unmodified version of dbfopen.
1453    
1454     * setup.py (extensions): Add the HAVE_UPDATE_HEADER macro with
1455     value '1' to the Lib.dbflibc extension. This simply reflects the
1456     shapelib and pyshapelib updates
1457    
1458 jan 2211 2004-05-16 Jan-Oliver Wagner <[email protected]>
1459    
1460     Finished introduction of Menu.FindOrInsertMenu.
1461    
1462     * Extensions/drawshape/drawshape.py: Add the command
1463     to the experimental menu additionally to the toolbar.
1464    
1465     * Extensions/svgexport/svgsaver.py: Use FindOrInsertMenu() instead of
1466     finding menu on its own.
1467    
1468     * Doc/manual/thuban-manual.xml: updated sample file
1469     to use FindOrInsertMenu().
1470    
1471     * Examples/simple_extensions/hello_world.py: Use FindOrInsertMenu()
1472     instead of finding menu on its own.
1473    
1474 jan 2206 2004-05-11 Jan-Oliver Wagner <[email protected]>
1475    
1476     * test/test_menu.py (MenuTest.test): Added testing
1477     of method Menu.FindOrInsertMenu.
1478    
1479 jan 2204 2004-05-10 Jan-Oliver Wagner <[email protected]>
1480    
1481     Introduce and use Menu.FindOrInsertMenu.
1482    
1483     * Thuban/UI/menu.py (Menu.FindOrInsertMenu): New. Find a
1484     given menu or, if not found, insert it.
1485    
1486     * Extensions/bboxdump/bboxdump.py, /Extensions/gns2shp/gns2shp.py,
1487     /Extensions/importAPR/importAPR.py, Extensions/profiling/profiling.py,
1488     /Extensions/wms/wms.py: Use FindOrInsertMenu() instead of finding
1489     menu on its own.
1490    
1491 jan 2201 2004-05-06 Jan-Oliver Wagner <[email protected]>
1492    
1493     Introduce a abstract ColorDialog class and remove
1494     and outdated file.
1495    
1496     * Thuban/UI/proj4dialog.py: Removed. It is has been
1497     replaced by projdialog for quite a while and is not used
1498     anymore.
1499    
1500     * Thuban/UI/colordialog.py: New. Abstraction for color selection
1501     dialog(s).
1502    
1503     * Thuban/UI/classifier.py (SelectPropertiesDialog.__GetColor):
1504     Now calls the abstract ColorDialog instead of wxColourDialog.
1505     This also removed the dependency to Color class conversion
1506     from this function.
1507    
1508 frank 2197 2004-05-04 Frank Koormann <[email protected]>
1509    
1510     * Extensions/bboxdump/__init__.py: Fixed string left over from
1511     copying.
1512    
1513     * Extensions/bboxdump/bboxdump.py (bboxdump):
1514     Use layer.ShapeStore().AllShapes() to loop over shapes instead of
1515     xrange(layer.NumShapes()). Compile the bboxmessage from a list
1516     of formatted outputs (string.join) instead of appending to the
1517     message. Two progress bar dialogs to report progress on the sometimes
1518     lenghty processing.
1519    
1520 frank 2196 2004-04-22 Frank Koormann <[email protected]>
1521    
1522     New Extension to dump bounding boxes of all shapes of the selected
1523     layer. An optional column can be specified to group the objects,
1524     in this case the bounding box is a union of the separate boxes.
1525     Dump can be displayed in a ScrolledMessageDialog or written to file.
1526     The Extension is simply a combination of available and well tested
1527     Thuban functionality.
1528    
1529     * Extensions/bboxdump/__init__.py: New: Init to make this
1530     directory a package.
1531    
1532     * Extensions/bboxdump/bboxdump.py: New: Dump bounding boxes of
1533     all shapes of the selected layer.
1534    
1535 jan 2192 2004-04-22 Jan-Oliver Wagner <[email protected]>
1536    
1537     * Thuban/UI/classgen.py (GenUniquePanel.__init__): Fixed two
1538     strings to be i18n now.
1539    
1540 jan 2188 2004-04-18 Jan-Oliver Wagner <[email protected]>
1541    
1542     Changing popup menu of legend from direct building
1543     to using the Menu construction as used for the mainwindow.
1544    
1545     * Thuban/UI/mainwindow.py: New method commands: layer_to_top,
1546     layer_to_bottom, layer_visibility
1547     (MainWindow.LayerToTop): New. Put current layer to the top.
1548     (MainWindow.LayerToBottom): New. Put current layer to bottom.
1549     (MainWindow.HideLayer, MainWindow.ShowLayer, _has_visible_map):
1550     Replace 1,0 by True, False.
1551     (MainWindow.ToggleLayerVisibility): New. Toggle visibility of
1552     current layer.
1553     (MainWindow.LayerShowTable): Removed raising of dialog.
1554     (_has_selected_layer_visible): New. Support function.
1555    
1556     * Thuban/UI/legend.py: ID_POP_xxx: removed.
1557     (LegendPanel.__init__): Removed EVT_MENU bindings.
1558     (LegendTree._OnRightClick): Replace direct creation of
1559     menu via wx Classes by applying the menu definition
1560     as of Menu class of menu.py.
1561    
1562 jan 2185 2004-04-16 Jan-Oliver Wagner <[email protected]>
1563    
1564     * Thuban/UI/exceptiondialog.py (ExceptionDialog.dialog_layout): Improved
1565     button string to stronger clearify that Thuban will be closed when hitting
1566     the button.
1567    
1568     * Thuban/UI/mainwindow.py (MainWindow.LayerShowTable): Added docstring.
1569     Now for layers without a ShapeStore a corresponding message is given
1570     to the user, that this layer has no table to show.
1571    
1572 joey 2182 2004-04-15 Martin Schulze <[email protected]>
1573    
1574     * Extensions/wms/layer.py (WMSLayer.setWMSFormat): Need to
1575     recalculate the format for the internal render engine as well.
1576    
1577     * Extensions/wms/properties.py (wmsProperties): First start for a
1578     properties dialog. It's functional for a first selection of
1579     layers, but still has some weired wxWidgets/GTK problems but
1580     beautification can be done later.
1581    
1582     * Extensions/wms/layer.py: Added more documentation
1583     (WMSLayer.getFormats): New: Return list of supported image formats
1584     by the WMS server
1585     (WMSLayer.getLayers): New: Return the list of layer names
1586     supported by the WMS server
1587     (WMSLayer.getLayerTitle): New: Return the title of the named layer
1588     (WMSLayer.getWMSFormat): New: Return the image format that is used
1589     for WMS GetMap requests
1590     (WMSLayer.setWMSFormat): New: Set the image format that is used
1591     for WMS GetMap requests
1592     (WMSLayer.__init__): Move away from using only one layer to using
1593     a list of layers (unsorted at the moment, though).
1594     (WMSLayer.getVisibleLayers): New: Return the list of names for all
1595     visible layers
1596     (WMSLayer.setVisibleLayers): New: Set the list of names for all
1597     visible layers
1598    
1599     * Extensions/wms/wms.py: Moved the WMS layer into layer.py in
1600     order to establish a clean structure.
1601    
1602     * Extensions/wms/layer.py: Moved the WMS layer into a file on its
1603     own in order to establish a clean structure.
1604    
1605 joey 2174 2004-04-13 Martin Schulze <[email protected]>
1606    
1607     * Extensions/wms/parser.py (WMSCapabilitiesParser.grok): Added
1608     support for oldstyle (WMS 1.0 apparently) image format
1609     specification.
1610    
1611     * Extensions/wms/wms.py (WMSLayer.calcFormat): Reduce the list of
1612     supported graphic formats back to JPEG and BMP, PNG and others are
1613     too *cough* experimental... Sorry, I meant to filter this out
1614     before I committed this part. This should make the WMS extension
1615     run from CVS again.
1616     (wms_dialog): Reset an empty URL to None so that the subsequent
1617     program can depend on this, since the dialog will indeed return an
1618     empty URL, causing another declaration of love by Python.
1619    
1620     * Extensions/wms/parser.py (WMSCapabilitiesParser.getLayerBBox):
1621     Whenever a native BoundingBox request cannot be fulfilled, check
1622     whether the requested SRS is EPSG:3426, in which case return the
1623     LatLonBoundingBox values.
1624    
1625     * Extensions/wms/test/test_parser.py
1626     (TestWMSCapabilitiesParser.test_LayerSRS): Added a test for
1627     ignoring AUTO:* SRS.
1628     (TestWMSCapabilitiesParser.test_LatLonBoundingBoxes_as_bboxes):
1629     Added another test method to test whether the LatLonBoundingBox
1630     values will be returned if BoundingBox values are requested with
1631     SRS set to EPSG:3426.
1632    
1633     * Extensions/wms/parser.py (WMSCapabilitiesParser.peekLayers):
1634     Added rudimentary support for non-EPSG SRS, i.e. ignore them for
1635     the moment by placing them into a variable which is currently
1636     unused. Also test whether the EPSG SRS is numerical as it should
1637     be and add an error message if it is not.
1638    
1639     * Extensions/wms/test/sample.xml: Added AUTO:* SRS since they
1640     appear in the real world as well. Since we cannot handle them yet
1641     (OGCLib can't either), we will ignore them for the moment.
1642    
1643     * Extensions/wms/parser.py: Use a variable for denoting the sample
1644     filename
1645     (WMSCapabilitiesParser.peekLayers): Added support for error
1646     messages during grok(). They will be aggregated in an array and
1647     may be displayed later. We may have to add a classification
1648     "Warning" and "Error" to this. That requires more experience,
1649     though, since not every error may be lethal.
1650    
1651     * Thuban/UI/mainwindow.py (MainWindow.LayerShowTable): Raise the
1652     ShowTable() dialog/frame when the user attempts to display it
1653     while it has been opened before already and not closed again.
1654    
1655 joey 2161 2004-04-11 Martin Schulze <[email protected]>
1656    
1657     * Extensions/wms/infodialog.py: Adjusted the class documentation
1658    
1659     * Extensions/wms/wms.py (WMSLayer.__init__, WMSLayer.GetMapImg):
1660     Switch to using Thuban{Begin,End}BusyCursor instead of the pure
1661     wxWidgets variants.
1662     (WMSLayer.__init__): The epsg_id variable is named top_srs now.
1663    
1664     * Extensions/wms/infodialog.py: Added an information dialog that
1665     will display various information about the WMS current resource,
1666     so that additional information such as the title, the abstract,
1667     fees and access constraints can be displayed for the user if they
1668     are documented in the WMS XML.
1669    
1670 joey 2156 2004-04-10 Martin Schulze <[email protected]>
1671    
1672     * Extensions/wms/parser.py (WMSCapabilitiesParser.grok): Adjusted
1673     string handling. It's "foo".lower() and not lower(foo) without
1674     lower imported from strings or something.
1675    
1676     * Extensions/wms/wms.py (WMSLayer): Incorporated WMSCapabilities
1677     from capabilities.py and parser.py. Implement priority list for
1678     supported graphics formats, take care of wbmp != bmp. PNG, TIFF
1679     and GIF are supported here, but not yet by main Thuban. Hence,
1680     support for them may be removed later. Special contribution to
1681     usability: get wxWidgets to change the cursor when we're waiting
1682     for data from the network so the user won't start to worry. This
1683     causes a redrawing error/warning, though.
1684    
1685     * Extensions/wms/parser.py (WMSCapabilitiesParser.grok): Unlink
1686     the DOM object.
1687    
1688     2004-04-01 Martin Schulze <[email protected]>
1689    
1690     * Extensions/wms/capabilities.py: Adjusted documentation
1691     (WMSCapabilities.__init__): Improved documentation, fixed syntax
1692     (WMSCapabilities.saveCapabilities): Only catch IOError when
1693     handling files
1694     (WMSCapabilities.loadCapabilities): Only catch IOError when
1695     handling files
1696     __main__: corrected variable naming
1697     (WMSCapabilities.fetchCapabilities,loadCapabilities): Make this
1698     class a specialisation of WMSCapabilitiesParser as well. Also
1699     execute grok() after loading or fetching capabilities, if that
1700     went well, so that subsequent calls can already access the data.
1701     (WMSCapabilities.getVersion): Export the used version of the
1702     GetCapabilities request, so we can use it for subsequent calls,
1703     i.e. for GetMap requests.
1704     (WMSCapabilities.fetchCapabilities): Added proper error handling
1705     when the GetCapabilities request failed, so that the surrounding
1706     program can act accordingly.
1707    
1708 joey 2146 2004-03-30 Martin Schulze <[email protected]>
1709    
1710     * Extensions/wms/parser.py (WMSCapabilitiesParser.getLayerSRS):
1711     Adjusted the getLayerSRS method to return the list of SRSes
1712     extracted from <SRS> elements instead of <BoundingBox> elements.
1713     Added a bit of documentation as well.
1714     (WMSCapabilitiesParser.checkLayerSRS): Removed integrity test
1715     since it was only implemented due to a misunderstanding.
1716    
1717     * Extensions/wms/test/test_parser.py
1718     (TestWMSCapabilitiesParser.test_LayerSRS): Adjust the tests to
1719     reflect the corrected interpretation of the standard: i.e. a layer
1720     does not have to define a BoundingBox for all SRSes it supports.
1721     Hence the <SRS></SRS> specification is authoritative, not the list
1722     of BoundingBoxes.
1723     (TestWMSCapabilitiesParser.test_BoundingBoxes): Added a new test
1724     to ensure None is returned for a non-existing SRS.
1725     (TestWMSCapabilitiesParser.test_grok): Removed test_grok method
1726     since it is not applicable anymore. Listing more SRSes in <SRS>
1727     elements is valid according to the specs.
1728    
1729 bernhard 2140 2004-03-26 Bernhard Reiter <[email protected]>
1730 joey 2146
1731 bernhard 2140 * README: Nicer formatting of text. Improved descriptions.
1732     Reflected wxWidgets name change.
1733    
1734     * Thuban/UI/about.py: Extended copyright to 2004 and added
1735     information about the thuban-devel mailinglist.
1736    
1737 joey 2138 2004-03-24 Martin Schulze <[email protected]>
1738 joey 2120
1739 joey 2138 * Extensions/wms/capabilities.py: Renamed the class to contain
1740     'WMS', also added a linebreak where required
1741    
1742     * Extensions/wms/parser.py: Finally added the XML parser for the
1743     GetCapabilities response.
1744    
1745     * Extensions/wms/test/sample.xml: Adjusted the sample file so that
1746     <SRS> elements match the <BoundingBox> elements, except for the
1747     layer 'beschriftung'.
1748    
1749     * Extensions/wms/test/test_parser.py: Encode non-ascii strings
1750     since Python uses unicode strings internally, otherwise
1751     comparisons will fail. Removed tests for getLayerBBoxSRS() since
1752     the SRS will be calculated anyway and this method is obsoleted by
1753     getLayerSRS(). Denote SRS as strings and not as cardinal numbers.
1754     Move loading the sample file into the setUp method. Added a test
1755     for finding the integrity problem in the sample response.
1756     Improved formatting.
1757    
1758     * Extensions/wms/domutils.py: Added convenience routines for
1759     handling of Document Object Model (DOM) nodes.
1760    
1761     * Extensions/wms/test/test_domutils.py: Added a test for the
1762     domutils module
1763    
1764     2004-03-19 Martin Schulze <[email protected]>
1765    
1766 joey 2120 * Extensions/wms/test/test_parser.py (TestWMSCapabilitiesParser):
1767     Moved path detection and adding into a module of its own,
1768     adjustpath, which exports thubandir as main Thuban directory.
1769    
1770     * Extensions/wms/test/test_ogclib.py (TestWMSLib): Moved path
1771     detection and adding into a module of its own, adjustpath, which
1772     exports thubandir as main Thuban directory. Reorganised the
1773     module in order to support the SkipTest feature for Thuban test
1774     cases.
1775    
1776     * Extensions/wms/test/adjustpath.py: Moved path detection and
1777     adding into a module of its own.
1778    
1779 joey 2115 2004-03-18 Martin Schulze <[email protected]>
1780    
1781     * Extensions/wms/test/test_parser.py: Added another test for
1782     checking whether the WMS XML parser (to be implemented) returns
1783     the information we expect. This requires a sample WMS WML file
1784     (sample.xml) which has been extracted from the frida server and
1785     "improved" manually.
1786    
1787     * Extensions/wms/test/test_ogclib.py: Added legacy code to add the
1788     main Thuban directory to the path in order to be able to import
1789     random modules. Adjusted the PyOGCLib detection to reuse the
1790     information gathered. Also added a note about the PYTHONPATH
1791     environment variable.
1792    
1793     * Extensions/wms/test/test_ogclib.py: The format specification is
1794     a mime-type, not a graphic format, hence image/jpeg wou ld be the
1795     proper format and not JPEG. We'll also have to take care of the
1796     encoding of / as %2F.
1797    
1798 joey 2111 2004-03-16 Martin Schulze <[email protected]>
1799    
1800     * Extensions/wms/test/test_ogclib.py: Added a (hopefully)
1801     comprehensive test for the getMapURL method, built compare URLs
1802     according to the documentation in OGC 01-068r3
1803    
1804     * Extensions/wms/capabilities.py (WMSCapabilities): Added the
1805     class WMSCapabilities to manage capabilites, will incorporate
1806     parsing the capabilities response and provide details for other
1807     classes.
1808    
1809 bh 2105 2004-03-12 Bernhard Herzog <[email protected]>
1810    
1811 bh 2107 Support views in addition to normal tables in the postgis
1812     shapestore
1813    
1814     * Thuban/Model/postgisdb.py
1815     (PostGISShapeStore._fetch_table_information): Add a fallback for
1816     the case where the table name is not in the geometry_columns
1817     table. This is usually the case for views. Also, set
1818     self.shapestore here.
1819     (PostGISShapeStore.ShapeType): No need to query the database all
1820     the time. The shape type is now determined in
1821     _fetch_table_information
1822    
1823     * test/postgissupport.py (PostgreSQLServer.new_postgis_db)
1824     (PostgreSQLServer.get_static_data_db, PostGISDatabase.__init__):
1825     New parameter to specify views.
1826     (PostGISDatabase.has_data): Also compare the views. New views
1827     parameter
1828     (PostGISDatabase.initdb): Create the views.
1829     (PostgreSQLServer.get_default_static_data_db): Add the v_landmarks
1830     view
1831    
1832     * test/test_postgis_db.py
1833     (TestPostGISShapestorePointFromViews): New. Test a
1834     PostGISShapeStore with a view
1835     (TestPostGISShapestorePointOIDAsGIDColumn.setUp): Pass the name of
1836     the geometry_column explicitly to test whether that works
1837    
1838     2004-03-12 Bernhard Herzog <[email protected]>
1839    
1840 bh 2105 Final step for explicit id/geometry columns: Loading and saving
1841    
1842     * Resources/XML/thuban-1.1.dtd: New. Derived from thuban-1.0.dtd
1843     with the following changes:
1844     (dbshapesource): Two new attributes id_column and geometry_column
1845    
1846     * Thuban/Model/save.py (SessionSaver.write): Use the new dtd
1847     (SessionSaver.write_session): Use the new namespace
1848     (SessionSaver.write_data_containers): Write the new dbshapesource
1849     parameters
1850    
1851     * Thuban/Model/load.py (SessionLoader.__init__): New namespace for
1852     the new file format version
1853     (SessionLoader.start_dbshapesource): Handle the new db parameters
1854    
1855     * test/test_save.py: Update to the new dtd and namespace
1856     (SaveSessionTest.test_save_postgis): Update the NonConnectionStore
1857     mock object to provide a working IDColumn method.
1858    
1859     * test/test_load_1_0.py: New. Copy of the test_load.py before
1860     today's changes but with the round-trip tests removed.
1861    
1862     * test/test_load_0_9.py: Update doc-string.
1863    
1864     * test/test_load.py: Update all .thuban files to the new dtd and
1865     namespace.
1866     (TestPostGISLayer.file_contents): Add the new dbshapesource
1867     paramters
1868    
1869 bh 2100 2004-03-11 Bernhard Herzog <[email protected]>
1870    
1871 bh 2103 Next step for explicit id/geometry columns: User interaction
1872    
1873     * Thuban/UI/dbdialog.py (ChooseDBTableDialog.__init__): Rework how
1874     the dialog is constructed. Add combo boxes to select id and
1875     geometry column. Rename some instance variables.
1876     (ChooseDBTableDialog.GetTable): Return id and geometry column
1877     names
1878     (ChooseDBTableDialog.OnTableSelect): New. Event handler for
1879     selections in the table list
1880    
1881     * Thuban/UI/mainwindow.py (MainWindow.AddDBLayer): Use id_column
1882     and geometry_column
1883    
1884     * Thuban/Model/session.py (Session.OpenDBShapeStore): Add the new
1885     parameters for id_column and geometry column of PostGISShapeStore
1886     here as well.
1887    
1888     * Thuban/Model/postgisdb.py (type_map): Add ROWID psycog type.
1889     (_raw_type_map): New. Map raw PostgreSQL type ints to thuban types
1890     (PostGISConnection.GeometryTables): Use a better query to
1891     determine which relations in the database might be usable for
1892     shapestores. Now supports views as well but is more PostgreSQL
1893     specific
1894     (PostGISConnection.table_columns): New. Somewhat experimental
1895     method to let the db dialogs provide lists of columns to users so
1896     that they can select id and geometry columns.
1897     (PostGISTable.__init__): The default value of the id_column
1898     parameter is now None it still means "gid" effectively, though.
1899     (PostGISTable.IDColumn): New introspection method to return a
1900     column object for the id column
1901     (PostGISShapeStore.GeometryColumn): New introspection method to
1902     return a column object for the geometry column
1903    
1904     * test/test_postgis_db.py
1905     (TestPostGISConnection.test_gis_tables_non_empty):
1906     Removed. Subsumed by the new:
1907     (TestPostGISConnection.test_gis_tables_with_views_and_tables):
1908     New. Tes the GeometryTables and table_columns methods with actual
1909     tables and views.
1910     (PointTests.test_id_column, PointTests.test_geometry_column):
1911     New. tests for the new methods.
1912     (TestPostGISShapestorePoint.setUp)
1913     (TestPostGISShapestorePointSRID.setUp)
1914     (TestPostGISShapestorePointExplicitGIDColumn.setUp): Fill the
1915     instance variables needed by the new tests
1916    
1917     2004-03-11 Bernhard Herzog <[email protected]>
1918    
1919 bh 2100 * Thuban/UI/classgen.py (GenQuantilesPanel.GetList): The row
1920     numbers given to ReadValue are ordinals.
1921    
1922     2004-03-11 Bernhard Herzog <[email protected]>
1923    
1924     Elimiate the requirement for PostGIS tables to have a column
1925     called "gid".
1926    
1927     * Thuban/Model/postgisdb.py (PostGISTable.__init__): New parameter
1928     id_column to specify which column to use to identify rows. Also
1929     new instance variables id_column and quoted_id_column
1930     (PostGISTable.RowIdToOrdinal, PostGISTable.RowOrdinalToId)
1931     (PostGISTable.ReadRowAsDict, PostGISTable.ReadValue)
1932     (PostGISTable.SimpleQuery): Use the id column name provided to the
1933     constructor instead of "gid"
1934     (PostGISShapeStore.__init__): New parameter id_column analogously
1935     to PostGISTable.__init__. This parameter is simply passed through
1936     to the base class constructor
1937     (PostGISShapeStore._create_col_from_description): Fix typo in
1938     doc-string
1939     (PostGISShapeStore.Shape, PostGISShapeStore.AllShapes)
1940     (PostGISShapeStore.ShapesInRegion): Use the id column name
1941     provided to the constructor instead of "gid"
1942    
1943     * test/postgissupport.py
1944     (PostgreSQLServer.get_default_static_data_db): New static table
1945     landmarks_point_id with an id column != "gid. Update the comments
1946     a bit.
1947     (skip_if_addgeometrycolumn_does_not_use_quote_ident): Fix typo in
1948     doc-
1949     (upload_shapefile): New parameter gid_column to use a name other
1950     than "gid" for the column to store the shape ids
1951    
1952     * test/test_postgis_db.py (TableTests): New. Mixin-class
1953     containing all tests previously in TestPostGISTable. The actual
1954     tests are the same but the code is a bit more configurable to
1955     allow for different id columns etc.
1956     (TestPostGISTable): Derive from TableTests now for the actual
1957     tests.
1958     (TestPostGISTableExplicitGIDColumn): New. Like TestPostGISTable
1959     except that it the landmarks_point_id table to test the id_column
1960     parameter
1961     (PointTests): Extend the doc-string
1962     (TestPostGISShapestorePointExplicitGIDColumn)
1963     (TestPostGISShapestorePointOIDAsGIDColumn): New classes derived
1964     from PointTests to test the explicit id_column parameter. One
1965     tests with the name of the column holding the shape ids, the other
1966     uses PostgreSQL's OID column. For the latter a number of methods
1967     have to be overwritten to make them independent of the actual id
1968     values.
1969    
1970 silke 2095 2004-03-08 Silke Reimer <[email protected]>
1971    
1972     Update debian directory:
1973    
1974     * debian/changelog: Added new version.
1975     * deiban/rules: Updated management of patches (with cbds)
1976     * debian/control: Added cbds to dependencies
1977     * debian/patches/*: New. Adds better support for patches of thuban in
1978     debian
1979     * debian/menu: Syntax of menu changed slightly
1980     * debian/setup.py.patch: removed because it has been moved to
1981     debian/patechs/setup.py.patch
1982    
1983    
1984 bh 2094 2004-02-26 Bernhard Herzog <[email protected]>
1985    
1986     Create the Doc/technotes directory for text files with information
1987     for developers
1988    
1989     * Doc/technotes/README: New. README for the technotes
1990    
1991     * Doc/technotes/coding_guidelines.txt: New. Coding guidelines for
1992     Thuban
1993    
1994     * Doc/technotes/release_process.txt: New. Used to be
1995     HOWTO-Release. Now slightly adapted to technote formatting style.
1996    
1997     * HOWTO-Release: Removed. It's contents are now in
1998     Doc/technotes/release_process.txt
1999    
2000 bh 2089 2004-02-25 Bernhard Herzog <[email protected]>
2001    
2002     * libraries/thuban/wxproj.cpp (get_wx_version): New. Return the
2003     version of wxWindows the module was compiled with so we can check
2004     that against the wxPython version.
2005    
2006     * Thuban/version.py (thuban_branch, thuban_release): New variables
2007     controlling which and how Thuban versions are shown. See the
2008     comments for details.
2009     (verify_versions): Also check that the wx version that wxproj is
2010     compiled against matches that of the wxPython we use at runtime
2011    
2012 bh 2080 2004-02-20 Bernhard Herzog <[email protected]>
2013    
2014 bh 2087 * Extensions/wms/wms.py (epsg_code_to_projection): Use
2015     get_system_proj_file to read the epsg projections. The old way
2016     depended on the current directory being the top Thuban directory.
2017    
2018     2004-02-20 Bernhard Herzog <[email protected]>
2019    
2020 bh 2085 * Extensions/svgexport/test/test_svgmapwriter.py
2021     (TestVirtualDC.test_clippath): Remove a debug print
2022    
2023     2004-02-20 Bernhard Herzog <[email protected]>
2024    
2025 bh 2083 * Extensions/svgexport/__init__.py: New. Turn
2026     Extensions/svgexport into a package.
2027    
2028     * Extensions/svgexport/svgmapwriter.py: Reorder the imports and
2029     doc-string a bit. The doc-string must come first, otherwise it's
2030     not a doc-string. The __future__ import must be the first thing
2031     after the doc-string. Use only double quotes in doc-strings.
2032     Single quotes trip up emacs syntax highlighting if the text
2033     contains apostrophes.
2034    
2035     2004-02-20 Bernhard Herzog <[email protected]>
2036    
2037 bh 2080 * Extensions/svgexport/test/__init__.py,
2038     Extensions/svgexport/test/test_svgmapwriter.py: New. Initial test
2039     suite for svgexport
2040    
2041     * test/runtests.py (find_test_modules): New. Function with the
2042     module finding code from main.
2043     (main): Use find_test_modules to figure out the default test
2044     modules and take modules from Extensions.svgexport.test too.
2045    
2046 bh 2075 2004-02-19 Bernhard Herzog <[email protected]>
2047    
2048 bh 2077 * Thuban/UI/application.py (ThubanApplication.OnInit): Make sure
2049     the mainwindow has a reference to the map of the initial session.
2050     This fixes a bug introduced with the fix for RT#2245
2051    
2052     2004-02-19 Bernhard Herzog <[email protected]>
2053    
2054 bh 2075 * Extensions/svgexport/svgsaver.py,
2055     Extensions/svgexport/svgmapwriter.py,
2056     Extensions/svgexport/maplegend.py: Added again. This time in the
2057     correct place.
2058    
2059 bh 2070 2004-02-17 Bernhard Herzog <[email protected]>
2060    
2061 bh 2073 Fix for RT#2245
2062    
2063     * Thuban/UI/application.py (ThubanApplication.OnInit): Initialize
2064     instance variables before trying to create any windows. Creating
2065     windows can start an event loop if e.g. message boxes are popped
2066     up for some reason, and event handlers, especially EVT_UPDATE_UI
2067     may want to access things from the application.
2068     (ThubanApplication.maps_changed): The mainwindow may not have been
2069     created yet, so check whether it has been created before calling
2070     its methods
2071    
2072     * Thuban/UI/view.py (MapCanvas.OnIdle): Only try to redraw if we
2073     have a map
2074    
2075     2004-02-17 Bernhard Herzog <[email protected]>
2076    
2077 bh 2070 * test/test_svgmapwriter.py, Extensions/svgsaver.py,
2078     Extensions/svgmapwriter.py, Extensions/maplegend.py,
2079     extensions/svgexport/svgsaver.py,
2080     extensions/svgexport/svgmapwriter.py,
2081     extensions/svgexport/maplegend.py: Removed. These files were in
2082     the wrong places or didn't work at all.
2083    
2084 bh 2067 2004-02-16 Bernhard Herzog <[email protected]>
2085    
2086 bh 2069 * Thuban/UI/view.py (MapCanvas.Export): Remove accidentally added
2087     line
2088    
2089     2004-02-16 Bernhard Herzog <[email protected]>
2090    
2091 bh 2067 * Thuban/UI/view.py (MapCanvas.Export): Avoid UnboundLocalError.
2092    
2093 mrechtie 2064 2004-02-15 Markus Rechtien <[email protected]>
2094    
2095     * Extensions/svgexport/svgmapwriter.py: New. Adds the capability
2096     to write a session to a file in SVG format.
2097     * Extensions/svgexport/svgsaver.py: New. Uses svgmapwriter.py
2098     to write a SVG map of a session.
2099     * Extensions/svgexport/maplegend: New. Writes a basic maplegend
2100     in SVG format for the current session.
2101    
2102 bh 2062 2004-02-13 Bernhard Herzog <[email protected]>
2103    
2104     * Thuban/UI/mainwindow.py (MainWindow.AddDBLayer): When the layer
2105     can't be created, return immediately after displaying the error
2106     message.
2107    
2108 bh 2060 2004-02-11 Bernhard Herzog <[email protected]>
2109    
2110     Handle postgis tables with more than one geometry column.
2111    
2112     * Thuban/Model/postgisdb.py
2113     (PostGISTable._fetch_table_information): Delegate the creation of
2114     column objects to a different method so that we can extend that in
2115     derived classes
2116     (PostGISTable._create_col_from_description): New. Column object
2117     creation part of _fetch_table_information
2118     (PostGISShapeStore._create_col_from_description): New. Extend
2119     inherited method to handle geometry columns
2120     (PostGISShapeStore.__init__): New parameter geometry_column to
2121     specify which geometry column to use. Optional but mandatory for
2122     tables with more than one geometry column
2123     (PostGISShapeStore._fetch_table_information): Also use the name of
2124     the geometry column when looking for the srid
2125     (PostGISShapeStore.ShapeType): Also use the name of the geometry
2126     column when looking for the shape type
2127    
2128     * test/test_save.py (SaveSessionTest.test_save_postgis): Adapt
2129     NonConnectionStore to changes in the PostGISShapeStore
2130    
2131     * test/test_postgis_db.py
2132     (TestPostGISSpecialCases.test_shapestore_two_geom_cols): Test
2133     PostGISShapeStore with tables having two geometry columns.
2134    
2135 bh 2058 2004-02-10 Bernhard Herzog <[email protected]>
2136    
2137     Fix some postgis problems. What remains to be done is real
2138     handling of SRIDs as they affect how reprojection is done
2139    
2140     * Thuban/Model/postgisdb.py (quote_identifier): Fix typo in
2141     doc-string
2142     (PostGISShapeStore._fetch_table_information): New. Extend
2143     inherited method to retrieve srid
2144     (PostGISShapeStore.BoundingBox): Handle tables without data.
2145     extent yields NULL for those
2146     (PostGISShapeStore.ShapesInRegion): Use the srid of the table.
2147    
2148     * test/test_postgis_db.py
2149     (TestPostGISSpecialCases.test_shapestore_empty_table): New test
2150     for the special case of a table without any data
2151     (TestPostGISShapestorePointSRID): New class with tests for a table
2152     that uses srids
2153     (PolygonTests): Fix a doc-string typo
2154    
2155     * test/postgissupport.py (PostGISDatabase.__init__): New parameter
2156     reference_systems with a specification of spacial reference
2157     systems to create in the new db.
2158     (PostgreSQLServer.new_postgis_db)
2159     (PostgreSQLServer.get_static_data_db): New parameter
2160     reference_systems to be passed through ultimately to
2161     PostGISDatabase. In new_postgis_db also check whether an existing
2162     db already has the right srids
2163     (PostgreSQLServer.get_default_static_data_db): Add srids and a
2164     table that uses srids
2165     (PostGISDatabase.initdb): Create the entries for the reference
2166     systems
2167     (PostGISDatabase.has_data): Add reference_systems parameter to
2168     check for those too
2169     (upload_shapefile): New parameter srid to create tables with a
2170     specific srid
2171    
2172 frank 2055 2004-02-06 Frank Koormann <[email protected]>
2173    
2174     * po/pt_BR.po: Fixed charset
2175    
2176 frank 2054 2004-02-05 Frank Koormann <[email protected]>
2177    
2178     * po/pt_BR.po: Fixed format string for error message, missing %s
2179     added (Thuban/UI/application.py:273)
2180    
2181 frank 2053 2004-02-03 Frank Koormann <[email protected]>
2182    
2183     First version of Portuguese (Brazilian) translation
2184    
2185     * po/pt_BR.po: New, translation of pot (2004-01-15 16:07+0300) for
2186     Brazilian Portuguese by Eduardo Patto Kanegae.
2187    
2188     * Thuban/UI/about.py (About.__init.py__): Added Eduardo to the list of
2189     translators.
2190    
2191    
2192 frank 2052 2004-01-22 Frank Koormann <[email protected]>
2193    
2194     * Doc/manual/thuban-manual.xml: Added section on installation of
2195     Thuban under Win32 systems. Fixed image path references in the postgis
2196     section. Some minor source formattings.
2197    
2198 frank 2051 2004-01-21 Frank Koormann <[email protected]>
2199    
2200     Make Thuban remember path selections (at least for one application run).
2201    
2202     * Thuban/UI/application.py (Application.OnInit): Initialize path as a
2203     attribute of application object. Path is a dictionary of
2204     strings, currently with the items "data" and "projection".
2205     (Application.SetPath): New, stores path for the specified item.
2206     (Application.Path): New, return path for the specified item.
2207    
2208     * Thuban/UI/mainwindow.py
2209     (MainWindow.OpenSession, MainWindow.SaveSessionAs,
2210     MainWindow.AddLayer, MainWindow.AddRasterLayer,
2211     MainWindow.TableOpen): Access "data" path information of the
2212     application.
2213    
2214     * Thuban/UI/projdialog.py (ProjFrame._OnImport, ProjFrame._OnExport):
2215     Access "projection" path information of the application.
2216    
2217 bh 2048 2004-01-05 Bernhard Herzog <[email protected]>
2218    
2219 bh 2050 * po/ru.po: Updated translations from Alex Shevlakov
2220    
2221     2004-01-05 Bernhard Herzog <[email protected]>
2222    
2223 bh 2048 * po/Makefile, po/README: Move the description of how to generate
2224     the translation statistics to the README.
2225    
2226 bh 2042 2003-12-23 Bernhard Herzog <[email protected]>
2227    
2228 bh 2045 * NEWS: Update for 1.0.0
2229    
2230     * po/it.po: Another update from Maurizio Napolitano
2231    
2232     2003-12-23 Bernhard Herzog <[email protected]>
2233    
2234 bh 2042 * po/it.po: Updated translation from Maurizio Napolitano
2235    
2236     2003-12-23 Bernhard Herzog <[email protected]>
2237    
2238     * Thuban/UI/join.py (JoinDialog.__init__): Mark one more string
2239     for translation
2240    
2241     * Thuban/UI/mainwindow.py (MainWindow.TableRename)
2242     (MainWindow.RenameMap, MainWindow.RenameLayer): Mark some more
2243     strings for translation
2244    
2245     * po/de.po: Update with the newly marked strings.
2246    
2247 bh 2033 2003-12-22 Bernhard Herzog <[email protected]>
2248    
2249 bh 2039 * HOWTO-Release: Fix the places where version numbers have to be
2250     updated
2251    
2252     2003-12-22 Bernhard Herzog <[email protected]>
2253    
2254 bh 2037 * setup.py (setup call): 1.0.0, yeah!
2255    
2256     * Thuban/version.py (longversion): 1.0.0, yeah!
2257    
2258     * Thuban/Model/load.py (SessionLoader.__init__): Accept the
2259     1.0.0 namespace too
2260    
2261     * Thuban/Model/save.py (SessionSaver.write_session): Save with
2262     1.0.0 namespace
2263    
2264     * test/test_load.py (LoadSessionTest.dtd)
2265     (TestSingleLayer.file_contents)
2266     (TestNonAsciiColumnName.file_contents)
2267     (TestLayerVisibility.file_contents)
2268     (TestClassification.file_contents, TestLabels.file_contents)
2269     (TestLayerProjection.file_contents)
2270     (TestRasterLayer.file_contents, TestJoinedTable.file_contents)
2271     (TestLabelLayer.file_contents, TestPostGISLayer.file_contents)
2272     (TestPostGISLayerPassword.file_contents)
2273     (TestLoadError.file_contents, TestLoadError.test): Update for
2274     1.0.0 namespace
2275    
2276     * test/test_save.py (SaveSessionTest.dtd)
2277     (SaveSessionTest.testEmptySession)
2278     (SaveSessionTest.testSingleLayer)
2279     (SaveSessionTest.testLayerProjection)
2280     (SaveSessionTest.testRasterLayer)
2281     (SaveSessionTest.testClassifiedLayer)
2282     (SaveSessionTest.test_dbf_table)
2283     (SaveSessionTest.test_joined_table)
2284     (SaveSessionTest.test_save_postgis): Update for 1.0.0 namespace
2285    
2286     2003-12-22 Bernhard Herzog <[email protected]>
2287    
2288 bh 2035 * Thuban/Model/load.py (SessionLoader.start_label): Make sure the
2289     alignment flags are byte strings not unicode and that they have
2290     valid values
2291    
2292     * test/test_load.py (TestLabelLayer): New. Test loading (and
2293     indirectly saving) of maps with labels.
2294    
2295     2003-12-22 Bernhard Herzog <[email protected]>
2296    
2297 bh 2033 * Thuban/UI/tableview.py (TableGrid.OnDestroy)
2298     (TableGrid.__init__): Handle EVT_WINDOW_DESTROY in the grid to
2299     unsubscribe all subscribers.
2300     (LayerTableFrame.OnDestroy): Do not unsubscribe any messages from
2301     self.grid since it may already have been destroyed.
2302     Fixes RT #2256
2303    
2304 bh 2031 2003-12-19 Bernhard Herzog <[email protected]>
2305    
2306     * po/fr.po, po/es.po: Updated translations from Daniel Calvelo
2307    
2308 bh 2028 2003-12-16 Bernhard Herzog <[email protected]>
2309 silke 2029
2310     * debian/bitmappath.patch, debian/setup.py.patch:
2311     added to ensure compliance with FHS for debian
2312     * debian/rules, debian/changelog:
2313     added patches in rules to ensure compliance with FHS for debian
2314 bh 2028
2315 silke 2029 2003-12-16 Bernhard Herzog <[email protected]>
2316    
2317 bh 2028 * po/Makefile (mo): Make the output a bit nicer so that it prints
2318     statistics about the translations. Add a comment how produce even
2319     nicer statistics with sed.
2320    
2321 frank 2026 2003-12-09 Frank Koormann <[email protected]>
2322    
2323     * Resources/Projections/defaults.proj:
2324     French projection sample with correct accents (UNICODE).
2325    
2326 bh 2025 2003-12-05 Bernhard Herzog <[email protected]>
2327    
2328     * MANIFEST.in: Add the devtools directory
2329    
2330     * setup.py (setup call): Use license instead of licence. This
2331     silences a deprecation warning on Python 2.3
2332    
2333 frank 2022 2003-12-05 Frank Koormann <[email protected]>
2334    
2335 frank 2023 Documentation synced with 1.0rc1
2336    
2337     * Doc/manual/thuban-manual.xml:
2338     Minor formatting changes and references to database layers .
2339     Introduction.Internationalization: New section on i18n.
2340     MapManagement.AddingandRemovingLayers: Added item on database layers.
2341     MapManagement.TheLegend: Added section and screenshot on popup menu.
2342     ProjectionManagement: Updated screenshot and sentence on EPSG.
2343     Appendix.SupportedDataSources: Added PostGIS.
2344     Appendix.WorkingwithPostGIS: New section.
2345    
2346     * Doc/manual/images/6_projection.png: Updated screenshot including
2347     EPSG checkboxes.
2348    
2349     * Doc/manual/images/3_5_popup_menu.png: New, popup menu screenshot.
2350    
2351     * Doc/manual/images/app_postgis_add_layer.png,
2352     Doc/manual/images/app_postgis_db_add.png,
2353     Doc/manual/images/app_postgis_db_management.png:
2354     New screenshots focussing on database layers
2355    
2356     2003-12-05 Frank Koormann <[email protected]>
2357    
2358 frank 2022 * Thuban/UI/projdialog.py (load_user_proj): If user.proj is missing
2359     write warning to stderr instead of rising a warning dialog
2360    
2361 bh 2016 2003-12-03 Bernhard Herzog <[email protected]>
2362    
2363 bh 2021 Fix for RT #2243
2364    
2365 bh 2020 * Thuban/UI/mainwindow.py (MainWindow.has_selected_shape_layer):
2366     New. Like has_selected_layer but for shape layers only
2367     (_has_selected_shape_layer): New. Like _has_selected_layer but for
2368     shape layers only
2369     (layer_show_table command, layer_jointable command): Use these
2370     commands should only be available for shape layers
2371    
2372     2003-12-03 Bernhard Herzog <[email protected]>
2373    
2374 bh 2018 * Thuban/UI/mainwindow.py (MainWindow.Unsubscribe): Deal with
2375     publishers that are wx objects and may have been destroyed by wx
2376     already. Fixes RT #2242.
2377    
2378     2003-12-03 Bernhard Herzog <[email protected]>
2379    
2380 bh 2016 * po/ru.po: Updates from Alex Shevlakov
2381    
2382 silke 2013 2003-12-03 Silke Reimer <silkeintevation.de>
2383    
2384     * debian/control, debian/changelog: Added gdal-support to
2385     debian package, updated to new thuban version
2386    
2387    
2388 bh 2012 2003-12-03 Bernhard Herzog <[email protected]>
2389    
2390     * Thuban/Lib/version.py: New. Module for version number
2391     manipulations. The version of make_tuple here also deals better
2392     with more unusual version number strings, such as e.g.
2393     "1.2+cvs20031111"
2394    
2395     * Thuban/version.py (make_tuple): Removed. It's now in
2396     Thuban.Lib.version. Use that implementation instead.
2397    
2398     * test/test_lib_version.py: New. Tests for Thuban/Lib/version.py
2399    
2400 bh 2005 2003-12-02 Bernhard Herzog <[email protected]>
2401    
2402 bh 2010 * MANIFEST.in: Add debian files
2403    
2404 bh 2008 * setup.py (setup call): Add packages for the Extensions so that
2405     they're installed too
2406     (data_files): Add READMEs and sample data from some Extensions
2407    
2408     * NEWS: Add note about the extensions in binary packages
2409    
2410     2003-12-02 Bernhard Herzog <[email protected]>
2411    
2412 bh 2005 * Thuban/Model/save.py (SessionSaver.write_session): Save files
2413     with the thuban-1.0rc1
2414    
2415     * Thuban/Model/load.py (SessionLoader.__init__): Recognize the
2416     thuban-1.0rc1 namespace too
2417    
2418     * test/test_save.py (SaveSessionTest.dtd)
2419     (SaveSessionTest.testEmptySession)
2420     (SaveSessionTest.testSingleLayer)
2421     (SaveSessionTest.testLayerProjection)
2422     (SaveSessionTest.testRasterLayer)
2423     (SaveSessionTest.testClassifiedLayer)
2424     (SaveSessionTest.test_dbf_table)
2425     (SaveSessionTest.test_joined_table)
2426     (SaveSessionTest.test_save_postgis): Update to thuban-1.0rc1
2427     namespace
2428    
2429     * test/test_load.py (LoadSessionTest.dtd): Update to thuban-1.0rc1
2430     namespace
2431     (TestSingleLayer.file_contents)
2432     (TestNonAsciiColumnName.file_contents)
2433     (TestLayerVisibility.file_contents)
2434     (TestClassification.file_contents, TestLabels.file_contents)
2435     (TestLayerProjection.file_contents)
2436     (TestRasterLayer.file_contents, TestJoinedTable.file_contents)
2437     (TestPostGISLayer.file_contents)
2438     (TestPostGISLayerPassword.file_contents)
2439     (TestLoadError.file_contents, TestLoadError.test): Update to
2440     thuban-1.0rc1 namespace
2441    
2442 bh 1996 2003-12-01 Bernhard Herzog <[email protected]>
2443    
2444 bh 2003 * setup.py (proj4_prefix, wx_prefix, gdal_prefix): Fix these for
2445     nt to better match Intevation's current w32 setup
2446    
2447 bh 2001 * HOWTO-Release: Add note about updating MANIFEST.in
2448    
2449     * MANIFEST.in: Add the Extensions
2450    
2451 bh 1998 * NEWS: Update for 1.0rc1
2452    
2453     2003-12-01 Bernhard Herzog <[email protected]>
2454    
2455 bh 1996 * Thuban/UI/mainwindow.py (MainWindow.AddLayer): Change the wild
2456     cards for the dialog so that shapefiles ending in all uppercase
2457     SHP are listed too
2458    
2459 bh 1988 2003-11-28 Bernhard Herzog <[email protected]>
2460    
2461 bh 1996 * Thuban/version.py (longversion): Update to 1.0rc1
2462    
2463     * setup.py (setup call): Update version to 1.0rc1. Use the
2464     [email protected] email address as author email instead of my
2465     personal one.
2466    
2467     2003-11-28 Bernhard Herzog <[email protected]>
2468    
2469 bh 1992 * po/de.po: Update german translation.
2470    
2471     2003-11-28 Bernhard Herzog <[email protected]>
2472    
2473 bh 1990 Unify the filenames stored in .thuban files so that the .thuban
2474     files are more platform independend
2475    
2476     * Thuban/Model/save.py (unify_filename): New. Unify filenames so
2477     that they can be used on both windows and unix
2478     (SessionSaver.prepare_filename): New. Handle all filename
2479     transformations for filenames stored in the thuban file
2480     (SessionSaver.write_data_containers, SessionSaver.write_layer):
2481     Use prepare_filename
2482    
2483     * test/test_save.py (SaveSessionTest.testSingleLayer)
2484     (SaveSessionTest.testLayerProjection)
2485     (SaveSessionTest.testRasterLayer)
2486     (SaveSessionTest.testClassifiedLayer)
2487     (SaveSessionTest.test_dbf_table)
2488     (SaveSessionTest.test_joined_table): Filenames are always stored
2489     with slashes on all currently supported platforms so adapt all
2490     tests to this
2491    
2492     * test/test_load.py (LoadSessionTest.filenames): With the new
2493     filename scheme the filenames in the tests should be
2494     understandable on all currently supported platforms so we turn
2495     this into an empty list because we don't have to normalize them
2496     anymore
2497    
2498     2003-11-28 Bernhard Herzog <[email protected]>
2499    
2500 bh 1988 * test/test_layer.py (TestLayer.test_arc_layer_with_projection):
2501     Add the ellipsoid to the projection since some Proj versions
2502     complain if it's missing.
2503    
2504 bh 1984 2003-11-27 Bernhard Herzog <[email protected]>
2505    
2506     Corect some bounding box projection problems
2507    
2508     * Thuban/Model/proj.py (Projection.InverseBBox): New. Inverse
2509     version of ForwardBBox
2510     (Projection._transform_bbox): New. common implementation of
2511     ForwardBBox and InverseBBox
2512     (Projection.ForwardBBox): Use _transform_bbox.
2513    
2514     * test/test_proj.py (TestProjection.test): Add test for
2515     InverseBBox
2516    
2517     * Thuban/Model/layer.py (Layer.LatLongBoundingBox)
2518     (Layer.ShapesBoundingBox, RasterLayer.LatLongBoundingBox): Use the
2519     new InverseBBox method to determine the unprojected bounding box
2520     (Layer.ShapesInRegion): Use the ForwardBBox method to project the
2521     bbox.
2522    
2523     * test/test_layer.py (TestLayer.test_point_layer_with_projection):
2524     Removed.
2525     (TestLayer.test_arc_layer_with_projection): New. This test is
2526     better able to test whether bounding boxes are projected correctly
2527     than test_point_layer_with_projection
2528    
2529 bh 1986 * Thuban/UI/viewport.py (ViewPort.map_projection_changed): Use
2530     InverseBBox to unproject bboxes
2531    
2532 bh 1975 2003-11-25 Bernhard Herzog <[email protected]>
2533    
2534 bh 1981 * Thuban/UI/about.py (About.__init__): Make sure we have ASCII
2535     source code.
2536    
2537     2003-11-25 Bernhard Herzog <[email protected]>
2538    
2539 bh 1979 * Thuban/Model/layer.py (Layer.__getattr__): Removed. It was only
2540     there for backwards compatibility and all code relying on that
2541     should have been updated by now.
2542    
2543     2003-11-25 Bernhard Herzog <[email protected]>
2544    
2545 bh 1977 * test/test_load.py (TestClassification.test): Add the missing
2546     round trip test.
2547     (TestClassification.file_contents): Update to the newest file
2548     format
2549    
2550     2003-11-25 Bernhard Herzog <[email protected]>
2551    
2552 bh 1975 Add very experimental (and possibly dangerous) extension to draw
2553     polygons:
2554    
2555     * Extensions/drawshape/README: New. Brief installation
2556     instructions
2557    
2558     * Extensions/drawshape/drawshape.py: New. Implementation of the
2559     drawshape extensions
2560    
2561     * Extensions/drawshape/patch.diff: Patch to apply before the
2562     extension can be used.
2563    
2564 bh 1971 2003-11-24 Bernhard Herzog <[email protected]>
2565    
2566 bh 1973 * Thuban/Model/data.py (ShapefileStore._open_shapefile)
2567     (ShapefileStore.__init__): Factor opening the shapefile into a
2568     separate method (the new _open_shapefile). This makes the code a
2569     bit more readable but the real reason is that it makes some evil
2570     hacks easier. :-)
2571    
2572     2003-11-24 Bernhard Herzog <[email protected]>
2573    
2574 bh 1971 * Thuban/Model/load.py (SessionLoader.check_attrs): If no
2575     converter is specified for an attribute assume it's a string
2576     containing only Latin1 characters. Update doc-string accordingly.
2577     This change should fix many places where unicode objects might
2578     accidentally enter Thuban.
2579    
2580     * test/test_load.py (TestNonAsciiColumnName): New test to check
2581     what happens with column names in DBF files that contain non-ascii
2582     characters
2583    
2584 bh 1969 2003-11-21 Bernhard Herzog <[email protected]>
2585    
2586     Enable the experimental attribute editing again and introduce a
2587     command line switch to actually activate it
2588    
2589     * Thuban/UI/main.py (options): New. Container for options set on
2590     the commmand line
2591     (main): Add the --enable-attribute-editing flag.
2592    
2593     * Thuban/UI/identifyview.py (IdentifyView.__init__): If attribute
2594     editing is enabled use the grid ctrl which allows editing of the
2595     values
2596    
2597     * Thuban/Model/transientdb.py (AutoTransientTable.write_record):
2598     New. Just delegate this to the underlying table.
2599    
2600 bh 1967 2003-11-20 Bernhard Herzog <[email protected]>
2601    
2602     * test/test_proj.py (ProjFileReadTests.test_read_unreadable_file):
2603     Skip this test if run under non-posix systems since it only works
2604     there
2605    
2606 bh 1960 2003-11-19 Bernhard Herzog <[email protected]>
2607    
2608 bh 1965 * Thuban/Model/resource.py: Rework the way gdal support is
2609     determined so that we can give a reason in the about why gdal is
2610     not supported.
2611     (gdal_support_status): New. Variable holding a string with the
2612     reason for no gdal support
2613    
2614     * Thuban/UI/about.py (About.__init__): Add the reason why gdal is
2615     not supported to the message
2616    
2617     2003-11-19 Bernhard Herzog <[email protected]>
2618    
2619 bh 1963 Remove the old table interface and its test cases
2620    
2621     * Thuban/Model/table.py (OldTableInterfaceMixin): Removed.
2622     (DBFTable, MemoryTable): Do not derive from OldTableInterfaceMixin
2623     anymore
2624    
2625     * Thuban/Model/transientdb.py (TransientTableBase)
2626     (AutoTransientTable): Do not derive from OldTableInterfaceMixin
2627     anymore
2628    
2629     * test/test_table.py: Removed since the old interface it tests is
2630     gone.
2631    
2632     * test/runtests.py (main): The old table interface is gone and
2633     with it the deprecation warnings so remove the code that turns
2634     these warnings into errors
2635    
2636     2003-11-19 Bernhard Herzog <[email protected]>
2637    
2638 bh 1960 * test/test_table.py: Revert to revision 1.5 again. Changing the
2639     tests to use the new table interface is completely wrong since the
2640     whole purpose of the tests in this module is to test the old
2641     interface.
2642    
2643 bh 1954 2003-11-18 Bernhard Herzog <[email protected]>
2644    
2645 bh 1958 * Thuban/Model/postgisdb.py (PostGISConnection.MatchesParameters):
2646     New. Test whether the connection matches a set of connection
2647     parameters
2648    
2649     * Thuban/UI/dbdialog.py (DBFrame.conns_changed): Fix doc-string
2650     (DBFrame.OnAdd): Use the new MatchesParameters method when looking
2651     for existing connections with the same parameters and break out of
2652     the loop correctly.
2653    
2654     * test/test_postgis_db.py (TestBriefDescription)
2655     (TestPostGISSimple.test_brief_description): Rename
2656     TestBriefDescription to TestPostGISSimple and the test method to
2657     test_brief_description so that we can add more test methods.
2658     (TestPostGISSimple.test_matches_parameters): New. Test the new
2659     MatchesParameters method
2660    
2661     2003-11-18 Bernhard Herzog <[email protected]>
2662    
2663 bh 1960 * Thuban/Lib/connector.py (Publisher): Introduce a new flag,
2664 bh 1954 _was_destroyed, to indicate whether an publisher instance has
2665     already been destroyed.
2666     (Publisher.Unsubscribe): Only disconnect if the publisher has not
2667     been destroyed yet.
2668     (Publisher.Destroy): Set the _was_destroyed flag to true.
2669    
2670     * test/test_connector.py
2671     (TestPublisher.test_unsubscribe_after_destroy): New. Test that
2672     calling Unsubscribe after Destroy doesn't raise an exception
2673    
2674 bh 1951 2003-11-14 Bernhard Herzog <[email protected]>
2675    
2676     * Thuban/UI/identifyview.py (IdentifyView.selected_shape): Fix
2677     typo in doc-string
2678    
2679 bh 1949 2003-11-13 Bernhard Herzog <[email protected]>
2680    
2681     Quote table and column names properly for postgis.
2682    
2683     * Thuban/Model/postgisdb.py (quote_identifier): New. Function to
2684     quote an identifier for use in an sql statement
2685     (PostGISColumn.__init__): Add the quoted_name attribute
2686     (PostGISTable.__init__): New instance variable quoted_tablename
2687     (PostGISTable._fetch_table_information): Use the quoted table
2688     name. New isntance variable quoted_geo_col with a quoted version
2689     of geometry_column
2690     (PostGISTable.NumRows, PostGISTable.RowIdToOrdinal)
2691     (PostGISTable.RowOrdinalToId): Use the quoted table name
2692     (PostGISTable.ReadValue, PostGISTable.ValueRange)
2693     (PostGISTable.UniqueValues, PostGISTable.SimpleQuery)
2694     (PostGISShapeStore.BoundingBox, PostGISShapeStore.Shape)
2695     (PostGISShapeStore.AllShapes, PostGISShapeStore.ShapesInRegion):
2696     Use quoted table and column names
2697    
2698     * test/test_postgis_db.py (TestPostGISSpecialCases)
2699     (TestPostGISIgnoredColumns): Rename the class to
2700     TestPostGISSpecialCases because that better describes the new
2701     cases
2702     (TestPostGISSpecialCases.test_unsupported_types)
2703     (TestPostGISSpecialCases.test): Rename the method to
2704     test_unsupported_types because we need a more descriptive name now
2705     that there are more methods
2706     (TestPostGISSpecialCases.test_table_name_quoting)
2707     (TestPostGISSpecialCases.test_column_name_quoting)
2708     (TestPostGISSpecialCases.test_shapestore_name_quoting): New test
2709     cases to test quoting of table and column names in PostGISTable
2710     and PostGISShapeStore
2711    
2712     * test/postgissupport.py
2713     (skip_if_addgeometrycolumn_does_not_use_quote_ident): New. Skip if
2714     AddGeometryColumn desn't support table or column names with sapces
2715     or double quotes
2716    
2717 jan 1945 2003-11-12 Jan-Oliver Wagner <[email protected]>
2718    
2719     * Extensions/wms/__init__.py: New: Init to make this
2720     directory a package.
2721    
2722     * Extensions/wms/wms.py: New: Provide layers via OGC WMS.
2723    
2724 bh 1932 2003-11-11 Bernhard Herzog <[email protected]>
2725    
2726 bh 1942 * Thuban/Model/resource.py (EPSG_DEPRECATED_PROJ_FILE): New.
2727     Constant for the file woth deprecated epsg projections
2728     (get_system_proj_file): Update doc-string
2729    
2730     * Thuban/UI/projdialog.py (ProjFrame.build_dialog): Add a space
2731     above the EPS widgets, introduce a check box for the deprecated
2732     eps projections and a label for the epsg widgets
2733     (ProjFrame._OnShowEPSG): Handle the deprecated EPSG projections
2734     too
2735    
2736     2003-11-11 Bernhard Herzog <[email protected]>
2737    
2738 bh 1939 Avoid warnings when run under Python 2.3
2739    
2740     * Thuban/UI/baserenderer.py (BaseRenderer.draw_point_shape)
2741     (BaseRenderer.draw_label_layer): Coordinates must be ints.
2742    
2743     * Thuban/UI/renderer.py (MapRenderer.make_point): Turn this into a
2744     real method so that we can convert to int.
2745     (MapRenderer.label_font): The font size mist be an int.
2746    
2747     * Thuban/UI/common.py (Color2wxColour): The color values must be
2748     ints. Also, remove the unnecessary asserts.
2749    
2750     * test/test_load_0_8.py (TestUnicodeStrings.file_contents)
2751     (TestUnicodeStrings.test): Python source code should not contain
2752     non-ascii characters unless an encoding is specified in the file.
2753     Therefore use \x escapes in the string literals for non-ascii
2754     characters.
2755    
2756     2003-11-11 Bernhard Herzog <[email protected]>
2757    
2758 bh 1934 * Thuban/Model/resource.py (get_system_proj_file): Add a filename
2759     parameter so that this function can be used for all proj files in
2760     Resource/Projections
2761     (DEFAULT_PROJ_FILE, EPSG_PROJ_FILE): New. Predefined filenames for
2762     get_system_proj_file
2763    
2764     * Thuban/UI/projdialog.py (ProjFrame.__init__): Instead of one
2765     ProjFile self.__sysProjFile use a dictionary of system ProjFile
2766     objects self._sys_proj_files
2767     (ProjFrame.build_dialog): Adapt to the new changes in the
2768     ProjectionList constructor. Add a check button to toggle whether
2769     EPSG projections are shown
2770     (ProjFrame._OnShowEPSG): New. Handler for the epsg check button
2771     events.
2772     (ProjFrame.load_user_proj, ProjFrame.load_system_proj): Only show
2773     the busy cursor if the files have not yet been loaded by the
2774     dialog.
2775     (ProjFrame.load_system_proj): Add a parameter for the name of the
2776     proj file. Maintain the dictionary of system projections
2777     self._sys_proj_files
2778    
2779     * Thuban/UI/projlist.py (ProjectionList): Merge the system_projs,
2780     user_projs parameters into one parameter proj_files which is a
2781     list of proj files.
2782     (ProjectionList._subscribe_proj_files)
2783     (ProjectionList._unsubscribe_proj_files): New. Move
2784     subscription/unsubscription of projfile messages to separate
2785     methods
2786     (ProjectionList.Destroy): The unsubscribe is now done in
2787     _unsubscribe_proj_files
2788     (ProjectionList.update_projections): We now have a list of proj
2789     file objects
2790     (ProjectionList.SetProjFiles): New method to set a new list of
2791     proj file objects
2792    
2793     * test/test_proj.py (ProjFileReadTests.test_get_system_proj_file):
2794     Specify explicitly which system proj file to load.
2795    
2796     2003-11-11 Bernhard Herzog <[email protected]>
2797    
2798 bh 1932 * Thuban/Model/load.py (SessionLoader.Destroy): New. Clear all
2799     instance variables to cut cyclic references. The GC would have
2800     collected the loader eventually but it can happen that it doesn't
2801     run at all until thuban is closed (2.3 but not 2.2 tries a bit
2802     harder and forces a collection when the interpreter terminates)
2803     (load_session): Call the handler's Destroy method to make sure
2804     that it gets garbage collected early. Otherwise it will be
2805     collected very late if at all and it holds some references to e.g.
2806     shapestores and the session which can lead to leaks (of e.g. the
2807     temporary files)
2808    
2809     * test/test_load.py (TestSingleLayer.test_leak): New. test for the
2810     resource leak in load_session
2811    
2812 bh 1929 2003-11-10 Bernhard Herzog <[email protected]>
2813    
2814     * Thuban/UI/baserenderer.py: Add a way to specify how layers in
2815     extensions are to be rendered.
2816     (_renderer_extensions): New. List with renderer for layers in
2817     extensions
2818     (add_renderer_extension): New. Add a renderer extension
2819     (init_renderer_extensions): New. Init the renderer extensions
2820     (BaseRenderer.render_map_incrementally): Search
2821     _renderer_extensions for how to draw unknown layer types
2822     (BaseRenderer.draw_raster_data): Add format parameter so that
2823     formats other than BMP can be drawn
2824     (BaseRenderer.draw_raster_layer): Pass an explicit format to
2825     draw_raster_data
2826    
2827     * Thuban/UI/renderer.py (raster_format_map): New. Mapping form the
2828     strings of the format parameter of draw_raster_data method to wx
2829     constants
2830     (MapRenderer.draw_raster_data): Add the format parameter and use
2831     raster_format_map to map it to the right wxwindows constant for
2832     wxImageFromStream
2833    
2834     * test/test_baserenderer.py (SimpleRenderer.draw_raster_data): Add
2835     the format parameter and record it
2836     (TestBaseRenderer.test_raster_no_projection): check the format
2837     paramter of the draw_raster_data method
2838     (TestBaseRenderer.test_renderer_extension): New. Test the renderer
2839     extension facility
2840    
2841 bh 1925 2003-11-07 Bernhard Herzog <[email protected]>
2842    
2843     Tweak the usage of the sqlite database to make common use cases
2844     more responsive. In most cases copying the data to the sqlite
2845     database takes so long that using sqlite doesn't have enough
2846     advantages.
2847    
2848     * Thuban/Model/transientdb.py (TransientTableBase.ValueRange): Add
2849     comments about performance and query the min and max in separate
2850     statements because only that way will indexes be used.
2851     (TransientTableBase.UniqueValues): Add some comments about
2852     performance.
2853     (AutoTransientTable.ValueRange, AutoTransientTable.UniqueValues):
2854     Do not copy the data to the transient DB but use the transient
2855     copy if it exists. See the new comments for the performance trade
2856     offs
2857    
2858     * test/test_transientdb.py
2859     (TestTransientTable.test_auto_transient_table): Make sure that the
2860     data is copied to the transient database at some point.
2861    
2862 bh 1913 2003-11-03 Bernhard Herzog <[email protected]>
2863    
2864 bh 1922 * Thuban/Model/data.py (ShapefileStore.ShapesInRegion): Bind some
2865     globals to locals so that it's a bit faster
2866    
2867     2003-11-03 Bernhard Herzog <[email protected]>
2868    
2869 bh 1920 * Thuban/UI/baserenderer.py
2870     (BaseRenderer.draw_shape_layer_incrementally): Use the ReadValue
2871     method. ReadValue is faster than ReadRowAsDict since it only reads
2872     one cell especially now that the dbf file objects actually
2873     implement it.
2874    
2875     * Thuban/Model/table.py (DBFTable.ReadValue): Use the new
2876     read_attribute method of the dbf objects
2877    
2878     2003-11-03 Bernhard Herzog <[email protected]>
2879    
2880 bh 1916 * Extensions/profiling/profiling.py (popup_dialog_box): New config
2881     variable to indicate whether the result should be shown in a
2882     dialog box
2883     (profile_screen_renderer, time_screen_renderer): Only show a
2884     dialog box if popup_dialog_box is true.
2885     (profile_screen_renderer): Flush stdout after the printing the
2886     first part of the "profiling..." message
2887    
2888     * Thuban/UI/baserenderer.py
2889     (BaseRenderer.draw_shape_layer_incrementally): Cache the pens and
2890     brushes for the groups so that they're not created over and over
2891     again
2892    
2893 bh 1913 * Thuban/Model/classification.py (Classification.__getattr__)
2894     (Classification._compile_classification)
2895     (Classification._clear_compiled_classification): New. Methods to
2896     manage a 'compiled' representation of the classification groups
2897     which is created on demand
2898     (Classification.InsertGroup, Classification.RemoveGroup)
2899     (Classification.ReplaceGroup): reset the compiled representation
2900     (Classification.FindGroup): Use the compiled representation to
2901     find the matching group
2902     (ClassGroupRange.GetRangeTuple): New. Return the range as a tuple
2903    
2904 bh 1904 2003-10-31 Bernhard Herzog <[email protected]>
2905    
2906 bh 1911 * Thuban/Model/classification.py (Classification.SetDefaultGroup):
2907     Send a CLASS_CHANGED message
2908     (Classification.RemoveGroup): Send a CLASS_CHANGED message and do
2909     not return the removed group since it wasn't used.
2910    
2911     * test/test_classification.py
2912     (TestClassification.test_set_default_group): New. Test the
2913     SetDefaultGroup method
2914     (TestClassification.test_insert_group): New. Test the InsertGroup
2915     method
2916     (TestClassification.test_remove_group): New. Test the RemoveGroup
2917     method
2918     (TestClassification.test_replace_group): New. Test the
2919     ReplaceGroup method
2920    
2921     2003-10-31 Bernhard Herzog <[email protected]>
2922    
2923 bh 1908 * test/test_classification.py (TestClassification.setUp):
2924     Subscribe to the CLASS_CHANGED messages
2925     (TestClassification.tearDown): New. Destroy the classification
2926     properly
2927     (TestClassification.test_defaults): Add tests for the default line
2928     width and whether no messages were sent yet
2929     (TestClassification.test_set_default_properties): Add tests for
2930     messages and setting the default line width
2931     (TestClassification.test_add_singleton)
2932     (TestClassification.test_add_range)
2933     (TestClassification.test_multiple_groups): Add tests for messages
2934    
2935     2003-10-31 Bernhard Herzog <[email protected]>
2936    
2937 bh 1906 Some more refactoring in preparation for new tests:
2938    
2939     * test/test_classification.py (TestClassification.setUp): New.
2940     Instantiate the classification here. Update the test methods
2941     accordingly.
2942     (TestClassification.test_multiple_groups): Make sure that the two
2943     singletons matching 1 are considered different.
2944    
2945     2003-10-31 Bernhard Herzog <[email protected]>
2946    
2947 bh 1904 * test/test_classification.py (red, green, blue): New. These
2948     constants were used in several cases. Update the relevant methods.
2949     (TestClassification.test_defaults)
2950     (TestClassification.test_set_default_properties)
2951     (TestClassification.test_add_singleton)
2952     (TestClassification.test_add_range)
2953     (TestClassification.test_multiple_groups)
2954     (TestClassification.test_deepcopy): New. These were formerly all
2955     part of the single method test.
2956     (TestClassification.test_deepcopy): Removed.
2957     (TestClassIterator): Removed. The test case is now a method of
2958     TestClassification since it tests part of the public interface of
2959     Classification
2960     (TestClassification.test_iterator): New. Used to be
2961     TestClassIterator effectively
2962    
2963 jan 1902 2003-10-31 Jan-Oliver Wagner <[email protected]>
2964    
2965     GUIfied the functions of the profiling extension.
2966    
2967     * /Extensions/profiling/__init__.py: New: Init to make this
2968     directory a package.
2969    
2970     * Extensions/profiling/profiling.py: Moved menu entries to
2971     the Extensions menu. Applied _() for strings.
2972     (profile_screen_renderer): Catch the detailed printout and present
2973     it in a dialog.
2974 bh 1904 (time_screen_renderer): Raise a dialog to present the result instead
2975 jan 1902 of printing it to stdout.
2976    
2977 bh 1897 2003-10-31 Bernhard Herzog <[email protected]>
2978    
2979 bh 1899 * test/test_classification.py (TestClassGroupProperties)
2980     (TestClassGroup, TestClassGroupDefault, TestClassGroupRange)
2981     (TestClassGroupSingleton, TestClassIterator, TestClassification):
2982     Split TestClassification into several classes, one for each class
2983     being tested. TestClassification itself now only tests
2984     Classification. This split makes changes to the tests a bit easier
2985    
2986     2003-10-31 Bernhard Herzog <[email protected]>
2987    
2988 bh 1897 * Extensions/profiling/profiling.py: New. Extension to measure
2989     Thuban performance
2990    
2991 frank 1895 2003-10-31 Frank Koormann <[email protected]>
2992    
2993     Added two items to legend popup menu: Remove Layer and Show Layer Table
2994    
2995     * Thuban/UI/legend.py (LegendPanel._OnRemoveLayer,
2996     LegendPanel._OnShowTable): New event handlers, call the corresponding
2997     mainwindow methods.
2998     (LegendTree._OnRightClick): Added items to popup menu.
2999    
3000 bh 1894 2003-10-30 Bernhard Herzog <[email protected]>
3001    
3002     * Thuban/UI/dialogs.py (ThubanFrame.__init__): Handle
3003     EVT_WINDOW_DESTROY
3004     (ThubanFrame.OnDestroy): New. Handler for EVT_WINDOW_DESTROY. Does
3005     nothing but is convenient for the derived classes.
3006    
3007     * Thuban/UI/tableview.py
3008     (TableFrame.OnDestroy, LayerTableFrame.OnDestroy): New.
3009     Unsubscribe the messages here not in OnClose because that might
3010     get called multiple times. Fixes RT #2196
3011     (TableFrame.OnClose, LayerTableFrame.OnClose): Removed. Not needed
3012     anymore.
3013    
3014     * README: Update the minimum requirement for wxPython. Since we
3015     now use the EVT_WINDOW_DESTROY event, we need at least 2.4.0.4,
3016     the version in which that was introduced for all platforms
3017    
3018 frank 1890 2003-10-30 Frank Koormann <[email protected]>
3019    
3020     * Thuban/UI/join.py (JoinDialog.OnJoin): Wrapped the major parts of
3021     the join process in a ThubanBeginBusyCursor, ThubanEndBusyCursor
3022     frame.
3023    
3024 jan 1889 2003-10-30 Jan-Oliver Wagner <[email protected]>
3025    
3026     Improved APR import extension, added further EPSG definitions
3027     and some cleanup regarding string class.
3028    
3029     * test/test_proj.py (TestProjection.test_get_projection_units_geo):
3030     Added test for alias 'longlat'.
3031    
3032     * Resources/Projections/epsg-deprecated.proj: New. Contains
3033     deprecated EPSG definitions.
3034    
3035     * Extensions/importAPR/odb.py (ODBBaseObject.TreeInfo): Added
3036     the variable names for objects.
3037    
3038     * Extensions/importAPR/apr.py (APR_BLnSym, APR_BMkSym, APR_BShSym): New.
3039     Copied from importAPR and provided with documentation.
3040    
3041     * Extensions/importAPR/importAPR.py (APR_BLnSym, APR_BMkSym, APR_BShSym):
3042     Moved to apr.py.
3043     (APR_View): Added object ref 'ITheme'.
3044    
3045     * Thuban/Lib/fileutil.py, Thuban/UI/proj4dialog.py: Replaced string
3046     split function by corresponding use of the string class method.
3047    
3048     * Thuban/Model/xmlwriter.py: Replaced string replace function by
3049     corresponding string method.
3050    
3051 bh 1880 2003-10-29 Bernhard Herzog <[email protected]>
3052    
3053     * Thuban/UI/baserenderer.py
3054     (BaseRenderer.draw_shape_layer_incrementally): Speed up the
3055     special case of a classification that only has the default group
3056    
3057 bh 1868 2003-10-27 Bernhard Herzog <[email protected]>
3058    
3059 bh 1878 * po/fr.po, po/es.po: Updated translations from Daniel Calvelo
3060    
3061 bh 1876 * po/de.po: Update.
3062    
3063     * Thuban/UI/application.py
3064     (ThubanApplication.ShowExceptionDialog): Handle translation of the
3065     dialog message properly
3066    
3067     2003-10-27 Bernhard Herzog <[email protected]>
3068    
3069 bh 1873 Rework how localization works so that we use wx's translation
3070     functions when running Thuban as a normal application but not when
3071     we don't need any UI, such as in the test suite. See the comment
3072     in Thuban/__init__.py for details
3073    
3074     * Thuban/__init__.py (_): Add one level of indirection to make the
3075     translation handling more flexible and to make it possible to use
3076     either wx's translation services or not.
3077     (gettext_identity, translation_function_installed)
3078     (install_translation_function): New function to help with this
3079    
3080     * Thuban/UI/__init__.py: Install the wx specific translation
3081     function if it's OK to do that
3082    
3083     * test/support.py (initthuban): Install a dummy translation
3084     function so that importing Thuban.UI doesn't install a wx specific
3085     one for which would need to import wxPython
3086    
3087     2003-10-27 Bernhard Herzog <[email protected]>
3088    
3089 bh 1870 * HOWTO-Release: Source archives should be created first and the
3090     binary packages should be created from the source archives.
3091     There's an official debian package now so there's no need to test
3092     the rpm on debian anymore
3093    
3094     2003-10-27 Bernhard Herzog <[email protected]>
3095    
3096 bh 1868 Several rendering changes:
3097    
3098     - Render the selection into a separate bitmap so that only that
3099     bitmap needs to be redrawn when the selection changes
3100    
3101     - Render incrementally showing previews and allowing interaction
3102     before rendering is complete
3103    
3104     - Update the renderer interface a bit. Most parameters of
3105     RenderMap are now parameters of the constructor
3106    
3107     * Thuban/UI/baserenderer.py (BaseRenderer.__init__): Add the map
3108     and the update region as parameters. Update the doc-string
3109     (BaseRenderer.render_map_incrementally): New. Generator function
3110     to renders the map incrementally
3111     (BaseRenderer.render_map): Remove the map argument (it's now in
3112     the constructor) and simply iterate over the
3113     render_map_incrementally generator to draw the map.
3114     (BaseRenderer.draw_shape_layer_incrementally)
3115     (BaseRenderer.draw_shape_layer): Renamed to
3116     draw_shape_layer_incrementally and changed into a generator that
3117     yields True every 500 shapes. Used by render_map_incrementally to
3118     render shape layers incrementally
3119    
3120     * Thuban/UI/renderer.py (ScreenRenderer.RenderMap): Removed the
3121     map and region parameters which are now in the constructor
3122     (ScreenRenderer.RenderMapIncrementally): New. Public frontend for
3123     the inherited render_map_incrementally.
3124     (BaseRenderer.draw_shape_layer): Removed.
3125     (ScreenRenderer.draw_selection_incrementally): New. The selection
3126     drawing part of the removed draw_shape_layer as a generator
3127     (ScreenRenderer.layer_shapes): Update because of the region
3128     parameter change
3129     (ExportRenderer.__init__): New. Extend the inherited constructor
3130     with the destination region for the drawing
3131     (ExportRenderer.RenderMap): Removed the map and region parameters
3132     which are now in the constructor
3133    
3134     * Thuban/UI/view.py (MapCanvas.PreviewBitmap): New. Return a
3135     bitmap suitable for a preview in a tool
3136     (CanvasPanTool.MouseMove): Use the PreviewBitmap method to get the
3137     bitmap
3138     (MapPrintout.draw_on_dc): Adapt to new renderer interface
3139     (MapCanvas.OnPaint): Handle drawing the selection bitmap if it
3140     exists
3141     (MapCanvas.OnIdle): Update the logic to deal with incremental
3142     rendering and the selection bitmap
3143     (MapCanvas._do_redraw): Handle the instantiation of the render
3144     iterator and the redraws during rendering
3145     (MapCanvas._render_iterator): New. Generator to incrementally
3146     redraw both bitmaps
3147     (MapCanvas.Export): Adapt to new renderer interface.
3148     (MapCanvas.full_redraw): Reset the selection bitmap and the
3149     renderer iterator too
3150     (MapCanvas.redraw_selection): New. Force a redraw of the selection
3151     bitmap
3152     (MapCanvas.shape_selected): Only redraw the selection bitmap
3153    
3154     * test/test_baserenderer.py
3155     (TestBaseRenderer.test_polygon_no_projection)
3156     (TestBaseRenderer.test_raster_no_projection)
3157     (TestBaseRenderer.test_point_map_projection)
3158     (TestBaseRenderer.test_point_layer_and_map_projection)
3159     (TestBaseRenderer.test_point_layer_projection)
3160     (TestBaseRenderer.test_point_with_classification): Adapt to new
3161     renderer interface
3162    
3163 bh 1865 2003-10-24 Bernhard Herzog <[email protected]>
3164    
3165     * libraries/thuban/wxproj.cpp (draw_polygon_shape)
3166     (point_in_polygon_shape, shape_centroid): Raise an exception if
3167     the shape can't be read. Previously invalid shape ids would lead
3168     to a segfault.
3169    
3170     * test/test_wxproj.py (TestShapeCentroid.test_invalid_shape_id):
3171     New. test whether an exception is raised for invalid shape ids
3172    
3173 jan 1857 2003-10-24 Jan-Oliver Wagner <[email protected]>
3174    
3175 jan 1862 * Thuban/Model/proj.py (Projection.GetProjectedUnits): Added 'longlat'
3176     as alias for 'latlong'.
3177    
3178     * Thuban/UI/projdialog.py (ProjFrame.__init__): Added 'longlat'
3179     as alias for 'latlong'.
3180    
3181     2003-10-24 Jan-Oliver Wagner <[email protected]>
3182    
3183 jan 1859 * Thuban/UI/projdialog.py (ProjFrame.proj_selection_changed): Set
3184     the projection even for the UnknownPanel.
3185     (UnknownProjPanel.__init__): Define the text and create the textctrl
3186     widget.
3187     (UnknownProjPanel._DoLayout): Replaced static text widget by the
3188     textctrl created in __init__.
3189     (UnknownProjPanel.SetProjection): Set the text for the text ctrl
3190     including the parameters of the projection.
3191    
3192     2003-10-24 Jan-Oliver Wagner <[email protected]>
3193    
3194 jan 1857 * Resources/Projections/epsg.proj: New. This is a list of
3195     EPSG codes with parameters for proj. The list has been
3196     generated using devtools/create_epsg.py based on the
3197     file nad/epsg of the proj 4.4.7 package. Four projection
3198     definitions have been deleted as they are not accepted by proj:
3199     "CH1903+ / LV95", "Bern 1898 (Bern) / LV03C", "CH1903 / LV03"
3200     and "HD72 / EOV".
3201    
3202 bh 1855 2003-10-22 Bernhard Herzog <[email protected]>
3203    
3204     Some more tweaks to the projection dialog which should fix RT
3205     #1886.
3206    
3207     * Thuban/UI/projlist.py (ProjectionList.Destroy): Unsubscribe from
3208     the ProjFile's messages and call the base class methods correctly
3209     (ProjectionList.SelectProjection): Set the wxLIST_STATE_FOCUSED
3210     flag on the newly selected item too. Otherwise some other item is
3211     focused and the first time the focus is moved with the keyboard
3212     the selection moves in unexpected ways.
3213    
3214     * Thuban/UI/projdialog.py (ProjFrame.__init__): Do not set the
3215     focus on the OK button, only on the projection list. That way the
3216     list really has the focus initially
3217     (ProjFrame.OnClose): Call the projection list's Destroy method to
3218     make it unsubscribe all messages
3219    
3220 bh 1840 2003-10-21 Bernhard Herzog <[email protected]>
3221    
3222 bh 1852 Rework the projection dialog to fix a few bugs, including RT 2166
3223     and most of 2168
3224    
3225     * Thuban/UI/projlist.py: New. The class ProjectionList is a
3226     special wxListCtrl to show a list of projections in a more MVC
3227     fashion
3228    
3229     * Thuban/UI/projdialog.py (ProjFrame): Substantial changes
3230     throughout the class. The main change is to use the ProjectionList
3231     class instead of a normal wxListBox. Also, add an explicit
3232     "Unknown" projection to the projection choice control.
3233     (ProjPanel.__init__): Add an "unknown" ellipsoid
3234     (TMPanel.__init__, LCCPanel.__init__): Tweak the order of
3235     instantiation of the panel's controls to make the tab-order more
3236     natural
3237    
3238     2003-10-21 Bernhard Herzog <[email protected]>
3239    
3240 bh 1849 * test/test_load.py (TestSingleLayer.file_contents)
3241     (TestSingleLayer.test): Add non-ascii characters to the titles of
3242     session, map and layer. This is effectively a port of the
3243     TestUnicodeStrings test in test_load_0_8.py which for some reason
3244     was only added there.
3245    
3246     * test/test_load_0_9.py (TestSingleLayer.file_contents)
3247     (TestSingleLayer.test): Same as in test_load.py: add non-ascii
3248     characters to the titles of session, map and layer,.
3249    
3250     2003-10-21 Bernhard Herzog <[email protected]>
3251    
3252 bh 1847 Add EPSG projection handling to .thuban files
3253    
3254     * test/test_save.py (SaveSessionTest.dtd)
3255     (SaveSessionTest.testEmptySession)
3256     (SaveSessionTest.testLayerProjection)
3257     (SaveSessionTest.testRasterLayer)
3258     (SaveSessionTest.testClassifiedLayer)
3259     (SaveSessionTest.test_dbf_table)
3260     (SaveSessionTest.test_joined_table)
3261     (SaveSessionTest.test_save_postgis): Update to 1.0-dev namespace
3262     (SaveSessionTest.testSingleLayer): Update to 1.0-dev namespace and
3263     use a and epsg projection to test saving them
3264    
3265     * test/test_load.py (LoadSessionTest.dtd): Update to 1.0-dev
3266     namespace
3267     (TestLayerVisibility.file_contents, TestLabels.file_contents)
3268     (TestLayerProjection.file_contents)
3269     (TestRasterLayer.file_contents, TestJoinedTable.file_contents)
3270     (TestPostGISLayer.file_contents)
3271     (TestPostGISLayerPassword.file_contents)
3272     (TestLoadError.file_contents, TestLoadError.test): Update to use
3273     1.0-dev namespace
3274     (TestSingleLayer.file_contents, TestSingleLayer.test): Update to
3275     use 1.0-dev namespace and use an EPSG projection to test whether
3276     loading it works
3277    
3278     * test/test_load_0_9.py: New. Effectively a copy of test_load.py
3279     as of Thuban 0.9. These are now tests to determine whether Thuban
3280     can still read files generated by Thuban 0.9
3281    
3282     * Thuban/Model/save.py (SessionSaver.write)
3283     (SessionSaver.write_session): Use the 1.0 dtd and 1.0-dev
3284     namespace
3285     (SessionSaver.write_projection): Write the projection's epsg
3286     attribute
3287    
3288     * Thuban/Model/load.py (SessionLoader.__init__): Also accept the
3289     thuban-1.0-dev.dtd namespace
3290     (SessionLoader.check_attrs): Allow a callable object as conversion
3291     too
3292     (SessionLoader.start_projection, SessionLoader.end_projection)
3293     (SessionLoader.start_parameter): Handle the epsg attribute and
3294     rename a few instance variables to lower case
3295    
3296     * Resources/XML/thuban-1.0.dtd: New. Only difference to
3297     thuban-0.9.dtd is the epsg attribute for projections.
3298    
3299     2003-10-21 Bernhard Herzog <[email protected]>
3300    
3301 bh 1840 * test/runtests.py (main): Let the user specify which tests to run
3302     on the command line
3303    
3304     * test/support.py (ThubanTestResult.getDescription): Override to
3305     give a better short description. The description can be used as a
3306     parameter to run_tests to run that particular test in isolation.
3307    
3308 frank 1837 2003-10-21 Frank Koormann <[email protected]>
3309    
3310     Popup menu for legend. Scheduled for the 1.2 release this was too
3311     simple to implement: The popup menu is bound to the legend tree, while
3312     the events are hanlded by its anchestor, the legend panel. This
3313     allows reuse of all the event handlers already implemented for the
3314     legend toolbar buttons.
3315    
3316     * Thuban/UI/legend.py (LegendPanel.__init__): EVT_MENU macros
3317     to add handlers for the events issued by the popup menu.
3318     (LegendPanel._OnToggleVisibility): Handler for toggling layer
3319     visibility event
3320     (LegendPanel._OnProjection): Handler for layer projection event.
3321     (LegendTree.__init__): Added EVT_TREE_ITEM_RIGHT_CLICK
3322     (LegendTree._OnRightClick): Event handler for right click, select item
3323     and pop up menu.
3324     (LegendTree.ToggleVisibility): Toggle layer visibility
3325     (LegendTree.LayerProjection): Raise layer projection dialog for
3326     current layer.
3327    
3328 bh 1836 2003-10-21 Bernhard Herzog <[email protected]>
3329    
3330     * Resources/Projections/defaults.proj: Use correct DOCTYPE
3331     declaration. The top-level element is projectionlist not projfile
3332    
3333 bh 1834 2003-10-20 Bernhard Herzog <[email protected]>
3334    
3335     * Thuban/UI/projdialog.py (ProjFrame.write_proj_file): New. helper
3336     method to write a projfile and display a busy cursor and error
3337     dialogs.
3338     (ProjFrame._OnSave, ProjFrame._OnAddToList, ProjFrame._OnImport)
3339     (ProjFrame._OnExport, ProjFrame._OnRemove): Use write_proj_file
3340     (ProjFrame.__FillAvailList): Translate "<None>" too and display a
3341     busy cursor while loading the user and system prj files.
3342    
3343 bh 1832 2003-10-16 Bernhard Herzog <[email protected]>
3344    
3345     * Thuban/Model/resource.py (projfile_cache): Introduce a cache for
3346     ProjFile objects
3347     (clear_proj_file_cache): New function to clear the cache. Mainly
3348     useful for use by the test suite
3349     (read_proj_file): Use the cache.
3350    
3351     * test/test_proj.py (TestProjFile): Clarify the doc-string
3352     (ProjFileReadTests): Update doc-string
3353     (ProjFileReadTests.test_get_system_proj_file): Check whether the
3354     system proj files is cached.
3355     (ProjFileLoadTestCase): New base class for the proj file tests
3356     derived from support.FileLoadTestCase to provide some common
3357     behavior.
3358     (TestLoadingProjFile)
3359     (TestLoadingProjFileWithEmptyProjectionlist.file_contents)
3360     (TestProjFileWithInvalidParameters.file_contents): Derive from
3361     ProjFileLoadTestCase
3362     (TestLoadingProjFile.test_caching): New. Test whether the cache
3363     works
3364    
3365 silke 1829 2003-10-16 Silke Reimer <[email protected]>
3366    
3367     * debian/*: New directory with configuration files for building a thuban
3368     deb-package.
3369    
3370 bh 1822 2003-10-14 Bernhard Herzog <[email protected]>
3371    
3372 bh 1828 * test/test_proj.py: Execute support.run_tests when run as
3373     __main__ so that missing unsubscribes are detected
3374     (TestProjFile.tearDown): Destroy the proj_file properly
3375    
3376     2003-10-14 Bernhard Herzog <[email protected]>
3377    
3378 bh 1826 * Thuban/Model/messages.py (PROJECTION_ADDED)
3379     (PROJECTION_REPLACED, PROJECTION_REMOVED): New message types for
3380     the ProjFile objects
3381    
3382     * Thuban/Model/proj.py (ProjFile): Derive from Publisher so we can
3383     easily send messages when the projections change
3384     (ProjFile.Add, ProjFile.Remove, ProjFile.Replace): Issue messages
3385     when the change was successful
3386    
3387     * test/test_proj.py (TestProjFile.setUp): Subscribe to some of the
3388     proj file messages
3389     (TestProjFile.test_add_remove)
3390     (TestProjFile.test_remove_non_existing)
3391     (TestProjFile.test_replace)
3392     (TestProjFile.test_replace_non_existing): Test whether the right
3393     messages are sent
3394    
3395     2003-10-14 Bernhard Herzog <[email protected]>
3396    
3397 bh 1822 * test/test_proj.py (TestProjFile.test): Refactor into several
3398     tests
3399     (TestProjFile.test_add_remove)
3400     (TestProjFile.test_remove_non_existing)
3401     (TestProjFile.test_replace)
3402     (TestProjFile.test_replace_non_existing): Some of the new
3403     individual test cases
3404     (TestProjFileSimple): New class for the rest of the test cases
3405     that came out of the refactoring
3406     (ProjFileTest): Derive from xmlsupport.ValidationTest so that the
3407     derived classes don't have to
3408    
3409 bh 1812 2003-10-13 Bernhard Herzog <[email protected]>
3410    
3411 bh 1820 Add an optional EPSG code to the projection objects and extend the
3412     .proj file format accordingly.
3413    
3414     * Resources/XML/projfile.dtd (element projection): Add epsg
3415     attribute
3416    
3417     * Thuban/Model/proj.py (Projection.__init__): New parameter and
3418     instance variable epsg. Update doc-string
3419     (Projection.EPSGCode, Projection.Label): New methods to provide
3420     access to EPSG code and a label for use in dialogs
3421    
3422     * Thuban/Model/resource.py (ProjFileReader.start_projection)
3423     (ProjFileReader.end_projection, ProjFileSaver.write_projfile):
3424     Handle the epsg code attribute when reading or writing proj files
3425    
3426     * Thuban/UI/projdialog.py (ProjFrame._OnSave)
3427     (ProjFrame._OnAddToList, ProjFrame.__DoOnProjAvail)
3428     (ProjFrame.__FillAvailList): Use the projection's Label method to
3429     get the string for the list box
3430    
3431     * test/test_proj.py (TestProjection.test_label)
3432     (TestProjection.test_label_epsg)
3433     (TestProjection.test_epsgcode_for_non_epsg_projection)
3434     (TestProjection.test_epsgcode_for_real_epsg_projection): New tests
3435     for the label and EPSGCode methods
3436     (WriteProjFileTests.doTestWrite, WriteProjFileTests.test_write)
3437     (WriteProjFileTests.test_write_empty_file): Create the ProjFile
3438     objects in the test cases and put the expected contents into the
3439     test case methods too. Update doTestWrite accordingly
3440     (TestLoadingProjFile)
3441     (TestLoadingProjFileWithEmptyProjectionlist): New classes with the
3442     read tests from TestProjFile.
3443     (TestProjFile.doTestRead, TestProjFile.testRead): Removed. These
3444     tests are now in the new classes.
3445     (sample_projfile, sample_projfile_data)
3446     (sample_projfile2, sample_projfile_data2): Removed. Not used
3447     anymore.
3448     (TestProjFile.test_read_unreadable_file): No need to reset the
3449     permissions at the end anymore since we use a unique filename
3450    
3451     2003-10-13 Bernhard Herzog <[email protected]>
3452    
3453 bh 1814 * test/test_proj.py: Some more refactoring of the test cases
3454     (ProjFileTest): New base class for the proj file tests.
3455     (TestProjFile): Derive from ProjFileTest
3456     (TestProjFile.test_read_unreadable_file)
3457     (TestProjFile.test_read_empty_file, TestProjFile.doTestRead): Use
3458     the new filename method to get a unique filename
3459     (TestProjFile.doTestWrite, TestProjFile.testWrite): Removed.
3460     (WriteProjFileTests): New class for proj file write tests.
3461     Contains the write test that were in TestProjFile originally.
3462    
3463     2003-10-13 Bernhard Herzog <[email protected]>
3464    
3465 bh 1812 * test/test_proj.py (TestProjFile.testRead)
3466     (TestProjFile.test_read_non_existing_file)
3467     (TestProjFile.test_read_unreadable_file)
3468     (TestProjFile.test_read_empty_file): Split into several methods.
3469    
3470 bh 1805 2003-10-10 Bernhard Herzog <[email protected]>
3471    
3472 bh 1810 * Thuban/UI/sizers.py: New file with custom sizers.
3473    
3474     * Thuban/UI/projdialog.py (ProjFrame.build_dialog): Instantiate
3475     all projection type specific panels and put them into a
3476     NotebookLikeSizer. This way the dialog doesn't change its size
3477     when a different projection is selected
3478     (ProjFrame.__init__): Rename projection_panels
3479     projection_panel_defs and reuse projection_panels for a list of
3480     the instantiated panels.
3481     (ProjFrame._show_proj_panel, ProjFrame.__DoOnProjAvail)
3482     (ProjFrame.__DoOnProjChoice): Changes due to the new handling of
3483     the panels
3484     (UnknownProjPanel._DoLayout): Place the newlines in the message
3485     differently to make the panel narrower.
3486     (TMPanel._DoLayout): Layout the parameters in one column.
3487    
3488     2003-10-10 Bernhard Herzog <[email protected]>
3489    
3490 bh 1807 * Thuban/UI/projdialog.py (ProjFrame.build_dialog): New method
3491     that contains all the setup for the dialog's widgets, layout and
3492     event handling.
3493     (__): Call build_dialog to build the dialog.
3494     (ProjFrame.__set_properties, ProjFrame.__do_layout): Removed.
3495     Their functionality is now in build_dialog
3496     (ProjFrame.__VerifyButtons, ProjFrame.__VerifyButtons)
3497     (ProjFrame.__DoOnProjAvail, ProjFrame.__DoOnProjAvail)
3498     (ProjFrame.__DoOnProjChoice): Small updates due to slightly
3499     different widget names and hierarchy introduced with build_dialog.
3500    
3501     2003-10-10 Bernhard Herzog <[email protected]>
3502    
3503 bh 1805 * README: Fix typo.
3504    
3505 bh 1803 2003-10-09 Bernhard Herzog <[email protected]>
3506    
3507     * Thuban/Model/proj.py (ProjFile.Add): Do not check whether the
3508     projection is already in the list. This is *a lot* faster when
3509     loading files with hundreds of projections since it saves a linear
3510     search. OTOH this will allow adding the same projection to the
3511     user.proj file multiple times in the projection dialog but we'll
3512     deal with that later
3513    
3514 jan 1801 2003-10-09 Jan-Oliver Wagner <[email protected]>
3515    
3516     * devtools: New. Directory for developer tools that are not intended
3517     for the regular user.
3518    
3519     * devtools/create_epsg.py: New. Convert the epsg file of proj into
3520     a python .proj file.
3521    
3522 bh 1799 2003-10-09 Bernhard Herzog <[email protected]>
3523    
3524     * test/test_proj.py
3525     (TestProjection.test_get_parameter_without_equals_sign): New. Test
3526     whether GetParameter handles parameters without "=" sign correctly
3527    
3528     * Thuban/Model/proj.py (Projection.GetParameter): Handle
3529     parameters that do not contain a "=". Update the doc-string
3530    
3531 bh 1794 2003-10-08 Bernhard Herzog <[email protected]>
3532    
3533 bh 1796 * Thuban/UI/projdialog.py (ProjFrame.__set_properties): Remove the
3534     length limit on the projname text control
3535    
3536     2003-10-08 Bernhard Herzog <[email protected]>
3537    
3538 bh 1794 * test/test_proj.py (TestProjection.test_get_projection_units_geo)
3539     (TestProjection.test_get_projection_units_normal): New. Tests for
3540     the Projection.GetProjectedUnits method
3541    
3542 jan 1792 2003-10-08 Jan-Oliver Wagner <[email protected]>
3543    
3544     * Thuban/Model/resource.py (get_user_proj_file): small bug-fix:
3545     Added missing 'val' parameter.
3546    
3547 bh 1788 2003-10-08 Bernhard Herzog <[email protected]>
3548    
3549 bh 1790 * Thuban/UI/projdialog.py (ProjFrame.__DoOnProjAvail): When the
3550     projection type of the currently selected projection is not known,
3551     i.e. there's no panel for it, use the UnknownProjPanel
3552     (ProjFrame.__DoOnProjChoice, ProjFrame._show_proj_panel): Split
3553     the actual replacing of the proj panel into the new method
3554     _show_proj_panel.
3555     (UnknownProjPanel): Add doc-string.
3556     (UnknownProjPanel._DoLayout): Insert a newline into the text so
3557     that the panel is not so wide.
3558    
3559     2003-10-08 Bernhard Herzog <[email protected]>
3560    
3561 bh 1788 * Thuban/Model/resource.py (read_proj_file): Return the warnings
3562     too. Update the doc-string
3563     (get_proj_files): Removed. It wasn't used anywhere
3564     (get_system_proj_files, get_system_proj_file): Rename to
3565     get_system_proj_file and return the ProjFile object and not a list
3566     of ProjFile objects. Update the callers.
3567     (get_user_proj_files, get_user_proj_file): Rename to
3568     get_user_proj_file return the ProjFile object and not a list of
3569     ProjFile objects. Update the callers.
3570     (ProjFileReader.__init__): New instance variable for the warnings.
3571     Rename the __pf ivar to projfile. Update the methods referring to
3572     __pf
3573     (ProjFileReader.end_projection): Catch any errors raised when
3574     instantiating the projection and record that as an error. The
3575     projection will not be in the final ProjFile object.
3576     (ProjFileReader.GetWarnings): New method to return the warnings.
3577    
3578     * Thuban/UI/projdialog.py (ProjFrame.show_warnings): New method to
3579     show the warnings from the projfile reader
3580     (ProjFrame._OnImport): Deal with any warnings returned by
3581     read_proj_file
3582     (ProjFrame.__FillAvailList): Deal with any warnings returned by
3583     get_system_proj_file or get_user_proj_file.
3584    
3585     * test/test_proj.py (TestProjFile.doTestRead): Check the warnings.
3586     (TestProjFileWithInvalidParameters.file_contents): New test cases
3587     to test whether read_proj_file handles invalid projection
3588     parameters correctly
3589     (TestProjFile.test_get_system_proj_file): New. Simple test for
3590     resource.get_system_proj_file
3591    
3592 bh 1785 2003-10-07 Bernhard Herzog <[email protected]>
3593    
3594     * test/test_derivedshapestore.py
3595     (TestDerivedShapeStoreExceptions.tearDown): Clear the session
3596     properly so that the temporary directories get deleted correctly
3597    
3598 bh 1773 2003-10-06 Bernhard Herzog <[email protected]>
3599    
3600 bh 1783 Handle the title changes in a proper MVC way.
3601    
3602     * Thuban/UI/mainwindow.py (MainWindow.__init__): Subscribe to the
3603     canvas' TITLE_CHANGED messages
3604     (MainWindow.update_title): New. Update the main window's title
3605     (MainWindow.__SetTitle): Removed. Use update_title instead.
3606     (MainWindow.SetMap): Use update_title instead of __SetTitle
3607     (MainWindow.RenameMap): Do change the window title explicitly
3608     here. That's handled in a proper MVC way now.
3609     (MainWindow.title_changed): New. Subscriber for the TITLE_CHANGED
3610     messages
3611    
3612     * Thuban/Lib/connector.py (Conduit): New class to help classes
3613     that forward messages
3614    
3615     * Thuban/UI/viewport.py: Forward the map's TITLE_CHANGED messages
3616     (ViewPort): Derive from Conduit instead of Publisher
3617     (ViewPort.Subscribe, ViewPort.Unsubscribe): Use the new base class
3618     when calling the inherited versions
3619     (ViewPort._subscribe_map, ViewPort._unsubscribe_map): New helper
3620     methods to subscribe and unsubscribe map messages
3621     (ViewPort.SetMap, ViewPort.Destroy): Use the new helper methods to
3622     handle the map subscriptions
3623     (ViewPort.Map, ViewPort.map_projection_changed)
3624     (ViewPort.layer_projection_changed): Add or update doc-strings
3625    
3626     * test/test_connector.py (TestPublisher.test_issue_simple): Fix
3627     typo
3628     (MyConduit): Helper class for the Conduit test.
3629     (TestConduit): Test cases for Conduit
3630    
3631     * test/test_connector.py: Use support.run_tests as main.
3632    
3633     * test/test_viewport.py (ViewPortTest.setUp): Also subscribe to
3634     the TITLE_CHANGED messages
3635     (ViewPortTest.test_forwarding_title_changed): New test to check
3636     whether the viewport forwards the map's TITLE_CHANGED messages
3637     (TestViewportWithPostGIS.tearDown): Call the map's Destroy method
3638     after the port's because the latter may require a still functional
3639     map.
3640    
3641     2003-10-06 Bernhard Herzog <[email protected]>
3642    
3643 bh 1777 * Thuban/UI/application.py (ThubanApplication.maps_changed): Add
3644     doc-string
3645    
3646     2003-10-06 Bernhard Herzog <[email protected]>
3647    
3648 bh 1775 * test/test_viewport.py (ViewPortTest.setUp)
3649     (SimpleViewPortTest.test_init_with_size): Move the test for the
3650     initial size as a constructor parameter from ViewPortTest.setUp
3651     method to a new separate test in SimpleViewPortTest.
3652    
3653     2003-10-06 Bernhard Herzog <[email protected]>
3654    
3655 bh 1773 * test/test_viewport.py (MockView): New class derived from
3656     ViewPort with a mock implementation of GetTextExtent to be used in
3657     the test cases
3658     (ViewPortTest.setUp): Use MockView instead of ViewPort
3659    
3660     * Thuban/UI/viewport.py (ViewPort.GetTextExtent): Turn this method
3661     into what would be a "pure virtual function" in C++: always raise
3662     NotImplementedError. Mock implementations for test cases don't
3663     belong into the real code
3664    
3665 bh 1770 2003-10-02 Bernhard Herzog <[email protected]>
3666    
3667     * test/test_layer.py (TestLayer.test_empty_layer): Explicitly
3668     close the dbf file we create so that it's contents have been
3669     written properly.
3670    
3671     * libraries/shapelib/shptree.c, libraries/shapelib/shpopen.c,
3672     libraries/shapelib/shapefil.h, libraries/shapelib/dbfopen.c:
3673     Update to shapelib 1.2.10
3674    
3675 jan 1767 2003-10-01 Jan-Oliver Wagner <[email protected]>
3676    
3677     * Thuban/UI/tree.py, Thuban/UI/main.py: Remove the #! line as
3678     it annoys lintian which warns about these files not being
3679     executable. The #! isn't necessary here since if you absolutely
3680     must execute them you can always say "python <filename>".
3681    
3682 bh 1757 2003-09-26 Bernhard Herzog <[email protected]>
3683    
3684 bh 1760 * Thuban/Model/classgen.py (GenQuantiles0): Removed since it's
3685     only used in GREAT-ER but not used in Thuban itself. When GREAT-ER
3686     is ported to a newer the import will fail, so it should be noticed
3687     immediately that this function is gone.
3688     Fixes RT#1919
3689    
3690     2003-09-26 Bernhard Herzog <[email protected]>
3691    
3692 bh 1757 Add a DTD for the projection files and make thuban write valid
3693     projection files
3694    
3695     * Resources/XML/projfile.dtd: New. DTD for thuban's projection
3696     files
3697    
3698     * Thuban/Model/resource.py (ProjFileSaver.write): Use
3699     'projectionlist' as the name in the document type declaration so
3700     that it matches the element type of the root element.
3701    
3702     * test/test_proj.py (sample_projfile, sample_projfile2): Use
3703     'projectionlist' as the name in the document type declaration just
3704     as it is done now in the files thuban would write
3705     (sample_projfile, sample_projfile_data): Fix spelling of
3706     "Mercator"
3707     (TestProjFile.doTestWrite): Validate the written and the expected
3708     XML data
3709     (TestProjFile): Derive from ValidationTest so that we can run xml
3710     validation tests
3711    
3712 bh 1751 2003-09-24 Bernhard Herzog <[email protected]>
3713    
3714     * Thuban/UI/renderer.py (ExportRenderer.render_legend): Do not
3715     modify the list returned by map.Layers() in place since it is the
3716     actual list of layers used by the map.
3717    
3718 jan 1745 2003-09-23 Jan-Oliver Wagner <[email protected]>
3719    
3720     * Doc/manual/thuban-manual.xml: Added subsection to chapter
3721     Extensions to describe the extensions coming with the Thuban
3722     standard package (gns2shp and importAPR).
3723    
3724 bh 1743 2003-09-23 Bernhard Herzog <[email protected]>
3725    
3726     * libraries/thuban/wxproj.cpp (project_point): if there's an
3727     inverse but no forward projection, convert to degrees after
3728     applying the inverse projection. Fixes RT#2096
3729    
3730     * test/test_wxproj.py: New. Test cases for wxproj.so. One test
3731     implicitly tests for the fix to RT#2096
3732    
3733     * test/support.py (FloatComparisonMixin.assertFloatSeqEqual):
3734     Check that the sequences have the same lengths
3735    
3736     * Resources/Projections/defaults.proj (Geographic projection): Use
3737     a much more precise value for the to_meter attribute.
3738    
3739 bh 1737 2003-09-22 Bernhard Herzog <[email protected]>
3740    
3741     * test/support.py (initthuban): Make sure to unset the LANG env.
3742     var. so that tests that compare translated strings work. Solves RT
3743     #2094
3744    
3745 jan 1730 2003-09-22 Jan-Oliver Wagner <[email protected]>
3746    
3747 jan 1735 Small improvement of APR import.
3748    
3749     * Extensions/importAPR/test/test_apr.py (aprTest.test_LClass):
3750     Added tests for text-ranges.
3751    
3752     * Extensions/importAPR/apr.py (APR_LClass.GetThubanRange): Now
3753     returns a string object if the range is based on text.
3754    
3755     * Extensions/importAPR/importAPR.py (import_apr_dialog): Unified
3756     range retrieval.
3757    
3758     2003-09-22 Jan-Oliver Wagner <[email protected]>
3759    
3760 jan 1730 Initial version of the importAPR extension which is in
3761     experimental state.
3762    
3763     * /Extensions/importAPR/, /Extensions/importAPR/samples/,
3764     /Extensions/importAPR/test/: New directories.
3765    
3766     * /Extensions/importAPR/samples/README: New: Howto load the samples.
3767    
3768     * /Extensions/importAPR/samples/iceland.apr: New: A sample APR
3769     file which refers to the Thuban Iceland demo data.
3770    
3771     * /Extensions/importAPR/test/README: New: Howto execute the tests.
3772    
3773     * /Extensions/importAPR/test/test_apr.py: New: Tests for APR classes.
3774    
3775     * /Extensions/importAPR/apr.py: New: Classes for ArcView Objects
3776     as in '.apr'-files.
3777    
3778     * /Extensions/importAPR/odb.py: New: Classes for generic ArcView
3779     ODB Objects as in '.apr', '.avl' and other files.
3780    
3781     * /Extensions/importAPR/__init__.py: New: Init to make this
3782     directory a package.
3783    
3784     * /Extensions/importAPR/importAPR.py: New: Import a ArcView
3785     project file (.apr) and convert it to Thuban.
3786    
3787     2003-09-22 Jan-Oliver Wagner <[email protected]>
3788    
3789     * Extensions/gns2shp.gns2shp.py: The main module of gns2shp.
3790    
3791 jan 1720 2003-09-19 Jan-Oliver Wagner <[email protected]>
3792    
3793     * Doc/manual/thuban-manual.xml: Extended section 'Installation'
3794     with description on RPM installation and RPM binary package
3795     creation.
3796    
3797 bh 1718 2003-09-18 Bernhard Herzog <[email protected]>
3798    
3799     * setup.py (data_files): Only add the mo files if the Locales
3800     directory actually exists, so that setup.py works with a fresh CVS
3801     checkout
3802    
3803 jan 1716 2003-09-12 Jan-Oliver Wagner <[email protected]>
3804    
3805     * Examples/simple_extensions/simple_tool.py: bugfix: Tool is now
3806     in viewport, not anymore in view
3807    
3808 jan 1714 2003-09-04 Jan-Oliver Wagner <[email protected]>
3809    
3810     Introducing first Extension (gns2shp).
3811    
3812     * Extensions, Extensions/gns2shp, Extensions/gns2shp/test: New.
3813    
3814     * Extensions/__init__.py: New. init to make this dir a package.
3815    
3816     * Extensions/gns2shp/__init__.py: New. init to make this dir a package.
3817    
3818     * Extensions/gns2shp/test/README: New. some info on this test directory.
3819    
3820     * Extensions/gns2shp/test/ls.txt: New. test data set (Liechtenstein).
3821    
3822     * Extensions/gns2shp/test/test_gns2shp.py: New. Test for correct creation
3823     of Shapefile from GNS text file format
3824    
3825 jan 1705 2003-09-03 Jan-Oliver Wagner <[email protected]>
3826    
3827 jan 1707 Fix/workaround for bug #2019:
3828     https://intevation.de/rt/webrt?serial_num=2019
3829    
3830     * Thuban/UI/identifyview.py (IdentifyView.ID_STOP): New.
3831     (IdentifyView.__init__): Added another button that allows to
3832     stop the identify mode.
3833     (IdentifyView.OnStop): New. Stops the identify mode.
3834    
3835     2003-09-03 Jan-Oliver Wagner <[email protected]>
3836    
3837 jan 1705 Introducing a new exception dialog that allows to exit the
3838     application immediately.
3839     This fixes bug #2060: https://intevation.de/rt/webrt?serial_num=2060
3840    
3841     * Thuban/UI/exceptiondialog.py: New. A special exception dialog.
3842    
3843     * Thuban/UI/application.py (ThubanApplication.ShowExceptionDialog):
3844     Made strings available to translations. Exchanged the simple
3845     ScrolledMessageDialog by the new ExceptionDialog.
3846    
3847 bh 1694 2003-09-01 Bernhard Herzog <[email protected]>
3848    
3849 bh 1701 * NEWS: New. Summary of changes and release notes.
3850    
3851     * MANIFEST.in: Add NEWS
3852    
3853     2003-09-01 Bernhard Herzog <[email protected]>
3854    
3855 bh 1699 * MANIFEST.in: Correct the include statement for the mo-files and
3856     include the documentation too.
3857    
3858     * setup.py (data_files): Add the .mo files
3859     (setup call): Up to version 0.9.0
3860    
3861     2003-09-01 Bernhard Herzog <[email protected]>
3862    
3863 bh 1696 * Thuban/UI/dbdialog.py (ChooseDBTableDialog.__init__): Change the
3864     parameter list to just parent and session
3865     (ChooseDBTableDialog.__set_properties): Removed. Setting the
3866     selection of empty list boxes is not allowed (and produces C++
3867     assertion errors) and the rest of the setup is better done in
3868     __init__ anyway.
3869     (ChooseDBTableDialog.OnCancel, ChooseDBTableDialog.OnOK)
3870     (ChooseDBTableDialog.OnLBDClick, DBDialog.OnOK): Use the Python
3871     builtins True/False for booleans to avoid warnings from wxPython
3872    
3873     * Thuban/UI/mainwindow.py (MainWindow.AddDBLayer): Adapt to new
3874     ChooseDBTableDialog constructor parameters.
3875    
3876     2003-09-01 Bernhard Herzog <[email protected]>
3877    
3878 bh 1694 * Thuban/Model/postgisdb.py
3879     (PostGISTable): Extend doc-string
3880     (PostGISTable._fetch_table_information): Set the column index
3881     correctly, pretending ignored columns don't exist.
3882    
3883     * test/test_postgis_db.py (TestPostGISIgnoredColumns): New tests
3884     for postgis tables with data types not yet supported by thuban.
3885    
3886 bh 1692 2003-08-29 Bernhard Herzog <[email protected]>
3887    
3888     * HOWTO-Release: Tweak item about running the tests.
3889    
3890 jan 1690 2003-08-29 Jan-Oliver Wagner <[email protected]>
3891    
3892     * /Doc/manual/thuban-manual.xml: updated to version 1.0pre2.
3893    
3894 bh 1688 2003-08-29 Bernhard Herzog <[email protected]>
3895    
3896     Add some missing parameters to projections. Proj complains about
3897     them on windows but for some reason not on Linux.
3898    
3899     * test/test_save.py (SaveSessionTest.testLayerProjection): Add
3900     missing required projection parameters
3901    
3902     * test/test_proj.py (TestProjFile.test): Add missing required
3903     projection parameters
3904    
3905     * test/test_load_0_8.py (TestLayerProjection.file_contents)
3906     (TestLayerProjection.test): Add missing required projection
3907     parameters and tests for them
3908    
3909     * test/test_load.py (TestLayerProjection.file_contents)
3910     (TestLayerProjection.test): Add missing required projection
3911     parameters and tests for them
3912    
3913     * test/test_layer.py (TestLayer.test_base_layer): Add missing
3914     required projection parameters
3915    
3916     2003-08-29 Bernhard Herzog <[email protected]>
3917    
3918     * libraries/pyprojection/Projection.i: Use pj_get_errno_ref to
3919     access the pj_errno because directly accessing pj_errno doesn't
3920     work on windows if the proj library is in a DLL
3921    
3922     * libraries/pyprojection/Projection_wrap.c: Update from Projection.i
3923    
3924 bh 1672 2003-08-28 Bernhard Herzog <[email protected]>
3925    
3926 bh 1685 * test/test_proj.py: Import things from Thuban after calling
3927     initthuban
3928    
3929     * test/test_load.py (LoadSessionTest.filenames): New class
3930     variable with the filename attributes to normalize
3931     (LoadSessionTest.check_format): Pass self.filenames to
3932     sax_eventlist to normalize the filename attributes
3933    
3934     * test/xmlsupport.py: Add cvs keywords
3935     (SaxEventLister.__init__): New parameter filenames which indicates
3936     attributes that contain filenames
3937     (SaxEventLister.startElementNS): Normalize the filename attributes
3938     with os.path.normpath
3939     (sax_eventlist): New parameter filenames to pass through to
3940     SaxEventLister
3941    
3942     * test/test_derivedshapestore.py: Make this file callable as a
3943     program to execute the tests
3944     (TestDerivedShapeStoreExceptions.test_table_with_wrong_size): Bind
3945     the session to self.session so that it gets destroyed properly
3946    
3947     * test/test_layer.py (TestLayer.tearDown): Call the session's
3948     Destroy method
3949    
3950     * test/test_map.py (TestMapBase.tearDown): Destroy self.session
3951     too if it exists
3952     (TestMapAddLayer.test_add_layer): Bind the session to self.session
3953     so that it gets destroyed properly
3954    
3955     * test/postgissupport.py (reason_for_not_running_tests): Add a
3956     test for the existence of popen2.Popen4.
3957    
3958     * test/test_save.py (SaveSessionTest.tearDown): New. Provide a
3959     reliable way to destroy the sessions created in the test cases
3960     (SaveSessionTest.test_dbf_table): Bind the session to self.session
3961     so that it gets destroyed properly
3962     (SaveSessionTest.testLayerProjection): Bind the session to
3963     self.session so that it gets destroyed properly
3964    
3965     * test/test_session.py (UnreferencedTablesTests.tearDown): Make
3966     sure that the session is destroyed properly
3967    
3968     * test/test_shapefilestore.py: Make this callable as a program to
3969     execute the tests
3970    
3971     * test/test_scalebar.py: Remove unnecessary import of _ from
3972     Thuban
3973    
3974     * test/support.py (print_garbage_information): Call initthuban
3975     here because it may be called indirectly from test cases that test
3976     test support modules which do not use anything from thuban itself
3977     (ThubanTestProgram.runTests): Remove unnecessary debug print
3978    
3979     2003-08-28 Bernhard Herzog <[email protected]>
3980    
3981 bh 1672 * Thuban/version.py (longversion): Update to 0.9
3982    
3983     * Thuban/UI/mainwindow.py: Remove some unused imports
3984    
3985     * README: Add section about required additional software. Add date
3986     and revision CVS keywords
3987    
3988     * HOWTO-Release: Add item about the translations. Add date and
3989     revision CVs keywords and change formatting to match README a bit
3990     better
3991    
3992     * po/de.po: Update for 0.9
3993    
3994     * test/README: Tweak the wording a little because many tests are
3995     not really unittest.
3996    
3997 bh 1663 2003-08-27 Bernhard Herzog <[email protected]>
3998    
3999 bh 1665 As preparation for the 0.9 release, switch thuban files to a
4000     non-dev namespace
4001    
4002     * Thuban/Model/save.py (SessionSaver.write_session): Write files
4003     with the http://thuban.intevation.org/dtds/thuban-0.9.dtd
4004     namespace
4005    
4006     * Thuban/Model/load.py (SessionLoader.__init__): Accept the
4007     http://thuban.intevation.org/dtds/thuban-0.9.dtd namespace too
4008    
4009     * test/test_save.py (SaveSessionTest.dtd)
4010     (SaveSessionTest.testEmptySession)
4011     (SaveSessionTest.testSingleLayer)
4012     (SaveSessionTest.testLayerProjection)
4013     (SaveSessionTest.testRasterLayer)
4014     (SaveSessionTest.testClassifiedLayer)
4015     (SaveSessionTest.test_dbf_table)
4016     (SaveSessionTest.test_joined_table)
4017     (SaveSessionTest.test_save_postgis): Update for new namespace
4018    
4019     * test/test_load.py (LoadSessionTest.dtd, TestSingleLayer)
4020     (TestLayerVisibility.file_contents, TestLabels.file_contents)
4021     (TestLayerProjection.file_contents)
4022     (TestRasterLayer.file_contents, TestJoinedTable.file_contents)
4023     (TestPostGISLayer.file_contents)
4024     (TestPostGISLayerPassword.file_contents)
4025     (TestLoadError.file_contents, TestLoadError.test): Update for new
4026     namespace
4027    
4028     2003-08-27 Bernhard Herzog <[email protected]>
4029    
4030 bh 1663 Make the table interface distinguish between row ids (an integer
4031     that uniquely identifies a row) and row ordinals (a simple row
4032     count from 0 to NumRows() - 1)
4033    
4034     * Thuban/Model/postgisdb.py (PostGISTable.RowIdToOrdinal)
4035     (PostGISTable.RowOrdinalToId): New methods to conver between row
4036     ids and row ordinals
4037     (PostGISTable.ReadRowAsDict, PostGISTable.ReadValue): New keyword
4038     parameter row_is_ordinal to indicate whether the row parameter is
4039     the row id or the ordinal
4040    
4041     * Thuban/Model/transientdb.py (TransientTableBase.RowIdToOrdinal)
4042     (TransientTableBase.RowOrdinalToId)
4043     (AutoTransientTable.RowIdToOrdinal)
4044     (AutoTransientTable.RowOrdinalToId): Same new methods as in
4045     PostGISTable.
4046     (TransientTableBase.ReadRowAsDict, TransientTableBase.ReadValue)
4047     (AutoTransientTable.ReadRowAsDict, AutoTransientTable.ReadValue):
4048     Same new parameter as in PostGISTable.
4049    
4050     * Thuban/Model/table.py (DBFTable.RowIdToOrdinal)
4051     (DBFTable.RowOrdinalToId, MemoryTable.RowIdToOrdinal)
4052     (MemoryTable.RowOrdinalToId): Same new methods as in PostGISTable.
4053     (DBFTable.ReadValue, DBFTable.ReadRowAsDict)
4054     (MemoryTable.ReadValue, MemoryTable.ReadRowAsDict): Same new
4055     parameter as in PostGISTable.
4056    
4057     * Thuban/UI/tableview.py (DataTable.RowIdToOrdinal)
4058     (DataTable.RowOrdinalToId): New methods to convert between row ids
4059     and row ordinals.
4060     (TableGrid.SelectRowById): New method to select a row based on its
4061     ID as opposed to its ordinal
4062     (DataTable.GetValue, TableGrid.OnRangeSelect)
4063     (TableGrid.OnSelectCell, LayerTableGrid.select_shapes)
4064     (QueryTableFrame.OnQuery, QueryTableFrame.get_selected)
4065     (LayerTableFrame.__init__): Convert between row ids and row
4066     ordinals as appropriate
4067    
4068     * test/postgissupport.py (PostGISDatabase.__init__): Add
4069     doc-string.
4070     (PostGISDatabase.initdb): The optional third item in a tuple in
4071     tables is now a (key, value) list with additional arguments to
4072     pass to upload_shapefile
4073     (upload_shapefile): New parameter gid_offset to allow gids that
4074     are not the same as the shapeids in the shapefile
4075     (PostgreSQLServer.get_default_static_data_db): Use the new
4076     gid_offset to make the gids in landmarks 1000 higher than the
4077     shapeids in the shapefile
4078    
4079     * test/test_viewport.py
4080     (TestViewportWithPostGIS.test_find_shape_at_point): Adapt to the
4081     new shapeids in the landmarks table
4082    
4083     * test/test_transientdb.py
4084     (TestTransientTable.run_iceland_political_tests)
4085     (TestTransientTable.test_transient_joined_table): Add tests for
4086     the new table methods and new keywords arguments.
4087    
4088     * test/test_postgis_db.py
4089     (TestPostGISTable.test_read_row_as_dict_row_count_mode)
4090     (TestPostGISTable.test_read_value_row_count_mode)
4091     (TestPostGISTable.test_row_id_to_ordinal)
4092     (TestPostGISTable.test_row_oridnal_to_id): New test for the new
4093     table methods and the new arguments
4094     (TestPostGISShapestorePoint.test_shapes_in_region)
4095     (TestPostGISShapestorePoint.test_shape_raw_data)
4096     (TestPostGISShapestorePoint.test_shape_points)
4097     (TestPostGISShapestorePoint.test_shape_shapeid)
4098     (TestPostGISShapestorePoint.test_all_shapes)
4099     (TestPostGISTable.test_simple_query)
4100     (TestPostGISTable.test_simple_query)
4101     (TestPostGISTable.test_simple_query)
4102     (TestPostGISTable.test_read_value)
4103     (TestPostGISTable.test_read_row_as_dict): Adapt to the new
4104     shapeids in the landmarks table
4105    
4106     * test/test_memory_table.py
4107     (TestMemoryTable.test_read_row_as_dict_row_count_mode)
4108     (TestMemoryTable.test_read_value_row_count_mode)
4109     (TestMemoryTable.test_row_id_to_ordinal)
4110     (TestMemoryTable.test_row_oridnal_to_id): New test for the new
4111     table methods and the new arguments
4112    
4113     * test/test_dbf_table.py
4114     (TestDBFTable.test_read_row_as_dict_row_count_mode)
4115     (TestDBFTable.test_read_value_row_count_mode)
4116     (TestDBFTable.test_row_id_to_ordinal)
4117     (TestDBFTable.test_row_oridnal_to_id): New test for the new table
4118     methods and the new arguments
4119    
4120 bh 1659 2003-08-26 Bernhard Herzog <[email protected]>
4121    
4122 bh 1661 * Thuban/Model/postgisdb.py (PostGISShapeStore.BoundingBox): Use a
4123     more postgis specific but much faster method to get the bounding
4124     box
4125    
4126     2003-08-26 Bernhard Herzog <[email protected]>
4127    
4128 bh 1659 * Thuban/Model/postgisdb.py (PostGISTable.Title)
4129     (PostGISShapeStore.AllShapes): Add these missing methods.
4130     (PostGISShapeStore.ShapesInRegion): No need to raise
4131     StopIteration. We can simply return
4132    
4133     * test/test_postgis_db.py (TestPostGISTable.test_title)
4134     (TestPostGISShapestorePoint.test_all_shapes): New tests for the
4135     new methods
4136    
4137 bh 1643 2003-08-25 Bernhard Herzog <[email protected]>
4138    
4139 bh 1657 * Thuban/Model/postgisdb.py (shapetype_map): Add MUTLIPOLYGON.
4140    
4141     * test/test_postgis_db.py (PolygonTests): New class containing
4142     those tests from TestPostGISShapestorePolygon that can also be
4143     used to test MUTLIPOLYGON tables
4144     (TestPostGISShapestorePolygon): Most tests are now in PolygonTests
4145     so derive from that
4146     (TestPostGISShapestoreMultiPolygon): New class with tests for
4147     MUTLIPOLYGON tables
4148    
4149     * test/postgissupport.py (PostGISDatabase.initdb): Allow the
4150     tables argument to have tuples with three items to override the
4151     WKT type used.
4152     (PostgreSQLServer.get_default_static_data_db): Use the above to
4153     create a polygon table with MUTLIPOLYGONs
4154     (point_to_wkt, coords_to_point, polygon_to_wkt, coords_to_polygon)
4155     (arc_to_wkt, coords_to_multilinestring): Rename from *_to_wkt to
4156     coords_to*
4157     (coords_to_multipolygon): New. Convert to MUTLIPOLYGON
4158     (wkt_converter): New. Map WKT types to converters
4159     (upload_shapefile): New parameter force_wkt_type to use a
4160     different WKT type than the default
4161    
4162     2003-08-25 Bernhard Herzog <[email protected]>
4163    
4164 bh 1655 * Thuban/UI/application.py
4165     (ThubanApplication.run_db_param_dialog): New. Suitable as a
4166     db_connection_callback. Main difference is that the dialog run
4167     from this method doesn't have a parent so it can be used even when
4168     there is no main window
4169     (ThubanApplication.OpenSession): Use self.run_db_param_dialog if
4170     no db_connection_callback was given. This way the dialog pops up
4171     even when the .thuban file was given as a command line parameter.
4172    
4173     2003-08-25 Bernhard Herzog <[email protected]>
4174    
4175 bh 1653 * Thuban/UI/view.py (MapCanvas.OnLeftUp): Release the the mouse
4176     before calling MouseLeftUp. MouseLeftUp may pop up modal dialogs
4177     which leads to an effectively frozen X session because the user
4178     can only interact with the dialog but the mouse is still grabbed
4179     by the canvas.
4180     Also, call the tool's Hide method before MouseLeftUp because
4181     MouseLeftUp may change the tool's coordinates.
4182    
4183     2003-08-25 Bernhard Herzog <[email protected]>
4184    
4185 bh 1651 * Thuban/UI/application.py (ThubanApplication.OpenSession): Catch
4186     LoadCancelled exceptions and handle them by returning immediately.
4187    
4188     2003-08-25 Bernhard Herzog <[email protected]>
4189    
4190 bh 1649 GUI part of loading sessions with postgis connections which may
4191     require user interaction to get passwords or updated parameters
4192    
4193     * Thuban/UI/dbdialog.py (DBDialog): Reimplement to make it look a
4194     bit nucer and be more generic.
4195     (DBFrame.OnAdd): Adapt to new DBDialog interface
4196    
4197     * Thuban/UI/application.py (ThubanApplication.OpenSession): New
4198     optional parameter db_connection_callback which is passed to
4199     load_session.
4200    
4201     * Thuban/UI/mainwindow.py (MainWindow.run_db_param_dialog): New.
4202     Suitable as a db_connection_callback
4203     (MainWindow.OpenSession): Use self.run_db_param_dialog as the
4204     db_connection_callback of the application's OpenSession method
4205    
4206    
4207     2003-08-25 Bernhard Herzog <[email protected]>
4208    
4209 bh 1647 Basic loading of sessions containing postgis connections:
4210    
4211     * Thuban/Model/load.py (LoadError): Add doc-string
4212     (LoadCancelled): New exception class to indicate a cancelled load
4213     (SessionLoader.__init__): Add the db_connection_callback parameter
4214     which will be used by the loader to get updated parameters and a
4215     password for a database connection
4216     (SessionLoader.__init__): Add the new XML elements to the
4217     dispatchers dictionary
4218     (SessionLoader.check_attrs): Two new conversions, ascii to convert
4219     to a byte-string object and idref as a generic id reference
4220     (SessionLoader.start_dbconnection)
4221     (SessionLoader.start_dbshapesource): New. Handlers for the new XML
4222     elements
4223     (load_session): Add the db_connection_callback to pass through the
4224     SessionLoader
4225    
4226     * test/test_load.py (TestPostGISLayer, TestPostGISLayerPassword):
4227     New classes to test loading of sessions with postgis database
4228     connections.
4229    
4230     2003-08-25 Bernhard Herzog <[email protected]>
4231    
4232 bh 1645 * Thuban/UI/mainwindow.py (__ThubanVersion__): Remove this and
4233     replace it and the comment with __BuildDate__ by the Source: and
4234     Id: cvs keywords as used in the other files.
4235    
4236     2003-08-25 Bernhard Herzog <[email protected]>
4237    
4238 bh 1643 * Thuban/Model/load.py (SessionLoader.check_attrs): Raise a
4239     LoadError when a required attribute is missing. The code used to
4240     be commented out for some reason, but probably should have been
4241     active.
4242    
4243     * test/test_load.py (TestLoadError.test): Test the message in the
4244     LoadError too to make sure it really is about the missing
4245     attribute
4246    
4247 bh 1632 2003-08-22 Bernhard Herzog <[email protected]>
4248 bh 1641
4249     * test/test_save.py (SaveSessionTest.test_dbf_table)
4250     (SaveSessionTest.test_joined_table): Add XML validation tests.
4251    
4252     2003-08-22 Bernhard Herzog <[email protected]>
4253    
4254 bh 1639 Implement saving a session with a postgis connection
4255 bh 1632
4256 bh 1639 * Resources/XML/thuban-0.9.dtd (dbconnection, dbshapesource) New
4257     elements for database connections and shapestores using db
4258     connections
4259     (session): Add the dbconnections to the content model
4260    
4261     * Thuban/Model/save.py (SessionSaver.write_db_connections): New.
4262     Write the db connections
4263     (SessionSaver.write_session): Call write_db_connections to write
4264     the connection before the data sources
4265     (SessionSaver.write_data_containers): Handle postgis shapestores
4266    
4267     * test/test_save.py (SaveSessionTest.thubanids)
4268     (SaveSessionTest.thubanidrefs): Update for new DTD
4269     (SaveSessionTest.test_save_postgis): New. Test saving a session
4270     with postgis connections
4271    
4272     * Thuban/Model/postgisdb.py (PostGISTable.DBConnection)
4273     (PostGISTable.TableName): New accessor methods for the connection
4274     and table name
4275    
4276     * test/test_postgis_db.py (TestPostGISTable.test_dbconn)
4277     (TestPostGISTable.test_dbname): New methods to test the new
4278     PostGISConnection methods
4279    
4280     2003-08-22 Bernhard Herzog <[email protected]>
4281    
4282 bh 1637 * Thuban/Model/postgisdb.py (ConnectionError): New exception class
4283     for exceptions occurring when establishing a Database connection
4284     (PostGISConnection.connect): Catch psycopg.OperationalError during
4285     connects and raise ConnectionError.
4286    
4287     * test/test_postgis_db.py (TestPostgisDBExceptions): New class for
4288     tests for database exceptions
4289    
4290     2003-08-22 Bernhard Herzog <[email protected]>
4291    
4292 bh 1635 Prepare the test suite for tests with required authentication
4293    
4294     * test/postgissupport.py (PostgreSQLServer.__init__): Add instance
4295     variables with two predefined users/passwords, one for the admin
4296     and one for a non-privileged user.
4297     (PostgreSQLServer.createdb): Pass the admin name to initdb and add
4298     the non-privileged user to the database and set the admin password
4299     (PostgreSQLServer.wait_for_postmaster): Use the admin user name.
4300     Better error reporting
4301     (PostgreSQLServer.connection_params)
4302     (PostgreSQLServer.connection_string): New methods to return
4303     information about how to connect to the server
4304     (PostgreSQLServer.execute_sql): New. Convenience method to execute
4305     SQL statements
4306     (PostgreSQLServer.require_authentication): Toggle whether the
4307     server requires authentication
4308     (PostgreSQLServer.create_user, PostgreSQLServer.alter_user): New.
4309     Add or alter users
4310     (PostGISDatabase.initdb): Pass the admin name one the
4311     subprocesses' command lines. Grant select rights on
4312     geometry_columns to everybody.
4313     (upload_shapefile): Use the admin name and password when
4314     connecting. Grant select rights on the new table to everybody.
4315    
4316     * test/test_viewport.py (TestViewportWithPostGIS.setUp): Use the
4317     server's new methods to get the connection parameters.
4318    
4319     * test/test_postgis_session.py (TestSessionWithPostGIS.setUp)
4320     (TestSessionWithPostGIS.test_remove_dbconn_exception): Use the
4321     server's new methods to get the connection parameters.
4322    
4323     * test/test_postgis_db.py
4324     (TestPostGISConnection.test_gis_tables_empty)
4325     (TestPostGISConnection.test_gis_tables_non_empty)
4326     (PostGISStaticTests.setUp): Use the server's new methods to get
4327     the connection parameters.
4328    
4329     2003-08-22 Bernhard Herzog <[email protected]>
4330    
4331 bh 1632 * Thuban/UI/about.py (About.__init__): Add the psycopg version.
4332    
4333     * Thuban/version.py: Add psycopg version
4334    
4335     * Thuban/Model/postgisdb.py (psycopg_version): New. Return the
4336     version of the psycopg module
4337    
4338     2003-08-22 Bernhard Herzog <[email protected]>
4339    
4340     * Thuban/UI/dbdialog.py (DBPwdDlg): Removed because it's not used.
4341     (DBFrame.OnEdit): Removed because it's not used and wouldn't work
4342     at the moment. The functionality should probably be implemented
4343     some time, though.
4344 bh 1633 (DBFrame.OnRemove): Display a message if the connection can't be
4345     removed because it's still in use.
4346 bh 1632
4347 jan 1629 2003-08-22 Jan-Oliver Wagner <[email protected]>
4348    
4349     * Thuban/UI/about.py (About.__init__): split up the huge about
4350     text into elements/lists for easier translation. This fixes bug
4351     https://intevation.de/rt/webrt?serial_num=2058
4352     Also, made some forgotten string available for the i18n.
4353    
4354 bh 1627 2003-08-21 Bernhard Herzog <[email protected]>
4355    
4356     Make postgis support really optional including insensitive menu
4357     items.
4358    
4359     * Thuban/Model/postgisdb.py (has_postgis_support): New. Return
4360     whether the postgis is supported.
4361    
4362     * Thuban/UI/dbdialog.py: Put the psycopg import into try..except
4363     to make postgis support optional
4364    
4365     * Thuban/UI/mainwindow.py (_has_postgis_support): New. Context
4366     version of Thuban.Model.postgisdb.has_postgis_support
4367     (database_management command): Make it only sensitive if postgis
4368     is supported.
4369    
4370 jan 1623 2003-08-21 Jan-Oliver Wagner <[email protected]>
4371    
4372 jan 1626 * Doc/manual/thuban-manual.xml: Added CVS revision for rev-history.
4373     (section Adding and Removing Layers): Added text and described
4374     multi-selection.
4375     (chapter Extensions): New.
4376    
4377     2003-08-21 Jan-Oliver Wagner <[email protected]>
4378    
4379 jan 1623 * Thuban/UI/mainwindow.py (MainWindow.AddLayer): Changed dialog
4380     settings to allow multiple files to load into the map.
4381     Also reduced selection to *.shp as a default.
4382    
4383 bh 1621 2003-08-20 Bernhard Herzog <[email protected]>
4384    
4385     Add dialogs and commands to open database connections and add
4386     database layers.
4387    
4388     * Thuban/UI/mainwindow.py (MainWindow.DatabaseManagement): New
4389     method to open the database connection management dialog
4390     (MainWindow.AddDBLayer): New method to add a layer from a database
4391     (_has_dbconnections): New helper function to use for sensitivity
4392     (database_management command, layer_add_db command): New commands
4393     that call the above new methods.
4394     (main_menu): Add the new commands to the menu.
4395    
4396     * Thuban/Model/postgisdb.py (PostGISConnection.__init__)
4397     (PostGISConnection.connect): Establish the actual connection in a
4398     separate method and call it in __init__. This makes it easier to
4399     override the behavior in test cases
4400     (PostGISConnection.BriefDescription): New method to return a brief
4401     description for use in dialogs.
4402    
4403     * test/test_postgis_db.py (NonConnection): DB connection that
4404     doesn't actually connect
4405     (TestBriefDescription): New class with tests for the new
4406     BriefDescription method
4407    
4408 jan 1619 2003-08-19 Jan-Oliver Wagner <[email protected]>
4409    
4410     Moved anything from extensions to libraries.
4411    
4412     * libraries: New.
4413    
4414     * libraries/ pyprojection, pyshapelib, shapelib, thuban: New.
4415    
4416     * libraries/pyprojection/ LICENSE, MANIFEST.in, Projection.i,
4417     Projection.py, Projection_wrap.c, setup.py, swighelp.txt: These files have
4418     been moved here from thuban/extensions/pyprojection/
4419     See there in the Attic for the older history.
4420    
4421     * libraries/pyshapelib/ COPYING, ChangeLog, NEWS, README, dbflib.i,
4422     dbflib.py, dbflib_wrap.c, pyshapelib_api.h, pytest.py, setup.py,
4423     shapelib.i, shapelib.py, shapelib_wrap.c, shptreemodule.c: These files
4424     have been moved here from thuban/extensions/pyshapelib/
4425     See there in the Attic for the older history.
4426    
4427     * libraries/shapelib/ dbfopen.c, shapefil.h, shpopen.c, shptree.c: These
4428     files have been moved here from thuban/extensions/shapelib/
4429     See there in the Attic for the older history.
4430    
4431     * libraries/thuban/ bmpdataset.cpp, cpl_mfile.cpp, cpl_mfile.h,
4432     gdalwarp.cpp, wxproj.cpp: These files have been moved here from
4433     thuban/extensions/thuban/
4434     See there in the Attic for the older history.
4435    
4436     * MANIFEST.in, setup.cfg, setup.py: renamed extensions to libraries.
4437    
4438     * extensions/thuban/ bmpdataset.cpp, cpl_mfile.cpp, cpl_mfile.h,
4439     gdalwarp.cpp, wxproj.cpp: Moved to libraries/thuban.
4440    
4441     * extensions/shapelib/ dbfopen.c, shapefil.h, shpopen.c, shptree.c:
4442     Moved to libraries/shapelib.
4443    
4444     * extensions/pyshapelib/ COPYING, NEWS, dbflib.py, pytest.py,
4445     shapelib.py, README, dbflib_wrap.c, setup.py, shapelib_wrap.c,
4446     ChangeLog, dbflib.i, pyshapelib_api.h, shapelib.i, shptreemodule.c:
4447     Moved to libraries/pyshapelib.
4448    
4449     * extensions/pyprojection/ MANIFEST.in, Projection.py, setup.py,
4450     LICENSE, Projection.i, Projection_wrap.c, swighelp.txt:
4451     Moved to libraries/pyprojection.
4452    
4453     * extensions/ pyprojection, pyshapelib, shapelib, thuban: Removed.
4454    
4455     * extensions: Removed.
4456    
4457 bh 1606 2003-08-19 Bernhard Herzog <[email protected]>
4458    
4459 bh 1609 * test/test_viewport.py (ViewPortTest): We don't use the
4460     facilities of FileTestMixin so don't derive from it.
4461     (TestViewportWithPostGIS): New class with tests for using a
4462     viewport on a map with postgis layers.
4463    
4464     2003-08-19 Bernhard Herzog <[email protected]>
4465    
4466     Add the db connection management to the session.
4467    
4468     * Thuban/Model/session.py (Session.__init__): New instance
4469     variable db_connections
4470     (Session.AddDBConnection, Session.DBConnections)
4471     (Session.HasDBConnections, Session.CanRemoveDBConnection)
4472     (Session.RemoveDBConnection): New methods to manage and query the
4473     db connections managed by the session
4474     (Session.OpenDBShapeStore): New method to open a shapestore from a
4475     db connection
4476    
4477     * Thuban/Model/messages.py (DBCONN_REMOVED, DBCONN_ADDED): New
4478     messages for the db connection handling in the session
4479    
4480     * test/test_postgis_session.py: New. test cases for the session's
4481     db connection handling with postgis connections
4482    
4483     2003-08-19 Bernhard Herzog <[email protected]>
4484    
4485 bh 1606 Add very basic postgis database support and the corresponding test
4486     cases. The test cases require a PostgreSQL + postgis installation
4487     but no existing database. The database will be created
4488     automatically by the test cases
4489    
4490     * test/README: Add note about skipped tests and the requirements
4491     of the postgis tests.
4492    
4493     * Thuban/Model/postgisdb.py: New. Basic postgis database support.
4494    
4495     * test/test_postgis_db.py: New. Test cases for the postgis
4496     support.
4497    
4498     * Thuban/Model/wellknowntext.py: New. Parser for well-known-text
4499     format
4500    
4501     * test/test_wellknowntext.py: New. Test cases for the
4502     wellknowntext parser
4503    
4504     * test/postgissupport.py: New. Support module for tests involving
4505     a postgis database.
4506    
4507     * test/support.py (execute_as_testsuite): Shut down the postmaster
4508     if it's still running after the tests
4509    
4510     * Thuban/Model/data.py (RAW_WKT): New constant for raw data in
4511     well known text format
4512    
4513 jan 1604 2003-08-19 Jan-Oliver Wagner <[email protected]>
4514    
4515     * Examples/simple_extensions/hello_world.py: New. Raises a Hello World
4516     message dialog.
4517    
4518 bh 1600 2003-08-18 Bernhard Herzog <[email protected]>
4519    
4520 bh 1602 * test/support.py (ThubanTestResult.printErrors): Indent the
4521     reason for the skips in the output to make it a bit more readable.
4522     (execute_as_testsuite): New helper function to run a test suite
4523     and print some more information.
4524     (run_tests): Use execute_as_testsuite to run the tests
4525    
4526     * test/runtests.py (main): Use execute_as_testsuite to run the
4527     tests
4528    
4529     2003-08-18 Bernhard Herzog <[email protected]>
4530    
4531 bh 1600 Fix some bugs in Thuban and the test suite that were uncovered by
4532     changes introduced in Python 2.3:
4533    
4534     * Thuban/Model/table.py (DBFTable.__init__): Make sure the
4535     filename is an absolute name
4536    
4537     * Thuban/Model/layer.py (RasterLayer.__init__): Make sure the
4538     filename is an absolute name
4539    
4540     * test/test_save.py (SaveSessionTest.testRasterLayer): Use a
4541     unique filename to save to and use the correct relative filename
4542     in the expected output.
4543     (SaveSessionTest.test_dbf_table): Use the correct relative
4544     filename in the expected output.
4545    
4546     * test/test_layer.py (TestLayer.test_raster_layer): Update the
4547     test to check whether the filename is absolute.
4548    
4549 jan 1596 2003-08-18 Jan-Oliver Wagner <[email protected]>
4550    
4551     * Thuban/UI/about.py (About.__init__): Added Silke Reimer.
4552    
4553 bh 1586 2003-08-15 Bernhard Herzog <[email protected]>
4554    
4555 bh 1594 Change the way shapes are returned by a shape store. The
4556     ShapesInRegion method returns an iterator over actual shape
4557     objects instead of a list of shape ids.
4558    
4559     * Thuban/Model/data.py (ShapefileShape.ShapeID): New. Return shape
4560     id.
4561     (ShapefileStore.ShapesInRegion): Return an iterator over the
4562     shapes which yields shape objects instead of returning a list of
4563     shape ids
4564     (ShapefileStore.AllShapes): New. Return an iterator over all
4565     shapes in the shape store
4566     (DerivedShapeStore.AllShapes): New. Like in ShapefileStore
4567    
4568     * Thuban/Model/layer.py (Layer.ShapesInRegion): Update
4569     doc-string.
4570    
4571     * Thuban/UI/baserenderer.py
4572     (BaseRenderer.layer_ids, BaseRenderer.layer_shapes): Rename to
4573     layer_shapes and make it return an iterator containg shapes
4574     instead of a list of ids.
4575     (BaseRenderer.draw_shape_layer): Update doc-string; Adapt to
4576     layer_shapes() change
4577    
4578     * Thuban/UI/renderer.py (ScreenRenderer.layer_ids)
4579     (ScreenRenderer.layer_shapes): Rename as in BaseRenderer
4580    
4581     * Thuban/UI/viewport.py (ViewPort._find_shape_in_layer): Adapt to
4582     changes in the ShapesInRegion return value.
4583     (ViewPort._get_hit_tester): Remove commented out code
4584    
4585     * test/mockgeo.py (SimpleShapeStore.ShapesInRegion): Adapt to the
4586     new return value.
4587     (SimpleShapeStore.AllShapes): New. Implement this method too.
4588    
4589     * test/test_layer.py (TestLayer.test_arc_layer)
4590     (TestLayer.test_polygon_layer, TestLayer.test_point_layer)
4591     (TestLayer.test_point_layer_with_projection)
4592     (TestLayer.test_derived_store): Adapt to changes in the
4593     ShapesInRegion return value.
4594    
4595     * test/test_shapefilestore.py
4596     (TestShapefileStoreArc.test_shapes_in_region)
4597     (TestShapefileStorePolygon.test_shapes_in_region)
4598     (TestShapefileStorePoint.test_shapes_in_region): Adapt to changes
4599     in the ShapesInRegion return value.
4600     (TestShapefileStorePoint.test_all_shapes)
4601     (TestShapefileStoreArc.test_shape_shapeid): New tests for the new
4602     methods
4603    
4604     * test/test_derivedshapestore.py
4605     (TestDerivedShapeStore.test_shapes_in_region): Adapt to changes in
4606     the ShapesInRegion return value.
4607     (TestDerivedShapeStore.test_all_shapes)
4608     (TestDerivedShapeStore.test_shape_shapeid): New tests for the new
4609     methods
4610    
4611     2003-08-15 Bernhard Herzog <[email protected]>
4612    
4613 bh 1592 Make the renderers deal correctly with raw vs. python level
4614     representation of shape geometries
4615    
4616     * Thuban/UI/baserenderer.py (BaseRenderer.low_level_renderer):
4617     Return a flag useraw in addition to the callable and the parameter
4618     to indicate whether the callable can deal with the raw shape data
4619     or uses the higher level python lists of coordinates. The callable
4620     now should accept either the raw data or the return value of the
4621     shape's Points() method.
4622     (BaseRenderer.draw_shape_layer): Adapt to the low_level_renderer
4623     change
4624     (BaseRenderer.projected_points): Instead of the shape id use the
4625     points list as parameter.
4626     (BaseRenderer.draw_polygon_shape, BaseRenderer.draw_arc_shape)
4627     (BaseRenderer.draw_point_shape): Adapt to projected_points()
4628     change and accept the points list as parameter instead of the
4629     shape id.
4630    
4631     * Thuban/UI/renderer.py (MapRenderer.low_level_renderer): Return
4632     the useraw flag as required by the BaseRenderer
4633     (ScreenRenderer.draw_shape_layer): Adapt to low-level renderer
4634     changes.
4635    
4636     * test/test_baserenderer.py
4637     (TestBaseRenderer.test_point_with_classification): New test for
4638     rendering a map with classifications.
4639    
4640     2003-08-15 Bernhard Herzog <[email protected]>
4641    
4642 bh 1590 * Thuban/UI/viewport.py (ViewPort.find_shape_at)
4643     (ViewPort._find_shape_in_layer, ViewPort._find_shape_in_layer)
4644     (ViewPort._get_hit_tester, ViewPort.projected_points)
4645     (ViewPort._hit_point, ViewPort._hit_arc, ViewPort._hit_polygon)
4646     (ViewPort._find_label_at): Split the find_shape_at method into
4647     several new methods and use the functions in the hit-test module.
4648    
4649     * Thuban/UI/hittest.py: New module with Python-level hit-testing
4650     functions
4651    
4652     * test/test_hittest.py: New. Test for the new hittest module
4653    
4654     2003-08-15 Bernhard Herzog <[email protected]>
4655    
4656 bh 1588 * Thuban/Model/layer.py (Layer.ShapesInRegion): Apply the layer
4657     projection to all corners of the bounding box to get a better
4658     approximation of the projected bounding box
4659    
4660     * test/test_layer.py (TestLayer.test_point_layer_with_projection):
4661     New. Test coordinate handling of a layer with a projection.
4662     Catches the bug fixed in Layer.ShapesInRegion
4663    
4664     2003-08-15 Bernhard Herzog <[email protected]>
4665    
4666 bh 1586 Move some of the mock objects in test_baserenderer into their own
4667     module so they can easily be used from other tests
4668    
4669     * test/mockgeo.py: New test helper module with some mock objects
4670     for geometry related things like shapes, shapestores and
4671     projections.
4672    
4673     * test/test_mockgeo.py: New. Tests for the new helper module
4674    
4675     * test/test_baserenderer.py: Some of the mock-objects are in
4676     mockgeo now.
4677    
4678 jan 1584 2003-08-12 Jan-Oliver Wagner <[email protected]>
4679    
4680     * Thuban/UI/about.py (About.__init__): Added Björn Broscheit.
4681    
4682 bh 1580 2003-08-12 Bernhard Herzog <[email protected]>
4683    
4684 bh 1582 * po/de.po: New. German translations by Bjoern Broscheit
4685    
4686     2003-08-12 Bernhard Herzog <[email protected]>
4687    
4688 bh 1580 * Thuban/UI/projdialog.py (UnknownProjPanel._DoLayout): Translated
4689     strings have to be one string literal.
4690    
4691 bh 1573 2003-08-11 Bernhard Herzog <[email protected]>
4692    
4693 bh 1578 * test/support.py (FloatComparisonMixin.assertPointListEquals):
4694     New. This method was used in various derived classes, but it's
4695     better to have it here.
4696    
4697     * test/test_shapefilestore.py
4698     (ShapefileStoreTests.assertPointListEquals): Removed. It's now in
4699     FloatComparisonMixin
4700    
4701     * test/test_layer.py (TestLayer.assertPointListEquals): Removed.
4702     It's now in FloatComparisonMixin
4703    
4704     * test/test_derivedshapestore.py
4705     (TestDerivedShapeStore.assertPointListEquals): Removed. It's now
4706     in FloatComparisonMixin
4707    
4708     2003-08-11 Bernhard Herzog <[email protected]>
4709    
4710 bh 1573 * Thuban/UI/join.py (JoinDialog.OnJoin): Add missing space to
4711     error message
4712    
4713 jan 1569 2003-08-08 Jan-Oliver Wagner <[email protected]>
4714    
4715 jan 1571 * Doc/manual/thuban-manual.xml: Now use authorgroup. Added revhistory
4716     with version number.
4717     Changed title to reflect version number of Thuban.
4718    
4719     2003-08-08 Jan-Oliver Wagner <[email protected]>
4720    
4721 jan 1569 * Thuban/UI/about.py (About.__init__): Reworked the hall of fame. Now
4722     the list corresponds to the "About" web page.
4723    
4724 bh 1567 2003-08-08 Bernhard Herzog <[email protected]>
4725    
4726     * Thuban/UI/projdialog.py (UTMProposeZoneDialog.dialogLayout):
4727     Make sure translated strings are recognized as one string literal.
4728    
4729     * Thuban/UI/proj4dialog.py (UTMProposeZoneDialog.dialogLayout):
4730     Make sure translated strings are recognized as one string literal.
4731    
4732     * Thuban/UI/classgen.py (ClassGenDialog.OnOK): Make sure
4733     translated strings are recognized as one string literal.
4734    
4735     * Thuban/UI/application.py (ThubanApplication.OpenSession): Make
4736     sure translated strings are recognized as one string literal.
4737    
4738 bh 1556 2003-08-07 Bernhard Herzog <[email protected]>
4739    
4740 bh 1565 * Thuban/Model/data.py (DerivedShapeStore.RawShapeFormat): New.
4741     Simply delegates to the original shapestore.
4742    
4743     * test/test_derivedshapestore.py
4744     (TestDerivedShapeStore.test_raw_format): New. Test case for
4745     DerivedShapeStore.RawShapeFormat
4746    
4747     2003-08-07 Bernhard Herzog <[email protected]>
4748    
4749 bh 1561 Add raw data interface to shape objects.
4750    
4751     * Thuban/Model/data.py (ShapefileShape, Shape): Rname the shape
4752     class to ShapefileShape which now holds shapefile specific
4753     information.
4754     (ShapefileShape.compute_bbox): Simplified to not cache any
4755     information. The way this method is used that shouldn't matter
4756     performance wise.
4757     (ShapefileShape.RawData): New. Return the shapeid which is the raw
4758     data format for shapes from shapefiles.
4759     (ShapefileStore.RawShapeFormat): New. Return the raw datatype used
4760     in the shape objects returned by a shapestore. For a
4761     ShapefileStore this is always RAW_SHAPEFILE.
4762     (RAW_PYTHON, RAW_SHAPEFILE): Constants for the RawShapeFormat
4763     method.
4764    
4765     * test/test_shapefilestore.py
4766     (TestShapefileStore.test_raw_format): New test to test the raw
4767     format feature of shapes.
4768    
4769 bh 1560 * Thuban/Model/layer.py: Remove the unused import of Shape from
4770     data. It was only there for interface compatibility but it's not
4771 bh 1561 used inside of Thuban and the generic Shape class has gone away.
4772 bh 1560
4773 bh 1563 * Thuban/UI/renderer.py (MapRenderer.low_level_renderer): Check
4774     the raw data format and only use an optimized version of its a
4775     shapefile.
4776    
4777 bh 1561 2003-08-07 Bernhard Herzog <[email protected]>
4778    
4779 bh 1559 * test/test_baserenderer.py (SimpleShape): Shape class for the
4780     tests.
4781     (SimpleShapeStore.Shape): Use SimpleShape instead of
4782     Thuban.Model.data.Shape to make the tests independed of the coming
4783     changes.
4784    
4785     2003-08-07 Bernhard Herzog <[email protected]>
4786    
4787 bh 1556 * test/support.py (SkipTest, ThubanTestResult, ThubanTestRunner)
4788     (ThubanTestProgram): New classes that extend the respective
4789     classes from unittest. These new version support skipping tests
4790     under certain expected conditions. In the Thuban test suite we
4791     uses this for tests that require the optional gdal support.
4792     (run_tests): Use ThubanTestProgram instead of the unittest.main()
4793    
4794     * test/runtests.py (main): Use the new ThubanTestRunner instead of
4795     the normal one from unittest
4796    
4797     * test/test_layer.py (TestLayer.test_raster_layer): If this test
4798     is not run because gdal support isn't available report this to the
4799     runner.
4800    
4801     * test/test_baserenderer.py
4802     (TestBaseRenderer.test_raster_no_projection): Do not run this test
4803     if gdal support isn't available and report this to the runner.
4804    
4805 bh 1553 2003-08-06 Bernhard Herzog <[email protected]>
4806    
4807     Rearrange the renderers a bit, partly in preparation for changes
4808     required for the postgis merge, partly to make it more testable.
4809     Also make the representation of coordinates in Shapes more
4810     consistent.
4811    
4812     * Thuban/UI/renderer.py (MapRenderer): Most of the code/methods in
4813     this class is now in BaseRenderer. This class is now practically
4814     only a specialization of BaseRenderer for rendering to an actual
4815     wx DC.
4816     (ScreenRenderer.draw_shape_layer): Use self.low_level_renderer()
4817     to get the shapetype specific rendering functions.
4818    
4819     * Thuban/UI/baserenderer.py: New file with the basic rendering
4820     logic. The code in this file is completely independend of wx.
4821     (BaseRenderer): Class with the basic rendering logic
4822    
4823     * test/test_baserenderer.py: New. Test cases for BaseRenderer
4824    
4825     * Thuban/UI/view.py (MapCanvas.__init__): New instance variable
4826     error_on_redraw to guard agains endless loops and stack overflows
4827     when there's a bug in the rendering code that raises exceptions.
4828     (MapCanvas.OnIdle, MapCanvas._do_redraw): Split the actual
4829     rendering into a separate method _do_redraw so that error handling
4830     is a bit easier. When an exception occurs, set error_on_redraw to
4831     true. When it's true on entry to OnIdle do nothing and return
4832     immediately.
4833    
4834     * Thuban/Model/data.py (ShapefileStore.Shape): For consistency, a
4835     Shape object will always have the coordinates as a list of list of
4836     coordinate pairs (tuples).
4837     (Shape.compute_bbox): Adapt to new representation.
4838    
4839     * Thuban/UI/viewport.py (ViewPort.find_shape_at)
4840     (ViewPort.LabelShapeAt): Adapt to new coordinate representation in
4841     Shape objects.
4842    
4843     * test/test_shapefilestore.py
4844     (ShapefileStoreTests.assertFloatTuplesEqual)
4845     (ShapefileStoreTests.assertPointListEquals): Rename to
4846     assertPointListEquals and change purpose to checking equality of
4847     the lists returned by Shape.Points().
4848     (TestShapefileStoreArc.test_shape)
4849     (TestShapefileStorePolygon.test_shape)
4850     (TestShapefileStorePoint.test_shape): Use the new
4851     assertPointListEquals instead of assertFloatTuplesEqual
4852    
4853     * test/test_layer.py (TestLayer.assertFloatTuplesEqual)
4854     (TestLayer.assertPointListEquals): Rename to assertPointListEquals
4855     and change purpose to checking equality of the lists returned by
4856     Shape.Points().
4857     (TestLayer.test_arc_layer, TestLayer.test_arc_layer)
4858     (TestLayer.test_polygon_layer, TestLayer.test_point_layer)
4859     (TestLayer.test_derived_store): Use the new assertPointListEquals
4860     instead of assertFloatTuplesEqual
4861    
4862     * test/test_derivedshapestore.py
4863     (TestDerivedShapeStore.assertFloatTuplesEqual)
4864     (TestDerivedShapeStore.assertPointListEquals): Rename to
4865     assertPointListEquals and change purpose to checking equality of
4866     the lists returned by Shape.Points().
4867     (TestDerivedShapeStore.test_shape): Use the new
4868     assertPointListEquals instead of assertFloatTuplesEqual
4869    
4870 jan 1550 2003-08-06 Jan-Oliver Wagner <[email protected]>
4871    
4872     * Thuban/UI/projdialog.py (UTMPanel._OnPropose): Added test for
4873     a bounding box. A dialog is raised in case, no bounding box
4874     is found. This fixes bug #2043:
4875     https://intevation.de/rt/webrt?serial_num=2043
4876    
4877 bh 1548 2003-08-05 Bernhard Herzog <[email protected]>
4878    
4879     * Thuban/Model/color.py (Color.__repr__): Make the repr of a color
4880     object look like a Color instantiation. Formerly it looked like a
4881     tuple.
4882    
4883     * test/test_color.py (TestColor.test_repr)
4884     (TestColor.test_equality, TestColor.test_inequality): New. test
4885     some more apects of the Color class
4886     (TestTransparent.test_repr, TestTransparent.test_hex)
4887     (TestTransparent.test_equality): New. Test cases for the
4888     Transparent object.
4889    
4890 jan 1545 2003-08-04 Jan-Oliver Wagner <[email protected]>
4891    
4892     * Doc/manual/thuban-manual.xml: a number of small improvements.
4893     The resulting file is the version submitted for GREAT-ER II.
4894    
4895 bh 1540 2003-08-01 Bernhard Herzog <[email protected]>
4896    
4897 bh 1543 * Thuban/UI/resource.py, Thuban/UI/projdialog.py,
4898     Thuban/UI/join.py, Thuban/UI/classgen.py, Thuban/UI/about.py,
4899     Thuban/Model/resource.py: Insert cvs keywords and doc-strings.
4900    
4901     * Thuban/UI/common.py: Insert cvs keywords and doc-strings.
4902     (Color2wxColour, wxColour2Color, ThubanBeginBusyCursor)
4903     (ThubanEndBusyCursor): Add doc-strings
4904    
4905     2003-08-01 Bernhard Herzog <[email protected]>
4906    
4907 bh 1540 First step towards PostGIS integration. More abstraction by movin
4908     more code from the layer to the shapestore. More methods of the
4909     layer are now simply delegated to the equivalent method of the
4910     shapestore. The SHAPETYPE_* constants are now in data not in
4911     layer.
4912    
4913     * Thuban/Model/data.py (SHAPETYPE_POLYGON, SHAPETYPE_ARC)
4914     (SHAPETYPE_POINT, Shape): Move these constants and classes from
4915     layer.py to data.py
4916     (ShapefileStore.__init__): More Initialization for the new methods
4917     and functionality.
4918     (ShapefileStore.ShapeType, ShapefileStore.NumShapes)
4919     (ShapefileStore.BoundingBox, ShapefileStore.ShapesInRegion)
4920     (ShapefileStore.Shape): New methods that were formerly implemented
4921     in the layer.
4922     (DerivedShapeStore.Shape, DerivedShapeStore.ShapesInRegion)
4923     (DerivedShapeStore.ShapeType, DerivedShapeStore.NumShapes)
4924     (DerivedShapeStore.BoundingBox): New. DerivedShapeStore
4925     equivalents of the new shape methods. These versions are simply
4926     delegated to the original shapstore.
4927    
4928     * Thuban/Model/layer.py (SHAPETYPE_POLYGON, SHAPETYPE_ARC)
4929     (SHAPETYPE_POINT, Shape): Removed. They're now in data.py
4930     (Layer.SetShapeStore): Removed the initializatin of instance
4931     variables that were needed for the stuff that's now in
4932     ShapefileStore
4933     (Layer.BoundingBox, Layer.NumShapes, Layer.ShapeType)
4934     (Layer.Shape, Layer.ShapesInRegion): Simply delegate to the
4935     shapestore.
4936    
4937     * Thuban/UI/classifier.py, Thuban/UI/renderer.py,
4938     Thuban/UI/viewport.py: Import the SHAPETYPE_* constants from data
4939     instead of layer.
4940    
4941     * test/test_shapefilestore.py: New. Tests for ShapefileStore.
4942    
4943     * test/test_derivedshapestore.py: New. Tests for DerivedShapeStore.
4944    
4945     * test/test_layer.py: Import the SHAPETYPE_* constants from data
4946     instead of layer.
4947     (TestLayer.test_derived_store): Remove the test for the exception
4948     when instantiating the DerivedShapeStore with an incompatible
4949     table which is now in test_derivedshapestore.py. Add some more
4950     tests of the layer methods to determine whether they work for a
4951     DerivedShapeStore as well.
4952    
4953 jonathan 1534 2003-07-31 Jonathan Coles <[email protected]>
4954    
4955     * Doc/manual/thuban-manual.xml: Fix the list of required packages
4956     by just listing the name and where they can be found.
4957    
4958 frank 1532 2003-07-31 Frank Koormann <[email protected]>
4959    
4960     * Doc/manual/thuban-manual.xml:
4961     Changed the screenshot elements to figure.
4962     Changed some variablelist elements to itemizedlist.
4963     Added section on GDAL formats.
4964    
4965 jonathan 1531 2003-07-31 Jonathan Coles <[email protected]>
4966    
4967     * Doc/manual/thuban-manual.xml: Added a few sentences about
4968     the Fix Border Color option when generating classes.
4969    
4970 jonathan 1529 2003-07-30 Jonathan Coles <[email protected]>
4971    
4972     * Thuban/Model/classgen.py: Add docstrings. Rename specific
4973     Ramp instances to use lower_case_style.
4974    
4975     * Thuban/UI/classgen.py: Use renamed Ramp instances.
4976    
4977     * Thuban/UI/classifier.py: Add docstrings.
4978    
4979     * Thuban/UI/dock.py: Add docstrings.
4980    
4981     * test/test_classgen.py: Use renamed Ramp instances.
4982    
4983 bh 1522 2003-07-30 Bernhard Herzog <[email protected]>
4984    
4985 bh 1524 * Thuban/Lib/connector.py (QueueingPublisher): Removed. This class
4986     was never used in Thuban.
4987    
4988     2003-07-30 Bernhard Herzog <[email protected]>
4989    
4990 bh 1522 * Thuban/UI/join.py (JoinDialog.__init__): Use the table's Title()
4991     method directly instead of going through the transient_table
4992     method. This faster because transient_table may force the copy of
4993     a DBF file into the transient database and setting a table's title
4994     doesnm't affect the title of the associated transient table, so
4995     this fixes RT #2042
4996    
4997     * Thuban/UI/main.py (__version__): Don't import the already
4998     removed show_exception_dialog.
4999    
5000 jonathan 1517 2003-07-29 Jonathan Coles <[email protected]>
5001    
5002 jonathan 1519 * Thuban/UI/application.py (ThubanApplication.ShowExceptionDialog):
5003     Put back this method and remove the equivalent function since we
5004     are setting the exception hook from within this class (OnInit).
5005    
5006     2003-07-29 Jonathan Coles <[email protected]>
5007    
5008 jonathan 1517 * Doc/manual/images/5_2_custom_ramp.png,
5009     Doc/manual/images/5_2_quantiles.png,
5010     Doc/manual/images/5_2_uniform_dist.png,
5011     Doc/manual/images/5_2_unique_values.png,
5012     Doc/manual/images/8_int_error.png: New screen shots.
5013    
5014     * Doc/manual/thuban-manual.xml: Fixed typos and wording, clarified
5015     some points, and added more screen shots.
5016    
5017 bh 1512 2003-07-29 Bernhard Herzog <[email protected]>
5018    
5019 bh 1516 * Thuban/Model/data.py: Remove the now unused import of warnings
5020    
5021     2003-07-29 Bernhard Herzog <[email protected]>
5022    
5023 bh 1514 * Thuban/Model/data.py (SimpleStore): Removed. This class has been
5024     deprecated since before the 0.8 release and isn't used in Thuban
5025     itself anymore.
5026    
5027 bh 1512 * Thuban/Model/transientdb.py: Remove some unnecessary imports
5028    
5029 jonathan 1503 2003-07-29 Jonathan Coles <[email protected]>
5030 jonathan 1506
5031     * Thuban/UI/application.py (ThubanApplication.OnInit): set the
5032     python exception hook here so that we are sure to catch any
5033     Thuban exception that happen during initialization.
5034    
5035     * Thuban/UI/main.py (main): Don't set the exception hook here,
5036     it will get set in ThubanApplication.OnInit.
5037    
5038     2003-07-29 Jonathan Coles <[email protected]>
5039 jonathan 1503
5040     * Thuban/UI/application.py (ThubanApplication.ShowExceptionDialog):
5041     Removed and called it show_exception_dialog() so that the exception
5042     handler can be set before the class is created.
5043    
5044     * Thuban/UI/main.py (main): Install the exception handler before
5045     a ThubanApplication is created.
5046    
5047 bh 1500 2003-07-29 Bernhard Herzog <[email protected]>
5048    
5049     * po/it.po: New. Italian translation by Maurizio Napolitano
5050    
5051     * po/ru.po: New. Russian translation by Alex Shevlakov
5052    
5053 frank 1497 2003-07-29 Frank Koormann <[email protected]>
5054    
5055 frank 1508 * Doc/manual/thuban-manual.xml: Extended section on supported
5056     projections.
5057    
5058     2003-07-29 Frank Koormann <[email protected]>
5059    
5060 frank 1497 * Doc/manual/thuban-manual.xml: gaspell-checked.
5061    
5062 jonathan 1493 2003-07-29 Jonathan Coles <[email protected]>
5063    
5064 jonathan 1495 * Doc/manual/images/3_5_legend.png: Added border to improve look
5065     on white background.
5066    
5067     2003-07-29 Jonathan Coles <[email protected]>
5068    
5069 jonathan 1493 * Doc/manual/thuban-manual.xml: Fixed grammar and typos. Added
5070     descriptions for the legend toolbar.
5071    
5072     * Doc/manual/images/4_2_raster_layer_properties.png: Removed
5073     cursor from dialog box.
5074    
5075     2003-07-28 Jonathan Coles <[email protected]>
5076    
5077     * Doc/manual/thuban-manual.xml: More screenshots and more chapters.
5078    
5079     * Doc/manual/images/2_4_session_tree.png,
5080     Doc/manual/images/3_5_legend.png, Doc/manual/images/3_rename_map.png,
5081     Doc/manual/images/4_2_layer_properties.png,
5082     Doc/manual/images/4_2_raster_layer_properties.png,
5083     Doc/manual/images/5_3_genclass.png,
5084     Doc/manual/images/5_classification.png,
5085     Doc/manual/images/6_projection.png,
5086     Doc/manual/images/7_1_table_view.png,
5087     Doc/manual/images/7_2_5_join.png: New screenshots.
5088    
5089     2003-07-24 Jonathan Coles <[email protected]>
5090    
5091     * Doc/manual/thuban-manual.xml: Chapter on Projection Management.
5092    
5093     2003-07-24 Jonathan Coles <[email protected]>
5094    
5095     * Doc/manual/thuban-manual.xml: Added EPS images and wrote
5096     chapter on Layer Management.
5097    
5098     * Doc/manual/Makefile: New. Makefile to generate all formats for the
5099     manual and images.
5100    
5101 bh 1483 2003-07-24 Bernhard Herzog <[email protected]>
5102    
5103     * Thuban/Model/range.py, Thuban/version.py: Remove the #! line as
5104     it annoys lintian which warns about these files not being
5105 jan 1767 executable. The #! isn't necessary here since if you absolutely
5106 bh 1483 must execute them you can always say "python <filename>".
5107    
5108     * Thuban/UI/renderer.py (ScreenRenderer.draw_shape_layer): Remove
5109     superfluous code to set brush and pen for point shapes
5110    
5111     * Thuban/UI/viewport.py: Remove commented out code that wouldn't
5112     belong in viewport anyway
5113    
5114 frank 1479 2003-07-24 Frank Koormann <[email protected]>
5115    
5116     * Doc/manual/thuban-manual.xml: Added section on table management.
5117    
5118 bh 1477 2003-07-24 Bernhard Herzog <[email protected]>
5119    
5120     * test/runtests.py (main): Recognize the long "verbose" option
5121     correctly.
5122    
5123 jonathan 1470 2003-07-22 Jonathan Coles <[email protected]>
5124    
5125     * Doc/manual/thuban-manual.xml: Continue to write first revision
5126     of the manual.
5127    
5128     * Thuban/UI/renderer.py (MapRenderer.render_map): Wrap method
5129     with Begin/EndDrawing() calls to ensure we aren't doing to
5130     many updates to the dc during rendering.
5131     (ScreenRenderer.draw_shape_layer): self.draw_point_shape takes
5132     a pen and brush argument so they need to be passed to the function.
5133    
5134     * Thuban/UI/viewport.py (ViewPort.calc_min_max_scales): New.
5135     Calculates the minimum and maximum scale values. Factored out
5136     of set_view_transform so that it could be used to zoom all the
5137     way into a single point.
5138     (ViewPort.set_view_transform): Call calc_min_max_scales().
5139     (ViewPort.FitSelectedToWindow): Zoom to the maximum scale
5140     if only a single point is selected.
5141    
5142     * Doc/manual/images/1_2_legend_close.png,
5143     Doc/manual/images/1_2_legend_dock.png,
5144     Doc/manual/images/1_2_mainwindow.png,
5145     Doc/manual/images/1_2_mainwindow.ps,
5146     Doc/manual/images/1_2_mainwindow.sk,
5147     Doc/manual/images/3_2_fullextent.png,
5148     Doc/manual/images/3_2_fulllayerextent.png,
5149     Doc/manual/images/3_2_fullshapeextent.png,
5150     Doc/manual/images/3_2_pan.png,
5151     Doc/manual/images/3_2_zoomin.png,
5152     Doc/manual/images/3_2_zoomout.png,
5153     Doc/manual/images/3_3_identify.png,
5154     Doc/manual/images/3_3_label.png,
5155     Doc/manual/images/3_5_invisible.png,
5156     Doc/manual/images/3_5_movedown.png,
5157     Doc/manual/images/3_5_moveup.png,
5158     Doc/manual/images/3_5_props.png,
5159     Doc/manual/images/3_5_tobottom.png,
5160     Doc/manual/images/3_5_totop.png,
5161     Doc/manual/images/3_5_visible.png: New. Images for the documentation.
5162    
5163 bh 1451 2003-07-18 Bernhard Herzog <[email protected]>
5164    
5165 bh 1465 * Thuban/UI/messages.py (MAP_REPLACED): New message.
5166    
5167     * Thuban/UI/viewport.py (ViewPort.SetMap): Issue MAP_REPLACED
5168     after the new map has been assigned
5169    
5170     * Thuban/UI/mainwindow.py (MainWindow.delegated_messages):
5171     Delegate MAP_REPLACED to the canvas too
5172     (MainWindow.prepare_new_session): Removed. Thanks to the new
5173     MAP_REPLACED message it's no longer needed
5174     (MainWindow.OpenSession, MainWindow.NewSession):
5175     prepare_new_session has been removed.
5176    
5177     * Thuban/UI/classifier.py (Classifier.__init__): Subscribe to
5178     MAP_REPLACED so that we can close the dialog if a new map is set.
5179     (Classifier.unsubscribe_messages): Unsubscribe from MAP_REPLACED
5180     (Classifier.map_replaced): Handle MAP_REPLACED by closing the
5181     dialog
5182    
5183     * test/test_viewport.py (SimpleViewPortTest)
5184     (SimpleViewPortTest.test_default_size): Add doc-strings
5185     (ViewPortTest.setUp): Bind map to self.map so we can use it in
5186     tests. Subscribe to MAP_REPLACED messages too.
5187     (ViewPortTest.tearDown): No need to explicitly unsubscribe
5188     (ViewPortTest.test_set_map): New test for the SetMap method.
5189    
5190     2003-07-18 Bernhard Herzog <[email protected]>
5191    
5192 bh 1463 * test/test_viewport.py (SimpleViewPortTest.test_default_size):
5193     Move this test from ViewPortTest.setUp to this new separate test
5194     case. setUp is not the place for the actual tests.
5195     (ViewPortTest.test_inital_settings, ViewPortTest.setUp): Move some
5196     more of the test from setUp to the new test test_inital_settings.
5197     (ViewPortTest.test_win_to_proj, ViewPortTest.test_proj_to_win)
5198     (ViewPortTest.test_proj_conv): Split test_proj_conv into
5199     test_win_to_proj and test_proj_to_win and make the tests easier to
5200     understand
5201     (ViewPortTest.testFitRectToWindow, ViewPortTest.testZoomFactor)
5202     (ViewPortTest.testZoomOutToRect, ViewPortTest.testTranslate)
5203     (ViewPortTest.test_unprojected_rect_around_point)
5204     (ViewPortTest.test_find_shape_at, ViewPortTest.testTools):
5205     Reformat to increase readability.
5206    
5207     2003-07-18 Bernhard Herzog <[email protected]>
5208    
5209 bh 1461 * Thuban/UI/view.py (MapCanvas.OnLeftDown): Capture the mouse.
5210    
5211     2003-07-18 Bernhard Herzog <[email protected]>
5212    
5213 bh 1459 * test/runtests.py: The test suite can now be run without an X
5214     connection. To make sure this remains true, remove the DISPLAY
5215     environment variable so that an error occurs if the wxGTK is
5216     imported accidentally
5217    
5218     2003-07-18 Bernhard Herzog <[email protected]>
5219    
5220 bh 1457 * Thuban/UI/viewport.py: Remove unused imports
5221    
5222     * Thuban/UI/view.py: Remove unused imports
5223    
5224     2003-07-18 Bernhard Herzog <[email protected]>
5225    
5226 bh 1455 * test/test_export.py Remove unused imports. The OutputTransform
5227     function is now in viewport.py and is called output_transform
5228     (TestScalebar.test_output_transform)
5229     (TestScalebar.test_OutputTransform): Renamed to
5230     test_output_transform and updated to use output_transform instead
5231     of OutputTransform
5232    
5233     * Thuban/UI/view.py (OutputTransform): Moved to viewport.py and
5234     renamed.
5235     (MapCanvas.Export, MapPrintout.draw_on_dc): OutputTransform was
5236     renamed to output_transform
5237    
5238     * Thuban/UI/viewport.py (OutputTransform, output_transform):
5239     Rename to output_transform
5240    
5241     2003-07-18 Bernhard Herzog <[email protected]>
5242    
5243 bh 1453 * Thuban/Model/layer.py (Layer.__init__): Rename
5244     classificationField to classificatin_column and init it here so
5245     that it can be used in SetClassificationColumn
5246     (Layer.GetClassificationColumn, Layer.GetClassificationField):
5247     Rename to GetClassificationColumn.
5248     (Layer.SetClassificationColumn, Layer.SetClassificationField):
5249     Rename to SetClassificationColumn and issue a LAYER_CHANGED
5250     message if the column changes.
5251     (Layer._classification_changed, Layer.ClassChanged): Rename to
5252     _classification_changed. Update the callers.
5253     (Layer.SetShapeStore): Further field->column renames.
5254    
5255     * Thuban/Model/load.py (SessionLoader.start_classification)
5256     (SessionLoader.start_clpoint): Updates because of
5257     field->column method name changes in the Layer class
5258    
5259     * Thuban/Model/save.py (SessionSaver.write_classification): Updates
5260     because of field->column method name changes in the Layer class
5261    
5262     * Thuban/UI/classifier.py (Classifier.__init__)
5263     (Classifier._OnTry, Classifier._OnRevert): Updates because of
5264     field->column method name changes in the Layer class
5265    
5266     * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Updates
5267     because of field->column method name changes in the Layer class
5268    
5269     * Thuban/UI/viewport.py (ViewPort.find_shape_at): Updates because
5270     of field->column method name changes in the Layer class
5271    
5272     * test/test_save.py (SaveSessionTest.testClassifiedLayer)
5273     (SaveSessionTest.testClassifiedLayer): Update because of
5274     field->column method name changes in the Layer class
5275    
5276     * test/test_layer.py (SetShapeStoreTests.setUp)
5277     (SetShapeStoreTests.test_sanity): Update because of field->column
5278     method name changes in the Layer class
5279     (TestLayerModification.setUp): Subscribe to LAYER_CHANGED as well
5280     (TestLayerModification.test_sanity)
5281     (TestLayerModification.test_initial_settings): remove unsued code
5282     and rename to test_sanity.
5283     (TestLayerModification.test_set_classification): New test for
5284     SetClassification and SetClassificationField.
5285    
5286     2003-07-18 Bernhard Herzog <[email protected]>
5287    
5288 bh 1451 * test/test_classgen.py (TestFixedRamp.test): Extend test to check
5289     the non-fixed values as well. The old test would have accepted a
5290     fixed ramp that only returnes the fixed properties
5291    
5292 jonathan 1449 2003-07-17 Jonathan Coles <[email protected]>
5293    
5294     * Doc/manual/mainwindow.png, Doc/manual/mainwindow.xcf: Screen
5295     shots for the manual. The XCF file is the source image and
5296     has additional layers to support changes.
5297    
5298     * Doc/manual/thuban-manual.xml: Wrote an initial Introduction.
5299    
5300     * Thuban/UI/classifier.py (Classifier.__BuildClassification):
5301     Return both the new class and the field name.
5302    
5303     * Thuban/UI/mainwindow.py (MainWindow.ToggleLegend): Don't
5304     fit the map to the window as this changes any zoom level that
5305     the user may have set.
5306    
5307 jonathan 1442 2003-07-16 Jonathan Coles <[email protected]>
5308    
5309     * Thuban/Model/classgen.py (generate_singletons,
5310     generate_uniform_distribution, generate_quantiles): Remove
5311     fixes parameter, but maintain the same functionality by having
5312     the calling function pass a FixedRamp object for the ramp.
5313     (FixedRamp): New. Adapts a ramp to have fixed property values.
5314    
5315     * Thuban/Model/classification.py: Use new CLASS_CHANGED message.
5316     (Classification): Inherit from Publisher.
5317     (Classification.__init__): Remove the layer parameter.
5318     Classifications no longer need to have a parent layer.
5319     (Classification.GetField, Classification.GetFieldType,
5320     Classification.SetFieldInfo): Removed. The field name is stored
5321     in the layer, and the type can be retreived by calling
5322     Layer.GetFieldType().
5323     (Classification._set_layer, Classification.GetLayer): Removed.
5324     Classifications no longer have a parent layer.
5325    
5326     * Thuban/Model/layer.py (Layer.Destroy): Unsubscribe from the
5327     classification.
5328     (Layer.SetShapeStore): Reset the classification first while
5329     we still have the old shape store to work with.
5330     (Layer.GetClassificationField, Layer.SetClassificationField):
5331     New. Method for getting/setting the field to classify on.
5332     (Layer.SetClassification): Simplified now that the layer
5333     simply has to hold a reference to the classification and not
5334     tell the classification who owns it.
5335     Fixes RTbug #2023.
5336    
5337     * Thuban/Model/load.py (SessionLoader.start_classification):
5338     Set the field name on the layer, not the classification.
5339    
5340     * Thuban/Model/messages.py: Add CLASS_CHANGED for when a
5341     classification is modified.
5342    
5343     * Thuban/Model/save.py (SessionSaver.write_classification):
5344     Get the field name and type from the layer.
5345    
5346     * Thuban/Model/table.py (table_to_dbf, table_to_csv): Renamed
5347     parameter records to rows and add docstring. Fixes RTbug #1997.
5348    
5349     * Thuban/UI/classgen.py (ClassGenDialog.OnOK): Use a fixed
5350     ramp when we need to fix certain values of a ramp rather than
5351     using the old fixes parameter. Fixes RTbug #2024.
5352    
5353     * Thuban/UI/classifier.py (ClassGrid.CreateTable): Add fieldType
5354     parameter.
5355     (ClassTable.Reset): Add fieldType parameter and use it, rather
5356     than asking the classification.
5357     (Classifier.__init__): Remember the original class's field
5358     and ask the layer for the field type, rather than the classification.
5359     (Classifier.__SetGridTable): Retrieve the field and field type
5360     for the table because they are not in the classification.
5361     (Classifier._OnTry, Classifier._OnRevert): Set the classification
5362     field on the layer in addition to the classification itself.
5363    
5364     * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Get the
5365     classification field from layer.
5366    
5367     * Thuban/UI/viewport.py (ViewPort.find_shape_at): Get the
5368     classification field from layer. Split up tests and remove
5369     *-imports. Fixes RTbug #1992.
5370    
5371     * test/test_classgen.py (TestFixedRamp): Test for the FixedRamp class.
5372    
5373     * test/test_classification.py
5374     (TestClassification.test_classification): Remove tests for methods
5375     that no longer exist.
5376    
5377     * test/test_layer.py (SetShapeStoreTests.setUp): Classification
5378     __init__ no longer has a field parameter, use SetClassificationField.
5379     (SetShapeStoreTests.test_sanity): Use layer object to get class
5380     field info.
5381    
5382     * test/test_save.py (SaveSessionTest.testClassifiedLayer): Use
5383     SetClassificationField on layer to set class field info.
5384    
5385     * test/test_viewport.py: Renamed from test/test_view.py.
5386    
5387 jan 1424 2003-07-16 Jan-Oliver Wagner <[email protected]>
5388    
5389     * Doc/manual/thuban-manual.xml: Added authors and an initial
5390     coarse structure.
5391    
5392 bh 1418 2003-07-15 Bernhard Herzog <[email protected]>
5393    
5394 bh 1422 * test/support.py (FloatComparisonMixin): This is a mix-in class
5395     and therefore should not be derived from any other class.
5396    
5397     * test/test_range.py (RangeTest): FloatComparisonMixin is a
5398     mix-in, so derive from TestCase as well.
5399    
5400     2003-07-15 Bernhard Herzog <[email protected]>
5401    
5402 bh 1420 * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Rework the
5403     draw_func handling a bit to remove one layer of indirection. This
5404     makes the renderer about 10% faster in the non-classifying case
5405     and the code a bit cleaner
5406     (MapRenderer.draw_point_shape): Add the pen and brush parameters
5407     and set them in the dc. Now the draw_point_shape method and
5408     wxproj's draw_polygon_shape function have basically the same
5409     signature so that both can be directly used as draw_func
5410    
5411     2003-07-15 Bernhard Herzog <[email protected]>
5412    
5413 bh 1418 * Thuban/Model/save.py (SessionSaver.write_classification): Encode
5414     string values (in addition to the labels) as UTF 8
5415    
5416     * Thuban/Model/load.py (SessionLoader.start_clpoint): Decode the
5417     values if the field type is string
5418    
5419     * test/test_save.py (SaveSessionTest.testClassifiedLayer): Test
5420     saving a session with non-ascii string classification values.
5421    
5422     * test/test_load.py (TestClassification.file_contents)
5423     (TestClassification.test): Check for non-ascii values in string
5424     classifications
5425    
5426 jonathan 1416 2003-07-14 Jonathan Coles <[email protected]>
5427    
5428     * test/test_view.py: New. Tests for ViewPort.
5429    
5430 frank 1409 2003-07-14 Frank Koormann <[email protected]>
5431    
5432     * Thuban/Model/load.py (SessionLoader.start_map): Encode map
5433     title to latin1. Fixes https://intevation.de/rt/webrt?serial_num=2013
5434    
5435 frank 1411 * test/test_load_0_8.py (TestUnicodeStrings): New, test load of
5436     unicode strings from session file: session title, map title and
5437     projection name.
5438    
5439 jonathan 1403 2003-07-10 Jonathan Coles <[email protected]>
5440    
5441 jonathan 1406 * Thuban/UI/viewport.py (Tool.MouseUp): Should have called
5442     drag_stop, not drag_move when the mouse is released.
5443    
5444     2003-07-10 Jonathan Coles <[email protected]>
5445    
5446 jonathan 1403 The most important part of this is the seperation of view.py into
5447     two pieces. viewport.py now has a class called ViewPort which
5448     contains all the non-wx parts of view.py and can therefore be
5449     tested. view.py contains only the wx-specific parts and is fairly
5450     simple.
5451    
5452     * Thuban/UI/view.py: Stripped out all non-wx functionality. Fixes
5453     RTTbug #1992.
5454     * Thuban/UI/viewport.py: New. Contains non-wx view functionality.
5455     RTTbug #1992.
5456    
5457     * Thuban/Model/classgen.py (generate_singletons,
5458     generate_uniform_distribution, generate_quantiles):
5459     Added 'fixes' parameter so that property attributes can
5460     be held constant over the generated classification groups.
5461     (CustomRamp.GetProperties): Remove unused variables.
5462    
5463     * Thuban/Model/map.py (Map.SetProjection): Send the old
5464     projection as an argument to listeners of the MAP_PROJECTION_CHANGED
5465     event.
5466    
5467     * Thuban/Model/table.py (table_to_dbf, table_to_csv): Added 'records'
5468     parameter which is a list of records that restricts which
5469     records are saved. Fixes RTbug #1997.
5470    
5471     * Thuban/UI/application.py (ThubanApplication.ShowExceptionDialog):
5472     Port exception dialog from GREAT-ER. Fixes RTbug #1993.
5473    
5474     * Thuban/UI/classgen.py (ClassGenDialog.__init__): Add controls
5475     to allow the user to fix line color/width on generated groups.
5476     (ClassGenDialog.OnOK): Use new 'fixes' parameter of the generate_*
5477     functions to optionally fix group properties.
5478    
5479     * Thuban/UI/main.py (main): Set exception hook to the
5480     ShowExceptionDialog. Fixes RTbug #1993.
5481    
5482     * Thuban/UI/mainwindow.py (MainWindow.ShowTableView): Raise
5483     the table window when it is selectd to be shown.
5484    
5485     * Thuban/UI/tableview.py (QueryTableFrame.__init__): Add an
5486     Export Selection button and move the export buttons underneath
5487     the table.
5488     (QueryTableFrame.UpdateStatusText): Added event argument so
5489     that it can respond to grid selection events. The status text
5490     is now updated even when the table is not associated with a
5491     layer as was previously assumed.
5492     (QueryTableFrame.OnGridSelectRange, OnGridSelectCell): Removed.
5493     UpdateStatusText responds to these events.
5494     (QueryTableFrame.OnSaveAs): Renamed to doExport.
5495     (QueryTableFrame.doExport): Helper function that saves the
5496     entire table, or selected rows, to a file.
5497     (QueryTableFrame.OnExport, QueryTableFrame.OnExportSel): New.
5498     Respond to export button events and call doExport.
5499    
5500     * extensions/thuban/gdalwarp.cpp (ProjectRasterFile): Make sure
5501     the function doesn't return NULL without first setting a Python
5502     Error.
5503    
5504     * test/runtests.py (main): Only print "Unknown option" for
5505     unsupported options.
5506    
5507     * test/support.py (FloatComparisonMixin.assertFloatEqual): Take
5508     optional epsilon argument to specify floating point accuracy.
5509     (FloatComparisonMixin.assertFloatSeqEqual): Call assertFloatEqual
5510     for each item test.
5511    
5512     * test/test_csv_table.py (TestCSVTable.test_table_to_cvs): Add
5513     tests for saving selected records.
5514    
5515     * test/test_dbf_table.py (TestTableToDBF.test_table_to_dbf): Add
5516     tests for saving selected records.
5517    
5518     * test/test_map.py (TestMapWithContents.test_set_projection):
5519     MAP_PROJECTION_CHANGED events send the old projection.
5520    
5521     * test/test_session.py
5522     (TestSessionWithContent.test_forward_map_projection):
5523     MAP_PROJECTION_CHANGED events send the old projection.
5524    
5525     * test/test_table.py (TableTest): Update tests to use non-deprecated
5526     functions.
5527    
5528 bh 1376 2003-07-08 Bernhard Herzog <[email protected]>
5529    
5530 bh 1382 * Thuban/Model/transientdb.py (TransientTableBase.Width): The type
5531     constants in the column objects are the standard ones defined in
5532     the table module.
5533    
5534     * test/test_transientdb.py
5535     (TestTransientTable.test_transienttable_to_dbf): New. Test whether
5536     exporting transient tables as DBF works. This should catch the bug
5537     just fixed in TransientTableBase.Width.
5538    
5539     2003-07-08 Bernhard Herzog <[email protected]>
5540    
5541 bh 1380 * Thuban/Model/classgen.py (CustomRamp.GetProperties): Compute the
5542     interpolated colors correctly.
5543    
5544     * test/test_classgen.py (TestCustomRamp.test_color_interpolation):
5545     New. Test case for the fix in classgen.py
5546    
5547     2003-07-08 Bernhard Herzog <[email protected]>
5548    
5549 bh 1378 * test/runtests.py (main): Make the default output less verbose
5550     and add a verbosity option (-v) to get the old output
5551    
5552     2003-07-08 Bernhard Herzog <[email protected]>
5553    
5554 bh 1376 * Resources/XML/thuban-0.9.dtd: New. This will become the DTD for
5555     0.9.
5556    
5557     * Thuban/Model/transientdb.py (TransientJoinedTable.JoinType):
5558     New. Return the join type
5559    
5560     * Thuban/Model/save.py (SessionSaver.write_session): Use new 0.9
5561     DTD
5562     (SessionSaver.write_data_containers): Save the join type for
5563     joined tables
5564    
5565     * Thuban/Model/load.py (SessionLoader.__init__): Add the new 0.9
5566     namespace
5567     (SessionLoader.start_jointable): Handle the jointype attribute
5568    
5569     * test/test_load_0_8.py: New. Effectively a copy of test_load.py
5570     as of Thuban 0.8. These are now tests to determine whether Thuban
5571     can still read files generated by Thuban 0.8
5572    
5573     * test/test_load.py (LoadSessionTest.dtd)
5574     (TestSingleLayer.file_contents)
5575     (TestLayerVisibility.file_contents, TestLabels.file_contents)
5576     (TestLayerProjection.file_contents)
5577     (TestRasterLayer.file_contents, TestJoinedTable.file_contents)
5578     (TestJoinedTable.file_contents)
5579     (TestLoadError.file_contents): Update for new DTD
5580     (TestJoinedTable.file_contents, TestJoinedTable.setUp): Add test
5581     for new join type attribute
5582    
5583     * test/test_save.py (SaveSessionTest.dtd)
5584     (SaveSessionTest.testEmptySession)
5585     (SaveSessionTest.testSingleLayer)
5586     (SaveSessionTest.testLayerProjection)
5587     (SaveSessionTest.testRasterLayer)
5588     (SaveSessionTest.testClassifiedLayer)
5589     (SaveSessionTest.test_dbf_table)
5590     (SaveSessionTest.test_joined_table): Update for new DTD
5591     (SaveSessionTest.test_joined_table): Add test for new join type
5592     attribute
5593    
5594 bh 1372 2003-07-04 Bernhard Herzog <[email protected]>
5595    
5596     * Thuban/Model/table.py (_find_dbf_column_names): New. Helper
5597     function for table_to_dbf
5598     (table_to_dbf): Deal with names longer than the 10 character limit
5599    
5600     * test/test_dbf_table.py (TestTableToDBF.test_table_to_dbf): Add
5601     doc-string
5602     (TestTableToDBF.test_table_to_dbf_long_col_names): New test for
5603     long column names
5604    
5605 bh 1365 2003-07-03 Bernhard Herzog <[email protected]>
5606    
5607 bh 1370 * Doc/manual/thuban-manual.xml: Fix the CVS Revision Tag syntax
5608    
5609     2003-07-03 Bernhard Herzog <[email protected]>
5610    
5611 bh 1368 * Doc/manual/thuban-manual.xml, Doc/manual/README: New. Skeleton
5612     for the Thuban manual and README with some basic information about
5613     the manual
5614    
5615     2003-07-03 Bernhard Herzog <[email protected]>
5616    
5617 bh 1365 * Thuban/Model/transientdb.py (TransientJoinedTable.__init__):
5618     Update doc-string
5619     (TransientJoinedTable.create): Do not modify the column objects of
5620     the input tables in place and copy all columns of the input tables
5621     into the joined table after all.
5622    
5623     * test/test_transientdb.py
5624     (TestTransientTable.test_transient_joined_table_same_column_name):
5625     Update to reflect the new behavior
5626     (TestTransientTable.test_transient_joined_table_with_equal_column_names):
5627     Update to reflect the new behavior
5628     (TestTransientTable.test_transient_joined_table_name_collisions_dont_modify_in_place):
5629     New test case for a bug which modified the column objects in place
5630    
5631 jonathan 1360 2003-07-02 Jonathan Coles <[email protected]>
5632 jonathan 1349
5633 jonathan 1360 * Thuban/Model/classgen.py (generate_singletons,
5634     generate_uniform_distribution, generate_quantiles,
5635 jonathan 1363 GenQuantiles0): Make sure maxValue isn't less than
5636     one, otherwise we could divide by zero.
5637    
5638     * test/test_classgen.py (ClassGenTest.doClassRangeTest,
5639     ClassGenTest.doClassSingleTest): Call doBoundsTest to
5640     check the end classification groups against the
5641     proper property values.
5642     (ClassGenTest.doBoundsTest): New. Checks the first and
5643     last classification groups to make sure their properties
5644     are the correct upper and lower bounds for a color ramp.
5645    
5646     2003-07-02 Jonathan Coles <[email protected]>
5647    
5648     * Thuban/Model/classgen.py (generate_singletons,
5649     generate_uniform_distribution, generate_quantiles,
5650 jonathan 1360 GenQuantiles0): The denominator was one to high when
5651     calculating the index for the ramp causing the index
5652     to never to reach one.
5653    
5654     2003-07-02 Jonathan Coles <[email protected]>
5655    
5656 jonathan 1358 Changed the singature of ClassGroupRange.__init__ and
5657     ClassGroupRange.SetRange() so that the min/max values are
5658     passed as a tuple. This makes a better calling scheme for
5659     when a Range object is passed instead.
5660    
5661     * Thuban/Model/classgen.py: Fixed parameters to
5662     ClassGroupRange constructor.
5663    
5664     * Thuban/Model/classification.py (ClassGroupRange.__init__):
5665     Consolidate the min/max parameters into a single _range which
5666     can either be a tuple or a Range object.
5667     (ClassGroupRange.SetRange): Consolidate the min/max parameters
5668     into a single _range which can either be a tuple or a Range object.
5669    
5670     * Thuban/Model/load.py (SessionLoader.start_clrange): Fix
5671     call to ClassGroupRange constructor to use a tuple.
5672    
5673     * Thuban/Model/layer.py (Layer.SetClassification): Switch
5674     the classification instance variable to the new class
5675     before calling _set_layer otherwise subscribers to a
5676     LAYER_CHANGED event will not see any difference.
5677    
5678     * test/test_classification.py: Fix tests of ClassGroupRange
5679     so that they use the new signature.
5680    
5681     * test/test_load.py: Fix use of ClassGroupRange so that it
5682     uses the new signature.
5683    
5684     * test/test_load_0_2.py: Fix use of ClassGroupRange so that it
5685     uses the new signature.
5686    
5687     * test/test_save.py: Fix use of ClassGroupRange so that it
5688     uses the new signature.
5689    
5690    
5691     2003-07-01 Jonathan Coles <[email protected]>
5692    
5693 jonathan 1349 * Thuban/Model/classgen.py: Fixes RTbug #1972, 1971.
5694     Import used objects/class from color.
5695     (generate_singletons): We don't
5696     need the numGroups parameter anymore because we are using
5697     the new ramps with GetProperties().
5698     (generate_uniform_distribution): Use new ramp method
5699     GetProperties().
5700     (generate_quantiles, GenQuantiles0): Use new ramp method
5701     GetProperties().
5702     (CustomRamp.SetNumGroups): Removed. The ramps now map
5703     a value from 0 to 1 to class properties so the number
5704     of groups is not needed ahead of time.
5705     (CustomRamp.next): Removed. CustomRamp does not support
5706     interation anymore.
5707     (CustomRamp.GetProperties): Returns a ClassGroupProperties
5708     object based on the index value from 0 to 1 that is
5709     passed to it.
5710     (GreyRamp, RedRamp, GreenRamp, BlueRamp, GreenToRedRamp):
5711     Made into instances of Monochromatic class instread of
5712     deriving from it.
5713     (HotToCold.SetNumGroups): Removed. See CustomRamp.
5714     (HotToCold.next): Removed. See CustomRamp.
5715    
5716     * Thuban/Model/classification.py: Fixes RTbug #1973, 1971.
5717     (Classification.SetField, Classification.SetFieldType):
5718     Replaced with SetFieldInfo.
5719     (Classification.SetFieldInfo): New. Does a better job of
5720     what SetField and SetFieldType used to do by combining
5721     their function since they should really always be done
5722     at the same time.
5723     (Classification.SetLayer): Renamed to _set_layer.
5724     (Classification._set_layer): Should only be called from
5725     Layer's SetClassification. This does not cause a recursive
5726     call as SetLayer did because we know that Layer knows about
5727     the classification.
5728    
5729     * Thuban/Model/color.py: Fixes RTbug #1971.
5730     (_Transparent): Renamed from Transparent so it doesn't
5731     conflict with the module variable.
5732     (Transparent, Black): Renamed from Color.Transparent,
5733     Color.Black so they are not class variables.
5734    
5735     * Thuban/Model/layer.py: Fixes RTbug #1971, 1973.
5736     (Layer.Destroy): We don't need to call SetClassification
5737     anymore to clear out the back reference in the classifcation
5738     to the layer. It's better to set it to None using _set_layer,
5739     and we won't be creating another clas object too.
5740     (Layer.SetClassification): Classification._set_layer is not
5741     recursive so remove all the locking variables. Also clean
5742     up the code so that it remains unchanged if something fails.
5743    
5744     * Thuban/Model/load.py: Fixes RTbug #1971.
5745     (SessionLoader.start_classification): Call
5746     Classification.SetFieldInfo().
5747    
5748     * Thuban/Model/save.py: Removed import of Color which wasn't
5749     being used.
5750    
5751     * Thuban/UI/classgen.py: Fixes RTbug #1972.
5752     (ClassGenDialog.__init__): Color ramps are now instances
5753     already so we don't need to create any new objects.
5754     (ClassGenDialog.OnOK): Check for numGroups is no longer
5755     necessary because we never use it.
5756    
5757     * Thuban/UI/classifier.py: Fixes RTbug #1971.
5758     (Classifier.__BuildClassification, Classifier.__SetGridTable):
5759     Call Classification.SetFieldInfo() instead of SetFieldType.
5760    
5761     * Thuban/UI/renderer.py: Fixes RTbug #1971.
5762    
5763     * Thuban/UI/view.py: Fixes RTbug #1974, 1971.
5764     (MapCanvas.__init__): Subscribe to the idle time event. Set
5765     background color to white.
5766     (MapCanvas.OnPaint): Set a flag indicating that we should
5767     render the map during idle time. If we already have a bitmap
5768     just draw it now.
5769     (MapCanvas.OnIdle): New. Render the map only during idle time.
5770     This also fixes a problem with the busy cursor under gtk.
5771    
5772     * test/test_classgen.py (ClassGenTest.test_generate_singletons):
5773     Fix calls to generate_singletons because the signature changed.
5774    
5775     * test/test_classification.py: Fix color references and
5776     change calls to Classification.[SetField|SetFieldType] to
5777     SetFieldInfo.
5778    
5779     * test/test_load.py: Fix color references.
5780    
5781     * test/test_load_0_2.py: Fix color references.
5782    
5783     * test/test_save.py (SaveSessionTest.testClassifiedLayer):
5784     Change calls to Classification.[SetField|SetFieldType] to
5785     SetFieldInfo.
5786    
5787 frank 1334 2003-07-01 Frank Koormann <[email protected]>
5788    
5789     MERGE from the greater-ms3 branch.
5790    
5791     * test/test_transientdb.py
5792     (TestTransientTable.test_transient_joined_table_with_equal_column_names):
5793     New. Test join of two tables with partly equal column names.
5794    
5795     * Thuban/Model/transientdb.py (TransientJoinedTable.create):
5796     If duplicates in left and right tables column names are found,
5797     append '_' (underscores) to the name until it is unique.
5798     Create always new internal names for the resulting table and reference
5799     columns in the join statement with <table>.<column>
5800    
5801 bh 1329 2003-07-01 Bernhard Herzog <[email protected]>
5802    
5803     * test/test_transientdb.py
5804     (TestTransientTable.test_transient_joined_table_same_column_name):
5805     New. Test whether joining on columns with the same names in both
5806     tables works.
5807 frank 1334
5808 bh 1329 * Thuban/Model/transientdb.py (TransientJoinedTable.create): Make
5809     sure to use the right internal names even when joining on field
5810     with the same names in both tables. Also, detect duplicate names
5811     in the joined table correctly.
5812    
5813 frank 1325 2003-07-01 Frank Koormann <[email protected]>
5814    
5815     * Thuban/UI/renderer.py (ExportRenderer.render_legend):
5816     Reverse List of layers to render in same order as in desktop legend.
5817    
5818 jonathan 1318 2003-06-30 Jonathan Coles <[email protected]>
5819    
5820 jonathan 1349 * Thuban/version.py (make_tuple): Takes a version string
5821     and splits it into a tuple of at most three integers.
5822     Used make_tuple() to make tuple versions of the version
5823     numbers.
5824    
5825     * Thuban/UI/about.py: Add Thuban email addresses.
5826    
5827     2003-06-30 Jonathan Coles <[email protected]>
5828    
5829 jonathan 1320 * Thuban/version.py: SQLite/PySQLite version dependencies
5830     were too high.
5831    
5832     2003-06-30 Jonathan Coles <[email protected]>
5833    
5834 jonathan 1318 * Thuban/version.py: Update version to 0.8.1
5835    
5836     * MANIFEST.in: Added Projections so that default.proj is
5837     included.
5838    
5839 jonathan 1312 2003-06-26 Jonathan Coles <[email protected]>
5840    
5841     New About box with lots more information including library
5842     versions and credits. More/better version checking before
5843     Thuban starts.
5844    
5845     * Thuban/UI/about.py: New. New About box that displays
5846     library version information and credits.
5847    
5848     * Thuban/version.py: Added new 'versions' dictionary which
5849     contains the verions of various libraries which are checked
5850     when the module loads.
5851     (verify_versions): Check all version numbers and returns
5852     a list of errors.
5853    
5854     * Thuban/UI/classifier.py (Classifier.__EnableButtons):
5855     Reset the status of the buttons as the situation warrants,
5856     but in a better more reliable way by not relying on the
5857     current status to determine what needs to change.
5858    
5859     * Thuban/UI/main.py (wxCHECK_VERSION): Removed. Not needed.
5860     (verify_versions): Remove most of the code since it is
5861     now in Thuban.version.verify_versions.o
5862    
5863     * Thuban/UI/mainwindow.py (MainWindow.About): Call new
5864     About box in Thuban.UI.about.
5865    
5866     * extensions/thuban/gdalwarp.cpp (get_gdal_version): New.
5867     Returns the version of gdal library being used as a string.
5868    
5869     * extensions/thuban/wxproj.cpp (check_version, check_version_gtk):
5870     Removed.
5871     (get_proj_version): Return the version of PROJ that the file
5872     was compiled with.
5873     (get_gtk_version): Return th version of GTK that the file
5874     was compiled with.
5875    
5876 jonathan 1304 2003-06-25 Jonathan Coles <[email protected]>
5877    
5878     * Thuban/UI/classifier.py (Classifier.EditSymbol): The parent
5879     of the SelectPropertiesDialog should be self so the window
5880     appears on top.
5881     (ClassGroupPropertiesCtrl.DoEdit): The parent
5882     of the SelectPropertiesDialog should be self so the window
5883     appears on top.
5884    
5885     * Thuban/UI/resource.py: Cleaned up how we determine file
5886     extensions.
5887     (GetImageResource): Return an wxImage from our Resources.
5888    
5889 jonathan 1299 2003-06-24 Jonathan Coles <[email protected]>
5890    
5891     * Thuban/UI/renderer.py (ExportRenderer.render_legend):
5892     Check that a layer has a classification before trying
5893     to get it. Raster layers don't have classifications.
5894    
5895 jonathan 1286 2003-06-23 Jonathan Coles <[email protected]>
5896 jonathan 1297
5897     * setup.py: Add Resources/XML to resource list.
5898    
5899     2003-06-23 Jonathan Coles <[email protected]>
5900 jonathan 1286
5901 jonathan 1297 * setup.cfg: Fix copyright dates
5902    
5903     2003-06-23 Jonathan Coles <[email protected]>
5904    
5905 jonathan 1294 * MANIFEST.in: Update with Resources/XML
5906    
5907     * setup.py: Don't include Locale resources yet as we don't
5908     have any and it causes problems building the distribution
5909     for Windows. Update version to 0.8.0.
5910    
5911     * Doc/thuban.dtd: Removed since it is now in Resources/XML.
5912    
5913     * Thuban/UI/mainwindow.py: Add blank line at the end because
5914     file was not being read correctly building the Windows
5915     distribution.
5916    
5917     2003-06-23 Jonathan Coles <[email protected]>
5918    
5919 jonathan 1289 * Thuban/UI/mainwindow.py (MainWindow.About): Fix text.
5920    
5921     * Thuban/version.py: Temporarily update longversion for
5922     the 0.8 release so that it doesn't have the cvs revision.
5923    
5924     2003-06-23 Jonathan Coles <[email protected]>
5925    
5926 jonathan 1286 * Thuban/UI/common.py (ThubanBeginBusyCursor): Call wxSafeYield
5927     to make sure that we don't create reentrant possibilities with
5928     wxYield.
5929    
5930     * Thuban/UI/view.py (MapCanvas.OnPaint): Call wxBeginBusyCursor()
5931     directly to avoid the wxSafeYield() call which generates an
5932     OnPaint event causing infinite recursion. Don't try to catch
5933     exception anymore. This was for before there were limits on map
5934     scaling.
5935    
5936 bh 1283 2003-06-23 Bernhard Herzog <[email protected]>
5937    
5938     Bug fix for RT #1961:
5939    
5940     * Thuban/Model/load.py (SessionLoader.start_derivedshapesource):
5941     Register DerivedShapestores with the session
5942    
5943     * Thuban/Model/session.py (Session.Tables): Make sure each table
5944     is only listed once.
5945    
5946     * test/test_load.py (TestJoinedTable.test): Add check_format call.
5947     Update file contents to match the one written out.
5948    
5949 bh 1281 2003-06-20 Bernhard Herzog <[email protected]>
5950    
5951     * test/xmlsupport.py (SaxEventLister.startElementNS)
5952     (SaxEventLister.endElementNS): Do not include the qname. Python
5953     2.2.1 and 2.2.2 and 2.2.3 differ in this regard. In 2.2.1 qname it
5954     is (presumably incorrectly) None, whereas it's a string with the
5955     element name in the later versions.
5956    
5957     * test/test_xmlsupport.py (TestEventList.test_even_list_simple)
5958     (TestEventList.test_even_list_namespace): Update tests to reflect
5959     the new behaviour
5960     (TestEventList.test_even_list_id_normalization): Fix doc-string
5961    
5962 jonathan 1272 2003-06-20 Jonathan Coles <[email protected]>
5963    
5964 jonathan 1279 * Thuban/Model/layer.py (BaseLayer.HasShapes): New. Overridden
5965     by deriving classes to determine if that layer supports shapes.
5966     (Layer): Override HasShapes and return true.
5967    
5968     * Thuban/UI/classgen.py: Use Thuban[Begin|End]BusyCursor()
5969     instead of a direct call to wx[Begin|End]CusyCursor().
5970     (GenUniquePanel._OnRetrieve): Set busy cursor while retrieving
5971     table data.
5972    
5973     * Thuban/UI/common.py (ThubanBeginBusyCursor, ThubanEndBusyCursor):
5974     New. Wrappers around the wxWindows functions that allow us to
5975     make additional calls such as wxYield which gives the native
5976     system a chance to update the cursor correctly.
5977    
5978     * Thuban/UI/tableview.py: Use Thuban[Begin|End]BusyCursor()
5979     instead of a direct call to wx[Begin|End]CusyCursor().
5980    
5981     * Thuban/UI/view.py: Use Thuban[Begin|End]BusyCursor()
5982     instead of a direct call to wx[Begin|End]CusyCursor().
5983     (MapCanvas.find_shape_at): Check if the current search layer
5984     support shapes, otherwise go on to the next layer.
5985    
5986     * test/test_layer.py: Add tests in each type of layer for
5987     HasClassification() and HasShapes()
5988    
5989     2003-06-20 Jonathan Coles <[email protected]>
5990    
5991 jonathan 1272 * Thuban/UI/view.py (MapCanvas.OnPaint): Call wxYield after
5992     turning on the busy cursor to allow the system to change the
5993     cursor before we begin painting. This fixes a problem that
5994     was occuring only under GTK. Fixes RTbug #1840.
5995    
5996 bh 1270 2003-06-20 Bernhard Herzog <[email protected]>
5997    
5998     * Resources/XML/thuban-0.8.dtd: New DTD for the new file format
5999     version.
6000    
6001     * Thuban/Model/save.py (sort_data_stores): New. Make topological
6002     sort of the data sources so they can be written with sources that
6003     data sources that depend on other data sources come after the
6004     sources they depend on.
6005     (SessionSaver.__init__): Add idmap instance variable to map from
6006     objects to the ids used in the file.
6007     (SessionSaver.get_id, SessionSaver.define_id)
6008     (SessionSaver.has_id): New. Methods to manage the idmap
6009     (SessionSaver.write): Use thuban-0.8.dtd
6010     (SessionSaver.write_session): Add a namespace on the session and
6011     write out the data sources before the maps.
6012     (SessionSaver.write_data_containers): New. Write the data
6013     containers.
6014     (SessionSaver.write_layer): Layer elements now refer to a
6015     shapestore and don't contain filenames anymore.
6016    
6017     * Thuban/Model/load.py (LoadError): Exception class to raise when
6018     errors in the files are discovered
6019     (SessionLoader.__init__): Define dispatchers for elements with a
6020     thuban-0.8 namespace too.
6021     (SessionLoader.check_attrs): New helper method to check and
6022     convert attributes
6023     (AttrDesc): New. Helper class for SessionLoader.check_attrs
6024     (SessionLoader.start_fileshapesource)
6025     (SessionLoader.start_derivedshapesource)
6026     (SessionLoader.start_filetable, SessionLoader.start_jointable):
6027     Handlers for the new elements in the new fileformat
6028     (SessionLoader.start_layer): Handle the shapestore attribute in
6029     addition to filename.
6030     (SessionLoader.start_table, SessionLoader.end_table): Removed.
6031     They were never used in the old formats and aren't needed for the
6032     new.
6033    
6034     * Thuban/Model/session.py (Session.DataContainers): New method to
6035     return all "data containers", i.e. shapestores and tables
6036    
6037     * test/xmlsupport.py (SaxEventLister.__init__)
6038     (SaxEventLister.startElementNS, sax_eventlist): Add support to
6039     normalize IDs.
6040    
6041     * test/test_xmlsupport.py
6042     (TestEventList.test_even_list_id_normalization): New test case for
6043     id normalization
6044    
6045     * test/test_load.py (LoadSessionTest.check_format): Use ID
6046     normalization
6047     (LoadSessionTest.thubanids, LoadSessionTest.thubanidrefs): New
6048     class atrributes used for ID normalization
6049     (TestSingleLayer, TestLayerVisibility, TestLabels.test)
6050     (TestLayerProjection.test, TestRasterLayer.test): Adapt to new
6051     file format
6052     (TestJoinedTable): New test for loading sessions with joined
6053     tables.
6054     (TestLoadError): New. Test whether missing required attributes
6055     cause a LoadError.
6056    
6057     * test/test_save.py (SaveSessionTest.thubanids)
6058     (SaveSessionTest.thubanidrefs): New class attributes for ID
6059     normalization in .thuban files.
6060     (SaveSessionTest.compare_xml): Use id-normalization.
6061     (SaveSessionTest.testEmptySession)
6062     (SaveSessionTest.testLayerProjection)
6063     (SaveSessionTest.testRasterLayer)
6064     (SaveSessionTest.testClassifiedLayer): Adapt to new file format.
6065     (SaveSessionTest.testLayerProjection): The filename used was the
6066     same as for testSingleLayer. Use a different one.
6067     (SaveSessionTest.test_dbf_table)
6068     (SaveSessionTest.test_joined_table): New test cases for saving the
6069     new data sources structures.
6070     (TestStoreSort, MockDataStore): Classes to test the sorting of the
6071     data stores for writing.
6072    
6073     * test/runtests.py: Add CVS keywords
6074    
6075 jonathan 1265 2003-06-20 Jonathan Coles <[email protected]>
6076    
6077 jonathan 1267 * test/test_session.py
6078     (UnreferencedTablesTests.test_unreferenced_tables_with_joins):
6079     Use the cultural_landmark-point.dbf file for the store so that
6080     the table rows and shape count match.
6081    
6082     2003-06-20 Jonathan Coles <[email protected]>
6083    
6084 jonathan 1265 * Thuban/Model/data.py (DerivedShapeStore.__init__): Raise
6085     an exception if the number of shapes is different from the
6086     number of rows in the table. Address RTbug #1933.
6087    
6088     * test/test_layer.py (TestLayer.test_derived_store): Add
6089     a test for the new exception in DerivedShapeStore.__init__.
6090    
6091     * test/support.py (FloatTestCase): Removed since there is
6092     already FloatComparisonMixin. Fixes RTbug #1954.
6093     (FloatComparisonMixin.assertFloatEqual): Include test for
6094     infinity that was part of FloatTestCase.
6095    
6096     * test/test_range.py (RangeTest): Inherit from
6097     support.FloatComparisonMixin now that we don't have
6098     support.FloatTestCase.
6099    
6100 bh 1256 2003-06-20 Bernhard Herzog <[email protected]>
6101    
6102 bh 1260 * test/test_save.py (SaxEventLister, sax_eventlist): Removed. Use
6103     the implementation in xmlsupport instead.
6104     (SaveSessionTest.compare_xml): sax_eventlist is now in xmlsupport
6105    
6106     * test/test_proj.py: Import sax_eventlist from xmlsupport instead
6107     of test_save
6108    
6109     2003-06-20 Bernhard Herzog <[email protected]>
6110    
6111 bh 1258 * test/test_load.py (LoadSessionTest.check_format): New helper
6112     method to make sure the test files we load might have been written
6113     by the current thuban version.
6114     (ClassificationTest.TestLayers, TestSingleLayer.test)
6115     (TestLayerVisibility.test, TestClassification.test)
6116     (TestLabels.test, TestLayerProjection.test, TestRasterLayer.test):
6117     Add check_format() calls and fix the thuban data to match the data
6118     that would be written by saving the session loaded from it.
6119    
6120     * test/xmlsupport.py (SaxEventLister, sax_eventlist): Copies of
6121     the same class and function in test_save.
6122    
6123     * test/test_xmlsupport.py (TestEventList): New. test cases for
6124     sax_eventlist
6125    
6126     2003-06-20 Bernhard Herzog <[email protected]>
6127    
6128 bh 1256 * Resources/XML/thuban.dtd: Add comment about which versions of
6129     Thuban are covered by this DTD
6130     (map): Fix content model for layers and raster layers. There can
6131     be any number or layers and raster layers in any order.
6132    
6133 jonathan 1254 2003-06-20 Jonathan Coles <[email protected]>
6134    
6135 jonathan 1265 This is mainly about fixing RTbug #1949.
6136    
6137 jonathan 1254 * Thuban/Model/classification.py: Remove "from __future__"
6138     import statement since python 2.2 is the earliest supported
6139     version.
6140    
6141     * Thuban/Model/proj.py (Projection.GetProjectedUnits): New.
6142     Currently returns PROJ_UNITS_METERS or PROJ_UNITS_DEGREES
6143     depending on the units this projection *forwards* into.
6144    
6145     * Thuban/Model/save.py (SessionSaver.write_classification):
6146     Remove unnecessary use of lambdas and nested functions.
6147    
6148     * Thuban/UI/legend.py (ScaleBarBitmap.__SetScale): Do scale
6149     adjustment here if the map projection uses degrees.
6150    
6151     * Thuban/UI/scalebar.py (ScaleBar.DrawScaleBar): Remove
6152     scale adjust code since it is now done before calling
6153     this method. Don't do anything if the map projection
6154     is None.
6155    
6156 bh 1244 2003-06-19 Bernhard Herzog <[email protected]>
6157    
6158 bh 1248 Move version specific load tests to their own file.
6159    
6160     * test/test_load.py: Expand the doc-string to explain a bit how to
6161     handle file format changes.
6162     (TestClassification.test): Update the docstring as this test is
6163     not about Thuban 0.2 anymore.
6164    
6165     * test/test_load_0_2.py: New file with the load tests for thuban
6166     files created with Thuban 0.2 and earlier.
6167    
6168     2003-06-19 Bernhard Herzog <[email protected]>
6169    
6170 bh 1246 Add XML validation to some of the tests. Validation will only be
6171     done if pyRXP is installed (http://reportlab.com/xml/pyrxp.html).
6172     To make the DTD available to the test cases it's moved into
6173     Resources/XML
6174    
6175     * Resources/XML/thuban.dtd: New. This is now the real Thuban DTD
6176     for versions up to and including 0.2. Two slight changes: added an
6177     encoding specification and fixed the comment which refered to
6178     GRASS, not Thuban
6179    
6180     * test/xmlsupport.py: New support module for tests involving XML.
6181     Currently there's a mix-in class for XML validation.
6182    
6183     * test/test_xmlsupport.py: New. Tests for the xmlsupport module
6184    
6185     * test/test_save.py (SaveSessionTest): Derive from ValidationTest
6186     so that we can validate the
6187     (SaveSessionTest.testEmptySession)
6188     (SaveSessionTest.testSingleLayer)
6189     (SaveSessionTest.testSingleLayer)
6190     (SaveSessionTest.testLayerProjection)
6191     (SaveSessionTest.testRasterLayer)
6192     (SaveSessionTest.testClassifiedLayer): Validate the generated XML
6193    
6194     * test/runtests.py (main): Call print_additional_summary instead
6195     of print_garbage_information
6196    
6197     * test/support.py (resource_dir): New function to return the
6198     "Resource" subdirectory
6199     (print_additional_summary): New function to combine several
6200     summary functions
6201     (run_tests): Use print_additional_summary instead of calling
6202     print_garbage_information directly
6203    
6204     2003-06-19 Bernhard Herzog <[email protected]>
6205    
6206 bh 1244 * Doc/thuban.dtd (classification): Correct the content model of
6207     the classification element.
6208     (projection): Add the "name" attribute
6209    
6210 frank 1242 2003-06-19 Frank Koormann <[email protected]>
6211    
6212     MERGE from the greater-ms3 branch.
6213    
6214     * Thuban/UI/scalebar.py (ScaleBar.DrawScaleBar): Apply conversion to
6215     scale if projection is latlong to get better estimate.
6216    
6217     Fix problem of hidden properties dialog under windows after double
6218     click on layer tree:
6219     The tree control always gets an Expanded / Collapsed event after
6220 joey 2162 the ItemActivated on double click, which raises the main window again.
6221     We add a second ItemActivated event to the queue, which simply
6222 frank 1242 raises the already displayed window.
6223    
6224     * Thuban/UI/legend.py (LegendTree.__init__): Instance variable
6225     raiseProperties initialized to prevent endless loops
6226     (LegendTree._OnItemActivated): Depending on self.raiseProperties
6227     simply raise the properties or open the dialog and issue a second
6228     event.
6229    
6230 jonathan 1235 2003-06-18 Jonathan Coles <[email protected]>
6231    
6232 jonathan 1239 * setup.py: Fix a few problems that occured under Windows.
6233    
6234     2003-06-18 Jonathan Coles <[email protected]>
6235    
6236 jonathan 1235 When Thuban loaded the map was redrawn twice because the
6237     legend was being opened after the mainwindow was created
6238     and not during its creation. This meant the map was drawn
6239     initially and then had to be redrawn when the legend
6240     caused the display to change. Now the legend is opened
6241     in the mainwindow constructor which resolves this issue.
6242    
6243     Also, although we were checking for the existence of
6244     gdal and gdalwarp modules, the gdalwarp extension was
6245     still being compiled (which may fail if the system doesn't
6246     have gdal installed). the build_ext command to setup.py
6247     now accepts the flags --with-gdal and --without-gdal.
6248     If --without-gdal is specified setup.py will try to
6249     use the gdal parameters specified by gdal-config. Under
6250     windows, those parameters have to be set in setup.py
6251     as with proj4 an wxWindows.
6252    
6253     * setup.py: Use a list instead of seperate variables for
6254     extension parameters so we can create a generic function
6255     that runs an appropriate *-config script.
6256     (run_cs_script): Renamed from run_wx_script and modified
6257     to accept a second argument which is a list of lists to
6258     be filled in by the values returned from running the command.
6259     (thuban_build_ext): New. Extends the build_ext command and
6260     provides the options --with-gdal/--without-gdal which then
6261     optionally includes the gdalwarp extension.
6262    
6263     * Thuban/Model/resource.py: First check if we can import
6264     the gdalwarp Thuban extension before checking for gdal.
6265     Also added some comments.
6266    
6267     * Thuban/UI/legend.py (ScaleBarBitmap.__SetScale): Check if
6268     the map is None which may be the case if none has been loaded
6269     yet.
6270    
6271     * Thuban/UI/main.py (main): Remove call to ShowLegend.
6272    
6273     * Thuban/UI/mainwindow.py (MainWindow.__init__): Call ShowLegend().
6274    
6275     * Thuban/UI/renderer.py: Check for gdal support before importing
6276     gdalwarp.
6277     (MapRenderer.render_map): Only try to optimize if we have gdal
6278     support otherwise nothing will get drawn.
6279    
6280 jonathan 1237 * Thuban/UI/view.py (MapCanvas.FitMapToWindow): This may be called
6281     during startup before a map has been created. Check if map is None
6282     before using it and do nothing if it is.
6283    
6284 jonathan 1224 2003-06-17 Jonathan Coles <[email protected]>
6285    
6286     Fix the problem with raster layers under Windows that caused
6287     Thuban to crash. The view should respond to layer projection
6288     changed events to update the display. Changes to a projection
6289     should not cause the map to be set to full extent.
6290    
6291     * Thuban/UI/view.py (MapCanvas.__init__): New instance variable
6292     current_map_proj to remember the current map projection so that
6293     when the projection changes we know what the previous projection
6294     was.
6295     (MapCanvas.SetMap): Unsubscribe and subscribe to
6296     LAYER_PROJECTION_CHANGED events.
6297     (MapCanvas.projection_changed): Split into two methods that respond
6298     to map and layer projection changes.
6299     (MapCanvas.map_projection_changed): New. Takes the current view and
6300     projects it using the new projection. This does not cause the
6301     map to be redrawn at full extent.
6302     (MapCanvas.layer_projection_changed): New. Cause a redraw which
6303     will draw each layer in its new projection.
6304    
6305     * extensions/thuban/bmpdataset.cpp (BMPDataset::Open): Call
6306     VSIFClose() not VSIFCloseL() to close the file. Fixes a crash
6307     under Windows.
6308    
6309     * extensions/thuban/gdalwarp.cpp (MFILENAME): Padding should be
6310     to twice sizeof(void*) because there are two digits for each
6311     hex byte.
6312    
6313 bh 1220 2003-06-16 Bernhard Herzog <[email protected]>
6314    
6315     Update to the layer interface: Direct access to the table,
6316     shapetable, shapefile and filename attributes is now actively
6317     deprecated by issuing deprecation warnings for all places where
6318     this happens.
6319    
6320     * Thuban/Model/layer.py (Layer.__getattr__): New. Implement access
6321     to the instance variables table, shapetable, shapefile and
6322     filename via __getattr__ so that we can issue a deprecation
6323     warning.
6324     (Layer.SetShapeStore): Don't set the deprecated instance variables
6325     any more
6326     (Layer.SetShapeStore): Don't use deprecated layer instance
6327     variables
6328     (Layer.Destroy): No need to explicitly remove the instance
6329     variables any more
6330     (Layer.GetFieldType, Layer.Shape): Don't use deprecated layer
6331     instance variables
6332    
6333     * Thuban/UI/classgen.py (ClassGenDialog.__init__)
6334     (GenUniformPanel._OnRetrieve, GenUniquePanel._OnRetrieve)
6335     (GenQuantilesPanel.GetList, GenQuantilesPanel.OnRetrieve): Don't
6336     use deprecated layer instance variables
6337    
6338     * Thuban/UI/classifier.py (Classifier.__init__): Don't use
6339     deprecated layer instance variables
6340    
6341     * Thuban/UI/identifyview.py (IdentifyListCtrl.selected_shape)
6342     (IdentifyGridCtrl.selected_shape): Don't set the deprecated layer
6343     instance variables
6344    
6345     * Thuban/UI/tableview.py (LayerTableGrid.select_shapes): Don't use
6346     deprecated layer instance variables
6347    
6348     * Thuban/UI/mainwindow.py (MainWindow.LayerShowTable): Don't use
6349     deprecated layer instance variables
6350    
6351     * Thuban/Model/save.py (SessionSaver.write_layer): Don't use
6352     deprecated layer instance variables
6353    
6354     * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer)
6355     (MapRenderer.polygon_render_param): Don't use deprecated layer instance
6356     variables
6357    
6358     * test/runtests.py (main): Turn Thuban's deprecation warnings into
6359     errors so that they're cought by the tests
6360    
6361     * test/test_load.py (TestSingleLayer.test): Don't use deprecated
6362     layer instance variables
6363    
6364 jonathan 1212 2003-06-16 Jonathan Coles <[email protected]>
6365    
6366     Fix a problem under Windows whereby if the user double-clicks on a
6367     layer in the legend that tree item will expand or collapse as well
6368     as open the layer properties dialog. The state of the tree item
6369     should not be affected.
6370    
6371     * Thuban/UI/legend.py (LegendTree.__init__): Add instance variable
6372     preventExpandCollapse and subscribe to expanding and collapsing
6373     events.
6374     (LegendTree.OnItemExpandCollapse): New. Responds to expanding and
6375     collapsing events and will veto the event if it has been triggered
6376     by the user double clicking on a layer.
6377     (LegendTree._OnItemActivated): Set preventExpandCollapse to indicate
6378     that an expanding/collapsing event should be vetoed.
6379    
6380 bh 1208 2003-06-13 Bernhard Herzog <[email protected]>
6381    
6382     * Thuban/UI/classifier.py (Classifier.OnClose)
6383     (Classifier.map_layers_removed)
6384     (Classifier.layer_shapestore_replaced): Unsubscribe the messages
6385     in OnClose and not in map_layers_removed or
6386     layer_shapestore_replaced to make sure it always happens when the
6387     dialog is closed
6388    
6389 jonathan 1201 2003-06-13 Jonathan Coles <[email protected]>
6390    
6391 jonathan 1203 This puts back a fix for Windows where a panel is needed so that
6392     the background of the table view appears correctly.
6393    
6394     * Thuban/UI/tableview.py (TableFrame.__init__): Add a panel
6395     object that can be used by derived classes to place any
6396     controls (including the grid) onto.
6397     (QueryTableFrame.__init__): Use the panel as the parent window
6398     for all the controls. Reparent the grid so that the panel is
6399     the parent. Call UpdateStatusText() to correctly initialize
6400     the status bar.
6401    
6402     2003-06-13 Jonathan Coles <[email protected]>
6403    
6404 jonathan 1201 * Thuban/UI/dialogs.py (ThubanFrame): New: a class that inherits
6405     from wxFrame (as opposed to wxDialog like the other classes)
6406     but otherwise behaves like the other classes. This is needed
6407     for the TableView which isn't really a dialog and needs to
6408     have a status bar and control buttons.
6409    
6410     * Thuban/UI/tableview.py (TableGrid.__init__): Create an
6411     instance variable to keep track of how many rows are selected.
6412     Subscribe once to the the events we are interested in.
6413     (ThubanGrid.OnRangeSelect): Only handle event if event handling
6414     hasn't been turned off.
6415     (ThubanGrid.OnSelectCell): Only handle event if event handling
6416     hasn't been turned off.
6417     (ThubanGrid.ToggleEventListeners): Rather than subscribe None
6418     as an event listener (which changes the event handler stack)
6419     simply set an instance variable to False. This is checked in
6420     the event handlers.
6421     (ThubanGrid.GetNumberSelected): Return the number of currently
6422     selected rows.
6423     (TableFrame): Inherit from ThubanFrame so we can have a
6424     status bar and control buttons.
6425     (QueryTableFrame.__init__): Create a status bar. Fixes RTbug #1942.
6426     Explicitly set which items are selected in the operator choice and
6427     action choice so there is always a valid selection. Fixes RTbug #1941.
6428     Subscribe to grid cell selection events so we can update the
6429     status bar.
6430     (QueryTableFrame.UpdateStatusText): Update the status bar with
6431     how many rows are in the grid, how many columns, and how many
6432     rows are selected.
6433     (QueryTableFrame.OnGridSelectRange, QueryTableFrame.OnGridSelectCell):
6434     Call UpdateStatusText when cells are (de)selected.
6435     (QueryTableFrame.OnQuery): Use the string value in the value
6436     combo if either the selected item index is 0 or if the string
6437     cannot be found in the predefined list (this happens if the
6438     user changes the text). Fixes RTbug #1940.
6439     Only turn off the grid event listeners if there a query comes
6440     back with a none empty list of ids. in the case that the list
6441     is empty this causes a grid.ClearSelection() call to actually
6442     clear the grid selection which causes the selected items in
6443     the map to be deselected. Fixes RTbug #1939.
6444    
6445     * test/test_save.py (XMLWriterTest.Encode): Check return values.
6446     Fixes RTbug #1851.
6447    
6448 bh 1195 2003-06-13 Bernhard Herzog <[email protected]>
6449    
6450     * Thuban/UI/identifyview.py (IdentifyView.__init__): Call
6451     self.selected_shape with the current selection to make sure the
6452     contents of the dialog are up to date when it's shown for the
6453     first time.
6454     The dialog used to work without this by luck. The recent fix to
6455     the connector module 'broke' a 'feature' the identify view was
6456     relying on, i.e that subscribing to a message in response to
6457     receiving a message of that type would mean that the new
6458     subscriber would also be called for the same message.
6459    
6460 jonathan 1169 2003-06-12 Jonathan Coles <[email protected]>
6461 jonathan 1175
6462 jonathan 1193 * extensions/thuban/gdalwarp.cpp: Removed debug printing as
6463     the image is rendered. Fixes RTbug #1937.
6464    
6465     2003-06-12 Jonathan Coles <[email protected]>
6466    
6467 jonathan 1191 * Thuban/Lib/fileutil.py: As is done under Windows, create the
6468 jonathan 1193 user directory if it doesn't exist on a posix system.
6469     Fixes RTbug #1815.
6470 jonathan 1191
6471     * Thuban/Model/resource.py (get_user_proj_files): Moved the
6472     called to get_application_dir here, so that the directory
6473     will only be called if this method is invoked.
6474    
6475     * Thuban/UI/projdialog.py (ProjFrame.__DoOnProjAvail): Clear
6476     the projfilepath if no projection is selected.
6477    
6478     2003-06-12 Jonathan Coles <[email protected]>
6479    
6480 jonathan 1182 * Thuban/UI/legend.py (ScaleBarBitmap.__SetScale): Don't draw
6481     the scalebar if the current map has no projection set.
6482    
6483     * Thuban/UI/projdialog.py (ProjFrame.__DoOnProjAvail): Set the
6484     projfilepath label to just the basename of the projection file
6485     rather than include the entire path.
6486    
6487     * Thuban/Model/resource.py: Fix missed proj functions that
6488     needed to be renamed.
6489    
6490     2003-06-12 Jonathan Coles <[email protected]>
6491    
6492 jonathan 1178 * Thuban/Model/classification.py: Removed assert statements that
6493     tested if the variable was an instance of Color.
6494    
6495     * Thuban/Model/color.py (Color): Remove commented code that isn't
6496     used.
6497     (Transparent): Renamed from NoColor. Doesn't inherit from Color.
6498     Fixes RTbug #1835.
6499     (Transparent.__eq__, Transparent.__ne, Transparent.__repr): New.
6500     Needed now that the class doesn't inherit from Color.
6501    
6502     2003-06-12 Jonathan Coles <[email protected]>
6503    
6504 jonathan 1175 * test/test_save.py (XMLWriterTest.testEncode): Explicitly
6505     check unicode strings.
6506    
6507     * test/test_layer.py: Check for existence of gdal.
6508    
6509     2003-06-12 Jonathan Coles <[email protected]>
6510 jonathan 1172
6511     * Thuban/Model/xmlreader.py: New. Contains the XMLReader class
6512     that was in load.py
6513 jonathan 1169
6514 jonathan 1172 * Thuban/Model/xmlwriter.py: New. Contains the XMLWriter class
6515     that was in save.py
6516    
6517     2003-06-12 Jonathan Coles <[email protected]>
6518    
6519 jonathan 1169 This is largely a collection of bug fixes. We also handle the
6520     case where gdal is not on the system. The XMLReader and XMLWriter
6521     classes were moved into there own files to resolve some circular
6522     import references and because they shouldn't really be in the
6523     file that is dediciated to reading/writing session files since
6524     they are also used elsewhere.
6525    
6526     * Thuban/Model/classgen.py: Renamed functions to follow the
6527     function_names_with_underscores style. Fixes RTbug #1903.
6528     (calculate_quantiles): Raise ValueError if 'percents' is invalid.
6529    
6530     * Thuban/Model/layer.py: Import gdal only if it available.
6531     (RasterLayer): Handle the case where the gdal library is unavailable.
6532     Addresses RTbug #1877.
6533    
6534     * Thuban/Model/load.py (XMLReader): Moved into seperate file
6535     xmlreader.py.
6536    
6537 jonathan 1172 2003-06-12 Jonathan Coles <[email protected]>
6538    
6539     This is largely a collection of bug fixes. We also handle the
6540     case where gdal is not on the system. The XMLReader and XMLWriter
6541     classes were moved into there own files to resolve some circular
6542     import references and because they shouldn't really be in the
6543     file that is dediciated to reading/writing session files since
6544     they are also used elsewhere.
6545    
6546     * Thuban/Model/classgen.py: Renamed functions to follow the
6547     function_names_with_underscores style. Fixes RTbug #1903.
6548     (calculate_quantiles): Raise ValueError if 'percents' is invalid.
6549    
6550     * Thuban/Model/layer.py: Import gdal only if it available.
6551     (RasterLayer): Handle the case where the gdal library is unavailable.
6552     Addresses RTbug #1877.
6553    
6554     * Thuban/Model/load.py (XMLReader): Moved into seperate file
6555     xmlreader.py.
6556    
6557 jonathan 1169 * Thuban/Model/save.py (escape, XMLWriter): Moved into seperate
6558     file xmlwriter.py.
6559    
6560     * Thuban/Model/resource.py: Renamed functions to following the
6561     function_names_with_underscores style.
6562     (has_gdal_support): New function that returns true if the gdal
6563     library is available. Addresses RTbug #1877.
6564    
6565     * Thuban/UI/application.py (ThubanApplication.OpenSession):
6566     Display a message box if the gdal library is not available, but
6567     only if there are any layers that would use it. Addresses RTbug #1877.
6568    
6569     * Thuban/UI/classgen.py: Use renamed projection resource functions.
6570     (GenUniformPanel.__CalcStepping): Fix a slight discrepency
6571     when using integers versus floats.
6572    
6573     * Thuban/UI/mainwindow.py (_has_gdal_support): New. Used to
6574     determine if the "Add Image Layer" menu option should be
6575     greyed out or not. Addresses RTbug #1877.
6576    
6577     * Thuban/UI/projdialog.py: Use renamed projection resource functions.
6578    
6579     * Thuban/UI/renderer.py (MapRenderer.render_map): Only try to
6580     optimize if a raster layer is visible. Fixes RTbug #1931.
6581     Only draw the raster layer if the gdal library is available.
6582     Addresses RTbug #1877.
6583    
6584     * test/test_classgen.py: Add tests for generate_singletons,
6585     generate_uniform_distribution, generate_quantiles. Fixes RTbug #1903.
6586     (test_calculate_quantiles): Fix some tests to catch the new
6587     ValueError that is raised.
6588    
6589     * test/test_proj.py: Use renamed projection resource functions.
6590    
6591     * test/test_save.py (SaveSessionTest.testClassifiedLayer): New
6592     test for saving classified layers. Fixes RTbug #1902.
6593     (XMLWriterTest): New. Tests the XMLWriter class. Fixes RTbug #1851.
6594    
6595 jan 1156 2003-06-12 Jan-Oliver Wagner <[email protected]>
6596    
6597     Fix for http://intevation.de/rt/webrt?serial_num=1900.
6598    
6599     * Thuban/UI/multiplechoicedialog.py: New. A multiple choice dialog.
6600    
6601     * Thuban/UI/mainwindow.py: import wxMultipleChoiceDialog from
6602     multiplechoicedialog.py rather than from the wxPython library.
6603    
6604 frank 1151 2003-06-11 Frank Koormann <[email protected]>
6605    
6606 frank 1152 * Thuban/Lib/fileutil.py (get_application_dir): Minor stability
6607     update.
6608    
6609     2003-06-11 Frank Koormann <[email protected]>
6610    
6611 frank 1151 * Thuban/Lib/fileutil.py (get_application_dir): New function to
6612     determine the absolute .thuban/thuban directory under
6613     "posix" (os.expanduser) and "nt" (read AppData registry key).
6614    
6615     * Thuban/Model/resource.py: Use get_application_dir
6616    
6617     * Thuban/UI/application.py (ThubanApplication.read_startup_files):
6618     Use get_application_dir.
6619    
6620 bh 1143 2003-06-10 Bernhard Herzog <[email protected]>
6621    
6622 bh 1147 * Thuban/UI/tableview.py (LayerTableFrame.__init__): Subscribe to
6623     the messages MAP_LAYERS_REMOVED messages
6624     (LayerTableFrame.OnClose): Unsubscribe from it.
6625     (LayerTableFrame.map_layers_removed): New. Receiver for
6626     MAP_LAYERS_REMOVED. Close the dialog when the layer whose the
6627     dialog is showing is removed.
6628    
6629     2003-06-10 Bernhard Herzog <[email protected]>
6630    
6631 bh 1145 * Thuban/Lib/connector.py (Connector.Issue): Iterate over a copy
6632     of the receivers list so that unsubscribing in a receiver doesn't
6633     modify it while iterating over it.
6634    
6635     * test/test_connector.py
6636     (ConnectorTest.test_disconnect_in_receiver): New. Test whether
6637     unsubscribing in a receiver works correctly. See docstring for
6638     details
6639    
6640     2003-06-10 Bernhard Herzog <[email protected]>
6641    
6642 bh 1143 * Thuban/Model/messages.py (LAYER_SHAPESTORE_REPLACED): New
6643     message.
6644    
6645     * Thuban/Model/layer.py (Layer.SetShapeStore): Send
6646     LAYER_SHAPESTORE_REPLACED when the shapestore changes. A
6647     LAYER_CHANGED will still be sent if the classification changes.
6648    
6649     * Thuban/UI/classifier.py (Classifier.__init__): Add the map as
6650     parameter so we can subscribe to some of its messages
6651     (Classifier.__init__): Subscribe to the map's MAP_LAYERS_REMOVED
6652     and the layer's LAYER_SHAPESTORE_REPLACED
6653     (Classifier.unsubscribe_messages): New. Unsubscribe from message
6654     subscribed to in __init__
6655     (Classifier.map_layers_removed)
6656     (Classifier.layer_shapestore_replaced): receivers for the messages
6657     subscribed to in __init__. Unsubscribe and close the dialog
6658    
6659     * Thuban/UI/mainwindow.py (MainWindow.OpenLayerProperties): Pass
6660     the map to the Classifier dialog
6661    
6662     * test/test_layer.py (SetShapeStoreTests): Derive from
6663     SubscriberMixin as well so we can test messages
6664     (SetShapeStoreTests.setUp): Subscribe to some of the layer's
6665     messages
6666     (SetShapeStoreTests.tearDown): Clear the messages again
6667     (SetShapeStoreTests.test_sanity): Expand the doc-string and check
6668     for the modified flag too
6669     (SetShapeStoreTests.test_set_shape_store_modified_flag): New test
6670     to check whether SetShapeStore sets the modified flag
6671     (SetShapeStoreTests.test_set_shape_store_different_field_name)
6672     (SetShapeStoreTests.test_set_shape_store_same_field)
6673     (SetShapeStoreTests.test_set_shape_store_same_field_different_type):
6674     Add tests for the messages. This checks both the new
6675     LAYER_SHAPESTORE_REPLACED and the older LAYER_CHANGED
6676    
6677 jan 1141 2003-06-06 Jan-Oliver Wagner <[email protected]>
6678    
6679     * Thuban/UI/mainwindow.py: Improved and partly added help texts for
6680     the menu items.
6681    
6682 frank 1134 2003-06-05 Frank Koormann <[email protected]>
6683    
6684 frank 1139 * Thuban/UI/identifyview.py (IdentifyView.__init__):
6685     Layout reimplemented without panel. Make life easier to fit the list
6686     in the dialog.
6687    
6688     2003-06-05 Frank Koormann <[email protected]>
6689    
6690 frank 1137 * Thuban/UI/projdialog.py (ProjFrame.__init__): Fill the projchoice
6691     once on initialisation (Former implementation resulted in multiple
6692     entries for each projection).
6693     (ProjFrame.__FillAvailList): selectProj as second optional parameter,
6694     if set, select the projection found under the specified name. This
6695     overwrites any other selection estimate.
6696     Removed projchoice filling from this method.
6697     (ProjFrame._OnSave, ProjFrame._OnAddToList):
6698     Updated call of ProjFrame.__FillAvailList
6699     (LCCPanel._DoLayout): Moved parameter controls in more common order.
6700    
6701     * Resources/Projections/defaults.proj: Extended defaults representing
6702     various common European projections.
6703    
6704     2003-06-05 Frank Koormann <[email protected]>
6705    
6706 frank 1134 * Thuban/UI/identifyview.py (IdentifyView.__init__):
6707     Use ListCtrl instead of GridCtrl
6708    
6709     * Thuban/Model/resource.py:
6710     Guess location of .thuban directory from tempdir parent directory.
6711    
6712     * Thuban/UI/application.py (ThubanApplication.read_startup_files):
6713     Guess location of .thuban directory from tempdir parent directory.
6714    
6715 bh 1130 2003-06-04 Bernhard Herzog <[email protected]>
6716    
6717     Do not cache the values returned by the tree widget's
6718     GetFirstChild and GetNextChild methods because it led to lots of
6719     segfaults. The new way requires more brute force but is more
6720     reliable.
6721    
6722     * Thuban/UI/legend.py (LegendTree.__init__): Remove instance
6723     variable layer2id
6724     (LegendTree.find_layer): New method to do with brute force what
6725     layer2id tried to accomplish
6726     (LegendTree._OnMsgLayerChanged)
6727     (LegendTree._OnMsgLayerTitleChanged, LegendTree.__ShowHideLayer):
6728     Use find_layer instead of layer2id
6729     (LegendTree.__RemoveLayer, LegendTree.__AddLayer): No need to
6730     update layer2id anymore
6731     (LegendTree._OnMsgMapLayersRemoved)
6732     (LegendTree._OnMsgMapLayersAdded): Get by without layer2id.
6733    
6734 tkoester 1128 2003-06-03 Thomas Koester <[email protected]>
6735    
6736     * Thuban/Model/classgen.py (GenQuantiles0): New function.
6737    
6738 bh 1120 2003-06-02 Bernhard Herzog <[email protected]>
6739    
6740 bh 1127 * Thuban/UI/mainwindow.py (layer_rename command, table_rename command):
6741     New commands.
6742     (main_menu): Add the new commands.
6743     (MainWindow.TableRename): New. Implementation of the table_rename
6744     command.
6745     (MainWindow.RenameLayer): New. Implementation of the layer_rename
6746     command.
6747    
6748     * Thuban/Model/session.py (Session.AddTable): call self.changed to
6749     set the modified flag
6750    
6751     * test/test_session.py (TestSessionSimple.test_add_table): Test
6752     whether the modified flag is set properly
6753    
6754     * Thuban/Model/base.py (TitledObject.SetTitle): Call changed
6755     instead of issue so that the modified flags get updated.
6756    
6757     * test/test_base.py (SomeTitledObject): Derive from Modifiable
6758     instead of Publisher to reflect reality better and to accomodate
6759     the fact that SetTitle now calls changed instead of issue
6760    
6761     2003-06-02 Bernhard Herzog <[email protected]>
6762    
6763     * Thuban/UI/classgen.py (GenQuantilesPanel.GetList): Resource
6764     acquisition has to happen before the try in a try-finally.
6765    
6766     2003-06-02 Bernhard Herzog <[email protected]>
6767    
6768 bh 1120 * Thuban/UI/legend.py (LegendTree._OnMsgMapLayersRemoved): It's
6769     possible that a layer is removed that is not currently selected in
6770     the legend so don't check for this.
6771    
6772 bh 1112 2003-05-30 Bernhard Herzog <[email protected]>
6773    
6774 bh 1118 * Thuban/Model/layer.py (Layer.Destroy): Set all instance
6775     variables to None that have direct or indirect references to
6776     shapefiles or dbf files to make sure that they do go away and the
6777     files are closed.
6778    
6779     2003-05-30 Bernhard Herzog <[email protected]>
6780    
6781 bh 1116 * Thuban/UI/legend.py (LegendTree.GetRootItem): Reset
6782     availImgListIndices when a new image list is created
6783    
6784     2003-05-30 Bernhard Herzog <[email protected]>
6785    
6786 bh 1114 * Thuban/UI/legend.py (LegendTree.__init__): New instance variable
6787     changing_selection to indicate whether the LegendTree code itself
6788     is currently changing the selection
6789     (LegendTree.normalize_selection): New method to normalize the
6790     selection by selecting the layer item even if the user clicked on
6791     the classification.
6792     (LegendTree._OnSelChanged): normalize the selection. This works
6793     around a bug in wx which doesn't keep track of the selection
6794     properly when subtrees are deleted.
6795    
6796     2003-05-30 Bernhard Herzog <[email protected]>
6797    
6798 bh 1112 * Thuban/UI/view.py (MapCanvas.set_view_transform): Limit the
6799     maximum and minimum scale factors.
6800    
6801     * test/test_classgen.py (ClassGenTest.test): Update to reflect the
6802     changes in classgen.py
6803    
6804 jonathan 1109 2003-05-30 Jonathan Coles <[email protected]>
6805    
6806     * Thuban/Model/classgen.py: Remove ClassGenerator class but make
6807     all the methods functions. Fixes RTBug #1903.
6808    
6809     * Thuban/Model/map.py (Map.TopLayer, Map.BottomLayer): Renamed
6810     to MoveLayerToTop and MoveLayerToBottom respectively. Fixes
6811     RTBug #1907.
6812    
6813     * Thuban/UI/classgen.py: Use classgen functions that were part
6814     of the ClassGenerator class. Put try/finally blocks around
6815     code that uses wxBeginBusyCursor()/wxEndBusyCursor(). Fixes
6816     RTBug #1904.
6817    
6818     * Thuban/UI/classifier.py: Remove unused import of ClassGenerator.
6819    
6820     * Thuban/UI/legend.py: The legend was cleared and repopulated any
6821     time something changed which caused some state to be lost such
6822     as which children were expanded or collapsed. Fixes RTBug #1901.
6823     (LegendTree._OnMsgMapLayersAdded): Add only new layers.
6824     (LegendTree.__OnMsgMapLayersRemoved): Remove layers that exist in
6825     the legend but not in the map.
6826     (LegendTree.__FillTree): Move main functionality out into smaller
6827     methods that can be used by other methods.
6828     (LegendTree.__FillTreeLayer): Reuse old slots in the image list
6829     if they are available.
6830     (LegendTree.DeleteAllItems): Renamed from __DeleteAllItems so
6831     that we override the wxTreeCtrl method. Iterate over children
6832     and call __RemoveLayer.
6833     (LegendTree.__AddLayer): New. Add a new layer to the legend.
6834     (LegendTree.__RemoveLayer): Remove a layer from the legend.
6835     (LegendTree.DeleteChildren): New, overrides wxTreeCtrl method.
6836     Should only be called with the id of a layer branch.
6837     (LegendTree.GetRootItem): New, overrides wxTreeCtrl method.
6838     Returns the root item or creates one if necessary.
6839    
6840     * Thuban/UI/renderer.py (MapRenderer.draw_raster_layer): Call
6841     ProjectRasterFile with tuple arguments instead of strings.
6842    
6843     * Thuban/UI/tableview.py (QueryTableFrame.OnQuery): Wrap code
6844     with try/finally. Fixes RTBug #1904.
6845    
6846     * Thuban/UI/view.py (MapCanvas.OnPaint): Wrap code
6847     with try/finally. Fixes RTBug #1904.
6848     (MapCanvas.FitSelectedToWindow): If a single point is selected
6849     simply center it on the display. Fixes RTBug #1849.
6850    
6851     * extensions/thuban/gdalwarp.cpp: Removed code that allowed gdalwarp
6852     to be compiled as a standalone app. Now the code can only be
6853     called from Python which simplifies the parameter passing.
6854     (ProjectRasterFile): Handle Python arguments. Remove code that
6855     checks for a destination dataset. Add more clean up code.
6856    
6857     * test/test_map.py (TestMapWithContents.test_raise_layer_top,
6858     TestMapWithContents.test_lower_layer_bottom):
6859     Test Map.MoveLayerToTop() and Map.MoveLayerToBottom() respectively.
6860     Fixes RTBug #1907.
6861    
6862     * Thuban/UI/mainwindow.py (MainWindow.ToggleLegend): Apply a full
6863     extent to the map when the legend is toggled. Fixes RTBug #1881.
6864    
6865 jan 1097 2003-05-29 Jan-Oliver Wagner <[email protected]>
6866    
6867     * Thuban/UI/tableview.py (LayerTableFrame.OnClose): Bug-fix: Now
6868     unsubscribes all that is subcribed in __init__.
6869    
6870 bh 1089 2003-05-28 Bernhard Herzog <[email protected]>
6871    
6872 bh 1095 * Thuban/UI/mainwindow.py (MainWindow.DuplicateLayer)
6873     (MainWindow.CanDuplicateLayer): New methods to implement the
6874     Layer/Duplicate command.
6875     (layer_duplicate command): New.
6876     (main_menu): Add layer_duplicate to the Layer menu.
6877    
6878     2003-05-28 Bernhard Herzog <[email protected]>
6879    
6880 bh 1093 * Thuban/UI/tableview.py (NullRenderer.Draw): New. Our own
6881     renderer so that NULL/None values get displayed differently (by a
6882     gray rectangle).
6883     (TableGrid.__init__): Override the default renderers
6884    
6885     2003-05-28 Bernhard Herzog <[email protected]>
6886    
6887 bh 1089 * Thuban/Model/layer.py (Layer.SetShapeStore): Set the
6888     classification to "None" if the type of the field has changed.
6889    
6890     * test/test_layer.py (SetShapeStoreTests): New. Class with a few
6891     test for the Layer.SetShapeStore method
6892    
6893 jan 1087 2003-05-28 Jan-Oliver Wagner <[email protected]>
6894 jan 1085
6895 jan 1087 * Thuban/Model/layer.py (Layer.TreeInfo): Fixed a bug (a layer
6896     does not necessarily have a filename).
6897    
6898     2003-05-28 Jan-Oliver Wagner <[email protected]>
6899    
6900 jan 1085 * Thuban/UI/mainwindow.py (MainWindow.TableClose, MainWindow.TableShow):
6901     sort the selection list for the dialog.
6902    
6903 frank 1083 2003-05-28 Frank Koormann <[email protected]>
6904    
6905     * extensions/thuban/wxproj.cpp
6906     (project_point): Removed cast to int for projected point coordinates.
6907     (shape_centroid): Return last point if all polygon vertices fall
6908     to one point.
6909    
6910 bh 1079 2003-05-28 Bernhard Herzog <[email protected]>
6911    
6912 bh 1081 * Thuban/UI/mainwindow.py (_can_unjoin): Add doc-string and cope
6913     with layers that don't have shapestores, i.e. raster layers.
6914    
6915     2003-05-28 Bernhard Herzog <[email protected]>
6916    
6917 bh 1079 * Thuban/Model/table.py (DBFTable.__init__): Omit the extension
6918     when determining the title from the filename.
6919    
6920     * test/test_dbf_table.py (TestDBFTable.test_title): Update to
6921     reflect changes in the way the title is derived from the filename
6922    
6923 frank 1077 2003-05-28 Frank Koormann <[email protected]>
6924    
6925     * Thuban/UI/mainwindow.py (MainWindow.TableShow):
6926     Added wxDEFAULT_DIALOG_STYLE to show table dialog styles.
6927    
6928 bh 1069 2003-05-27 Bernhard Herzog <[email protected]>
6929    
6930 bh 1075 * Thuban/UI/mainwindow.py (MainWindow.delegated_messages): Also
6931     delegate SelectedLayer.
6932     (MainWindow.LayerUnjoinTable): Implement.
6933     (_can_unjoin): New. Helper function for the sensitivity of the
6934     layer/unjoin command.
6935    
6936     * Thuban/Model/data.py (ShapefileStore.OrigShapeStore)
6937     (DerivedShapeStore.OrigShapeStore): New. Return the original
6938     shapestore. Used to figure out how to unjoin.
6939     (DerivedShapeStore.Shapefile): Fix a typo.
6940    
6941     2003-05-27 Bernhard Herzog <[email protected]>
6942    
6943 bh 1073 * Thuban/UI/join.py (JoinDialog): Extend to handle layer joins as
6944     well
6945     (JoinDialog.__init__): Use the layer parameter and only build the
6946     left choice when a layer is given
6947     (JoinDialog.OnJoin): Handle layer joins as well
6948     (JoinDialog.OnLeftTable, JoinDialog.OnRightTable): Handle the case
6949     that the user selects the "Select..." item. The sensitivitly
6950     updating is now in update_sensitivity
6951     (JoinDialog.y): New method to refactor the sensitivity update of
6952     the join button into its own method.
6953    
6954     * Thuban/UI/mainwindow.py (MainWindow.LayerJoinTable): Implement.
6955    
6956     2003-05-27 Bernhard Herzog <[email protected]>
6957    
6958 bh 1071 * Thuban/UI/mainwindow.py (table_close command): Make it sensitive
6959     iff there are unreferenced tables in the session
6960    
6961     2003-05-27 Bernhard Herzog <[email protected]>
6962    
6963 bh 1069 * Thuban/Model/messages.py (TABLE_REMOVED): New message.
6964    
6965     * Thuban/Model/session.py (Session.UnreferencedTables): New method
6966     to return tables that are not referenced by other tables or shape
6967     stores and can be removed.
6968     (Session.RemoveTable): Issue a TABLE_REMOVED message after
6969     removing the table
6970    
6971     * Thuban/UI/mainwindow.py: Remove unused imports
6972     (MainWindow.TableClose): Implement.
6973    
6974     * Thuban/UI/tableview.py (TableFrame.__init__): Subscribe to some
6975     messages so that the frame will be automatically closed when a new
6976     session is opened or the table is removed.
6977     (TableFrame.OnClose): Unsubscribe the Subscriptions made in
6978     __init__
6979     (TableFrame.close_on_session_replaced)
6980     (TableFrame.close_on_table_removed): New. Subscribers that close
6981     the window
6982    
6983     * test/test_session.py (TestSessionMessages.test_remove_table)
6984     (TestSessionSimple.test_remove_table): Move the test to
6985     TestSessionSimple and add test for the TABLE_REMOVED message
6986     (TestSessionBase.setUp): Also subscribe to TABLE_REMOVED
6987     (TestSessionSimple.test_unreferenced_tables) New. Test for the
6988     UnreferencedTables method.
6989     (UnreferencedTablesTests): New. Class with some more sophisticated
6990     tests for UnreferencedTables.
6991    
6992 frank 1065 2003-05-27 Frank Koormann <[email protected]>
6993    
6994 frank 1067 * Thuban/UI/tableview.py (QueryTableFrame.__init__): The "_S_election"
6995     display has some unwanted side effects. Removed again.
6996    
6997     2003-05-27 Frank Koormann <[email protected]>
6998    
6999 frank 1065 * Resources/Bitmaps/legend_icon_layer.xpm: New, icon for legend.
7000    
7001     * Thuban/UI/legend.py (LegendTree.__FillTree): Use "legend_icon_layer"
7002    
7003 jan 1062 2003-05-27 Jan-Oliver Wagner <[email protected]>
7004    
7005 bh 1069 * test/test_menu.py (MenuTest.test): Added test for
7006     Menu.RemoveItem().
7007 jan 1062
7008 bh 1069 * Thuban/UI/menu.py (Menu.RemoveItem): New. Remove an item from
7009     the menu.
7010 jan 1062
7011 frank 1059 2003-05-27 Frank Koormann <[email protected]>
7012    
7013     Nonmodal dialogs without parent (i.e. they can fall behind the main
7014     window)
7015    
7016     * Thuban/UI/mainwindow.py (MainWindow.OnClose): Explicitly destroy
7017     all dialogs in the dialogs dictionary and the canvas.
7018    
7019     * Thuban/UI/dialogs.py (NonModalNonParentDialog): New class, without
7020     parent, i.e. can fall behind other windows.
7021     (NonModalDialog.OnClose): Check is dialog is in mainwindow.dialog
7022     dictionary before removing it.
7023    
7024     * Thuban/UI/classifier.py: Dialog derived from NonModalNonParentDialog
7025    
7026     * Thuban/UI/projdialog.py: Dialog derived from NonModalNonParentDialog
7027     * Thuban/UI/tableview.py: Dialog derived from NonModalNonParentDialog
7028     * Thuban/UI/tree.py: Dialog derived from NonModalNonParentDialog
7029    
7030 bh 1053 2003-05-27 Bernhard Herzog <[email protected]>
7031    
7032 bh 1055 * Thuban/UI/mainwindow.py (MainWindow.ShowTableView): New. Open a
7033     tableview dialog
7034     (MainWindow.TableShow): Use ShowTableView to open the dialogs.
7035     Also, don't use the table's titles as the dialog names. The titles
7036     aren't guaranteed to be unique.
7037     (MainWindow.TableOpen): Open a table view dialog after opening the
7038     table
7039    
7040     2003-05-27 Bernhard Herzog <[email protected]>
7041    
7042 bh 1053 * Thuban/UI/mainwindow.py: Remove the Table/Hide menu item. Its
7043     effect can be achieved by simply closing the window showing the
7044     table.
7045     (MainWindow.TableHide): Removed.
7046     (main_menu): Removed "table_hide"
7047    
7048 frank 1051 2003-05-27 Frank Koormann <[email protected]>
7049    
7050     Fix legend tree display problems under Win32
7051    
7052     * Thuban/UI/legend.py: BMP_SIZE_W = 15
7053     (LegendTree.__FillTree): Display "legend_icon_map.xpm" with layer title.
7054     (LegendTree.__FillTreeLayer): Explicitely set SelectedImage.
7055    
7056     * Resources/Bitmaps/legend_icon_map.xpm: New icon for legend.
7057    
7058 jan 1048 2003-05-27 Jan-Oliver Wagner <[email protected]>
7059    
7060     * Thuban/UI/menu.py (Menu.InsertSeparator): Additional optional parameter
7061     'after' now allows to insert separators almost anywhere in the menu.
7062    
7063 frank 1046 2003-05-27 Frank Koormann <[email protected]>
7064    
7065     * Thuban/UI/tableview.py (QueryTableFrame.__init__): Underline the
7066     "S" of selection box label to hint on hot key (Alt-S). Works under
7067     Win32 but is ignored under GTK.
7068    
7069     2003-05-26 Frank Koormann <[email protected]>
7070    
7071     * Thuban/UI/projdialog.py (ProjFrame.__do_layout, ProjPanel._DoLayout):
7072     Center Choices.
7073    
7074 bh 1038 2003-05-26 Bernhard Herzog <[email protected]>
7075    
7076 bh 1044 Remove the Precision methods again. They're too DBF specific to be
7077     part of the table interface and they're only used in table_to_dbf
7078     anyway.
7079    
7080     * Thuban/Model/transientdb.py (TransientTableBase.Width):Use a
7081     fixed precision of 12 for doubles.
7082     (TransientTableBase.Precision): Removed
7083     (AutoTransientTable.Width): Delegate to self.table.
7084    
7085     * Thuban/Model/table.py (DBFTable.Precision)
7086     (MemoryTable.Precision): Removed.
7087     (MemoryTable.Width): Use a fixed precision of 12 for doubles.
7088     (table_to_dbf): Use a fixed precision of 12 for floats unless the
7089     column object specifies something else.
7090    
7091     * test/test_dbf_table.py (TestTableToDBF.test_table_to_dbf): New.
7092     test for table_to_dbf
7093    
7094     2003-05-26 Bernhard Herzog <[email protected]>
7095    
7096     * test/test_transientdb.py
7097     (TestTransientTable.run_iceland_political_tests): Fix a comment.
7098    
7099     2003-05-26 Bernhard Herzog <[email protected]>
7100    
7101 bh 1038 * Thuban/UI/mainwindow.py (MainWindow.TableOpen): Real
7102     implementation. Mark parts of the file format strings for
7103     localization.
7104    
7105     * Thuban/Model/session.py (Session.OpenTableFile): New. Open a dbf
7106     file and add the table to the tables managed by the session
7107    
7108 bh 1040 * test/test_session.py (TestSessionSimple.test_open_table_file):
7109     New. test case for OpenTableFile
7110    
7111 jan 1033 2003-05-26 Jan-Oliver Wagner <[email protected]>
7112    
7113 jan 1035 * Thuban/UI/controls.py, Thuban/UI/identifyview.py, Thuban/UI/join.py,
7114     Thuban/UI/labeldialog.py, Thuban/UI/mainwindow.py,
7115     Thuban/UI/proj4dialog.py, Thuban/UI/tableview.py, Thuban/UI/view.py:
7116     Replace the true/false of wxWindows by True/False of Python 2.2.1.
7117    
7118     2003-05-26 Jan-Oliver Wagner <[email protected]>
7119    
7120 bh 1038 * Thuban/UI/tableview.py (LayerTableFrame.__init__): If there is
7121     already a selection present, update the grid accordingly.
7122 jan 1033
7123     * Thuban/UI/mainwindow.py (MainWindow.TableShow): Make the dialog
7124     resizeable and increase its initial size.
7125    
7126 frank 1030 2003-05-26 Frank Koormann <[email protected]>
7127    
7128     Table export functionality
7129    
7130     * Thuban/Model/table.py (DBFTable.Width, MemoryTable.Width):
7131     Return width (in characters) for a column.
7132     (DBFTable.Precision, MemoryTable.Precision): Return decimal precision.
7133     (table_to_dbf): Write table to dbf file.
7134     (table_to_csv): Write table to csv file.
7135    
7136     * Thuban/Model/transientdb.py (TransientTableBase.Width,
7137     TransientTableBase.Precision): Return column width and precision.
7138    
7139     * Thuban/UI/tableview.py (QueryTableFrame.OnSaveAs): Call table_to_dbf
7140     or table_to_csv depending on file selection.
7141    
7142     * test/test_dbf_table.py:
7143     Test table_to_dbf (extension of former part of test).
7144    
7145     * test/test_csv_table.py:
7146     Test table_to_csv.
7147    
7148 jan 1021 2003-05-23 Jan-Oliver Wagner <[email protected]>
7149    
7150 jan 1024 * Thuban/UI/join.py (JoinDialog.OnJoin): Use _() for strings.
7151     Use QueryTableFrame instead of TableFrame.
7152 jan 1021
7153 jan 1024 * Thuban/UI/mainwindow.py (MainWindow.LayerShowTable): Prefix the
7154     table window with 'Layer Table:' instead of 'Table:'.
7155    
7156     2003-05-23 Jan-Oliver Wagner <[email protected]>
7157    
7158     Give all tables a title via mix-in TitledObject.LayerShowTable
7159    
7160 jan 1021 * Thuban/Model/base.py (TitledObject.SetTitle): Call method 'issue'
7161     only if it exists.
7162    
7163     * Thuban/Model/table.py (DBFTable, MemoryTable): mix-in TitledObject
7164     and call its init-method with a default title. Remove Title() method.
7165    
7166     * Thuban/Model/transientdb.py (TransientTable, TransientJoinedTable,
7167     AutoTransientTable): mix-in TitledObject and call its init-method with
7168     a default title. Remove Title() method.
7169    
7170 bh 1017 2003-05-23 Bernhard Herzog <[email protected]>
7171    
7172     * Thuban/Model/session.py (Session.AddShapeStore): Define
7173     AddShapeStore analogously to AddTable.
7174    
7175     * test/test_session.py (TestSessionSimple.test_add_shapestore):
7176     New. Test for AddShapeStore
7177    
7178 jan 1015 2003-05-23 Jan-Oliver Wagner <[email protected]>
7179    
7180     Introducing QueryTableFrame and a very coarse ShowTable implementation.
7181    
7182     * Thuban/UI/tableview.py (LayerTableFrame, QueryTableFrame): Split the
7183     class LayerTableFrame into two classes, LayerTableFrame and QueryTableFrame.
7184     The latter implements the selection GUI without dependency on a layer.
7185     LayerTableFrame now is derived from QueryTableFrame and connects
7186     to a layer.
7187    
7188     * Thuban/UI/mainwindow.py (MainWindow.TableShow): A very coarse
7189     implementation that still needs work.
7190    
7191     * Thuban/Model/layer.py (Layer.TreeInfo): Added filename.
7192    
7193 frank 1011 2003-05-22 Frank Koormann <[email protected]>
7194    
7195     * Thuban/Model/transientdb.py (TransientJoinedTable.__init__):
7196     Added "outer_join = False" as optional parameter.
7197     (TransientJoinedTable.create): If outer join is true, perform a
7198     "LEFT OUTER JOIN" instead of "JOIN", which preserves all records of
7199     the left table. Records not matching are filled with 0 / None.
7200    
7201     * Thuban/UI/join.py (JoinDialog.__init__): Checkbox for outer join.
7202     (JoinDialog.OnJoin): Consider outer join check box.
7203    
7204 bh 1006 2003-05-22 Bernhard Herzog <[email protected]>
7205    
7206 bh 1008 * Thuban/UI/join.py (JoinDialog.OnJoin): Use exc_info in a
7207     somewhat safer way. Storing the traceback in a local variable can
7208     lead to memory leaks
7209    
7210     2003-05-22 Bernhard Herzog <[email protected]>
7211    
7212 bh 1006 * Thuban/UI/join.py (JoinDialog.OnJoin): Make sure to really call
7213     the wxMessageDialog's Destroy() method.
7214    
7215 frank 1004 2003-05-22 Frank Koormann <[email protected]>
7216    
7217     * Thuban/UI/join.py (JoinDialog.__init__): Make use of
7218     TransientTable.Title()
7219    
7220     2003-05-22 Frank Koormann <[email protected]>
7221    
7222     Join Dialog, initial version.
7223    
7224     * Thuban/UI/mainwindow.py (MainWindow.TableJoin): Removed print.
7225    
7226     * Thuban/UI/join.py (JoinDialog): Functional implementation of
7227     former framework. Renamed Table1/Table2 to LeftTable/RightTable
7228     in all occurences.
7229    
7230     * Thuban/Model/transientdb.py (TransientJoinedTable.__doc__):
7231     Typo fixed.
7232    
7233 bh 995 2003-05-22 Bernhard Herzog <[email protected]>
7234    
7235 bh 999 Give the tables titles so that the GUI can display more meaningful
7236     names. For now the titles are fixed but depend on e.g. filenames
7237     or the titles of the joined tables.
7238    
7239     * Thuban/Model/transientdb.py (TransientTable.Title)
7240     (TransientJoinedTable.Title, AutoTransientTable.Title): New.
7241    
7242     * Thuban/Model/table.py (DBFTable.Title, MemoryTable.Title): New.
7243    
7244     * test/test_transientdb.py
7245     (TestTransientTable.test_auto_transient_table_title): New. Test
7246     for the Title method
7247     (TestTransientTable.test_transient_joined_table)
7248     (TestTransientTable.test_transient_table): Add test for the Title
7249     methods
7250    
7251     * test/test_memory_table.py (TestMemoryTable.test_title): New.
7252     Test for the Title method
7253    
7254     * test/test_dbf_table.py (TestDBFTable.test_title): New. Test for
7255     the Title method
7256    
7257     2003-05-22 Bernhard Herzog <[email protected]>
7258    
7259 bh 997 * test/test_layer.py (TestLayer.setUp, TestLayer.tearDown):
7260     Provide a better way to destroy the layers
7261     (TestLayer.test_base_layer, TestLayer.test_arc_layer)
7262     (TestLayer.test_point_layer, TestLayer.test_empty_layer)
7263     (TestLayer.test_polygon_layer, TestLayer.test_get_field_type): Use
7264     the new way to destroy the layers.
7265     (TestLayer.test_derived_store): New. Test for using a layer with a
7266     DerivedShapeStore
7267    
7268     * Thuban/Model/layer.py (Layer.SetShapeStore): Only set the
7269     filename if the shape store actually has one.
7270    
7271     2003-05-22 Bernhard Herzog <[email protected]>
7272    
7273 bh 995 * Thuban/Model/table.py (DBFTable.FileName): New. Accessor method
7274     for the filename
7275    
7276     * test/test_dbf_table.py (TestDBFTable.test_filename): New. Test
7277     for the FileName method
7278     (TestDBFTableWriting.test_write): Fix spelling of filename
7279    
7280 tkoester 993 2003-05-22 Thomas Koester <[email protected]>
7281    
7282     * Thuban/Model/range.py, test/test_range.py: Brought over new Range
7283     from SciParam that now really is immutable.
7284    
7285 frank 992 2003-05-22 Frank Koormann <[email protected]>
7286    
7287     Layer Top/Bottom placement added to legend.
7288    
7289     * Thuban/UI/legend.py
7290     (LegendPanel._OnMoveTop(), LayerPanel._OnMoveBottom): New, methods
7291     bound to tool events.
7292     (LegendTree.MoveCurrentItemTop(), LegendTree.MoveCurrentItemBottom):
7293     New, methods binding the event methods with the map methods.
7294    
7295     * Thuban/Model/map.py (Map.TopLayer(), Map.BottomLayer()): New, place
7296     layer at top/bottom of layer stack.
7297    
7298     * Resources/Bitmaps/top_layer.xpm: New button icon.
7299    
7300     * Resources/Bitmaps/bottom_layer.xpm: New button icon.
7301    
7302 bh 988 2003-05-22 Bernhard Herzog <[email protected]>
7303    
7304     * Thuban/Model/session.py (Session.RemoveTable): New method to
7305     remove tables
7306    
7307     * test/test_session.py (TestSessionSimple.test_remove_table): New.
7308     Test for RemoveTable
7309    
7310 tkoester 986 2003-05-22 Thomas Koester <[email protected]>
7311    
7312     * Thuban/Model/classgen.py: Added short module doc string and CVS id.
7313     (ClassGenerator.GenUniformDistribution): Use new Range __init__, too.
7314    
7315 bh 983 2003-05-22 Bernhard Herzog <[email protected]>
7316    
7317 bh 985 Implement a way to discover dependencies between tables and
7318     shapestores.
7319    
7320     * Thuban/Model/transientdb.py (TransientTableBase.Dependencies)
7321     (TransientJoinedTable.Dependencies)
7322     (AutoTransientTable.SimpleQuery): New. Implement the dependencies
7323     interface
7324     (TransientJoinedTable.__init__): Keep tack of the original table
7325     objects in addition to the corresponding transient tables.
7326    
7327     * Thuban/Model/table.py (DBFTable.Dependencies)
7328     (MemoryTable.Dependencies): New. Implement the dependencies
7329     interface
7330    
7331     * Thuban/Model/data.py (ShapeTable): New. Helper class for
7332     ShapefileStore
7333     (ShapefileStore.__init__): Use ShapeTable instead of
7334     AutoTransientTable
7335     (ShapefileStore.Table, ShapefileStore.Shapefile): Add doc-strings
7336     (ShapefileStore.FileName, ShapefileStore.FileType): New. Accessor
7337     methods for filename and type
7338     (ShapefileStore.Dependencies): New. Implement the dependencies
7339     interface
7340     (DerivedShapeStore): New class to replace SimpleStore. The main
7341     difference to SimpleStore is that it depends not on a shapefile
7342     but another shapestore which expresses the dependencies a bit
7343     better
7344     (SimpleStore.__init__): Add deprecation warning.
7345    
7346     * test/test_dbf_table.py (TestDBFTable.test_dependencies): New.
7347     Test for the Dependencies method.
7348    
7349     * test/test_memory_table.py (TestMemoryTable.test_dependencies):
7350     New. Test for the Dependencies method.
7351    
7352     * test/test_transientdb.py
7353     (TestTransientTable.test_auto_transient_table_dependencies): New.
7354     Test for the Dependencies method.
7355     (TestTransientTable.test_transient_joined_table): Add test for the
7356     Dependencies method.
7357    
7358     * test/test_session.py (TestSessionSimple.setUp)
7359     (TestSessionSimple.tearDown): New. Implement a better way to
7360     destroy the sessions.
7361     (TestSessionSimple.test_initial_state)
7362     (TestSessionSimple.test_add_table): Bind session to self.session
7363     so that it's destroyed by tearDown
7364     (TestSessionSimple.test_open_shapefile): New. Test for
7365     OpenShapefile and the object it returns
7366    
7367     2003-05-22 Bernhard Herzog <[email protected]>
7368    
7369 bh 983 * Thuban/Model/session.py (Session.AddTable): New method to
7370     register tables with the session.
7371     (Session.Tables): Return the tables registered with AddTable too.
7372    
7373     * test/test_session.py (TestSessionSimple.test_add_table): New.
7374     Test case for the AddTable method
7375    
7376 frank 981 2003-05-22 Frank Koormann <[email protected]>
7377    
7378     UI polishing updates: Place main buttons (OK, Cancel, etc) in the
7379     lower right corner, center labels for selections, initialize controls
7380     in reasonable order for keyboard navigation.
7381    
7382     * Thuban/UI/projdialog.py (ProjFrame.__init__, ProjFrame.__doLayout)
7383     (ProjFrame.__DoOnProjAvail): Determine position of current projection
7384     using the wxListBox.FindString() method. Still a problem (#1886)
7385    
7386     * Thuban/UI/classifier.py
7387     (Classifier.__init__, SelectPropertiesDialog.__init__)
7388    
7389     * Thuban/UI/classgen.py (ClassGenDialog.__init__,
7390     (ClassGenDialog.__DoOnGenTypeSelect): Moved initialization of the
7391     different classification types from here to __init__.
7392     (GenUniquePanel.__init__): Set the column width of the first field
7393     in the Field ListCtrl to the full width.
7394    
7395     * Thuban/UI/tableview.py (LayerTableFrame.__init__): Rename 'Save As'
7396     Button to 'Export'. Center Buttons in Selection Box, set Focus to
7397     Grid.
7398     (LayerTableFrame.OnKeyDown()): New, bound to the grid with EVT_KEY_DOWN,
7399     changes focus to the Selection when pressing "Alt-S".
7400    
7401     * Thuban/UI/legend.py (LegendTree.__SetVisibilityStyle): Only gray out
7402     the text if not visible. The italic font sometimes exceeds the
7403     rendering area.
7404    
7405 jonathan 972 2003-05-21 Jonathan Coles <[email protected]>
7406 jonathan 971
7407 jonathan 975 * Thuban/UI/dock.py (DockFrame): Rename references to _OnClose
7408     to OnClose so that Thuban closes correctly.
7409    
7410     * Thuban/UI/mainwindow.py (MainWindow.OnClose): Call
7411     DockFrame.OnClose, not DockFrame._OnClose.
7412    
7413     2003-05-21 Jonathan Coles <[email protected]>
7414    
7415 jonathan 971 * Thuban/Model/classgen.py (ClassGenerator.GenQuantiles): Remove
7416     references to 'inf' and use new Range __init__ to pass floats
7417     directly rather than converting them to strings first.
7418     Fixes RTBug #1876.
7419    
7420     * Thuban/Model/classification.py (ClassGroupRange.SetRange):
7421     Use new Range ___init__ to pass floats.
7422    
7423     * Thuban/Model/layer.py (RasterLayer.__init__): Test if the
7424     filename is a valid image file. Throw IOError otherwise.
7425    
7426     * Thuban/Model/range.py: Brought over new Range from SciParam that
7427     is immutable and has an __init__ which can accept floats.
7428    
7429     * Thuban/UI/mainwindow.py (MainWindow.AddLayer): Move OpenShapefile
7430     into try block. AddLayer doesn't throw any exceptions anymore.
7431     (MainWindow.AddRasterLayer): Move constructor of RasterLayer into
7432     try block.
7433    
7434     * Thuban/UI/projdialog.py (GeoPanel.__init__): Put Degrees as
7435     the first item in choices. Fixes RTBug #1882.
7436    
7437     * Thuban/UI/renderer.py (MapRenderer.render_map): Check if scale
7438     has gone to 0 which is a serious problem. abort.
7439     (MapRenderer.draw_raster_layer): Catch IOError seperately and
7440     print the error from GDAL.
7441    
7442     * Thuban/UI/tableview.py (TableGrid.__init__): Call
7443     ToggleEventListeners to turn on listening.
7444     (TableGrid.ToggleEventListeners): New. Turns event listening on
7445     and off so as to prevent excessive messages.
7446     (LayerTableFrame.OnQuery): Use TableGrid.ToggleEventListeners
7447     to suppress excessive messages when selecting many rows.
7448     Fixes RTBug #1880.
7449    
7450     * Thuban/UI/view.py: Added checks against if scale == 0. This
7451     is a serious problem that can occur when an image without
7452     geo data is loading and causes the map projection bounds to
7453     go to infinity. Right now, the solution is to simply try
7454     to recover.
7455    
7456     * extensions/thuban/cpl_mfile.cpp (MFILEClose): Make sure
7457     to set the MFILEReceiver attributes even if the data is NULL.
7458    
7459     * extensions/thuban/gdalwarp.cpp: Improved the error handling
7460     and passed GDAL messages back up to the Python layer. Also
7461     tried to fix some memory leaks that were present in the original
7462     utility but didn't matter because the program aborted.
7463    
7464     * test/test_range.py: Copied over tests from SciParam. Removed
7465     tests against importing. Fixes RTBug #1867.
7466    
7467 bh 958 2003-05-21 Bernhard Herzog <[email protected]>
7468    
7469     * test/test_load.py: Remove unused imports and restructure the
7470     test code
7471     (LoadSessionTest): Split into one class for each test and turn
7472     LoadSessionTest itself into the base class for all such session
7473     tests.
7474     (ClassificationTest): New base class for load tests that test
7475     classifications
7476     (TestSingleLayer, TestLayerVisibility, TestClassification)
7477     (TestLabels, TestLayerProjection, TestRasterLayer): New classes
7478     for the individual tests
7479    
7480     * test/support.py (FileLoadTestCase.filename): New base class for
7481     file loading tests
7482    
7483 jan 955 2003-05-21 Jan-Oliver Wagner <[email protected]>
7484    
7485     * Resources/Projections/defaults.proj: Renamed 'Universal Transverse
7486     Mercator' to 'UTM Zone 32' as a more convenient example.
7487     Added 'Gauss Krueger Zone 6'.
7488    
7489     * Data/iceland_sample_raster.thuban: political polygon now
7490     filled transparent to have the raster image visible at once.
7491    
7492 frank 952 2003-05-21 Frank Koormann <[email protected]>
7493    
7494     * Thuban/UI/mainwindow.py (MainWindow): Renamed _OnClose() back to
7495     OnClose() to keep in sync with extensions. Internally Thuban
7496     still uses "underscored" names.
7497    
7498 jonathan 949 2003-05-20 Jonathan Coles <[email protected]>
7499    
7500     This puts back Raster layer support. These layers support projections
7501     through the GDAL library. Currently, the CVS version is being used.
7502     There are no Debian packages available although this may change soon.
7503     A GDAL driver was extended to support writing to memory rather to
7504     files.
7505    
7506     There is still some work that needs to be done, such as some error
7507     handling when loading invalid images or when there is a problem
7508     projecting the image. This putback simply checks in the majority
7509     of the work.
7510    
7511     * setup.py: Add gdalwarp library extension.
7512    
7513     * Thuban/Model/layer.py (BaseLayer.HasClassification): New.
7514     Defaults to False, but can be overridden by subclasses if they
7515     support classification.
7516     (RasterLayer): New. Defines a new layer that represents an
7517     image.
7518    
7519     * Thuban/Model/load.py (SessionLoader.__init__): Add rasterlayer
7520     tag handler.
7521     (SessionLoader.start_layer): Encode the filename.
7522     (SessionLoader.start_rasterlayer, SessionLoader.end_rasterlayer):
7523     New. Supports reading a rasterlayer tag.
7524    
7525     * Thuban/Model/map.py (Map.BoundingBox): Fix typo in comment.
7526    
7527     * Thuban/Model/save.py (XMLWriter.encode): Don't assume that we
7528     get a string in Latin1. If we get such as string convert it to
7529     unicode first, otherwise leave if alone before encoding.
7530     (SessionSaver.write_layer): Add support for writing both Layers
7531     and RasterLayers.
7532    
7533     * Thuban/Model/transientdb.py (AutoTransientTable.SimpleQuery):
7534     The right argument may not be a string, it could also be a Column.
7535    
7536     * Thuban/UI/application.py (ThubanApplication.CreateMainWindow):
7537     Make initial window size 600x400. Fixes RTBug #1872.
7538    
7539     * Thuban/UI/classifier.py (Classifier.__init__): Rearrange how
7540     the dialog is constructed so that we can support layers that
7541     do not have classifications.
7542     (Classifier._OnTry): Only build a classification if the layer
7543     supports one.
7544    
7545     * Thuban/UI/legend.py: Change all checks that a layer is an
7546     instance of Layer into checks against BaseLayer.
7547     (LegendTree.__FillTreeLayer): Only add children to a branch if
7548     the layer supports classification.
7549    
7550     * Thuban/UI/mainwindow.py (MainWindow.NewSession,
7551     MainWindow.OpenSession): Don't proceed with an action if the
7552     user chooses Cancel when they are asked to save changes.
7553     (MainWindow.AddRasterLayer): New. Open a dialog to allow the
7554     user to select an image file. Create a new RasterLayer and add
7555     it to the map.
7556    
7557     * Thuban/UI/renderer.py (MapRenderer.render_map): Add support
7558     for rendering RasterLayer layers.
7559     (MapRenderer.draw_raster_layer): Actually method that calls
7560     the GDALWarp python wrapper and constructs an image from the
7561     data returned.
7562    
7563     * Thuban/UI/tableview.py (LayerTableFrame.__init__): Change the
7564     Choices symbols to match those used in the table query method.
7565     Replace deprecated method calls on table with new method names.
7566    
7567     * Thuban/UI/view.py (MapCanvas.set_view_transform): Try to limit
7568     how small the scale can get. This still needs more testing.
7569    
7570     * extensions/thuban/bmpdataset.cpp: New, but copied from GDAL.
7571     Provides a driver to output in .bmp format.
7572    
7573     * extensions/thuban/cpl_mfile.cpp, extensions/thuban/cpl_mfile.h:
7574     New. Provides IO routines which write to memory, rather than a file.
7575    
7576     * extensions/thuban/gdalwarp.cpp: New, but basically a direct copy
7577     of the gdalwarp utility provided in GDAL. Added function calls
7578     that can be accessed from python.
7579    
7580     * Data/iceland_sample_raster.thuban: New. Sample file that uses
7581     a raster layer.
7582    
7583     * Data/iceland/island.tfw, Data/iceland/island.tif: New. Raster
7584     layer image data.
7585    
7586     * Doc/thuban.dtd: Added rasterlayer attribute definition.
7587    
7588     * test/test_layer.py, test/test_load.py, test/test_save.py: Added
7589     tests associated with the raster layer code.
7590    
7591     * test/test_transientdb.py
7592     (TestTransientTable.test_auto_transient_table_query): Added a test
7593     for using a Column object as the "right" parameter to a query.
7594    
7595 frank 924 2003-05-19 Frank Koormann <[email protected]>
7596    
7597 frank 927 * Thuban/version.py (get_changelog_date):
7598     Catch exceptions if ChangeLog does not exist.
7599    
7600     * Thuban/UI/view.py (MapCanvas.Export): Bugfix
7601    
7602     2003-05-19 Frank Koormann <[email protected]>
7603    
7604 frank 924 Extended version information for Thuban
7605    
7606     * Thuban/version.py: New, version information for Thuban: Last
7607     modification date and last ChangeLog entry date.
7608    
7609     * Thuban/UI/mainwindow.py (MainWindow.About()): Extended version
7610     information: Display Thuban, wxPython and Python version.
7611    
7612 bh 919 2003-05-16 Bernhard Herzog <[email protected]>
7613    
7614 bh 921 * Thuban/Model/save.py: Remove some unused imports including the
7615     __future__ import for nested_scopes as Thuban relies on Python 2.2
7616     now.
7617     (XMLWriter.encode): Remove the special case for a None argument.
7618     In the saver encode is always called with a string argument.
7619    
7620     2003-05-16 Bernhard Herzog <[email protected]>
7621    
7622 bh 919 * Thuban/UI/__init__.py: Remove the work-around for the locale bug
7623     in wxPython (at least when usinvg wxGTK) prior to 2.4. The symptom
7624     of the bug was that e.g. float("1.2") would fail. Thuban now
7625     requires 2.4.x.
7626    
7627 frank 917 2003-05-16 Frank Koormann <[email protected]>
7628    
7629     Printing enhancement and WMF export (under Win32)
7630    
7631     * Thuban/UI/renderer.py (ExportRenderer): New, derived from
7632     ScreenRenderer. Renders Map, Legend and Scalebar for export.
7633     (PrinterRenderer): New, derived from ExportRenderer. Replaces the old
7634     PrintRender.
7635    
7636     * Thuban/UI/view.py (MapPrintout.__init__): Enhanced parameter set
7637     to fullfil information needed for PrinterRenderer.
7638     (MapCanvas.Export): New. Export Map (currently only to WMF on Win32).
7639     (MapCanvas.Print): Adapted to new MapPrintout.
7640     (OutputTransform): General calculations to transform from canvas
7641     coordinates to export/printing devices.
7642    
7643     * Thuban/UI/mainwindow.py (MainWindow.ExportMap()): New. Added also
7644     new method_command to call ExportMap, with platform dependency (only
7645     __WXMSW__)
7646    
7647     * Thuban/UI/scalebar.py (ScaleBar.DrawScaleBar): Position and Size
7648     of scalebar drawing area as new parameters.
7649    
7650     * Thuban/Model/scalebar.py (roundInterval): round long instead of int
7651    
7652     * Thuban/UI/legend.py (ScalebarBitmap.__SetScale):
7653     Update to extended scalebar.DrawScalebar header.
7654    
7655     * test/test_export.py: New, test Thuban.UI.view.OutputTransform()
7656    
7657     * test/test_scalebar.py: Made test executable as standalone.
7658    
7659 bh 908 2003-05-16 Bernhard Herzog <[email protected]>
7660    
7661     * Thuban/Model/table.py (Table): Remove this compatibility alias
7662     for DBFTable.
7663    
7664     * test/test_table.py: Import DBFTable as Table because that alias
7665     doesn't exist anymore.
7666    
7667     * Thuban/UI/classgen.py: Remove some unused imports
7668    
7669 jonathan 906 2003-05-14 Jonathan Coles <[email protected]>
7670    
7671     * Thuban/Model/classgen.py (ClassGenerator.GenSingletonsFromList):
7672     Fix docstring.
7673     (ClassGenerator.GenUniformDistribution): Fix spelling of method name.
7674     (ClassGenerator.GenQuantiles): Use the left/right brackets and min/max
7675     values of the supplied range to determine the beginning and end
7676     bounds of the generated classes.
7677    
7678     * Thuban/Model/range.py (Range.number_re): Now accepts floats that
7679     do not have a leading 0 (.5 is now accepted as well as 0.5).
7680    
7681     * Thuban/UI/classgen.py (ClassGenDialog.OnOK): Fix name of method
7682     call to ClassGenerator.GenUniformDistribution.
7683    
7684     * Thuban/UI/projdialog.py (ProjFrame.__do_layout): Fix Windows
7685     layout bug with the 'Projection' label.
7686    
7687     * test/support.py (FloatTestCase): New. Needed for the Range tests.
7688    
7689     * test/test_range.py: New. Imported from SciParam.
7690    
7691 jonathan 897 2003-05-12 Jonathan Coles <[email protected]>
7692    
7693 jonathan 899 * Thuban/UI/classgen.py (GenQuantilesPanel.GetList): Replace call
7694     to table.UniqueValues() with calls that retrieve all the values
7695     from the table. This will need to be replaced by a method on table
7696     which can simply return the list (perhaps more efficiently).
7697    
7698     2003-05-12 Jonathan Coles <[email protected]>
7699    
7700 jonathan 897 The return value of ClassGenerator.CalculateQuantiles has changed.
7701     Refer to the documentation for details.
7702    
7703     * test/test_classgen.py: Modified Quantile tests to use the
7704     new return values.
7705    
7706     * Thuban/Model/classgen.py
7707     (ClassGenerator.GenQuantiles): Add comments describing the parameters,
7708     use new return values from CalculateQuantiles to produce the correct
7709     range bounds in the Classification.
7710     (ClassGenerator.CalculateQuantiles): Add more comments describing
7711     the return values and parameters. Make minor adjustments to improve
7712     the legibility of the code. Fix problem with adjusted not being set
7713     in most cases.
7714    
7715 frank 893 2003-05-12 Frank Koormann <[email protected]>
7716    
7717     * Thuban/Model/save.py (XMLWriter.encode()): Explicite call to unicode
7718     and latin1. Fixes #1851 finally.
7719    
7720 jonathan 889 2003-05-09 Jonathan Coles <[email protected]>
7721    
7722 jonathan 897 * test/test_classgen.py: New. Tests the Quantile algorithm.
7723    
7724     * Thuban/Model/classgen.py (ClassGenerator.CalculateQuantiles):
7725     Clean up debugging statement, add comments, fix a small bug in the
7726     returned adjusted percentiles.
7727    
7728     2003-05-09 Jonathan Coles <[email protected]>
7729    
7730 jonathan 889 Introduces Range class from SciParam into the ClassGroupRange class,
7731     and such ranges can now be saved and loaded from disk.
7732    
7733     Quantiles are now available in the Classification Generator.
7734    
7735     Initial support for building Queries on a table. Doesn't do anything
7736     but run some tests.
7737    
7738     * Thuban/Model/classification.py: Explicit imports.
7739     (ClassGroupRange): Use the Range class to store the underlying
7740     range information. The interface remains the same, except for
7741     GetRange(), and you can also supply a Range object as the min
7742     parameter to SetRange or __init__.
7743    
7744     * Thuban/Model/load.py (XMLReader.encode): New. Encodes the given
7745     string appropriately for use in Thuban. Fixes RTbug #1851.
7746     (SessionLoader.end_projection): Handle the context of the
7747     projection tag a bit better by looking at what objects are not
7748     None. There was an assumption that a projection tag for a map
7749     could occur before any layers.
7750     (SessionLoader.start_clrange): Provide backward compatibility for
7751     reading min/max values as well as the new range parameter.
7752    
7753     * Thuban/Model/map.py: Explicit imports.
7754    
7755     * Thuban/Model/resource.py: Import _.
7756     (ProjFileSaver.write): write header using projfile.dtd.
7757    
7758     * Thuban/Model/save.py: Explicit imports.
7759     (XMLWriter.encode): New. Encode the given string from a format
7760     used by Thuban into UTF-8. Fixes RTbug #1851.
7761    
7762     * Thuban/UI/classgen.py: Explicit imports.
7763     (ClassGenDialog.__init__): Clean up the code and add support
7764     for Quantiles.
7765     (ClassGenDialog.OnOK): Add support for Quantiles.
7766     (GenQuantilesPanel): New. Input panel for Quantiles.
7767     (ClassGenerator, CustomRamp, MonochromaticRamp, GreyRamp, RedRamp,
7768     GreenRamp, BlueRamp, HotToColdRamp): Move to Thuban/Model/classgen.py
7769    
7770     * Thuban/Model/classgen.py: New. Contains all the classes named above.
7771    
7772     * Thuban/UI/classifier.py: Explicit imports.
7773     (ClassTable.GetValueAsCust, ClassTable.__ParseInput,
7774     ClassTable.SetValueAsCustom): Reworked to use new Range class.
7775    
7776     * Thuban/UI/legend.py: Explicit imports.
7777    
7778     * Thuban/UI/mainwindow.py: Add support for the Join Dialog. Added
7779     a Table menu and associated method calls.
7780     (MainWindow.choose_color): Removed. No longer needed.
7781    
7782     * Thuban/UI/projdialog.py (ProjFrame.__VerifyButtons): Save button
7783     should be disabled if no projection is selected in the available
7784     list.
7785    
7786     * Thuban/UI/renderer.py: Explicit imports.
7787    
7788     * Thuban/UI/tableview.py (TableGrid.OnRangeSelect): Fix some issues
7789     with correctly selecting the rows and issuing the right events.
7790     Be sure to call Skip() to allow the grid to do some of its own
7791     handling which allows the rows to actually be selected.
7792     (LayerTableGrid.select_shapes): Rename from select_shape. Supports
7793     selecting multiple shapes.
7794     (LayerTableFrame): Support for building Queries.
7795     (LayerTableFrame.select_shapes): Allow multiple shapes to be selected.
7796    
7797     * Thuban/UI/tree.py: Explicit imports.
7798    
7799     * Thuban/UI/view.py (MapCanvas): Delegate "SelectedShapes" so the
7800     table view can call it.
7801    
7802     * test/test_classification.py: Explicit imports.
7803     (TestClassification.test_ClassGroupRange): Fix test for new
7804     Range class.
7805    
7806     * Doc/thuban.dtd: Add range parameter for clrange.
7807    
7808     * Thuban/Model/range.py: Taken from SciParam. Used as the underlying
7809     object in ClassGroupRange, and also uesd for inputting ranges in
7810     the classifer table and elsewhere.
7811    
7812     * Thuban/UI/join.py: New. Initial Join dialog. No real functionality
7813     yet.
7814    
7815 frank 872 2003-05-09 Frank Koormann <[email protected]>
7816    
7817     * Thuban/UI/scalebar.py (DrawScaleBar): Draw only if interval > 0.0.
7818    
7819 frank 860 2003-05-08 Frank Koormann <[email protected]>
7820    
7821 frank 870 Coding style updates
7822    
7823     * test/test_scalebar.py: Replaced tab indentation by spaces.
7824    
7825     * Thuban/UI/scalebar.py: Explicit imports.
7826    
7827     2003-05-08 Frank Koormann <[email protected]>
7828    
7829 frank 867 * Thuban/UI/scalebar.py
7830     (ScaleBar.DrawScalebar): Format string bug fixed.
7831    
7832     2003-05-08 Frank Koormann <[email protected]>
7833    
7834 frank 865 Reorganization of scalebar component (no wx in Thuban/Model)
7835    
7836     * Thuban/Model/scalebar.py: Rendering moved to Thuban/UI/scalebar.py
7837     (deriveInterval):
7838     Calculate scalebar interval and unit which fits in width for scale.
7839     (roundInterval): Round float.
7840    
7841     * Thuban/UI/scalebar.py (ScaleBar): Scalebar rendering
7842    
7843     * test/test_scalebar.py: Test for Thuban/Model/scalebar.py methods.
7844    
7845     * Thuban/UI/legend.py: Import Thuban.UI.scalebar
7846    
7847     2003-05-08 Frank Koormann <[email protected]>
7848    
7849 frank 860 * Thuban/UI/legend.py (ScalebarBitmap.SetCanvas):
7850     Initialize ScaleBar with canvas.map
7851    
7852     * Thuban/Model/scalebar.py (ScaleBar.roundInterval()): New,
7853     round intervals to display smarter lengths
7854     (ScaleBar.DrawScalebar): Draw Scalebar only if the map contains a
7855     layer. If the maps has no projection applied grey the scalebar.
7856    
7857 frank 857 2003-05-07 Frank Koormann <[email protected]>
7858    
7859     Basic Scalebar features added.
7860    
7861     * Thuban/Model/scalebar.py (ScaleBar): New, scalebar rendering.
7862    
7863     * Thuban/UI/legend.py (LegendPanel): Added scalebar bitmap
7864     (ScaleBarBitmap): New, links the scalebar bitmap with view messages
7865     and the renderer.
7866    
7867     * Thuban/UI/view.py (MapCanvas.set_view_transform): Issue SCALE_CHANGED.
7868    
7869     * Thuban/UI/messages.py: SCALE_CHANGED added.
7870    
7871 bh 850 2003-05-07 Bernhard Herzog <[email protected]>
7872    
7873 bh 852 * Thuban/Model/session.py (Session.__init__): New instance
7874     variable shapestores to hold a list of all open shapestore objects
7875     (Session.ShapeStores): New. Accessor method for the shapestores
7876     list.
7877     (Session._add_shapestore, Session._clean_weak_store_refs): New.
7878     Internal methods to maintain the shapestores list.
7879     (Session.Tables): New. Return all tables open in the session.
7880     (Session.OpenShapefile): Insert the new ShapeStore into the
7881     shapestores list.
7882    
7883     * test/test_session.py (TestSessionSimple.test_initial_state): Add
7884     tests for ShapeStores and Tables
7885     (TestSessionWithContent.test_shape_stores)
7886     (TestSessionWithContent.test_tables): New. Test cases for
7887     ShapeStores and Tables
7888    
7889     2003-05-07 Bernhard Herzog <[email protected]>
7890    
7891 bh 850 * Thuban/Model/transientdb.py (TransientTableBase.ReadRowAsDict):
7892     Add comments about the optimizations used.
7893     (AutoTransientTable.ReadValue, TransientTableBase.ReadValue): New.
7894     Implement the ReadValue table interface method.
7895    
7896     * test/test_transientdb.py
7897     (TestTransientTable.run_iceland_political_tests)
7898     (TestTransientTable.test_transient_joined_table): Add tests for
7899     ReadValue
7900    
7901 frank 848 2003-05-07 Frank Koormann <[email protected]>
7902    
7903     * Resources/Bitmaps/fulllayerextent.xpm,
7904     Resources/Bitmaps/fullselextent.xpm: Replaced the place holders with
7905     new icons.
7906    
7907 bh 840 2003-05-06 Bernhard Herzog <[email protected]>
7908    
7909 bh 846 * Thuban/Model/transientdb.py (AutoTransientTable.SimpleQuery):
7910     New. Simply delegate to the transient table's version.
7911    
7912     * test/test_transientdb.py
7913     (TestTransientTable.test_auto_transient_table_query): New. Test
7914     case for AutoTransientTable's SimpleQuery
7915    
7916     2003-05-06 Bernhard Herzog <[email protected]>
7917    
7918 bh 843 * Thuban/Model/transientdb.py (TransientTableBase.SimpleQuery):
7919     Implement a simple query method for the query dialog
7920     (TransientTableBase.create): Add an INTEGER PRIMARY KEY that holds
7921     the row index or shapeid.
7922     (TransientTable.create): Insert the right value of the row index
7923     (TransientJoinedTable.create): Copy the row index of the left
7924     table to the joined result table
7925    
7926     * test/test_transientdb.py
7927     (TestTransientTable.test_transient_table_read_twice): Fix
7928     doc-string
7929     (TestTransientTable.test_transient_table_query): New. Test for the
7930     SimpleQuery method
7931    
7932     2003-05-06 Bernhard Herzog <[email protected]>
7933    
7934 bh 840 Convert all table users to use the new table interface. This only
7935     covers Thuban itself, not GREAT-ER or other applications built on
7936     Thuban yet, so the compatibility interface stays in place for the
7937     time being but it now issues DeprecationWarnings.
7938    
7939     Finally, the new Table interface has a new method, HasColumn.
7940    
7941     * Thuban/Model/table.py (OldTableInterfaceMixin): All methods
7942     issue deprecation warnings when they're. The warnings refer to the
7943     caller of the method.
7944     (OldTableInterfaceMixin.__deprecation_warning): New. Helper method
7945     for the deprecation warnings
7946    
7947     * test/test_table.py: Ignore the deprecation warnings for the old
7948     table in the tests in this module. The purpose of the tests is to
7949     test the old interface, after all.
7950    
7951     * test/test_transientdb.py
7952     (TestTransientTable.run_iceland_political_tests): Use the
7953     constants for the types. Add a test for HasColumn
7954     (TestTransientTable.test_transient_joined_table): Adapt to new
7955     table interface. Add a test for HasColumn
7956     (TestTransientTable.test_transient_table_read_twice): Adapt to new
7957     table interface
7958    
7959     * Thuban/UI/tableview.py (DataTable.SetTable, DataTable.GetValue):
7960     Adapt to new table interface
7961    
7962     * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Adapt to
7963     new table interface
7964    
7965     * Thuban/UI/controls.py (RecordListCtrl.fill_list)
7966     (RecordTable.SetTable): Adapt to new table interface
7967    
7968     * Thuban/UI/classifier.py (Classifier.__init__)
7969     (Classifier.__init__): Adapt to new table interface
7970    
7971     * Thuban/UI/classgen.py (ClassGenDialog.__init__)
7972     (GenUniformPanel._OnRetrieve, GenUniquePanel._OnRetrieve): Adapt
7973     to new table interface
7974    
7975     * Thuban/Model/transientdb.py (TransientTableBase.HasColumn)
7976     (AutoTransientTable.HasColumn): Implement the new table interface
7977     method
7978     (AutoTransientTable.ReadRowAsDict, AutoTransientTable.ValueRange)
7979     (AutoTransientTable.UniqueValues): Adapt to new table interface
7980    
7981     * Thuban/Model/layer.py (Layer.SetShapeStore, Layer.GetFieldType):
7982     Adapt to new table interface
7983    
7984     * test/test_layer.py (TestLayer.open_shapefile): Helper method to
7985     simplify opening shapefiles a bit easier.
7986     (TestLayer.test_arc_layer, TestLayer.test_polygon_layer)
7987     (TestLayer.test_point_layer): Use the new helper method
7988     (TestLayer.test_get_field_type): New. Test for the GetFieldType
7989     method
7990    
7991     * test/test_dbf_table.py (TestDBFTable.test_has_column): Test for
7992     the new table method
7993    
7994     * test/test_memory_table.py (TestMemoryTable.test_has_column):
7995     Test for the new table method HasColumn
7996    
7997 jonathan 833 2003-05-06 Jonathan Coles <[email protected]>
7998    
7999     Addresses the "Selection Extent" wish of RTbug #1787.
8000    
8001     * Resources/Bitmaps/fulllayerextent.xpm,
8002     Resources/Bitmaps/fullselextent.xpm: Bitmaps for layer and selection
8003     extent. These are just place holders for the real bitmaps.
8004    
8005     * Thuban/Model/layer.py (Shape): Since a Shape is immutable only
8006     calculate the bounding box once (the first time compute_bbox() is
8007     called).
8008     (Layer.ShapesBoundingBox): New. Given a list of shape ids, return
8009     the bounding box for the shapes in lat/long coordinates.
8010    
8011     * Thuban/UI/mainwindow.py: Added new "Full selection extent" menu
8012     option.
8013     (MainWindow.has_selected_shapes): New. Returns true if there are
8014     any selected shapes.
8015     (MainWindow.FullSelectionExtent): New. Calls
8016     MapCanvas.FitSelectedToWindow() when the user selects the menu option.
8017     (_has_selected_shapes): New. Returns true if there are any
8018     selected shapes.
8019    
8020     * Thuban/UI/selection.py (Selection.HasSelectedShapes): New. Returns
8021     true if there are any selected shapes.
8022    
8023     * Thuban/UI/view.py (MapCanvas): Added delegated method
8024     HasSelectedShapes.
8025     (MapCanvas.FitSelectedToWindow): New. Centers and scales any selected
8026     shapes on the canvas using the map projection (if any).
8027    
8028     * test/test_layer.py (TestLayer.test_arc_layer): Add some tests
8029     for Layer.ShapesBoundingBox().
8030    
8031 bh 826 2003-05-06 Bernhard Herzog <[email protected]>
8032    
8033     * Resources/Projections/defaults.proj: Fix spelling of Mercator
8034    
8035 jonathan 823 2003-05-05 Jonathan Coles <[email protected]>
8036    
8037     Addresses the "Full Layer Extent" wish of RTbug #1787.
8038    
8039     * Resources/Projections/defaults.proj: Added UK National Grid.
8040    
8041     * Thuban/UI/mainwindow.py: Added new "Full layer extent" menu option.
8042     (MainWindow.FullLayerExtent): New. Calls MapCanvas.FitLayerToWindow()
8043     when the user selects the menu option.
8044    
8045     * Thuban/UI/view.py (MapCanvas.FitLayerToWindow): New. Centers and
8046     scales the given layer on the canvas using the map projection.
8047    
8048 bh 819 2003-05-05 Bernhard Herzog <[email protected]>
8049    
8050     Convert the table implementations to a new table interface. All
8051     tables use a common mixin class to provide backwards compatibility
8052     until all table users have been updated.
8053    
8054     * Thuban/Model/table.py (OldTableInterfaceMixin): Mixin class to
8055     provide backwards compatibility for table classes implementing the
8056     new interface
8057     (DBFTable, MemoryTable): Implement the new table interface. Use
8058     OldTableInterfaceMixin as base for compatibility
8059     (DBFColumn, MemoryColumn): New. Column description for DBFTable
8060     and MemoryTable resp.
8061    
8062     * test/test_dbf_table.py: New. Test cases for the DBFTable with
8063     the new table interface.
8064    
8065     * test/test_memory_table.py: New. Test cases for the MemoryTable
8066     with the new table interface.
8067    
8068     * test/test_table.py: Document the all tests in this file as only
8069     for backwards compatibility. The equivalent tests for the new
8070     interface are in test_memory_table.py and test_dbf_table.py
8071     (MemoryTableTest.test_read): field_info should be returning tuples
8072     with four items
8073     (MemoryTableTest.test_write): Make doc-string a more precise.
8074    
8075     * Thuban/Model/transientdb.py (TransientTableBase): Convert to new
8076     table interface. Derive from from OldTableInterfaceMixin for
8077     compatibility.
8078     (TransientTableBase.create): New intance variable column_map to
8079     map from names and indices to column objects
8080     (TransientTable.create): Use the new table interface of the input
8081     table
8082     (AutoTransientTable): Convert to new table interface. Derive from
8083     from OldTableInterfaceMixin for compatibility.
8084     (AutoTransientTable.write_record): Removed. It's not implemented
8085     yet and we still have to decide how to handle writing with the new
8086     table and data framework.
8087    
8088     * test/test_transientdb.py
8089     (TestTransientTable.run_iceland_political_tests)
8090     (TestTransientTable.test_transient_joined_table): Use the new
8091     table interface
8092    
8093 jonathan 817 2003-05-05 Jonathan Coles <[email protected]>
8094    
8095     This is namely a collection of UI updates to improve user interactivity.
8096     Tabbing between controls now exists and you can use ESC to close dialog
8097     boxes; ENTER will active the default button.
8098    
8099     * Thuban/UI/classgen.py (ClassGenDialog.__init__): Rearrange the
8100     order that the controls are created so that tabbing works correctly.
8101     (ClassGenDialog.OnOK): Renamed from _OnGenerate() so that the
8102     wxDialog can handle the default button correctly.
8103     (ClassGenDialog.OnCancel): Renamed from _OnCloseBtn() for the
8104     same reasons as for OnOK.
8105     (GenUniformPanel._OnRetrieve): Call wxBeginBusyCursor/wxEndBusyCursor
8106     when we ask the table for the maximum/minimum values of a field
8107     which could take a very long time.
8108    
8109     * Thuban/UI/classifier.py (Classifier.__init__): Rearrange the
8110     order that the controls are created so that tabbing works correctly.
8111     (SelectPropertiesDialog.__init__): Rearrange the order that the
8112     controls are created so that tabbing works correctly.
8113    
8114     * Thuban/UI/dialogs.py: Copied NonModalDialog box and changed it
8115     to derive from a wxDialog but behave like the original implementation
8116     which was derived from a wxFrame. wxDialog provides useful key
8117     handling functionality like ESC calling OnCancel and ENTER calling
8118     OnOK which is lost with wxFrame.
8119    
8120     * Thuban/UI/mainwindow.py: Add "..." to menu items that will open
8121     new dialogs.
8122    
8123     * Thuban/UI/projdialog.py (ProjFrame.__init__): Rearrange the
8124     order that the controls are created so that tabbing works correctly.
8125     (ProjFrame.OnApply): Renamed from _OnTry() to use wxDialog behaviour.
8126     (ProjFrame.OnOK): Renamed from _OnOK() to use wxDialog behaviour.
8127     (ProjFrame.OnCancel): Renamed from _OnClose() to use wxDialog behaviour.
8128     (ProjPanel.__init__): Add "Airy" to the list of ellipsoids so we
8129     can provide the "UK National Grid" as a default projection.
8130     (UTMPanel.__init__): Rearrange the order that the controls are
8131     created so that tabbing works correctly.
8132    
8133 bh 809 2003-05-05 Bernhard Herzog <[email protected]>
8134    
8135 bh 811 * extensions/thuban/wxproj.cpp: Fix some of the comments.
8136     (project_point): If a map projection but no layer projection is
8137     given, convert degrees to radians before applying the map
8138     projection.
8139    
8140 bh 809 * Thuban/UI/tableview.py (TableGrid.disallow_messages)
8141     (TableGrid.allow_messages): New methods to make it possible to
8142     inhibit message sending.
8143     (TableGrid.issue): Only send the message if not inhibited.
8144     (LayerTableGrid.select_shape): Use the new methods to make sure
8145     that no ROW_SELECTED message is sent while we're updating the
8146     selected rows to match the selected shapes.
8147    
8148 jan 807 2003-05-02 Jan-Oliver Wagner <[email protected]>
8149    
8150     Implementation of MemoryTable.
8151    
8152     * Thuban/Model/table.py (MemoryTable): New. Quite simple table
8153     implementation that operates on a list of tuples. All of the data
8154     are kept in the memory.
8155    
8156     * test/test_table.py (MemoryTableTest): New.
8157    
8158     * test/test_transientdb.py (SimpleTable): Removed.
8159     (TestTransientTable.test_transient_joined_table,
8160     (TestTransientTable.test_transient_table_read_twice): Replaced
8161     SimpleTable by MemoryTable.
8162    
8163 jonathan 793 2003-04-30 Jonathan Coles <[email protected]>
8164    
8165 jonathan 803 * Data/iceland_sample.thuban: Now contains correct projections
8166     for each of the layers.
8167    
8168     * Resources/Projections/defaults.proj: Geographic projection
8169     contains unit conversion parameter.
8170    
8171     2003-04-30 Jonathan Coles <[email protected]>
8172    
8173 jonathan 793 The most important part of this putback is the projection changes.
8174     It should now be possible to specify the projection that a layer
8175     is in and then specify a different projection for the map. The
8176     projection dialog has an extra parameter for a geographic projection
8177     which lets the user select if the input is in degrees or radians.
8178    
8179     * Thuban/Model/layer.py (Layer.ShapesInRegion): Fix docstring
8180     to say that the parameter is a tuple of unprojected
8181     points (which is what the callers to this method were assuming).
8182     Also, since the points are unprojected we need to projected them.
8183    
8184     * Thuban/UI/legend.py (LegendTree.MoveCurrentItemUp,
8185     LegendTree.MoveCurrentItemDown): If the layer or any of the layer's
8186     groups are selected, move the layer up/down. Fixes RTbug #1833.
8187    
8188     * Thuban/UI/mainwindow.py: Move menu item map_rename up.
8189    
8190     * Thuban/UI/projdialog.py (ProjFrame._OnSave): Add missing
8191     parameter in call to SetClientData.
8192     (GeoPanel): Add support for selecting the units that the
8193     source data is in (Radians or Degrees).
8194    
8195     * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Optimize
8196     the rendering loop by reducing the number of if's, removing the
8197     unnecessary try/except block, and checking if the old group
8198     is the same as the new one (which happens a lot if there is
8199     no classification, or lots of shapes are in the same group).
8200    
8201     * Thuban/UI/view.py (MapCanvas.OnPaint): Add a try/except block
8202     around the redraw routine to try to catch problems that the user
8203     may create by selecting invalid projections for the data set and
8204     map. Clears the display if there are any problems and prints the
8205     error.
8206     (MapCanvas.do_redraw): Use DC.Clear() instead of drawing a filled
8207     rectangle.
8208    
8209     * extensions/thuban/wxproj.cpp (project_point): First invert the
8210     supplied point (which should be in projected coordinates) using
8211     the layer's projection and then project the point using the
8212     map's projection.
8213     (project_points): Use project_point() to project each point.
8214    
8215 jan 792 2003-04-30 Jan-Oliver Wagner <[email protected]>
8216    
8217     * Thuban/Model/layer.py (Layer.SetShapeStore): Fixed a bug:
8218     don't set the Classification to None if the classfication field
8219     is None (ie only a DEFAULT).
8220    
8221 bh 786 2003-04-30 Bernhard Herzog <[email protected]>
8222    
8223 bh 790 * Thuban/UI/view.py: Fix some typos.
8224    
8225 bh 788 * Thuban/UI/mainwindow.py (MainWindow.identify_view_on_demand): Do
8226     not pop up the dialog if the selection becomes empty (this could
8227     happen if e.g. a new selection is opened while the identify tool
8228     is active and dialog had been closed)
8229    
8230     2003-04-30 Bernhard Herzog <[email protected]>
8231    
8232 bh 786 * Thuban/Model/transientdb.py (TransientTableBase.__init__): New
8233     instance variable read_record_last_result
8234     (TransientTableBase.read_record): Make sure reading the same
8235     record twice works. The implementation uses the new instance
8236     variable read_record_last_result
8237    
8238     * test/test_transientdb.py
8239     (TestTransientTable.test_transient_table_read_twice): New test
8240     case for the above bug-fix.
8241    
8242 jonathan 793 2003-04-29 Jonathan Coles <[email protected]>
8243    
8244     * Thuban/common.py: Removed. No longer needed Str2Num. RTbug #1832.
8245    
8246     * Thuban/UI/classgen.py: Remove all uses of Str2Num.
8247    
8248     * Thuban/UI/classifier.py: Remove all uses of Str2Num.
8249     (ClassTable.SetValueAsCustom): Rename keyword argument in
8250     ClassGroup* constructors to match argument name.
8251    
8252 bh 779 2003-04-29 Bernhard Herzog <[email protected]>
8253    
8254     * Thuban/Model/session.py (Session.Destroy): Explicitly close the
8255     transient DB if it exists to make sure it doesn't leave a journal
8256     file in the temp directory.
8257    
8258     * Thuban/Model/transientdb.py (TransientDatabase.close): Set
8259     self.conn to None after closing the connection to make sure it's
8260     not closed twice
8261    
8262 jonathan 767 2003-04-29 Jonathan Coles <[email protected]>
8263    
8264 jonathan 769 Add a visible parameter in the layer XML tag. The default value is
8265     "true". If anything other than "false" is specified we also assume
8266 jonathan 776 "true". Addresses RTbug #1025.
8267 jonathan 769
8268     * Doc/thuban.dtd: Add visible parameter to a layer.
8269    
8270     * Thuban/Model/layer.py (BaseLayer.__init__): Change default value
8271     of visible from 1 to True.
8272     (Layer.__init__): Change default value of visible from 1 to True.
8273    
8274     * Thuban/Model/load.py (SessionLoader.start_layer): Read visible
8275     parameter.
8276    
8277     * Thuban/Model/save.py (SessionSaver.write_layer): Save visible
8278     parameter.
8279    
8280     * test/test_load.py: Add new test data contents_test_visible.
8281     (LoadSessionTest.setUp): save test data.
8282     (LoadSessionTest.testLayerVisibility): Test if the visible flag
8283     is loaded correctly.
8284    
8285     * test/test_save.py (SaveSessionTest.testSingleLayer): Add test
8286     for saving an invisible layer.
8287    
8288     2003-04-29 Jonathan Coles <[email protected]>
8289    
8290 jonathan 767 * Thuban/UI/mainwindow.py (MainWindow.SetMap): Look up the
8291     legend dialog box and tell it to change its map to the one
8292     supplied to SetMap(). Fixes RTbug #1770.
8293    
8294 bh 764 2003-04-29 Bernhard Herzog <[email protected]>
8295    
8296 bh 766 Next step of table implementation. Introduce a transient database
8297     using SQLite that some of the data is copied to on demand. This
8298     allows us to do joins and other operations that require an index
8299     for good performance with reasonable efficiency. Thuban now needs
8300     SQLite 2.8.0 and pysqlite 0.4.1. Older versions may work but I
8301     haven't tested that.
8302    
8303     * Thuban/Model/transientdb.py: New. Transient database
8304     implementation.
8305    
8306     * test/test_transientdb.py: New. Tests for the transient DB
8307     classes.
8308    
8309     * Thuban/Model/session.py (AutoRemoveFile, AutoRemoveDir): New
8310     classes to help automatically remove temporary files and
8311     directories.
8312     (Session.__init__): New instance variables temp_dir for the
8313     temporary directory and transient_db for the SQLite database
8314     (Session.temp_directory): New. Create a temporary directory if not
8315     yet done and return its name. Use AutoRemoveDir to have it
8316     automatically deleted
8317     (Session.TransientDB): Instantiate the transient database if not
8318     done yet and return it.
8319    
8320     * Thuban/Model/data.py (ShapefileStore.__init__): Use an
8321     AutoTransientTable so that data is copied to the transient DB on
8322     demand.
8323     (SimpleStore): New class that simply combines a table and a
8324     shapefile
8325    
8326     * Thuban/Model/table.py (Table, DBFTable): Rename Table into
8327     DBFTable and update its doc-string to reflect the fact that this
8328     is only the table interface to a DBF file. Table is now an alias
8329     for DBFTable for temporary backwards compatibility.
8330    
8331     * Thuban/UI/application.py (ThubanApplication.OnExit): Make sure
8332     the last reference to the session goes away so that the temporary
8333     files are removed properly.
8334    
8335     * test/test_load.py (LoadSessionTest.tearDown): Remove the
8336     reference to the session to make sure the temporary files are
8337     removed.
8338    
8339     2003-04-29 Bernhard Herzog <[email protected]>
8340    
8341 bh 764 * Thuban/Model/load.py (XMLReader.__init__, XMLReader.read): Turn
8342     the __parser instance variable into a normal local variable in
8343     read. It's only used there and read will never be called more than
8344     once. Plus it introduces a reference cycle that keeps can keep the
8345     session object alive for a long time.
8346    
8347 jonathan 767 2003-04-29 Jonathan Coles <[email protected]>
8348 jonathan 735
8349 jonathan 762 * Thuban/Model/proj.py (Projection): Removed Set*() methods to make
8350     Projection an immutable item. Fixes RTbug #1825.
8351     (Projection.__init__): Initialize instance variables here.
8352     (ProjFile.Replace): New. Replace the given projection object with
8353     the new projection object. This solves the problem of needing the
8354     mutator Projection.SetProjection() in the ProjFrame class and
8355     allows a projection to change parameters without changing its
8356     location in the file.
8357    
8358     * Thuban/UI/mainwindow.py (MainWindow.SaveSessionAs): Dialog should
8359     be of type wxSAVE and should verify overwriting a file.
8360    
8361     * Thuban/UI/projdialog.py (ProjFrame._OnSave): Use the new
8362     ProjFile.Replace() method instead of the mutator
8363     Projection.SetProjection(). Also requires that we reassign the
8364     client data to the new projection.
8365    
8366     * test/test_proj.py (TestProjection.test): Test GetName() and
8367     GetAllParameters()
8368     (TestProjFile.test): Remove tests for Set*() methods. Add tests
8369     for Replace().
8370    
8371     2003-04-25 Jonathan Coles <[email protected]>
8372    
8373 jonathan 756 * Thuban/Model/save.py (SessionSaver.write_projection): Make sure
8374     to save the name of the projection.
8375    
8376     * test/test_save.py (SaveSessionTest.testLayerProjection): New
8377     test to verify layer projections are saved correctly.
8378    
8379     2003-04-25 Jonathan Coles <[email protected]>
8380    
8381 jonathan 753 * Thuban/Model/proj.py (Projection.SetName): Set the name
8382     to "Unknown" if name is None.
8383     (Projection.SetAllParameters): New. Set the projection's
8384     parameter list to the one supplied.
8385     (Projection.SetProjection): New. Set the projection's
8386     properties to those of the supplied Projection.
8387    
8388     * Thuban/UI/mainwindow.py (MainWindow.MapProjection): Set
8389     the dialog title to include the map's title.
8390     (MainWindow.LayerProjection): Set the dialog title to include
8391     the layer's title.
8392    
8393     * Thuban/UI/projdialog.py (ProjFrame.__ShowError): Consolidate
8394     error dialogs into a single method call.
8395     (ProjFrame.__VerifyButtons): Add more states to check.
8396     (ProjFrame.__GetProjection): Return the current state of an
8397     edited projection or None.
8398     (ProjFrame.__FillAvailList): Remove checks for states that
8399     shouldn't exist.
8400     (ProjFrame._OnNew): Clear all selected items and supply
8401     a projection panel if necessary.
8402    
8403     * test/test_proj.py (TestProjFile.test): Add tests for
8404     ProjFile.SetAllParameters, ProjFile.SetProjection,
8405     ProjFile.SetName.
8406    
8407     2003-04-25 Jonathan Coles <[email protected]>
8408    
8409 jonathan 748 * Thuban/UI/projdialog.py (ProjFrame.__FillAvailList): Now
8410     takes an optional argument to select the current projection.
8411     This does not guarantee that the item is visible due to
8412     limited wxWindows functionality. Fixes RTBug #1821.
8413    
8414     2003-04-25 Jonathan Coles <[email protected]>
8415    
8416 jonathan 743 * Thuban/Model/load.py (SessionLoader.start_projection): Remember
8417     the projection name and use it when constructing the Projection
8418     object.
8419    
8420     * Thuban/Model/proj.py (Projection.__init__): Change the default
8421     value for 'name' to None and then test if name is equal to None
8422     in the body of the constructor. This way the caller doesn't have to
8423     know what the default value should be. Namely, useful in load.py
8424     where we have to pick a default value if the 'name' parameter
8425     doesn't exist in the XML file.
8426    
8427     * test/test_load.py (LoadSessionTest.testLayerProjection): New.
8428     Tests a file where a layer has a projection.
8429    
8430     2003-04-25 Jonathan Coles <[email protected]>
8431    
8432 jonathan 735 * Thuban/Model/layer.py (Layer.TreeInfo): Add an item to the
8433     tree for projection information.
8434    
8435     * Thuban/Model/load.py (XMLReader.GetFilename): Renamed from
8436     XMLReader.GetFileName.
8437     (SessionLoader): Added support for loading projection tags that
8438     appear inside a layer.
8439    
8440     * Thuban/Model/proj.py (ProjFile): Document the class. Move
8441     back to using a list because the order of the projections in
8442     the file is important to maintain. Fixes RTbug #1817.
8443    
8444     * Thuban/Model/resource.py: Rename calls to ProjFile.GetFileName
8445     to ProjFile.GetFilename.
8446    
8447     * Thuban/Model/save.py (SessionSaver.write_layer): Save projection
8448     information.
8449    
8450     * Thuban/UI/projdialog.py (ProjFrame._OnAddToList): Renamed from
8451     ProjFrame._OnSaveAs. Removed old dead code from previous
8452     implementation.
8453     (ProjFrame._OnExport): Add support for exporting more than one
8454     projection to a single file.
8455     (ProjFrame.__FillAvailList): use string formatting (% operator)
8456     to build strings that are (partly) translated. Fixes RTbug #1818.
8457    
8458     * test/test_proj.py (TestProjFile.test): New. Tests the base ProjFile
8459     class.
8460    
8461 bh 734 2003-04-24 Bernhard Herzog <[email protected]>
8462    
8463     * po/es.po: Updated Spanish translation by Daniel Calvelo Aros
8464    
8465     * po/fr.po: New. French translation by Daniel Calvelo Aros
8466    
8467     * Thuban/UI/projdialog.py (ProjFrame._OnSaveAs): Don't translate
8468     empty strings.
8469    
8470 jonathan 735 2003-04-24 Jonathan Coles <[email protected]>
8471 jonathan 724
8472     * Thuban/Model/layer.py (Layer.GetProjection): New. Needed to
8473     implement the interface that the ProjFrame dialog expects.
8474    
8475     * Thuban/Model/proj.py (Projection.SetName): New. Allows the
8476     name of the projection to be changed.
8477     (ProjFile): Use a dictionary instead of a list so that removing
8478     projections is easier and we are sure about uniqueness.
8479     (ProjFile.Remove): Remove the given projection object.
8480    
8481     * Thuban/Model/resource.py (GetSystemProjFiles, GetUserProjFiles):
8482     Return a list with only one projection file instead of searching for
8483     any projection file. This simplifies many things if the user can
8484     only have one system file and one user file.
8485    
8486     * Thuban/UI/classgen.py: Change all references to
8487     genCombo to genChoice.
8488    
8489     * Thuban/UI/mainwindow.py: Add a Projection option under the
8490     layer menu.
8491     (MainWindow.LayerProjection): New. Open up a projection window
8492     for a layer.
8493    
8494     * Thuban/UI/projdialog.py: Large changes to how the dialog is
8495     laid out. Use three panels instead of one. One for the list of
8496     projections, one for the edit controls, and one for the buttons.
8497     Fixed resizing problems so that the dialog resizes correctly
8498     when the projection panel changes. Added import/export, save, and
8499     new buttons/functionality.
8500    
8501 bh 723 2003-04-24 Bernhard Herzog <[email protected]>
8502    
8503     First step towards table management. Introduce a simple data
8504     abstraction so that we replace the data a layer uses more easily
8505     in the next step.
8506    
8507     * Thuban/Model/data.py: New file with a simple data abstraction
8508     that bundles shapefile and dbffile into one object.
8509    
8510     * Thuban/Model/session.py (Session.OpenShapefile): New method to
8511     open shapefiles and return a shape store object
8512    
8513     * Thuban/Model/layer.py (Layer.__init__): Pass the data as a store
8514     object instead of a shapefile filename. This introduces a new
8515     instance variable store holding the datastore. For intermediate
8516     backwards compatibility keep the old instance variables.
8517     (open_shapefile): Removed. No longer needed with the shape store.
8518     (Layer.SetShapeStore, Layer.ShapeStore): New methods to set and
8519     get the shape store used by a layer.
8520     (Layer.Destroy): No need to explicitly destroy the shapefile or
8521     table anymore.
8522    
8523     * Thuban/UI/mainwindow.py (MainWindow.AddLayer)
8524     (MainWindow.AddLayer): Use the session's OpenShapefile method to
8525     open shapefiles
8526    
8527     * Thuban/Model/load.py (ProcessSession.start_layer): Use the
8528     session's OpenShapefile method to open shapefiles
8529    
8530     * test/test_classification.py
8531     (TestClassification.test_classification): Use the session's
8532     OpenShapefile method to open shapefiles and build the filename in
8533     a more platform independed way
8534    
8535     * test/test_layer.py (TestLayer.setUp, TestLayer.tearDown):
8536     Implement to have a session to use in the tests
8537     (TestLayer.test_arc_layer, TestLayer.test_polygon_layer)
8538     (TestLayer.test_point_layer, TestLayer.test_empty_layer): Use the
8539     session's OpenShapefile method to open shapefiles
8540     (TestLayerLegend.setUp): Instantiate a session so that we can use
8541     it to open shapefiles.
8542     (TestLayerLegend.tearDown): Make sure that all references to
8543     layers and session are removed otherwise we may get a resource
8544     leak
8545    
8546     * test/test_map.py (TestMapAddLayer.test_add_layer)
8547     (TestMapWithContents.setUp): Instantiate a session so that we can
8548     use it to open shapefiles.
8549     (TestMapWithContents.tearDown): Make sure that all references to
8550     layers, maps and sessions are removed otherwise we may get a
8551     resource leak
8552     ("__main__"): use support.run_tests() so that more info about
8553     uncollected garbage is printed
8554    
8555     * test/test_save.py (SaveSessionTest.testSingleLayer): Use the
8556     session's OpenShapefile method to open shapefiles
8557     ("__main__"): use support.run_tests() so that more info about
8558     uncollected garbage is printed
8559    
8560     * test/test_selection.py (TestSelection.tearDown): Make sure that
8561     all references to the session and the selection are removed
8562     otherwise we may get a resource leak
8563     (TestSelection.get_layer): Instantiate a session so that we can
8564     use it to open shapefiles.
8565     ("__main__"): use support.run_tests() so that more info about
8566     uncollected garbage is printed
8567    
8568     * test/test_session.py (TestSessionBase.tearDown)
8569     (TestSessionWithContent.tearDown): Make sure that all references
8570     to the session and layers are removed otherwise we may get a
8571     resource leak
8572     (TestSessionWithContent.setUp): Use the session's OpenShapefile
8573     method to open shapefiles
8574    
8575 jonathan 721 2003-04-24 Jonathan Coles <[email protected]>
8576    
8577     * Thuban/Model/load.py (XMLReader.read): Should have been checking
8578     if the file_or_filename object had the 'read' attribute.
8579    
8580 jonathan 715 2003-04-23 Jonathan Coles <[email protected]>
8581    
8582 jonathan 720 * Thuban/Model/resource.py: Fixes RTbug #1813.
8583     (ReadProjFile): Add documentation about which exceptions are raised.
8584     Always pass the exceptions up to the caller.
8585     (GetProjFiles): If the directory can't be read return an empty list.
8586     If any of the proj files can't be read skip that file and go
8587     on to the next one.
8588    
8589     * test/test_proj.py: Added test cases to handle nonexistent files,
8590     unreadable files, and files that don't parse correctly.
8591    
8592     2003-04-23 Jonathan Coles <[email protected]>
8593    
8594 jonathan 716 Projection dialog. Allows the user to select from a list
8595     of projection templates and optionally edit them and save new ones.
8596    
8597     * Thuban/UI/projdialog.py (ProjFrame): New. Main dialog.
8598     (ProjPanel): Base class for projection specific panels.
8599     (TMPanel): Projection panel for Transverse Mercartor.
8600     (UTMPanel): Projection panel for Universal Transverse Mercartor.
8601     (LCCPanel): Projection panel for Lambert Conic Conformal.
8602     (GeoPanel): Projetion panel for Geographic Projection.
8603    
8604     2003-04-23 Jonathan Coles <[email protected]>
8605    
8606 jonathan 715 * Thuban/Model/load.py (XMLReader): Renamed from XMLProcessor to
8607     promote symmetry. There now exists XMLReader and XMLWriter.
8608     (XMLReader.read): New. Call to read the given file descriptor or
8609     filename.
8610     (XMLReader.close): New. Make sure the file is closed.
8611     (XMLReader.GetFileName): New. Return just the file name that is being
8612     read from.
8613     (XMLReader.GetDirectory): New. Return just the directory of the file
8614     that is being read.
8615     (XMLReader.AddDispatchers): New. Take a dictionary which contains
8616     the names of functions to call as the XML tree is parsed.
8617     (XMLReader.startElementNS): Updated to use new dispatcher dictionary.
8618     (XMLReader.endElementNS): Updated to use new dispatcher dictionary.
8619     (SessionLoader): Removed class variables start_dispatcher and
8620     end_dispatcher since this functionality is now part of a class
8621     instance. Fixes RTbug #1808.
8622     (SessionLoader.__init__): Add dispatcher functions.
8623     (load_xmlfile): Code was moved into the XMLReader.read().
8624     (load_session): Use modified SessionLoader.
8625    
8626     * Thuban/Model/map.py (Map.GetProjection): New. Returns the
8627     map's projection.
8628    
8629     * Thuban/Model/proj.py (Projection.GetParameters): Renamed to
8630     GetAllParameters.
8631     (Projection.GetParameter): Returns the value for the given parameter.
8632    
8633     * Thuban/Model/resource.py: Use XMLReader and XMLWriter.
8634     (GetProjFiles): Renamed from GetProjections. Now returns a list
8635     of ProjFile objects.
8636     (GetSystemProjFiles): Renamed from GetSuppliedProjections. Returns
8637     a list of ProjFile objects whose files are not user defined.
8638     (GetUserProjFiles): Renamed from GetUserProjections. Returns a
8639     list of ProjFile objects whose files are user defined.
8640     (ProjFileReader): Extend new XMLReader.
8641    
8642     * Thuban/Model/save.py (XMLWriter): Renamed from XMLSaver to
8643     promote symmetry.
8644    
8645     * Thuban/UI/classgen.py (ClassGenDialog.__init__): Use a wxChoice
8646     control instead of a wxComboBox. wxChoice controls do not generate
8647     events as the uses highlights possible choices which fixes problems
8648     with resizing the dialog when the use selects an option.
8649    
8650     * Thuban/UI/classifier.py (Classifier.__init__): Use a wxChoice
8651     control instead of a wxComboBox.
8652    
8653     * Thuban/UI/mainwindow.py (MainWindow.Projection): Use new projection
8654     dialog.
8655    
8656     * test/test_proj.py (TestProjection.test): New tests for GetParameter
8657     method.
8658    
8659 bh 703 2003-04-22 Bernhard Herzog <[email protected]>
8660    
8661 bh 705 * Thuban/UI/mainwindow.py: Remove some unused imports and global
8662     constants
8663    
8664 bh 703 * Thuban/UI/identifyview.py (IdentifyListCtrl.selected_shape)
8665     (IdentifyGridCtrl.selected_shape): Use table, not shapetable.
8666    
8667 bh 700 2003-04-17 Bernhard Herzog <[email protected]>
8668    
8669 bh 701 * Thuban/Model/layer.py: Don't import LAYER_LEGEND_CHANGED.
8670     (Layer): Update doc-string since LAYER_LEGEND_CHANGED is not used
8671     anymore.
8672     (Layer.BoundingBox, Layer.GetFieldType, Layer.NumShapes)
8673     (Layer.ShapeType, Layer.Shape): No need to call
8674     self.open_shapefile since it's always called in __init__
8675    
8676 bh 700 * Thuban/UI/application.py (ThubanApplication.MainLoop): Removed.
8677     In wxPython 2.4 there's no need to extend MainLoop anymore since
8678     wxPython itself makes sure OnExit is called.
8679    
8680 jonathan 688 2003-04-16 Jonathan Coles <[email protected]>
8681    
8682 jonathan 693 Initial putback of projection management code. Includes new
8683     classes to read and write projection files. The current load
8684     and save classes were abstracted a bit so they could be reused.
8685     The Projection class was extended to provide new methods and
8686     have a name.
8687    
8688     * Thuban/Model/load.py (XMLProcessor): New. Contains all the
8689     general XML reading methods that were part of ProcessSession.
8690    
8691     * Thuban/Model/proj.py (Projection.__init__): Accepts an optional
8692     name.
8693     (ProjFile): New. Represents a file that contains projection
8694     information.
8695    
8696     * Thuban/Model/resource.py: New. Contains general utilities
8697     for read and writing projection files.
8698    
8699     * Thuban/Model/save.py (XMLSaver): New. Contains all the
8700     general XML writing methods that were part of SessionSaver.
8701     (SessionSaver): Renamed from Saver.
8702    
8703     * test/test_proj.py: New test cases for the projection
8704     file read and write functions.
8705    
8706     2003-04-16 Jonathan Coles <[email protected]>
8707    
8708 jonathan 688 * Thuban/Model/classification.py: Use repr() around values
8709     in the ClassGroup*.__repr__() methods so it is clearer when
8710     a value is a string and when it is a number.
8711    
8712     * test/test_load.py: Rework the classification test to test
8713     that we can load old files.
8714     (testLabels): Test a file where the groups have labels.
8715    
8716 bh 687 2003-04-16 Bernhard Herzog <[email protected]>
8717    
8718     Safer implementation of the performance enhancements of the
8719     low-level renderer:
8720    
8721     * extensions/thuban/wxproj.cpp (extract_projection)
8722     (extract_pointer): Rename extract_projection to extract_pointer
8723     and redefine its purpose to return the pointer stored in a CObject
8724     returned by the object's cobject method. Update all callers.
8725     (s_draw_info, free_draw_info, draw_polygon_init): Implement the
8726     handling of these low-level parameters so that each s_draw_info
8727     instance is handled as a CObject at python level that also
8728     contains real references to the actual python objects which
8729     contain the values in the struct. Add free_draw_info as the
8730     destructor.
8731     (draw_polygon_shape): Add the py_draw_info parameter which must a
8732     cobject containing an s_draw_info pointer.
8733    
8734     * Thuban/UI/renderer.py (MapRenderer.polygon_render_param): New
8735     method to instantiat the low-level render parameter
8736     (MapRenderer.draw_shape_layer): Use the new method. Remove some
8737     commented out code.
8738     (MapRenderer.draw_polygon_shape): Make the first parameter not the
8739     layer but the low-level render parameter
8740     (ScreenRenderer.draw_shape_layer): Use the low-level render
8741     parameter.
8742    
8743 jonathan 673 2003-04-15 Jonathan Coles <[email protected]>
8744    
8745 jonathan 680 * Thuban/Model/classification.py: Implemented __repr__ for
8746     the ClassGroup* classes to make debugging a bit easier.
8747     (ClassGroup.SetLabel): Check that the string is an instance
8748     of StringTypes not StringType. Accounts for Unicode strings.
8749    
8750     * Thuban/Model/color.py: Implemented __repr__ to make
8751     debugging a bit easier.
8752    
8753     * Thuban/Model/save.py (Saver.write_classification): Need to
8754     save the group label.
8755    
8756     * test/test_load.py (testClassification): New. Loads the
8757     iceland_sample_test.thuban file and checks if it was loaded
8758     correctly.
8759    
8760     2003-04-15 Jonathan Coles <[email protected]>
8761    
8762 jonathan 673 * extensions/thuban/wxproj.cpp (draw_polygon_init): New. Used
8763     to improve rendering performance by initializing the variables
8764     that are not change each time draw_polygon_shape() is called.
8765     The values are stored in a global struct draw_info.
8766     (draw_polygon_shape): Removed initialization code that is
8767     now in draw_polygon_init().
8768    
8769     * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Make
8770 jonathan 674 drawing initialization call to draw_polygon_init()
8771     (MapRenderer.draw_polygon_shape): Use new signature of
8772     draw_polygon_shape.
8773 jonathan 673
8774 jonathan 674 * Thuban/UI/classgen.py (GenUniformPanel): Fix spin control
8775     weirdness by setting the range to (1, maxint).
8776 jonathan 673
8777 jonathan 674 * Thuban/Model/classification.py (ClassGroupProperties): Make
8778     instance variables private and optimize comparison operator
8779     by first checking if the color references are the same.
8780     (ClassGroupSingleton): Make instance variables private.
8781     (ClassGroupRange): Make instance variables private.
8782 jonathan 673
8783 jonathan 674 * HOWTO-Release: Filled in missing steps for releasing packages.
8784    
8785 bh 672 2003-04-15 Bernhard Herzog <[email protected]>
8786    
8787     First stab at internationalized messages:
8788    
8789     * Thuban/__init__.py (_): Implement the translation function for
8790     real using the python gettext module.
8791    
8792     * Thuban/UI/classifier.py (ClassTable.GetRowLabelValue): Don't
8793     translate empty strings.
8794    
8795     * Thuban/UI/application.py (ThubanApplication.read_startup_files):
8796     Add a missing space to a warning message
8797    
8798     * po/README: New. Notes about the management of the translation
8799     files.
8800    
8801     * po/Makefile: New. Makefile to help manage the translation files.
8802    
8803     * po/es.po: New. Spanish translation by Daniel Calvelo Aros
8804    
8805     * MANIFEST.in: Include the *.mo files in Resources/Locale and the
8806     translations and support files in po/
8807    
8808     * setup.py (data_files): Add the *.mo files to the data_files too
8809    
8810     * README: Add note about the translations when building from CVS
8811    
8812 jonathan 669 2003-04-14 Jonathan Coles <[email protected]>
8813    
8814     * Thuban/UI/dock.py: Fixes some window resizing problems most
8815     noticable under windows. Always assume the button bitmaps will
8816     be there. Code clean up.
8817     (DockabelWindow.Dock, DockableWindow.UnDock): Force all the
8818     images for the dock/undock button to the same images.
8819     Work around for RTbug #1801.
8820    
8821     * Thuban/UI/legend.py (LegendPanel.__init__): The toolbar should
8822     be allowed to grow within the sizer. Fixes a bug under Windows
8823     where the toolbar wasn't being drawn.
8824    
8825 frank 664 2003-04-14 Frank Koormann <[email protected]>
8826    
8827     * Resources/Bitmaps/dock_12.xpm, Resources/Bitmaps/undock_12.xpm:
8828     Updated design to try to make the button functionality more
8829     transparent.
8830    
8831 jonathan 662 2003-04-14 Jonathan Coles <[email protected]>
8832    
8833     * Thuban/UI/legend.py (LegendPanel.__init__): Call Create() to
8834     finalize the intialization of the panel.
8835    
8836     * Thuban/UI/dock.py (DockPanel.Create): New. Finalizes the
8837     creation of the panel. Should be the last thing called in the
8838     initializer of a subclass.
8839    
8840     * Thuban/UI/classgen.py (ClassGenDialog.__init__): Actively
8841     set the current selections in the combo boxes. This is needed
8842     under Windows.
8843    
8844     * Thuban/UI/classifier.py (Classifier.__init__): Add a top
8845     level panel to the dialog so that the background colors are
8846     consistent under Windows.
8847    
8848 jonathan 646 2003-04-11 Jonathan Coles <[email protected]>
8849    
8850 jonathan 662 * Thuban/UI/classgen.py: Change color ramps to start at white
8851     not black.
8852    
8853     * Thuban/UI/legend.py: Enable/disable the legend buttons when
8854     the legend changes. Fixes RTbug #1793.
8855    
8856     * test/test_classification.py: Added test for copying of
8857     classifications.
8858    
8859     2003-04-11 Jonathan Coles <[email protected]>
8860    
8861 jonathan 647 * Thuban/UI/resource.py: New. Centralize the loading of resources
8862     such as bitmaps.
8863    
8864     * Thuban/UI/classgen.py (GenUniquePanel.__init__): Reordered buttons,
8865     added images to the move buttons, added 'reverse' button.
8866     (CustomRampPanel.__init__): Added images to the move buttons.
8867     (GreyRamp): New. Generates a ramp from white to black.
8868     (HotToColdRamp): New. Generates a ramp from cold to hot colors.
8869    
8870     * Thuban/UI/classifier.py: Refactored ID's from ID_CLASSIFY_* to
8871     ID_PROPERTY_*.
8872     (Classifier.__init__): Minor changes to the layout.
8873     (Classifier._OnTitleChanged): Listen for when the user edits the
8874     title and update the dialog's title and the layer's title.
8875    
8876     * Thuban/UI/dock.py: Use new bitmaps for the control buttons.
8877    
8878     * Thuban/UI/legend.py: Use new bitmaps for the control buttons.
8879     (LegendTree._OnMsgLayerTitleChanged): Change the displayed title
8880     if the layer's title changes.
8881    
8882     * Thuban/UI/mainwindow.py: Added new menu item and associated code
8883     to open a dialog to rename the map.
8884     (MainWindow): Use new resource class to import bitmaps.
8885    
8886     2003-04-11 Jonathan Coles <[email protected]>
8887    
8888 jonathan 646 * Resources/Bitmaps/close_12.xpm, Resources/Bitmaps/dock_12.xpm,
8889 jonathan 647 Resources/Bitmaps/group_use.xpm, Resources/Bitmaps/group_use_all.xpm,
8890     Resources/Bitmaps/group_use_none.xpm,
8891     Resources/Bitmaps/group_use_not.xpm,
8892     Resources/Bitmaps/hide_layer.xpm,
8893     Resources/Bitmaps/layer_properties.xpm,
8894     Resources/Bitmaps/lower_layer.xpm, Resources/Bitmaps/raise_layer.xpm,
8895     Resources/Bitmaps/show_layer.xpm, Resources/Bitmaps/undock_12.xpm:
8896     New.
8897 jonathan 646
8898 jonathan 636 2003-04-10 Jonathan Coles <[email protected]>
8899    
8900 jonathan 644 * Thuban/Model/classification.py: (ClassGroupRange.__init__):
8901     Should pass group to ClassGroup constructor.
8902    
8903     2003-04-10 Jonathan Coles <[email protected]>
8904    
8905 jonathan 636 * Thuban/Model/classification.py: (ClassGroup): Move all the common
8906     methods of the derived classes ([Set|Get]Properties(), __eq__, __ne__)
8907     here. Implement SetVisible(), IsVisible().
8908     (ClassGroup.__init__): Add group parameter which acts as a copy
8909     constructor.
8910    
8911     * Thuban/UI/classifier.py (ClassTable): Add a new column for the
8912     "Visible" check boxes.
8913     (Classifier): Rename the buttons and refactor the code to match
8914     the new labels.
8915    
8916     * Thuban/UI/legend.py: Classify button is now called "Properties".
8917     Refactored the code to change variable names.
8918     (LegendTree.__FillTreeLayer): Only list a group if it is visible.
8919    
8920     * Thuban/UI/mainwindow.py: MainWindow.OpenClassifier renamed to
8921     MainWindow.OpenLayerProperties. MainWindow.LayerEditProperties
8922     renamed to MainWindow.LayerEditProperties.
8923     (MainWindow.ToggleLegend): Don't include map name in legend title.
8924     (MainWindow.SetMap): Added the map name to the window title.
8925     (MainWindow.LayerFillColor, MainWindow.LayerTransparentFill,
8926     MainWindow.LayerOutlineColor, MainWindow.LayerNoOutline): Removed.
8927     Functionality is found in the layer properties dialog.
8928    
8929     * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Only
8930     draw visible groups.
8931    
8932 jonathan 626 2003-04-09 Jonathan Coles <[email protected]>
8933    
8934 jonathan 634 * Thuban/UI/classgen.py: Modifications to allow simple
8935     addition and selection of new color schemes.
8936     (MonochromaticRamp): New. Generates a ramp between two colors.
8937     (RedRamp): New. Generates a ramp of all red.
8938     (GreenRamp): New. Generates a ramp of all green.
8939     (BlueRamp): New. Generates a ramp of all blue.
8940    
8941     2003-04-09 Jonathan Coles <[email protected]>
8942    
8943 jonathan 626 * Thuban/Model/classification.py (Classification.__deepcopy__):
8944     Need to copy over field and fieldType attributes.
8945    
8946     * Thuban/Model/table.py (Table.field_range): New. Retrive the
8947     maximum and minimum values over the entire table for a given
8948     field.
8949     (Table.GetUniqueValues): New. Retrieve all the unique values
8950     in the table for a given field.
8951    
8952     * Thuban/UI/classgen.py: Renamed GenRangePanel to GenUniformPanel.
8953     (GenUniquePanel): New. Controls to allow the user to select
8954     which unique field values they would like in the classification.
8955     (CustomRampPanel): Code that was in ClassGenDialog that allows
8956     the user to select the properties for a custom ramp.
8957     (ClassGenerator.GenUniformDistribution): Was called GenerateRanges.
8958    
8959     * Thuban/UI/classifier.py: Removed a lot of debugging code.
8960     (Classifier._SetClassification): Callback method so that the
8961     class generator can set the classification in the grid.
8962     (ClassGroupPropertiesCtrl): New. Encapsulates the drawing and
8963     editing of a group properties class into a wxWindows control.
8964    
8965     * Thuban/UI/dock.py: It was decided that if the user closes
8966     a dockable window the window should simply hide itself. That
8967     way if the user wants to show the dock again it appears in the
8968     same place as it was when it was closed.
8969     (DockableWindow.Destroy): Call renamed method OnDockDestroy().
8970     (DockableWindow._OnButtonClose): Hide the window instead of
8971     destroying it.
8972     (DockableWindow._OnClose): Hide the window instead of
8973     destroying it.
8974    
8975     * Thuban/UI/legend.py (LegendTree): Use a private method to
8976     consistently set the font and style of the text. Fixes RTbug #1786.
8977    
8978     * Thuban/UI/mainwindow.py: Import just the Classifier class.
8979    
8980 bh 623 2003-04-07 Bernhard Herzog <[email protected]>
8981    
8982 bh 625 * Thuban/UI/mainwindow.py (main_menu): Move the toggle_legend item
8983     to the map module
8984    
8985     2003-04-07 Bernhard Herzog <[email protected]>
8986    
8987 bh 623 * Thuban/UI/mainwindow.py (MainWindow.ShowSessionTree): Removed in
8988     favor of ToggleSessionTree
8989     (MainWindow.ToggleSessionTree): New method to toggle visibility of
8990     the session tree.
8991     (MainWindow.SessionTreeShown): New method to return whether the
8992     session tree is currently shown.
8993     (MainWindow.ToggleLegend): New method to toggle visibility of the
8994     legend
8995     (MainWindow.ShowLegend): Implement in terms of ToggleLegend and
8996     LegendShown
8997     (MainWindow.LegendShown): New method to return whether the legend
8998     is currently shown.
8999     (_method_command): Add checked parameter so we can define check
9000     menu items
9001     (_has_tree_window_shown, _has_legend_shown): Use the appropriate
9002     mainwindow methods.
9003     (show_session_tree, show_legend commands): Removed.
9004     (toggle_session_tree, toggle_legend commands): New commands to
9005     toggle the visibility of the dialogs
9006    
9007 jonathan 612 2003-04-07 Jonathan Coles <[email protected]>
9008    
9009 jonathan 619 * Thuban/UI/classgen.py: Fix Windows problem.
9010    
9011     * Thuban/UI/dock.py: Fix Windows problem.
9012    
9013     * Thuban/UI/mainwindow.py: Use False instead of false.
9014     (MainWindow.ShowLegend): Remove unnecessary switch parameter.
9015    
9016     2003-04-07 Jonathan Coles <[email protected]>
9017    
9018 jonathan 612 Since we now say that the order of the groups in a classification
9019     matters, it makes sense to be able to manipulate that order. Most
9020     of the changes to Thuban/Model/classification.py are to that end.
9021    
9022     * Thuban/Model/classification.py (Classification.AppendGroup,
9023     Classification.InsertGroup, Classification.ReplaceGroup,
9024     Classification.RemoveGroup, Classification.GetGroup): Do as the
9025     names imply.
9026     (Classification.FindGroup): This was called GetGroup, but GetGroup
9027     takes an index, while FindGroup takes a value.
9028     (Classification.__deepcopy__): Copy all the groups, BUT NOT THE LAYER
9029     REFERENCE. Currently there is a cyclic reference between the layer
9030     and its classification. If the classification doesn't need to know
9031     its owning layer we can change this, since it may make sense to be
9032     able to use the same classification with different layers.
9033    
9034     * Thuban/Model/load.py: Use Classification.AppendGroup(), not AddGroup()
9035    
9036     * Thuban/UI/classgen.py: Use Classification.AppendGroup(),
9037     not AddGroup()
9038    
9039     * Thuban/UI/classifier.py: Now that we can depend on the order in
9040     a Classification and have methods to manipulate that order we don't
9041     need to use our own data structures in the grid. We can simply make
9042     the grid/table access the information they need from a copy of
9043     the classification object.
9044     (Classifier._OnCloseBtn): Event handler for when the user clicks
9045     'Close'. This is needed so if the user applies changes and then
9046     continues to change the table the user has the option of discarding
9047     the most recent changes and keeping what they applied.
9048    
9049     * Thuban/UI/mainwindow.py: Put "Show Legend" and "Show Session Tree"
9050     into the same group.
9051    
9052     * extensions/thuban/wxproj.cpp (check_version): If Thuban is compiled
9053     with a really old version of proj, PJ_VERSION won't even be defined.
9054     If it isn't defined then just compile so that the function always
9055     returns Py_False.
9056    
9057     * test/test_classification.py: Fix tests to use the renamed methods.
9058     Still need to write tests for the new methods.
9059    
9060 jonathan 601 2003-04-04 Jonathan Coles <[email protected]>
9061 jonathan 608
9062 jonathan 612 * Thuban/UI/classifier.py (Classifier.__SelectField): Move the
9063     call to SetSelection out of the method and before the call
9064     to __SelectField in __init__. This prevents a recursion of events
9065     when _OnFieldSelect is triggered by the user.
9066    
9067     2003-04-04 Jonathan Coles <[email protected]>
9068    
9069 jonathan 608 * Thuban/Model/classification.py: Rename Color.None to
9070     Color.Transparent.
9071     (ClassGroupProperties.SetLineColori, ClassGroupProperties.SetFill):
9072     Don't bother copying the color, since Colors are immutable.
9073    
9074     * Thuban/Model/color.py, Thuban/Model/layer.py, Thuban/Model/load.py,
9075     Thuban/UI/classifier.py, Thuban/UI/mainwindow.py,
9076     Thuban/UI/renderer.py, Thuban/UI/view.py:
9077     Rename Color.None to Color.Transparent.
9078    
9079     * test/test_classification.py, test/test_load.py: Rename Color.None
9080     to Color.Transparent.
9081    
9082     2003-04-04 Jonathan Coles <[email protected]>
9083 jonathan 603
9084     * Thuban/Model/classification.py: Fix assert calls.
9085     (ClassGroupProperties.SetLineColor, ClassGroupProperties.SetFill):
9086     Copy the color parameter rather than hold onto a reference.
9087 jonathan 601
9088 jonathan 603 * Thuban/Model/color.py (Color.__copy__, Color.__deepcopy): Copy
9089     the color object.
9090     (NoColor.__copy__, NoColor.__deepcopy): Return 'self' so that we
9091     are sure there exists only one refernce to Color.None in the system.
9092     This allows us to use 'is' rather than the comparision functions.
9093    
9094     * Thuban/Model/save.py: Fix assert calls.
9095    
9096     * Thuban/UI/classifier.py: Fix assert calls.
9097     (ClassGrid._OnCellDClick): Call up to the classifier to open the
9098     dialog to edit the groups properties.
9099     (ClassGrid._OnCellResize): Make sure that the scollbars are drawn
9100     correctly if a cell is resized.
9101     (ClassTable.SetClassification): New. Changes the classification
9102     that is in the table.
9103     (ClassTable.__SetRow): Allow groups to be prepended.
9104     (Classifier): New code for opening the EditProperties and
9105     GenerateRanges dialogs.
9106     (SelectPropertiesDialog.__GetColor): Only set the color in the
9107     color dialog if the current color is not None.
9108    
9109     * Thuban/UI/dock.py: Fix assert calls.
9110    
9111     * Thuban/UI/legend.py: Fix assert calls.
9112    
9113     * Thuban/UI/renderer.py: Fix assert calls.
9114    
9115     * Thuban/UI/classgen.py (ClassGenDialog): Dialog for generating
9116     classifications.
9117     (GenRangePanel): Panel specific to range generation.
9118     (GenSingletonPanel): Panel specific to singleton generation.
9119     (ClassGenerator): Class responsible for actually generating
9120     the classification from the data gathered in the dialog box.
9121     (PropertyRamp): Generates properties whose values range from
9122     a starting property to an ending property.
9123 jonathan 601
9124 bh 600 2003-04-03 Bernhard Herzog <[email protected]>
9125    
9126     * test/support.py (print_garbage_information): New function that
9127     prints information about still connected messages and memory
9128     leaks.
9129     (run_suite): Removed.
9130     (run_tests): New function for use as a replacement of
9131     unittest.main in the test_* files. This one calls
9132     print_garbage_information at the end.
9133    
9134     * test/runtests.py (main): Use support.print_garbage_information
9135    
9136     * test/test_layer.py: Use support.run_tests instead of
9137     unittest.main so we get memory leak information
9138     (TestLayer.test_arc_layer, TestLayer.test_polygon_layer)
9139     (TestLayer.test_point_layer, TestLayer.test_empty_layer)
9140     (TestLayerLegend.test_visibility): Call the layer's Destroy method
9141     to fix a memory leak.
9142    
9143     * test/test_classification.py: Use support.run_tests instead of
9144     unittest.main so we get memory leak information
9145     (TestClassification.test_classification): Call the layer's Destroy
9146     method to fix a memory leak.
9147    
9148 bh 591 2003-04-02 Bernhard Herzog <[email protected]>
9149    
9150 bh 595 * extensions/thuban/wxproj.cpp (check_version, check_version_gtk):
9151     Handle the reference counts of the return value and errors in
9152     PyArg_ParseTuple correctly.
9153    
9154 bh 593 * Thuban/UI/application.py (ThubanApplication.OpenSession): Make
9155     sure the filename is absolute to avoid problems when saving the
9156     session again
9157    
9158 bh 591 * Thuban/Model/table.py: Remove unnecessary import. Fix a typo.
9159    
9160 jonathan 587 2003-04-01 Jonathan Coles <[email protected]>
9161    
9162 jonathan 589 * Thuban/UI/renderer.py (MapRenderer.draw_point_shape): Check
9163 jonathan 587 that there actually are points in the returned list of points
9164     before trying to index into the list. The list may be empty if
9165     the shape is a Null Shape.
9166    
9167 bh 586 2003-04-01 Bernhard Herzog <[email protected]>
9168    
9169     * test/test_map.py: Don't use from <module> import *
9170    
9171 jonathan 581 2003-04-01 Jonathan Coles <[email protected]>
9172    
9173     * Thuban/Model/session.py: Use LAYER_CHANGED instead of
9174     LAYER_LEGEND_CHANGED
9175    
9176     * Thuban/UI/dock.py (DockableWindow._OnButtonClose): Call
9177     self.Destroy() to close the window after yesterday's changes.
9178    
9179     * test/test_map.py, test/test_session.py: Fix messages that
9180     are sent from maps and layers.
9181    
9182 jonathan 575 2003-03-31 Jonathan Coles <[email protected]>
9183    
9184     * Thuban/UI/classifier.py: Commented out some debugging statements.
9185     (ClassDataPreviewer.Draw): Draw rectangles for polygon layers per
9186     RTbug #1769.
9187    
9188     * Thuban/UI/dock.py (DockableWindow.UnDock): Restore size and
9189     position (although position doesn't work yet under GTK).
9190     (DockableWindow.Destroy): New. Called when the window must be
9191     closed. Namely needed when the DockFrame closes and must close
9192     its children.
9193     (DockFrame): Listen for EVT_CLOSE and destroy all children.
9194    
9195     * Thuban/UI/legend.py (LegendPanel.Destroy): New. Cleans up
9196     when then window is told to close.
9197     (LegendTree._OnMsgLayerChanged): Fixes a seg fault bug. See
9198     comment in source for more info.
9199    
9200     * Thuban/UI/main.py: Show the legend by default when Thuban starts.
9201    
9202     * Thuban/UI/mainwindow.py: Renamed OnClose to _OnClose for
9203     symmetry with other such methods.
9204     (MainWindow.ShowLegend): Show the legend docked by default.
9205    
9206 jonathan 569 2003-03-28 Jonathan Coles <[email protected]>
9207    
9208     * Thuban/UI/classifier.py: Support for highlighting a specific
9209     group within the grid when the classification dialog is opened.
9210     Also contains a lot of debugging printouts which will later
9211     be removed.
9212    
9213     * Thuban/UI/dock.py: Complete rework on the dock code so that
9214     that it is fairly removed from the rest of the Thuban application.
9215     It is easy to add new docks which the rest of the program having
9216     to be aware of them.
9217    
9218     * Thuban/UI/legend.py: Modifications to support selecting a
9219     specific group in the classification dialog. Changed how layers
9220     are drawn when the layer is visible/invisible.
9221    
9222     * Thuban/UI/mainwindow.py: Removed legend specific code and
9223     replaced it with calls to the new dock code.
9224    
9225     * Thuban/UI/renderer.py (MapRenderer.__init__): Added assert
9226     to check if scale > 0. Trying to track down a divide by zero.
9227    
9228 jonathan 557 2003-03-26 Jonathan Coles <[email protected]>
9229    
9230 jonathan 567 * Thuban/UI/legend.py: Removed unnecessary LegendDialog class.
9231     (LegendPanel): Removed _OnDock()/_OnUnDock() methods which are
9232     now part of DockableWindow.
9233     (LegendPanel.DoOnSelChanged): Select the current layer in the
9234     map.
9235     (LegendTree._OnSelChanged): Call LegendPanel.DoOnSelChanged()
9236     with the selected layer and/or group.
9237    
9238     2003-03-26 Jonathan Coles <[email protected]>
9239    
9240 jonathan 557 This putback contains the code for dockable windows. There is
9241     no support in wxWindows as of this date for windows that can
9242     attach themselves to other windows.
9243    
9244     The current model contains a DockableWindow which has a parent
9245     window for when it is detached and a dock window that it puts
9246     its contents in when it is docked. The contents of a DockableWindow
9247     must be a DockPanel. DockPanel itself derives from wxPanel.
9248    
9249     * Thuban/Model/layer.py (Layer.ClassChanged): Send a LAYER_CHANGED
9250     message, not a LAYER_LEGEND_CHANGED message.
9251    
9252     * Thuban/Model/map.py (Map): Forward LAYER_CHANGED messages.
9253    
9254     * Thuban/UI/classifier.py (Classifier.__init__): Use wxADJUST_MINSIZE
9255     as one of the style properties for the fieldTypeText item to
9256     be sure that its size is correct when the text changes.
9257    
9258     * Thuban/UI/dock.py: New. Classes for the DockPanel and
9259     DockableWindow.
9260    
9261     * Thuban/UI/legend.py: Added some more buttons and made the
9262     LegendPanel a DockPanel.
9263    
9264     * Thuban/UI/mainwindow.py: Added sash windows to the main window
9265     and supporting functions for manipulating the sashes.
9266     (MainWindow.ShowLegend): Create a DockableWindow with the
9267     LegendPanel as the contents.
9268    
9269     * Thuban/UI/messages.py: Added DOCKABLE_* messages
9270    
9271     * Thuban/UI/view.py (MapCanves.SetMap): Listen for LAYER_CHANGED,
9272     not LAYER_LEGEND_CHANGED, messages.
9273    
9274 jonathan 554 2003-03-25 Jonathan Coles <[email protected]>
9275    
9276     * setup.py: Added custom script bdist_rpm_build_script so that
9277     when the rpm is built the path to wx-config is correct.
9278    
9279     * setup.cfg: Added line saying to use the custom build script
9280    
9281 jonathan 552 2003-03-20 Jonathan Coles <[email protected]>
9282    
9283     Initial implementation of the Legend.
9284    
9285     * Thuban/UI/legend.py: New. Creates a window that shows the map's
9286     Legend information and allows the user to add/modify classifications
9287     and how the layers are drawn on the map.
9288    
9289     * setup.py: New command 'build_docs' which currently uses
9290     happydoc to generate html documentation for Thuban.
9291    
9292     * Thuban/Model/classification.py (ClassGroup.GetDisplayText): New.
9293     Returns a string which is appropriately describes the group.
9294    
9295     * Thuban/Model/layer.py (Layer.SetClassification): Generate a
9296     LAYER_CHANGED event instead of a LAYER_LEGEND_CHANGED event.
9297    
9298     * Thuban/Model/map.py (Map): Rename messages and use new, more
9299     specific, messages.
9300    
9301     * Thuban/Model/messages.py: New message to indicate that a layer's
9302     data has changed (LAYER_CHANGED). New map messages to indicate
9303     when layers have been added/removed/changed or if the stacking order
9304     of the layers has changed.
9305    
9306     * Thuban/Model/session.py: Rename and use new messages.
9307    
9308     * Thuban/UI/classifier.py: Remember if any changes have actually
9309     been applied so that if the dialog is cancelled without an application
9310     of changes we don't have to set a new classification.
9311     (ClassDataPreviewer): Pulled out the window specific code and put it
9312     ClassDataPreviewWindow. ClassDataPreviewer can then be used to draw
9313     symbols on any DC.
9314    
9315     * Thuban/UI/mainwindow.py: New code to open the legend.
9316    
9317     * Thuban/UI/view.py: Use new message names.
9318    
9319 jonathan 541 2003-03-19 Jonathan Coles <[email protected]>
9320    
9321     * Thuban/UI/main.py (verify_versions): New. Checks the versions
9322     of Python, wxPython, and some other libraries.
9323    
9324     * extensions/thuban/wxproj.cpp (check_version): Checks the given
9325     version against what wxproj was compiled with.
9326     (check_version_gtk): If wxproj was compiled with gtk then check
9327     the given version against the version of the gtk library
9328     currently being used.
9329    
9330 bh 538 2003-03-14 Bernhard Herzog <[email protected]>
9331    
9332     * test/test_command.py: Run the tests when the module is run as a
9333     script
9334    
9335     2003-03-14 Bernhard Herzog <[email protected]>
9336    
9337     Implement selection of multiple selected shapes in the same layer:
9338    
9339     - Introduce a new class to hold the selection. This basically
9340     replaces the interactor which was nothing more than the
9341     selection anyway. A major difference is of course that the new
9342     selection class supports multiple selected shapes in one layer
9343    
9344     - Move the object that represents the selection from the
9345     application to the canvas. The canvas is a better place than the
9346     application because the selection represents which shapes and
9347     layer of the map displayed by the canvas are selected and
9348     affects how the map is drawn.
9349    
9350     - Make the selection and its messages publicly available through
9351     the mainwindow.
9352    
9353     - The non-modal dialogs do not get a reference to the interactor
9354     anymore as they can simply refer to their parent, the
9355     mainwindow, for the what the interactor had to offer.
9356    
9357     * Thuban/UI/selection.py: New module with a class to represent the
9358     selection.
9359    
9360     * Thuban/UI/messages.py (SELECTED_TABLE, SELECTED_MAP): Remove
9361     these unused messages
9362    
9363     * Thuban/UI/application.py (ThubanApplication.OnInit)
9364     (ThubanApplication.OnExit, ThubanApplication.SetSession): The
9365     interactor is gone now.
9366     (ThubanApplication.CreateMainWindow): There is no interactor
9367     anymore so we pass None as the interactor argument for now for
9368     compatibility.
9369    
9370     * Thuban/UI/view.py (MapCanvas.delegated_messages)
9371     (MapCanvas.Subscribe, MapCanvas.Unsubscribe): In Subscribe and
9372     Unsubscribe, delegate messages according to the delegated_messages
9373     class variable.
9374     (MapCanvas.__getattr__, MapCanvas.delegated_methods): Get some
9375     attributes from instance variables as described with the
9376     delegated_methods class variable.
9377     (MapCanvas.__init__): New instance variable selection holding the
9378     current selection
9379     (MapCanvas.do_redraw): Deal with multiple selected shapes. Simply
9380     pass them on to the renderer
9381     (MapCanvas.SetMap): Clear the selection when a different map is
9382     selected.
9383     (MapCanvas.shape_selected): Simple force a complete redraw. The
9384     selection class now takes care of only issueing SHAPES_SELECTED
9385     messages when the set of selected shapes actually does change.
9386     (MapCanvas.SelectShapeAt): The selection is now managed in
9387     self.selection
9388    
9389     * Thuban/UI/mainwindow.py (MainWindow.delegated_messages)
9390     (MainWindow.Subscribe, MainWindow.Unsubscribe): In Subscribe and
9391     Unsubscribe, delegate messages according to the delegated_messages
9392     class variable.
9393     (MainWindow.delegated_methods, MainWindow.__getattr__): Get some
9394     attributes from instance variables as described with the
9395     delegated_methods class variable.
9396     (MainWindow.__init__): The interactor as ivar is gone. The
9397     parameter is still there for compatibility. The selection messages
9398     now come from the canvas.
9399     (MainWindow.current_layer, MainWindow.has_selected_layer):
9400     Delegate to the the canvas.
9401     (MainWindow.LayerShowTable, MainWindow.Classify)
9402     (MainWindow.identify_view_on_demand): The dialogs don't need the
9403     interactor parameter anymore.
9404    
9405     * Thuban/UI/tableview.py (TableFrame.__init__)
9406     (LayerTableFrame.__init__, LayerTableFrame.OnClose)
9407     (LayerTableFrame.row_selected): The interactor is gone. It's job
9408     from the dialog's point of view is now done by the mainwindow,
9409     i.e. the parent. Subscribe to SHAPES_SELECTED instead
9410     of SELECTED_SHAPE
9411    
9412     * Thuban/UI/dialogs.py (NonModalDialog.__init__): The interactor
9413     is gone. It's job from the dialog's point of view is now done by
9414     the mainwindow, i.e. the parent.
9415    
9416     * Thuban/UI/classifier.py (Classifier.__init__): The interactor is
9417     gone. It's job from the dialog's point of view is now done by the
9418     mainwindow, i.e. the parent.
9419    
9420     * Thuban/UI/tree.py (SessionTreeView.__init__): The interactor is
9421     gone. It's job from the dialog's point of view is now done by the
9422     mainwindow, i.e. the parent.
9423     (SessionTreeCtrl.__init__): New parameter mainwindow which is
9424     stored as self.mainwindow. The mainwindow is need so that the tree
9425     can still subscribe to the selection messages.
9426     (SessionTreeCtrl.__init__, SessionTreeCtrl.unsubscribe_all)
9427     (SessionTreeCtrl.update_tree, SessionTreeCtrl.OnSelChanged): The
9428     selection is now accessible through the mainwindow. Subscribe to
9429     SHAPES_SELECTED instead of SELECTED_SHAPE
9430    
9431     * Thuban/UI/identifyview.py (IdentifyView.__init__): Use the
9432     SHAPES_SELECTED message now.
9433     (IdentifyView.selected_shape): Now subscribed to SHAPES_SELECTED,
9434     so deal with multiple shapes
9435     (IdentifyView.__init__, IdentifyView.OnClose): The interactor is
9436     gone. It's job from the dialog's point of view is now done by the
9437     mainwindow, i.e. the parent.
9438    
9439     * Thuban/UI/controls.py (RecordListCtrl.fill_list): The second
9440     parameter is now a list of shape ids.
9441     (RecordTable.SetTable): The second parameter is now a list of
9442     indices.
9443    
9444     * Thuban/UI/renderer.py (ScreenRenderer.RenderMap): Rename the
9445     selected_shape parameter and ivar to selected_shapes. It's now a
9446     list of shape ids.
9447     (MapRenderer.draw_label_layer): Deal with multiple selected
9448     shapes. Rearrange the code a bit so that the setup and shape type
9449     distinctions are only executed once.
9450    
9451     * test/test_selection.py: Test cases for the selection class
9452    
9453 jonathan 527 2003-03-11 Jonathan Coles <[email protected]>
9454    
9455     * Thuban/Model/load.py: Temporary fix so that the xml reader
9456     doesn't cause Thuban to crash.
9457    
9458     * Thuban/Model/layer.py: Handle the cyclic references between
9459     a layer and its classification better, and be sure to disconnect
9460     the classification from the layer when the layer is destroyed
9461     so that we don't maintain a cyclic reference that may not be
9462     garbage collected.
9463    
9464     * Thuban/Model/classification.py: See comment for layer.py.
9465    
9466 jan 523 2003-03-12 Jan-Oliver Wagner <[email protected]>
9467    
9468     * HOWTO-Release: New. Information on the steps for releasing
9469     a new version of Thuban.
9470    
9471 jonathan 514 2003-03-11 Jonathan Coles <[email protected]>
9472    
9473     * Thuban/UI/classifier.py: Add normal border to SelectPropertiesDialog.
9474     Use True instead of true.
9475     (Classifier): Should have a single panel in which all the controls lie.
9476    
9477     * Thuban/UI/proj4dialog.py: Add normal border.
9478    
9479     * Thuban/UI/tree.py: Fixed problem with bad item images under Windows.
9480    
9481     * Thuban/UI/mainwindow.py: Use True instead of true.
9482    
9483     * setup.py: Update some definitions to use wxWindows2.4 files
9484    
9485     * Data/iceland_sample_class.thuban: Fixed file so that the
9486     field_type information is present.
9487    
9488 jonathan 490 2003-03-10 Jonathan Coles <[email protected]>
9489    
9490 jonathan 505 * Thuban/UI/classifier.py (Classifier.__init__): Make the
9491     field type label grow so that when the text changes the
9492     size is updated correctly. This may be a wxWindows bug.
9493    
9494     2003-03-10 Jonathan Coles <[email protected]>
9495    
9496 jonathan 499 * Thuban/UI/application.py: Changed SESSION_CHANGED to
9497     SESSION_REPLACED.
9498    
9499     * Thuban/UI/classifier.py: Wrap text with _().
9500     (ClassGrid.CreateTable): Set dimensions and size hints here,
9501     instead of in Reset, so we only set the size once.
9502    
9503     * Thuban/UI/dialogs.py: Don't need Shutdown(); just use Close()!
9504    
9505     * Thuban/UI/mainwindow.py (MainWindow.prepare_new_session):
9506     Call Close() instead of Shutdown().
9507    
9508     * Thuban/UI/messages.py: Changed SESSION_CHANGED to SESSION_REPLACED.
9509    
9510     * Thuban/UI/tree.py: Changed SESSION_CHANGED to SESSION_REPLACED.
9511     Go back to using OnClose() instead of Shutdown().
9512    
9513     2003-03-10 Jonathan Coles <[email protected]>
9514    
9515 jonathan 497 * Thuban/UI/classifier.py (Classifier): SelectField() needed
9516     to know the old field index as well as the new one.
9517    
9518     2003-03-10 Jonathan Coles <[email protected]>
9519    
9520 jonathan 495 * Thuban/UI/classifier.py (Classifier): Use __SelectField()
9521     to correctly set the table information and call this from
9522     __init__ and from _OnFieldSelect so that all the information
9523     is up to date when the dialog opens and when a field is changed.
9524    
9525     2003-03-10 Jonathan Coles <[email protected]>
9526    
9527 jonathan 490 * Thuban/Model/classification.py (Classification): Don't use
9528     layer's message function directly, use the ClassChanged() method
9529     when then classification changes. SetField/SetFieldType/SetLayer
9530     must keep the information about field name and field type in
9531     sync when an owning layer is set or removed.
9532    
9533     * Thuban/Model/layer.py: Added ClassChanged() so that the
9534     classification can tell the layer when its data has changed.
9535     (Layer.SetClassification): Accepts None as an arguement to
9536     remove the current classification and correctly handles
9537     adding a new classification.
9538    
9539     * Thuban/Model/load.py: Comment out print statement
9540    
9541     * test/test_classification.py, test/test_save.py: New and
9542     improved tests.
9543    
9544 jonathan 483 2003-03-07 Jonathan Coles <[email protected]>
9545    
9546     * Thuban/Model/classification.py: Implemented __copy__ and
9547     __deepcopy__ for ClassGroup* and ClassGroupProperites so
9548     they can easily be copied by the classifier dialog.
9549     (ClassGroupProperites.__init__): The default line color should
9550     have been Color.Black.
9551    
9552     * Thuban/UI/classifier.py: Setting and Getting table values now
9553     uses a consistent set of functions.
9554     (Classifier): Now non-modal. Has field type label which changes
9555     as the field changes. Keep track of buttons in a list so that
9556     we can enable/disable the buttons when the None field is selected.
9557     (SelectPropertiesDialog): Add buttons to make the colors transparent.
9558    
9559     * Thuban/UI/dialogs.py (NonModalDialog.Shutdown): New method which
9560     does what OnClose did, but can be called by the application to
9561     close a window. Needed when a session changes, and we have to
9562     close the classifier windows.
9563    
9564     * Thuban/UI/mainwindow.py (MainWindow.prepare_new_session):
9565     Shuts down open dialogs. Used when a new session is created
9566     or a session is opened.
9567     (MainWindow.SaveSession): Should only call application.SaveSession()
9568     if we don't call SaveSessionAs first.
9569     (MainWindow.Classify): Allow different classifier dialogs for
9570     different layers.
9571    
9572     * Thuban/UI/tree.py (SessionTreeView): Remove OnClose and let
9573     the parent class handle it. Add Shutdown() to unsubscibe from
9574     event notification and call the parent Shutdown(). This was
9575     necessary so the application can close the tree window.
9576    
9577 jonathan 478 2003-03-06 Jonathan Coles <[email protected]>
9578    
9579     * Thuban/Model/classification.py: Minor documentation changes,
9580     Addition of __eq__ and __ne__ methods.
9581     (Classification.SetLayer): prevent recursion between this method
9582     and Layer.SetClassification().
9583    
9584     * Thuban/Model/color.py: Addition of __eq__ and __ne__ methods.
9585    
9586     * Thuban/Model/layer.py (SetClassification): prevent recursion
9587     between this method and Classification.SetLayer().
9588    
9589     * test/test_classification.py, test/test_load.py,
9590     test/test_session.py: Fixed and added tests for the classification
9591     classes.
9592    
9593 bh 477 2003-03-06 Bernhard Herzog <[email protected]>
9594    
9595     * Thuban/UI/classifier.py (ClassGrid.__init__)
9596     (ClassGrid.CreateTable): Move the SetSelectionMode call to
9597     CreateTable because otherwise it triggers an assertion in
9598     wxPython/wxGTK 2.4.
9599    
9600 jonathan 459 2003-03-05 Jonathan Coles <[email protected]>
9601    
9602 jonathan 475 * Thuban/common.py: Move FIELDTYPE constants back to table.py.
9603 jonathan 471
9604 jonathan 475 * Thuban/Model/load.py: import FIELDTYPE constants from table.
9605 jonathan 471
9606 jonathan 475 * Thuban/UI/classifier.py: import FIELDTYPE constants from table.
9607 jonathan 471
9608 jonathan 475 * Thuban/Model/table.py: Put FIELDTYPE constants back.
9609 jonathan 471
9610     2003-03-05 Jonathan Coles <[email protected]>
9611    
9612 jonathan 459 * Thuban/UI/classifier.py: Added class documentation.
9613     Fixed RTbug #1713, #1714. Added Move[Up|Down] buttons.
9614     Store just the groups in the table and generate the other
9615     column information when it is requested. Add "None" field
9616     to pull-down to select no classification.
9617    
9618     * Thuban/common.py: Moved FIELDTYPE constants from table.py
9619     (Str2Num): Only catch ValueError exceptions.
9620    
9621     * Thuban/Model/classification.py: Class documentation. Renaming
9622     of methods with Stroke to Line. Groups are stored in a single
9623     list with the default as the first element. Groups are searched
9624     in the order they appear in the list.
9625    
9626     * Thuban/Model/color.py: Documentation.
9627    
9628     * Thuban/Model/layer.py (Layer): Add GetFieldType to retreive
9629     the kind of data represented by a field.
9630    
9631     * Thuban/Model/load.py (ProcessSession): Use proper string
9632     conversion function; fixes RTbug #1713.
9633    
9634     * Thuban/Model/save.py (Saver): Store field type information.
9635    
9636     * Thuban/Model/table.py: Put FIELDTYPE constants in common.py.
9637     (Table): Add field_info_by_name() to retrieve field information
9638     by specifying the field name, not the number.
9639    
9640     * Thuban/UI/mainwindow.py: Function name changes.
9641    
9642     * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Only
9643     get the layer classification once. Don't try to classify
9644     values when the field is None: just use the default properties.
9645    
9646     * Thuban/UI/view.py: Function name changes.
9647    
9648     * Doc/thuban.dtd: Add field_type attribute to a classification.
9649    
9650 bh 456 2003-03-04 Bernhard Herzog <[email protected]>
9651    
9652 bh 458 * Doc/thuban.dtd: Use correct syntax for optional attributes. Make
9653     the fill and stroke layer attributes optional with suitable
9654     default values. Add the stroke_width layer attribute. Use correct
9655     syntax for empty elements. Make the attribute list for labels
9656     refer to the label element.
9657    
9658     2003-03-04 Bernhard Herzog <[email protected]>
9659    
9660 bh 456 * setup.py (thuban_build_py.build): Add a comment about distutils in
9661     Python 2.3 containing some of the functionality we implement in
9662     setup.py ourselves.
9663    
9664     * Thuban/UI/classifier.py (ClassGrid.__init__): Set the table
9665     before the selection mode. Doing it the other way round triggers
9666     an assertion in wxWindows.
9667    
9668     * Thuban/Model/save.py (escape): Fix typo in doc-string
9669    
9670     * Thuban/Model/classification.py: Remove unnecessary wxPython
9671     import
9672    
9673 jonathan 448 2003-03-04 Jonathan Coles <[email protected]>
9674    
9675     * Thuban/Model/classification.py (ClassGroupRange.GetProperties):
9676     Parameter 'value' should default to None.
9677    
9678     * Thuban/UI/mainwindow.py: Use Layer.GetClassification() since
9679     the class attribute __classification is now private.
9680    
9681     * Thuban/UI/classifier.py (ClassGrid): Moved OnCellDClick() from
9682     Classifier to ClassGrid. Added support for removing selected rows,
9683     which including code for keeping track of when cells are selected,
9684     and deselected.
9685     (ClassTable): Support for added/removing rows. Fixed a problem
9686     with __ParseInput whereby it would not allow strings (only numbers)
9687     to be entered.
9688     (Classifier): Added button and supporting code for removing
9689     selected rows.
9690    
9691 jonathan 445 2003-02-27 Jonathan Coles <[email protected]>
9692 jonathan 434
9693     * Thuban/common.py: Moved color conversion functions into
9694     Thuban/UI/common.py.
9695     (Str2Num): Now converts the float (not the string) to a long/int
9696     so that an exception isn't thrown.
9697    
9698     * Thuban/UI/common.py: Common functions used in several UI modules
9699    
9700     * Thuban/Model/classification.py: Changed the class hierarchy
9701     so that a Classification consists of Groups which return
9702     Properties when a value matches a Group.
9703    
9704     * Thuban/Model/layer.py: Fixed name resolution problem.
9705    
9706     * Thuban/Model/load.py: Use new Classification and Group functions.
9707    
9708     * Thuban/Model/save.py (Saver.write_attribs): Fixes a test case
9709     failure.
9710     (Saver.write_classification): Use new Classification and Group
9711     functions.
9712    
9713     * Thuban/UI/classifier.py: Changes to use new Classification and Group
9714 jonathan 445 functions. Fix to create a tuple with a single value instead of
9715     simply returning the value.
9716 jonathan 434
9717     * Thuban/UI/renderer.py: Use new Classification and Group functions.
9718     Use common.py functions.
9719    
9720 jonathan 445 * Thuban/UI/tree.py: Use common.py functions.
9721 jonathan 447
9722     * test/test_classification.py: Use new Classification and Group
9723     classes.
9724 jonathan 434
9725 jonathan 426 2003-02-24 Jonathan Coles <[email protected]>
9726    
9727     * Thuban/common.py (Color2wxColour, wxColour2Color): Conversion
9728     functions from Thuban color objects to wxWindow colour objects.
9729    
9730     * Thuban/Model/classification.py (Classification): Renamed
9731     GetProperties() to GetClassData(). Used the new iterator
9732     in TreeInfo().
9733     (ClassIterator): Iterator implementation to iterate over the
9734     ClassData objects in a classification object.
9735    
9736     * Thuban/Model/save.py (Saver.write_classificaton): Uses
9737     the new iterator to save the classification information.
9738    
9739     * Thuban/UI/classifier.py (SelectPropertiesDialog): Support
9740     for changing the stroke and fill colors and previewing the
9741     changes.
9742    
9743     * Thuban/UI/mainwindow.py (MainWindow.OpenSession,
9744     MainWindow.SaveSessionAs): Text string changes so the dialogs
9745     have more meaningful titles.
9746    
9747     * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Change
9748     Classification method name from GetProperties to GetClassData.
9749    
9750     * Thuban/UI/view.py (MapCanvas.find_shape_at): Use method calls
9751     instead of accessing now non-existent class variables.
9752    
9753 bh 425 2003-02-24 Bernhard Herzog <[email protected]>
9754    
9755     * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Remove
9756     unneeded Shape() call. Rendering is substantially faster without
9757     it and it avoids some problems with broken shape files.
9758    
9759 frank 423 2003-02-20 Frank Koormann <[email protected]>
9760    
9761     Force minimal size of identify and label dialogs. The autosizing
9762     looked too ugly.
9763    
9764     * Thuban/UI/controls.py (RecordListCtrl): Set minimal width for columns.
9765     * Thuban/UI/labeldialog.py (LabelDialog.dialog_layout):
9766     Set size of listctrl.
9767     * Thuban/UI/identifyview.py (IdentifyView.__init__):
9768     Set size of dialog.
9769    
9770 jonathan 408 2003-02-19 Jonathan Coles <[email protected]>
9771    
9772     * test/test_classification.py, test/test_layer.py,
9773     test/test_load.py, test/test_map.py, test/test_session.py:
9774     Updated the tests to use the new functions that are in the
9775     respective classes.
9776    
9777     * Thuban/Model/classification.py (Classification):
9778     Uses the new ClassData* classes. Modification messages are
9779     passed up to the parent layer (if it exists).
9780     (ClassData): New class to encapsulate the common data in each
9781     classification property.
9782     (ClassDataDefault): Represents the Default class. data.
9783     (ClassDataPoint): Represents a single class. data point
9784     (ClassDataRange): Represents a class. range
9785     (ClassDataMap): Represents a class. map (unused).
9786    
9787     * Thuban/Model/color.py: Added Color.None to represent something
9788     with no color. Color.Black represents the color black.
9789     (NoColor): Helper class derived from Color to represent something
9790     with no color.
9791    
9792     * Thuban/Model/layer.py (Layer): Removed references to fill, stroke,
9793     stroke_width attributes. Made the 'classification' attribute private.
9794     New methods for setting/getting the classification.
9795    
9796     * Thuban/Model/load.py (ProcessSession): Use new methods on Layer
9797     to get the classifcation and use the new ClassData* classes to
9798     hold the classification data. Use Str2Num to convert numbers
9799     properly.
9800    
9801     * Thuban/Model/save.py (Saver): Use new Color and Classification
9802     methods
9803    
9804     * Thuban/UI/classifier.py (ClassGrid): New class to represent a
9805     custom grid.
9806     (ClassTable): Support for editing Values and Labels and for
9807     changing what type (point or range) of data is stored in each
9808     property based on how the user enters the data.
9809     (Classifier): Support for saving the new classifications and
9810     launching the dialog to edit a property.
9811     (SelectPropertiesDialog): New class for editing the visual
9812     properties of a classification (stroke color, width, and fill color)
9813     (ClassPreviewer): Took the Draw method from ClassRenderer and
9814     made most of it into this new class. Intend to use this class in
9815     the SelectPropertiesDialog for previewing changes.
9816    
9817     * Thuban/UI/renderer.py: Use new Color and Classification methods.
9818    
9819     * Thuban/UI/tree.py: Formatting changes.
9820    
9821     * Doc/thuban.dtd: Add 'label' element
9822    
9823     * Thuban/common.py: New. Contains common routines used throughout
9824     the code.
9825     (Str2Num): Takes a string and converts it to the "best" type of
9826     number.
9827    
9828 bh 405 2003-02-14 Bernhard Herzog <[email protected]>
9829    
9830     * Thuban/UI/view.py (MapCanvas.OnLeftUp): Make sure that the
9831     dragging flag is always set to 0 even when the tool implementation
9832     raises an exception
9833    
9834 bh 402 2003-02-11 Bernhard Herzog <[email protected]>
9835    
9836     * Thuban/UI/application.py (ThubanApplication.splash_screen): New
9837     method to create a splash screen.
9838     (ThubanApplication.ShowMainWindow): New. Show the main window.
9839     Needed so the splash screen can display the mainwindow
9840     (ThubanApplication.OnInit): Call the
9841     new splash_screen method to determine whether the application
9842     should display a splash screen. If it displays a splash screen do
9843     not immediately show the main window.
9844    
9845 jonathan 399 2003-02-11 Jonathan Coles <[email protected]>
9846    
9847     * Thuban/Model/classification.py: Added import line to fix
9848     feature conflicts between running on python2.2 and python2.1.
9849    
9850     * Thuban/UI/classifier.py (ClassTable): Didn't need to hang
9851     onto the clinfo parameter, so removed the deepcopy().
9852    
9853 jonathan 396 2003-02-10 Jonathan Coles <[email protected]>
9854    
9855 tkoester 403 * Thuban/Model/save.py (Saver.open_element, Saver.close_element):
9856 jonathan 396 Added element_open variable to track opening and closing of tags
9857     so that tags that don't span more than one line are closed with
9858     /> instead of </tag_name>. Use the GetDefault*() methods of
9859     the Classification class.
9860    
9861     * Thuban/Model/classification.py (Classificaton): Added set and
9862     get methods for the default data. The class also takes a layer
9863     reference so that modification messages can be sent. Fixed the
9864     methods to use the new ClassData class.
9865     (ClassData): New class to encapsulate the classification data
9866    
9867     * Thuban/Model/layer.py (Layer): Remove the
9868 tkoester 403 Set[Fill|Stroke|StrokeWidth]() methods. Code should call the
9869 jonathan 396 SetDefault*() methods on the layer's classification object.
9870 tkoester 403 (Layer.__init__): Use the new SetDefault*() methods in the
9871 jonathan 396 Classification class.
9872    
9873     * Thuban/Model/load.py (ProcessSession): Use the new ClassData
9874     object instead of a dictionary.
9875    
9876 tkoester 403 * Thuban/UI/classifier.py (ClassRenderer): New class to
9877 jonathan 396 draw the classifications in the dialog box's table.
9878     (Classifier): Modified to use the ClassRenderer class.
9879    
9880 tkoester 403 * Thuban/UI/mainwindow.py (MainWindow): Use the SetDefault*()
9881     methods of the Classification class.
9882 jonathan 396
9883     * Thuban/UI/renderer.py (MapRenderer): Use the Get*() methods
9884     of the ClassData class.
9885    
9886     * test/test_classification.py, test/test_layer.py,
9887     test/test_map.py, test/test_session.py: Fix the tests to work
9888     with the above code changes.
9889    
9890 jonathan 387 2003-02-03 Jonathan Coles <[email protected]>
9891    
9892     * Thuban/Model/classification.py (Classification): Added getNull()
9893     to return the NullData reference
9894    
9895     * Thuban/Model/layer.py (Layer.SetFill, Layer.SetStroke,
9896     Layer.SetStrokeWidth): Modified these functions to change the
9897     null data in the classification rather than keep these values
9898     directly in the Layer class. Menu options to change these values
9899     work again.
9900    
9901 jonathan 380 2003-01-28 Jonathan Coles <[email protected]>
9902    
9903 jonathan 384 * Thuban/UI/classifier.py (Classifier): Resolved merging conflicts.
9904 tkoester 403 Fixed crashing problem on some systems. Dialog box shows
9905 jonathan 380 classification data.
9906    
9907 jonathan 384 * Thuban/UI/tree.py (SessionTreeCtrl.add_items): Handle drawing
9908     Colors in the tree view.
9909    
9910     * Thuban/Model/layer.py (Layer.TreeInfo): Added a call to build
9911     the tree info for classifications. Commented out unnecessary lines.
9912    
9913     * Thuban/Model/classification.py (Classification.TreeInfo): New
9914     function to add information about the classification into the
9915     tree view.
9916    
9917 tkoester 403 2003-01-27 Jan-Oliver Wagner <[email protected]>
9918 jan 375
9919 tkoester 403 * Thuban/__init__.py (_): New.
9920 jan 375
9921     * Thuban/Model/classification.py, Thuban/Model/extension.py,
9922     Thuban/Model/layer.py, Thuban/Model/load.py, Thuban/Model/map.py,
9923 tkoester 403 Thuban/Model/session.py, Thuban/UI/application.py,
9924     Thuban/UI/classifier.py, Thuban/UI/context.py, Thuban/UI/controls.py,
9925     Thuban/UI/identifyview.py, Thuban/UI/labeldialog.py,
9926     Thuban/UI/mainwindow.py, Thuban/UI/menu.py, Thuban/UI/proj4dialog.py,
9927     Thuban/UI/renderer.py, Thuban/UI/tree.py, Thuban/Lib/connector.py,
9928     Thuban/Lib/fileutil.py: Replace user string by _() for i18n.
9929 jan 375
9930 jonathan 370 2003-01-27 Jonathan Coles <[email protected]>
9931    
9932 tkoester 403 * Thuban/Model/layer.py: Classification initialization calls.
9933 jonathan 370
9934 tkoester 403 * Thuban/Model/classification.py: Created class to encapsulate
9935     a layer classification. Supports specific data points and
9936     ranges.
9937 jonathan 370
9938 tkoester 403 * Thuban/Model/load.py: Added support for loading classification
9939     information.
9940 jonathan 370
9941 tkoester 403 * Thuban/Model/save.py: Added support for saving classification
9942     information.
9943 jonathan 370
9944 tkoester 403 * Thuban/UI/classifier.py: Initial class for a dialog box for
9945     specifying classification information.
9946 jonathan 370
9947 tkoester 403 * Thuban/UI/mainwindows.py: Support for opening the classifier
9948     dialog.
9949 jonathan 370
9950 tkoester 403 * Thuban/UI/renderer.py: Support for drawing a layer with the
9951     classification information.
9952 jonathan 370
9953 tkoester 403 * Data/iceland_sample_class.thuban: iceland_sample with
9954     classification data.
9955 jonathan 370
9956 tkoester 403 * test/test_classification: Tests for the Classification class.
9957 jonathan 370
9958 bh 359 2002-12-09 Bernhard Herzog <[email protected]>
9959    
9960 bh 361 * test/test_command.py: New. Tests for the command classes.
9961    
9962 bh 359 * Thuban/UI/command.py (ToolCommand): New class for tool commands.
9963     (Command.IsTool): New method to distinguish between command
9964     switching tools and other commands.
9965    
9966     * Thuban/UI/view.py (MapCanvas.SelectTool): New method to select
9967     the tool to avoid direct assignments to instance variables
9968     (MapCanvas.ZoomInTool, MapCanvas.ZoomOutTool, MapCanvas.PanTool)
9969     (MapCanvas.IdentifyTool, MapCanvas.LabelTool): Use SelectTool to
9970     change the tool
9971    
9972     * Thuban/UI/mainwindow.py (MainWindow.update_command_ui): If an
9973     active tool's command turns insensitive, disable the tool.
9974     (_tool_command): Use the new ToolCommand class
9975    
9976     * Examples/simple_extensions/simple_tool.py (simple_tool): Use the
9977     SelectTool method to change the tool
9978     (iconfile): Use the ToolCommand class
9979    
9980 bh 354 2002-12-03 Bernhard Herzog <[email protected]>
9981    
9982     * Thuban/UI/tree.py (SessionTreeCtrl.normalize_selection): Handle
9983     the case of selected items that are not children of Layers or Maps
9984     properly. Previously this bug would trigger an assertion in
9985     wxWindows.
9986    
9987 frank 352 2002-11-06 Frank Koormann <[email protected]>
9988    
9989 bh 354 * Thuban/UI/mainwindow.py: Altered the order of tools in the
9990     toolbar: First now are all navigation tools (Zoom In/Out, Pan,
9991     Full Extent).
9992 tkoester 403
9993 bh 349 2002-10-23 Bernhard Herzog <[email protected]>
9994    
9995     * setup.py (setup call): version now 0.1.3
9996    
9997     * MANIFEST.in: Add the files in test/
9998    
9999     * test/README: Add note about tests requiring the iceland data
10000    
10001     * Thuban/UI/mainwindow.py (MainWindow.About): Add 2002 to
10002     copyright notice.
10003    
10004 bh 344 2002-10-18 Bernhard Herzog <[email protected]>
10005    
10006     * test/test_map.py
10007     (TestMapWithContents.test_projected_bounding_box): Use an explicit
10008     epsilon.
10009    
10010     * test/support.py (FloatComparisonMixin.assertFloatEqual)
10011     (FloatComparisonMixin.assertFloatSeqEqual): give a more useful
10012     message if the assertion fails and don't return the return value
10013     of self.assert_. In assertFloatSeqEqual the return meant that not
10014     all items of the sequence were compared.
10015    
10016 bh 326 2002-09-20 Bernhard Herzog <[email protected]>
10017    
10018 bh 341 * test/test_fileutil.py: New. Test cases for Thuban.Lib.fileutil
10019    
10020     * Thuban/Lib/fileutil.py: Fixup some whitespace and typos
10021    
10022 bh 338 * test/test_map.py (TestMapWithContents.test_tree_info): Create
10023     the string with the bounding box on the fly because of platform
10024     differences in the way %g is handled.
10025    
10026     * test/test_layer.py (TestLayer.test_empty_layer): Create an empty
10027     DBFfile too because Thuban layers can't yet cope missing DBF
10028     files.
10029    
10030     2002-09-20 Bernhard Herzog <[email protected]>
10031    
10032 bh 326 * test/test_menu.py: Use initthuban instead of
10033     add_thuban_dir_to_path to initialize Thuban.
10034    
10035     * test/support.py (FloatComparisonMixin.assertFloatEqual): New.
10036     Mixin class for float comparisons
10037     (SubscriberMixin): New. Mixin class to test messages sent through
10038     the Connector class
10039    
10040     * test/README: Fix a typo and add the -v flag to the command for
10041     individual tests
10042    
10043 bh 335 * test/test_session.py: New. Test cases for Thuban.Model.session
10044    
10045     * test/test_proj.py: New. Test cases for Thuban.Model.proj
10046    
10047     * test/test_map.py: New. Test cases for Thuban.Model.map
10048    
10049     * test/test_layer.py: New. Test cases for Thuban.Model.layer
10050    
10051     * test/test_label.py: New. Test cases for Thuban.Model.label
10052    
10053     * test/test_connector.py: New. Test cases for Thuban.Lib.connector
10054    
10055     * test/test_color.py: New. Test cases for Thuban.Model.color
10056    
10057     * test/test_base.py: New. Test cases for Thuban.Model.base
10058    
10059 bh 322 2002-09-13 Bernhard Herzog <[email protected]>
10060    
10061     * Thuban/Model/session.py (Session.forwarded_channels): Forward
10062     the CHANGED channel too.
10063    
10064     * Thuban/Model/map.py (Map.forwarded_channels): Forward the
10065     CHANGED channel too.
10066     (Map.__init__): Call the Modifiable constructor as well.
10067    
10068     * Thuban/Model/base.py (Modifiable.UnsetModified): Issue a CHANGED
10069     event if the modified flag changes.
10070     (Modifiable.changed): Tweak the doc-string.
10071    
10072     * Thuban/UI/mainwindow.py (MainWindow.view_position_changed)
10073     (MainWindow.set_position_text): Put the code that puts the text
10074     with the mouse position into the status bar into the new method
10075     set_position_text so that it can overwritten in derived classes.
10076    
10077 bh 317 2002-09-12 Bernhard Herzog <[email protected]>
10078    
10079     * Thuban/UI/mainwindow.py (MainWindow.RunMessageBox): Center the
10080     message box on the main window.
10081    
10082 bh 313 2002-09-11 Bernhard Herzog <[email protected]>
10083    
10084     * Thuban/UI/mainwindow.py: Underline the 'x' in "Exit" instead of
10085     the 'E' because it's less likely to interfere with other menu
10086     entries.
10087 bh 315 (MainWindow.build_menu): remove an incorrect comment.
10088 bh 313
10089 bh 311 2002-09-10 Bernhard Herzog <[email protected]>
10090    
10091     * Thuban/UI/mainwindow.py (MainWindow.Map): New.
10092     (_tool_command): Add sensitive parameter
10093     (_has_visible_map): Sensitivity callback to tools and other
10094     commands that require a visible map. Use it in map_zoom_in_tool,
10095     map_zoom_out_tool, map_pan_tool, map_identify_tool, map_label_tool
10096     and map_full_extent
10097    
10098 bh 308 2002-09-06 Bernhard Herzog <[email protected]>
10099    
10100     * Thuban/UI/mainwindow.py (MainWindow.OnClose): Unsubscribe
10101     VIEW_POSITION
10102    
10103 tkoester 403 2002-09-04 Frank Koormann <[email protected]>
10104 frank 306
10105     * Resources/Bitmaps/fullextent.xpm: Updated Icon (removed "potatoe")
10106    
10107 bh 302 2002-09-02 Bernhard Herzog <[email protected]>
10108    
10109 bh 304 * Thuban/UI/view.py: Get rid of the idle redraw. This is done by
10110     wxWindows already and our implementation doesn't work correctly
10111     with wxGTK 2.3:
10112     (MapCanvas.__init__): Remove the instance variable
10113     (MapCanvas.OnPaint): Always call do_redraw when there's a map to
10114     be drawin
10115     (MapCanvas.OnIdle): Removed.
10116    
10117 bh 302 * Thuban/UI/view.py (MapCanvas.unprojected_rect_around_point): Add
10118     a parameter to determine the size of the rectangle.
10119     (MapCanvas.find_shape_at): Create the box around the point on a
10120     layer by layer basis and make the size depend on the shape type.
10121     This solves a problem with the selection of point shapes at the
10122     border of the layer's bounding box
10123    
10124 bh 292 2002-08-30 Bernhard Herzog <[email protected]>
10125    
10126 bh 300 * Thuban/UI/mainwindow.py (MainWindow.CanRemoveLayer): New method
10127     for the sensitivity of remove layer.
10128     (_can_remove_layer): New. Sensitivity callback for remove layer
10129     (Command layer_remove): Use _can_remove_layer
10130    
10131     * Thuban/Model/map.py (Map.CanRemoveLayer): New method to
10132     determine whether a given layer can be deleted.
10133    
10134 bh 297 * Thuban/UI/view.py (MapCanvas.__init__, MapCanvas.OnPaint)
10135     (MapCanvas.do_redraw): Get rid of the unused update_region
10136     instance variable
10137    
10138 bh 294 * Thuban/UI/view.py: Add/update some doc-strings.
10139    
10140 bh 292 * test/: new subdirectory with a bunch of unit tests.
10141    
10142     * test/README, test/test_table.py, test/test_save.py,
10143     test/test_menu.py, test/test_load.py: Initial set of tests and
10144     brief instructions on how to run them
10145    
10146 bh 287 2002-08-29 Bernhard Herzog <[email protected]>
10147    
10148 bh 291 * Thuban/UI/renderer.py (ScreenRenderer.draw_shape_layer): Handle
10149     arcs with multiple parts.
10150    
10151 bh 289 * Thuban/UI/view.py (ZoomInTool.MouseUp, ZoomOutTool.MouseUp):
10152     Handle degenrate rectangles.
10153    
10154 bh 287 * Thuban/Model/table.py: Make writing records work correctly:
10155     (Table.__init__): Keep track of whether the DBF is open for
10156     writing
10157     (Table.write_record): Open the DBF file for writing when necessary
10158    
10159 bh 285 2002-08-27 Bernhard Herzog <[email protected]>
10160    
10161     * Thuban/Model/table.py (Table.write_record, Table.__init__): Open
10162     dbf files only for reading by default. Use a new writable dbf
10163     object for writing.
10164    
10165 bh 278 2002-08-26 Bernhard Herzog <[email protected]>
10166    
10167 bh 282 * Thuban/UI/mainwindow.py: Refactor the context creation:
10168     (MainWindow.Context): New method to return a context
10169     (MainWindow.invoke_command, MainWindow.update_command_ui): Use the
10170     new method
10171    
10172 bh 278 * Thuban/UI/tableview.py (TableGrid, LayerTableGrid): Split the
10173     layer table specific code from TableGrid into LayerTableGrid
10174     (TableFrame, LayerTableFrame): Split the layer table specific code
10175     from TableFrame into LayerTableFrame
10176 bh 280 (LayerTableGrid.select_shape): Remove a debug print
10177 bh 278
10178     * Thuban/UI/mainwindow.py (MainWindow.LayerShowTable): Use the
10179     LayerTableFrame
10180    
10181 bh 277 2002-08-23 Bernhard Herzog <[email protected]>
10182    
10183     * Thuban/Model/layer.py (Layer.__init__): Make sure we have an
10184     absolute filename.
10185    
10186 bh 269 2002-08-22 Bernhard Herzog <[email protected]>
10187    
10188 bh 275 * Thuban/Model/table.py (Table.write_record): New method to write
10189     records.
10190 tkoester 403 (Table.__init__): Open the DBF file for writing too.
10191 bh 275
10192     * Thuban/UI/controls.py (RecordTable.SetValue): Write the value
10193     into the underlying table.
10194    
10195     * extensions/shapelib/shapefil.h (DBFCommit),
10196     extensions/shapelib/dbfopen.c (DBFCommit): New API function to
10197     commit any changes made to the DBF file.
10198    
10199 bh 271 * Thuban/UI/mainwindow.py (make_check_current_tool)
10200     (_tool_command): Put the code that generates the "checked"
10201     callback into a separate function so that we can reuse it
10202     elsewhere
10203    
10204 bh 269 * Thuban/Model/save.py (Saver): New class to handle serializing a
10205     session into an XML file. The main reason to introduce a class is
10206     that applications built on Thuban can derive from it so that they
10207     can save additional information in a session file.
10208     (save_session): Delegate almost all the work to the Saver class.
10209     Rename the filename argument to file because it may be a file like
10210     object now.
10211    
10212     * Thuban/Model/load.py: Get rid of the Python 1.5.2 compatibility
10213     code. Remove the little test code which would be executed when the
10214     module is run as a script which didn't work anymore since it can't
10215     import the other Thuban modules.
10216     (ProcessSession, load_session): Refactor the ProcessSession to
10217     have one method for each element start and end tag so that derived
10218     classes can easily override the processing of individual tags.
10219     Also, always parse with namespaces enabled because applications
10220     built on top of Thuban will likely use namespaces if they extend
10221     the session file format.
10222    
10223 bh 266 2002-08-21 Bernhard Herzog <[email protected]>
10224    
10225     * setup.py (ThubanInstall.run): Don't repr install_lib_orig
10226     because thubaninit_contents will do it for us.
10227    
10228 tkoester 403 2002-08-16 Jan-Oliver Wagner <[email protected]>
10229 jan 265
10230     * Thuban/UI/mainwindow.py: menu item 'show session tree' now disable if
10231     tree window already open
10232    
10233 bh 259 2002-08-15 Bernhard Herzog <[email protected]>
10234    
10235 bh 263 * Thuban/Model/layer.py (Layer.Destroy): Call the unboundd method
10236     with self.
10237    
10238     * Thuban/UI/view.py (MapCanvas.OnLeftUp): Only release the mouse
10239     when we have actually captured it.
10240    
10241 bh 259 * Thuban/Model/layer.py (Layer.Destroy): New. Explicitly close the
10242     shapefile and destroy the table.
10243    
10244     * Thuban/Model/table.py (Table.Destroy): New. Close the DBF file.
10245    
10246 bh 254 2002-08-14 Bernhard Herzog <[email protected]>
10247    
10248 bh 256 * Thuban/UI/controls.py (RecordTable.__init__): Remove the unused
10249     instance variable columns
10250     (RecordTable.GetTypeName): row and col may be negative in some
10251     cases.
10252    
10253 bh 254 * setup.py (InstallLocal.initialize_options)
10254     (InstallLocal.finalize_options, InstallLocal.user_options): New
10255     option create-init-file to build a thubaninit.py when running
10256     install_local
10257     (InstallLocal.run): Create the thubaninit.py module when requested
10258     (thubaninit_contents): Split the template into several parts and
10259     create a new function thubaninit_contents that creates the
10260     contents of a thubaninit module.
10261     (ThubanInstall.run): Use the new function to create the thubaninit
10262     module.
10263    
10264 bh 252 2002-07-30 Bernhard Herzog <[email protected]>
10265    
10266     * Thuban/UI/application.py (ThubanApplication.OnExit): Do some
10267     cleanup.
10268     (ThubanApplication.MainLoop): Extend to automatically call OnExit.
10269    
10270     * Thuban/Model/session.py (Session.Destroy): Don't bypass the
10271     direct base class' Destroy method.
10272    
10273     * Thuban/Model/map.py (Map.ClearLayers): New method to delete all
10274     layers.
10275     (Map.Destroy): Destroy the label_layer as well and call the
10276     inherited Desatroymethod first so that no more messages are
10277     issued.
10278     (Map.RaiseLayer, Map.LowerLayer): Only issue LAYERS_CHANGED
10279     message if the stacking order actually has changed. Add
10280     doc-strings.
10281     (Map.BoundingBox): Correct the doc-string.
10282     (Map.AddLayer, Map.RemoveLayer, Map.Layers, Map.HasLayers)
10283     (Map.ProjectedBoundingBox, Map.SetProjection): Add doc-strings.
10284    
10285     * Thuban/Model/label.py (LabelLayer.ClearLabels): New to delete
10286     all labels.
10287    
10288 bh 247 2002-07-29 Bernhard Herzog <[email protected]>
10289    
10290     * Thuban/Model/map.py (Map.subscribe_layer_channels)
10291     (Map.unsubscribe_layer_channels): Put the code that (un)subscribes
10292     to a layer's channels into separate methods.
10293     (Map.RemoveLayer, Map.AddLayer): Call the new methods
10294     (Map.Destroy): Unsubscribe from a layer's channels before
10295     destroying it.
10296    
10297     * Thuban/UI/view.py (MapCanvas.find_shape_at): Change the
10298     selected_layer parameter to searched_layer which is the layer to
10299     search in.
10300     (MapCanvas.SelectShapeAt): New parameter layer to restrict the
10301     search to that layer. Return the selected layer and shape.
10302    
10303     * Examples/simple_extensions/simple_tool.py (simple_tool): Fix a
10304     typo
10305    
10306 bh 238 2002-07-24 Bernhard Herzog <[email protected]>
10307    
10308 bh 243 * Thuban/UI/application.py (ThubanApplication.create_session):
10309     Extend the doc string.
10310     (ThubanApplication.subscribe_session)
10311     (ThubanApplication.unsubscribe_session): New methods to
10312     subscribe/unsubscribe to/from session channels.
10313     (ThubanApplication.SetSession): Call the new methods here.
10314     (ThubanApplication.maps_changed, ThubanApplication.set_map):
10315     Renamed set_map to maps_changed. Its now a subscriber for
10316     MAPS_CHANGED.
10317    
10318     * Thuban/UI/view.py (ZoomOutTool.MouseUp): Use the correct
10319     x-coordinate in case of simple clicks
10320    
10321     * Thuban/Model/base.py (Modifiable.changed): Apply the args tuple,
10322     don't pass it as a parameter
10323    
10324     * Thuban/Model/session.py (Session.RemoveMap): New
10325    
10326 bh 238 * Thuban/UI/mainwindow.py (MainWindow.__init__): Turn the initial
10327     window size into a parameter.
10328    
10329 bh 235 2002-07-23 Bernhard Herzog <[email protected]>
10330    
10331 bh 237 * Thuban/UI/menu.py (Menu.item_index): Also search for menus not
10332     just commands.
10333    
10334 bh 235 * Thuban/UI/mainwindow.py (MainWindow.__init__): Change the
10335     parameter list a bit to allow setting the window title and the
10336     initial message in the status bar. Update the callers.
10337    
10338     * Thuban/UI/application.py (ThubanApplication.OnInit)
10339     (ThubanApplication.CreateMainWindow): Put the mainwindow
10340     instantiation into a separate method so that it can be overridden
10341     by a subclass.
10342    
10343 bh 230 2002-07-19 Bernhard Herzog <[email protected]>
10344    
10345 bh 234 * Thuban/Model/session.py: Issue a CHANGED message every time
10346     another changed message is issued to make it easier to get
10347     notified of changes.
10348     (Session): Update the doc string
10349     (Session.forward): Issue changed-events as CHANGED as well.
10350     (Session.changed): Overwrite the inherited version to issue
10351     CHANGED events as well.
10352    
10353     * Thuban/UI/tree.py: We can now simply subscribe to the session's
10354     CHANGED channel to be informed of changes.
10355     (SessionTreeCtrl.session_channels): Not needed any longer.
10356 tkoester 403 (SessionTreeCtrl.unsubscribe_all, SessionTreeCtrl.session_changed):
10357 bh 234 Only have to (un)subscribe CHANGED
10358    
10359     * Thuban/Model/map.py (Map.TreeInfo): Deal better with empty maps.
10360    
10361 bh 230 * Thuban/UI/main.py, Thuban/UI/__init__.py: Move the work-around
10362     for the wxPython locale bug to __init__.py so that it's
10363     automatically executed by anybody using UI code from Thuban.
10364    
10365 bh 225 2002-07-18 Bernhard Herzog <[email protected]>
10366    
10367 bh 228 * Thuban/UI/main.py (main): app no longer needs to be global
10368    
10369     * Thuban/UI/mainwindow.py (MainWindow.__init__): Add application
10370     as parameter and store it in an instance variable
10371     (MainWindow.invoke_command, MainWindow.update_command_ui)
10372     (MainWindow.save_modified_session, MainWindow.NewSession)
10373     (MainWindow.OpenSession, MainWindow.SaveSession)
10374     (MainWindow.SaveSessionAs, MainWindow.ShowSessionTree): Use self's
10375     application object.
10376    
10377     * Thuban/UI/application.py (ThubanApplication.OnInit): Instantiate
10378     the main window with self.
10379    
10380 bh 225 * Thuban/UI/context.py: New module with the context class
10381    
10382     * Thuban/UI/command.py (Command): Update doc string.
10383    
10384     * Thuban/UI/mainwindow.py (MainWindow.invoke_command,
10385     MainWindow.update_command_ui): Pass an instance of the context
10386     class to the command's methods
10387     (check_current_tool, call_method): Handle the new context
10388     implementation
10389    
10390     * Examples/simple_extensions/simple_tool.py (simple_tool,
10391     check_simple_tool): Handle the new context implementation
10392    
10393     * Examples/simple_extensions/simple_command.py (simple_command):
10394     Handle the new context implementation. Update the comments about
10395     the context.
10396    
10397     * Thuban/UI/application.py (ThubanApplication.SetSession): Add
10398     doc-string
10399     (ThubanApplication.Session): New method to return the session
10400     object
10401    
10402     * Thuban/UI/tree.py (SessionTreeCtrl.update_tree): The
10403     interactor's selected_layer may not be a layer of the current
10404     session when the tree is updated while a new session is being set.
10405    
10406 bh 217 2002-07-17 Bernhard Herzog <[email protected]>
10407    
10408     * Thuban/UI/tree.py (color_string): Removed. No longer used.
10409     (SessionTreeCtrl.update_tree, SessionTreeCtrl.add_items): Split
10410     update_tree into update_tree and add_items. The tree now uses a
10411     more generic way to display the contents of the tree.
10412     (SessionTreeCtrl): Add a doc string explaining the TreeInfo method
10413    
10414     * Thuban/Model/layer.py (Layer.TreeInfo),
10415     Thuban/Model/extension.py (Extension.TreeInfo),
10416     Thuban/Model/map.py (Map.TreeInfo),
10417 tkoester 403 Thuban/Model/session.py (Session.TreeInfo):
10418 bh 217 Add TreeInfo methods to implement the new tree view update scheme
10419    
10420 bh 216 2002-07-16 Bernhard Herzog <[email protected]>
10421    
10422     * Thuban/UI/application.py: Don't use "import from" for the
10423     MainWindow. It can't always be resolved.
10424     (ThubanApplication.OnInit): change reference to MainWindow
10425     accordingly.
10426    
10427     * Thuban/UI/menu.py (Menu.SetItems): New method to replace a menu
10428     completely
10429    
10430 bh 213 2002-07-10 Bernhard Herzog <[email protected]>
10431    
10432     * setup.py (create_init_module): New configurable variable whose
10433     default depends on the platform we're running on.
10434     (ThubanInstall.initialize_options): Initialize
10435     self.create_init_module from the global create_init_module
10436     (ThubanInstall.user_options): indictate that the options
10437     create-init-module and init-module-dir have arguments.
10438    
10439     * setup.py: In the setup call change the version number to include
10440     cvs.
10441    
10442     * MANIFEST.in: Add the files in Examples
10443    
10444 bh 205 2002-07-09 Bernhard Herzog <[email protected]>
10445    
10446 bh 210 * setup.py: In the setup call, use the thuban homepage as the
10447     value of the url parameter.
10448    
10449 bh 208 * Examples: New subdirectory for examples.
10450    
10451     * Examples/simple_extensions/simple_tool.xpm,
10452     Examples/simple_extensions/simple_tool.py,
10453     Examples/simple_extensions/simple_command.py,
10454     Examples/simple_extensions/README: Simple examples showing how to
10455     add new commands and tools.
10456    
10457 bh 207 * setup.cfg (bdist_rpm): Add the default value for prefix and tell
10458     bdist_rpm that we also have an install script.
10459     (bdist_inno): Add 2002 to the copyright notice.
10460    
10461 bh 205 * setup.py: Create a file in python's site-packages directory to
10462     make installation of Thuban as a library easier.
10463     (ThubanInstall.user_options): Add two new options,
10464     create-init-module and init-module-dir
10465     (ThubanInstall.expand_with_pure_python_dirs): New method to expand
10466     filenames for installation in the default directories.
10467     (ThubanInstall.select_scheme, ThubanInstall.convert_paths): Extend
10468     the inherited methods to capture some filenames before they're
10469     transformed too much by distutils.
10470     (ThubanInstall.run): Create the init module if requested.
10471     (ThubanInstall.thuban_init_filename): New method to return the
10472     full name of the init module.
10473     (ThubanInstall.get_outputs): Append the filename of the init
10474     module.
10475    
10476 bh 202 2002-07-08 Bernhard Herzog <[email protected]>
10477    
10478 bh 205 * setup.py (thuban_bdist_rpm): Extend this version of bdist_rpm to
10479     handle the prefix properly which means that the default for the
10480     installation prefix should be /usr for RPMs and /usr/local when
10481     doing a normal source install.
10482     (bdist_rpm_install_script): Script to override the default install
10483     commands in the specfile generated by the bdist_rpm command.
10484     (thuban_bdist_rpm.user_options): Add a prefix option
10485     (thuban_bdist_rpm.initialize_options): Init the prefix option.
10486     Create the script files for the spec files as empty files here
10487     (thuban_bdist_rpm._make_spec_file): Override the inherited method
10488     to fill the script files with content.
10489    
10490 bh 202 * Thuban/Model/save.py (relative_filename): Wrapper around
10491     Thuban.Lib.fileutil.relative_filename that accepts an empty dir
10492     argument. save_session now automatically uses this version,
10493     solving a problem when saving to a relative filename.
10494    
10495     * setup.py: In the setup call, make sure that the library
10496     directories are under $prefix/lib not directly under $prefix.
10497    
10498 tkoester 403 2002-06-20 Jan-Oliver Wagner <[email protected]>
10499 jan 199
10500     * Thuban/Model/extension.py: new module to handle extension objects.
10501     * Thuban/Model/messages.py: new messages for extensions.
10502     * Thuban/Model/session.py (Session.Extensions, Session.HasExtensions,
10503     Session.AddExtension): new for handling extensions.
10504     Also some other minor changes to round up extension handling.
10505     * Thuban/UI/tree.py (SessionTreeCrtl:update_tree): Added visualization
10506     of Extension titles and title and names of its objects.
10507    
10508 bh 194 2002-05-29 Bernhard Herzog <[email protected]>
10509    
10510     * Thuban/UI/mainwindow.py (MainWindow.bind_command_events): Bind
10511 bh 202 the events for a command.
10512 bh 194 (MainWindow.add_toolbar_command, MainWindow.add_menu_command):
10513     Call bind_command_events to bind the events. add_toolbar_command
10514     can now bind events too so that it's possible to have commands
10515     that are only available through the toolbar.
10516     (MainWindow.init_ids): New instance variable events_bound to keep
10517     track of for which commands events have been bound.
10518    
10519 bh 190 2002-05-28 Bernhard Herzog <[email protected]>
10520    
10521     * Thuban/UI/menu.py: New module to build and manage menus.
10522    
10523     * Thuban/UI/mainwindow.py: Remove some unused imports.
10524     (MainWindow.__init__, main_menu): move the definition of the main
10525     menu from __init__ to the Menu instance main_menu.
10526     (MainWindow.build_menu_bar, MainWindow.build_menu): New methods to
10527     build the menu bar and sub-menus from a menu description.
10528    
10529     * Thuban/UI/application.py (ThubanApplication.OnInit): Read the
10530     startup file
10531     (ThubanApplication.read_startup_files): New method to run
10532     ~/.thuban/thubanstart.py
10533    
10534 bh 192 * Thuban/UI/mainwindow.py (MainWindow.__init__, main_toolbar):
10535     Move the toolbar definition to the Menu instance main_toolbar.
10536     (MainWindow.build_toolbar): New method to build the toolbar
10537     similar to the build_menu methods
10538    
10539 bh 184 2002-05-23 Bernhard Herzog <[email protected]>
10540    
10541 bh 186 * Thuban/UI/mainwindow.py (MainWindow.__init__): Fix spelling of
10542     layer_outline_color. Fix it in the definition of the command too.
10543    
10544 bh 184 * Thuban/UI/command.py (Command): Fix typo in doc string
10545    
10546 bh 182 2002-05-22 Bernhard Herzog <[email protected]>
10547    
10548     * Thuban/UI/mainwindow.py (MainWindow.RunMessageBox): Fix a typo
10549     in the docstring
10550    
10551 bh 175 2002-05-15 Bernhard Herzog <[email protected]>
10552    
10553 bh 180 * Thuban/Model/layer.py (Layer.open_shapefile): Set bbox to None
10554     when the shapefile is empty.
10555     (Layer.BoundingBox, Layer.LatLongBoundingBox): Both methods may
10556     now return None for empty shapefiles. Update doc-strings.
10557    
10558     * Thuban/Model/map.py (Map.BoundingBox): Add doc-string. Deal with
10559     the layer's bbox being None.
10560    
10561     * Thuban/UI/tree.py (SessionTreeCtrl.update_tree): Deal with the
10562     layer's bbox being None.
10563    
10564 bh 175 * Thuban/UI/view.py (MapCanvas.shape_selected): Only redraw when
10565     necessary.
10566     (MapCanvas.__init__): New instance variables, last_selected_layer
10567     and last_selected_shape to determine how the selection has
10568     changed.
10569    
10570     * Thuban/UI/tableview.py (TableGrid.__init__): Do not call
10571     AutoSizeColumns because it will cause a traversal of the entire
10572     table which for large .dbf files will take a very long time.
10573    
10574 bh 172 2002-05-14 Bernhard Herzog <[email protected]>
10575    
10576     * Thuban/Model/layer.py (Layer.open_shapefile): Choose a better
10577     maximum depth for the tree than shapelib does by default.
10578    
10579 bh 165 2002-05-10 Bernhard Herzog <[email protected]>
10580    
10581     * setup.py (py_modules): The shptree modules doesn't have a
10582     wrapper, so don't include it in the py_modules
10583    
10584 bh 163 2002-05-08 Bernhard Herzog <[email protected]>
10585    
10586     * extensions/shapelib/shptree.c (compare_ints): Make arguments
10587     const void * as in the qsort prototype
10588     (SHPTreeFindLikelyShapes): Remove some unused variables.
10589    
10590     * Thuban/UI/view.py (PanTool.MouseMove): Use the bitmap the view
10591     maintains to redraw the window during a drag.
10592     (MapCanvas.unprojected_rect_around_point): New method to determine
10593     a small region around a point for hit-testing.
10594     (MapCanvas.find_shape_at): Only test the shapes in a small region
10595     around the point.
10596    
10597     * setup.py: Increment the version to 0.1.2
10598    
10599     * Thuban/UI/tree.py (SessionTreeCtrl.unsubscribe_all): Remove a
10600     debug print and set session to None after unsubscribing
10601    
10602 bh 146 2002-05-07 Bernhard Herzog <[email protected]>
10603    
10604 bh 154 * Data/iceland_sample.session, Data/iceland_sample.thuban: Rename
10605     the file to have a .thuban extension.
10606    
10607 bh 152 * Thuban/UI/tree.py (session_channels): New class constant with
10608     all the session channels to subscribe to to update the tree
10609     (SessionTreeCtrl.session_changed): Remember the session so that we
10610     can unsubscribe properly. Use the new class constant to
10611     unsubscribe from the old session and subscribe to the new one.
10612     (SessionTreeCtrl.unsubscribe_all): New method to unsubscribe all
10613     subscriptions of the SessionTreeCtrl.
10614     (SessionTreeView.OnClose): Call the tree's unsubscribe_all method.
10615    
10616     * Thuban/UI/mainwindow.py (MainWindow.__init__): Add the "Show
10617     Session Tree" command to the file menu.
10618    
10619     * Thuban/UI/view.py (MapCanvas.do_redraw): Pass the entire bitmap
10620     as update_region to the renderer.
10621    
10622     * Thuban/UI/renderer.py
10623     (ScreenRenderer.layer_ids, ScreenRenderer.draw_shape_layer): The
10624     update box is now directly a tuple, not a wxRect anymore.
10625    
10626     * Thuban/Model/layer.py (Layer.ShapesInRegion): Remove some debug
10627     prints.
10628    
10629     2002-05-07 Bernhard Herzog <[email protected]>
10630    
10631 bh 146 * setup.py: Add the shptree extension module. See
10632     extensions/pyshapelib/ChangeLog for more details.
10633    
10634     * extensions/shapelib/shpopen.c, extensions/shapelib/shapefil.h,
10635     extensions/shapelib/dbfopen.c: Really update to the versions of
10636     shapelib 1.2.9. For some reason it wasn't really done on
10637     2002-04-11.
10638    
10639     * extensions/shapelib/shptree.c: Modified version of shptree.c of
10640     shapelib 1.2.9. The only real difference is the use of qsort
10641     instead of a bubble sort implementation
10642    
10643     * Thuban/Model/layer.py (Layer.__init__): New instance variable
10644     shapetree to hold the shapelib quadtree for the shapefile
10645     (Layer.open_shapefile): Create the quad tree.
10646     (Layer.ShapesInRegion): New method to return the ids of shapes in
10647     a given region using the quad tree.
10648    
10649     * extensions/thuban/wxproj.cpp (project_points): Fix some typos in
10650     comment
10651     (draw_polygon_shape): Accept both arcs and polygons.
10652     (initwxproj): Use the new PYSHAPELIB_IMPORT_API macro to import
10653     the api.
10654    
10655     * Thuban/UI/renderer.py (MapRenderer.layer_ids): New method to
10656     return the shape ids to be rendered in a given layer.
10657     (MapRenderer.draw_shape_layer): Call layer_ids to get the list of
10658     ids. Use draw_polygon_shape to draw arc shapes as well.
10659     (ScreenRenderer.RenderMap): New parameter for the rectangle that
10660     has to be updated
10661     (ScreenRenderer.layer_ids): Make use of the layer's quadtree by
10662     calling it's ShapesInRegion method.
10663    
10664     * Thuban/UI/view.py (MapCanvas.__init__): New instance variable
10665     update_region for the update region.
10666     (MapCanvas.OnPaint): Maintain the update region
10667     (MapCanvas.do_redraw): Pass the bounding box of the update_region
10668     to the renderer when drawing the bitmap. Reset the update_region.
10669    
10670 bh 129 2002-05-03 Bernhard Herzog <[email protected]>
10671    
10672 bh 131 * Thuban/UI/mainwindow.py (MainWindow.SaveSessionAs,
10673     MainWindow.OpenSession): Change the file extension of the session
10674     files to .thuban
10675    
10676 bh 129 * Thuban/Model/session.py (Session.AddMap, forwarded_channels):
10677     Move the map channels to be forwarded by the session into the
10678 bh 146 class constant with forwarded_channels. Also add
10679     LAYER_PROJECTION_CHANGED and LAYER_VISIBILITY_CHANGED to
10680     forwarded_channels
10681 bh 129
10682     * Thuban/Model/base.py (Modifiable.changed): Fix doc-string (a
10683     typo and some rewording).
10684    
10685 bh 126 2002-05-02 Bernhard Herzog <[email protected]>
10686    
10687     * Thuban/UI/view.py: Keep the temporary bitmap used during drawing
10688     around to speed up most redraws:
10689     (MapCanvas.__init__): New instance variable bitmap which holds the
10690     bitmap
10691     (MapCanvas.do_redraw): Redraw self.bitmap if necessary. Use
10692     self.bitmap to draw.
10693     (MapCanvas.full_redraw): New method to force a full redraw
10694     including the bitmap
10695     (MapCanvas.SetMap): Subscribe full_redraw instead of redraw to
10696     make sure the bitmap is redrawn.
10697     (MapCanvas.projection_changed, MapCanvas.set_view_transform,
10698     MapCanvas.shape_selected): Call full_redraw instead of readraw to
10699     make sure the bitmap is redrawn.
10700     (MapCanvas.OnSize): New method to handle size events so that the
10701     bitmap can be redrawn.
10702    
10703 bh 124 2002-04-29 Bernhard Herzog <[email protected]>
10704    
10705     * Thuban/UI/mainwindow.py (MainWindow.__init__): Subscribe to the
10706     canvas' VIEW_POSITION event
10707     (MainWindow.view_position_changed): Handler for VIEW_POSITION.
10708     Update the text in the status-bar accordingly.
10709    
10710     * Thuban/UI/view.py (MapCanvas): Derive from Publisher as well
10711     (MapCanvas.__del__): Implement because Publisher.__del__ has to be
10712     called.
10713     (MapCanvas.__init__): Bind EVT_LEAVE_WINDOW too. Initialize
10714     current_position
10715     (MapCanvas.set_current_position): New method to set
10716     current_position. Issue a VIEW_POSITION event
10717     (MapCanvas.CurrentPosition): New public method to return the value
10718     of current_position. Should be called when the VIEW_POSITION event
10719     is processed.
10720     (MapCanvas.OnLeftDown, MapCanvas.OnLeftUp, MapCanvas.OnMotion):
10721     Update the position.
10722     (MapCanvas.OnLeaveWindow): Set the position to None.
10723    
10724     * Thuban/UI/messages.py (VIEW_POSITION): New message for the
10725     position in the statusbar
10726    
10727 tkoester 403 2002-04-26 Frank Koormann <[email protected]>
10728 frank 120
10729     * Thuban/UI/mainwindow.py: AddLayer, Dialog title s/session/data
10730    
10731 tkoester 403 2002-04-24 Frank Koormann <[email protected]>
10732    
10733 frank 118 * Resources/Bitmaps/identify.xpm: shadow added
10734    
10735     * Resources/Bitmaps/fullextent.xpm: new
10736 jan 116
10737 tkoester 403 2002-04-22 Jan-Oliver Wagner <[email protected]>
10738 jan 116
10739 tkoester 403 * Thuban/UI/tree.py (update_tree): added test for None on map bounding
10740     box
10741 jan 114
10742 tkoester 403 2002-04-21 Jan-Oliver Wagner <[email protected]>
10743    
10744 jan 114 * Thuban/UI/proj4dialog.py (UTMProposeZoneDialog): new
10745    
10746     * Thuban/UI/tree.py (update_tree): added added map extent
10747    
10748     * Thuban/UI/mainwindow.py (_method_command): extended by parameter
10749 tkoester 403 icon; added map_full_extend as tool
10750 jan 114
10751 tkoester 403 2002-04-19 Jan-Oliver Wagner <[email protected]>
10752 jan 107
10753     * Thuban/UI/mainwindow.py (SaveSession): launch save as dialog for
10754     saving _new_ sessions
10755    
10756     * Thuban/Model/session.py (create_empty_session): new session
10757     don't have a filename (set to None)
10758    
10759     * Thuban/UI/tree.py (update_tree): added filename and modified flag
10760    
10761     * Thuban/Model/load.py (ProcessSession): convert projection
10762     parameters from unicode to regular string
10763    
10764     * Data/iceland_sample.session: Added UTM Zone 26 projection.
10765    
10766 bh 100 2002-04-11 Bernhard Herzog <[email protected]>
10767    
10768     * extensions/shapelib/shapefil.h, extensions/shapelib/shpopen.c,
10769     extensions/shapelib/dbfopen.c: Update to the versions of shapelib
10770     1.2.9
10771    
10772     * setup.py (Lib.wxproj extension): Don't link shpopen.c and put
10773     the pyshapelib directoy into the list of include dirs, so that
10774     pyshapelib_api.h can be found.
10775    
10776     * extensions/thuban/wxproj.cpp (pyshapelib_api): New variable that
10777     holds the pyshapelib C-API
10778     (draw_polygon_shape, point_in_polygon_shape, shape_centroid): Use
10779     pyshapelib_api to access the shapelib functions.
10780     (initwxproj): Import the c_api from the shapelib module and
10781     initialize pyshapelib_api.
10782    
10783 bh 89 2002-04-04 Bernhard Herzog <[email protected]>
10784    
10785 bh 91 * setup.py (thuban_bdist_rpm.initialize_options): Use
10786     initialize_options to create the scripts for the rpm.
10787    
10788 bh 89 * extensions/pyprojection/setup.py (PROJ4_PREFIX): Just use /
10789    
10790 bh 85 2002-04-03 Bernhard Herzog <[email protected]>
10791    
10792 bh 87 * setup.py: Increment version to 0.1.1
10793    
10794 bh 85 * Thuban/UI/mainwindow.py (MainWindow.__init__): Move the "Add
10795     Layer" and "Remove Layer" commands from the layer menu to the map
10796     menu
10797    
10798 bh 83 2002-02-15 Bernhard Herzog <[email protected]>
10799    
10800     * Thuban/Model/layer.py (Layer.Shape): list append only takes one
10801     argument (python <= 1.5.2 erroneously accepted multiuple
10802     arguments)
10803    
10804 bh 81 2002-02-04 Bernhard Herzog <[email protected]>
10805    
10806     * Thuban/UI/identifyview.py (IdentifyGridCtrl): New class to use a
10807     RecordGrid in the identifyview.
10808     (IdentifyView.__init__): Use IdentifyGridCtrl instead of
10809     IdentifyListCtrl. The grid allows editing of the values.
10810    
10811     * Thuban/UI/controls.py (RecordTable, RecordGridCtrl): New classes
10812     implementing a grid for a single row of a thuban table.
10813    
10814     * Thuban/UI/view.py (MapCanvas.SelectShapeAt): Search through all
10815     layers by default. Easier to use than the previous default of only
10816     searching through the select layer which meant that if no layer
10817     was selected, you couldn't select a shape.
10818    
10819     * Thuban/UI/tableview.py (TableGrid.__init__): Fix typo
10820    
10821     * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Honour the
10822     stroke_width attribute
10823    
10824     * Thuban/Model/save.py (save_session): Write the new stroke_width
10825     attribute
10826    
10827     * Thuban/Model/load.py (ProcessSession.startElement): Read the
10828     stroke_width attribute
10829    
10830     * Thuban/Model/layer.py (Layer.__init__): New parameter and
10831     instance variable stroke_width
10832     (Layer.SetStrokeWidth): Set the stroke_width.
10833    
10834 bh 72 2002-02-01 Bernhard Herzog <[email protected]>
10835    
10836     * extensions/thuban/wxproj.cpp (project_points): Fix two
10837     off-by-one errors in the last loop that joins the various parts
10838     together.
10839    
10840 bh 71 2002-01-14 Bernhard Herzog <[email protected]>
10841    
10842     * setup.py (data_dist.make_distribution): Fix some typos
10843    
10844 bh 70 2001-09-18 Bernhard Herzog <[email protected]>
10845    
10846     * README: Slight tweaking in preparation for the 0.1 release
10847    
10848     * setup.cfg: Add section for sdist to create both tgz and zip
10849     archives
10850    
10851     * setup.py: increase version number to 0.1
10852     (data_dist): New command class for data distribution
10853    
10854 bh 64 2001-09-14 Bernhard Herzog <[email protected]>
10855    
10856 bh 70 * Thuban/UI/identifyview.py (IdentifyListCtrl.selected_shape):
10857     Handle the case of no layer (i.e. layer is None) properly.
10858    
10859 tkoester 403 * Thuban/UI/proj4dialog.py (UTMDialog.__init__, Proj4Dialog.__init__):
10860 bh 70 Set the initial selection of the combo boxes to reflect the
10861     projection we're starting with in a way that works on windows,
10862     too.
10863    
10864 bh 64 * Thuban/Lib/connector.py (Connector.print_connections): Print the
10865     puiblisher's ids in hex to make it easier to compare them to the
10866     standard repr of python methods
10867    
10868     * Thuban/Model/map.py (Map.Destroy): Unsubscribe the label_layer
10869     messages
10870    
10871 bh 59 2001-09-13 Bernhard Herzog <[email protected]>
10872    
10873 bh 64 * Thuban/UI/tree.py (SessionTreeCtrl.OnSelChanged): Make sure to
10874     deselect the layer if no layer is selected
10875    
10876 bh 59 * Thuban/UI/view.py (MapCanvas.OnPaint): Only delay drawing to
10877     idle time when there actually is something to draw. If there's
10878     nothing to draw simply clear the window
10879     (MapCanvas.do_redraw): Call dc.EndDrawing and add some comments.
10880     (MapCanvas.SetMap): force a redraw in all cases because
10881     FitMapToWindow doesn't always do it.
10882     (MapCanvas.ZoomFactor): Add an optional parameter, center, to
10883     specify the point to move into the center of the window
10884     (ZoomOutTool.MouseUp, ZoomInTool.MouseUp): If the mouse wasn't
10885     dragged, zoon in/out by a factor of 2
10886 bh 64 (MapCanvas.find_shape_at): Iterate backwards (i.e. with decreasing
10887     index, i.e. reversed drawing order) so that objects appearing to
10888     be in from of others are selected first. This is probably mostly
10889     relevant for point shapes where the symbols used may overlap
10890 bh 59
10891     * Thuban/Model/session.py (create_empty_session): Unset the
10892     modified bit before returning it
10893    
10894     * Thuban/UI/mainwindow.py (MainWindow.NewSession): Use
10895     create_empty_session session to create the new, empty session.
10896    
10897     * Thuban/UI/mainwindow.py (MainWindow.__init__): Set the size of
10898     the tool bitmaps.
10899     (MainWindow.OnClose, MainWindow.save_modified_session): Separate
10900     the code that asks whether the session should be saved into the
10901     new method save_modified_session.
10902     (MainWindow.OpenSession, MainWindow.NewSession): Use the new
10903     method to save modified session here too.
10904    
10905 bh 55 2001-09-11 Bernhard Herzog <[email protected]>
10906    
10907     * setup.py (InnoIconItem): fix typo
10908    
10909     (thuban_bdist_inno.run):
10910     (bdist_inno.run): Move the decision not to create symlinks on
10911     non-nt platforms to thuban_bdist_inno and do it unconditinally
10912     since we never want to create the symlinks here
10913    
10914 bh 48 2001-09-10 Bernhard Herzog <[email protected]>
10915    
10916 bh 53 * Thuban/UI/mainwindow.py (MainWindow.IdentifyTool): Popup the
10917     identify view immediately
10918    
10919     * Thuban/UI/controls.py: New file with two classes RecordListCtrl
10920     and SelectableRecordListCtrl that implement the code shared by the
10921     identify view and the label dialog
10922    
10923     * Thuban/UI/identifyview.py (IdentifyListCtrl): Derive from the
10924     new class RecordListCtrl
10925    
10926     * Thuban/UI/labeldialog.py (LabelDialog.OnOK): Check whether the
10927     return value of GetValue is None instead of using it as a boolean
10928     directly so that Zero numbers are handled properly.
10929     (LabelListCtrl): Derive from the new class
10930     SelectableRecordListCtrl
10931    
10932 bh 48 * Thuban/UI/proj4dialog.py (Proj4Dialog.__init__):
10933     (Proj4Dialog.dialogLayout): Make the window resizable and set the
10934     size of the text control explicitly to make the sizers work on
10935     both Windows and X.
10936    
10937 bh 44 2001-09-07 Bernhard Herzog <[email protected]>
10938    
10939     * Thuban/UI/view.py (MapCanvas.find_shape_at):Add a new parameter
10940     that can limit the search to the currently selected layer.
10941     (MapCanvas.SelectShapeAt): Make sure that the currently selected
10942     layer stays selected even when no shape is found
10943 bh 46 (MapCanvas.FitRectToWindow): If the rect has zero with or zero
10944     height do nothing (avoids zero division errors)
10945 bh 44
10946 bh 32 2001-09-06 Bernhard Herzog <[email protected]>
10947    
10948 bh 42 * Thuban/UI/tree.py (SessionTreeCtrl, SessionTreeView.__init__):
10949     Correct the spelling of SessionTreeCtrl. dabbrev is too damn
10950     convenient :-)
10951     (SessionTreeCtrl.__init__, SessionTreeCtrl.update_tree): Introduce
10952     a new instvar layer_to_item to map layers to tree items
10953     (SessionTreeCtrl.layer_selected): Select the appropriate tree item
10954     to match the current selection in the interactor
10955    
10956 bh 40 * Thuban/UI/interactor.py (Interactor.SelectedLayer):
10957     (Interactor.HasSelectedLayer): New methods to query the current
10958     selection
10959    
10960     * Thuban/UI/mainwindow.py (MainWindow.current_layer):
10961     (MainWindow.has_selected_layer): Simply call the appropriate
10962     interactor method
10963    
10964     * Thuban/UI/mainwindow.py (MainWindow.__init__):
10965     (MainWindow.LayerShowTable):
10966     (MainWindow.identify_view_on_demand): Store the interactor in an
10967     instvar and use that reference instead of going through main.app
10968    
10969 tkoester 403 * Thuban/UI/mainwindow.py (MainWindow.ShowSessionTree):
10970     * Thuban/UI/application.py (ThubanApplication.OnInit):
10971 bh 40 * Thuban/UI/main.py (main): Create the session tree view in main
10972     with the new mainwindow method ShowSessionTree and not directly
10973     the application's OnInit method
10974    
10975     * Thuban/UI/tree.py (myTreeCtrlPanel):
10976     (SessioinTreeCtrl): Rename to SessioinTreeCtrl and turn it into a
10977     TreeCtrl isntead of a panel. This affects most method since we now
10978     refer to self instead of self.tree
10979     (SessionTreeView): New class implementing a non-modal dialog
10980     showing the session tree.
10981    
10982 bh 35 * Thuban/UI/mainwindow.py (MainWindow.LayerShowTable): Pass the
10983     layer to the tableview dialog.
10984    
10985     * Thuban/UI/tableview.py: Add some doc-strings
10986 tkoester 403 (TableGrid):
10987 bh 35 (TableGrid.OnRangeSelect):
10988     (TableGrid.OnSelectCell):
10989     (TableFrame.__init__):
10990     (TableFrame.row_selected):
10991     Selecting rows in the grid view now updates the selected shapes
10992     through the TableFrame. To achieve this we derive TableGrid from
10993     Publisher and introduce the message type ROW_SELECTED which the
10994     TableFrame subscribes to and which is issued by OnRangeSelect and
10995     OnSelectCell
10996    
10997     (DataTable.SelectRow): Removed because it's no longer needed in
10998     the row/shape selection scheme
10999    
11000 bh 32 * Thuban/UI/dialogs.py: New file implementing common classes for
11001     dialogs
11002    
11003     * Thuban/UI/tableview.py (TableGrid.__init__): Don't subscribe to
11004     the SELECTED_SHAPE message anymore. This is now handled by the
11005     parent.
11006     (TableGrid.select_shape): Only update the selection if the shape
11007     is not None.
11008     (TableFrame): Inherit from the new NonModalDialog class.
11009     (TableFrame.__init__, TableFrame.select_shape): Handle the
11010     SELECT_SHAPE message.
11011     (TableFrame.OnClose): Extend the inherited method to unsubscribe
11012     SELECT_SHAPE
11013    
11014     * Thuban/UI/mainwindow.py (MainWindow.init_dialogs):
11015     (MainWindow.add_dialog):
11016     (MainWindow.dialog_open):
11017     (MainWindow.remove_dialog):
11018     (MainWindow.get_open_dialog): New methods to maintain a dictionary
11019     of opened non-modal dialogs.
11020    
11021     (MainWindow.__init__): Initialize the new non-modal dictionary
11022     management code
11023     (MainWindow.LayerShowTable): maintain separate dialogs for each
11024     table using the non-modal dialog management code to only open a
11025     view once for each table.
11026    
11027     (MainWindow.IdentifyTool):
11028     (MainWindow.__init__):
11029     (MainWindow.identify_view_on_demand): Don't open the identify view
11030     in IdentifyTool anymore. This will be done automatically by the
11031     new method identify_view_on_demand which handles the
11032     SELECTED_SHAPE message so that the identify view will be opened on
11033     demand
11034    
11035     * Thuban/UI/identifyview.py (IdentifyListCtrl.__init__): Remove
11036     the interactor argument. The SELECTED_SHAPE message is now handled
11037     by the parent.
11038     (IdentifyView.__init__): Add the interactor argument so that we
11039     can handle the SELECTED_SHAPE message here
11040     (IdentifyView.selected_shape): New method to handle the
11041     SELECTED_SHAPE messages
11042    
11043     * Thuban/UI/identifyview.py (IdentifyView): Derive from the new
11044     NonModalDialog class
11045     (IdentifyView.OnClose): Extend the inherited version to
11046     unsubscribe SELECT_SHAPE
11047    
11048     * Thuban/Model/session.py (Session.UnsetModified): Remove debug prints
11049    
11050 bh 26 2001-09-05 Bernhard Herzog <[email protected]>
11051    
11052     * Thuban/UI/view.py (MapCanvas.__init__): New argument, interactor.
11053 tkoester 403
11054 bh 26 * Thuban/UI/mainwindow.py (MainWindow.__init__): New argument
11055     interactor to pass through to the MapCanvas
11056 tkoester 403
11057 bh 26 * Thuban/UI/application.py (ThubanApplication.OnInit): Use the new
11058     argument to the MainWindow constructor to get rid of the ugly hack
11059     that made main.app available early just so that the mapcanvas
11060     could access the interactor object.
11061    
11062 bh 19 2001-09-04 Bernhard Herzog <[email protected]>
11063    
11064 bh 22 * Thuban/UI/mainwindow.py (MainWindow.RunMessageBox): New method
11065     that runs a modal message box
11066     (MainWindow.OnClose): Use the new method
11067     (MainWindow.RemoveLayer): Just do nothing in case no layer is
11068     selected. The command should be grayed out anyway, so there's no
11069     need to pop up a message box.
11070     (MainWindow.AddLayer): Pop up a message box with an error message
11071     if the shape file can't be opened
11072    
11073     * Thuban/Model/layer.py (Layer.__init__): Open the shapefile
11074     immediately. This will cause an exception in case the file can't
11075     be opened and we can display an appropriate message.
11076    
11077 bh 19 * MANIFEST.in: Add extensions/pyprojection/LICENSE
11078    
11079     * setup.py (thuban_bdist_rpm): New class implementing a Thuban
11080     specific bdist_rpm command.
11081    
11082     * Thuban/UI/main.py: Catch ImportError exceptions when importing
11083     the locale module because it may not be available on some
11084     installations.
11085    
11086     * extensions/pyprojection/LICENSE: Copy of the license text in
11087     Projection.i. Having it in a separate file makes it easier to
11088     refer to license text in e.g. RPMs
11089    
11090 bh 18 2001-09-03 Bernhard Herzog <[email protected]>
11091    
11092 bh 19 * setup.py: use wx-config instead of wxgtk-config because it's
11093     more generic
11094    
11095     * setup.py (ThubanInstall.get_outputs): Add the symlink in
11096     <prefix>/bin to the outputs
11097     (ThubanInstall.link_file): New method to link files. We need this
11098     because the standard copy_files refuses to link non-existing
11099     files.
11100     (ThubanInstall.run): Remove the leading install root from the
11101     script filename if an install root was specified and use the new
11102     link_file method
11103 tkoester 403
11104 bh 18 * Thuban/UI/mainwindow.py (MainWindow.AddLayer): Fit the map to
11105     the window when the first layer is added to the map.
11106    
11107     * setup.py (ThubanInstall.run): Honor the build root (self.root)
11108     when linking thuban.py to <prefix>/bin
11109    
11110 bh 16 2001-08-31 Bernhard Herzog <[email protected]>
11111    
11112     * setup.py: In the setup call, the install parameters shouldn't
11113     have trailing slashes because distutils on non-posix platforms
11114     doesn't like that. The same applies to other directories like
11115     "Resources/Bitmaps"
11116    
11117     In the configuration section for nt, move the wxWindows directory
11118     optins into the part clearly marked as editable.
11119    
11120     (InstallLocal.initialize_options):
11121     (InstallLocal.user_options): remove the currently unused debug
11122     flag
11123     (thuban_build_py.find_all_modules): Add this method so that it
11124     works for our case of having packages and modules in one
11125     distribution as well.
11126     (ThubanInstall.initialize_options):
11127     (ThubanInstall.finalize_options):
11128     (ThubanInstall.user_options):
11129     (ThubanInstall.boolean_options): Add new options, do-symlink and
11130     extra files. Since these are the first ThubanInstall specific
11131     options, override user_options and boolean_options
11132     (ThubanInstall.run): Honor the new do-symlink and extra-files
11133     options.
11134     (ThubanInstall.get_outputs): Add to override the base-class's
11135     version and add the extra-files to the outputs
11136     (bdist_inno): New class for windows distributions with Inno Setup
11137     (InnoIconItem): Helper class for bdist_inno
11138     (thuban_bdist_inno): Thuban specific version of bdist_inno. Added
11139     this together with the appropriate parameters, to the setup call.
11140 tkoester 403
11141 bh 16 * setup.cfg (bdist_inno): added new section for the inno setup
11142     installer
11143    
11144     * Thuban/UI/tree.py (myTreeCtrlPanel.__init__): New inst var
11145     changing_selection to avoid recursive selection events when
11146     modifying the selection in response to a selection event.
11147     (myTreeCtrlPanel.normalize_selection): Set the new inst var when
11148     changing the tree's selection.
11149     (myTreeCtrlPanel.OnSelChanged): Only normalize the selection when
11150     we're not being called indirectly from normalize_selection.
11151    
11152     * Thuban/UI/mainwindow.py (MainWindow.update_command_ui): Call
11153     event.Check only if the command is actuall checkable.
11154     (MainWindow.__init__): Call the toolbar's Realize method to make
11155     sure that the items are actually shown
11156    
11157 bh 7 2001-08-28 Bernhard Herzog <[email protected]>
11158    
11159 bh 9 * setup.py: Fix some doc strings
11160    
11161 bh 7 * ChangeLog: started
11162    

Properties

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

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26