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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 2525 - (hide annotations)
Thu Jan 20 10:00:34 2005 UTC (20 years, 1 month ago) by bernhard
Original Path: trunk/thuban/ChangeLog
File size: 428249 byte(s)
	* Thuban/UiI/about.py: take iso-8859-15 when getdefaultlocale returns
	None. (Fixes rt#2910.)

1 bernhard 2525 2005-01-20 Bernhard Reiter <[email protected]>
2    
3     * Thuban/UiI/about.py: take iso-8859-15 when getdefaultlocale returns
4     None. (Fixes rt#2910.)
5    
6 frank 2524 2005-01-18 Frank Koormann <[email protected]>
7    
8     New Extension: mouseposition
9     Tool to collect mouse click positions (map coordinates) in a dialog.
10    
11     * Extensions/mouseposition/__init__.py: New, extension registration
12    
13     * Extensions/mouseposition/mouseposition.py: New, implements the
14     dialog and adds a tool to Thuban mainwindow.
15    
16     * Extensions/mouseposition/position.xpm: New, icon for tool.
17    
18 jan 2522 2005-01-14 Jan-Oliver Wagner <[email protected]>
19    
20     * Doc/manual/thuban-manual-de.xml: More translations.
21    
22 frank 2520 2005-01-11 Frank Koormann <[email protected]>
23    
24     * Thuban/UI/mainwindow.py (MainWindow.DuplicateLayer):
25     Fix indention bug.
26    
27 frank 2517 2005-01-09 Frank Koormann <[email protected]>
28    
29     * Thuban/UI/mainwindow.py (MainWindow.DuplicateLayer):
30 frank 2520 BugFix 2901: Explicitly copy layers ClassificationColumn since it
31 frank 2517 is not part of the layers Classification.
32    
33 frank 2515 2005-01-03 Frank Koormann <[email protected]>
34    
35 frank 2517 * Thuban/UI/renderer.py (ScreenRendererdraw_selection_incrementally):
36     BugFix 2883: Former implementation only worked on classified point
37     layers: KeyError was raised, now use the default size if field is None.
38 frank 2515
39 bernhard 2513 2004-12-27 Bernhard Reiter <[email protected]>
40    
41     svgexport 1.0.0cvs: Fixed label export.
42    
43     * Extensions/svgexport/test/test_svgmapwriter.py:
44     class TestSVGRenderer(): New class; new test test_label_font().
45    
46     * Extensions/svgexport/svgmapwriter.py
47     (SVGRenderer.label_font()): initialised Font size with self.factor now,
48     makes test_label_font happy.
49    
50     * Extensions/svgexport/TODO: crossed out fixed label export item.
51     Added item for options.
52    
53     * Extensions/svgexport/__init__.py: Bumped version to 1.0.0cvs.
54    
55 russell 2511 2004-12-27 Russell Nelson <[email protected]>
56    
57 jan 2512 Middle mouse button pans.
58 russell 2511
59 jan 2512 * Thuban/UI/view.py (MapCanvas.__init__): Subscribe also
60     OnMiddleDown and OnMiddleUp events.
61     (MapCanvas.OnMiddleDown): New. Activate the pan tool and remember the
62     previously used tool.
63     (MapCanvas.OnMiddleUp): New. Reactivate the remebered tool used before
64     pressing the middle mouse button.
65    
66 jan 2509 2004-12-27 Jan-Oliver Wagner <[email protected]>
67    
68     * Doc/manual/thuban-manual-de.xml: More translations.
69    
70 jan 2506 2004-12-23 Jan-Oliver Wagner <[email protected]>
71    
72     * Thuban/UI/projdialog.py (ProjFrame.load_user_proj): Added a
73     \n to stderr after the warnings. Thanks to Russell Nelson.
74    
75 nhueffme 2493 2004-12-20 Nina Hueffmeyer <[email protected]>
76    
77     * Extensions/ogr/ogrshapes.py: Fixed some issues from
78     Bernhard (coding guidelines etc.). Additionally it is now possible to
79     display shapefiles containing feature collections (e.g.polygons
80     with holes). Works with gdal 1.2.1 now.
81    
82     * Extensions/ogr/test/test_OGRShapestore.py: Fixed some issues
83     from Bernhard (coding guidelines etc.). If ogr can't be imported,
84     tests are skipped now.
85    
86     * Extensions/ogr/ogrstart.py: Fixed some typings.
87    
88 bernhard 2490 2004-12-20 Bernhard Reiter <[email protected]>
89    
90     * Extensions/svgexport/TODO: updated to add support for
91     raster layers and labels for 1.0.1.
92    
93     * Extensions/svgexport/svgmapwriter.py (draw_raster_layer):
94     Issue a warning now.
95    
96 bernhard 2488 2004-12-19 Bernhard Reiter <[email protected]>
97    
98 bernhard 2489 * Extensions/svgexport/TODO: Added idea to support triggering
99     the application down the pipe.
100    
101     2004-12-19 Bernhard Reiter <[email protected]>
102    
103 bernhard 2488 svgexport: Improved code quality, mainly by better naming.
104    
105     * Extensions/svgexport/svgmapwriter.py:
106     DrawPath() renamed to DrawPolygonPath(),
107     added documentation, improved comments and variable names.
108    
109     * Extensions/svgexport/svgmapwriter.py,
110     Extensions/svgexport/test/test_svgmapwriter.py:
111     All using DrawPolygonPath() now, the default parameter closed=True
112     omitted.
113    
114     * Extensions/svgexport/test/test_svgmapwriter.py:
115     renamed test_polygon_opened() to test_polyline()
116     renamed test_transparent_polygon() to test_transparent_polyline()
117    
118 jan 2487 2004-12-18 Jan-Oliver Wagner <[email protected]>
119    
120     Some fixes of gns2shp extension.
121    
122     * Extensions/gns2shp/test/__init__.py: New. Make this directory a
123     package.
124    
125     * Extensions/gns2shp/test/test_gns2shp.py: Add some import paths
126     dynamically.
127    
128     * Extensions/gns2shp/test/README: Simplified description how to test.
129    
130     * Extensions/gns2shp/gns2shp.py (gns2shp): Fixed doc-string,
131     fixed some dimensions of fields according to the GNS documentation
132     which seems to change undocumented.
133     Now killing trailing \n and/or \r from MODIFY_DATE.
134     This fixes RT#2453.
135    
136 bernhard 2479 2004-12-18 Bernhard Reiter <[email protected]>
137 bernhard 2480
138 bernhard 2482 svgexport 1.0.0: Treats holes and islands nicely. Documentation added.
139    
140     * Extensions/svgexport/test/test_svgmapwriter.py:
141     Added new tests: test_export_polygon_with_hole()
142     and test_polygon_with_hole().
143    
144     * Extensions/svgexport/svgmapwriter.py
145     (draw_polygon_shape()): Uses DrawPath correctly now.
146    
147     * Doc/manual/thuban-manual.xml: Added documentation for stable
148     extention svgexport.
149     * Doc/manual/thuban-manual-de.xml: Copied English section about
150     svexport over.
151    
152 jan 2509 * Extensions/svgexport/__init__.py: Bumped version number to 1.0.0.
153 bernhard 2482
154     * Extensions/svgexport/svgsaver.py,maplegend.py:
155     Moved from experimental to stable extension menu.
156    
157     * Extensions/svgexport/TODO: updated.
158    
159    
160     2004-12-18 Bernhard Reiter <[email protected]>
161    
162 bernhard 2481 Added Extensions/svgexport/TODO
163    
164     2004-12-18 Bernhard Reiter <[email protected]>
165    
166 bernhard 2480 Refactored in svgexport:
167     DrawPath replaces DrawPolygon; added newline in front of "M" in paths.
168    
169     * Extensions/svgexport/svgmapwriter.py
170     Added verbosity level 3 to print out polygon points.
171     (class Point): added __repr__
172     (class Brush, __str__()): Added space after ,.
173     (DrawPolygon): Renamed to DrawPath()
174     (DrawPath): Takes list of polygons as input now, adds \n before "M"s.
175     (DrawLines): Using DrawPath now.
176    
177     * Extensions/svgexport/test/test_svgmapwriter.py:
178     Replaced DrawPolygon() calls with DrawPath() and put the first argument
179     inside another list. Adapted test data with a newline before "M".
180    
181     2004-12-18 Bernhard Reiter <[email protected]>
182 bernhard 2479
183     Refactored svgexport tests: 9 double tests runs eliminated;
184     code size reduced by 8 lines.
185    
186     * Extensions/svgexport/test/test_svgmapwriter.py:
187     (class TestWithDC): Renamed to BaseTestWithDC, moved to top.
188     (class BaseWithDCtools): New, subclass from BaseTestWithDC.
189     (class TestDrawSplines): now subclass from BaseTestWithDCtools,
190     this fixed the double running of the nine tests of TestVirtualDC.
191     (class TestVirtualDC): Using self.dc and self.file from setUp().
192    
193 bh 2478 2004-12-17 Bernhard Herzog <[email protected]>
194    
195     Two windows specific fixes ported from thuban-1­0-branch:
196    
197     * Thuban/UI/about.py (unicodeToLocale): Use getdefaultlocale
198     instead of getlocale because getlocale doesn't return a usable
199     encoding name on a german windows 2000
200    
201     * setup.py: windows build: Removed the absolute path names and
202     made all prfixes relative to the directory containing setup.py.
203     Makes it a little easier to adapt to a different system.
204    
205 bh 2470 2004-12-16 Bernhard Herzog <[email protected]>
206    
207 bernhard 2479 Add support for PostGIS tables with LINESTRING geometries.
208 bh 2472 Fixes RT#2299
209    
210     * Thuban/Model/postgisdb.py (shapetype_map): Add LINESTRING
211    
212     * test/postgissupport.py
213     (PostgreSQLServer.get_default_static_data_db): Rename the "roads"
214     table to "roads-multi" because it now uses MULTILINESTRING
215     geometries and introduce a new "roads" table that uses LINESTRING
216     (coords_to_multilinestring): Make the doc string more precise
217     (coords_to_linestring): New. Create a LINESTRING WKT
218     representatin
219     (wkt_converter): Add coords_to_linestring
220     (upload_shapefile): Rephrase the doc-string a bit.
221    
222     * test/test_postgis_db.py (TestPostGISShapestoreArc)
223     (LineStringTests)
224     (TestPostGISShapestoreLineString)
225     (TestPostGISShapestoreMultiLineString): Split
226     TestPostGISShapestoreArc into a base class LineStringTests and two
227     derived classes TestPostGISShapestoreLineString for LINESTRING
228     geometries and TestPostGISShapestoreMultiLineString for
229     MULTILINESTRING geometries. Most test methods are in the base
230     class with the exception of tests that explicitly check the raw
231     format.
232    
233     2004-12-16 Bernhard Herzog <[email protected]>
234    
235 bh 2471 Make the test suite work with PostGIS 0.8.2 and PostgreSQL 7.4
236    
237     * test/postgissupport.py (find_postgis_sql): Different postgis
238     versions put the postgis.sql file into slightly different places
239     so we have to look in both. The updated doc string describes this
240     is more detail.
241    
242     * test/test_postgis_db.py
243     (TestPostGISSpecialCases.test_column_name_quoting): The return
244     value of UniqueValues is unsorted, so it has to be sorted for
245     comparison.
246    
247     2004-12-16 Bernhard Herzog <[email protected]>
248    
249 bh 2470 Fix for RT#2237
250    
251     * Thuban/UI/projdialog.py (ProjFrame._show_proj_panel): If the
252     panel to be shown is the UnknownProjPanel disable the OK and Try
253     buttons. Otherwise enable them.
254     (ProjFrame.__GetProjection): The UnknownProjPanel returns None for
255     the parameters. In that case __GetProjection also returns None
256     now.
257    
258 bh 2459 2004-12-15 Bernhard Herzog <[email protected]>
259    
260 bh 2462 * Thuban/UI/classgen.py (GenQuantilesPanel.__init__): Set the
261     minimum number of classes to 2. The calculate_quantiles needs at
262     least two and raises an exception otherwise.
263     Fixes RT#2549
264    
265     2004-12-15 Bernhard Herzog <[email protected]>
266    
267 bh 2460 * test/postgissupport.py (PostgreSQLServer.execute_sql): Extend to
268     so that it returns a result for select statements.
269     (PostgreSQLServer.server_version): New. Return the version of the
270     server software.
271     (PostgreSQLServer.require_authentication): The format of
272     pg_hba.conf has changed between PostgrSQL 7.2 and 7.3. Check the
273     server version and generate the file in the correct format
274    
275     2004-12-15 Bernhard Herzog <[email protected]>
276    
277 bh 2459 * test/postgissupport.py (PostgreSQLServer.is_running): Fix typo
278     in the doc string and rephrase it a little.
279    
280 frank 2457 2004-12-15 Frank Koormann <[email protected]>
281    
282     * test/test_load.py (TestAltPath.checkSession): New, extended checks if
283     session has been loaded successfully. The check is called by the relevant
284     tests after executing load_session().
285    
286 bh 2450 2004-12-13 Bernhard Herzog <[email protected]>
287    
288 bh 2454 Make sure the region used to determine which shapes are visible
289     actually matches the region on the printed page. If this isn't
290     done properly some shapes might not be printed.
291     Fixes RT #2692
292    
293     * Thuban/UI/view.py (MapPrintout.draw_on_dc): The region for the
294     renderer has to be at the same position as the mapregion
295    
296     * Thuban/UI/renderer.py (ExportRenderer.RenderMap): self.region
297     has to be moved by (self.shiftx, self.shifty) too.
298    
299     2004-12-13 Bernhard Herzog <[email protected]>
300    
301 bh 2452 * libraries/pyprojection/Projection.i: Work around a bug in the
302     generated python code which leads to exception in the __del__
303     method when the constructor fails. See the comments in the code
304     for more details.
305    
306     * libraries/pyprojection/Projection.py: Updated from Projection.i
307     with SWIG.
308    
309     2004-12-13 Bernhard Herzog <[email protected]>
310    
311 bh 2451 * test/test_load.py (TestAltPath.test_01_single_path_error_fix)
312     (TestAltPath.test_02_path_error_fix_from_list)
313     (TestAltPath.test_05_path_error_fix_from_list_changed)
314     (TestAltPath.test_06_path_error_fix_from_list_fails): self.session
315     is destroyed in tearDown, so there's no need to do it in a test
316     case.
317    
318     * Thuban/Model/load.py (SessionLoader.open_shapefile): Remove a
319     debug print
320    
321     2004-12-13 Bernhard Herzog <[email protected]>
322    
323 bh 2450 * Extensions/svgexport/test/test_svgmapwriter.py
324     (TestDrawSplines.setUp): Do not use super with the unittest
325     classes because in Python 2.2 they're still old-style classes.
326    
327 frank 2448 2004-12-13 Frank Koormann <[email protected]>
328    
329     Alternative Path feature: When loading a (moved) session where
330     shapefiles cannot be found, ask the user. Use the specified path
331     if further shapefiles are missing. However, ask the usr for confirmation
332     in such cases.
333    
334     * test/test_load.py (TestAltPath): New, tests for alternative path feature
335     in load_session()
336     (Shapefile_CallBack): Helper, implements controllable callback.
337    
338     * Thuban/UI/application.py (ThubanApplication.OnInit):
339     Added "alt_path" to self.path
340     (ThubanApplication.OpenSession): Added shapefile_callback as second
341     callback similar to db_connection_callback.
342     (ThubanApplication.run_alt_path_dialog): New, implementaion of
343     shapefile_callback. In addition to raising the dialog the control of
344     self.path('alt_path') is implemented here.
345    
346     * Thuban/Model/load.py (SessionLoader.__init__): Added shapefile_callback.
347     (SessionLoader.open_shapefile): Open shapefile, eventually with
348     alternative path. This wrapps the "theSession.OpenShapefile(filename)"
349     formerly used in start_fileshapesource()/start_layer().
350     (SessionLoader.start_fileshapesource): Call open_shapefile().
351     (SessionLoader.start_layer): Call open_shapefile().
352     (load_session): Added shapefile_callback.
353    
354     * Thuban/UI/altpathdialog.py: New, implements dialogs for alternative path
355     feature (search / check).
356    
357     * Doc/manual/thuban-manual.xml: Added documentation of new feature.
358    
359 bernhard 2443 2004-12-11 Bernhard Reiter <[email protected]>
360    
361 bernhard 2445 svgexport 0.9.2: Point size supports for maps.
362    
363     * Extensions/svgexport/svgmapwriter.py: Added import of SHAPETYPE_POINT
364     (def draw_point_shape): new parameter size defaults to 2 as before.
365     (draw_shape_layer_incrementally): Moved draw_func log line higher.
366     Added draw_func call with size when dealing with a point layer.
367    
368     * Extensions/svgexport/__init__.py: bumped version to 0.9.2.
369    
370     2004-12-11 Bernhard Reiter <[email protected]>
371    
372 bernhard 2444 Made sure that newlines are inserted in the svg path d attributes
373     to raise the chance that the line length will be below 255 characters,
374     as recommended by REC SVG 1.1 in section 8.3.1.
375    
376     * Extensions/svgexport/svgmapwriter.py(DrawPolygon):
377     Adding \n before L's and changed whitespace handling.
378    
379     * Extensions/svgexport/test/test_svgmapwriter.py:
380     Adapted tests to new whitespace handling of DrawPolygon.
381    
382     2004-12-11 Bernhard Reiter <[email protected]>
383    
384 bernhard 2443 * Doc/technotes/coding_guidelines.txt: easy typo fixed.
385    
386     * Extensions/svgexport/test/test_svgmapwriter.py:
387     Removed test_drawbezier in favour of new test_drawspline3 and
388     test_drawspline4 within new class TestDrawSplines(TestVirtualDC).
389     All only to test DrawSpline.
390    
391     * Extensions/svgexport/svgmapwriter.py(DrawSpline):
392     New implementation now really using the strange algorithm of
393     xfig 3.1's approximated splines and its conversion to postscript
394     with one twist: SVG can do quadratic beziers, so skipped translation
395     to cubic beziers.
396     (TestWithDC): Typo in comment fixed.
397    
398 joey 2442 2004-12-09 Martin Schulze <[email protected]>
399    
400     * Thuban/Model/classgen.py: Added missing character encoding
401    
402     * Extensions/wms/properties.py (OpenWMSProperties): removed
403    
404     * Extensions/wms/parser.py (WMSCapabilitiesParser.error): Dropped
405     support for get_srs_discrepancies() since there are no
406     discrepancies anymore (was a thinko)
407    
408     * Extensions/wms/layer.py (WMSLayer.GetMapImg): Improved graphic
409     format priority now that more formats are supported globally by
410     the render engine.
411    
412 silke 2437 2004-12-08 Silke Reimer <[email protected]>
413     * Extensions/ogr/ogrshapes.py: Substituted ogr-method CloseRings
414     because it is not available in all versions of ogr
415    
416 bernhard 2436 2004-12-08 Bernhard Reiter <[email protected]>
417     * Extensions/ogr/__init__.py: Added empty __init__.py to heal
418     global tests until a real one is commited.
419    
420 nhueffme 2435 2004-12-07 Nina Hüffmeyer <[email protected]>
421    
422     * /Extensions/ogr/: Adding a new extension to read shapefiles with
423     ogr. It is planned to add other vector formats.
424    
425     * /test/runtests.py: Adding tests from /Extensions/ogr/test/.
426    
427 jan 2434 2004-12-07 Jan-Oliver Wagner <[email protected]>
428    
429     * /Extensions/svgexport/test/test_svgmapwriter.py: Reverting
430     part of a (non-)fix to renable that the tests are always
431     executed.
432    
433 bernhard 2432 2004-12-07 Bernhard Reiter <[email protected]>
434    
435     * Extensions/svgexport/test/test_svgmapwriter.py:
436     Added test_drawbezier() to test DrawSpline().
437    
438     * Extensions/svgexport/svgmapwriter.py(DrawSpline):
439     Really implemented bezier drawing.
440    
441     * Extensions/svgexport/__init__.py: Bumped version of svgexport
442     to 0.9.1 because now the legend examples lines styles
443     will be drawing with beziers.
444    
445 joey 2431 2004-12-05 Martin Schulze <[email protected]>
446    
447     * Thuban/UI/renderer.py (raster_format_map): Added PNG, TIFF and
448     GIF as supported bitmap image formats (helpful for the WMS extension)
449    
450 joey 2430 2004-11-30 Martin Schulze <[email protected]>
451    
452     * Extensions/wms/test/test_ogclib.py (TestOGCLib.test_compareURLs):
453     Improved the test for the internal compare method
454    
455 jan 2429 2004-11-27 Jan-Oliver Wagner <[email protected]>
456    
457     * Thuban/UI/about.py (About.__init__): Added
458     Norbert Solymosi for hungarian translation and Ole Rahn
459     as contrbutor. Moved Bernhard Reiter from Contributor
460     to Developer.
461    
462 bernhard 2425 2004-11-27 Bernhard Reiter <[email protected]>
463    
464     * Extensions/svgexport/test/test_svgmapwriter.py:
465     Removed Jan from author list as he did not change enough significant
466     lines yet.
467    
468     * Extensions/svgexport/__init__.py: Added Bernhard as author
469     of the Extension.
470    
471 jan 2422 2004-11-27 Jan-Oliver Wagner <[email protected]>
472    
473     * po/hu.po: New. Hungarian translation. Contributed
474     by Norbert Solymosi.
475    
476 bh 2419 2004-11-26 Bernhard Herzog <[email protected]>
477    
478     * Extensions/svgexport/test/test_svgmapwriter.py
479     (Testobjectexport.test_transparent_polygon): Commented out some
480     debug prints
481    
482 jan 2418 2004-11-24 Jan-Oliver Wagner <[email protected]>
483    
484     Fix broken tests for svg extension and added svg legend
485     to Experimental menu.
486    
487     * Extensions/svgexport/test/test_svgmapwriter.py: Fix to have
488     the test run correctly even if the extension is a package.
489     Also removed the "import Thuban" which makes no sense.
490    
491     * Extensions/svgexport/__init__.py: Fix to have the extensions'
492     test module also be executed from the global test routine.
493     This is done by looking for the absense of the DISPLAY variable.
494    
495     * Extensions/svgexport/maplegend.py: Moved the menu entry from Extensions
496     to Experimental menu since this module has yet not reached a stable
497     status (ie. 1.0).
498    
499 bernhard 2414 2004-11-22 Bernhard Reiter <[email protected]>
500    
501     * Extensions/svgexport/svgmapwriter.py:
502     Added verbose variable and some logging depending on it.
503     (class VirtualDC(XMLWriter)): Minor improvement in the polygon loop,
504     because counting i is not necessary.
505     (class Pen, class Brush): Added simple __str__ methods.
506     (SVGRenderer.draw_polygone_shape): Fix #2698 (transparent polygons are
507     not exported to svg file) Note: holes still unhandled.
508    
509     * Extensions/svgexport/test/test_svgmapwriter.py:
510     Made a baseclass TestWithDC for test needed a DC.
511     Added tests for bug #2698 (transparent polygons are not
512     exported to svg file):
513     Testobjectexport.test_transparent_polygon()
514    
515     * Thuban/Model/base.py (UnsetModified):
516     Fixed some typos in docstring.
517    
518     * Thuban/UI/baserenderer.py (BaseRenderer.draw_polygon_shape()):
519     Added hints on the used algorithm for handling holes.
520    
521 jan 2403 2004-11-20 Jan-Oliver Wagner <[email protected]>
522    
523 jan 2412 Some face lifting for the examples.
524    
525     * Examples/__init__.py: Make this directory a package.
526    
527     * Examples/simple_extensions/__init__.py: Make this directory a package.
528    
529     * Examples/simple_extensions/hello_world.py: Moved entry from Extensions
530     menu to Examples menu.
531    
532     * Examples/simple_extensions/simple_command.py: Some more comments,
533     minor changes.
534    
535     * Examples/simple_extensions/simple_tool.py: Minor changes.
536    
537     2004-11-20 Jan-Oliver Wagner <[email protected]>
538    
539 jan 2407 Changed way of extension registry for wms and added extension
540     registry for umn_mapserver extension.
541    
542     * Extensions/wms/__init__.py: Added registry entry and the importing
543     of the actual wms module. Included a test for the required PyOGCLib.
544    
545     * Extensions/wms/wms.py: Removed registry entry (moved to __init__.py).
546    
547     * Extensions/umn_mapserver/__init__.py: Added registry entry and the
548     importing of the actual umn mapserver management modules.
549     Included a test for the required Python MapScript.
550    
551     2004-11-20 Jan-Oliver Wagner <[email protected]>
552    
553 jan 2403 Changed way of extension registry for importAPR, bboxdump
554     and added extension registry for svgexport.extension registry for
555     svgexport.
556    
557     * Extensions/importAPR/__init__.py: Added registry entry and the importing
558     of the actual importAPR module.
559    
560     * Extensions/importAPR/importAPR.py: Removed registry entry (moved to
561     __init__.py).
562    
563     * Extensions/bboxdump/__init__.py: Added registry entry and the importing
564     »···of the actual bboxdump module.
565    
566     * Extensions/bboxdump/bboxdump.py: Removed registry entry (moved to
567     »···__init__.py).
568    
569     * Extensions/svgexport/__init__.py: Added registry entry and the importing
570     of the svgsaver module.
571    
572     * Extensions/svgexport/svgsaver.py: Moved the menu entry from Extensions
573     to Experimental menu since this module has yet not reached a stable
574     status (ie. 1.0).
575    
576 jan 2397 2004-11-18 Jan-Oliver Wagner <[email protected]>
577    
578     Now the hit test considers the size of point symbols.
579    
580     * Thuban/UI/viewport.py (ViewPort._hit_point): Added optional parameter
581     'size' defaulting to the previously fixed value 5.
582     Extended doc-string.
583     (Viewport._find_shape_in_layer): Resolved FIXME regarding flexibility
584     for symbols.
585     Now the size of the largest point symbol is determined to find out
586     about whether the point has been hit.
587     This fixes the problem that only clicks inside a fixed distance of
588     5 where found.
589    
590 jan 2395 2004-11-17 Jan-Oliver Wagner <[email protected]>
591    
592 jan 2397 Another open issue fixed regarding sizeable symbols: correct rendering of
593 jan 2395 selected symbols.
594    
595     * Thuban/UI/renderer.py (ScreenRenderer.draw_selection_incrementally):
596     Added consideration of the specific size of point symbols.
597     The property for each point symbol is retrieved and the size applied
598     for the rendering method.
599     Added doc-string.
600    
601 jan 2393 2004-11-16 Jan-Oliver Wagner <[email protected]>
602    
603     Changed way of Extension Registry for gns2shp and profiling.
604    
605     * Extensions/gns2shp/gns2shp.py: Removed registry entry (moved to
606     __init__.py).
607    
608     * Extensions/gns2shp/__init__.py: Added registry entry and the importing
609     of the actual gns2shp module.
610    
611     * Extensions/profiling/profiling.py: Removed registry entry (moved to
612     __init__.py).
613    
614     * Extensions/profiling/__init__.py: Added registry entry and the importing
615     of the actual profiling module.
616    
617 bernhard 2388 2004-10-28 Bernhard Reiter <[email protected]>
618    
619     * Extensions/svgexport/: Minor improvements to doc strings.
620    
621 jan 2387 2004-10-07 Jan-Oliver Wagner <[email protected]>
622    
623     Further elements for sizable point objects now
624     making this feature usable though not yet complete.
625    
626     * Thuban/Model/save.py (SessionSaver.write_classification): Write
627     attribute 'size' for cldata when the shape layer is of point type.
628     This also now make the test_load.py tests happy.
629    
630     * Thuban/Model/classgen.py (CustomRamp.GetProperties): Added size
631     gradient.
632    
633     * Thuban/UI/classifier.py (ID_SELPROP_SPINCTRL): Renamed to
634     ID_SELPROP_SPINCTRL_LINEWIDTH.
635     (ID_SELPROP_SPINCTRL_LINEWIDTH): New Id replaces ID_SELPROP_SPINCTRL.
636     (ID_SELPROP_SPINCTRL_SIZE): New Id.
637     (SelectPropertiesDialog.__init__): Added a second spin control
638     for the size in case the corresponding layer is of point type.
639     (SelectPropertiesDialog._OnSpin): Renamed to _OnSpinLineWidth.
640     (SelectPropertiesDialog._OnSpinLineWidth): New. Former _OnSpin.
641     (SelectPropertiesDialog._OnSpinSize): New. Set size of property
642     and refresh preview.
643    
644    
645    
646 joey 2381 2004-10-04 Martin Schulze <[email protected]>
647    
648     * Extensions/wms/test/test_parser.py
649     (TestWMSCapabilitiesParser.test_compareLists): Added missing
650     self-test for compareLists()
651     (TestWMSCapabilitiesParser.test_compareDicts): Added missing
652     self-test for compareDicts()
653 joey 2382 (TestWMSCapabilitiesParser.test_compareLists): Adding more tests
654     to verify the test routine fails with non-equal arguments
655     (TestWMSCapabilitiesParser.test_compareDicts): Adding more tests
656     to verify the test routine fails with non-equal arguments
657 joey 2381
658 jan 2370 2004-10-03 Jan-Oliver Wagner <[email protected]>
659    
660 jan 2380 First elements for sizeable point objects.
661    
662     * Resources/XML/thuban-1.1.dtd: Added size attribute to cldata.
663    
664     * Data/iceland_sample_size.thuban: New. Sample for sized point objects.
665    
666     * test/test_load.py (ClassificationTest.TestLayers): Added SetSize in case
667     of a corresponding argument is given.
668     (TestSymbolSize): New. Test the size attribute of cldata.
669    
670     * Thuban/Model/classification.py: Removed some trailing whitespaces.
671     (ClassGroupProperties.__init__): Set default size.
672     (ClassGroupProperties.SetProperties): Set the size.
673     (ClassGroupProperties.GetSize): New. Return the size.
674     (ClassGroupProperties.SetSize): New. Set the size.
675     (ClassGroupProperties__eq__): Compare also size.
676     (ClassGroupProperties__repr__): Print also size.
677    
678     * Thuban/Model/load.py (SessionLoader.start_cldata): Also parse
679     the size attribute.
680    
681     * Thuban/UI/classifier.py (ClassDataPreviewer.Draw): Added doc-string.
682     Also, now there is a return value that indicates whether the drawing
683     size exceeded the given rect extent and if so the new extent.
684     Finally, point objects are drawn depending on the size. If either
685     the width or height is exceeded, the new extent is returned.
686     (ClassRenderer.Draw): Now when calling the previewer drawing function,
687     evaluate the return value and, if not None, adapt the grid widget size
688     accordingly and redraw again.
689    
690     * Thuban/UI/baserenderer.py (BaseRenderer.draw_shape_layer_incrementally):
691     If the draw function is for points, call it with the size as additional
692     parameter.
693     (BaseRenderer.draw_point_shape): Added additional, optional parameter for
694     the size. Compute the radius using the size.
695    
696     * Extensions/importAPR/apr.py (APR_BMkSym.GetThubanProp): Now
697     that Thuban supports size, apply this correctly.
698    
699     * Extensions/importAPR/importAPR.py: Bumped version to 0.1.1.
700    
701     2004-10-03 Jan-Oliver Wagner <[email protected]>
702    
703 jan 2370 * Doc/manual/thuban-manual-de.xml: Started translation of
704     Map chapter.
705    
706 joey 2368 2004-10-01 Martin Schulze <[email protected]>
707    
708     * Extensions/wms/properties.py (wmsProperties.__init__): Extended
709     argument for general use through properties-dialog selector
710    
711     * Thuban/UI/classifier.py: Register properties dialog classes for
712     both provided layer classes/types.
713    
714     * Thuban/UI/mainwindow.py (MainWindow.OpenLayerProperties): The
715     map can be retrieved through the parent which is passed to the
716     constructor anyway and doesn't require an argument of its own,
717     required for the unification of arguments for general use through
718     properties-dialog selector.
719     (MainWindow.OpenOrRaiseDialog): Move the logic for checking
720     whether a dialog is already opened (and raising it to the users
721     attention) and creating a new dialog into a function of its own
722     (MainWindow.OpenLayerProperties): Use the new OpenOrRaiseDialog()
723     method
724     (MainWindow.OpenLayerProperties): Utilise the new ClassMapper for
725     global registration of properties dialog classes (which are indeed
726     layer-specific).
727    
728     * Thuban/UI/classifier.py (Classifier.__init__): Unify arguments
729     for general use through properties-dialog selector, the map can be
730     retrieved through the parent and doesn't require an argument of
731     its own.
732    
733     * Extensions/wms/wms.py: Register the properties dialog class for
734     the provided WMS layer
735    
736 jan 2358 2004-09-28 Jan-Oliver Wagner <[email protected]>
737    
738     New feature: Registry for Extensions.
739    
740     * Thuban/UI/extensionregistry.py: This module defines a registry for
741     Extensions.
742    
743     * Thuban/UI/about.py (About.__init__): Added description
744     of the registered extensions with all of the information.
745    
746     * Thuban/Model/extension.py (Extension): Improved doc-string.
747    
748     * Extensions/gns2shp/gns2shp.py, Extensions/importAPR/importAPR.py,
749     Extensions/bboxdump/bboxdump.py, Extensions/profiling/profiling.py,
750     Extensions/wms/wms.py: Added registration of the extension.
751    
752 bernhard 2352 2004-09-27 Bernhard Reiter <[email protected]>
753    
754     More fixes to svgexport to make used ids unique and
755     conforming to XML's Name production.
756    
757     * Extensions/svgexport/test/test_svgmapwriter.py: Added new tests
758     test_xml_id_constraints(), test_make_ide_nosetbaseid() and
759     test_make_id_nonintegersetid(). Switched SetID and SetBaseID.
760     Added Bernhard R. as author.
761     * Extensions/svgexport/svgmapwriter.py (make_id): Using "_" as
762     concatenation char now (makes test_make_ide_nosetbaseid() valid).
763     Also transform second id part with "%d" and catch the TypeError
764     to raise SVGMapWriterError (making test_make_id_nonintegersetid() ok).
765     Corrected typo inBernhard's author line.
766     (SetBaseID): Return the transformed base id. Transform characters
767     which are not alnum() or in ".-_" to binascii.b2a_hex(). Added
768     import binascii. If to be set string starts with "xml" or so, add "t".
769     (draw_shape_layer_incrementally): use the returned value of SetBaseID
770     for used_baseids checks.
771    
772 bh 2351 2004-09-25 Bernhard Herzog <[email protected]>
773    
774     * test/test_layer.py (TestLayer.test_arc_layer_with_projection):
775     Remove a debug print and some tab characters.
776    
777 bernhard 2350 2004-09-25 Bernhard Reiter <[email protected]>
778    
779     * Extensions/svgexport/svgmapwriter.py: Added Bernhard R. as Author.
780     (SetBaseID, SetID, make_id): Improved docstring comments to explain
781     the interaction of the three functions and the XML id contrains.
782    
783 bernhard 2352
784 jan 2346 2004-09-23 Jan-Oliver Wagner <[email protected]>
785    
786 jan 2349 * Doc/ThubanModel.xmi: New. UML file for Thuban Model
787     Module.
788    
789     * Doc/README: Added info on ThubanModel.xmi.
790    
791     2004-09-23 Jan-Oliver Wagner <[email protected]>
792    
793 jan 2346 * Doc/README: New. Some info about how to generate technical
794     documentation from the source code.
795     This text was send to the Thuban developer mailing list on
796     September 21st 2004 by Bernhard Reiter.
797    
798 bernhard 2344 2004-09-21 Bernhard Reiter <[email protected]>
799    
800     Improved the svgexport to only use unique ids. Will issues
801     an error message dialoge when two layer names are the same.
802     ShapeIDs are now added with a dash within the svg ids.
803    
804     * Extensions/svgexport/svgmapwriter.py (SVGMapWriterError): New.
805     * Extensions/svgexport/test/test_svgmapwriter.py: Added imports
806     (TestSVGRenderer): New test class with test_make_in() and
807     test_check_for_layer_name_clash()
808     * Extensions/svgexport/svgmapwriter.py (SVGRenderer): Fixed __init__()
809     and draw_shape_layer_incrementally() to not use a baseid twice,
810     satisfying test_check_for_layer_name_clash()
811     (VirtualDC.make_id): Use a dash between baseit and id, satisfies
812     test_make_in().
813     * Extensions/svexport/svgsaver.py: Import SVGMapWriterError, wxOK
814     and wxICON_HAND.
815     (write_to_svg): Put dc and rendering in a try statement and on
816     catching SVGmapWriterError notify the user and delete the target file.
817    
818 bernhard 2343 2004-09-20 Bernhard Reiter <[email protected]>
819    
820     * Model/base.by, Model/layer.py: Fixed typos in docstrings.
821    
822 jschuengel 2342 2004-09-03 Jan Schüngel <[email protected]>
823    
824     * Extensions/umn_mapserver/mapfile(MF_Class.add_thubanstyle): Fix a
825     small bug with the line color. Now the line color will now only set
826     if it is set in Thuban an not Transparent.
827    
828     * Extensions/umn_mapserver/mf_export(tblayer_to_map): Fixed a bug with
829     deleting the layers from mapfile. Now all layers will delete backwards
830     from the last.
831    
832 silke 2339 2004-08-20 Silke Reimer <[email protected]>
833 silke 2338
834 silke 2339 * Thuban/Model/layer.py:
835     Fixes bug in projection handling: Otherwise very large region might not
836     have valid values in the layer's projection.
837    
838     2004-08-20 Silke Reimer <[email protected]>
839    
840 silke 2338 * Thuban/UI/about.py:
841     small changes to be consistent with coding style.
842    
843 joey 2337 2004-08-13 Martin Schulze <[email protected]>
844    
845     * Extensions/wms/test/test_ogclib.py (TestOGCLib.compare_URLs):
846     Adjusted a comment
847    
848 silke 2335 2004-08-11 Silke Reimer <[email protected]>
849 silke 2334
850 silke 2335 * Thuban/UI/about.py: Small changes to encoding related stuff to avoid
851     too many and too enhanced imports of locale
852    
853 silke 2334 2004-08-10 Silke Reimer <[email protected]>
854    
855     * Thuban/UI/about.py: Fixed encoding problem of about dialog: Added
856 silke 2339 function unicodeToLocale() to convert special characters to users
857     locale encoding
858 silke 2334
859 jan 2333 2004-08-10 Jan-Oliver Wagner <[email protected]>
860    
861     * Doc/technotes/coding_guidelines.txt: Added rule 'Method names start with
862     lower case letter'
863    
864 jschuengel 2331 2004-08-09 Jan Schüngel <[email protected]>
865    
866     * ChangeLog: Rewrite the last ChangeLog entry to follow
867     the standard way.
868    
869     * Extensions/umn_mapserver/mapfile: Moved the import AnnotationLayer to
870     the function where it is needed, because it don't works if it stands
871     at the beginning.
872     (MF_Layer.__init__): Removed the extra numclassed variable. Now
873     numclasses from the mapscript will be used.
874     (MF_Layer.get_index): New. Return the index of the layer in mapfile.
875     (MF_Layer.set_classes): New. A Classlist will be set to the layer.
876     (MF_Layer.set_metadata): New. A Metadata mapscript object will set.
877     (MF_Layer.remove_allclasses): New. All class of the layer will remove.
878     (MF_Map.create_new_layer): New. A new Layer is created and associated
879     with the mapscript object.
880     (MF_Map.set_layerorder): New. The Layer order like in thuban is set in
881     the mapscript.
882     (MF_Map.add_thubanlayer): Now a new layerobj is created if no one is
883     linked to the layer in thuban, else the layerobject linked to the
884     thubanlayer will be used.
885     AnnotationLayer will now store the filename of the shapefile.
886     (MF_Map.remove_layer): If a layer is removed the associated object
887     must be set new.
888    
889     * Extensions/umn_mapserver/mf_export.py(tb_layer_to_map): Add all
890     layers which are exists in thuban to the mapobj. All removed Layers
891     will be removed from the mapobj.
892     Added comments to all functions.
893     (thuban_to_map): No layer will be removed here.
894    
895     * Extensions/umn_mapserver/mf_handle.py
896     (_has_umn_mapobj_and_selectedlayer): Activating the layer menu. Now
897     Layersettings for the mapserver kann be edited.
898    
899     * Extensions/umn_mapserver/mf_import.py: Now all layers which are
900     imported, will be linked with the associated MF_Layer.
901     (import_mapfile): All layers, which are not selected, will be removed.
902     Disable the "import layer from mapfile" menu option.
903    
904     * Extensions/umn_mapserver/sample/iceland.map: Set the status of the
905     Annotation Layer from DEFAULT to OFF. The DEFAULT setting turns the
906     layer on permanently.
907    
908 jschuengel 2323 2004-08-03 Jan Schüngel <[email protected]>
909    
910 jschuengel 2331 * Extensions/umn_mapserver/mapfile.py(MF_Metadata.remove_allmetadata):
911     New. This function removes all metadata
912     (MF_Layer.set_group): New. Set the group setting.
913     (MF_Layer.get_group): New. Get the group setting.
914     (MF_Map): Removed the extra numlayers variable, used the mapscript
915     parameter instead.
916     (MF_Map.get_numlayers): New. This get numlayers.
917     (MF_Map.remove_all_layers): New. Removes all layers from the mapobj.
918 jschuengel 2323 (MF_Map.add_thubanlayer): Replaced the exception handling by a check
919     if the object is an instance. Also added the annotation layer here to
920     export, but only the layer is created in the mapfile.
921    
922 jschuengel 2331 * Extensions/umn_mapserver/mf_export.py(export_mapfile): Removed
923     the check if a mapobj exist, because its not needed anymore. The
924     export function is only available if a mapobj exist.
925     Use the new function to remove all layers.
926 jschuengel 2323
927 jschuengel 2331 * Extensions/umn_mapserver/mf_handle.py(Layer_Dialog): Added a group
928     option and the metadata button. The layer dialog is temporary disabled.
929     (Metadata_CustomDataTable): Added some functions to show the grid
930 jschuengel 2323 correct.
931    
932 jschuengel 2331 * Extensions/umn_mapserver/mf_import.py: Moved the code for showing
933     the number of layer from import_mapfile to this function.
934     (AnnotationLayer): New. This Class shows the Annotation layer in
935     thuban. The layer don't do anything. It's only to show the layer
936     and to save the layer order.
937     (add_annotationlayer): New. Import an annotation layer to thuban.
938     (select_layer2import): New. Import only layers to thuban and not
939     the other settings like projection or scalebar.
940     (create_new_mapfile): Moved the _has_umn_mapobj function and the
941     create_new_mapfile functions from mf_handle.py to mf_import.py.
942 jschuengel 2323
943     * Extensions/umn_mapserver/sample/iceland.map: Added the group
944     parameter to the roads and cultural layers. Also added a new
945     Annotation Layer for the cultural points.
946    
947     * Extensions/umn_mapserver/sample/iceland.html: Added the select
948     option for the annotation layer.
949    
950     * Extensions/umn_mapserver/sample/index.html: Added the start
951     parameter for the annotation layer.
952    
953 jan 2315 2004-08-01 Jan-Oliver Wagner <[email protected]>
954    
955     * Doc/manual/thuban-manual-de.xml (Chapter Session Management):
956     translation completed.
957    
958     * Doc/manual/thuban-manual.xml (Chapter Session Management):
959     Fixed unprecise description for Save Session.
960    
961 jan 2312 2004-07-31 Jan-Oliver Wagner <[email protected]>
962    
963     Started translation of Users Manual into german.
964    
965     * Doc/manual/thuban-manual-de.xml: New. German Users Manual.
966    
967     * Doc/manual/Makefile: Added build instructions for german
968     users manual.
969    
970     * Doc/manual/thuban-manual.xml: Minor corrections in Introduction.
971    
972 jschuengel 2308 2004-07-28 Jan Schüngel <[email protected]>
973    
974     * Extensions/umn_mapserver/mapfile.py(MF_Metadata): Changed all class
975     functions. Now all metadata will handle by the function and its not
976     needed to initialize it from outside. Therefor the associated mapobj
977     will be stored in the Metadata Object. So we can use the special
978     functions from the associated mapobj to get the Metadata.
979     Therefor all initialization code for the metadata is removed from the
980     other classes.
981     (MF_Layer): Added a function to get the metadata object.
982     (MF_Map): Added a function to set the mappath, the path where
983     the mapfile ist stored.
984    
985     * Extensions/umn_mapserver/mf_export.py(thuban_to_map): Changed the code
986     to set the extent in the mapfile. Now the code is set by the displayed
987     data in the Thuban-view.
988     (export_mapfile): The shapepath is now set empty, until relative
989     pathnames are supported.
990    
991     * Extension/umn_mapserver/mf_handle.py: Added a dialog to handle
992     metadata. Yet only mapfile metadata are supported. Layer and class
993     supported are not implemented.
994     Added a dialog to handle layer informations. The dialog only shows the
995     selected layer at the moment.
996    
997     * Extensions/umn_mapserver/mf_import.py(import_mapfile): Changed the
998     code for setting the extent in thuban. Now the extent is set to the
999     given extent from the mapfile.
1000     Fixed a logical mistake. Now the extent is set when realy a layer is
1001     loaded, and not if one is selected to load.
1002    
1003     * Extensions/umn_mapserver/sample/iceland.html: Added code to zoom and
1004     move the shown map in the browser.
1005    
1006     * Extensions/umn_mapserver/sample/iceland.map: Added a new metadata
1007     line to the mapobj and added metadata to the political layer.
1008    
1009     * Extensions/umn_mapserver/test/test_mapserver.py: Changed the test
1010     for Metadata.
1011    
1012 joey 2300 2004-07-26 Martin Schulze <[email protected]>
1013    
1014     * Thuban/Lib/classmapper.py (ClassMapper.has): Added the new
1015     ClassMapper
1016    
1017     * test/test_classmapper.py (TestMapping.test_mapper): Added a Test
1018     case for the new ClassMapper
1019    
1020    
1021 bh 2296 2004-07-22 Bernhard Herzog <[email protected]>
1022    
1023 bh 2297 * Thuban/UI/viewport.py (ViewPort.VisibleExtent): New. Return the
1024     visible extent of the map in projected coordinates
1025    
1026     * test/test_viewport.py (SimpleViewPortTest.test_default_size)
1027     (SimpleViewPortTest.test_init_with_size): Add some VisibleExtent()
1028     tests.
1029     (SimpleViewPortTest.test_visible_extent): New. The real test for
1030     VisibleExtent()
1031    
1032     2004-07-22 Bernhard Herzog <[email protected]>
1033    
1034 bh 2296 * test/test_viewport.py: Use support.run_tests as the main
1035     function when running asa script.
1036    
1037 jschuengel 2295 2004-07-22 Jan Schüngel <[email protected]>
1038    
1039     * Extensions/umn_mapserver/mf_export.py: Added "import os"
1040     Removed the old "import Thuban.UI.mainwindow" code.
1041     (tbextent_to_map): Removed the extra function and at the code direct
1042     to "thuban_to_map" function.
1043     (write_creatorcomment): Added. Now a short comment is added to the
1044     beginning of an generated mapfile.
1045     (export_mapfile): Now the Path and filename are saved in to variables,
1046     and not together in one variable. This is needed for the new
1047     write_creatorcomment function.
1048    
1049     * Extensions/umn_mapserver/mf_import.py (import_mapfile): Added the
1050     import module "re". Also added Range and the ClassGroupRange import
1051     from Thuban. Both are needed for the new range expression import.
1052     (create_rangeexpression): Added. Creates a Range Expression in Thuban
1053     style from a given mapfile expression.
1054     (added_rasterlayer): Make some small code changes. The shapepath is
1055     now stored in an extra variable and the clazz_name is set empty if no
1056     class name set in the mapfile.
1057     Changed the Error message for Range Expressions, becaus the new
1058     function create a error string which will be shown in the dialog.
1059    
1060     * Extensions/umn_mapserver/test/test_mapserver.py: Added a test for the
1061     range expression import.
1062 jan 2312
1063 jan 2291 2004-07-21 Jan-Oliver Wagner <[email protected]>
1064    
1065     * Extensions/umn_mapserver/README: Added hint that
1066     installation as root can be avoided. Removed all tabs.
1067    
1068 bh 2289 2004-07-16 Bernhard Herzog <[email protected]>
1069    
1070     * test/test_viewport.py
1071     (ViewPortTest.test_changing_map_projection): Check that changing
1072     the projection of an empty map shown in a viewport doesn't lead to
1073     exceptions in the viewport's handler for the
1074     MAP_PROJECTION_CHANGED messages
1075    
1076     * Thuban/UI/viewport.py (ViewPort.map_projection_changed): Only
1077     try to keep the same region visible when the map actually contains
1078     something
1079    
1080 jschuengel 2288 2004-07-15 Jan Schüngel <[email protected]>
1081    
1082     * Extensions/umn_mapserver/mapfile.py: Added a function to get the
1083     mappath directly from the mapobj. Is needed because of the changes
1084     in mf_import.py.
1085     (MF_Layer.add_thubanclass): Added a new comment.
1086     (MF_Map.set_extent): Fixed a bug with exporting empty mapobj. If the
1087     mapobj is empty there is no extent get from thuban an so no one can
1088     set to th mapobj.
1089    
1090     * Extensions/umn_mapserver/mf_import.py (import_mapfile): Updated
1091     the discription.
1092     Split the funktion in to three smaller ones. The new functions are
1093     add_rasterlayer, add_polygonlayer and select_layer2import.
1094     Removed the mapfilepath and filepath initialisation, because its know
1095     include in the new functions.
1096     Now nothing will be imported if cancel is pressed in the
1097     layer choice dialog.
1098    
1099 jschuengel 2285 2004-07-14 Jan Schüngel <[email protected]>
1100    
1101     * Extensions/umn_mapserver/mapfile.py: Added ClassGroupDefault to
1102     import.
1103     (MF_Symbolset): Removed the extra variable for numsymbols.
1104     (MF_Class.__init__): Added a comment to the exception clause.
1105     Removed the extent init, because it was not needed anymore.
1106     (MF_Layer.add_thubanclass): Added the code to set the class name to
1107     the expression value from thuban if no label is defined.
1108     Added the code to export Range expressions from thuban to the mapfile.
1109     (MF_Map.set_extent): Removed the exception and replace it by some if
1110     code. If the size of a map is not defined the size will be set to 1,1.
1111     This is necessary because if the extent is set, mapscript checks if
1112     the size is greater than zero.
1113     (MF_Web): Added the get and set function for the template.
1114    
1115     * Extensions/umn_mapserver/mf_export.py: Added the function to check
1116     if a mapobject exists and used it to set the status of the menu items.
1117     If no mapfile exists the settings could not be edditied.
1118     Define after which menuitem the exportitem will include.
1119    
1120     * Extensions/umn_mapserver/mf_handle.py: Removed the import
1121     Thuban.UI.mainwindow clause, because it is not needed.
1122     Added the command Refresh() to all "OnChangeColor()" functions,
1123     because the color preview window was not updated on a color change.
1124     Added the function to check if a mapobject exists and used it to set the
1125     status of the menu items. If no mapobject exists the settings could not
1126     be edditied.
1127     (Map_Dialog): Moved the imagetype selector from the
1128     Outputformat_Dialog to Map_Dialog and removed Outputformat_Dialog.
1129     (Web_Dialog): Removed the name label and added the template textbox.
1130    
1131     * Extensions/umn_mapserver/mf_import.py (import_mapfile): Replace
1132     the exception handling on loading the layers by an if statement. It
1133     is not necessary to us the exception there.
1134     The Filepath creation now use os.path.join to build the path.
1135    
1136     * Extensions/umn_mapserver/test/test_mapserver.py: Moved the testMap
1137     definition from global to the setUp function. Now the testMap will
1138     initialize new on each test.
1139    
1140     * Extensions/umn_mapserver/sample/iceland.map: Include three new
1141     classes in the Line Layer, to test logical Expressions.
1142     Set the status of the class "Point9" in the Point Layer to off
1143    
1144 bh 2278 2004-07-13 Bernhard Herzog <[email protected]>
1145    
1146     * Thuban/UI/baserenderer.py
1147     (BaseRenderer.render_map_incrementally): Fix a logic bug in the
1148     optimization that tries not to draw layers under a raster layer.
1149     The bug was harmless. All it effectively did was to produce The a
1150     strange messages about not being able to draw Layer instances for
1151     all vector layers below a raster layer which would be invisible
1152     anyway because the raster layer currently always covers the entire
1153     window
1154    
1155 jschuengel 2277 2004-07-08 Jan Schüngel <[email protected]>
1156    
1157     * Extensions/umn_mapserver/mapfile.py: Added code to generade and get
1158     a list of supported outputformats. This formats are not alle supported
1159     because there is no possibility to get the outputformat without the
1160     name known. Make some formal changes to the code.
1161     (MF_Map.set_name()): Fixed a bug if the name is None.
1162    
1163     * Extensions/umn_mapserver/mf_handle.py: Removed the image_type import
1164     statement, because its not needed anymore. The Outputformat is now
1165     given as string from the object. Make some formal changes to the code.
1166    
1167     * Extensions/umn_mapserver/test/test_mapserver.py: Added new test for
1168     most of the new setting which were added during the last changes.
1169     Removed the MF_Size Test.
1170    
1171     * Extensions/umn_mapserver/test/test.map: Added a new class to the
1172     cultural Layer to test expressions and the the status of that layer
1173     from on to default.
1174     Changed the data path the the correct Thuban Data
1175     Added the Outputformat Object and Symbol Object
1176    
1177 jschuengel 2272 2004-07-07 Jan Schüngel <[email protected]>
1178    
1179     * Extensions/umn_mapserver/mapfile.py: Added some new
1180     settings to edit (outputformat, label, imagetype)
1181    
1182     * Extensions/umn_mapserver/mf_handle.py: Added some setting to
1183     the Label Dialog and add the OutputDialog.
1184     Make some changes to the code order.
1185    
1186 jschuengel 2269 2004-07-06 Jan Schüngel <[email protected]>
1187    
1188     * Extensions/umn_mapserver/mapfile.py: Added the symbolObj, pointObj
1189     and line Obj and add the scalebar_status_type, scalebar_style_type and
1190     scalebar_position_type.
1191     Added the symbol- and symbolsetObject (MF_Symbol,MF_Symbolset). The
1192     are only used to create a Symbol like the circle in Thuban.
1193     Added the scalebarObject (MF_Scalebar)
1194     (MF_Class): Added set_status and get_status.
1195     (MF_Layer.add_thubanclass): Added code to set the class status
1196     (MF_Map): Added code to handle the symbols and scalebar
1197     (MF_Label): Added the set_partials and get_partials functions
1198    
1199     * Extensions/umn_mapserver/mf_export.py: Added MF_Symbol to import
1200     from mapfile. Added a function to create a circle object like the one
1201     from thuban if no one exists.
1202    
1203     * Extensions/umn_mapserver/mf_handle.py: All colors are now set when
1204     press ok in the assosiated dialog and not at the end of the
1205     colordialog.
1206     Added the Dialog for the Scalebar.
1207     (Label_Dialog): Added the offset option
1208    
1209     * Extensions/umn_mapserver/mf_import.py: Added code to import the
1210     status of the Classes.
1211     Fixed a bug with the projection. Now the to_meter parameter will be
1212     added to the Projection only if it doesn't exists.
1213    
1214 jschuengel 2264 2004-07-01 Jan Schüngel <[email protected]>
1215    
1216     Added the functionality to handle the content thuban is not
1217     able to handle directly.
1218    
1219     * Extensions/umn_mapserver/mf_handle.py: New. This module extents
1220     Thuban with the possibility to edit the mapfile content.
1221    
1222     * Extensions/umn_mapserver/mf_import.py: Added the possibility
1223     to import mapfiles without any layer selected. So it is possible
1224     to edit the other settings in a mapfile.
1225     (import_mapfile): Added code to use the editing functions.
1226     Added the possibility to import the projection to a layer if one
1227     is defined.
1228     Status settings (On,Off) will now set in thuban (visible, invisible).
1229     fixed a bug with with classnames. If no classname is set in mapfile
1230     the value in Thuban will set to the expression.
1231    
1232     * Extensions/umn_mapserver/mf_export.py(export_mapfile): Added the
1233     possibility to save a new mapfile or use the old one which is
1234     imported or new created.
1235     Added code to use the editing functions.
1236     Remove some not needed import statements
1237    
1238     * Extensions/umn_mapserver/mapfile.py: Added new types which are
1239     need for the editing functions.
1240     Added needed set-functions for the editing functions.
1241     Added the possibility to export rasterimages.
1242     Added new classes (MF_Web, MF_Label, MF_Legend, MF_Symbol,
1243     MF_SymbolSet). MF_Symbol and MF_SymbolSet are not needed at the
1244     moment.
1245     (MF_Class.set_thubanstyle): Now point layers will set to a default
1246     symbol to show a circle in mapserver and not only a 1px dot.
1247     (MF_Style.__init__): Fixed a bug with the color. Color was not set
1248     correct before.
1249     (MF_Size): Removed, because it is not needed.
1250    
1251     * Extensions/umn_mapserver/README: Added the hints to use the
1252     export and editing functions, too.
1253    
1254     * Extensions/umn_mapserver/sample/iceland.map: Added the
1255     new parameter "UNITS METERS".
1256     Change the political layer to status OFF.
1257    
1258     * Extensions/umn_mapserver/sample/README: Added some
1259     more details to setup the sample in the MapServer.
1260    
1261 bernhard 2256 2004-06-26 Bernhard Reiter <[email protected]>
1262    
1263     * Extensions/svgexport/test/test_svgmapwriter.py:
1264     Removed class VFile and used standard StringIO instead.
1265    
1266 jschuengel 2255 2004-06-23 Jan Schüngel <[email protected]>
1267    
1268     Add the export function to the umn_mapserver extension.
1269    
1270     * Extension/umn_mapserver/mf_export.py: New. This module extents
1271     Thuban with the possibility to export the Thuban content.
1272    
1273     * Extensions/umn_mapserver/mapfile.py: Expand the classes to use
1274     with the export module. Especially added the possibility to
1275     add thuban objects directly to the map objects.
1276    
1277     * Extensions/umn_mapserver/mf_import.py: Removed the wxCHANGE_DIR,
1278     because of the hint from Bernhard Herzog.
1279     Corrected the handling of absolute pathnames.
1280     Changed the Text of the Menu-Item, now the beginning is upper case.
1281    
1282     * Extensions/umn_mapserver/README: Added the --with-tiff statement.
1283    
1284 jschuengel 2250 2004-06-16 Jan Schüngel <[email protected]>
1285 jschuengel 2242
1286 jschuengel 2250 Add a sample and make some changes.
1287    
1288     * Extension/umn_mapserver/mf_import.py: Changed the wxPython.wx
1289     import from * to explicit used statements. Changed the
1290     Thuban.UI.mainwindow import phrase, too.
1291     (import_mapfile):Corrected a clerical mistake.
1292     Added wxCHANGE_DIR in OpenFile Dialog.
1293     Added a MultipleChoiceDialog, to select the layers to load from
1294     mapfile into thuban. Thereby the projection is only set if one layer
1295     is selected.
1296     Added the possibility to handle relative pathnames which uses
1297     up-level references.
1298     Removed some doubled code.
1299     Corrected an error with integer values used as label in thuban
1300     ClassGroup.
1301    
1302     * Extensions/umn_mapserver/sample: New.
1303    
1304     * Extensions/umn_mapserver/sample/README: New. Describes the
1305     usage of the sample files.
1306    
1307     * Extensions/umn_mapserver/sample/iceland.map: New. This is
1308     a suitable .map-file for the iceland data.
1309    
1310     * Extensions/umn_mapserver/sample/index.html: New. The template
1311     for the mapfile.
1312    
1313     * Extensions/umn_mapserver/sample/iceland.html: New. Initialisation
1314     file for the Iceland Application on web.
1315    
1316     * Extensions/umn_mapserver/README: Corrected a inaccuracy and added
1317     some details.
1318    
1319     * Extensions/umn_mapserver/test/test_mapserver
1320     (mapserver_import_Test_generalClasses.test_MF_Color):
1321     Corrected the thubancolor test.
1322    
1323     2004-06-15 Jan Schüngel <[email protected]>
1324    
1325 jschuengel 2242 * Extensions/umn_mapserver/README: New. Install instruction.
1326    
1327 bernhard 2240 2004-06-14 Bernhard Reiter <[email protected]>
1328    
1329     * libraries/thuban/cpl_mfile.h: Added copyright header.
1330    
1331     * libraries/thuban/ cpl_mfile.cpp, cpl_mfile.h: Added non-protecting
1332     Free Software License so that it is most useful with gdalwarp
1333     and bmpdataset.
1334    
1335 bh 2239 2004-06-14 Bernhard Herzog <[email protected]>
1336    
1337     * Thuban/UI/multiplechoicedialog.py (__version__): Add missing
1338     import of wxPython.wx itself (as opposed to the contents of
1339     wxPython.wx). For some reason wxPython.wx is available as
1340     wxPython.wx.wx in at least some 2.4 releases. Fixes RT#2482
1341     wrt. wxPython 2.4.
1342    
1343 jschuengel 2238 2004-06-10 Jan Schüngel <[email protected]>
1344    
1345     Initial version of new extension "umn_mapserver". This extension aims
1346     to manage configuration for the UMN MapServer application. This
1347     inital version just imports the .map-files and displays all, Thuban is
1348     capable of.
1349    
1350     * Extensions/umn_mapserver, Extensions/umn_mapserver/test: New.
1351    
1352     * Extensions/umn_mapserver/test/README: New. Describes how to run the
1353     tests.
1354    
1355     * Extensions/umn_mapserver/test/test.map: New. This is a test
1356     .map-file for automated tests of the umn_mapserver extension of
1357     Thuban.
1358    
1359     * Extensions/umn_mapserver/test/test_mapserver.py: New. Tests for
1360     UMN Mapserver classes.
1361    
1362     * Extensions/umn_mapserver/__init__.py: New. Init to make this
1363     directory a package.
1364    
1365     * Extensions/umn_mapserver/mapfile.py: New. Classes to represent
1366     '.map'-file objects.
1367    
1368     * Extensions/umn_mapserver/mf_import.py: New. This module extends
1369     Thuban with the possibility to handle UMN MapServer mapfiles.
1370    
1371 bh 2230 2004-06-03 Bernhard Herzog <[email protected]>
1372    
1373     * Thuban/Model/layer.py (Layer.TreeInfo): Convert the bounding box
1374     to a tuple before using it as arguments to the % operator. This
1375     fixes the formatting issue filed in RT#2239 on 2004-01-13 and
1376     reported today on thuban-list by Jan Schüngel
1377    
1378     * test/test_layer.py (TestLayerModification.setUp): Save the
1379     filename as an instance variable so we can refer to it in tests
1380     (TestLayerModification.test_tree_info): Uncomment this method
1381     again and make it work. This tests for the formatting issue
1382     filed in RT#2239 on 2004-01-13
1383    
1384 bh 2224 2004-05-28 Bernhard Herzog <[email protected]>
1385    
1386     * Thuban/UI/baserenderer.py: Fix some typos.
1387    
1388 jan 2217 2004-05-18 Jan-Oliver Wagner <[email protected]>
1389    
1390     * Extensions/gns2shp/gns2shp.py (gns2shp): Fixed a bug
1391     by increasing a field size.
1392    
1393 bh 2213 2004-05-17 Bernhard Herzog <[email protected]>
1394    
1395     Update to newest shapelib and get rid of Thuban specific
1396     extensions, i.e. use the new DBFUpdateHeader instead of our
1397     DBFCommit kludge
1398    
1399     * libraries/shapelib/shpopen.c: Update to version from current
1400     shapelib CVS.
1401    
1402     * libraries/shapelib/shapefil.h: Update to version from current
1403     shapelib CVS.
1404    
1405     * libraries/shapelib/dbfopen.c: Update to version from current
1406     shapelib CVS.
1407     (DBFCommit): Effectively removed since shapelib itself has
1408     DBFUpdateHeader now which is better for what DBFCommit wanted to
1409     achieve.
1410     We're now using an unmodified version of dbfopen.
1411    
1412     * setup.py (extensions): Add the HAVE_UPDATE_HEADER macro with
1413     value '1' to the Lib.dbflibc extension. This simply reflects the
1414     shapelib and pyshapelib updates
1415    
1416 jan 2211 2004-05-16 Jan-Oliver Wagner <[email protected]>
1417    
1418     Finished introduction of Menu.FindOrInsertMenu.
1419    
1420     * Extensions/drawshape/drawshape.py: Add the command
1421     to the experimental menu additionally to the toolbar.
1422    
1423     * Extensions/svgexport/svgsaver.py: Use FindOrInsertMenu() instead of
1424     finding menu on its own.
1425    
1426     * Doc/manual/thuban-manual.xml: updated sample file
1427     to use FindOrInsertMenu().
1428    
1429     * Examples/simple_extensions/hello_world.py: Use FindOrInsertMenu()
1430     instead of finding menu on its own.
1431    
1432 jan 2206 2004-05-11 Jan-Oliver Wagner <[email protected]>
1433    
1434     * test/test_menu.py (MenuTest.test): Added testing
1435     of method Menu.FindOrInsertMenu.
1436    
1437 jan 2204 2004-05-10 Jan-Oliver Wagner <[email protected]>
1438    
1439     Introduce and use Menu.FindOrInsertMenu.
1440    
1441     * Thuban/UI/menu.py (Menu.FindOrInsertMenu): New. Find a
1442     given menu or, if not found, insert it.
1443    
1444     * Extensions/bboxdump/bboxdump.py, /Extensions/gns2shp/gns2shp.py,
1445     /Extensions/importAPR/importAPR.py, Extensions/profiling/profiling.py,
1446     /Extensions/wms/wms.py: Use FindOrInsertMenu() instead of finding
1447     menu on its own.
1448    
1449 jan 2201 2004-05-06 Jan-Oliver Wagner <[email protected]>
1450    
1451     Introduce a abstract ColorDialog class and remove
1452     and outdated file.
1453    
1454     * Thuban/UI/proj4dialog.py: Removed. It is has been
1455     replaced by projdialog for quite a while and is not used
1456     anymore.
1457    
1458     * Thuban/UI/colordialog.py: New. Abstraction for color selection
1459     dialog(s).
1460    
1461     * Thuban/UI/classifier.py (SelectPropertiesDialog.__GetColor):
1462     Now calls the abstract ColorDialog instead of wxColourDialog.
1463     This also removed the dependency to Color class conversion
1464     from this function.
1465    
1466 frank 2197 2004-05-04 Frank Koormann <[email protected]>
1467    
1468     * Extensions/bboxdump/__init__.py: Fixed string left over from
1469     copying.
1470    
1471     * Extensions/bboxdump/bboxdump.py (bboxdump):
1472     Use layer.ShapeStore().AllShapes() to loop over shapes instead of
1473     xrange(layer.NumShapes()). Compile the bboxmessage from a list
1474     of formatted outputs (string.join) instead of appending to the
1475     message. Two progress bar dialogs to report progress on the sometimes
1476     lenghty processing.
1477    
1478 frank 2196 2004-04-22 Frank Koormann <[email protected]>
1479    
1480     New Extension to dump bounding boxes of all shapes of the selected
1481     layer. An optional column can be specified to group the objects,
1482     in this case the bounding box is a union of the separate boxes.
1483     Dump can be displayed in a ScrolledMessageDialog or written to file.
1484     The Extension is simply a combination of available and well tested
1485     Thuban functionality.
1486    
1487     * Extensions/bboxdump/__init__.py: New: Init to make this
1488     directory a package.
1489    
1490     * Extensions/bboxdump/bboxdump.py: New: Dump bounding boxes of
1491     all shapes of the selected layer.
1492    
1493 jan 2192 2004-04-22 Jan-Oliver Wagner <[email protected]>
1494    
1495     * Thuban/UI/classgen.py (GenUniquePanel.__init__): Fixed two
1496     strings to be i18n now.
1497    
1498 jan 2188 2004-04-18 Jan-Oliver Wagner <[email protected]>
1499    
1500     Changing popup menu of legend from direct building
1501     to using the Menu construction as used for the mainwindow.
1502    
1503     * Thuban/UI/mainwindow.py: New method commands: layer_to_top,
1504     layer_to_bottom, layer_visibility
1505     (MainWindow.LayerToTop): New. Put current layer to the top.
1506     (MainWindow.LayerToBottom): New. Put current layer to bottom.
1507     (MainWindow.HideLayer, MainWindow.ShowLayer, _has_visible_map):
1508     Replace 1,0 by True, False.
1509     (MainWindow.ToggleLayerVisibility): New. Toggle visibility of
1510     current layer.
1511     (MainWindow.LayerShowTable): Removed raising of dialog.
1512     (_has_selected_layer_visible): New. Support function.
1513    
1514     * Thuban/UI/legend.py: ID_POP_xxx: removed.
1515     (LegendPanel.__init__): Removed EVT_MENU bindings.
1516     (LegendTree._OnRightClick): Replace direct creation of
1517     menu via wx Classes by applying the menu definition
1518     as of Menu class of menu.py.
1519    
1520 jan 2185 2004-04-16 Jan-Oliver Wagner <[email protected]>
1521    
1522     * Thuban/UI/exceptiondialog.py (ExceptionDialog.dialog_layout): Improved
1523     button string to stronger clearify that Thuban will be closed when hitting
1524     the button.
1525    
1526     * Thuban/UI/mainwindow.py (MainWindow.LayerShowTable): Added docstring.
1527     Now for layers without a ShapeStore a corresponding message is given
1528     to the user, that this layer has no table to show.
1529    
1530 joey 2182 2004-04-15 Martin Schulze <[email protected]>
1531    
1532     * Extensions/wms/layer.py (WMSLayer.setWMSFormat): Need to
1533     recalculate the format for the internal render engine as well.
1534    
1535     * Extensions/wms/properties.py (wmsProperties): First start for a
1536     properties dialog. It's functional for a first selection of
1537     layers, but still has some weired wxWidgets/GTK problems but
1538     beautification can be done later.
1539    
1540     * Extensions/wms/layer.py: Added more documentation
1541     (WMSLayer.getFormats): New: Return list of supported image formats
1542     by the WMS server
1543     (WMSLayer.getLayers): New: Return the list of layer names
1544     supported by the WMS server
1545     (WMSLayer.getLayerTitle): New: Return the title of the named layer
1546     (WMSLayer.getWMSFormat): New: Return the image format that is used
1547     for WMS GetMap requests
1548     (WMSLayer.setWMSFormat): New: Set the image format that is used
1549     for WMS GetMap requests
1550     (WMSLayer.__init__): Move away from using only one layer to using
1551     a list of layers (unsorted at the moment, though).
1552     (WMSLayer.getVisibleLayers): New: Return the list of names for all
1553     visible layers
1554     (WMSLayer.setVisibleLayers): New: Set the list of names for all
1555     visible layers
1556    
1557     * Extensions/wms/wms.py: Moved the WMS layer into layer.py in
1558     order to establish a clean structure.
1559    
1560     * Extensions/wms/layer.py: Moved the WMS layer into a file on its
1561     own in order to establish a clean structure.
1562    
1563 joey 2174 2004-04-13 Martin Schulze <[email protected]>
1564    
1565     * Extensions/wms/parser.py (WMSCapabilitiesParser.grok): Added
1566     support for oldstyle (WMS 1.0 apparently) image format
1567     specification.
1568    
1569     * Extensions/wms/wms.py (WMSLayer.calcFormat): Reduce the list of
1570     supported graphic formats back to JPEG and BMP, PNG and others are
1571     too *cough* experimental... Sorry, I meant to filter this out
1572     before I committed this part. This should make the WMS extension
1573     run from CVS again.
1574     (wms_dialog): Reset an empty URL to None so that the subsequent
1575     program can depend on this, since the dialog will indeed return an
1576     empty URL, causing another declaration of love by Python.
1577    
1578     * Extensions/wms/parser.py (WMSCapabilitiesParser.getLayerBBox):
1579     Whenever a native BoundingBox request cannot be fulfilled, check
1580     whether the requested SRS is EPSG:3426, in which case return the
1581     LatLonBoundingBox values.
1582    
1583     * Extensions/wms/test/test_parser.py
1584     (TestWMSCapabilitiesParser.test_LayerSRS): Added a test for
1585     ignoring AUTO:* SRS.
1586     (TestWMSCapabilitiesParser.test_LatLonBoundingBoxes_as_bboxes):
1587     Added another test method to test whether the LatLonBoundingBox
1588     values will be returned if BoundingBox values are requested with
1589     SRS set to EPSG:3426.
1590    
1591     * Extensions/wms/parser.py (WMSCapabilitiesParser.peekLayers):
1592     Added rudimentary support for non-EPSG SRS, i.e. ignore them for
1593     the moment by placing them into a variable which is currently
1594     unused. Also test whether the EPSG SRS is numerical as it should
1595     be and add an error message if it is not.
1596    
1597     * Extensions/wms/test/sample.xml: Added AUTO:* SRS since they
1598     appear in the real world as well. Since we cannot handle them yet
1599     (OGCLib can't either), we will ignore them for the moment.
1600    
1601     * Extensions/wms/parser.py: Use a variable for denoting the sample
1602     filename
1603     (WMSCapabilitiesParser.peekLayers): Added support for error
1604     messages during grok(). They will be aggregated in an array and
1605     may be displayed later. We may have to add a classification
1606     "Warning" and "Error" to this. That requires more experience,
1607     though, since not every error may be lethal.
1608    
1609     * Thuban/UI/mainwindow.py (MainWindow.LayerShowTable): Raise the
1610     ShowTable() dialog/frame when the user attempts to display it
1611     while it has been opened before already and not closed again.
1612    
1613 joey 2161 2004-04-11 Martin Schulze <[email protected]>
1614    
1615     * Extensions/wms/infodialog.py: Adjusted the class documentation
1616    
1617     * Extensions/wms/wms.py (WMSLayer.__init__, WMSLayer.GetMapImg):
1618     Switch to using Thuban{Begin,End}BusyCursor instead of the pure
1619     wxWidgets variants.
1620     (WMSLayer.__init__): The epsg_id variable is named top_srs now.
1621    
1622     * Extensions/wms/infodialog.py: Added an information dialog that
1623     will display various information about the WMS current resource,
1624     so that additional information such as the title, the abstract,
1625     fees and access constraints can be displayed for the user if they
1626     are documented in the WMS XML.
1627    
1628 joey 2156 2004-04-10 Martin Schulze <[email protected]>
1629    
1630     * Extensions/wms/parser.py (WMSCapabilitiesParser.grok): Adjusted
1631     string handling. It's "foo".lower() and not lower(foo) without
1632     lower imported from strings or something.
1633    
1634     * Extensions/wms/wms.py (WMSLayer): Incorporated WMSCapabilities
1635     from capabilities.py and parser.py. Implement priority list for
1636     supported graphics formats, take care of wbmp != bmp. PNG, TIFF
1637     and GIF are supported here, but not yet by main Thuban. Hence,
1638     support for them may be removed later. Special contribution to
1639     usability: get wxWidgets to change the cursor when we're waiting
1640     for data from the network so the user won't start to worry. This
1641     causes a redrawing error/warning, though.
1642    
1643     * Extensions/wms/parser.py (WMSCapabilitiesParser.grok): Unlink
1644     the DOM object.
1645    
1646     2004-04-01 Martin Schulze <[email protected]>
1647    
1648     * Extensions/wms/capabilities.py: Adjusted documentation
1649     (WMSCapabilities.__init__): Improved documentation, fixed syntax
1650     (WMSCapabilities.saveCapabilities): Only catch IOError when
1651     handling files
1652     (WMSCapabilities.loadCapabilities): Only catch IOError when
1653     handling files
1654     __main__: corrected variable naming
1655     (WMSCapabilities.fetchCapabilities,loadCapabilities): Make this
1656     class a specialisation of WMSCapabilitiesParser as well. Also
1657     execute grok() after loading or fetching capabilities, if that
1658     went well, so that subsequent calls can already access the data.
1659     (WMSCapabilities.getVersion): Export the used version of the
1660     GetCapabilities request, so we can use it for subsequent calls,
1661     i.e. for GetMap requests.
1662     (WMSCapabilities.fetchCapabilities): Added proper error handling
1663     when the GetCapabilities request failed, so that the surrounding
1664     program can act accordingly.
1665    
1666 joey 2146 2004-03-30 Martin Schulze <[email protected]>
1667    
1668     * Extensions/wms/parser.py (WMSCapabilitiesParser.getLayerSRS):
1669     Adjusted the getLayerSRS method to return the list of SRSes
1670     extracted from <SRS> elements instead of <BoundingBox> elements.
1671     Added a bit of documentation as well.
1672     (WMSCapabilitiesParser.checkLayerSRS): Removed integrity test
1673     since it was only implemented due to a misunderstanding.
1674    
1675     * Extensions/wms/test/test_parser.py
1676     (TestWMSCapabilitiesParser.test_LayerSRS): Adjust the tests to
1677     reflect the corrected interpretation of the standard: i.e. a layer
1678     does not have to define a BoundingBox for all SRSes it supports.
1679     Hence the <SRS></SRS> specification is authoritative, not the list
1680     of BoundingBoxes.
1681     (TestWMSCapabilitiesParser.test_BoundingBoxes): Added a new test
1682     to ensure None is returned for a non-existing SRS.
1683     (TestWMSCapabilitiesParser.test_grok): Removed test_grok method
1684     since it is not applicable anymore. Listing more SRSes in <SRS>
1685     elements is valid according to the specs.
1686    
1687 bernhard 2140 2004-03-26 Bernhard Reiter <[email protected]>
1688 joey 2146
1689 bernhard 2140 * README: Nicer formatting of text. Improved descriptions.
1690     Reflected wxWidgets name change.
1691    
1692     * Thuban/UI/about.py: Extended copyright to 2004 and added
1693     information about the thuban-devel mailinglist.
1694    
1695 joey 2138 2004-03-24 Martin Schulze <[email protected]>
1696 joey 2120
1697 joey 2138 * Extensions/wms/capabilities.py: Renamed the class to contain
1698     'WMS', also added a linebreak where required
1699    
1700     * Extensions/wms/parser.py: Finally added the XML parser for the
1701     GetCapabilities response.
1702    
1703     * Extensions/wms/test/sample.xml: Adjusted the sample file so that
1704     <SRS> elements match the <BoundingBox> elements, except for the
1705     layer 'beschriftung'.
1706    
1707     * Extensions/wms/test/test_parser.py: Encode non-ascii strings
1708     since Python uses unicode strings internally, otherwise
1709     comparisons will fail. Removed tests for getLayerBBoxSRS() since
1710     the SRS will be calculated anyway and this method is obsoleted by
1711     getLayerSRS(). Denote SRS as strings and not as cardinal numbers.
1712     Move loading the sample file into the setUp method. Added a test
1713     for finding the integrity problem in the sample response.
1714     Improved formatting.
1715    
1716     * Extensions/wms/domutils.py: Added convenience routines for
1717     handling of Document Object Model (DOM) nodes.
1718    
1719     * Extensions/wms/test/test_domutils.py: Added a test for the
1720     domutils module
1721    
1722     2004-03-19 Martin Schulze <[email protected]>
1723    
1724 joey 2120 * Extensions/wms/test/test_parser.py (TestWMSCapabilitiesParser):
1725     Moved path detection and adding into a module of its own,
1726     adjustpath, which exports thubandir as main Thuban directory.
1727    
1728     * Extensions/wms/test/test_ogclib.py (TestWMSLib): Moved path
1729     detection and adding into a module of its own, adjustpath, which
1730     exports thubandir as main Thuban directory. Reorganised the
1731     module in order to support the SkipTest feature for Thuban test
1732     cases.
1733    
1734     * Extensions/wms/test/adjustpath.py: Moved path detection and
1735     adding into a module of its own.
1736    
1737 joey 2115 2004-03-18 Martin Schulze <[email protected]>
1738    
1739     * Extensions/wms/test/test_parser.py: Added another test for
1740     checking whether the WMS XML parser (to be implemented) returns
1741     the information we expect. This requires a sample WMS WML file
1742     (sample.xml) which has been extracted from the frida server and
1743     "improved" manually.
1744    
1745     * Extensions/wms/test/test_ogclib.py: Added legacy code to add the
1746     main Thuban directory to the path in order to be able to import
1747     random modules. Adjusted the PyOGCLib detection to reuse the
1748     information gathered. Also added a note about the PYTHONPATH
1749     environment variable.
1750    
1751     * Extensions/wms/test/test_ogclib.py: The format specification is
1752     a mime-type, not a graphic format, hence image/jpeg wou ld be the
1753     proper format and not JPEG. We'll also have to take care of the
1754     encoding of / as %2F.
1755    
1756 joey 2111 2004-03-16 Martin Schulze <[email protected]>
1757    
1758     * Extensions/wms/test/test_ogclib.py: Added a (hopefully)
1759     comprehensive test for the getMapURL method, built compare URLs
1760     according to the documentation in OGC 01-068r3
1761    
1762     * Extensions/wms/capabilities.py (WMSCapabilities): Added the
1763     class WMSCapabilities to manage capabilites, will incorporate
1764     parsing the capabilities response and provide details for other
1765     classes.
1766    
1767 bh 2105 2004-03-12 Bernhard Herzog <[email protected]>
1768    
1769 bh 2107 Support views in addition to normal tables in the postgis
1770     shapestore
1771    
1772     * Thuban/Model/postgisdb.py
1773     (PostGISShapeStore._fetch_table_information): Add a fallback for
1774     the case where the table name is not in the geometry_columns
1775     table. This is usually the case for views. Also, set
1776     self.shapestore here.
1777     (PostGISShapeStore.ShapeType): No need to query the database all
1778     the time. The shape type is now determined in
1779     _fetch_table_information
1780    
1781     * test/postgissupport.py (PostgreSQLServer.new_postgis_db)
1782     (PostgreSQLServer.get_static_data_db, PostGISDatabase.__init__):
1783     New parameter to specify views.
1784     (PostGISDatabase.has_data): Also compare the views. New views
1785     parameter
1786     (PostGISDatabase.initdb): Create the views.
1787     (PostgreSQLServer.get_default_static_data_db): Add the v_landmarks
1788     view
1789    
1790     * test/test_postgis_db.py
1791     (TestPostGISShapestorePointFromViews): New. Test a
1792     PostGISShapeStore with a view
1793     (TestPostGISShapestorePointOIDAsGIDColumn.setUp): Pass the name of
1794     the geometry_column explicitly to test whether that works
1795    
1796     2004-03-12 Bernhard Herzog <[email protected]>
1797    
1798 bh 2105 Final step for explicit id/geometry columns: Loading and saving
1799    
1800     * Resources/XML/thuban-1.1.dtd: New. Derived from thuban-1.0.dtd
1801     with the following changes:
1802     (dbshapesource): Two new attributes id_column and geometry_column
1803    
1804     * Thuban/Model/save.py (SessionSaver.write): Use the new dtd
1805     (SessionSaver.write_session): Use the new namespace
1806     (SessionSaver.write_data_containers): Write the new dbshapesource
1807     parameters
1808    
1809     * Thuban/Model/load.py (SessionLoader.__init__): New namespace for
1810     the new file format version
1811     (SessionLoader.start_dbshapesource): Handle the new db parameters
1812    
1813     * test/test_save.py: Update to the new dtd and namespace
1814     (SaveSessionTest.test_save_postgis): Update the NonConnectionStore
1815     mock object to provide a working IDColumn method.
1816    
1817     * test/test_load_1_0.py: New. Copy of the test_load.py before
1818     today's changes but with the round-trip tests removed.
1819    
1820     * test/test_load_0_9.py: Update doc-string.
1821    
1822     * test/test_load.py: Update all .thuban files to the new dtd and
1823     namespace.
1824     (TestPostGISLayer.file_contents): Add the new dbshapesource
1825     paramters
1826    
1827 bh 2100 2004-03-11 Bernhard Herzog <[email protected]>
1828    
1829 bh 2103 Next step for explicit id/geometry columns: User interaction
1830    
1831     * Thuban/UI/dbdialog.py (ChooseDBTableDialog.__init__): Rework how
1832     the dialog is constructed. Add combo boxes to select id and
1833     geometry column. Rename some instance variables.
1834     (ChooseDBTableDialog.GetTable): Return id and geometry column
1835     names
1836     (ChooseDBTableDialog.OnTableSelect): New. Event handler for
1837     selections in the table list
1838    
1839     * Thuban/UI/mainwindow.py (MainWindow.AddDBLayer): Use id_column
1840     and geometry_column
1841    
1842     * Thuban/Model/session.py (Session.OpenDBShapeStore): Add the new
1843     parameters for id_column and geometry column of PostGISShapeStore
1844     here as well.
1845    
1846     * Thuban/Model/postgisdb.py (type_map): Add ROWID psycog type.
1847     (_raw_type_map): New. Map raw PostgreSQL type ints to thuban types
1848     (PostGISConnection.GeometryTables): Use a better query to
1849     determine which relations in the database might be usable for
1850     shapestores. Now supports views as well but is more PostgreSQL
1851     specific
1852     (PostGISConnection.table_columns): New. Somewhat experimental
1853     method to let the db dialogs provide lists of columns to users so
1854     that they can select id and geometry columns.
1855     (PostGISTable.__init__): The default value of the id_column
1856     parameter is now None it still means "gid" effectively, though.
1857     (PostGISTable.IDColumn): New introspection method to return a
1858     column object for the id column
1859     (PostGISShapeStore.GeometryColumn): New introspection method to
1860     return a column object for the geometry column
1861    
1862     * test/test_postgis_db.py
1863     (TestPostGISConnection.test_gis_tables_non_empty):
1864     Removed. Subsumed by the new:
1865     (TestPostGISConnection.test_gis_tables_with_views_and_tables):
1866     New. Tes the GeometryTables and table_columns methods with actual
1867     tables and views.
1868     (PointTests.test_id_column, PointTests.test_geometry_column):
1869     New. tests for the new methods.
1870     (TestPostGISShapestorePoint.setUp)
1871     (TestPostGISShapestorePointSRID.setUp)
1872     (TestPostGISShapestorePointExplicitGIDColumn.setUp): Fill the
1873     instance variables needed by the new tests
1874    
1875     2004-03-11 Bernhard Herzog <[email protected]>
1876    
1877 bh 2100 * Thuban/UI/classgen.py (GenQuantilesPanel.GetList): The row
1878     numbers given to ReadValue are ordinals.
1879    
1880     2004-03-11 Bernhard Herzog <[email protected]>
1881    
1882     Elimiate the requirement for PostGIS tables to have a column
1883     called "gid".
1884    
1885     * Thuban/Model/postgisdb.py (PostGISTable.__init__): New parameter
1886     id_column to specify which column to use to identify rows. Also
1887     new instance variables id_column and quoted_id_column
1888     (PostGISTable.RowIdToOrdinal, PostGISTable.RowOrdinalToId)
1889     (PostGISTable.ReadRowAsDict, PostGISTable.ReadValue)
1890     (PostGISTable.SimpleQuery): Use the id column name provided to the
1891     constructor instead of "gid"
1892     (PostGISShapeStore.__init__): New parameter id_column analogously
1893     to PostGISTable.__init__. This parameter is simply passed through
1894     to the base class constructor
1895     (PostGISShapeStore._create_col_from_description): Fix typo in
1896     doc-string
1897     (PostGISShapeStore.Shape, PostGISShapeStore.AllShapes)
1898     (PostGISShapeStore.ShapesInRegion): Use the id column name
1899     provided to the constructor instead of "gid"
1900    
1901     * test/postgissupport.py
1902     (PostgreSQLServer.get_default_static_data_db): New static table
1903     landmarks_point_id with an id column != "gid. Update the comments
1904     a bit.
1905     (skip_if_addgeometrycolumn_does_not_use_quote_ident): Fix typo in
1906     doc-
1907     (upload_shapefile): New parameter gid_column to use a name other
1908     than "gid" for the column to store the shape ids
1909    
1910     * test/test_postgis_db.py (TableTests): New. Mixin-class
1911     containing all tests previously in TestPostGISTable. The actual
1912     tests are the same but the code is a bit more configurable to
1913     allow for different id columns etc.
1914     (TestPostGISTable): Derive from TableTests now for the actual
1915     tests.
1916     (TestPostGISTableExplicitGIDColumn): New. Like TestPostGISTable
1917     except that it the landmarks_point_id table to test the id_column
1918     parameter
1919     (PointTests): Extend the doc-string
1920     (TestPostGISShapestorePointExplicitGIDColumn)
1921     (TestPostGISShapestorePointOIDAsGIDColumn): New classes derived
1922     from PointTests to test the explicit id_column parameter. One
1923     tests with the name of the column holding the shape ids, the other
1924     uses PostgreSQL's OID column. For the latter a number of methods
1925     have to be overwritten to make them independent of the actual id
1926     values.
1927    
1928 silke 2095 2004-03-08 Silke Reimer <[email protected]>
1929    
1930     Update debian directory:
1931    
1932     * debian/changelog: Added new version.
1933     * deiban/rules: Updated management of patches (with cbds)
1934     * debian/control: Added cbds to dependencies
1935     * debian/patches/*: New. Adds better support for patches of thuban in
1936     debian
1937     * debian/menu: Syntax of menu changed slightly
1938     * debian/setup.py.patch: removed because it has been moved to
1939     debian/patechs/setup.py.patch
1940    
1941    
1942 bh 2094 2004-02-26 Bernhard Herzog <[email protected]>
1943    
1944     Create the Doc/technotes directory for text files with information
1945     for developers
1946    
1947     * Doc/technotes/README: New. README for the technotes
1948    
1949     * Doc/technotes/coding_guidelines.txt: New. Coding guidelines for
1950     Thuban
1951    
1952     * Doc/technotes/release_process.txt: New. Used to be
1953     HOWTO-Release. Now slightly adapted to technote formatting style.
1954    
1955     * HOWTO-Release: Removed. It's contents are now in
1956     Doc/technotes/release_process.txt
1957    
1958 bh 2089 2004-02-25 Bernhard Herzog <[email protected]>
1959    
1960     * libraries/thuban/wxproj.cpp (get_wx_version): New. Return the
1961     version of wxWindows the module was compiled with so we can check
1962     that against the wxPython version.
1963    
1964     * Thuban/version.py (thuban_branch, thuban_release): New variables
1965     controlling which and how Thuban versions are shown. See the
1966     comments for details.
1967     (verify_versions): Also check that the wx version that wxproj is
1968     compiled against matches that of the wxPython we use at runtime
1969    
1970 bh 2080 2004-02-20 Bernhard Herzog <[email protected]>
1971    
1972 bh 2087 * Extensions/wms/wms.py (epsg_code_to_projection): Use
1973     get_system_proj_file to read the epsg projections. The old way
1974     depended on the current directory being the top Thuban directory.
1975    
1976     2004-02-20 Bernhard Herzog <[email protected]>
1977    
1978 bh 2085 * Extensions/svgexport/test/test_svgmapwriter.py
1979     (TestVirtualDC.test_clippath): Remove a debug print
1980    
1981     2004-02-20 Bernhard Herzog <[email protected]>
1982    
1983 bh 2083 * Extensions/svgexport/__init__.py: New. Turn
1984     Extensions/svgexport into a package.
1985    
1986     * Extensions/svgexport/svgmapwriter.py: Reorder the imports and
1987     doc-string a bit. The doc-string must come first, otherwise it's
1988     not a doc-string. The __future__ import must be the first thing
1989     after the doc-string. Use only double quotes in doc-strings.
1990     Single quotes trip up emacs syntax highlighting if the text
1991     contains apostrophes.
1992    
1993     2004-02-20 Bernhard Herzog <[email protected]>
1994    
1995 bh 2080 * Extensions/svgexport/test/__init__.py,
1996     Extensions/svgexport/test/test_svgmapwriter.py: New. Initial test
1997     suite for svgexport
1998    
1999     * test/runtests.py (find_test_modules): New. Function with the
2000     module finding code from main.
2001     (main): Use find_test_modules to figure out the default test
2002     modules and take modules from Extensions.svgexport.test too.
2003    
2004 bh 2075 2004-02-19 Bernhard Herzog <[email protected]>
2005    
2006 bh 2077 * Thuban/UI/application.py (ThubanApplication.OnInit): Make sure
2007     the mainwindow has a reference to the map of the initial session.
2008     This fixes a bug introduced with the fix for RT#2245
2009    
2010     2004-02-19 Bernhard Herzog <[email protected]>
2011    
2012 bh 2075 * Extensions/svgexport/svgsaver.py,
2013     Extensions/svgexport/svgmapwriter.py,
2014     Extensions/svgexport/maplegend.py: Added again. This time in the
2015     correct place.
2016    
2017 bh 2070 2004-02-17 Bernhard Herzog <[email protected]>
2018    
2019 bh 2073 Fix for RT#2245
2020    
2021     * Thuban/UI/application.py (ThubanApplication.OnInit): Initialize
2022     instance variables before trying to create any windows. Creating
2023     windows can start an event loop if e.g. message boxes are popped
2024     up for some reason, and event handlers, especially EVT_UPDATE_UI
2025     may want to access things from the application.
2026     (ThubanApplication.maps_changed): The mainwindow may not have been
2027     created yet, so check whether it has been created before calling
2028     its methods
2029    
2030     * Thuban/UI/view.py (MapCanvas.OnIdle): Only try to redraw if we
2031     have a map
2032    
2033     2004-02-17 Bernhard Herzog <[email protected]>
2034    
2035 bh 2070 * test/test_svgmapwriter.py, Extensions/svgsaver.py,
2036     Extensions/svgmapwriter.py, Extensions/maplegend.py,
2037     extensions/svgexport/svgsaver.py,
2038     extensions/svgexport/svgmapwriter.py,
2039     extensions/svgexport/maplegend.py: Removed. These files were in
2040     the wrong places or didn't work at all.
2041    
2042 bh 2067 2004-02-16 Bernhard Herzog <[email protected]>
2043    
2044 bh 2069 * Thuban/UI/view.py (MapCanvas.Export): Remove accidentally added
2045     line
2046    
2047     2004-02-16 Bernhard Herzog <[email protected]>
2048    
2049 bh 2067 * Thuban/UI/view.py (MapCanvas.Export): Avoid UnboundLocalError.
2050    
2051 mrechtie 2064 2004-02-15 Markus Rechtien <[email protected]>
2052    
2053     * Extensions/svgexport/svgmapwriter.py: New. Adds the capability
2054     to write a session to a file in SVG format.
2055     * Extensions/svgexport/svgsaver.py: New. Uses svgmapwriter.py
2056     to write a SVG map of a session.
2057     * Extensions/svgexport/maplegend: New. Writes a basic maplegend
2058     in SVG format for the current session.
2059    
2060 bh 2062 2004-02-13 Bernhard Herzog <[email protected]>
2061    
2062     * Thuban/UI/mainwindow.py (MainWindow.AddDBLayer): When the layer
2063     can't be created, return immediately after displaying the error
2064     message.
2065    
2066 bh 2060 2004-02-11 Bernhard Herzog <[email protected]>
2067    
2068     Handle postgis tables with more than one geometry column.
2069    
2070     * Thuban/Model/postgisdb.py
2071     (PostGISTable._fetch_table_information): Delegate the creation of
2072     column objects to a different method so that we can extend that in
2073     derived classes
2074     (PostGISTable._create_col_from_description): New. Column object
2075     creation part of _fetch_table_information
2076     (PostGISShapeStore._create_col_from_description): New. Extend
2077     inherited method to handle geometry columns
2078     (PostGISShapeStore.__init__): New parameter geometry_column to
2079     specify which geometry column to use. Optional but mandatory for
2080     tables with more than one geometry column
2081     (PostGISShapeStore._fetch_table_information): Also use the name of
2082     the geometry column when looking for the srid
2083     (PostGISShapeStore.ShapeType): Also use the name of the geometry
2084     column when looking for the shape type
2085    
2086     * test/test_save.py (SaveSessionTest.test_save_postgis): Adapt
2087     NonConnectionStore to changes in the PostGISShapeStore
2088    
2089     * test/test_postgis_db.py
2090     (TestPostGISSpecialCases.test_shapestore_two_geom_cols): Test
2091     PostGISShapeStore with tables having two geometry columns.
2092    
2093 bh 2058 2004-02-10 Bernhard Herzog <[email protected]>
2094    
2095     Fix some postgis problems. What remains to be done is real
2096     handling of SRIDs as they affect how reprojection is done
2097    
2098     * Thuban/Model/postgisdb.py (quote_identifier): Fix typo in
2099     doc-string
2100     (PostGISShapeStore._fetch_table_information): New. Extend
2101     inherited method to retrieve srid
2102     (PostGISShapeStore.BoundingBox): Handle tables without data.
2103     extent yields NULL for those
2104     (PostGISShapeStore.ShapesInRegion): Use the srid of the table.
2105    
2106     * test/test_postgis_db.py
2107     (TestPostGISSpecialCases.test_shapestore_empty_table): New test
2108     for the special case of a table without any data
2109     (TestPostGISShapestorePointSRID): New class with tests for a table
2110     that uses srids
2111     (PolygonTests): Fix a doc-string typo
2112    
2113     * test/postgissupport.py (PostGISDatabase.__init__): New parameter
2114     reference_systems with a specification of spacial reference
2115     systems to create in the new db.
2116     (PostgreSQLServer.new_postgis_db)
2117     (PostgreSQLServer.get_static_data_db): New parameter
2118     reference_systems to be passed through ultimately to
2119     PostGISDatabase. In new_postgis_db also check whether an existing
2120     db already has the right srids
2121     (PostgreSQLServer.get_default_static_data_db): Add srids and a
2122     table that uses srids
2123     (PostGISDatabase.initdb): Create the entries for the reference
2124     systems
2125     (PostGISDatabase.has_data): Add reference_systems parameter to
2126     check for those too
2127     (upload_shapefile): New parameter srid to create tables with a
2128     specific srid
2129    
2130 frank 2055 2004-02-06 Frank Koormann <[email protected]>
2131    
2132     * po/pt_BR.po: Fixed charset
2133    
2134 frank 2054 2004-02-05 Frank Koormann <[email protected]>
2135    
2136     * po/pt_BR.po: Fixed format string for error message, missing %s
2137     added (Thuban/UI/application.py:273)
2138    
2139 frank 2053 2004-02-03 Frank Koormann <[email protected]>
2140    
2141     First version of Portuguese (Brazilian) translation
2142    
2143     * po/pt_BR.po: New, translation of pot (2004-01-15 16:07+0300) for
2144     Brazilian Portuguese by Eduardo Patto Kanegae.
2145    
2146     * Thuban/UI/about.py (About.__init.py__): Added Eduardo to the list of
2147     translators.
2148    
2149    
2150 frank 2052 2004-01-22 Frank Koormann <[email protected]>
2151    
2152     * Doc/manual/thuban-manual.xml: Added section on installation of
2153     Thuban under Win32 systems. Fixed image path references in the postgis
2154     section. Some minor source formattings.
2155    
2156 frank 2051 2004-01-21 Frank Koormann <[email protected]>
2157    
2158     Make Thuban remember path selections (at least for one application run).
2159    
2160     * Thuban/UI/application.py (Application.OnInit): Initialize path as a
2161     attribute of application object. Path is a dictionary of
2162     strings, currently with the items "data" and "projection".
2163     (Application.SetPath): New, stores path for the specified item.
2164     (Application.Path): New, return path for the specified item.
2165    
2166     * Thuban/UI/mainwindow.py
2167     (MainWindow.OpenSession, MainWindow.SaveSessionAs,
2168     MainWindow.AddLayer, MainWindow.AddRasterLayer,
2169     MainWindow.TableOpen): Access "data" path information of the
2170     application.
2171    
2172     * Thuban/UI/projdialog.py (ProjFrame._OnImport, ProjFrame._OnExport):
2173     Access "projection" path information of the application.
2174    
2175 bh 2048 2004-01-05 Bernhard Herzog <[email protected]>
2176    
2177 bh 2050 * po/ru.po: Updated translations from Alex Shevlakov
2178    
2179     2004-01-05 Bernhard Herzog <[email protected]>
2180    
2181 bh 2048 * po/Makefile, po/README: Move the description of how to generate
2182     the translation statistics to the README.
2183    
2184 bh 2042 2003-12-23 Bernhard Herzog <[email protected]>
2185    
2186 bh 2045 * NEWS: Update for 1.0.0
2187    
2188     * po/it.po: Another update from Maurizio Napolitano
2189    
2190     2003-12-23 Bernhard Herzog <[email protected]>
2191    
2192 bh 2042 * po/it.po: Updated translation from Maurizio Napolitano
2193    
2194     2003-12-23 Bernhard Herzog <[email protected]>
2195    
2196     * Thuban/UI/join.py (JoinDialog.__init__): Mark one more string
2197     for translation
2198    
2199     * Thuban/UI/mainwindow.py (MainWindow.TableRename)
2200     (MainWindow.RenameMap, MainWindow.RenameLayer): Mark some more
2201     strings for translation
2202    
2203     * po/de.po: Update with the newly marked strings.
2204    
2205 bh 2033 2003-12-22 Bernhard Herzog <[email protected]>
2206    
2207 bh 2039 * HOWTO-Release: Fix the places where version numbers have to be
2208     updated
2209    
2210     2003-12-22 Bernhard Herzog <[email protected]>
2211    
2212 bh 2037 * setup.py (setup call): 1.0.0, yeah!
2213    
2214     * Thuban/version.py (longversion): 1.0.0, yeah!
2215    
2216     * Thuban/Model/load.py (SessionLoader.__init__): Accept the
2217     1.0.0 namespace too
2218    
2219     * Thuban/Model/save.py (SessionSaver.write_session): Save with
2220     1.0.0 namespace
2221    
2222     * test/test_load.py (LoadSessionTest.dtd)
2223     (TestSingleLayer.file_contents)
2224     (TestNonAsciiColumnName.file_contents)
2225     (TestLayerVisibility.file_contents)
2226     (TestClassification.file_contents, TestLabels.file_contents)
2227     (TestLayerProjection.file_contents)
2228     (TestRasterLayer.file_contents, TestJoinedTable.file_contents)
2229     (TestLabelLayer.file_contents, TestPostGISLayer.file_contents)
2230     (TestPostGISLayerPassword.file_contents)
2231     (TestLoadError.file_contents, TestLoadError.test): Update for
2232     1.0.0 namespace
2233    
2234     * test/test_save.py (SaveSessionTest.dtd)
2235     (SaveSessionTest.testEmptySession)
2236     (SaveSessionTest.testSingleLayer)
2237     (SaveSessionTest.testLayerProjection)
2238     (SaveSessionTest.testRasterLayer)
2239     (SaveSessionTest.testClassifiedLayer)
2240     (SaveSessionTest.test_dbf_table)
2241     (SaveSessionTest.test_joined_table)
2242     (SaveSessionTest.test_save_postgis): Update for 1.0.0 namespace
2243    
2244     2003-12-22 Bernhard Herzog <[email protected]>
2245    
2246 bh 2035 * Thuban/Model/load.py (SessionLoader.start_label): Make sure the
2247     alignment flags are byte strings not unicode and that they have
2248     valid values
2249    
2250     * test/test_load.py (TestLabelLayer): New. Test loading (and
2251     indirectly saving) of maps with labels.
2252    
2253     2003-12-22 Bernhard Herzog <[email protected]>
2254    
2255 bh 2033 * Thuban/UI/tableview.py (TableGrid.OnDestroy)
2256     (TableGrid.__init__): Handle EVT_WINDOW_DESTROY in the grid to
2257     unsubscribe all subscribers.
2258     (LayerTableFrame.OnDestroy): Do not unsubscribe any messages from
2259     self.grid since it may already have been destroyed.
2260     Fixes RT #2256
2261    
2262 bh 2031 2003-12-19 Bernhard Herzog <[email protected]>
2263    
2264     * po/fr.po, po/es.po: Updated translations from Daniel Calvelo
2265    
2266 bh 2028 2003-12-16 Bernhard Herzog <[email protected]>
2267 silke 2029
2268     * debian/bitmappath.patch, debian/setup.py.patch:
2269     added to ensure compliance with FHS for debian
2270     * debian/rules, debian/changelog:
2271     added patches in rules to ensure compliance with FHS for debian
2272 bh 2028
2273 silke 2029 2003-12-16 Bernhard Herzog <[email protected]>
2274    
2275 bh 2028 * po/Makefile (mo): Make the output a bit nicer so that it prints
2276     statistics about the translations. Add a comment how produce even
2277     nicer statistics with sed.
2278    
2279 frank 2026 2003-12-09 Frank Koormann <[email protected]>
2280    
2281     * Resources/Projections/defaults.proj:
2282     French projection sample with correct accents (UNICODE).
2283    
2284 bh 2025 2003-12-05 Bernhard Herzog <[email protected]>
2285    
2286     * MANIFEST.in: Add the devtools directory
2287    
2288     * setup.py (setup call): Use license instead of licence. This
2289     silences a deprecation warning on Python 2.3
2290    
2291 frank 2022 2003-12-05 Frank Koormann <[email protected]>
2292    
2293 frank 2023 Documentation synced with 1.0rc1
2294    
2295     * Doc/manual/thuban-manual.xml:
2296     Minor formatting changes and references to database layers .
2297     Introduction.Internationalization: New section on i18n.
2298     MapManagement.AddingandRemovingLayers: Added item on database layers.
2299     MapManagement.TheLegend: Added section and screenshot on popup menu.
2300     ProjectionManagement: Updated screenshot and sentence on EPSG.
2301     Appendix.SupportedDataSources: Added PostGIS.
2302     Appendix.WorkingwithPostGIS: New section.
2303    
2304     * Doc/manual/images/6_projection.png: Updated screenshot including
2305     EPSG checkboxes.
2306    
2307     * Doc/manual/images/3_5_popup_menu.png: New, popup menu screenshot.
2308    
2309     * Doc/manual/images/app_postgis_add_layer.png,
2310     Doc/manual/images/app_postgis_db_add.png,
2311     Doc/manual/images/app_postgis_db_management.png:
2312     New screenshots focussing on database layers
2313    
2314     2003-12-05 Frank Koormann <[email protected]>
2315    
2316 frank 2022 * Thuban/UI/projdialog.py (load_user_proj): If user.proj is missing
2317     write warning to stderr instead of rising a warning dialog
2318    
2319 bh 2016 2003-12-03 Bernhard Herzog <[email protected]>
2320    
2321 bh 2021 Fix for RT #2243
2322    
2323 bh 2020 * Thuban/UI/mainwindow.py (MainWindow.has_selected_shape_layer):
2324     New. Like has_selected_layer but for shape layers only
2325     (_has_selected_shape_layer): New. Like _has_selected_layer but for
2326     shape layers only
2327     (layer_show_table command, layer_jointable command): Use these
2328     commands should only be available for shape layers
2329    
2330     2003-12-03 Bernhard Herzog <[email protected]>
2331    
2332 bh 2018 * Thuban/UI/mainwindow.py (MainWindow.Unsubscribe): Deal with
2333     publishers that are wx objects and may have been destroyed by wx
2334     already. Fixes RT #2242.
2335    
2336     2003-12-03 Bernhard Herzog <[email protected]>
2337    
2338 bh 2016 * po/ru.po: Updates from Alex Shevlakov
2339    
2340 silke 2013 2003-12-03 Silke Reimer <silkeintevation.de>
2341    
2342     * debian/control, debian/changelog: Added gdal-support to
2343     debian package, updated to new thuban version
2344    
2345    
2346 bh 2012 2003-12-03 Bernhard Herzog <[email protected]>
2347    
2348     * Thuban/Lib/version.py: New. Module for version number
2349     manipulations. The version of make_tuple here also deals better
2350     with more unusual version number strings, such as e.g.
2351     "1.2+cvs20031111"
2352    
2353     * Thuban/version.py (make_tuple): Removed. It's now in
2354     Thuban.Lib.version. Use that implementation instead.
2355    
2356     * test/test_lib_version.py: New. Tests for Thuban/Lib/version.py
2357    
2358 bh 2005 2003-12-02 Bernhard Herzog <[email protected]>
2359    
2360 bh 2010 * MANIFEST.in: Add debian files
2361    
2362 bh 2008 * setup.py (setup call): Add packages for the Extensions so that
2363     they're installed too
2364     (data_files): Add READMEs and sample data from some Extensions
2365    
2366     * NEWS: Add note about the extensions in binary packages
2367    
2368     2003-12-02 Bernhard Herzog <[email protected]>
2369    
2370 bh 2005 * Thuban/Model/save.py (SessionSaver.write_session): Save files
2371     with the thuban-1.0rc1
2372    
2373     * Thuban/Model/load.py (SessionLoader.__init__): Recognize the
2374     thuban-1.0rc1 namespace too
2375    
2376     * test/test_save.py (SaveSessionTest.dtd)
2377     (SaveSessionTest.testEmptySession)
2378     (SaveSessionTest.testSingleLayer)
2379     (SaveSessionTest.testLayerProjection)
2380     (SaveSessionTest.testRasterLayer)
2381     (SaveSessionTest.testClassifiedLayer)
2382     (SaveSessionTest.test_dbf_table)
2383     (SaveSessionTest.test_joined_table)
2384     (SaveSessionTest.test_save_postgis): Update to thuban-1.0rc1
2385     namespace
2386    
2387     * test/test_load.py (LoadSessionTest.dtd): Update to thuban-1.0rc1
2388     namespace
2389     (TestSingleLayer.file_contents)
2390     (TestNonAsciiColumnName.file_contents)
2391     (TestLayerVisibility.file_contents)
2392     (TestClassification.file_contents, TestLabels.file_contents)
2393     (TestLayerProjection.file_contents)
2394     (TestRasterLayer.file_contents, TestJoinedTable.file_contents)
2395     (TestPostGISLayer.file_contents)
2396     (TestPostGISLayerPassword.file_contents)
2397     (TestLoadError.file_contents, TestLoadError.test): Update to
2398     thuban-1.0rc1 namespace
2399    
2400 bh 1996 2003-12-01 Bernhard Herzog <[email protected]>
2401    
2402 bh 2003 * setup.py (proj4_prefix, wx_prefix, gdal_prefix): Fix these for
2403     nt to better match Intevation's current w32 setup
2404    
2405 bh 2001 * HOWTO-Release: Add note about updating MANIFEST.in
2406    
2407     * MANIFEST.in: Add the Extensions
2408    
2409 bh 1998 * NEWS: Update for 1.0rc1
2410    
2411     2003-12-01 Bernhard Herzog <[email protected]>
2412    
2413 bh 1996 * Thuban/UI/mainwindow.py (MainWindow.AddLayer): Change the wild
2414     cards for the dialog so that shapefiles ending in all uppercase
2415     SHP are listed too
2416    
2417 bh 1988 2003-11-28 Bernhard Herzog <[email protected]>
2418    
2419 bh 1996 * Thuban/version.py (longversion): Update to 1.0rc1
2420    
2421     * setup.py (setup call): Update version to 1.0rc1. Use the
2422     [email protected] email address as author email instead of my
2423     personal one.
2424    
2425     2003-11-28 Bernhard Herzog <[email protected]>
2426    
2427 bh 1992 * po/de.po: Update german translation.
2428    
2429     2003-11-28 Bernhard Herzog <[email protected]>
2430    
2431 bh 1990 Unify the filenames stored in .thuban files so that the .thuban
2432     files are more platform independend
2433    
2434     * Thuban/Model/save.py (unify_filename): New. Unify filenames so
2435     that they can be used on both windows and unix
2436     (SessionSaver.prepare_filename): New. Handle all filename
2437     transformations for filenames stored in the thuban file
2438     (SessionSaver.write_data_containers, SessionSaver.write_layer):
2439     Use prepare_filename
2440    
2441     * test/test_save.py (SaveSessionTest.testSingleLayer)
2442     (SaveSessionTest.testLayerProjection)
2443     (SaveSessionTest.testRasterLayer)
2444     (SaveSessionTest.testClassifiedLayer)
2445     (SaveSessionTest.test_dbf_table)
2446     (SaveSessionTest.test_joined_table): Filenames are always stored
2447     with slashes on all currently supported platforms so adapt all
2448     tests to this
2449    
2450     * test/test_load.py (LoadSessionTest.filenames): With the new
2451     filename scheme the filenames in the tests should be
2452     understandable on all currently supported platforms so we turn
2453     this into an empty list because we don't have to normalize them
2454     anymore
2455    
2456     2003-11-28 Bernhard Herzog <[email protected]>
2457    
2458 bh 1988 * test/test_layer.py (TestLayer.test_arc_layer_with_projection):
2459     Add the ellipsoid to the projection since some Proj versions
2460     complain if it's missing.
2461    
2462 bh 1984 2003-11-27 Bernhard Herzog <[email protected]>
2463    
2464     Corect some bounding box projection problems
2465    
2466     * Thuban/Model/proj.py (Projection.InverseBBox): New. Inverse
2467     version of ForwardBBox
2468     (Projection._transform_bbox): New. common implementation of
2469     ForwardBBox and InverseBBox
2470     (Projection.ForwardBBox): Use _transform_bbox.
2471    
2472     * test/test_proj.py (TestProjection.test): Add test for
2473     InverseBBox
2474    
2475     * Thuban/Model/layer.py (Layer.LatLongBoundingBox)
2476     (Layer.ShapesBoundingBox, RasterLayer.LatLongBoundingBox): Use the
2477     new InverseBBox method to determine the unprojected bounding box
2478     (Layer.ShapesInRegion): Use the ForwardBBox method to project the
2479     bbox.
2480    
2481     * test/test_layer.py (TestLayer.test_point_layer_with_projection):
2482     Removed.
2483     (TestLayer.test_arc_layer_with_projection): New. This test is
2484     better able to test whether bounding boxes are projected correctly
2485     than test_point_layer_with_projection
2486    
2487 bh 1986 * Thuban/UI/viewport.py (ViewPort.map_projection_changed): Use
2488     InverseBBox to unproject bboxes
2489    
2490 bh 1975 2003-11-25 Bernhard Herzog <[email protected]>
2491    
2492 bh 1981 * Thuban/UI/about.py (About.__init__): Make sure we have ASCII
2493     source code.
2494    
2495     2003-11-25 Bernhard Herzog <[email protected]>
2496    
2497 bh 1979 * Thuban/Model/layer.py (Layer.__getattr__): Removed. It was only
2498     there for backwards compatibility and all code relying on that
2499     should have been updated by now.
2500    
2501     2003-11-25 Bernhard Herzog <[email protected]>
2502    
2503 bh 1977 * test/test_load.py (TestClassification.test): Add the missing
2504     round trip test.
2505     (TestClassification.file_contents): Update to the newest file
2506     format
2507    
2508     2003-11-25 Bernhard Herzog <[email protected]>
2509    
2510 bh 1975 Add very experimental (and possibly dangerous) extension to draw
2511     polygons:
2512    
2513     * Extensions/drawshape/README: New. Brief installation
2514     instructions
2515    
2516     * Extensions/drawshape/drawshape.py: New. Implementation of the
2517     drawshape extensions
2518    
2519     * Extensions/drawshape/patch.diff: Patch to apply before the
2520     extension can be used.
2521    
2522 bh 1971 2003-11-24 Bernhard Herzog <[email protected]>
2523    
2524 bh 1973 * Thuban/Model/data.py (ShapefileStore._open_shapefile)
2525     (ShapefileStore.__init__): Factor opening the shapefile into a
2526     separate method (the new _open_shapefile). This makes the code a
2527     bit more readable but the real reason is that it makes some evil
2528     hacks easier. :-)
2529    
2530     2003-11-24 Bernhard Herzog <[email protected]>
2531    
2532 bh 1971 * Thuban/Model/load.py (SessionLoader.check_attrs): If no
2533     converter is specified for an attribute assume it's a string
2534     containing only Latin1 characters. Update doc-string accordingly.
2535     This change should fix many places where unicode objects might
2536     accidentally enter Thuban.
2537    
2538     * test/test_load.py (TestNonAsciiColumnName): New test to check
2539     what happens with column names in DBF files that contain non-ascii
2540     characters
2541    
2542 bh 1969 2003-11-21 Bernhard Herzog <[email protected]>
2543    
2544     Enable the experimental attribute editing again and introduce a
2545     command line switch to actually activate it
2546    
2547     * Thuban/UI/main.py (options): New. Container for options set on
2548     the commmand line
2549     (main): Add the --enable-attribute-editing flag.
2550    
2551     * Thuban/UI/identifyview.py (IdentifyView.__init__): If attribute
2552     editing is enabled use the grid ctrl which allows editing of the
2553     values
2554    
2555     * Thuban/Model/transientdb.py (AutoTransientTable.write_record):
2556     New. Just delegate this to the underlying table.
2557    
2558 bh 1967 2003-11-20 Bernhard Herzog <[email protected]>
2559    
2560     * test/test_proj.py (ProjFileReadTests.test_read_unreadable_file):
2561     Skip this test if run under non-posix systems since it only works
2562     there
2563    
2564 bh 1960 2003-11-19 Bernhard Herzog <[email protected]>
2565    
2566 bh 1965 * Thuban/Model/resource.py: Rework the way gdal support is
2567     determined so that we can give a reason in the about why gdal is
2568     not supported.
2569     (gdal_support_status): New. Variable holding a string with the
2570     reason for no gdal support
2571    
2572     * Thuban/UI/about.py (About.__init__): Add the reason why gdal is
2573     not supported to the message
2574    
2575     2003-11-19 Bernhard Herzog <[email protected]>
2576    
2577 bh 1963 Remove the old table interface and its test cases
2578    
2579     * Thuban/Model/table.py (OldTableInterfaceMixin): Removed.
2580     (DBFTable, MemoryTable): Do not derive from OldTableInterfaceMixin
2581     anymore
2582    
2583     * Thuban/Model/transientdb.py (TransientTableBase)
2584     (AutoTransientTable): Do not derive from OldTableInterfaceMixin
2585     anymore
2586    
2587     * test/test_table.py: Removed since the old interface it tests is
2588     gone.
2589    
2590     * test/runtests.py (main): The old table interface is gone and
2591     with it the deprecation warnings so remove the code that turns
2592     these warnings into errors
2593    
2594     2003-11-19 Bernhard Herzog <[email protected]>
2595    
2596 bh 1960 * test/test_table.py: Revert to revision 1.5 again. Changing the
2597     tests to use the new table interface is completely wrong since the
2598     whole purpose of the tests in this module is to test the old
2599     interface.
2600    
2601 bh 1954 2003-11-18 Bernhard Herzog <[email protected]>
2602    
2603 bh 1958 * Thuban/Model/postgisdb.py (PostGISConnection.MatchesParameters):
2604     New. Test whether the connection matches a set of connection
2605     parameters
2606    
2607     * Thuban/UI/dbdialog.py (DBFrame.conns_changed): Fix doc-string
2608     (DBFrame.OnAdd): Use the new MatchesParameters method when looking
2609     for existing connections with the same parameters and break out of
2610     the loop correctly.
2611    
2612     * test/test_postgis_db.py (TestBriefDescription)
2613     (TestPostGISSimple.test_brief_description): Rename
2614     TestBriefDescription to TestPostGISSimple and the test method to
2615     test_brief_description so that we can add more test methods.
2616     (TestPostGISSimple.test_matches_parameters): New. Test the new
2617     MatchesParameters method
2618    
2619     2003-11-18 Bernhard Herzog <[email protected]>
2620    
2621 bh 1960 * Thuban/Lib/connector.py (Publisher): Introduce a new flag,
2622 bh 1954 _was_destroyed, to indicate whether an publisher instance has
2623     already been destroyed.
2624     (Publisher.Unsubscribe): Only disconnect if the publisher has not
2625     been destroyed yet.
2626     (Publisher.Destroy): Set the _was_destroyed flag to true.
2627    
2628     * test/test_connector.py
2629     (TestPublisher.test_unsubscribe_after_destroy): New. Test that
2630     calling Unsubscribe after Destroy doesn't raise an exception
2631    
2632 bh 1951 2003-11-14 Bernhard Herzog <[email protected]>
2633    
2634     * Thuban/UI/identifyview.py (IdentifyView.selected_shape): Fix
2635     typo in doc-string
2636    
2637 bh 1949 2003-11-13 Bernhard Herzog <[email protected]>
2638    
2639     Quote table and column names properly for postgis.
2640    
2641     * Thuban/Model/postgisdb.py (quote_identifier): New. Function to
2642     quote an identifier for use in an sql statement
2643     (PostGISColumn.__init__): Add the quoted_name attribute
2644     (PostGISTable.__init__): New instance variable quoted_tablename
2645     (PostGISTable._fetch_table_information): Use the quoted table
2646     name. New isntance variable quoted_geo_col with a quoted version
2647     of geometry_column
2648     (PostGISTable.NumRows, PostGISTable.RowIdToOrdinal)
2649     (PostGISTable.RowOrdinalToId): Use the quoted table name
2650     (PostGISTable.ReadValue, PostGISTable.ValueRange)
2651     (PostGISTable.UniqueValues, PostGISTable.SimpleQuery)
2652     (PostGISShapeStore.BoundingBox, PostGISShapeStore.Shape)
2653     (PostGISShapeStore.AllShapes, PostGISShapeStore.ShapesInRegion):
2654     Use quoted table and column names
2655    
2656     * test/test_postgis_db.py (TestPostGISSpecialCases)
2657     (TestPostGISIgnoredColumns): Rename the class to
2658     TestPostGISSpecialCases because that better describes the new
2659     cases
2660     (TestPostGISSpecialCases.test_unsupported_types)
2661     (TestPostGISSpecialCases.test): Rename the method to
2662     test_unsupported_types because we need a more descriptive name now
2663     that there are more methods
2664     (TestPostGISSpecialCases.test_table_name_quoting)
2665     (TestPostGISSpecialCases.test_column_name_quoting)
2666     (TestPostGISSpecialCases.test_shapestore_name_quoting): New test
2667     cases to test quoting of table and column names in PostGISTable
2668     and PostGISShapeStore
2669    
2670     * test/postgissupport.py
2671     (skip_if_addgeometrycolumn_does_not_use_quote_ident): New. Skip if
2672     AddGeometryColumn desn't support table or column names with sapces
2673     or double quotes
2674    
2675 jan 1945 2003-11-12 Jan-Oliver Wagner <[email protected]>
2676    
2677     * Extensions/wms/__init__.py: New: Init to make this
2678     directory a package.
2679    
2680     * Extensions/wms/wms.py: New: Provide layers via OGC WMS.
2681    
2682 bh 1932 2003-11-11 Bernhard Herzog <[email protected]>
2683    
2684 bh 1942 * Thuban/Model/resource.py (EPSG_DEPRECATED_PROJ_FILE): New.
2685     Constant for the file woth deprecated epsg projections
2686     (get_system_proj_file): Update doc-string
2687    
2688     * Thuban/UI/projdialog.py (ProjFrame.build_dialog): Add a space
2689     above the EPS widgets, introduce a check box for the deprecated
2690     eps projections and a label for the epsg widgets
2691     (ProjFrame._OnShowEPSG): Handle the deprecated EPSG projections
2692     too
2693    
2694     2003-11-11 Bernhard Herzog <[email protected]>
2695    
2696 bh 1939 Avoid warnings when run under Python 2.3
2697    
2698     * Thuban/UI/baserenderer.py (BaseRenderer.draw_point_shape)
2699     (BaseRenderer.draw_label_layer): Coordinates must be ints.
2700    
2701     * Thuban/UI/renderer.py (MapRenderer.make_point): Turn this into a
2702     real method so that we can convert to int.
2703     (MapRenderer.label_font): The font size mist be an int.
2704    
2705     * Thuban/UI/common.py (Color2wxColour): The color values must be
2706     ints. Also, remove the unnecessary asserts.
2707    
2708     * test/test_load_0_8.py (TestUnicodeStrings.file_contents)
2709     (TestUnicodeStrings.test): Python source code should not contain
2710     non-ascii characters unless an encoding is specified in the file.
2711     Therefore use \x escapes in the string literals for non-ascii
2712     characters.
2713    
2714     2003-11-11 Bernhard Herzog <[email protected]>
2715    
2716 bh 1934 * Thuban/Model/resource.py (get_system_proj_file): Add a filename
2717     parameter so that this function can be used for all proj files in
2718     Resource/Projections
2719     (DEFAULT_PROJ_FILE, EPSG_PROJ_FILE): New. Predefined filenames for
2720     get_system_proj_file
2721    
2722     * Thuban/UI/projdialog.py (ProjFrame.__init__): Instead of one
2723     ProjFile self.__sysProjFile use a dictionary of system ProjFile
2724     objects self._sys_proj_files
2725     (ProjFrame.build_dialog): Adapt to the new changes in the
2726     ProjectionList constructor. Add a check button to toggle whether
2727     EPSG projections are shown
2728     (ProjFrame._OnShowEPSG): New. Handler for the epsg check button
2729     events.
2730     (ProjFrame.load_user_proj, ProjFrame.load_system_proj): Only show
2731     the busy cursor if the files have not yet been loaded by the
2732     dialog.
2733     (ProjFrame.load_system_proj): Add a parameter for the name of the
2734     proj file. Maintain the dictionary of system projections
2735     self._sys_proj_files
2736    
2737     * Thuban/UI/projlist.py (ProjectionList): Merge the system_projs,
2738     user_projs parameters into one parameter proj_files which is a
2739     list of proj files.
2740     (ProjectionList._subscribe_proj_files)
2741     (ProjectionList._unsubscribe_proj_files): New. Move
2742     subscription/unsubscription of projfile messages to separate
2743     methods
2744     (ProjectionList.Destroy): The unsubscribe is now done in
2745     _unsubscribe_proj_files
2746     (ProjectionList.update_projections): We now have a list of proj
2747     file objects
2748     (ProjectionList.SetProjFiles): New method to set a new list of
2749     proj file objects
2750    
2751     * test/test_proj.py (ProjFileReadTests.test_get_system_proj_file):
2752     Specify explicitly which system proj file to load.
2753    
2754     2003-11-11 Bernhard Herzog <[email protected]>
2755    
2756 bh 1932 * Thuban/Model/load.py (SessionLoader.Destroy): New. Clear all
2757     instance variables to cut cyclic references. The GC would have
2758     collected the loader eventually but it can happen that it doesn't
2759     run at all until thuban is closed (2.3 but not 2.2 tries a bit
2760     harder and forces a collection when the interpreter terminates)
2761     (load_session): Call the handler's Destroy method to make sure
2762     that it gets garbage collected early. Otherwise it will be
2763     collected very late if at all and it holds some references to e.g.
2764     shapestores and the session which can lead to leaks (of e.g. the
2765     temporary files)
2766    
2767     * test/test_load.py (TestSingleLayer.test_leak): New. test for the
2768     resource leak in load_session
2769    
2770 bh 1929 2003-11-10 Bernhard Herzog <[email protected]>
2771    
2772     * Thuban/UI/baserenderer.py: Add a way to specify how layers in
2773     extensions are to be rendered.
2774     (_renderer_extensions): New. List with renderer for layers in
2775     extensions
2776     (add_renderer_extension): New. Add a renderer extension
2777     (init_renderer_extensions): New. Init the renderer extensions
2778     (BaseRenderer.render_map_incrementally): Search
2779     _renderer_extensions for how to draw unknown layer types
2780     (BaseRenderer.draw_raster_data): Add format parameter so that
2781     formats other than BMP can be drawn
2782     (BaseRenderer.draw_raster_layer): Pass an explicit format to
2783     draw_raster_data
2784    
2785     * Thuban/UI/renderer.py (raster_format_map): New. Mapping form the
2786     strings of the format parameter of draw_raster_data method to wx
2787     constants
2788     (MapRenderer.draw_raster_data): Add the format parameter and use
2789     raster_format_map to map it to the right wxwindows constant for
2790     wxImageFromStream
2791    
2792     * test/test_baserenderer.py (SimpleRenderer.draw_raster_data): Add
2793     the format parameter and record it
2794     (TestBaseRenderer.test_raster_no_projection): check the format
2795     paramter of the draw_raster_data method
2796     (TestBaseRenderer.test_renderer_extension): New. Test the renderer
2797     extension facility
2798    
2799 bh 1925 2003-11-07 Bernhard Herzog <[email protected]>
2800    
2801     Tweak the usage of the sqlite database to make common use cases
2802     more responsive. In most cases copying the data to the sqlite
2803     database takes so long that using sqlite doesn't have enough
2804     advantages.
2805    
2806     * Thuban/Model/transientdb.py (TransientTableBase.ValueRange): Add
2807     comments about performance and query the min and max in separate
2808     statements because only that way will indexes be used.
2809     (TransientTableBase.UniqueValues): Add some comments about
2810     performance.
2811     (AutoTransientTable.ValueRange, AutoTransientTable.UniqueValues):
2812     Do not copy the data to the transient DB but use the transient
2813     copy if it exists. See the new comments for the performance trade
2814     offs
2815    
2816     * test/test_transientdb.py
2817     (TestTransientTable.test_auto_transient_table): Make sure that the
2818     data is copied to the transient database at some point.
2819    
2820 bh 1913 2003-11-03 Bernhard Herzog <[email protected]>
2821    
2822 bh 1922 * Thuban/Model/data.py (ShapefileStore.ShapesInRegion): Bind some
2823     globals to locals so that it's a bit faster
2824    
2825     2003-11-03 Bernhard Herzog <[email protected]>
2826    
2827 bh 1920 * Thuban/UI/baserenderer.py
2828     (BaseRenderer.draw_shape_layer_incrementally): Use the ReadValue
2829     method. ReadValue is faster than ReadRowAsDict since it only reads
2830     one cell especially now that the dbf file objects actually
2831     implement it.
2832    
2833     * Thuban/Model/table.py (DBFTable.ReadValue): Use the new
2834     read_attribute method of the dbf objects
2835    
2836     2003-11-03 Bernhard Herzog <[email protected]>
2837    
2838 bh 1916 * Extensions/profiling/profiling.py (popup_dialog_box): New config
2839     variable to indicate whether the result should be shown in a
2840     dialog box
2841     (profile_screen_renderer, time_screen_renderer): Only show a
2842     dialog box if popup_dialog_box is true.
2843     (profile_screen_renderer): Flush stdout after the printing the
2844     first part of the "profiling..." message
2845    
2846     * Thuban/UI/baserenderer.py
2847     (BaseRenderer.draw_shape_layer_incrementally): Cache the pens and
2848     brushes for the groups so that they're not created over and over
2849     again
2850    
2851 bh 1913 * Thuban/Model/classification.py (Classification.__getattr__)
2852     (Classification._compile_classification)
2853     (Classification._clear_compiled_classification): New. Methods to
2854     manage a 'compiled' representation of the classification groups
2855     which is created on demand
2856     (Classification.InsertGroup, Classification.RemoveGroup)
2857     (Classification.ReplaceGroup): reset the compiled representation
2858     (Classification.FindGroup): Use the compiled representation to
2859     find the matching group
2860     (ClassGroupRange.GetRangeTuple): New. Return the range as a tuple
2861    
2862 bh 1904 2003-10-31 Bernhard Herzog <[email protected]>
2863    
2864 bh 1911 * Thuban/Model/classification.py (Classification.SetDefaultGroup):
2865     Send a CLASS_CHANGED message
2866     (Classification.RemoveGroup): Send a CLASS_CHANGED message and do
2867     not return the removed group since it wasn't used.
2868    
2869     * test/test_classification.py
2870     (TestClassification.test_set_default_group): New. Test the
2871     SetDefaultGroup method
2872     (TestClassification.test_insert_group): New. Test the InsertGroup
2873     method
2874     (TestClassification.test_remove_group): New. Test the RemoveGroup
2875     method
2876     (TestClassification.test_replace_group): New. Test the
2877     ReplaceGroup method
2878    
2879     2003-10-31 Bernhard Herzog <[email protected]>
2880    
2881 bh 1908 * test/test_classification.py (TestClassification.setUp):
2882     Subscribe to the CLASS_CHANGED messages
2883     (TestClassification.tearDown): New. Destroy the classification
2884     properly
2885     (TestClassification.test_defaults): Add tests for the default line
2886     width and whether no messages were sent yet
2887     (TestClassification.test_set_default_properties): Add tests for
2888     messages and setting the default line width
2889     (TestClassification.test_add_singleton)
2890     (TestClassification.test_add_range)
2891     (TestClassification.test_multiple_groups): Add tests for messages
2892    
2893     2003-10-31 Bernhard Herzog <[email protected]>
2894    
2895 bh 1906 Some more refactoring in preparation for new tests:
2896    
2897     * test/test_classification.py (TestClassification.setUp): New.
2898     Instantiate the classification here. Update the test methods
2899     accordingly.
2900     (TestClassification.test_multiple_groups): Make sure that the two
2901     singletons matching 1 are considered different.
2902    
2903     2003-10-31 Bernhard Herzog <[email protected]>
2904    
2905 bh 1904 * test/test_classification.py (red, green, blue): New. These
2906     constants were used in several cases. Update the relevant methods.
2907     (TestClassification.test_defaults)
2908     (TestClassification.test_set_default_properties)
2909     (TestClassification.test_add_singleton)
2910     (TestClassification.test_add_range)
2911     (TestClassification.test_multiple_groups)
2912     (TestClassification.test_deepcopy): New. These were formerly all
2913     part of the single method test.
2914     (TestClassification.test_deepcopy): Removed.
2915     (TestClassIterator): Removed. The test case is now a method of
2916     TestClassification since it tests part of the public interface of
2917     Classification
2918     (TestClassification.test_iterator): New. Used to be
2919     TestClassIterator effectively
2920    
2921 jan 1902 2003-10-31 Jan-Oliver Wagner <[email protected]>
2922    
2923     GUIfied the functions of the profiling extension.
2924    
2925     * /Extensions/profiling/__init__.py: New: Init to make this
2926     directory a package.
2927    
2928     * Extensions/profiling/profiling.py: Moved menu entries to
2929     the Extensions menu. Applied _() for strings.
2930     (profile_screen_renderer): Catch the detailed printout and present
2931     it in a dialog.
2932 bh 1904 (time_screen_renderer): Raise a dialog to present the result instead
2933 jan 1902 of printing it to stdout.
2934    
2935 bh 1897 2003-10-31 Bernhard Herzog <[email protected]>
2936    
2937 bh 1899 * test/test_classification.py (TestClassGroupProperties)
2938     (TestClassGroup, TestClassGroupDefault, TestClassGroupRange)
2939     (TestClassGroupSingleton, TestClassIterator, TestClassification):
2940     Split TestClassification into several classes, one for each class
2941     being tested. TestClassification itself now only tests
2942     Classification. This split makes changes to the tests a bit easier
2943    
2944     2003-10-31 Bernhard Herzog <[email protected]>
2945    
2946 bh 1897 * Extensions/profiling/profiling.py: New. Extension to measure
2947     Thuban performance
2948    
2949 frank 1895 2003-10-31 Frank Koormann <[email protected]>
2950    
2951     Added two items to legend popup menu: Remove Layer and Show Layer Table
2952    
2953     * Thuban/UI/legend.py (LegendPanel._OnRemoveLayer,
2954     LegendPanel._OnShowTable): New event handlers, call the corresponding
2955     mainwindow methods.
2956     (LegendTree._OnRightClick): Added items to popup menu.
2957    
2958 bh 1894 2003-10-30 Bernhard Herzog <[email protected]>
2959    
2960     * Thuban/UI/dialogs.py (ThubanFrame.__init__): Handle
2961     EVT_WINDOW_DESTROY
2962     (ThubanFrame.OnDestroy): New. Handler for EVT_WINDOW_DESTROY. Does
2963     nothing but is convenient for the derived classes.
2964    
2965     * Thuban/UI/tableview.py
2966     (TableFrame.OnDestroy, LayerTableFrame.OnDestroy): New.
2967     Unsubscribe the messages here not in OnClose because that might
2968     get called multiple times. Fixes RT #2196
2969     (TableFrame.OnClose, LayerTableFrame.OnClose): Removed. Not needed
2970     anymore.
2971    
2972     * README: Update the minimum requirement for wxPython. Since we
2973     now use the EVT_WINDOW_DESTROY event, we need at least 2.4.0.4,
2974     the version in which that was introduced for all platforms
2975    
2976 frank 1890 2003-10-30 Frank Koormann <[email protected]>
2977    
2978     * Thuban/UI/join.py (JoinDialog.OnJoin): Wrapped the major parts of
2979     the join process in a ThubanBeginBusyCursor, ThubanEndBusyCursor
2980     frame.
2981    
2982 jan 1889 2003-10-30 Jan-Oliver Wagner <[email protected]>
2983    
2984     Improved APR import extension, added further EPSG definitions
2985     and some cleanup regarding string class.
2986    
2987     * test/test_proj.py (TestProjection.test_get_projection_units_geo):
2988     Added test for alias 'longlat'.
2989    
2990     * Resources/Projections/epsg-deprecated.proj: New. Contains
2991     deprecated EPSG definitions.
2992    
2993     * Extensions/importAPR/odb.py (ODBBaseObject.TreeInfo): Added
2994     the variable names for objects.
2995    
2996     * Extensions/importAPR/apr.py (APR_BLnSym, APR_BMkSym, APR_BShSym): New.
2997     Copied from importAPR and provided with documentation.
2998    
2999     * Extensions/importAPR/importAPR.py (APR_BLnSym, APR_BMkSym, APR_BShSym):
3000     Moved to apr.py.
3001     (APR_View): Added object ref 'ITheme'.
3002    
3003     * Thuban/Lib/fileutil.py, Thuban/UI/proj4dialog.py: Replaced string
3004     split function by corresponding use of the string class method.
3005    
3006     * Thuban/Model/xmlwriter.py: Replaced string replace function by
3007     corresponding string method.
3008    
3009 bh 1880 2003-10-29 Bernhard Herzog <[email protected]>
3010    
3011     * Thuban/UI/baserenderer.py
3012     (BaseRenderer.draw_shape_layer_incrementally): Speed up the
3013     special case of a classification that only has the default group
3014    
3015 bh 1868 2003-10-27 Bernhard Herzog <[email protected]>
3016    
3017 bh 1878 * po/fr.po, po/es.po: Updated translations from Daniel Calvelo
3018    
3019 bh 1876 * po/de.po: Update.
3020    
3021     * Thuban/UI/application.py
3022     (ThubanApplication.ShowExceptionDialog): Handle translation of the
3023     dialog message properly
3024    
3025     2003-10-27 Bernhard Herzog <[email protected]>
3026    
3027 bh 1873 Rework how localization works so that we use wx's translation
3028     functions when running Thuban as a normal application but not when
3029     we don't need any UI, such as in the test suite. See the comment
3030     in Thuban/__init__.py for details
3031    
3032     * Thuban/__init__.py (_): Add one level of indirection to make the
3033     translation handling more flexible and to make it possible to use
3034     either wx's translation services or not.
3035     (gettext_identity, translation_function_installed)
3036     (install_translation_function): New function to help with this
3037    
3038     * Thuban/UI/__init__.py: Install the wx specific translation
3039     function if it's OK to do that
3040    
3041     * test/support.py (initthuban): Install a dummy translation
3042     function so that importing Thuban.UI doesn't install a wx specific
3043     one for which would need to import wxPython
3044    
3045     2003-10-27 Bernhard Herzog <[email protected]>
3046    
3047 bh 1870 * HOWTO-Release: Source archives should be created first and the
3048     binary packages should be created from the source archives.
3049     There's an official debian package now so there's no need to test
3050     the rpm on debian anymore
3051    
3052     2003-10-27 Bernhard Herzog <[email protected]>
3053    
3054 bh 1868 Several rendering changes:
3055    
3056     - Render the selection into a separate bitmap so that only that
3057     bitmap needs to be redrawn when the selection changes
3058    
3059     - Render incrementally showing previews and allowing interaction
3060     before rendering is complete
3061    
3062     - Update the renderer interface a bit. Most parameters of
3063     RenderMap are now parameters of the constructor
3064    
3065     * Thuban/UI/baserenderer.py (BaseRenderer.__init__): Add the map
3066     and the update region as parameters. Update the doc-string
3067     (BaseRenderer.render_map_incrementally): New. Generator function
3068     to renders the map incrementally
3069     (BaseRenderer.render_map): Remove the map argument (it's now in
3070     the constructor) and simply iterate over the
3071     render_map_incrementally generator to draw the map.
3072     (BaseRenderer.draw_shape_layer_incrementally)
3073     (BaseRenderer.draw_shape_layer): Renamed to
3074     draw_shape_layer_incrementally and changed into a generator that
3075     yields True every 500 shapes. Used by render_map_incrementally to
3076     render shape layers incrementally
3077    
3078     * Thuban/UI/renderer.py (ScreenRenderer.RenderMap): Removed the
3079     map and region parameters which are now in the constructor
3080     (ScreenRenderer.RenderMapIncrementally): New. Public frontend for
3081     the inherited render_map_incrementally.
3082     (BaseRenderer.draw_shape_layer): Removed.
3083     (ScreenRenderer.draw_selection_incrementally): New. The selection
3084     drawing part of the removed draw_shape_layer as a generator
3085     (ScreenRenderer.layer_shapes): Update because of the region
3086     parameter change
3087     (ExportRenderer.__init__): New. Extend the inherited constructor
3088     with the destination region for the drawing
3089     (ExportRenderer.RenderMap): Removed the map and region parameters
3090     which are now in the constructor
3091    
3092     * Thuban/UI/view.py (MapCanvas.PreviewBitmap): New. Return a
3093     bitmap suitable for a preview in a tool
3094     (CanvasPanTool.MouseMove): Use the PreviewBitmap method to get the
3095     bitmap
3096     (MapPrintout.draw_on_dc): Adapt to new renderer interface
3097     (MapCanvas.OnPaint): Handle drawing the selection bitmap if it
3098     exists
3099     (MapCanvas.OnIdle): Update the logic to deal with incremental
3100     rendering and the selection bitmap
3101     (MapCanvas._do_redraw): Handle the instantiation of the render
3102     iterator and the redraws during rendering
3103     (MapCanvas._render_iterator): New. Generator to incrementally
3104     redraw both bitmaps
3105     (MapCanvas.Export): Adapt to new renderer interface.
3106     (MapCanvas.full_redraw): Reset the selection bitmap and the
3107     renderer iterator too
3108     (MapCanvas.redraw_selection): New. Force a redraw of the selection
3109     bitmap
3110     (MapCanvas.shape_selected): Only redraw the selection bitmap
3111    
3112     * test/test_baserenderer.py
3113     (TestBaseRenderer.test_polygon_no_projection)
3114     (TestBaseRenderer.test_raster_no_projection)
3115     (TestBaseRenderer.test_point_map_projection)
3116     (TestBaseRenderer.test_point_layer_and_map_projection)
3117     (TestBaseRenderer.test_point_layer_projection)
3118     (TestBaseRenderer.test_point_with_classification): Adapt to new
3119     renderer interface
3120    
3121 bh 1865 2003-10-24 Bernhard Herzog <[email protected]>
3122    
3123     * libraries/thuban/wxproj.cpp (draw_polygon_shape)
3124     (point_in_polygon_shape, shape_centroid): Raise an exception if
3125     the shape can't be read. Previously invalid shape ids would lead
3126     to a segfault.
3127    
3128     * test/test_wxproj.py (TestShapeCentroid.test_invalid_shape_id):
3129     New. test whether an exception is raised for invalid shape ids
3130    
3131 jan 1857 2003-10-24 Jan-Oliver Wagner <[email protected]>
3132    
3133 jan 1862 * Thuban/Model/proj.py (Projection.GetProjectedUnits): Added 'longlat'
3134     as alias for 'latlong'.
3135    
3136     * Thuban/UI/projdialog.py (ProjFrame.__init__): Added 'longlat'
3137     as alias for 'latlong'.
3138    
3139     2003-10-24 Jan-Oliver Wagner <[email protected]>
3140    
3141 jan 1859 * Thuban/UI/projdialog.py (ProjFrame.proj_selection_changed): Set
3142     the projection even for the UnknownPanel.
3143     (UnknownProjPanel.__init__): Define the text and create the textctrl
3144     widget.
3145     (UnknownProjPanel._DoLayout): Replaced static text widget by the
3146     textctrl created in __init__.
3147     (UnknownProjPanel.SetProjection): Set the text for the text ctrl
3148     including the parameters of the projection.
3149    
3150     2003-10-24 Jan-Oliver Wagner <[email protected]>
3151    
3152 jan 1857 * Resources/Projections/epsg.proj: New. This is a list of
3153     EPSG codes with parameters for proj. The list has been
3154     generated using devtools/create_epsg.py based on the
3155     file nad/epsg of the proj 4.4.7 package. Four projection
3156     definitions have been deleted as they are not accepted by proj:
3157     "CH1903+ / LV95", "Bern 1898 (Bern) / LV03C", "CH1903 / LV03"
3158     and "HD72 / EOV".
3159    
3160 bh 1855 2003-10-22 Bernhard Herzog <[email protected]>
3161    
3162     Some more tweaks to the projection dialog which should fix RT
3163     #1886.
3164    
3165     * Thuban/UI/projlist.py (ProjectionList.Destroy): Unsubscribe from
3166     the ProjFile's messages and call the base class methods correctly
3167     (ProjectionList.SelectProjection): Set the wxLIST_STATE_FOCUSED
3168     flag on the newly selected item too. Otherwise some other item is
3169     focused and the first time the focus is moved with the keyboard
3170     the selection moves in unexpected ways.
3171    
3172     * Thuban/UI/projdialog.py (ProjFrame.__init__): Do not set the
3173     focus on the OK button, only on the projection list. That way the
3174     list really has the focus initially
3175     (ProjFrame.OnClose): Call the projection list's Destroy method to
3176     make it unsubscribe all messages
3177    
3178 bh 1840 2003-10-21 Bernhard Herzog <[email protected]>
3179    
3180 bh 1852 Rework the projection dialog to fix a few bugs, including RT 2166
3181     and most of 2168
3182    
3183     * Thuban/UI/projlist.py: New. The class ProjectionList is a
3184     special wxListCtrl to show a list of projections in a more MVC
3185     fashion
3186    
3187     * Thuban/UI/projdialog.py (ProjFrame): Substantial changes
3188     throughout the class. The main change is to use the ProjectionList
3189     class instead of a normal wxListBox. Also, add an explicit
3190     "Unknown" projection to the projection choice control.
3191     (ProjPanel.__init__): Add an "unknown" ellipsoid
3192     (TMPanel.__init__, LCCPanel.__init__): Tweak the order of
3193     instantiation of the panel's controls to make the tab-order more
3194     natural
3195    
3196     2003-10-21 Bernhard Herzog <[email protected]>
3197    
3198 bh 1849 * test/test_load.py (TestSingleLayer.file_contents)
3199     (TestSingleLayer.test): Add non-ascii characters to the titles of
3200     session, map and layer. This is effectively a port of the
3201     TestUnicodeStrings test in test_load_0_8.py which for some reason
3202     was only added there.
3203    
3204     * test/test_load_0_9.py (TestSingleLayer.file_contents)
3205     (TestSingleLayer.test): Same as in test_load.py: add non-ascii
3206     characters to the titles of session, map and layer,.
3207    
3208     2003-10-21 Bernhard Herzog <[email protected]>
3209    
3210 bh 1847 Add EPSG projection handling to .thuban files
3211    
3212     * test/test_save.py (SaveSessionTest.dtd)
3213     (SaveSessionTest.testEmptySession)
3214     (SaveSessionTest.testLayerProjection)
3215     (SaveSessionTest.testRasterLayer)
3216     (SaveSessionTest.testClassifiedLayer)
3217     (SaveSessionTest.test_dbf_table)
3218     (SaveSessionTest.test_joined_table)
3219     (SaveSessionTest.test_save_postgis): Update to 1.0-dev namespace
3220     (SaveSessionTest.testSingleLayer): Update to 1.0-dev namespace and
3221     use a and epsg projection to test saving them
3222    
3223     * test/test_load.py (LoadSessionTest.dtd): Update to 1.0-dev
3224     namespace
3225     (TestLayerVisibility.file_contents, TestLabels.file_contents)
3226     (TestLayerProjection.file_contents)
3227     (TestRasterLayer.file_contents, TestJoinedTable.file_contents)
3228     (TestPostGISLayer.file_contents)
3229     (TestPostGISLayerPassword.file_contents)
3230     (TestLoadError.file_contents, TestLoadError.test): Update to use
3231     1.0-dev namespace
3232     (TestSingleLayer.file_contents, TestSingleLayer.test): Update to
3233     use 1.0-dev namespace and use an EPSG projection to test whether
3234     loading it works
3235    
3236     * test/test_load_0_9.py: New. Effectively a copy of test_load.py
3237     as of Thuban 0.9. These are now tests to determine whether Thuban
3238     can still read files generated by Thuban 0.9
3239    
3240     * Thuban/Model/save.py (SessionSaver.write)
3241     (SessionSaver.write_session): Use the 1.0 dtd and 1.0-dev
3242     namespace
3243     (SessionSaver.write_projection): Write the projection's epsg
3244     attribute
3245    
3246     * Thuban/Model/load.py (SessionLoader.__init__): Also accept the
3247     thuban-1.0-dev.dtd namespace
3248     (SessionLoader.check_attrs): Allow a callable object as conversion
3249     too
3250     (SessionLoader.start_projection, SessionLoader.end_projection)
3251     (SessionLoader.start_parameter): Handle the epsg attribute and
3252     rename a few instance variables to lower case
3253    
3254     * Resources/XML/thuban-1.0.dtd: New. Only difference to
3255     thuban-0.9.dtd is the epsg attribute for projections.
3256    
3257     2003-10-21 Bernhard Herzog <[email protected]>
3258    
3259 bh 1840 * test/runtests.py (main): Let the user specify which tests to run
3260     on the command line
3261    
3262     * test/support.py (ThubanTestResult.getDescription): Override to
3263     give a better short description. The description can be used as a
3264     parameter to run_tests to run that particular test in isolation.
3265    
3266 frank 1837 2003-10-21 Frank Koormann <[email protected]>
3267    
3268     Popup menu for legend. Scheduled for the 1.2 release this was too
3269     simple to implement: The popup menu is bound to the legend tree, while
3270     the events are hanlded by its anchestor, the legend panel. This
3271     allows reuse of all the event handlers already implemented for the
3272     legend toolbar buttons.
3273    
3274     * Thuban/UI/legend.py (LegendPanel.__init__): EVT_MENU macros
3275     to add handlers for the events issued by the popup menu.
3276     (LegendPanel._OnToggleVisibility): Handler for toggling layer
3277     visibility event
3278     (LegendPanel._OnProjection): Handler for layer projection event.
3279     (LegendTree.__init__): Added EVT_TREE_ITEM_RIGHT_CLICK
3280     (LegendTree._OnRightClick): Event handler for right click, select item
3281     and pop up menu.
3282     (LegendTree.ToggleVisibility): Toggle layer visibility
3283     (LegendTree.LayerProjection): Raise layer projection dialog for
3284     current layer.
3285    
3286 bh 1836 2003-10-21 Bernhard Herzog <[email protected]>
3287    
3288     * Resources/Projections/defaults.proj: Use correct DOCTYPE
3289     declaration. The top-level element is projectionlist not projfile
3290    
3291 bh 1834 2003-10-20 Bernhard Herzog <[email protected]>
3292    
3293     * Thuban/UI/projdialog.py (ProjFrame.write_proj_file): New. helper
3294     method to write a projfile and display a busy cursor and error
3295     dialogs.
3296     (ProjFrame._OnSave, ProjFrame._OnAddToList, ProjFrame._OnImport)
3297     (ProjFrame._OnExport, ProjFrame._OnRemove): Use write_proj_file
3298     (ProjFrame.__FillAvailList): Translate "<None>" too and display a
3299     busy cursor while loading the user and system prj files.
3300    
3301 bh 1832 2003-10-16 Bernhard Herzog <[email protected]>
3302    
3303     * Thuban/Model/resource.py (projfile_cache): Introduce a cache for
3304     ProjFile objects
3305     (clear_proj_file_cache): New function to clear the cache. Mainly
3306     useful for use by the test suite
3307     (read_proj_file): Use the cache.
3308    
3309     * test/test_proj.py (TestProjFile): Clarify the doc-string
3310     (ProjFileReadTests): Update doc-string
3311     (ProjFileReadTests.test_get_system_proj_file): Check whether the
3312     system proj files is cached.
3313     (ProjFileLoadTestCase): New base class for the proj file tests
3314     derived from support.FileLoadTestCase to provide some common
3315     behavior.
3316     (TestLoadingProjFile)
3317     (TestLoadingProjFileWithEmptyProjectionlist.file_contents)
3318     (TestProjFileWithInvalidParameters.file_contents): Derive from
3319     ProjFileLoadTestCase
3320     (TestLoadingProjFile.test_caching): New. Test whether the cache
3321     works
3322    
3323 silke 1829 2003-10-16 Silke Reimer <[email protected]>
3324    
3325     * debian/*: New directory with configuration files for building a thuban
3326     deb-package.
3327    
3328 bh 1822 2003-10-14 Bernhard Herzog <[email protected]>
3329    
3330 bh 1828 * test/test_proj.py: Execute support.run_tests when run as
3331     __main__ so that missing unsubscribes are detected
3332     (TestProjFile.tearDown): Destroy the proj_file properly
3333    
3334     2003-10-14 Bernhard Herzog <[email protected]>
3335    
3336 bh 1826 * Thuban/Model/messages.py (PROJECTION_ADDED)
3337     (PROJECTION_REPLACED, PROJECTION_REMOVED): New message types for
3338     the ProjFile objects
3339    
3340     * Thuban/Model/proj.py (ProjFile): Derive from Publisher so we can
3341     easily send messages when the projections change
3342     (ProjFile.Add, ProjFile.Remove, ProjFile.Replace): Issue messages
3343     when the change was successful
3344    
3345     * test/test_proj.py (TestProjFile.setUp): Subscribe to some of the
3346     proj file messages
3347     (TestProjFile.test_add_remove)
3348     (TestProjFile.test_remove_non_existing)
3349     (TestProjFile.test_replace)
3350     (TestProjFile.test_replace_non_existing): Test whether the right
3351     messages are sent
3352    
3353     2003-10-14 Bernhard Herzog <[email protected]>
3354    
3355 bh 1822 * test/test_proj.py (TestProjFile.test): Refactor into several
3356     tests
3357     (TestProjFile.test_add_remove)
3358     (TestProjFile.test_remove_non_existing)
3359     (TestProjFile.test_replace)
3360     (TestProjFile.test_replace_non_existing): Some of the new
3361     individual test cases
3362     (TestProjFileSimple): New class for the rest of the test cases
3363     that came out of the refactoring
3364     (ProjFileTest): Derive from xmlsupport.ValidationTest so that the
3365     derived classes don't have to
3366    
3367 bh 1812 2003-10-13 Bernhard Herzog <[email protected]>
3368    
3369 bh 1820 Add an optional EPSG code to the projection objects and extend the
3370     .proj file format accordingly.
3371    
3372     * Resources/XML/projfile.dtd (element projection): Add epsg
3373     attribute
3374    
3375     * Thuban/Model/proj.py (Projection.__init__): New parameter and
3376     instance variable epsg. Update doc-string
3377     (Projection.EPSGCode, Projection.Label): New methods to provide
3378     access to EPSG code and a label for use in dialogs
3379    
3380     * Thuban/Model/resource.py (ProjFileReader.start_projection)
3381     (ProjFileReader.end_projection, ProjFileSaver.write_projfile):
3382     Handle the epsg code attribute when reading or writing proj files
3383    
3384     * Thuban/UI/projdialog.py (ProjFrame._OnSave)
3385     (ProjFrame._OnAddToList, ProjFrame.__DoOnProjAvail)
3386     (ProjFrame.__FillAvailList): Use the projection's Label method to
3387     get the string for the list box
3388    
3389     * test/test_proj.py (TestProjection.test_label)
3390     (TestProjection.test_label_epsg)
3391     (TestProjection.test_epsgcode_for_non_epsg_projection)
3392     (TestProjection.test_epsgcode_for_real_epsg_projection): New tests
3393     for the label and EPSGCode methods
3394     (WriteProjFileTests.doTestWrite, WriteProjFileTests.test_write)
3395     (WriteProjFileTests.test_write_empty_file): Create the ProjFile
3396     objects in the test cases and put the expected contents into the
3397     test case methods too. Update doTestWrite accordingly
3398     (TestLoadingProjFile)
3399     (TestLoadingProjFileWithEmptyProjectionlist): New classes with the
3400     read tests from TestProjFile.
3401     (TestProjFile.doTestRead, TestProjFile.testRead): Removed. These
3402     tests are now in the new classes.
3403     (sample_projfile, sample_projfile_data)
3404     (sample_projfile2, sample_projfile_data2): Removed. Not used
3405     anymore.
3406     (TestProjFile.test_read_unreadable_file): No need to reset the
3407     permissions at the end anymore since we use a unique filename
3408    
3409     2003-10-13 Bernhard Herzog <[email protected]>
3410    
3411 bh 1814 * test/test_proj.py: Some more refactoring of the test cases
3412     (ProjFileTest): New base class for the proj file tests.
3413     (TestProjFile): Derive from ProjFileTest
3414     (TestProjFile.test_read_unreadable_file)
3415     (TestProjFile.test_read_empty_file, TestProjFile.doTestRead): Use
3416     the new filename method to get a unique filename
3417     (TestProjFile.doTestWrite, TestProjFile.testWrite): Removed.
3418     (WriteProjFileTests): New class for proj file write tests.
3419     Contains the write test that were in TestProjFile originally.
3420    
3421     2003-10-13 Bernhard Herzog <[email protected]>
3422    
3423 bh 1812 * test/test_proj.py (TestProjFile.testRead)
3424     (TestProjFile.test_read_non_existing_file)
3425     (TestProjFile.test_read_unreadable_file)
3426     (TestProjFile.test_read_empty_file): Split into several methods.
3427    
3428 bh 1805 2003-10-10 Bernhard Herzog <[email protected]>
3429    
3430 bh 1810 * Thuban/UI/sizers.py: New file with custom sizers.
3431    
3432     * Thuban/UI/projdialog.py (ProjFrame.build_dialog): Instantiate
3433     all projection type specific panels and put them into a
3434     NotebookLikeSizer. This way the dialog doesn't change its size
3435     when a different projection is selected
3436     (ProjFrame.__init__): Rename projection_panels
3437     projection_panel_defs and reuse projection_panels for a list of
3438     the instantiated panels.
3439     (ProjFrame._show_proj_panel, ProjFrame.__DoOnProjAvail)
3440     (ProjFrame.__DoOnProjChoice): Changes due to the new handling of
3441     the panels
3442     (UnknownProjPanel._DoLayout): Place the newlines in the message
3443     differently to make the panel narrower.
3444     (TMPanel._DoLayout): Layout the parameters in one column.
3445    
3446     2003-10-10 Bernhard Herzog <[email protected]>
3447    
3448 bh 1807 * Thuban/UI/projdialog.py (ProjFrame.build_dialog): New method
3449     that contains all the setup for the dialog's widgets, layout and
3450     event handling.
3451     (__): Call build_dialog to build the dialog.
3452     (ProjFrame.__set_properties, ProjFrame.__do_layout): Removed.
3453     Their functionality is now in build_dialog
3454     (ProjFrame.__VerifyButtons, ProjFrame.__VerifyButtons)
3455     (ProjFrame.__DoOnProjAvail, ProjFrame.__DoOnProjAvail)
3456     (ProjFrame.__DoOnProjChoice): Small updates due to slightly
3457     different widget names and hierarchy introduced with build_dialog.
3458    
3459     2003-10-10 Bernhard Herzog <[email protected]>
3460    
3461 bh 1805 * README: Fix typo.
3462    
3463 bh 1803 2003-10-09 Bernhard Herzog <[email protected]>
3464    
3465     * Thuban/Model/proj.py (ProjFile.Add): Do not check whether the
3466     projection is already in the list. This is *a lot* faster when
3467     loading files with hundreds of projections since it saves a linear
3468     search. OTOH this will allow adding the same projection to the
3469     user.proj file multiple times in the projection dialog but we'll
3470     deal with that later
3471    
3472 jan 1801 2003-10-09 Jan-Oliver Wagner <[email protected]>
3473    
3474     * devtools: New. Directory for developer tools that are not intended
3475     for the regular user.
3476    
3477     * devtools/create_epsg.py: New. Convert the epsg file of proj into
3478     a python .proj file.
3479    
3480 bh 1799 2003-10-09 Bernhard Herzog <[email protected]>
3481    
3482     * test/test_proj.py
3483     (TestProjection.test_get_parameter_without_equals_sign): New. Test
3484     whether GetParameter handles parameters without "=" sign correctly
3485    
3486     * Thuban/Model/proj.py (Projection.GetParameter): Handle
3487     parameters that do not contain a "=". Update the doc-string
3488    
3489 bh 1794 2003-10-08 Bernhard Herzog <[email protected]>
3490    
3491 bh 1796 * Thuban/UI/projdialog.py (ProjFrame.__set_properties): Remove the
3492     length limit on the projname text control
3493    
3494     2003-10-08 Bernhard Herzog <[email protected]>
3495    
3496 bh 1794 * test/test_proj.py (TestProjection.test_get_projection_units_geo)
3497     (TestProjection.test_get_projection_units_normal): New. Tests for
3498     the Projection.GetProjectedUnits method
3499    
3500 jan 1792 2003-10-08 Jan-Oliver Wagner <[email protected]>
3501    
3502     * Thuban/Model/resource.py (get_user_proj_file): small bug-fix:
3503     Added missing 'val' parameter.
3504    
3505 bh 1788 2003-10-08 Bernhard Herzog <[email protected]>
3506    
3507 bh 1790 * Thuban/UI/projdialog.py (ProjFrame.__DoOnProjAvail): When the
3508     projection type of the currently selected projection is not known,
3509     i.e. there's no panel for it, use the UnknownProjPanel
3510     (ProjFrame.__DoOnProjChoice, ProjFrame._show_proj_panel): Split
3511     the actual replacing of the proj panel into the new method
3512     _show_proj_panel.
3513     (UnknownProjPanel): Add doc-string.
3514     (UnknownProjPanel._DoLayout): Insert a newline into the text so
3515     that the panel is not so wide.
3516    
3517     2003-10-08 Bernhard Herzog <[email protected]>
3518    
3519 bh 1788 * Thuban/Model/resource.py (read_proj_file): Return the warnings
3520     too. Update the doc-string
3521     (get_proj_files): Removed. It wasn't used anywhere
3522     (get_system_proj_files, get_system_proj_file): Rename to
3523     get_system_proj_file and return the ProjFile object and not a list
3524     of ProjFile objects. Update the callers.
3525     (get_user_proj_files, get_user_proj_file): Rename to
3526     get_user_proj_file return the ProjFile object and not a list of
3527     ProjFile objects. Update the callers.
3528     (ProjFileReader.__init__): New instance variable for the warnings.
3529     Rename the __pf ivar to projfile. Update the methods referring to
3530     __pf
3531     (ProjFileReader.end_projection): Catch any errors raised when
3532     instantiating the projection and record that as an error. The
3533     projection will not be in the final ProjFile object.
3534     (ProjFileReader.GetWarnings): New method to return the warnings.
3535    
3536     * Thuban/UI/projdialog.py (ProjFrame.show_warnings): New method to
3537     show the warnings from the projfile reader
3538     (ProjFrame._OnImport): Deal with any warnings returned by
3539     read_proj_file
3540     (ProjFrame.__FillAvailList): Deal with any warnings returned by
3541     get_system_proj_file or get_user_proj_file.
3542    
3543     * test/test_proj.py (TestProjFile.doTestRead): Check the warnings.
3544     (TestProjFileWithInvalidParameters.file_contents): New test cases
3545     to test whether read_proj_file handles invalid projection
3546     parameters correctly
3547     (TestProjFile.test_get_system_proj_file): New. Simple test for
3548     resource.get_system_proj_file
3549    
3550 bh 1785 2003-10-07 Bernhard Herzog <[email protected]>
3551    
3552     * test/test_derivedshapestore.py
3553     (TestDerivedShapeStoreExceptions.tearDown): Clear the session
3554     properly so that the temporary directories get deleted correctly
3555    
3556 bh 1773 2003-10-06 Bernhard Herzog <[email protected]>
3557    
3558 bh 1783 Handle the title changes in a proper MVC way.
3559    
3560     * Thuban/UI/mainwindow.py (MainWindow.__init__): Subscribe to the
3561     canvas' TITLE_CHANGED messages
3562     (MainWindow.update_title): New. Update the main window's title
3563     (MainWindow.__SetTitle): Removed. Use update_title instead.
3564     (MainWindow.SetMap): Use update_title instead of __SetTitle
3565     (MainWindow.RenameMap): Do change the window title explicitly
3566     here. That's handled in a proper MVC way now.
3567     (MainWindow.title_changed): New. Subscriber for the TITLE_CHANGED
3568     messages
3569    
3570     * Thuban/Lib/connector.py (Conduit): New class to help classes
3571     that forward messages
3572    
3573     * Thuban/UI/viewport.py: Forward the map's TITLE_CHANGED messages
3574     (ViewPort): Derive from Conduit instead of Publisher
3575     (ViewPort.Subscribe, ViewPort.Unsubscribe): Use the new base class
3576     when calling the inherited versions
3577     (ViewPort._subscribe_map, ViewPort._unsubscribe_map): New helper
3578     methods to subscribe and unsubscribe map messages
3579     (ViewPort.SetMap, ViewPort.Destroy): Use the new helper methods to
3580     handle the map subscriptions
3581     (ViewPort.Map, ViewPort.map_projection_changed)
3582     (ViewPort.layer_projection_changed): Add or update doc-strings
3583    
3584     * test/test_connector.py (TestPublisher.test_issue_simple): Fix
3585     typo
3586     (MyConduit): Helper class for the Conduit test.
3587     (TestConduit): Test cases for Conduit
3588    
3589     * test/test_connector.py: Use support.run_tests as main.
3590    
3591     * test/test_viewport.py (ViewPortTest.setUp): Also subscribe to
3592     the TITLE_CHANGED messages
3593     (ViewPortTest.test_forwarding_title_changed): New test to check
3594     whether the viewport forwards the map's TITLE_CHANGED messages
3595     (TestViewportWithPostGIS.tearDown): Call the map's Destroy method
3596     after the port's because the latter may require a still functional
3597     map.
3598    
3599     2003-10-06 Bernhard Herzog <[email protected]>
3600    
3601 bh 1777 * Thuban/UI/application.py (ThubanApplication.maps_changed): Add
3602     doc-string
3603    
3604     2003-10-06 Bernhard Herzog <[email protected]>
3605    
3606 bh 1775 * test/test_viewport.py (ViewPortTest.setUp)
3607     (SimpleViewPortTest.test_init_with_size): Move the test for the
3608     initial size as a constructor parameter from ViewPortTest.setUp
3609     method to a new separate test in SimpleViewPortTest.
3610    
3611     2003-10-06 Bernhard Herzog <[email protected]>
3612    
3613 bh 1773 * test/test_viewport.py (MockView): New class derived from
3614     ViewPort with a mock implementation of GetTextExtent to be used in
3615     the test cases
3616     (ViewPortTest.setUp): Use MockView instead of ViewPort
3617    
3618     * Thuban/UI/viewport.py (ViewPort.GetTextExtent): Turn this method
3619     into what would be a "pure virtual function" in C++: always raise
3620     NotImplementedError. Mock implementations for test cases don't
3621     belong into the real code
3622    
3623 bh 1770 2003-10-02 Bernhard Herzog <[email protected]>
3624    
3625     * test/test_layer.py (TestLayer.test_empty_layer): Explicitly
3626     close the dbf file we create so that it's contents have been
3627     written properly.
3628    
3629     * libraries/shapelib/shptree.c, libraries/shapelib/shpopen.c,
3630     libraries/shapelib/shapefil.h, libraries/shapelib/dbfopen.c:
3631     Update to shapelib 1.2.10
3632    
3633 jan 1767 2003-10-01 Jan-Oliver Wagner <[email protected]>
3634    
3635     * Thuban/UI/tree.py, Thuban/UI/main.py: Remove the #! line as
3636     it annoys lintian which warns about these files not being
3637     executable. The #! isn't necessary here since if you absolutely
3638     must execute them you can always say "python <filename>".
3639    
3640 bh 1757 2003-09-26 Bernhard Herzog <[email protected]>
3641    
3642 bh 1760 * Thuban/Model/classgen.py (GenQuantiles0): Removed since it's
3643     only used in GREAT-ER but not used in Thuban itself. When GREAT-ER
3644     is ported to a newer the import will fail, so it should be noticed
3645     immediately that this function is gone.
3646     Fixes RT#1919
3647    
3648     2003-09-26 Bernhard Herzog <[email protected]>
3649    
3650 bh 1757 Add a DTD for the projection files and make thuban write valid
3651     projection files
3652    
3653     * Resources/XML/projfile.dtd: New. DTD for thuban's projection
3654     files
3655    
3656     * Thuban/Model/resource.py (ProjFileSaver.write): Use
3657     'projectionlist' as the name in the document type declaration so
3658     that it matches the element type of the root element.
3659    
3660     * test/test_proj.py (sample_projfile, sample_projfile2): Use
3661     'projectionlist' as the name in the document type declaration just
3662     as it is done now in the files thuban would write
3663     (sample_projfile, sample_projfile_data): Fix spelling of
3664     "Mercator"
3665     (TestProjFile.doTestWrite): Validate the written and the expected
3666     XML data
3667     (TestProjFile): Derive from ValidationTest so that we can run xml
3668     validation tests
3669    
3670 bh 1751 2003-09-24 Bernhard Herzog <[email protected]>
3671    
3672     * Thuban/UI/renderer.py (ExportRenderer.render_legend): Do not
3673     modify the list returned by map.Layers() in place since it is the
3674     actual list of layers used by the map.
3675    
3676 jan 1745 2003-09-23 Jan-Oliver Wagner <[email protected]>
3677    
3678     * Doc/manual/thuban-manual.xml: Added subsection to chapter
3679     Extensions to describe the extensions coming with the Thuban
3680     standard package (gns2shp and importAPR).
3681    
3682 bh 1743 2003-09-23 Bernhard Herzog <[email protected]>
3683    
3684     * libraries/thuban/wxproj.cpp (project_point): if there's an
3685     inverse but no forward projection, convert to degrees after
3686     applying the inverse projection. Fixes RT#2096
3687    
3688     * test/test_wxproj.py: New. Test cases for wxproj.so. One test
3689     implicitly tests for the fix to RT#2096
3690    
3691     * test/support.py (FloatComparisonMixin.assertFloatSeqEqual):
3692     Check that the sequences have the same lengths
3693    
3694     * Resources/Projections/defaults.proj (Geographic projection): Use
3695     a much more precise value for the to_meter attribute.
3696    
3697 bh 1737 2003-09-22 Bernhard Herzog <[email protected]>
3698    
3699     * test/support.py (initthuban): Make sure to unset the LANG env.
3700     var. so that tests that compare translated strings work. Solves RT
3701     #2094
3702    
3703 jan 1730 2003-09-22 Jan-Oliver Wagner <[email protected]>
3704    
3705 jan 1735 Small improvement of APR import.
3706    
3707     * Extensions/importAPR/test/test_apr.py (aprTest.test_LClass):
3708     Added tests for text-ranges.
3709    
3710     * Extensions/importAPR/apr.py (APR_LClass.GetThubanRange): Now
3711     returns a string object if the range is based on text.
3712    
3713     * Extensions/importAPR/importAPR.py (import_apr_dialog): Unified
3714     range retrieval.
3715    
3716     2003-09-22 Jan-Oliver Wagner <[email protected]>
3717    
3718 jan 1730 Initial version of the importAPR extension which is in
3719     experimental state.
3720    
3721     * /Extensions/importAPR/, /Extensions/importAPR/samples/,
3722     /Extensions/importAPR/test/: New directories.
3723    
3724     * /Extensions/importAPR/samples/README: New: Howto load the samples.
3725    
3726     * /Extensions/importAPR/samples/iceland.apr: New: A sample APR
3727     file which refers to the Thuban Iceland demo data.
3728    
3729     * /Extensions/importAPR/test/README: New: Howto execute the tests.
3730    
3731     * /Extensions/importAPR/test/test_apr.py: New: Tests for APR classes.
3732    
3733     * /Extensions/importAPR/apr.py: New: Classes for ArcView Objects
3734     as in '.apr'-files.
3735    
3736     * /Extensions/importAPR/odb.py: New: Classes for generic ArcView
3737     ODB Objects as in '.apr', '.avl' and other files.
3738    
3739     * /Extensions/importAPR/__init__.py: New: Init to make this
3740     directory a package.
3741    
3742     * /Extensions/importAPR/importAPR.py: New: Import a ArcView
3743     project file (.apr) and convert it to Thuban.
3744    
3745     2003-09-22 Jan-Oliver Wagner <[email protected]>
3746    
3747     * Extensions/gns2shp.gns2shp.py: The main module of gns2shp.
3748    
3749 jan 1720 2003-09-19 Jan-Oliver Wagner <[email protected]>
3750    
3751     * Doc/manual/thuban-manual.xml: Extended section 'Installation'
3752     with description on RPM installation and RPM binary package
3753     creation.
3754    
3755 bh 1718 2003-09-18 Bernhard Herzog <[email protected]>
3756    
3757     * setup.py (data_files): Only add the mo files if the Locales
3758     directory actually exists, so that setup.py works with a fresh CVS
3759     checkout
3760    
3761 jan 1716 2003-09-12 Jan-Oliver Wagner <[email protected]>
3762    
3763     * Examples/simple_extensions/simple_tool.py: bugfix: Tool is now
3764     in viewport, not anymore in view
3765    
3766 jan 1714 2003-09-04 Jan-Oliver Wagner <[email protected]>
3767    
3768     Introducing first Extension (gns2shp).
3769    
3770     * Extensions, Extensions/gns2shp, Extensions/gns2shp/test: New.
3771    
3772     * Extensions/__init__.py: New. init to make this dir a package.
3773    
3774     * Extensions/gns2shp/__init__.py: New. init to make this dir a package.
3775    
3776     * Extensions/gns2shp/test/README: New. some info on this test directory.
3777    
3778     * Extensions/gns2shp/test/ls.txt: New. test data set (Liechtenstein).
3779    
3780     * Extensions/gns2shp/test/test_gns2shp.py: New. Test for correct creation
3781     of Shapefile from GNS text file format
3782    
3783 jan 1705 2003-09-03 Jan-Oliver Wagner <[email protected]>
3784    
3785 jan 1707 Fix/workaround for bug #2019:
3786     https://intevation.de/rt/webrt?serial_num=2019
3787    
3788     * Thuban/UI/identifyview.py (IdentifyView.ID_STOP): New.
3789     (IdentifyView.__init__): Added another button that allows to
3790     stop the identify mode.
3791     (IdentifyView.OnStop): New. Stops the identify mode.
3792    
3793     2003-09-03 Jan-Oliver Wagner <[email protected]>
3794    
3795 jan 1705 Introducing a new exception dialog that allows to exit the
3796     application immediately.
3797     This fixes bug #2060: https://intevation.de/rt/webrt?serial_num=2060
3798    
3799     * Thuban/UI/exceptiondialog.py: New. A special exception dialog.
3800    
3801     * Thuban/UI/application.py (ThubanApplication.ShowExceptionDialog):
3802     Made strings available to translations. Exchanged the simple
3803     ScrolledMessageDialog by the new ExceptionDialog.
3804    
3805 bh 1694 2003-09-01 Bernhard Herzog <[email protected]>
3806    
3807 bh 1701 * NEWS: New. Summary of changes and release notes.
3808    
3809     * MANIFEST.in: Add NEWS
3810    
3811     2003-09-01 Bernhard Herzog <[email protected]>
3812    
3813 bh 1699 * MANIFEST.in: Correct the include statement for the mo-files and
3814     include the documentation too.
3815    
3816     * setup.py (data_files): Add the .mo files
3817     (setup call): Up to version 0.9.0
3818    
3819     2003-09-01 Bernhard Herzog <[email protected]>
3820    
3821 bh 1696 * Thuban/UI/dbdialog.py (ChooseDBTableDialog.__init__): Change the
3822     parameter list to just parent and session
3823     (ChooseDBTableDialog.__set_properties): Removed. Setting the
3824     selection of empty list boxes is not allowed (and produces C++
3825     assertion errors) and the rest of the setup is better done in
3826     __init__ anyway.
3827     (ChooseDBTableDialog.OnCancel, ChooseDBTableDialog.OnOK)
3828     (ChooseDBTableDialog.OnLBDClick, DBDialog.OnOK): Use the Python
3829     builtins True/False for booleans to avoid warnings from wxPython
3830    
3831     * Thuban/UI/mainwindow.py (MainWindow.AddDBLayer): Adapt to new
3832     ChooseDBTableDialog constructor parameters.
3833    
3834     2003-09-01 Bernhard Herzog <[email protected]>
3835    
3836 bh 1694 * Thuban/Model/postgisdb.py
3837     (PostGISTable): Extend doc-string
3838     (PostGISTable._fetch_table_information): Set the column index
3839     correctly, pretending ignored columns don't exist.
3840    
3841     * test/test_postgis_db.py (TestPostGISIgnoredColumns): New tests
3842     for postgis tables with data types not yet supported by thuban.
3843    
3844 bh 1692 2003-08-29 Bernhard Herzog <[email protected]>
3845    
3846     * HOWTO-Release: Tweak item about running the tests.
3847    
3848 jan 1690 2003-08-29 Jan-Oliver Wagner <[email protected]>
3849    
3850     * /Doc/manual/thuban-manual.xml: updated to version 1.0pre2.
3851    
3852 bh 1688 2003-08-29 Bernhard Herzog <[email protected]>
3853    
3854     Add some missing parameters to projections. Proj complains about
3855     them on windows but for some reason not on Linux.
3856    
3857     * test/test_save.py (SaveSessionTest.testLayerProjection): Add
3858     missing required projection parameters
3859    
3860     * test/test_proj.py (TestProjFile.test): Add missing required
3861     projection parameters
3862    
3863     * test/test_load_0_8.py (TestLayerProjection.file_contents)
3864     (TestLayerProjection.test): Add missing required projection
3865     parameters and tests for them
3866    
3867     * test/test_load.py (TestLayerProjection.file_contents)
3868     (TestLayerProjection.test): Add missing required projection
3869     parameters and tests for them
3870    
3871     * test/test_layer.py (TestLayer.test_base_layer): Add missing
3872     required projection parameters
3873    
3874     2003-08-29 Bernhard Herzog <[email protected]>
3875    
3876     * libraries/pyprojection/Projection.i: Use pj_get_errno_ref to
3877     access the pj_errno because directly accessing pj_errno doesn't
3878     work on windows if the proj library is in a DLL
3879    
3880     * libraries/pyprojection/Projection_wrap.c: Update from Projection.i
3881    
3882 bh 1672 2003-08-28 Bernhard Herzog <[email protected]>
3883    
3884 bh 1685 * test/test_proj.py: Import things from Thuban after calling
3885     initthuban
3886    
3887     * test/test_load.py (LoadSessionTest.filenames): New class
3888     variable with the filename attributes to normalize
3889     (LoadSessionTest.check_format): Pass self.filenames to
3890     sax_eventlist to normalize the filename attributes
3891    
3892     * test/xmlsupport.py: Add cvs keywords
3893     (SaxEventLister.__init__): New parameter filenames which indicates
3894     attributes that contain filenames
3895     (SaxEventLister.startElementNS): Normalize the filename attributes
3896     with os.path.normpath
3897     (sax_eventlist): New parameter filenames to pass through to
3898     SaxEventLister
3899    
3900     * test/test_derivedshapestore.py: Make this file callable as a
3901     program to execute the tests
3902     (TestDerivedShapeStoreExceptions.test_table_with_wrong_size): Bind
3903     the session to self.session so that it gets destroyed properly
3904    
3905     * test/test_layer.py (TestLayer.tearDown): Call the session's
3906     Destroy method
3907    
3908     * test/test_map.py (TestMapBase.tearDown): Destroy self.session
3909     too if it exists
3910     (TestMapAddLayer.test_add_layer): Bind the session to self.session
3911     so that it gets destroyed properly
3912    
3913     * test/postgissupport.py (reason_for_not_running_tests): Add a
3914     test for the existence of popen2.Popen4.
3915    
3916     * test/test_save.py (SaveSessionTest.tearDown): New. Provide a
3917     reliable way to destroy the sessions created in the test cases
3918     (SaveSessionTest.test_dbf_table): Bind the session to self.session
3919     so that it gets destroyed properly
3920     (SaveSessionTest.testLayerProjection): Bind the session to
3921     self.session so that it gets destroyed properly
3922    
3923     * test/test_session.py (UnreferencedTablesTests.tearDown): Make
3924     sure that the session is destroyed properly
3925    
3926     * test/test_shapefilestore.py: Make this callable as a program to
3927     execute the tests
3928    
3929     * test/test_scalebar.py: Remove unnecessary import of _ from
3930     Thuban
3931    
3932     * test/support.py (print_garbage_information): Call initthuban
3933     here because it may be called indirectly from test cases that test
3934     test support modules which do not use anything from thuban itself
3935     (ThubanTestProgram.runTests): Remove unnecessary debug print
3936    
3937     2003-08-28 Bernhard Herzog <[email protected]>
3938    
3939 bh 1672 * Thuban/version.py (longversion): Update to 0.9
3940    
3941     * Thuban/UI/mainwindow.py: Remove some unused imports
3942    
3943     * README: Add section about required additional software. Add date
3944     and revision CVS keywords
3945    
3946     * HOWTO-Release: Add item about the translations. Add date and
3947     revision CVs keywords and change formatting to match README a bit
3948     better
3949    
3950     * po/de.po: Update for 0.9
3951    
3952     * test/README: Tweak the wording a little because many tests are
3953     not really unittest.
3954    
3955 bh 1663 2003-08-27 Bernhard Herzog <[email protected]>
3956    
3957 bh 1665 As preparation for the 0.9 release, switch thuban files to a
3958     non-dev namespace
3959    
3960     * Thuban/Model/save.py (SessionSaver.write_session): Write files
3961     with the http://thuban.intevation.org/dtds/thuban-0.9.dtd
3962     namespace
3963    
3964     * Thuban/Model/load.py (SessionLoader.__init__): Accept the
3965     http://thuban.intevation.org/dtds/thuban-0.9.dtd namespace too
3966    
3967     * test/test_save.py (SaveSessionTest.dtd)
3968     (SaveSessionTest.testEmptySession)
3969     (SaveSessionTest.testSingleLayer)
3970     (SaveSessionTest.testLayerProjection)
3971     (SaveSessionTest.testRasterLayer)
3972     (SaveSessionTest.testClassifiedLayer)
3973     (SaveSessionTest.test_dbf_table)
3974     (SaveSessionTest.test_joined_table)
3975     (SaveSessionTest.test_save_postgis): Update for new namespace
3976    
3977     * test/test_load.py (LoadSessionTest.dtd, TestSingleLayer)
3978     (TestLayerVisibility.file_contents, TestLabels.file_contents)
3979     (TestLayerProjection.file_contents)
3980     (TestRasterLayer.file_contents, TestJoinedTable.file_contents)
3981     (TestPostGISLayer.file_contents)
3982     (TestPostGISLayerPassword.file_contents)
3983     (TestLoadError.file_contents, TestLoadError.test): Update for new
3984     namespace
3985    
3986     2003-08-27 Bernhard Herzog <[email protected]>
3987    
3988 bh 1663 Make the table interface distinguish between row ids (an integer
3989     that uniquely identifies a row) and row ordinals (a simple row
3990     count from 0 to NumRows() - 1)
3991    
3992     * Thuban/Model/postgisdb.py (PostGISTable.RowIdToOrdinal)
3993     (PostGISTable.RowOrdinalToId): New methods to conver between row
3994     ids and row ordinals
3995     (PostGISTable.ReadRowAsDict, PostGISTable.ReadValue): New keyword
3996     parameter row_is_ordinal to indicate whether the row parameter is
3997     the row id or the ordinal
3998    
3999     * Thuban/Model/transientdb.py (TransientTableBase.RowIdToOrdinal)
4000     (TransientTableBase.RowOrdinalToId)
4001     (AutoTransientTable.RowIdToOrdinal)
4002     (AutoTransientTable.RowOrdinalToId): Same new methods as in
4003     PostGISTable.
4004     (TransientTableBase.ReadRowAsDict, TransientTableBase.ReadValue)
4005     (AutoTransientTable.ReadRowAsDict, AutoTransientTable.ReadValue):
4006     Same new parameter as in PostGISTable.
4007    
4008     * Thuban/Model/table.py (DBFTable.RowIdToOrdinal)
4009     (DBFTable.RowOrdinalToId, MemoryTable.RowIdToOrdinal)
4010     (MemoryTable.RowOrdinalToId): Same new methods as in PostGISTable.
4011     (DBFTable.ReadValue, DBFTable.ReadRowAsDict)
4012     (MemoryTable.ReadValue, MemoryTable.ReadRowAsDict): Same new
4013     parameter as in PostGISTable.
4014    
4015     * Thuban/UI/tableview.py (DataTable.RowIdToOrdinal)
4016     (DataTable.RowOrdinalToId): New methods to convert between row ids
4017     and row ordinals.
4018     (TableGrid.SelectRowById): New method to select a row based on its
4019     ID as opposed to its ordinal
4020     (DataTable.GetValue, TableGrid.OnRangeSelect)
4021     (TableGrid.OnSelectCell, LayerTableGrid.select_shapes)
4022     (QueryTableFrame.OnQuery, QueryTableFrame.get_selected)
4023     (LayerTableFrame.__init__): Convert between row ids and row
4024     ordinals as appropriate
4025    
4026     * test/postgissupport.py (PostGISDatabase.__init__): Add
4027     doc-string.
4028     (PostGISDatabase.initdb): The optional third item in a tuple in
4029     tables is now a (key, value) list with additional arguments to
4030     pass to upload_shapefile
4031     (upload_shapefile): New parameter gid_offset to allow gids that
4032     are not the same as the shapeids in the shapefile
4033     (PostgreSQLServer.get_default_static_data_db): Use the new
4034     gid_offset to make the gids in landmarks 1000 higher than the
4035     shapeids in the shapefile
4036    
4037     * test/test_viewport.py
4038     (TestViewportWithPostGIS.test_find_shape_at_point): Adapt to the
4039     new shapeids in the landmarks table
4040    
4041     * test/test_transientdb.py
4042     (TestTransientTable.run_iceland_political_tests)
4043     (TestTransientTable.test_transient_joined_table): Add tests for
4044     the new table methods and new keywords arguments.
4045    
4046     * test/test_postgis_db.py
4047     (TestPostGISTable.test_read_row_as_dict_row_count_mode)
4048     (TestPostGISTable.test_read_value_row_count_mode)
4049     (TestPostGISTable.test_row_id_to_ordinal)
4050     (TestPostGISTable.test_row_oridnal_to_id): New test for the new
4051     table methods and the new arguments
4052     (TestPostGISShapestorePoint.test_shapes_in_region)
4053     (TestPostGISShapestorePoint.test_shape_raw_data)
4054     (TestPostGISShapestorePoint.test_shape_points)
4055     (TestPostGISShapestorePoint.test_shape_shapeid)
4056     (TestPostGISShapestorePoint.test_all_shapes)
4057     (TestPostGISTable.test_simple_query)
4058     (TestPostGISTable.test_simple_query)
4059     (TestPostGISTable.test_simple_query)
4060     (TestPostGISTable.test_read_value)
4061     (TestPostGISTable.test_read_row_as_dict): Adapt to the new
4062     shapeids in the landmarks table
4063    
4064     * test/test_memory_table.py
4065     (TestMemoryTable.test_read_row_as_dict_row_count_mode)
4066     (TestMemoryTable.test_read_value_row_count_mode)
4067     (TestMemoryTable.test_row_id_to_ordinal)
4068     (TestMemoryTable.test_row_oridnal_to_id): New test for the new
4069     table methods and the new arguments
4070    
4071     * test/test_dbf_table.py
4072     (TestDBFTable.test_read_row_as_dict_row_count_mode)
4073     (TestDBFTable.test_read_value_row_count_mode)
4074     (TestDBFTable.test_row_id_to_ordinal)
4075     (TestDBFTable.test_row_oridnal_to_id): New test for the new table
4076     methods and the new arguments
4077    
4078 bh 1659 2003-08-26 Bernhard Herzog <[email protected]>
4079    
4080 bh 1661 * Thuban/Model/postgisdb.py (PostGISShapeStore.BoundingBox): Use a
4081     more postgis specific but much faster method to get the bounding
4082     box
4083    
4084     2003-08-26 Bernhard Herzog <[email protected]>
4085    
4086 bh 1659 * Thuban/Model/postgisdb.py (PostGISTable.Title)
4087     (PostGISShapeStore.AllShapes): Add these missing methods.
4088     (PostGISShapeStore.ShapesInRegion): No need to raise
4089     StopIteration. We can simply return
4090    
4091     * test/test_postgis_db.py (TestPostGISTable.test_title)
4092     (TestPostGISShapestorePoint.test_all_shapes): New tests for the
4093     new methods
4094    
4095 bh 1643 2003-08-25 Bernhard Herzog <[email protected]>
4096    
4097 bh 1657 * Thuban/Model/postgisdb.py (shapetype_map): Add MUTLIPOLYGON.
4098    
4099     * test/test_postgis_db.py (PolygonTests): New class containing
4100     those tests from TestPostGISShapestorePolygon that can also be
4101     used to test MUTLIPOLYGON tables
4102     (TestPostGISShapestorePolygon): Most tests are now in PolygonTests
4103     so derive from that
4104     (TestPostGISShapestoreMultiPolygon): New class with tests for
4105     MUTLIPOLYGON tables
4106    
4107     * test/postgissupport.py (PostGISDatabase.initdb): Allow the
4108     tables argument to have tuples with three items to override the
4109     WKT type used.
4110     (PostgreSQLServer.get_default_static_data_db): Use the above to
4111     create a polygon table with MUTLIPOLYGONs
4112     (point_to_wkt, coords_to_point, polygon_to_wkt, coords_to_polygon)
4113     (arc_to_wkt, coords_to_multilinestring): Rename from *_to_wkt to
4114     coords_to*
4115     (coords_to_multipolygon): New. Convert to MUTLIPOLYGON
4116     (wkt_converter): New. Map WKT types to converters
4117     (upload_shapefile): New parameter force_wkt_type to use a
4118     different WKT type than the default
4119    
4120     2003-08-25 Bernhard Herzog <[email protected]>
4121    
4122 bh 1655 * Thuban/UI/application.py
4123     (ThubanApplication.run_db_param_dialog): New. Suitable as a
4124     db_connection_callback. Main difference is that the dialog run
4125     from this method doesn't have a parent so it can be used even when
4126     there is no main window
4127     (ThubanApplication.OpenSession): Use self.run_db_param_dialog if
4128     no db_connection_callback was given. This way the dialog pops up
4129     even when the .thuban file was given as a command line parameter.
4130    
4131     2003-08-25 Bernhard Herzog <[email protected]>
4132    
4133 bh 1653 * Thuban/UI/view.py (MapCanvas.OnLeftUp): Release the the mouse
4134     before calling MouseLeftUp. MouseLeftUp may pop up modal dialogs
4135     which leads to an effectively frozen X session because the user
4136     can only interact with the dialog but the mouse is still grabbed
4137     by the canvas.
4138     Also, call the tool's Hide method before MouseLeftUp because
4139     MouseLeftUp may change the tool's coordinates.
4140    
4141     2003-08-25 Bernhard Herzog <[email protected]>
4142    
4143 bh 1651 * Thuban/UI/application.py (ThubanApplication.OpenSession): Catch
4144     LoadCancelled exceptions and handle them by returning immediately.
4145    
4146     2003-08-25 Bernhard Herzog <[email protected]>
4147    
4148 bh 1649 GUI part of loading sessions with postgis connections which may
4149     require user interaction to get passwords or updated parameters
4150    
4151     * Thuban/UI/dbdialog.py (DBDialog): Reimplement to make it look a
4152     bit nucer and be more generic.
4153     (DBFrame.OnAdd): Adapt to new DBDialog interface
4154    
4155     * Thuban/UI/application.py (ThubanApplication.OpenSession): New
4156     optional parameter db_connection_callback which is passed to
4157     load_session.
4158    
4159     * Thuban/UI/mainwindow.py (MainWindow.run_db_param_dialog): New.
4160     Suitable as a db_connection_callback
4161     (MainWindow.OpenSession): Use self.run_db_param_dialog as the
4162     db_connection_callback of the application's OpenSession method
4163    
4164    
4165     2003-08-25 Bernhard Herzog <[email protected]>
4166    
4167 bh 1647 Basic loading of sessions containing postgis connections:
4168    
4169     * Thuban/Model/load.py (LoadError): Add doc-string
4170     (LoadCancelled): New exception class to indicate a cancelled load
4171     (SessionLoader.__init__): Add the db_connection_callback parameter
4172     which will be used by the loader to get updated parameters and a
4173     password for a database connection
4174     (SessionLoader.__init__): Add the new XML elements to the
4175     dispatchers dictionary
4176     (SessionLoader.check_attrs): Two new conversions, ascii to convert
4177     to a byte-string object and idref as a generic id reference
4178     (SessionLoader.start_dbconnection)
4179     (SessionLoader.start_dbshapesource): New. Handlers for the new XML
4180     elements
4181     (load_session): Add the db_connection_callback to pass through the
4182     SessionLoader
4183    
4184     * test/test_load.py (TestPostGISLayer, TestPostGISLayerPassword):
4185     New classes to test loading of sessions with postgis database
4186     connections.
4187    
4188     2003-08-25 Bernhard Herzog <[email protected]>
4189    
4190 bh 1645 * Thuban/UI/mainwindow.py (__ThubanVersion__): Remove this and
4191     replace it and the comment with __BuildDate__ by the Source: and
4192     Id: cvs keywords as used in the other files.
4193    
4194     2003-08-25 Bernhard Herzog <[email protected]>
4195    
4196 bh 1643 * Thuban/Model/load.py (SessionLoader.check_attrs): Raise a
4197     LoadError when a required attribute is missing. The code used to
4198     be commented out for some reason, but probably should have been
4199     active.
4200    
4201     * test/test_load.py (TestLoadError.test): Test the message in the
4202     LoadError too to make sure it really is about the missing
4203     attribute
4204    
4205 bh 1632 2003-08-22 Bernhard Herzog <[email protected]>
4206 bh 1641
4207     * test/test_save.py (SaveSessionTest.test_dbf_table)
4208     (SaveSessionTest.test_joined_table): Add XML validation tests.
4209    
4210     2003-08-22 Bernhard Herzog <[email protected]>
4211    
4212 bh 1639 Implement saving a session with a postgis connection
4213 bh 1632
4214 bh 1639 * Resources/XML/thuban-0.9.dtd (dbconnection, dbshapesource) New
4215     elements for database connections and shapestores using db
4216     connections
4217     (session): Add the dbconnections to the content model
4218    
4219     * Thuban/Model/save.py (SessionSaver.write_db_connections): New.
4220     Write the db connections
4221     (SessionSaver.write_session): Call write_db_connections to write
4222     the connection before the data sources
4223     (SessionSaver.write_data_containers): Handle postgis shapestores
4224    
4225     * test/test_save.py (SaveSessionTest.thubanids)
4226     (SaveSessionTest.thubanidrefs): Update for new DTD
4227     (SaveSessionTest.test_save_postgis): New. Test saving a session
4228     with postgis connections
4229    
4230     * Thuban/Model/postgisdb.py (PostGISTable.DBConnection)
4231     (PostGISTable.TableName): New accessor methods for the connection
4232     and table name
4233    
4234     * test/test_postgis_db.py (TestPostGISTable.test_dbconn)
4235     (TestPostGISTable.test_dbname): New methods to test the new
4236     PostGISConnection methods
4237    
4238     2003-08-22 Bernhard Herzog <[email protected]>
4239    
4240 bh 1637 * Thuban/Model/postgisdb.py (ConnectionError): New exception class
4241     for exceptions occurring when establishing a Database connection
4242     (PostGISConnection.connect): Catch psycopg.OperationalError during
4243     connects and raise ConnectionError.
4244    
4245     * test/test_postgis_db.py (TestPostgisDBExceptions): New class for
4246     tests for database exceptions
4247    
4248     2003-08-22 Bernhard Herzog <[email protected]>
4249    
4250 bh 1635 Prepare the test suite for tests with required authentication
4251    
4252     * test/postgissupport.py (PostgreSQLServer.__init__): Add instance
4253     variables with two predefined users/passwords, one for the admin
4254     and one for a non-privileged user.
4255     (PostgreSQLServer.createdb): Pass the admin name to initdb and add
4256     the non-privileged user to the database and set the admin password
4257     (PostgreSQLServer.wait_for_postmaster): Use the admin user name.
4258     Better error reporting
4259     (PostgreSQLServer.connection_params)
4260     (PostgreSQLServer.connection_string): New methods to return
4261     information about how to connect to the server
4262     (PostgreSQLServer.execute_sql): New. Convenience method to execute
4263     SQL statements
4264     (PostgreSQLServer.require_authentication): Toggle whether the
4265     server requires authentication
4266     (PostgreSQLServer.create_user, PostgreSQLServer.alter_user): New.
4267     Add or alter users
4268     (PostGISDatabase.initdb): Pass the admin name one the
4269     subprocesses' command lines. Grant select rights on
4270     geometry_columns to everybody.
4271     (upload_shapefile): Use the admin name and password when
4272     connecting. Grant select rights on the new table to everybody.
4273    
4274     * test/test_viewport.py (TestViewportWithPostGIS.setUp): Use the
4275     server's new methods to get the connection parameters.
4276    
4277     * test/test_postgis_session.py (TestSessionWithPostGIS.setUp)
4278     (TestSessionWithPostGIS.test_remove_dbconn_exception): Use the
4279     server's new methods to get the connection parameters.
4280    
4281     * test/test_postgis_db.py
4282     (TestPostGISConnection.test_gis_tables_empty)
4283     (TestPostGISConnection.test_gis_tables_non_empty)
4284     (PostGISStaticTests.setUp): Use the server's new methods to get
4285     the connection parameters.
4286    
4287     2003-08-22 Bernhard Herzog <[email protected]>
4288    
4289 bh 1632 * Thuban/UI/about.py (About.__init__): Add the psycopg version.
4290    
4291     * Thuban/version.py: Add psycopg version
4292    
4293     * Thuban/Model/postgisdb.py (psycopg_version): New. Return the
4294     version of the psycopg module
4295    
4296     2003-08-22 Bernhard Herzog <[email protected]>
4297    
4298     * Thuban/UI/dbdialog.py (DBPwdDlg): Removed because it's not used.
4299     (DBFrame.OnEdit): Removed because it's not used and wouldn't work
4300     at the moment. The functionality should probably be implemented
4301     some time, though.
4302 bh 1633 (DBFrame.OnRemove): Display a message if the connection can't be
4303     removed because it's still in use.
4304 bh 1632
4305 jan 1629 2003-08-22 Jan-Oliver Wagner <[email protected]>
4306    
4307     * Thuban/UI/about.py (About.__init__): split up the huge about
4308     text into elements/lists for easier translation. This fixes bug
4309     https://intevation.de/rt/webrt?serial_num=2058
4310     Also, made some forgotten string available for the i18n.
4311    
4312 bh 1627 2003-08-21 Bernhard Herzog <[email protected]>
4313    
4314     Make postgis support really optional including insensitive menu
4315     items.
4316    
4317     * Thuban/Model/postgisdb.py (has_postgis_support): New. Return
4318     whether the postgis is supported.
4319    
4320     * Thuban/UI/dbdialog.py: Put the psycopg import into try..except
4321     to make postgis support optional
4322    
4323     * Thuban/UI/mainwindow.py (_has_postgis_support): New. Context
4324     version of Thuban.Model.postgisdb.has_postgis_support
4325     (database_management command): Make it only sensitive if postgis
4326     is supported.
4327    
4328 jan 1623 2003-08-21 Jan-Oliver Wagner <[email protected]>
4329    
4330 jan 1626 * Doc/manual/thuban-manual.xml: Added CVS revision for rev-history.
4331     (section Adding and Removing Layers): Added text and described
4332     multi-selection.
4333     (chapter Extensions): New.
4334    
4335     2003-08-21 Jan-Oliver Wagner <[email protected]>
4336    
4337 jan 1623 * Thuban/UI/mainwindow.py (MainWindow.AddLayer): Changed dialog
4338     settings to allow multiple files to load into the map.
4339     Also reduced selection to *.shp as a default.
4340    
4341 bh 1621 2003-08-20 Bernhard Herzog <[email protected]>
4342    
4343     Add dialogs and commands to open database connections and add
4344     database layers.
4345    
4346     * Thuban/UI/mainwindow.py (MainWindow.DatabaseManagement): New
4347     method to open the database connection management dialog
4348     (MainWindow.AddDBLayer): New method to add a layer from a database
4349     (_has_dbconnections): New helper function to use for sensitivity
4350     (database_management command, layer_add_db command): New commands
4351     that call the above new methods.
4352     (main_menu): Add the new commands to the menu.
4353    
4354     * Thuban/Model/postgisdb.py (PostGISConnection.__init__)
4355     (PostGISConnection.connect): Establish the actual connection in a
4356     separate method and call it in __init__. This makes it easier to
4357     override the behavior in test cases
4358     (PostGISConnection.BriefDescription): New method to return a brief
4359     description for use in dialogs.
4360    
4361     * test/test_postgis_db.py (NonConnection): DB connection that
4362     doesn't actually connect
4363     (TestBriefDescription): New class with tests for the new
4364     BriefDescription method
4365    
4366 jan 1619 2003-08-19 Jan-Oliver Wagner <[email protected]>
4367    
4368     Moved anything from extensions to libraries.
4369    
4370     * libraries: New.
4371    
4372     * libraries/ pyprojection, pyshapelib, shapelib, thuban: New.
4373    
4374     * libraries/pyprojection/ LICENSE, MANIFEST.in, Projection.i,
4375     Projection.py, Projection_wrap.c, setup.py, swighelp.txt: These files have
4376     been moved here from thuban/extensions/pyprojection/
4377     See there in the Attic for the older history.
4378    
4379     * libraries/pyshapelib/ COPYING, ChangeLog, NEWS, README, dbflib.i,
4380     dbflib.py, dbflib_wrap.c, pyshapelib_api.h, pytest.py, setup.py,
4381     shapelib.i, shapelib.py, shapelib_wrap.c, shptreemodule.c: These files
4382     have been moved here from thuban/extensions/pyshapelib/
4383     See there in the Attic for the older history.
4384    
4385     * libraries/shapelib/ dbfopen.c, shapefil.h, shpopen.c, shptree.c: These
4386     files have been moved here from thuban/extensions/shapelib/
4387     See there in the Attic for the older history.
4388    
4389     * libraries/thuban/ bmpdataset.cpp, cpl_mfile.cpp, cpl_mfile.h,
4390     gdalwarp.cpp, wxproj.cpp: These files have been moved here from
4391     thuban/extensions/thuban/
4392     See there in the Attic for the older history.
4393    
4394     * MANIFEST.in, setup.cfg, setup.py: renamed extensions to libraries.
4395    
4396     * extensions/thuban/ bmpdataset.cpp, cpl_mfile.cpp, cpl_mfile.h,
4397     gdalwarp.cpp, wxproj.cpp: Moved to libraries/thuban.
4398    
4399     * extensions/shapelib/ dbfopen.c, shapefil.h, shpopen.c, shptree.c:
4400     Moved to libraries/shapelib.
4401    
4402     * extensions/pyshapelib/ COPYING, NEWS, dbflib.py, pytest.py,
4403     shapelib.py, README, dbflib_wrap.c, setup.py, shapelib_wrap.c,
4404     ChangeLog, dbflib.i, pyshapelib_api.h, shapelib.i, shptreemodule.c:
4405     Moved to libraries/pyshapelib.
4406    
4407     * extensions/pyprojection/ MANIFEST.in, Projection.py, setup.py,
4408     LICENSE, Projection.i, Projection_wrap.c, swighelp.txt:
4409     Moved to libraries/pyprojection.
4410    
4411     * extensions/ pyprojection, pyshapelib, shapelib, thuban: Removed.
4412    
4413     * extensions: Removed.
4414    
4415 bh 1606 2003-08-19 Bernhard Herzog <[email protected]>
4416    
4417 bh 1609 * test/test_viewport.py (ViewPortTest): We don't use the
4418     facilities of FileTestMixin so don't derive from it.
4419     (TestViewportWithPostGIS): New class with tests for using a
4420     viewport on a map with postgis layers.
4421    
4422     2003-08-19 Bernhard Herzog <[email protected]>
4423    
4424     Add the db connection management to the session.
4425    
4426     * Thuban/Model/session.py (Session.__init__): New instance
4427     variable db_connections
4428     (Session.AddDBConnection, Session.DBConnections)
4429     (Session.HasDBConnections, Session.CanRemoveDBConnection)
4430     (Session.RemoveDBConnection): New methods to manage and query the
4431     db connections managed by the session
4432     (Session.OpenDBShapeStore): New method to open a shapestore from a
4433     db connection
4434    
4435     * Thuban/Model/messages.py (DBCONN_REMOVED, DBCONN_ADDED): New
4436     messages for the db connection handling in the session
4437    
4438     * test/test_postgis_session.py: New. test cases for the session's
4439     db connection handling with postgis connections
4440    
4441     2003-08-19 Bernhard Herzog <[email protected]>
4442    
4443 bh 1606 Add very basic postgis database support and the corresponding test
4444     cases. The test cases require a PostgreSQL + postgis installation
4445     but no existing database. The database will be created
4446     automatically by the test cases
4447    
4448     * test/README: Add note about skipped tests and the requirements
4449     of the postgis tests.
4450    
4451     * Thuban/Model/postgisdb.py: New. Basic postgis database support.
4452    
4453     * test/test_postgis_db.py: New. Test cases for the postgis
4454     support.
4455    
4456     * Thuban/Model/wellknowntext.py: New. Parser for well-known-text
4457     format
4458    
4459     * test/test_wellknowntext.py: New. Test cases for the
4460     wellknowntext parser
4461    
4462     * test/postgissupport.py: New. Support module for tests involving
4463     a postgis database.
4464    
4465     * test/support.py (execute_as_testsuite): Shut down the postmaster
4466     if it's still running after the tests
4467    
4468     * Thuban/Model/data.py (RAW_WKT): New constant for raw data in
4469     well known text format
4470    
4471 jan 1604 2003-08-19 Jan-Oliver Wagner <[email protected]>
4472    
4473     * Examples/simple_extensions/hello_world.py: New. Raises a Hello World
4474     message dialog.
4475    
4476 bh 1600 2003-08-18 Bernhard Herzog <[email protected]>
4477    
4478 bh 1602 * test/support.py (ThubanTestResult.printErrors): Indent the
4479     reason for the skips in the output to make it a bit more readable.
4480     (execute_as_testsuite): New helper function to run a test suite
4481     and print some more information.
4482     (run_tests): Use execute_as_testsuite to run the tests
4483    
4484     * test/runtests.py (main): Use execute_as_testsuite to run the
4485     tests
4486    
4487     2003-08-18 Bernhard Herzog <[email protected]>
4488    
4489 bh 1600 Fix some bugs in Thuban and the test suite that were uncovered by
4490     changes introduced in Python 2.3:
4491    
4492     * Thuban/Model/table.py (DBFTable.__init__): Make sure the
4493     filename is an absolute name
4494    
4495     * Thuban/Model/layer.py (RasterLayer.__init__): Make sure the
4496     filename is an absolute name
4497    
4498     * test/test_save.py (SaveSessionTest.testRasterLayer): Use a
4499     unique filename to save to and use the correct relative filename
4500     in the expected output.
4501     (SaveSessionTest.test_dbf_table): Use the correct relative
4502     filename in the expected output.
4503    
4504     * test/test_layer.py (TestLayer.test_raster_layer): Update the
4505     test to check whether the filename is absolute.
4506    
4507 jan 1596 2003-08-18 Jan-Oliver Wagner <[email protected]>
4508    
4509     * Thuban/UI/about.py (About.__init__): Added Silke Reimer.
4510    
4511 bh 1586 2003-08-15 Bernhard Herzog <[email protected]>
4512    
4513 bh 1594 Change the way shapes are returned by a shape store. The
4514     ShapesInRegion method returns an iterator over actual shape
4515     objects instead of a list of shape ids.
4516    
4517     * Thuban/Model/data.py (ShapefileShape.ShapeID): New. Return shape
4518     id.
4519     (ShapefileStore.ShapesInRegion): Return an iterator over the
4520     shapes which yields shape objects instead of returning a list of
4521     shape ids
4522     (ShapefileStore.AllShapes): New. Return an iterator over all
4523     shapes in the shape store
4524     (DerivedShapeStore.AllShapes): New. Like in ShapefileStore
4525    
4526     * Thuban/Model/layer.py (Layer.ShapesInRegion): Update
4527     doc-string.
4528    
4529     * Thuban/UI/baserenderer.py
4530     (BaseRenderer.layer_ids, BaseRenderer.layer_shapes): Rename to
4531     layer_shapes and make it return an iterator containg shapes
4532     instead of a list of ids.
4533     (BaseRenderer.draw_shape_layer): Update doc-string; Adapt to
4534     layer_shapes() change
4535    
4536     * Thuban/UI/renderer.py (ScreenRenderer.layer_ids)
4537     (ScreenRenderer.layer_shapes): Rename as in BaseRenderer
4538    
4539     * Thuban/UI/viewport.py (ViewPort._find_shape_in_layer): Adapt to
4540     changes in the ShapesInRegion return value.
4541     (ViewPort._get_hit_tester): Remove commented out code
4542    
4543     * test/mockgeo.py (SimpleShapeStore.ShapesInRegion): Adapt to the
4544     new return value.
4545     (SimpleShapeStore.AllShapes): New. Implement this method too.
4546    
4547     * test/test_layer.py (TestLayer.test_arc_layer)
4548     (TestLayer.test_polygon_layer, TestLayer.test_point_layer)
4549     (TestLayer.test_point_layer_with_projection)
4550     (TestLayer.test_derived_store): Adapt to changes in the
4551     ShapesInRegion return value.
4552    
4553     * test/test_shapefilestore.py
4554     (TestShapefileStoreArc.test_shapes_in_region)
4555     (TestShapefileStorePolygon.test_shapes_in_region)
4556     (TestShapefileStorePoint.test_shapes_in_region): Adapt to changes
4557     in the ShapesInRegion return value.
4558     (TestShapefileStorePoint.test_all_shapes)
4559     (TestShapefileStoreArc.test_shape_shapeid): New tests for the new
4560     methods
4561    
4562     * test/test_derivedshapestore.py
4563     (TestDerivedShapeStore.test_shapes_in_region): Adapt to changes in
4564     the ShapesInRegion return value.
4565     (TestDerivedShapeStore.test_all_shapes)
4566     (TestDerivedShapeStore.test_shape_shapeid): New tests for the new
4567     methods
4568    
4569     2003-08-15 Bernhard Herzog <[email protected]>
4570    
4571 bh 1592 Make the renderers deal correctly with raw vs. python level
4572     representation of shape geometries
4573    
4574     * Thuban/UI/baserenderer.py (BaseRenderer.low_level_renderer):
4575     Return a flag useraw in addition to the callable and the parameter
4576     to indicate whether the callable can deal with the raw shape data
4577     or uses the higher level python lists of coordinates. The callable
4578     now should accept either the raw data or the return value of the
4579     shape's Points() method.
4580     (BaseRenderer.draw_shape_layer): Adapt to the low_level_renderer
4581     change
4582     (BaseRenderer.projected_points): Instead of the shape id use the
4583     points list as parameter.
4584     (BaseRenderer.draw_polygon_shape, BaseRenderer.draw_arc_shape)
4585     (BaseRenderer.draw_point_shape): Adapt to projected_points()
4586     change and accept the points list as parameter instead of the
4587     shape id.
4588    
4589     * Thuban/UI/renderer.py (MapRenderer.low_level_renderer): Return
4590     the useraw flag as required by the BaseRenderer
4591     (ScreenRenderer.draw_shape_layer): Adapt to low-level renderer
4592     changes.
4593    
4594     * test/test_baserenderer.py
4595     (TestBaseRenderer.test_point_with_classification): New test for
4596     rendering a map with classifications.
4597    
4598     2003-08-15 Bernhard Herzog <[email protected]>
4599    
4600 bh 1590 * Thuban/UI/viewport.py (ViewPort.find_shape_at)
4601     (ViewPort._find_shape_in_layer, ViewPort._find_shape_in_layer)
4602     (ViewPort._get_hit_tester, ViewPort.projected_points)
4603     (ViewPort._hit_point, ViewPort._hit_arc, ViewPort._hit_polygon)
4604     (ViewPort._find_label_at): Split the find_shape_at method into
4605     several new methods and use the functions in the hit-test module.
4606    
4607     * Thuban/UI/hittest.py: New module with Python-level hit-testing
4608     functions
4609    
4610     * test/test_hittest.py: New. Test for the new hittest module
4611    
4612     2003-08-15 Bernhard Herzog <[email protected]>
4613    
4614 bh 1588 * Thuban/Model/layer.py (Layer.ShapesInRegion): Apply the layer
4615     projection to all corners of the bounding box to get a better
4616     approximation of the projected bounding box
4617    
4618     * test/test_layer.py (TestLayer.test_point_layer_with_projection):
4619     New. Test coordinate handling of a layer with a projection.
4620     Catches the bug fixed in Layer.ShapesInRegion
4621    
4622     2003-08-15 Bernhard Herzog <[email protected]>
4623    
4624 bh 1586 Move some of the mock objects in test_baserenderer into their own
4625     module so they can easily be used from other tests
4626    
4627     * test/mockgeo.py: New test helper module with some mock objects
4628     for geometry related things like shapes, shapestores and
4629     projections.
4630    
4631     * test/test_mockgeo.py: New. Tests for the new helper module
4632    
4633     * test/test_baserenderer.py: Some of the mock-objects are in
4634     mockgeo now.
4635    
4636 jan 1584 2003-08-12 Jan-Oliver Wagner <[email protected]>
4637    
4638     * Thuban/UI/about.py (About.__init__): Added Björn Broscheit.
4639    
4640 bh 1580 2003-08-12 Bernhard Herzog <[email protected]>
4641    
4642 bh 1582 * po/de.po: New. German translations by Bjoern Broscheit
4643    
4644     2003-08-12 Bernhard Herzog <[email protected]>
4645    
4646 bh 1580 * Thuban/UI/projdialog.py (UnknownProjPanel._DoLayout): Translated
4647     strings have to be one string literal.
4648    
4649 bh 1573 2003-08-11 Bernhard Herzog <[email protected]>
4650    
4651 bh 1578 * test/support.py (FloatComparisonMixin.assertPointListEquals):
4652     New. This method was used in various derived classes, but it's
4653     better to have it here.
4654    
4655     * test/test_shapefilestore.py
4656     (ShapefileStoreTests.assertPointListEquals): Removed. It's now in
4657     FloatComparisonMixin
4658    
4659     * test/test_layer.py (TestLayer.assertPointListEquals): Removed.
4660     It's now in FloatComparisonMixin
4661    
4662     * test/test_derivedshapestore.py
4663     (TestDerivedShapeStore.assertPointListEquals): Removed. It's now
4664     in FloatComparisonMixin
4665    
4666     2003-08-11 Bernhard Herzog <[email protected]>
4667    
4668 bh 1573 * Thuban/UI/join.py (JoinDialog.OnJoin): Add missing space to
4669     error message
4670    
4671 jan 1569 2003-08-08 Jan-Oliver Wagner <[email protected]>
4672    
4673 jan 1571 * Doc/manual/thuban-manual.xml: Now use authorgroup. Added revhistory
4674     with version number.
4675     Changed title to reflect version number of Thuban.
4676    
4677     2003-08-08 Jan-Oliver Wagner <[email protected]>
4678    
4679 jan 1569 * Thuban/UI/about.py (About.__init__): Reworked the hall of fame. Now
4680     the list corresponds to the "About" web page.
4681    
4682 bh 1567 2003-08-08 Bernhard Herzog <[email protected]>
4683    
4684     * Thuban/UI/projdialog.py (UTMProposeZoneDialog.dialogLayout):
4685     Make sure translated strings are recognized as one string literal.
4686    
4687     * Thuban/UI/proj4dialog.py (UTMProposeZoneDialog.dialogLayout):
4688     Make sure translated strings are recognized as one string literal.
4689    
4690     * Thuban/UI/classgen.py (ClassGenDialog.OnOK): Make sure
4691     translated strings are recognized as one string literal.
4692    
4693     * Thuban/UI/application.py (ThubanApplication.OpenSession): Make
4694     sure translated strings are recognized as one string literal.
4695    
4696 bh 1556 2003-08-07 Bernhard Herzog <[email protected]>
4697    
4698 bh 1565 * Thuban/Model/data.py (DerivedShapeStore.RawShapeFormat): New.
4699     Simply delegates to the original shapestore.
4700    
4701     * test/test_derivedshapestore.py
4702     (TestDerivedShapeStore.test_raw_format): New. Test case for
4703     DerivedShapeStore.RawShapeFormat
4704    
4705     2003-08-07 Bernhard Herzog <[email protected]>
4706    
4707 bh 1561 Add raw data interface to shape objects.
4708    
4709     * Thuban/Model/data.py (ShapefileShape, Shape): Rname the shape
4710     class to ShapefileShape which now holds shapefile specific
4711     information.
4712     (ShapefileShape.compute_bbox): Simplified to not cache any
4713     information. The way this method is used that shouldn't matter
4714     performance wise.
4715     (ShapefileShape.RawData): New. Return the shapeid which is the raw
4716     data format for shapes from shapefiles.
4717     (ShapefileStore.RawShapeFormat): New. Return the raw datatype used
4718     in the shape objects returned by a shapestore. For a
4719     ShapefileStore this is always RAW_SHAPEFILE.
4720     (RAW_PYTHON, RAW_SHAPEFILE): Constants for the RawShapeFormat
4721     method.
4722    
4723     * test/test_shapefilestore.py
4724     (TestShapefileStore.test_raw_format): New test to test the raw
4725     format feature of shapes.
4726    
4727 bh 1560 * Thuban/Model/layer.py: Remove the unused import of Shape from
4728     data. It was only there for interface compatibility but it's not
4729 bh 1561 used inside of Thuban and the generic Shape class has gone away.
4730 bh 1560
4731 bh 1563 * Thuban/UI/renderer.py (MapRenderer.low_level_renderer): Check
4732     the raw data format and only use an optimized version of its a
4733     shapefile.
4734    
4735 bh 1561 2003-08-07 Bernhard Herzog <[email protected]>
4736    
4737 bh 1559 * test/test_baserenderer.py (SimpleShape): Shape class for the
4738     tests.
4739     (SimpleShapeStore.Shape): Use SimpleShape instead of
4740     Thuban.Model.data.Shape to make the tests independed of the coming
4741     changes.
4742    
4743     2003-08-07 Bernhard Herzog <[email protected]>
4744    
4745 bh 1556 * test/support.py (SkipTest, ThubanTestResult, ThubanTestRunner)
4746     (ThubanTestProgram): New classes that extend the respective
4747     classes from unittest. These new version support skipping tests
4748     under certain expected conditions. In the Thuban test suite we
4749     uses this for tests that require the optional gdal support.
4750     (run_tests): Use ThubanTestProgram instead of the unittest.main()
4751    
4752     * test/runtests.py (main): Use the new ThubanTestRunner instead of
4753     the normal one from unittest
4754    
4755     * test/test_layer.py (TestLayer.test_raster_layer): If this test
4756     is not run because gdal support isn't available report this to the
4757     runner.
4758    
4759     * test/test_baserenderer.py
4760     (TestBaseRenderer.test_raster_no_projection): Do not run this test
4761     if gdal support isn't available and report this to the runner.
4762    
4763 bh 1553 2003-08-06 Bernhard Herzog <[email protected]>
4764    
4765     Rearrange the renderers a bit, partly in preparation for changes
4766     required for the postgis merge, partly to make it more testable.
4767     Also make the representation of coordinates in Shapes more
4768     consistent.
4769    
4770     * Thuban/UI/renderer.py (MapRenderer): Most of the code/methods in
4771     this class is now in BaseRenderer. This class is now practically
4772     only a specialization of BaseRenderer for rendering to an actual
4773     wx DC.
4774     (ScreenRenderer.draw_shape_layer): Use self.low_level_renderer()
4775     to get the shapetype specific rendering functions.
4776    
4777     * Thuban/UI/baserenderer.py: New file with the basic rendering
4778     logic. The code in this file is completely independend of wx.
4779     (BaseRenderer): Class with the basic rendering logic
4780    
4781     * test/test_baserenderer.py: New. Test cases for BaseRenderer
4782    
4783     * Thuban/UI/view.py (MapCanvas.__init__): New instance variable
4784     error_on_redraw to guard agains endless loops and stack overflows
4785     when there's a bug in the rendering code that raises exceptions.
4786     (MapCanvas.OnIdle, MapCanvas._do_redraw): Split the actual
4787     rendering into a separate method _do_redraw so that error handling
4788     is a bit easier. When an exception occurs, set error_on_redraw to
4789     true. When it's true on entry to OnIdle do nothing and return
4790     immediately.
4791    
4792     * Thuban/Model/data.py (ShapefileStore.Shape): For consistency, a
4793     Shape object will always have the coordinates as a list of list of
4794     coordinate pairs (tuples).
4795     (Shape.compute_bbox): Adapt to new representation.
4796    
4797     * Thuban/UI/viewport.py (ViewPort.find_shape_at)
4798     (ViewPort.LabelShapeAt): Adapt to new coordinate representation in
4799     Shape objects.
4800    
4801     * test/test_shapefilestore.py
4802     (ShapefileStoreTests.assertFloatTuplesEqual)
4803     (ShapefileStoreTests.assertPointListEquals): Rename to
4804     assertPointListEquals and change purpose to checking equality of
4805     the lists returned by Shape.Points().
4806     (TestShapefileStoreArc.test_shape)
4807     (TestShapefileStorePolygon.test_shape)
4808     (TestShapefileStorePoint.test_shape): Use the new
4809     assertPointListEquals instead of assertFloatTuplesEqual
4810    
4811     * test/test_layer.py (TestLayer.assertFloatTuplesEqual)
4812     (TestLayer.assertPointListEquals): Rename to assertPointListEquals
4813     and change purpose to checking equality of the lists returned by
4814     Shape.Points().
4815     (TestLayer.test_arc_layer, TestLayer.test_arc_layer)
4816     (TestLayer.test_polygon_layer, TestLayer.test_point_layer)
4817     (TestLayer.test_derived_store): Use the new assertPointListEquals
4818     instead of assertFloatTuplesEqual
4819    
4820     * test/test_derivedshapestore.py
4821     (TestDerivedShapeStore.assertFloatTuplesEqual)
4822     (TestDerivedShapeStore.assertPointListEquals): Rename to
4823     assertPointListEquals and change purpose to checking equality of
4824     the lists returned by Shape.Points().
4825     (TestDerivedShapeStore.test_shape): Use the new
4826     assertPointListEquals instead of assertFloatTuplesEqual
4827    
4828 jan 1550 2003-08-06 Jan-Oliver Wagner <[email protected]>
4829    
4830     * Thuban/UI/projdialog.py (UTMPanel._OnPropose): Added test for
4831     a bounding box. A dialog is raised in case, no bounding box
4832     is found. This fixes bug #2043:
4833     https://intevation.de/rt/webrt?serial_num=2043
4834    
4835 bh 1548 2003-08-05 Bernhard Herzog <[email protected]>
4836    
4837     * Thuban/Model/color.py (Color.__repr__): Make the repr of a color
4838     object look like a Color instantiation. Formerly it looked like a
4839     tuple.
4840    
4841     * test/test_color.py (TestColor.test_repr)
4842     (TestColor.test_equality, TestColor.test_inequality): New. test
4843     some more apects of the Color class
4844     (TestTransparent.test_repr, TestTransparent.test_hex)
4845     (TestTransparent.test_equality): New. Test cases for the
4846     Transparent object.
4847    
4848 jan 1545 2003-08-04 Jan-Oliver Wagner <[email protected]>
4849    
4850     * Doc/manual/thuban-manual.xml: a number of small improvements.
4851     The resulting file is the version submitted for GREAT-ER II.
4852    
4853 bh 1540 2003-08-01 Bernhard Herzog <[email protected]>
4854    
4855 bh 1543 * Thuban/UI/resource.py, Thuban/UI/projdialog.py,
4856     Thuban/UI/join.py, Thuban/UI/classgen.py, Thuban/UI/about.py,
4857     Thuban/Model/resource.py: Insert cvs keywords and doc-strings.
4858    
4859     * Thuban/UI/common.py: Insert cvs keywords and doc-strings.
4860     (Color2wxColour, wxColour2Color, ThubanBeginBusyCursor)
4861     (ThubanEndBusyCursor): Add doc-strings
4862    
4863     2003-08-01 Bernhard Herzog <[email protected]>
4864    
4865 bh 1540 First step towards PostGIS integration. More abstraction by movin
4866     more code from the layer to the shapestore. More methods of the
4867     layer are now simply delegated to the equivalent method of the
4868     shapestore. The SHAPETYPE_* constants are now in data not in
4869     layer.
4870    
4871     * Thuban/Model/data.py (SHAPETYPE_POLYGON, SHAPETYPE_ARC)
4872     (SHAPETYPE_POINT, Shape): Move these constants and classes from
4873     layer.py to data.py
4874     (ShapefileStore.__init__): More Initialization for the new methods
4875     and functionality.
4876     (ShapefileStore.ShapeType, ShapefileStore.NumShapes)
4877     (ShapefileStore.BoundingBox, ShapefileStore.ShapesInRegion)
4878     (ShapefileStore.Shape): New methods that were formerly implemented
4879     in the layer.
4880     (DerivedShapeStore.Shape, DerivedShapeStore.ShapesInRegion)
4881     (DerivedShapeStore.ShapeType, DerivedShapeStore.NumShapes)
4882     (DerivedShapeStore.BoundingBox): New. DerivedShapeStore
4883     equivalents of the new shape methods. These versions are simply
4884     delegated to the original shapstore.
4885    
4886     * Thuban/Model/layer.py (SHAPETYPE_POLYGON, SHAPETYPE_ARC)
4887     (SHAPETYPE_POINT, Shape): Removed. They're now in data.py
4888     (Layer.SetShapeStore): Removed the initializatin of instance
4889     variables that were needed for the stuff that's now in
4890     ShapefileStore
4891     (Layer.BoundingBox, Layer.NumShapes, Layer.ShapeType)
4892     (Layer.Shape, Layer.ShapesInRegion): Simply delegate to the
4893     shapestore.
4894    
4895     * Thuban/UI/classifier.py, Thuban/UI/renderer.py,
4896     Thuban/UI/viewport.py: Import the SHAPETYPE_* constants from data
4897     instead of layer.
4898    
4899     * test/test_shapefilestore.py: New. Tests for ShapefileStore.
4900    
4901     * test/test_derivedshapestore.py: New. Tests for DerivedShapeStore.
4902    
4903     * test/test_layer.py: Import the SHAPETYPE_* constants from data
4904     instead of layer.
4905     (TestLayer.test_derived_store): Remove the test for the exception
4906     when instantiating the DerivedShapeStore with an incompatible
4907     table which is now in test_derivedshapestore.py. Add some more
4908     tests of the layer methods to determine whether they work for a
4909     DerivedShapeStore as well.
4910    
4911 jonathan 1534 2003-07-31 Jonathan Coles <[email protected]>
4912    
4913     * Doc/manual/thuban-manual.xml: Fix the list of required packages
4914     by just listing the name and where they can be found.
4915    
4916 frank 1532 2003-07-31 Frank Koormann <[email protected]>
4917    
4918     * Doc/manual/thuban-manual.xml:
4919     Changed the screenshot elements to figure.
4920     Changed some variablelist elements to itemizedlist.
4921     Added section on GDAL formats.
4922    
4923 jonathan 1531 2003-07-31 Jonathan Coles <[email protected]>
4924    
4925     * Doc/manual/thuban-manual.xml: Added a few sentences about
4926     the Fix Border Color option when generating classes.
4927    
4928 jonathan 1529 2003-07-30 Jonathan Coles <[email protected]>
4929    
4930     * Thuban/Model/classgen.py: Add docstrings. Rename specific
4931     Ramp instances to use lower_case_style.
4932    
4933     * Thuban/UI/classgen.py: Use renamed Ramp instances.
4934    
4935     * Thuban/UI/classifier.py: Add docstrings.
4936    
4937     * Thuban/UI/dock.py: Add docstrings.
4938    
4939     * test/test_classgen.py: Use renamed Ramp instances.
4940    
4941 bh 1522 2003-07-30 Bernhard Herzog <[email protected]>
4942    
4943 bh 1524 * Thuban/Lib/connector.py (QueueingPublisher): Removed. This class
4944     was never used in Thuban.
4945    
4946     2003-07-30 Bernhard Herzog <[email protected]>
4947    
4948 bh 1522 * Thuban/UI/join.py (JoinDialog.__init__): Use the table's Title()
4949     method directly instead of going through the transient_table
4950     method. This faster because transient_table may force the copy of
4951     a DBF file into the transient database and setting a table's title
4952     doesnm't affect the title of the associated transient table, so
4953     this fixes RT #2042
4954    
4955     * Thuban/UI/main.py (__version__): Don't import the already
4956     removed show_exception_dialog.
4957    
4958 jonathan 1517 2003-07-29 Jonathan Coles <[email protected]>
4959    
4960 jonathan 1519 * Thuban/UI/application.py (ThubanApplication.ShowExceptionDialog):
4961     Put back this method and remove the equivalent function since we
4962     are setting the exception hook from within this class (OnInit).
4963    
4964     2003-07-29 Jonathan Coles <[email protected]>
4965    
4966 jonathan 1517 * Doc/manual/images/5_2_custom_ramp.png,
4967     Doc/manual/images/5_2_quantiles.png,
4968     Doc/manual/images/5_2_uniform_dist.png,
4969     Doc/manual/images/5_2_unique_values.png,
4970     Doc/manual/images/8_int_error.png: New screen shots.
4971    
4972     * Doc/manual/thuban-manual.xml: Fixed typos and wording, clarified
4973     some points, and added more screen shots.
4974    
4975 bh 1512 2003-07-29 Bernhard Herzog <[email protected]>
4976    
4977 bh 1516 * Thuban/Model/data.py: Remove the now unused import of warnings
4978    
4979     2003-07-29 Bernhard Herzog <[email protected]>
4980    
4981 bh 1514 * Thuban/Model/data.py (SimpleStore): Removed. This class has been
4982     deprecated since before the 0.8 release and isn't used in Thuban
4983     itself anymore.
4984    
4985 bh 1512 * Thuban/Model/transientdb.py: Remove some unnecessary imports
4986    
4987 jonathan 1503 2003-07-29 Jonathan Coles <[email protected]>
4988 jonathan 1506
4989     * Thuban/UI/application.py (ThubanApplication.OnInit): set the
4990     python exception hook here so that we are sure to catch any
4991     Thuban exception that happen during initialization.
4992    
4993     * Thuban/UI/main.py (main): Don't set the exception hook here,
4994     it will get set in ThubanApplication.OnInit.
4995    
4996     2003-07-29 Jonathan Coles <[email protected]>
4997 jonathan 1503
4998     * Thuban/UI/application.py (ThubanApplication.ShowExceptionDialog):
4999     Removed and called it show_exception_dialog() so that the exception
5000     handler can be set before the class is created.
5001    
5002     * Thuban/UI/main.py (main): Install the exception handler before
5003     a ThubanApplication is created.
5004    
5005 bh 1500 2003-07-29 Bernhard Herzog <[email protected]>
5006    
5007     * po/it.po: New. Italian translation by Maurizio Napolitano
5008    
5009     * po/ru.po: New. Russian translation by Alex Shevlakov
5010    
5011 frank 1497 2003-07-29 Frank Koormann <[email protected]>
5012    
5013 frank 1508 * Doc/manual/thuban-manual.xml: Extended section on supported
5014     projections.
5015    
5016     2003-07-29 Frank Koormann <[email protected]>
5017    
5018 frank 1497 * Doc/manual/thuban-manual.xml: gaspell-checked.
5019    
5020 jonathan 1493 2003-07-29 Jonathan Coles <[email protected]>
5021    
5022 jonathan 1495 * Doc/manual/images/3_5_legend.png: Added border to improve look
5023     on white background.
5024    
5025     2003-07-29 Jonathan Coles <[email protected]>
5026    
5027 jonathan 1493 * Doc/manual/thuban-manual.xml: Fixed grammar and typos. Added
5028     descriptions for the legend toolbar.
5029    
5030     * Doc/manual/images/4_2_raster_layer_properties.png: Removed
5031     cursor from dialog box.
5032    
5033     2003-07-28 Jonathan Coles <[email protected]>
5034    
5035     * Doc/manual/thuban-manual.xml: More screenshots and more chapters.
5036    
5037     * Doc/manual/images/2_4_session_tree.png,
5038     Doc/manual/images/3_5_legend.png, Doc/manual/images/3_rename_map.png,
5039     Doc/manual/images/4_2_layer_properties.png,
5040     Doc/manual/images/4_2_raster_layer_properties.png,
5041     Doc/manual/images/5_3_genclass.png,
5042     Doc/manual/images/5_classification.png,
5043     Doc/manual/images/6_projection.png,
5044     Doc/manual/images/7_1_table_view.png,
5045     Doc/manual/images/7_2_5_join.png: New screenshots.
5046    
5047     2003-07-24 Jonathan Coles <[email protected]>
5048    
5049     * Doc/manual/thuban-manual.xml: Chapter on Projection Management.
5050    
5051     2003-07-24 Jonathan Coles <[email protected]>
5052    
5053     * Doc/manual/thuban-manual.xml: Added EPS images and wrote
5054     chapter on Layer Management.
5055    
5056     * Doc/manual/Makefile: New. Makefile to generate all formats for the
5057     manual and images.
5058    
5059 bh 1483 2003-07-24 Bernhard Herzog <[email protected]>
5060    
5061     * Thuban/Model/range.py, Thuban/version.py: Remove the #! line as
5062     it annoys lintian which warns about these files not being
5063 jan 1767 executable. The #! isn't necessary here since if you absolutely
5064 bh 1483 must execute them you can always say "python <filename>".
5065    
5066     * Thuban/UI/renderer.py (ScreenRenderer.draw_shape_layer): Remove
5067     superfluous code to set brush and pen for point shapes
5068    
5069     * Thuban/UI/viewport.py: Remove commented out code that wouldn't
5070     belong in viewport anyway
5071    
5072 frank 1479 2003-07-24 Frank Koormann <[email protected]>
5073    
5074     * Doc/manual/thuban-manual.xml: Added section on table management.
5075    
5076 bh 1477 2003-07-24 Bernhard Herzog <[email protected]>
5077    
5078     * test/runtests.py (main): Recognize the long "verbose" option
5079     correctly.
5080    
5081 jonathan 1470 2003-07-22 Jonathan Coles <[email protected]>
5082    
5083     * Doc/manual/thuban-manual.xml: Continue to write first revision
5084     of the manual.
5085    
5086     * Thuban/UI/renderer.py (MapRenderer.render_map): Wrap method
5087     with Begin/EndDrawing() calls to ensure we aren't doing to
5088     many updates to the dc during rendering.
5089     (ScreenRenderer.draw_shape_layer): self.draw_point_shape takes
5090     a pen and brush argument so they need to be passed to the function.
5091    
5092     * Thuban/UI/viewport.py (ViewPort.calc_min_max_scales): New.
5093     Calculates the minimum and maximum scale values. Factored out
5094     of set_view_transform so that it could be used to zoom all the
5095     way into a single point.
5096     (ViewPort.set_view_transform): Call calc_min_max_scales().
5097     (ViewPort.FitSelectedToWindow): Zoom to the maximum scale
5098     if only a single point is selected.
5099    
5100     * Doc/manual/images/1_2_legend_close.png,
5101     Doc/manual/images/1_2_legend_dock.png,
5102     Doc/manual/images/1_2_mainwindow.png,
5103     Doc/manual/images/1_2_mainwindow.ps,
5104     Doc/manual/images/1_2_mainwindow.sk,
5105     Doc/manual/images/3_2_fullextent.png,
5106     Doc/manual/images/3_2_fulllayerextent.png,
5107     Doc/manual/images/3_2_fullshapeextent.png,
5108     Doc/manual/images/3_2_pan.png,
5109     Doc/manual/images/3_2_zoomin.png,
5110     Doc/manual/images/3_2_zoomout.png,
5111     Doc/manual/images/3_3_identify.png,
5112     Doc/manual/images/3_3_label.png,
5113     Doc/manual/images/3_5_invisible.png,
5114     Doc/manual/images/3_5_movedown.png,
5115     Doc/manual/images/3_5_moveup.png,
5116     Doc/manual/images/3_5_props.png,
5117     Doc/manual/images/3_5_tobottom.png,
5118     Doc/manual/images/3_5_totop.png,
5119     Doc/manual/images/3_5_visible.png: New. Images for the documentation.
5120    
5121 bh 1451 2003-07-18 Bernhard Herzog <[email protected]>
5122    
5123 bh 1465 * Thuban/UI/messages.py (MAP_REPLACED): New message.
5124    
5125     * Thuban/UI/viewport.py (ViewPort.SetMap): Issue MAP_REPLACED
5126     after the new map has been assigned
5127    
5128     * Thuban/UI/mainwindow.py (MainWindow.delegated_messages):
5129     Delegate MAP_REPLACED to the canvas too
5130     (MainWindow.prepare_new_session): Removed. Thanks to the new
5131     MAP_REPLACED message it's no longer needed
5132     (MainWindow.OpenSession, MainWindow.NewSession):
5133     prepare_new_session has been removed.
5134    
5135     * Thuban/UI/classifier.py (Classifier.__init__): Subscribe to
5136     MAP_REPLACED so that we can close the dialog if a new map is set.
5137     (Classifier.unsubscribe_messages): Unsubscribe from MAP_REPLACED
5138     (Classifier.map_replaced): Handle MAP_REPLACED by closing the
5139     dialog
5140    
5141     * test/test_viewport.py (SimpleViewPortTest)
5142     (SimpleViewPortTest.test_default_size): Add doc-strings
5143     (ViewPortTest.setUp): Bind map to self.map so we can use it in
5144     tests. Subscribe to MAP_REPLACED messages too.
5145     (ViewPortTest.tearDown): No need to explicitly unsubscribe
5146     (ViewPortTest.test_set_map): New test for the SetMap method.
5147    
5148     2003-07-18 Bernhard Herzog <[email protected]>
5149    
5150 bh 1463 * test/test_viewport.py (SimpleViewPortTest.test_default_size):
5151     Move this test from ViewPortTest.setUp to this new separate test
5152     case. setUp is not the place for the actual tests.
5153     (ViewPortTest.test_inital_settings, ViewPortTest.setUp): Move some
5154     more of the test from setUp to the new test test_inital_settings.
5155     (ViewPortTest.test_win_to_proj, ViewPortTest.test_proj_to_win)
5156     (ViewPortTest.test_proj_conv): Split test_proj_conv into
5157     test_win_to_proj and test_proj_to_win and make the tests easier to
5158     understand
5159     (ViewPortTest.testFitRectToWindow, ViewPortTest.testZoomFactor)
5160     (ViewPortTest.testZoomOutToRect, ViewPortTest.testTranslate)
5161     (ViewPortTest.test_unprojected_rect_around_point)
5162     (ViewPortTest.test_find_shape_at, ViewPortTest.testTools):
5163     Reformat to increase readability.
5164    
5165     2003-07-18 Bernhard Herzog <[email protected]>
5166    
5167 bh 1461 * Thuban/UI/view.py (MapCanvas.OnLeftDown): Capture the mouse.
5168    
5169     2003-07-18 Bernhard Herzog <[email protected]>
5170    
5171 bh 1459 * test/runtests.py: The test suite can now be run without an X
5172     connection. To make sure this remains true, remove the DISPLAY
5173     environment variable so that an error occurs if the wxGTK is
5174     imported accidentally
5175    
5176     2003-07-18 Bernhard Herzog <[email protected]>
5177    
5178 bh 1457 * Thuban/UI/viewport.py: Remove unused imports
5179    
5180     * Thuban/UI/view.py: Remove unused imports
5181    
5182     2003-07-18 Bernhard Herzog <[email protected]>
5183    
5184 bh 1455 * test/test_export.py Remove unused imports. The OutputTransform
5185     function is now in viewport.py and is called output_transform
5186     (TestScalebar.test_output_transform)
5187     (TestScalebar.test_OutputTransform): Renamed to
5188     test_output_transform and updated to use output_transform instead
5189     of OutputTransform
5190    
5191     * Thuban/UI/view.py (OutputTransform): Moved to viewport.py and
5192     renamed.
5193     (MapCanvas.Export, MapPrintout.draw_on_dc): OutputTransform was
5194     renamed to output_transform
5195    
5196     * Thuban/UI/viewport.py (OutputTransform, output_transform):
5197     Rename to output_transform
5198    
5199     2003-07-18 Bernhard Herzog <[email protected]>
5200    
5201 bh 1453 * Thuban/Model/layer.py (Layer.__init__): Rename
5202     classificationField to classificatin_column and init it here so
5203     that it can be used in SetClassificationColumn
5204     (Layer.GetClassificationColumn, Layer.GetClassificationField):
5205     Rename to GetClassificationColumn.
5206     (Layer.SetClassificationColumn, Layer.SetClassificationField):
5207     Rename to SetClassificationColumn and issue a LAYER_CHANGED
5208     message if the column changes.
5209     (Layer._classification_changed, Layer.ClassChanged): Rename to
5210     _classification_changed. Update the callers.
5211     (Layer.SetShapeStore): Further field->column renames.
5212    
5213     * Thuban/Model/load.py (SessionLoader.start_classification)
5214     (SessionLoader.start_clpoint): Updates because of
5215     field->column method name changes in the Layer class
5216    
5217     * Thuban/Model/save.py (SessionSaver.write_classification): Updates
5218     because of field->column method name changes in the Layer class
5219    
5220     * Thuban/UI/classifier.py (Classifier.__init__)
5221     (Classifier._OnTry, Classifier._OnRevert): Updates because of
5222     field->column method name changes in the Layer class
5223    
5224     * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Updates
5225     because of field->column method name changes in the Layer class
5226    
5227     * Thuban/UI/viewport.py (ViewPort.find_shape_at): Updates because
5228     of field->column method name changes in the Layer class
5229    
5230     * test/test_save.py (SaveSessionTest.testClassifiedLayer)
5231     (SaveSessionTest.testClassifiedLayer): Update because of
5232     field->column method name changes in the Layer class
5233    
5234     * test/test_layer.py (SetShapeStoreTests.setUp)
5235     (SetShapeStoreTests.test_sanity): Update because of field->column
5236     method name changes in the Layer class
5237     (TestLayerModification.setUp): Subscribe to LAYER_CHANGED as well
5238     (TestLayerModification.test_sanity)
5239     (TestLayerModification.test_initial_settings): remove unsued code
5240     and rename to test_sanity.
5241     (TestLayerModification.test_set_classification): New test for
5242     SetClassification and SetClassificationField.
5243    
5244     2003-07-18 Bernhard Herzog <[email protected]>
5245    
5246 bh 1451 * test/test_classgen.py (TestFixedRamp.test): Extend test to check
5247     the non-fixed values as well. The old test would have accepted a
5248     fixed ramp that only returnes the fixed properties
5249    
5250 jonathan 1449 2003-07-17 Jonathan Coles <[email protected]>
5251    
5252     * Doc/manual/mainwindow.png, Doc/manual/mainwindow.xcf: Screen
5253     shots for the manual. The XCF file is the source image and
5254     has additional layers to support changes.
5255    
5256     * Doc/manual/thuban-manual.xml: Wrote an initial Introduction.
5257    
5258     * Thuban/UI/classifier.py (Classifier.__BuildClassification):
5259     Return both the new class and the field name.
5260    
5261     * Thuban/UI/mainwindow.py (MainWindow.ToggleLegend): Don't
5262     fit the map to the window as this changes any zoom level that
5263     the user may have set.
5264    
5265 jonathan 1442 2003-07-16 Jonathan Coles <[email protected]>
5266    
5267     * Thuban/Model/classgen.py (generate_singletons,
5268     generate_uniform_distribution, generate_quantiles): Remove
5269     fixes parameter, but maintain the same functionality by having
5270     the calling function pass a FixedRamp object for the ramp.
5271     (FixedRamp): New. Adapts a ramp to have fixed property values.
5272    
5273     * Thuban/Model/classification.py: Use new CLASS_CHANGED message.
5274     (Classification): Inherit from Publisher.
5275     (Classification.__init__): Remove the layer parameter.
5276     Classifications no longer need to have a parent layer.
5277     (Classification.GetField, Classification.GetFieldType,
5278     Classification.SetFieldInfo): Removed. The field name is stored
5279     in the layer, and the type can be retreived by calling
5280     Layer.GetFieldType().
5281     (Classification._set_layer, Classification.GetLayer): Removed.
5282     Classifications no longer have a parent layer.
5283    
5284     * Thuban/Model/layer.py (Layer.Destroy): Unsubscribe from the
5285     classification.
5286     (Layer.SetShapeStore): Reset the classification first while
5287     we still have the old shape store to work with.
5288     (Layer.GetClassificationField, Layer.SetClassificationField):
5289     New. Method for getting/setting the field to classify on.
5290     (Layer.SetClassification): Simplified now that the layer
5291     simply has to hold a reference to the classification and not
5292     tell the classification who owns it.
5293     Fixes RTbug #2023.
5294    
5295     * Thuban/Model/load.py (SessionLoader.start_classification):
5296     Set the field name on the layer, not the classification.
5297    
5298     * Thuban/Model/messages.py: Add CLASS_CHANGED for when a
5299     classification is modified.
5300    
5301     * Thuban/Model/save.py (SessionSaver.write_classification):
5302     Get the field name and type from the layer.
5303    
5304     * Thuban/Model/table.py (table_to_dbf, table_to_csv): Renamed
5305     parameter records to rows and add docstring. Fixes RTbug #1997.
5306    
5307     * Thuban/UI/classgen.py (ClassGenDialog.OnOK): Use a fixed
5308     ramp when we need to fix certain values of a ramp rather than
5309     using the old fixes parameter. Fixes RTbug #2024.
5310    
5311     * Thuban/UI/classifier.py (ClassGrid.CreateTable): Add fieldType
5312     parameter.
5313     (ClassTable.Reset): Add fieldType parameter and use it, rather
5314     than asking the classification.
5315     (Classifier.__init__): Remember the original class's field
5316     and ask the layer for the field type, rather than the classification.
5317     (Classifier.__SetGridTable): Retrieve the field and field type
5318     for the table because they are not in the classification.
5319     (Classifier._OnTry, Classifier._OnRevert): Set the classification
5320     field on the layer in addition to the classification itself.
5321    
5322     * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Get the
5323     classification field from layer.
5324    
5325     * Thuban/UI/viewport.py (ViewPort.find_shape_at): Get the
5326     classification field from layer. Split up tests and remove
5327     *-imports. Fixes RTbug #1992.
5328    
5329     * test/test_classgen.py (TestFixedRamp): Test for the FixedRamp class.
5330    
5331     * test/test_classification.py
5332     (TestClassification.test_classification): Remove tests for methods
5333     that no longer exist.
5334    
5335     * test/test_layer.py (SetShapeStoreTests.setUp): Classification
5336     __init__ no longer has a field parameter, use SetClassificationField.
5337     (SetShapeStoreTests.test_sanity): Use layer object to get class
5338     field info.
5339    
5340     * test/test_save.py (SaveSessionTest.testClassifiedLayer): Use
5341     SetClassificationField on layer to set class field info.
5342    
5343     * test/test_viewport.py: Renamed from test/test_view.py.
5344    
5345 jan 1424 2003-07-16 Jan-Oliver Wagner <[email protected]>
5346    
5347     * Doc/manual/thuban-manual.xml: Added authors and an initial
5348     coarse structure.
5349    
5350 bh 1418 2003-07-15 Bernhard Herzog <[email protected]>
5351    
5352 bh 1422 * test/support.py (FloatComparisonMixin): This is a mix-in class
5353     and therefore should not be derived from any other class.
5354    
5355     * test/test_range.py (RangeTest): FloatComparisonMixin is a
5356     mix-in, so derive from TestCase as well.
5357    
5358     2003-07-15 Bernhard Herzog <[email protected]>
5359    
5360 bh 1420 * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Rework the
5361     draw_func handling a bit to remove one layer of indirection. This
5362     makes the renderer about 10% faster in the non-classifying case
5363     and the code a bit cleaner
5364     (MapRenderer.draw_point_shape): Add the pen and brush parameters
5365     and set them in the dc. Now the draw_point_shape method and
5366     wxproj's draw_polygon_shape function have basically the same
5367     signature so that both can be directly used as draw_func
5368    
5369     2003-07-15 Bernhard Herzog <[email protected]>
5370    
5371 bh 1418 * Thuban/Model/save.py (SessionSaver.write_classification): Encode
5372     string values (in addition to the labels) as UTF 8
5373    
5374     * Thuban/Model/load.py (SessionLoader.start_clpoint): Decode the
5375     values if the field type is string
5376    
5377     * test/test_save.py (SaveSessionTest.testClassifiedLayer): Test
5378     saving a session with non-ascii string classification values.
5379    
5380     * test/test_load.py (TestClassification.file_contents)
5381     (TestClassification.test): Check for non-ascii values in string
5382     classifications
5383    
5384 jonathan 1416 2003-07-14 Jonathan Coles <[email protected]>
5385    
5386     * test/test_view.py: New. Tests for ViewPort.
5387    
5388 frank 1409 2003-07-14 Frank Koormann <[email protected]>
5389    
5390     * Thuban/Model/load.py (SessionLoader.start_map): Encode map
5391     title to latin1. Fixes https://intevation.de/rt/webrt?serial_num=2013
5392    
5393 frank 1411 * test/test_load_0_8.py (TestUnicodeStrings): New, test load of
5394     unicode strings from session file: session title, map title and
5395     projection name.
5396    
5397 jonathan 1403 2003-07-10 Jonathan Coles <[email protected]>
5398    
5399 jonathan 1406 * Thuban/UI/viewport.py (Tool.MouseUp): Should have called
5400     drag_stop, not drag_move when the mouse is released.
5401    
5402     2003-07-10 Jonathan Coles <[email protected]>
5403    
5404 jonathan 1403 The most important part of this is the seperation of view.py into
5405     two pieces. viewport.py now has a class called ViewPort which
5406     contains all the non-wx parts of view.py and can therefore be
5407     tested. view.py contains only the wx-specific parts and is fairly
5408     simple.
5409    
5410     * Thuban/UI/view.py: Stripped out all non-wx functionality. Fixes
5411     RTTbug #1992.
5412     * Thuban/UI/viewport.py: New. Contains non-wx view functionality.
5413     RTTbug #1992.
5414    
5415     * Thuban/Model/classgen.py (generate_singletons,
5416     generate_uniform_distribution, generate_quantiles):
5417     Added 'fixes' parameter so that property attributes can
5418     be held constant over the generated classification groups.
5419     (CustomRamp.GetProperties): Remove unused variables.
5420    
5421     * Thuban/Model/map.py (Map.SetProjection): Send the old
5422     projection as an argument to listeners of the MAP_PROJECTION_CHANGED
5423     event.
5424    
5425     * Thuban/Model/table.py (table_to_dbf, table_to_csv): Added 'records'
5426     parameter which is a list of records that restricts which
5427     records are saved. Fixes RTbug #1997.
5428    
5429     * Thuban/UI/application.py (ThubanApplication.ShowExceptionDialog):
5430     Port exception dialog from GREAT-ER. Fixes RTbug #1993.
5431    
5432     * Thuban/UI/classgen.py (ClassGenDialog.__init__): Add controls
5433     to allow the user to fix line color/width on generated groups.
5434     (ClassGenDialog.OnOK): Use new 'fixes' parameter of the generate_*
5435     functions to optionally fix group properties.
5436    
5437     * Thuban/UI/main.py (main): Set exception hook to the
5438     ShowExceptionDialog. Fixes RTbug #1993.
5439    
5440     * Thuban/UI/mainwindow.py (MainWindow.ShowTableView): Raise
5441     the table window when it is selectd to be shown.
5442    
5443     * Thuban/UI/tableview.py (QueryTableFrame.__init__): Add an
5444     Export Selection button and move the export buttons underneath
5445     the table.
5446     (QueryTableFrame.UpdateStatusText): Added event argument so
5447     that it can respond to grid selection events. The status text
5448     is now updated even when the table is not associated with a
5449     layer as was previously assumed.
5450     (QueryTableFrame.OnGridSelectRange, OnGridSelectCell): Removed.
5451     UpdateStatusText responds to these events.
5452     (QueryTableFrame.OnSaveAs): Renamed to doExport.
5453     (QueryTableFrame.doExport): Helper function that saves the
5454     entire table, or selected rows, to a file.
5455     (QueryTableFrame.OnExport, QueryTableFrame.OnExportSel): New.
5456     Respond to export button events and call doExport.
5457    
5458     * extensions/thuban/gdalwarp.cpp (ProjectRasterFile): Make sure
5459     the function doesn't return NULL without first setting a Python
5460     Error.
5461    
5462     * test/runtests.py (main): Only print "Unknown option" for
5463     unsupported options.
5464    
5465     * test/support.py (FloatComparisonMixin.assertFloatEqual): Take
5466     optional epsilon argument to specify floating point accuracy.
5467     (FloatComparisonMixin.assertFloatSeqEqual): Call assertFloatEqual
5468     for each item test.
5469    
5470     * test/test_csv_table.py (TestCSVTable.test_table_to_cvs): Add
5471     tests for saving selected records.
5472    
5473     * test/test_dbf_table.py (TestTableToDBF.test_table_to_dbf): Add
5474     tests for saving selected records.
5475    
5476     * test/test_map.py (TestMapWithContents.test_set_projection):
5477     MAP_PROJECTION_CHANGED events send the old projection.
5478    
5479     * test/test_session.py
5480     (TestSessionWithContent.test_forward_map_projection):
5481     MAP_PROJECTION_CHANGED events send the old projection.
5482    
5483     * test/test_table.py (TableTest): Update tests to use non-deprecated
5484     functions.
5485    
5486 bh 1376 2003-07-08 Bernhard Herzog <[email protected]>
5487    
5488 bh 1382 * Thuban/Model/transientdb.py (TransientTableBase.Width): The type
5489     constants in the column objects are the standard ones defined in
5490     the table module.
5491    
5492     * test/test_transientdb.py
5493     (TestTransientTable.test_transienttable_to_dbf): New. Test whether
5494     exporting transient tables as DBF works. This should catch the bug
5495     just fixed in TransientTableBase.Width.
5496    
5497     2003-07-08 Bernhard Herzog <[email protected]>
5498    
5499 bh 1380 * Thuban/Model/classgen.py (CustomRamp.GetProperties): Compute the
5500     interpolated colors correctly.
5501    
5502     * test/test_classgen.py (TestCustomRamp.test_color_interpolation):
5503     New. Test case for the fix in classgen.py
5504    
5505     2003-07-08 Bernhard Herzog <[email protected]>
5506    
5507 bh 1378 * test/runtests.py (main): Make the default output less verbose
5508     and add a verbosity option (-v) to get the old output
5509    
5510     2003-07-08 Bernhard Herzog <[email protected]>
5511    
5512 bh 1376 * Resources/XML/thuban-0.9.dtd: New. This will become the DTD for
5513     0.9.
5514    
5515     * Thuban/Model/transientdb.py (TransientJoinedTable.JoinType):
5516     New. Return the join type
5517    
5518     * Thuban/Model/save.py (SessionSaver.write_session): Use new 0.9
5519     DTD
5520     (SessionSaver.write_data_containers): Save the join type for
5521     joined tables
5522    
5523     * Thuban/Model/load.py (SessionLoader.__init__): Add the new 0.9
5524     namespace
5525     (SessionLoader.start_jointable): Handle the jointype attribute
5526    
5527     * test/test_load_0_8.py: New. Effectively a copy of test_load.py
5528     as of Thuban 0.8. These are now tests to determine whether Thuban
5529     can still read files generated by Thuban 0.8
5530    
5531     * test/test_load.py (LoadSessionTest.dtd)
5532     (TestSingleLayer.file_contents)
5533     (TestLayerVisibility.file_contents, TestLabels.file_contents)
5534     (TestLayerProjection.file_contents)
5535     (TestRasterLayer.file_contents, TestJoinedTable.file_contents)
5536     (TestJoinedTable.file_contents)
5537     (TestLoadError.file_contents): Update for new DTD
5538     (TestJoinedTable.file_contents, TestJoinedTable.setUp): Add test
5539     for new join type attribute
5540    
5541     * test/test_save.py (SaveSessionTest.dtd)
5542     (SaveSessionTest.testEmptySession)
5543     (SaveSessionTest.testSingleLayer)
5544     (SaveSessionTest.testLayerProjection)
5545     (SaveSessionTest.testRasterLayer)
5546     (SaveSessionTest.testClassifiedLayer)
5547     (SaveSessionTest.test_dbf_table)
5548     (SaveSessionTest.test_joined_table): Update for new DTD
5549     (SaveSessionTest.test_joined_table): Add test for new join type
5550     attribute
5551    
5552 bh 1372 2003-07-04 Bernhard Herzog <[email protected]>
5553    
5554     * Thuban/Model/table.py (_find_dbf_column_names): New. Helper
5555     function for table_to_dbf
5556     (table_to_dbf): Deal with names longer than the 10 character limit
5557    
5558     * test/test_dbf_table.py (TestTableToDBF.test_table_to_dbf): Add
5559     doc-string
5560     (TestTableToDBF.test_table_to_dbf_long_col_names): New test for
5561     long column names
5562    
5563 bh 1365 2003-07-03 Bernhard Herzog <[email protected]>
5564    
5565 bh 1370 * Doc/manual/thuban-manual.xml: Fix the CVS Revision Tag syntax
5566    
5567     2003-07-03 Bernhard Herzog <[email protected]>
5568    
5569 bh 1368 * Doc/manual/thuban-manual.xml, Doc/manual/README: New. Skeleton
5570     for the Thuban manual and README with some basic information about
5571     the manual
5572    
5573     2003-07-03 Bernhard Herzog <[email protected]>
5574    
5575 bh 1365 * Thuban/Model/transientdb.py (TransientJoinedTable.__init__):
5576     Update doc-string
5577     (TransientJoinedTable.create): Do not modify the column objects of
5578     the input tables in place and copy all columns of the input tables
5579     into the joined table after all.
5580    
5581     * test/test_transientdb.py
5582     (TestTransientTable.test_transient_joined_table_same_column_name):
5583     Update to reflect the new behavior
5584     (TestTransientTable.test_transient_joined_table_with_equal_column_names):
5585     Update to reflect the new behavior
5586     (TestTransientTable.test_transient_joined_table_name_collisions_dont_modify_in_place):
5587     New test case for a bug which modified the column objects in place
5588    
5589 jonathan 1360 2003-07-02 Jonathan Coles <[email protected]>
5590 jonathan 1349
5591 jonathan 1360 * Thuban/Model/classgen.py (generate_singletons,
5592     generate_uniform_distribution, generate_quantiles,
5593 jonathan 1363 GenQuantiles0): Make sure maxValue isn't less than
5594     one, otherwise we could divide by zero.
5595    
5596     * test/test_classgen.py (ClassGenTest.doClassRangeTest,
5597     ClassGenTest.doClassSingleTest): Call doBoundsTest to
5598     check the end classification groups against the
5599     proper property values.
5600     (ClassGenTest.doBoundsTest): New. Checks the first and
5601     last classification groups to make sure their properties
5602     are the correct upper and lower bounds for a color ramp.
5603    
5604     2003-07-02 Jonathan Coles <[email protected]>
5605    
5606     * Thuban/Model/classgen.py (generate_singletons,
5607     generate_uniform_distribution, generate_quantiles,
5608 jonathan 1360 GenQuantiles0): The denominator was one to high when
5609     calculating the index for the ramp causing the index
5610     to never to reach one.
5611    
5612     2003-07-02 Jonathan Coles <[email protected]>
5613    
5614 jonathan 1358 Changed the singature of ClassGroupRange.__init__ and
5615     ClassGroupRange.SetRange() so that the min/max values are
5616     passed as a tuple. This makes a better calling scheme for
5617     when a Range object is passed instead.
5618    
5619     * Thuban/Model/classgen.py: Fixed parameters to
5620     ClassGroupRange constructor.
5621    
5622     * Thuban/Model/classification.py (ClassGroupRange.__init__):
5623     Consolidate the min/max parameters into a single _range which
5624     can either be a tuple or a Range object.
5625     (ClassGroupRange.SetRange): Consolidate the min/max parameters
5626     into a single _range which can either be a tuple or a Range object.
5627    
5628     * Thuban/Model/load.py (SessionLoader.start_clrange): Fix
5629     call to ClassGroupRange constructor to use a tuple.
5630    
5631     * Thuban/Model/layer.py (Layer.SetClassification): Switch
5632     the classification instance variable to the new class
5633     before calling _set_layer otherwise subscribers to a
5634     LAYER_CHANGED event will not see any difference.
5635    
5636     * test/test_classification.py: Fix tests of ClassGroupRange
5637     so that they use the new signature.
5638    
5639     * test/test_load.py: Fix use of ClassGroupRange so that it
5640     uses the new signature.
5641    
5642     * test/test_load_0_2.py: Fix use of ClassGroupRange so that it
5643     uses the new signature.
5644    
5645     * test/test_save.py: Fix use of ClassGroupRange so that it
5646     uses the new signature.
5647    
5648    
5649     2003-07-01 Jonathan Coles <[email protected]>
5650    
5651 jonathan 1349 * Thuban/Model/classgen.py: Fixes RTbug #1972, 1971.
5652     Import used objects/class from color.
5653     (generate_singletons): We don't
5654     need the numGroups parameter anymore because we are using
5655     the new ramps with GetProperties().
5656     (generate_uniform_distribution): Use new ramp method
5657     GetProperties().
5658     (generate_quantiles, GenQuantiles0): Use new ramp method
5659     GetProperties().
5660     (CustomRamp.SetNumGroups): Removed. The ramps now map
5661     a value from 0 to 1 to class properties so the number
5662     of groups is not needed ahead of time.
5663     (CustomRamp.next): Removed. CustomRamp does not support
5664     interation anymore.
5665     (CustomRamp.GetProperties): Returns a ClassGroupProperties
5666     object based on the index value from 0 to 1 that is
5667     passed to it.
5668     (GreyRamp, RedRamp, GreenRamp, BlueRamp, GreenToRedRamp):
5669     Made into instances of Monochromatic class instread of
5670     deriving from it.
5671     (HotToCold.SetNumGroups): Removed. See CustomRamp.
5672     (HotToCold.next): Removed. See CustomRamp.
5673    
5674     * Thuban/Model/classification.py: Fixes RTbug #1973, 1971.
5675     (Classification.SetField, Classification.SetFieldType):
5676     Replaced with SetFieldInfo.
5677     (Classification.SetFieldInfo): New. Does a better job of
5678     what SetField and SetFieldType used to do by combining
5679     their function since they should really always be done
5680     at the same time.
5681     (Classification.SetLayer): Renamed to _set_layer.
5682     (Classification._set_layer): Should only be called from
5683     Layer's SetClassification. This does not cause a recursive
5684     call as SetLayer did because we know that Layer knows about
5685     the classification.
5686    
5687     * Thuban/Model/color.py: Fixes RTbug #1971.
5688     (_Transparent): Renamed from Transparent so it doesn't
5689     conflict with the module variable.
5690     (Transparent, Black): Renamed from Color.Transparent,
5691     Color.Black so they are not class variables.
5692    
5693     * Thuban/Model/layer.py: Fixes RTbug #1971, 1973.
5694     (Layer.Destroy): We don't need to call SetClassification
5695     anymore to clear out the back reference in the classifcation
5696     to the layer. It's better to set it to None using _set_layer,
5697     and we won't be creating another clas object too.
5698     (Layer.SetClassification): Classification._set_layer is not
5699     recursive so remove all the locking variables. Also clean
5700     up the code so that it remains unchanged if something fails.
5701    
5702     * Thuban/Model/load.py: Fixes RTbug #1971.
5703     (SessionLoader.start_classification): Call
5704     Classification.SetFieldInfo().
5705    
5706     * Thuban/Model/save.py: Removed import of Color which wasn't
5707     being used.
5708    
5709     * Thuban/UI/classgen.py: Fixes RTbug #1972.
5710     (ClassGenDialog.__init__): Color ramps are now instances
5711     already so we don't need to create any new objects.
5712     (ClassGenDialog.OnOK): Check for numGroups is no longer
5713     necessary because we never use it.
5714    
5715     * Thuban/UI/classifier.py: Fixes RTbug #1971.
5716     (Classifier.__BuildClassification, Classifier.__SetGridTable):
5717     Call Classification.SetFieldInfo() instead of SetFieldType.
5718    
5719     * Thuban/UI/renderer.py: Fixes RTbug #1971.
5720    
5721     * Thuban/UI/view.py: Fixes RTbug #1974, 1971.
5722     (MapCanvas.__init__): Subscribe to the idle time event. Set
5723     background color to white.
5724     (MapCanvas.OnPaint): Set a flag indicating that we should
5725     render the map during idle time. If we already have a bitmap
5726     just draw it now.
5727     (MapCanvas.OnIdle): New. Render the map only during idle time.
5728     This also fixes a problem with the busy cursor under gtk.
5729    
5730     * test/test_classgen.py (ClassGenTest.test_generate_singletons):
5731     Fix calls to generate_singletons because the signature changed.
5732    
5733     * test/test_classification.py: Fix color references and
5734     change calls to Classification.[SetField|SetFieldType] to
5735     SetFieldInfo.
5736    
5737     * test/test_load.py: Fix color references.
5738    
5739     * test/test_load_0_2.py: Fix color references.
5740    
5741     * test/test_save.py (SaveSessionTest.testClassifiedLayer):
5742     Change calls to Classification.[SetField|SetFieldType] to
5743     SetFieldInfo.
5744    
5745 frank 1334 2003-07-01 Frank Koormann <[email protected]>
5746    
5747     MERGE from the greater-ms3 branch.
5748    
5749     * test/test_transientdb.py
5750     (TestTransientTable.test_transient_joined_table_with_equal_column_names):
5751     New. Test join of two tables with partly equal column names.
5752    
5753     * Thuban/Model/transientdb.py (TransientJoinedTable.create):
5754     If duplicates in left and right tables column names are found,
5755     append '_' (underscores) to the name until it is unique.
5756     Create always new internal names for the resulting table and reference
5757     columns in the join statement with <table>.<column>
5758    
5759 bh 1329 2003-07-01 Bernhard Herzog <[email protected]>
5760    
5761     * test/test_transientdb.py
5762     (TestTransientTable.test_transient_joined_table_same_column_name):
5763     New. Test whether joining on columns with the same names in both
5764     tables works.
5765 frank 1334
5766 bh 1329 * Thuban/Model/transientdb.py (TransientJoinedTable.create): Make
5767     sure to use the right internal names even when joining on field
5768     with the same names in both tables. Also, detect duplicate names
5769     in the joined table correctly.
5770    
5771 frank 1325 2003-07-01 Frank Koormann <[email protected]>
5772    
5773     * Thuban/UI/renderer.py (ExportRenderer.render_legend):
5774     Reverse List of layers to render in same order as in desktop legend.
5775    
5776 jonathan 1318 2003-06-30 Jonathan Coles <[email protected]>
5777    
5778 jonathan 1349 * Thuban/version.py (make_tuple): Takes a version string
5779     and splits it into a tuple of at most three integers.
5780     Used make_tuple() to make tuple versions of the version
5781     numbers.
5782    
5783     * Thuban/UI/about.py: Add Thuban email addresses.
5784    
5785     2003-06-30 Jonathan Coles <[email protected]>
5786    
5787 jonathan 1320 * Thuban/version.py: SQLite/PySQLite version dependencies
5788     were too high.
5789    
5790     2003-06-30 Jonathan Coles <[email protected]>
5791    
5792 jonathan 1318 * Thuban/version.py: Update version to 0.8.1
5793    
5794     * MANIFEST.in: Added Projections so that default.proj is
5795     included.
5796    
5797 jonathan 1312 2003-06-26 Jonathan Coles <[email protected]>
5798    
5799     New About box with lots more information including library
5800     versions and credits. More/better version checking before
5801     Thuban starts.
5802    
5803     * Thuban/UI/about.py: New. New About box that displays
5804     library version information and credits.
5805    
5806     * Thuban/version.py: Added new 'versions' dictionary which
5807     contains the verions of various libraries which are checked
5808     when the module loads.
5809     (verify_versions): Check all version numbers and returns
5810     a list of errors.
5811    
5812     * Thuban/UI/classifier.py (Classifier.__EnableButtons):
5813     Reset the status of the buttons as the situation warrants,
5814     but in a better more reliable way by not relying on the
5815     current status to determine what needs to change.
5816    
5817     * Thuban/UI/main.py (wxCHECK_VERSION): Removed. Not needed.
5818     (verify_versions): Remove most of the code since it is
5819     now in Thuban.version.verify_versions.o
5820    
5821     * Thuban/UI/mainwindow.py (MainWindow.About): Call new
5822     About box in Thuban.UI.about.
5823    
5824     * extensions/thuban/gdalwarp.cpp (get_gdal_version): New.
5825     Returns the version of gdal library being used as a string.
5826    
5827     * extensions/thuban/wxproj.cpp (check_version, check_version_gtk):
5828     Removed.
5829     (get_proj_version): Return the version of PROJ that the file
5830     was compiled with.
5831     (get_gtk_version): Return th version of GTK that the file
5832     was compiled with.
5833    
5834 jonathan 1304 2003-06-25 Jonathan Coles <[email protected]>
5835    
5836     * Thuban/UI/classifier.py (Classifier.EditSymbol): The parent
5837     of the SelectPropertiesDialog should be self so the window
5838     appears on top.
5839     (ClassGroupPropertiesCtrl.DoEdit): The parent
5840     of the SelectPropertiesDialog should be self so the window
5841     appears on top.
5842    
5843     * Thuban/UI/resource.py: Cleaned up how we determine file
5844     extensions.
5845     (GetImageResource): Return an wxImage from our Resources.
5846    
5847 jonathan 1299 2003-06-24 Jonathan Coles <[email protected]>
5848    
5849     * Thuban/UI/renderer.py (ExportRenderer.render_legend):
5850     Check that a layer has a classification before trying
5851     to get it. Raster layers don't have classifications.
5852    
5853 jonathan 1286 2003-06-23 Jonathan Coles <[email protected]>
5854 jonathan 1297
5855     * setup.py: Add Resources/XML to resource list.
5856    
5857     2003-06-23 Jonathan Coles <[email protected]>
5858 jonathan 1286
5859 jonathan 1297 * setup.cfg: Fix copyright dates
5860    
5861     2003-06-23 Jonathan Coles <[email protected]>
5862    
5863 jonathan 1294 * MANIFEST.in: Update with Resources/XML
5864    
5865     * setup.py: Don't include Locale resources yet as we don't
5866     have any and it causes problems building the distribution
5867     for Windows. Update version to 0.8.0.
5868    
5869     * Doc/thuban.dtd: Removed since it is now in Resources/XML.
5870    
5871     * Thuban/UI/mainwindow.py: Add blank line at the end because
5872     file was not being read correctly building the Windows
5873     distribution.
5874    
5875     2003-06-23 Jonathan Coles <[email protected]>
5876    
5877 jonathan 1289 * Thuban/UI/mainwindow.py (MainWindow.About): Fix text.
5878    
5879     * Thuban/version.py: Temporarily update longversion for
5880     the 0.8 release so that it doesn't have the cvs revision.
5881    
5882     2003-06-23 Jonathan Coles <[email protected]>
5883    
5884 jonathan 1286 * Thuban/UI/common.py (ThubanBeginBusyCursor): Call wxSafeYield
5885     to make sure that we don't create reentrant possibilities with
5886     wxYield.
5887    
5888     * Thuban/UI/view.py (MapCanvas.OnPaint): Call wxBeginBusyCursor()
5889     directly to avoid the wxSafeYield() call which generates an
5890     OnPaint event causing infinite recursion. Don't try to catch
5891     exception anymore. This was for before there were limits on map
5892     scaling.
5893    
5894 bh 1283 2003-06-23 Bernhard Herzog <[email protected]>
5895    
5896     Bug fix for RT #1961:
5897    
5898     * Thuban/Model/load.py (SessionLoader.start_derivedshapesource):
5899     Register DerivedShapestores with the session
5900    
5901     * Thuban/Model/session.py (Session.Tables): Make sure each table
5902     is only listed once.
5903    
5904     * test/test_load.py (TestJoinedTable.test): Add check_format call.
5905     Update file contents to match the one written out.
5906    
5907 bh 1281 2003-06-20 Bernhard Herzog <[email protected]>
5908    
5909     * test/xmlsupport.py (SaxEventLister.startElementNS)
5910     (SaxEventLister.endElementNS): Do not include the qname. Python
5911     2.2.1 and 2.2.2 and 2.2.3 differ in this regard. In 2.2.1 qname it
5912     is (presumably incorrectly) None, whereas it's a string with the
5913     element name in the later versions.
5914    
5915     * test/test_xmlsupport.py (TestEventList.test_even_list_simple)
5916     (TestEventList.test_even_list_namespace): Update tests to reflect
5917     the new behaviour
5918     (TestEventList.test_even_list_id_normalization): Fix doc-string
5919    
5920 jonathan 1272 2003-06-20 Jonathan Coles <[email protected]>
5921    
5922 jonathan 1279 * Thuban/Model/layer.py (BaseLayer.HasShapes): New. Overridden
5923     by deriving classes to determine if that layer supports shapes.
5924     (Layer): Override HasShapes and return true.
5925    
5926     * Thuban/UI/classgen.py: Use Thuban[Begin|End]BusyCursor()
5927     instead of a direct call to wx[Begin|End]CusyCursor().
5928     (GenUniquePanel._OnRetrieve): Set busy cursor while retrieving
5929     table data.
5930    
5931     * Thuban/UI/common.py (ThubanBeginBusyCursor, ThubanEndBusyCursor):
5932     New. Wrappers around the wxWindows functions that allow us to
5933     make additional calls such as wxYield which gives the native
5934     system a chance to update the cursor correctly.
5935    
5936     * Thuban/UI/tableview.py: Use Thuban[Begin|End]BusyCursor()
5937     instead of a direct call to wx[Begin|End]CusyCursor().
5938    
5939     * Thuban/UI/view.py: Use Thuban[Begin|End]BusyCursor()
5940     instead of a direct call to wx[Begin|End]CusyCursor().
5941     (MapCanvas.find_shape_at): Check if the current search layer
5942     support shapes, otherwise go on to the next layer.
5943    
5944     * test/test_layer.py: Add tests in each type of layer for
5945     HasClassification() and HasShapes()
5946    
5947     2003-06-20 Jonathan Coles <[email protected]>
5948    
5949 jonathan 1272 * Thuban/UI/view.py (MapCanvas.OnPaint): Call wxYield after
5950     turning on the busy cursor to allow the system to change the
5951     cursor before we begin painting. This fixes a problem that
5952     was occuring only under GTK. Fixes RTbug #1840.
5953    
5954 bh 1270 2003-06-20 Bernhard Herzog <[email protected]>
5955    
5956     * Resources/XML/thuban-0.8.dtd: New DTD for the new file format
5957     version.
5958    
5959     * Thuban/Model/save.py (sort_data_stores): New. Make topological
5960     sort of the data sources so they can be written with sources that
5961     data sources that depend on other data sources come after the
5962     sources they depend on.
5963     (SessionSaver.__init__): Add idmap instance variable to map from
5964     objects to the ids used in the file.
5965     (SessionSaver.get_id, SessionSaver.define_id)
5966     (SessionSaver.has_id): New. Methods to manage the idmap
5967     (SessionSaver.write): Use thuban-0.8.dtd
5968     (SessionSaver.write_session): Add a namespace on the session and
5969     write out the data sources before the maps.
5970     (SessionSaver.write_data_containers): New. Write the data
5971     containers.
5972     (SessionSaver.write_layer): Layer elements now refer to a
5973     shapestore and don't contain filenames anymore.
5974    
5975     * Thuban/Model/load.py (LoadError): Exception class to raise when
5976     errors in the files are discovered
5977     (SessionLoader.__init__): Define dispatchers for elements with a
5978     thuban-0.8 namespace too.
5979     (SessionLoader.check_attrs): New helper method to check and
5980     convert attributes
5981     (AttrDesc): New. Helper class for SessionLoader.check_attrs
5982     (SessionLoader.start_fileshapesource)
5983     (SessionLoader.start_derivedshapesource)
5984     (SessionLoader.start_filetable, SessionLoader.start_jointable):
5985     Handlers for the new elements in the new fileformat
5986     (SessionLoader.start_layer): Handle the shapestore attribute in
5987     addition to filename.
5988     (SessionLoader.start_table, SessionLoader.end_table): Removed.
5989     They were never used in the old formats and aren't needed for the
5990     new.
5991    
5992     * Thuban/Model/session.py (Session.DataContainers): New method to
5993     return all "data containers", i.e. shapestores and tables
5994    
5995     * test/xmlsupport.py (SaxEventLister.__init__)
5996     (SaxEventLister.startElementNS, sax_eventlist): Add support to
5997     normalize IDs.
5998    
5999     * test/test_xmlsupport.py
6000     (TestEventList.test_even_list_id_normalization): New test case for
6001     id normalization
6002    
6003     * test/test_load.py (LoadSessionTest.check_format): Use ID
6004     normalization
6005     (LoadSessionTest.thubanids, LoadSessionTest.thubanidrefs): New
6006     class atrributes used for ID normalization
6007     (TestSingleLayer, TestLayerVisibility, TestLabels.test)
6008     (TestLayerProjection.test, TestRasterLayer.test): Adapt to new
6009     file format
6010     (TestJoinedTable): New test for loading sessions with joined
6011     tables.
6012     (TestLoadError): New. Test whether missing required attributes
6013     cause a LoadError.
6014    
6015     * test/test_save.py (SaveSessionTest.thubanids)
6016     (SaveSessionTest.thubanidrefs): New class attributes for ID
6017     normalization in .thuban files.
6018     (SaveSessionTest.compare_xml): Use id-normalization.
6019     (SaveSessionTest.testEmptySession)
6020     (SaveSessionTest.testLayerProjection)
6021     (SaveSessionTest.testRasterLayer)
6022     (SaveSessionTest.testClassifiedLayer): Adapt to new file format.
6023     (SaveSessionTest.testLayerProjection): The filename used was the
6024     same as for testSingleLayer. Use a different one.
6025     (SaveSessionTest.test_dbf_table)
6026     (SaveSessionTest.test_joined_table): New test cases for saving the
6027     new data sources structures.
6028     (TestStoreSort, MockDataStore): Classes to test the sorting of the
6029     data stores for writing.
6030    
6031     * test/runtests.py: Add CVS keywords
6032    
6033 jonathan 1265 2003-06-20 Jonathan Coles <[email protected]>
6034    
6035 jonathan 1267 * test/test_session.py
6036     (UnreferencedTablesTests.test_unreferenced_tables_with_joins):
6037     Use the cultural_landmark-point.dbf file for the store so that
6038     the table rows and shape count match.
6039    
6040     2003-06-20 Jonathan Coles <[email protected]>
6041    
6042 jonathan 1265 * Thuban/Model/data.py (DerivedShapeStore.__init__): Raise
6043     an exception if the number of shapes is different from the
6044     number of rows in the table. Address RTbug #1933.
6045    
6046     * test/test_layer.py (TestLayer.test_derived_store): Add
6047     a test for the new exception in DerivedShapeStore.__init__.
6048    
6049     * test/support.py (FloatTestCase): Removed since there is
6050     already FloatComparisonMixin. Fixes RTbug #1954.
6051     (FloatComparisonMixin.assertFloatEqual): Include test for
6052     infinity that was part of FloatTestCase.
6053    
6054     * test/test_range.py (RangeTest): Inherit from
6055     support.FloatComparisonMixin now that we don't have
6056     support.FloatTestCase.
6057    
6058 bh 1256 2003-06-20 Bernhard Herzog <[email protected]>
6059    
6060 bh 1260 * test/test_save.py (SaxEventLister, sax_eventlist): Removed. Use
6061     the implementation in xmlsupport instead.
6062     (SaveSessionTest.compare_xml): sax_eventlist is now in xmlsupport
6063    
6064     * test/test_proj.py: Import sax_eventlist from xmlsupport instead
6065     of test_save
6066    
6067     2003-06-20 Bernhard Herzog <[email protected]>
6068    
6069 bh 1258 * test/test_load.py (LoadSessionTest.check_format): New helper
6070     method to make sure the test files we load might have been written
6071     by the current thuban version.
6072     (ClassificationTest.TestLayers, TestSingleLayer.test)
6073     (TestLayerVisibility.test, TestClassification.test)
6074     (TestLabels.test, TestLayerProjection.test, TestRasterLayer.test):
6075     Add check_format() calls and fix the thuban data to match the data
6076     that would be written by saving the session loaded from it.
6077    
6078     * test/xmlsupport.py (SaxEventLister, sax_eventlist): Copies of
6079     the same class and function in test_save.
6080    
6081     * test/test_xmlsupport.py (TestEventList): New. test cases for
6082     sax_eventlist
6083    
6084     2003-06-20 Bernhard Herzog <[email protected]>
6085    
6086 bh 1256 * Resources/XML/thuban.dtd: Add comment about which versions of
6087     Thuban are covered by this DTD
6088     (map): Fix content model for layers and raster layers. There can
6089     be any number or layers and raster layers in any order.
6090    
6091 jonathan 1254 2003-06-20 Jonathan Coles <[email protected]>
6092    
6093 jonathan 1265 This is mainly about fixing RTbug #1949.
6094    
6095 jonathan 1254 * Thuban/Model/classification.py: Remove "from __future__"
6096     import statement since python 2.2 is the earliest supported
6097     version.
6098    
6099     * Thuban/Model/proj.py (Projection.GetProjectedUnits): New.
6100     Currently returns PROJ_UNITS_METERS or PROJ_UNITS_DEGREES
6101     depending on the units this projection *forwards* into.
6102    
6103     * Thuban/Model/save.py (SessionSaver.write_classification):
6104     Remove unnecessary use of lambdas and nested functions.
6105    
6106     * Thuban/UI/legend.py (ScaleBarBitmap.__SetScale): Do scale
6107     adjustment here if the map projection uses degrees.
6108    
6109     * Thuban/UI/scalebar.py (ScaleBar.DrawScaleBar): Remove
6110     scale adjust code since it is now done before calling
6111     this method. Don't do anything if the map projection
6112     is None.
6113    
6114 bh 1244 2003-06-19 Bernhard Herzog <[email protected]>
6115    
6116 bh 1248 Move version specific load tests to their own file.
6117    
6118     * test/test_load.py: Expand the doc-string to explain a bit how to
6119     handle file format changes.
6120     (TestClassification.test): Update the docstring as this test is
6121     not about Thuban 0.2 anymore.
6122    
6123     * test/test_load_0_2.py: New file with the load tests for thuban
6124     files created with Thuban 0.2 and earlier.
6125    
6126     2003-06-19 Bernhard Herzog <[email protected]>
6127    
6128 bh 1246 Add XML validation to some of the tests. Validation will only be
6129     done if pyRXP is installed (http://reportlab.com/xml/pyrxp.html).
6130     To make the DTD available to the test cases it's moved into
6131     Resources/XML
6132    
6133     * Resources/XML/thuban.dtd: New. This is now the real Thuban DTD
6134     for versions up to and including 0.2. Two slight changes: added an
6135     encoding specification and fixed the comment which refered to
6136     GRASS, not Thuban
6137    
6138     * test/xmlsupport.py: New support module for tests involving XML.
6139     Currently there's a mix-in class for XML validation.
6140    
6141     * test/test_xmlsupport.py: New. Tests for the xmlsupport module
6142    
6143     * test/test_save.py (SaveSessionTest): Derive from ValidationTest
6144     so that we can validate the
6145     (SaveSessionTest.testEmptySession)
6146     (SaveSessionTest.testSingleLayer)
6147     (SaveSessionTest.testSingleLayer)
6148     (SaveSessionTest.testLayerProjection)
6149     (SaveSessionTest.testRasterLayer)
6150     (SaveSessionTest.testClassifiedLayer): Validate the generated XML
6151    
6152     * test/runtests.py (main): Call print_additional_summary instead
6153     of print_garbage_information
6154    
6155     * test/support.py (resource_dir): New function to return the
6156     "Resource" subdirectory
6157     (print_additional_summary): New function to combine several
6158     summary functions
6159     (run_tests): Use print_additional_summary instead of calling
6160     print_garbage_information directly
6161    
6162     2003-06-19 Bernhard Herzog <[email protected]>
6163    
6164 bh 1244 * Doc/thuban.dtd (classification): Correct the content model of
6165     the classification element.
6166     (projection): Add the "name" attribute
6167    
6168 frank 1242 2003-06-19 Frank Koormann <[email protected]>
6169    
6170     MERGE from the greater-ms3 branch.
6171    
6172     * Thuban/UI/scalebar.py (ScaleBar.DrawScaleBar): Apply conversion to
6173     scale if projection is latlong to get better estimate.
6174    
6175     Fix problem of hidden properties dialog under windows after double
6176     click on layer tree:
6177     The tree control always gets an Expanded / Collapsed event after
6178 joey 2162 the ItemActivated on double click, which raises the main window again.
6179     We add a second ItemActivated event to the queue, which simply
6180 frank 1242 raises the already displayed window.
6181    
6182     * Thuban/UI/legend.py (LegendTree.__init__): Instance variable
6183     raiseProperties initialized to prevent endless loops
6184     (LegendTree._OnItemActivated): Depending on self.raiseProperties
6185     simply raise the properties or open the dialog and issue a second
6186     event.
6187    
6188 jonathan 1235 2003-06-18 Jonathan Coles <[email protected]>
6189    
6190 jonathan 1239 * setup.py: Fix a few problems that occured under Windows.
6191    
6192     2003-06-18 Jonathan Coles <[email protected]>
6193    
6194 jonathan 1235 When Thuban loaded the map was redrawn twice because the
6195     legend was being opened after the mainwindow was created
6196     and not during its creation. This meant the map was drawn
6197     initially and then had to be redrawn when the legend
6198     caused the display to change. Now the legend is opened
6199     in the mainwindow constructor which resolves this issue.
6200    
6201     Also, although we were checking for the existence of
6202     gdal and gdalwarp modules, the gdalwarp extension was
6203     still being compiled (which may fail if the system doesn't
6204     have gdal installed). the build_ext command to setup.py
6205     now accepts the flags --with-gdal and --without-gdal.
6206     If --without-gdal is specified setup.py will try to
6207     use the gdal parameters specified by gdal-config. Under
6208     windows, those parameters have to be set in setup.py
6209     as with proj4 an wxWindows.
6210    
6211     * setup.py: Use a list instead of seperate variables for
6212     extension parameters so we can create a generic function
6213     that runs an appropriate *-config script.
6214     (run_cs_script): Renamed from run_wx_script and modified
6215     to accept a second argument which is a list of lists to
6216     be filled in by the values returned from running the command.
6217     (thuban_build_ext): New. Extends the build_ext command and
6218     provides the options --with-gdal/--without-gdal which then
6219     optionally includes the gdalwarp extension.
6220    
6221     * Thuban/Model/resource.py: First check if we can import
6222     the gdalwarp Thuban extension before checking for gdal.
6223     Also added some comments.
6224    
6225     * Thuban/UI/legend.py (ScaleBarBitmap.__SetScale): Check if
6226     the map is None which may be the case if none has been loaded
6227     yet.
6228    
6229     * Thuban/UI/main.py (main): Remove call to ShowLegend.
6230    
6231     * Thuban/UI/mainwindow.py (MainWindow.__init__): Call ShowLegend().
6232    
6233     * Thuban/UI/renderer.py: Check for gdal support before importing
6234     gdalwarp.
6235     (MapRenderer.render_map): Only try to optimize if we have gdal
6236     support otherwise nothing will get drawn.
6237    
6238 jonathan 1237 * Thuban/UI/view.py (MapCanvas.FitMapToWindow): This may be called
6239     during startup before a map has been created. Check if map is None
6240     before using it and do nothing if it is.
6241    
6242 jonathan 1224 2003-06-17 Jonathan Coles <[email protected]>
6243    
6244     Fix the problem with raster layers under Windows that caused
6245     Thuban to crash. The view should respond to layer projection
6246     changed events to update the display. Changes to a projection
6247     should not cause the map to be set to full extent.
6248    
6249     * Thuban/UI/view.py (MapCanvas.__init__): New instance variable
6250     current_map_proj to remember the current map projection so that
6251     when the projection changes we know what the previous projection
6252     was.
6253     (MapCanvas.SetMap): Unsubscribe and subscribe to
6254     LAYER_PROJECTION_CHANGED events.
6255     (MapCanvas.projection_changed): Split into two methods that respond
6256     to map and layer projection changes.
6257     (MapCanvas.map_projection_changed): New. Takes the current view and
6258     projects it using the new projection. This does not cause the
6259     map to be redrawn at full extent.
6260     (MapCanvas.layer_projection_changed): New. Cause a redraw which
6261     will draw each layer in its new projection.
6262    
6263     * extensions/thuban/bmpdataset.cpp (BMPDataset::Open): Call
6264     VSIFClose() not VSIFCloseL() to close the file. Fixes a crash
6265     under Windows.
6266    
6267     * extensions/thuban/gdalwarp.cpp (MFILENAME): Padding should be
6268     to twice sizeof(void*) because there are two digits for each
6269     hex byte.
6270    
6271 bh 1220 2003-06-16 Bernhard Herzog <[email protected]>
6272    
6273     Update to the layer interface: Direct access to the table,
6274     shapetable, shapefile and filename attributes is now actively
6275     deprecated by issuing deprecation warnings for all places where
6276     this happens.
6277    
6278     * Thuban/Model/layer.py (Layer.__getattr__): New. Implement access
6279     to the instance variables table, shapetable, shapefile and
6280     filename via __getattr__ so that we can issue a deprecation
6281     warning.
6282     (Layer.SetShapeStore): Don't set the deprecated instance variables
6283     any more
6284     (Layer.SetShapeStore): Don't use deprecated layer instance
6285     variables
6286     (Layer.Destroy): No need to explicitly remove the instance
6287     variables any more
6288     (Layer.GetFieldType, Layer.Shape): Don't use deprecated layer
6289     instance variables
6290    
6291     * Thuban/UI/classgen.py (ClassGenDialog.__init__)
6292     (GenUniformPanel._OnRetrieve, GenUniquePanel._OnRetrieve)
6293     (GenQuantilesPanel.GetList, GenQuantilesPanel.OnRetrieve): Don't
6294     use deprecated layer instance variables
6295    
6296     * Thuban/UI/classifier.py (Classifier.__init__): Don't use
6297     deprecated layer instance variables
6298    
6299     * Thuban/UI/identifyview.py (IdentifyListCtrl.selected_shape)
6300     (IdentifyGridCtrl.selected_shape): Don't set the deprecated layer
6301     instance variables
6302    
6303     * Thuban/UI/tableview.py (LayerTableGrid.select_shapes): Don't use
6304     deprecated layer instance variables
6305    
6306     * Thuban/UI/mainwindow.py (MainWindow.LayerShowTable): Don't use
6307     deprecated layer instance variables
6308    
6309     * Thuban/Model/save.py (SessionSaver.write_layer): Don't use
6310     deprecated layer instance variables
6311    
6312     * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer)
6313     (MapRenderer.polygon_render_param): Don't use deprecated layer instance
6314     variables
6315    
6316     * test/runtests.py (main): Turn Thuban's deprecation warnings into
6317     errors so that they're cought by the tests
6318    
6319     * test/test_load.py (TestSingleLayer.test): Don't use deprecated
6320     layer instance variables
6321    
6322 jonathan 1212 2003-06-16 Jonathan Coles <[email protected]>
6323    
6324     Fix a problem under Windows whereby if the user double-clicks on a
6325     layer in the legend that tree item will expand or collapse as well
6326     as open the layer properties dialog. The state of the tree item
6327     should not be affected.
6328    
6329     * Thuban/UI/legend.py (LegendTree.__init__): Add instance variable
6330     preventExpandCollapse and subscribe to expanding and collapsing
6331     events.
6332     (LegendTree.OnItemExpandCollapse): New. Responds to expanding and
6333     collapsing events and will veto the event if it has been triggered
6334     by the user double clicking on a layer.
6335     (LegendTree._OnItemActivated): Set preventExpandCollapse to indicate
6336     that an expanding/collapsing event should be vetoed.
6337    
6338 bh 1208 2003-06-13 Bernhard Herzog <[email protected]>
6339    
6340     * Thuban/UI/classifier.py (Classifier.OnClose)
6341     (Classifier.map_layers_removed)
6342     (Classifier.layer_shapestore_replaced): Unsubscribe the messages
6343     in OnClose and not in map_layers_removed or
6344     layer_shapestore_replaced to make sure it always happens when the
6345     dialog is closed
6346    
6347 jonathan 1201 2003-06-13 Jonathan Coles <[email protected]>
6348    
6349 jonathan 1203 This puts back a fix for Windows where a panel is needed so that
6350     the background of the table view appears correctly.
6351    
6352     * Thuban/UI/tableview.py (TableFrame.__init__): Add a panel
6353     object that can be used by derived classes to place any
6354     controls (including the grid) onto.
6355     (QueryTableFrame.__init__): Use the panel as the parent window
6356     for all the controls. Reparent the grid so that the panel is
6357     the parent. Call UpdateStatusText() to correctly initialize
6358     the status bar.
6359    
6360     2003-06-13 Jonathan Coles <[email protected]>
6361    
6362 jonathan 1201 * Thuban/UI/dialogs.py (ThubanFrame): New: a class that inherits
6363     from wxFrame (as opposed to wxDialog like the other classes)
6364     but otherwise behaves like the other classes. This is needed
6365     for the TableView which isn't really a dialog and needs to
6366     have a status bar and control buttons.
6367    
6368     * Thuban/UI/tableview.py (TableGrid.__init__): Create an
6369     instance variable to keep track of how many rows are selected.
6370     Subscribe once to the the events we are interested in.
6371     (ThubanGrid.OnRangeSelect): Only handle event if event handling
6372     hasn't been turned off.
6373     (ThubanGrid.OnSelectCell): Only handle event if event handling
6374     hasn't been turned off.
6375     (ThubanGrid.ToggleEventListeners): Rather than subscribe None
6376     as an event listener (which changes the event handler stack)
6377     simply set an instance variable to False. This is checked in
6378     the event handlers.
6379     (ThubanGrid.GetNumberSelected): Return the number of currently
6380     selected rows.
6381     (TableFrame): Inherit from ThubanFrame so we can have a
6382     status bar and control buttons.
6383     (QueryTableFrame.__init__): Create a status bar. Fixes RTbug #1942.
6384     Explicitly set which items are selected in the operator choice and
6385     action choice so there is always a valid selection. Fixes RTbug #1941.
6386     Subscribe to grid cell selection events so we can update the
6387     status bar.
6388     (QueryTableFrame.UpdateStatusText): Update the status bar with
6389     how many rows are in the grid, how many columns, and how many
6390     rows are selected.
6391     (QueryTableFrame.OnGridSelectRange, QueryTableFrame.OnGridSelectCell):
6392     Call UpdateStatusText when cells are (de)selected.
6393     (QueryTableFrame.OnQuery): Use the string value in the value
6394     combo if either the selected item index is 0 or if the string
6395     cannot be found in the predefined list (this happens if the
6396     user changes the text). Fixes RTbug #1940.
6397     Only turn off the grid event listeners if there a query comes
6398     back with a none empty list of ids. in the case that the list
6399     is empty this causes a grid.ClearSelection() call to actually
6400     clear the grid selection which causes the selected items in
6401     the map to be deselected. Fixes RTbug #1939.
6402    
6403     * test/test_save.py (XMLWriterTest.Encode): Check return values.
6404     Fixes RTbug #1851.
6405    
6406 bh 1195 2003-06-13 Bernhard Herzog <[email protected]>
6407    
6408     * Thuban/UI/identifyview.py (IdentifyView.__init__): Call
6409     self.selected_shape with the current selection to make sure the
6410     contents of the dialog are up to date when it's shown for the
6411     first time.
6412     The dialog used to work without this by luck. The recent fix to
6413     the connector module 'broke' a 'feature' the identify view was
6414     relying on, i.e that subscribing to a message in response to
6415     receiving a message of that type would mean that the new
6416     subscriber would also be called for the same message.
6417    
6418 jonathan 1169 2003-06-12 Jonathan Coles <[email protected]>
6419 jonathan 1175
6420 jonathan 1193 * extensions/thuban/gdalwarp.cpp: Removed debug printing as
6421     the image is rendered. Fixes RTbug #1937.
6422    
6423     2003-06-12 Jonathan Coles <[email protected]>
6424    
6425 jonathan 1191 * Thuban/Lib/fileutil.py: As is done under Windows, create the
6426 jonathan 1193 user directory if it doesn't exist on a posix system.
6427     Fixes RTbug #1815.
6428 jonathan 1191
6429     * Thuban/Model/resource.py (get_user_proj_files): Moved the
6430     called to get_application_dir here, so that the directory
6431     will only be called if this method is invoked.
6432    
6433     * Thuban/UI/projdialog.py (ProjFrame.__DoOnProjAvail): Clear
6434     the projfilepath if no projection is selected.
6435    
6436     2003-06-12 Jonathan Coles <[email protected]>
6437    
6438 jonathan 1182 * Thuban/UI/legend.py (ScaleBarBitmap.__SetScale): Don't draw
6439     the scalebar if the current map has no projection set.
6440    
6441     * Thuban/UI/projdialog.py (ProjFrame.__DoOnProjAvail): Set the
6442     projfilepath label to just the basename of the projection file
6443     rather than include the entire path.
6444    
6445     * Thuban/Model/resource.py: Fix missed proj functions that
6446     needed to be renamed.
6447    
6448     2003-06-12 Jonathan Coles <[email protected]>
6449    
6450 jonathan 1178 * Thuban/Model/classification.py: Removed assert statements that
6451     tested if the variable was an instance of Color.
6452    
6453     * Thuban/Model/color.py (Color): Remove commented code that isn't
6454     used.
6455     (Transparent): Renamed from NoColor. Doesn't inherit from Color.
6456     Fixes RTbug #1835.
6457     (Transparent.__eq__, Transparent.__ne, Transparent.__repr): New.
6458     Needed now that the class doesn't inherit from Color.
6459    
6460     2003-06-12 Jonathan Coles <[email protected]>
6461    
6462 jonathan 1175 * test/test_save.py (XMLWriterTest.testEncode): Explicitly
6463     check unicode strings.
6464    
6465     * test/test_layer.py: Check for existence of gdal.
6466    
6467     2003-06-12 Jonathan Coles <[email protected]>
6468 jonathan 1172
6469     * Thuban/Model/xmlreader.py: New. Contains the XMLReader class
6470     that was in load.py
6471 jonathan 1169
6472 jonathan 1172 * Thuban/Model/xmlwriter.py: New. Contains the XMLWriter class
6473     that was in save.py
6474    
6475     2003-06-12 Jonathan Coles <[email protected]>
6476    
6477 jonathan 1169 This is largely a collection of bug fixes. We also handle the
6478     case where gdal is not on the system. The XMLReader and XMLWriter
6479     classes were moved into there own files to resolve some circular
6480     import references and because they shouldn't really be in the
6481     file that is dediciated to reading/writing session files since
6482     they are also used elsewhere.
6483    
6484     * Thuban/Model/classgen.py: Renamed functions to follow the
6485     function_names_with_underscores style. Fixes RTbug #1903.
6486     (calculate_quantiles): Raise ValueError if 'percents' is invalid.
6487    
6488     * Thuban/Model/layer.py: Import gdal only if it available.
6489     (RasterLayer): Handle the case where the gdal library is unavailable.
6490     Addresses RTbug #1877.
6491    
6492     * Thuban/Model/load.py (XMLReader): Moved into seperate file
6493     xmlreader.py.
6494    
6495 jonathan 1172 2003-06-12 Jonathan Coles <[email protected]>
6496    
6497     This is largely a collection of bug fixes. We also handle the
6498     case where gdal is not on the system. The XMLReader and XMLWriter
6499     classes were moved into there own files to resolve some circular
6500     import references and because they shouldn't really be in the
6501     file that is dediciated to reading/writing session files since
6502     they are also used elsewhere.
6503    
6504     * Thuban/Model/classgen.py: Renamed functions to follow the
6505     function_names_with_underscores style. Fixes RTbug #1903.
6506     (calculate_quantiles): Raise ValueError if 'percents' is invalid.
6507    
6508     * Thuban/Model/layer.py: Import gdal only if it available.
6509     (RasterLayer): Handle the case where the gdal library is unavailable.
6510     Addresses RTbug #1877.
6511    
6512     * Thuban/Model/load.py (XMLReader): Moved into seperate file
6513     xmlreader.py.
6514    
6515 jonathan 1169 * Thuban/Model/save.py (escape, XMLWriter): Moved into seperate
6516     file xmlwriter.py.
6517    
6518     * Thuban/Model/resource.py: Renamed functions to following the
6519     function_names_with_underscores style.
6520     (has_gdal_support): New function that returns true if the gdal
6521     library is available. Addresses RTbug #1877.
6522    
6523     * Thuban/UI/application.py (ThubanApplication.OpenSession):
6524     Display a message box if the gdal library is not available, but
6525     only if there are any layers that would use it. Addresses RTbug #1877.
6526    
6527     * Thuban/UI/classgen.py: Use renamed projection resource functions.
6528     (GenUniformPanel.__CalcStepping): Fix a slight discrepency
6529     when using integers versus floats.
6530    
6531     * Thuban/UI/mainwindow.py (_has_gdal_support): New. Used to
6532     determine if the "Add Image Layer" menu option should be
6533     greyed out or not. Addresses RTbug #1877.
6534    
6535     * Thuban/UI/projdialog.py: Use renamed projection resource functions.
6536    
6537     * Thuban/UI/renderer.py (MapRenderer.render_map): Only try to
6538     optimize if a raster layer is visible. Fixes RTbug #1931.
6539     Only draw the raster layer if the gdal library is available.
6540     Addresses RTbug #1877.
6541    
6542     * test/test_classgen.py: Add tests for generate_singletons,
6543     generate_uniform_distribution, generate_quantiles. Fixes RTbug #1903.
6544     (test_calculate_quantiles): Fix some tests to catch the new
6545     ValueError that is raised.
6546    
6547     * test/test_proj.py: Use renamed projection resource functions.
6548    
6549     * test/test_save.py (SaveSessionTest.testClassifiedLayer): New
6550     test for saving classified layers. Fixes RTbug #1902.
6551     (XMLWriterTest): New. Tests the XMLWriter class. Fixes RTbug #1851.
6552    
6553 jan 1156 2003-06-12 Jan-Oliver Wagner <[email protected]>
6554    
6555     Fix for http://intevation.de/rt/webrt?serial_num=1900.
6556    
6557     * Thuban/UI/multiplechoicedialog.py: New. A multiple choice dialog.
6558    
6559     * Thuban/UI/mainwindow.py: import wxMultipleChoiceDialog from
6560     multiplechoicedialog.py rather than from the wxPython library.
6561    
6562 frank 1151 2003-06-11 Frank Koormann <[email protected]>
6563    
6564 frank 1152 * Thuban/Lib/fileutil.py (get_application_dir): Minor stability
6565     update.
6566    
6567     2003-06-11 Frank Koormann <[email protected]>
6568    
6569 frank 1151 * Thuban/Lib/fileutil.py (get_application_dir): New function to
6570     determine the absolute .thuban/thuban directory under
6571     "posix" (os.expanduser) and "nt" (read AppData registry key).
6572    
6573     * Thuban/Model/resource.py: Use get_application_dir
6574    
6575     * Thuban/UI/application.py (ThubanApplication.read_startup_files):
6576     Use get_application_dir.
6577    
6578 bh 1143 2003-06-10 Bernhard Herzog <[email protected]>
6579    
6580 bh 1147 * Thuban/UI/tableview.py (LayerTableFrame.__init__): Subscribe to
6581     the messages MAP_LAYERS_REMOVED messages
6582     (LayerTableFrame.OnClose): Unsubscribe from it.
6583     (LayerTableFrame.map_layers_removed): New. Receiver for
6584     MAP_LAYERS_REMOVED. Close the dialog when the layer whose the
6585     dialog is showing is removed.
6586    
6587     2003-06-10 Bernhard Herzog <[email protected]>
6588    
6589 bh 1145 * Thuban/Lib/connector.py (Connector.Issue): Iterate over a copy
6590     of the receivers list so that unsubscribing in a receiver doesn't
6591     modify it while iterating over it.
6592    
6593     * test/test_connector.py
6594     (ConnectorTest.test_disconnect_in_receiver): New. Test whether
6595     unsubscribing in a receiver works correctly. See docstring for
6596     details
6597    
6598     2003-06-10 Bernhard Herzog <[email protected]>
6599    
6600 bh 1143 * Thuban/Model/messages.py (LAYER_SHAPESTORE_REPLACED): New
6601     message.
6602    
6603     * Thuban/Model/layer.py (Layer.SetShapeStore): Send
6604     LAYER_SHAPESTORE_REPLACED when the shapestore changes. A
6605     LAYER_CHANGED will still be sent if the classification changes.
6606    
6607     * Thuban/UI/classifier.py (Classifier.__init__): Add the map as
6608     parameter so we can subscribe to some of its messages
6609     (Classifier.__init__): Subscribe to the map's MAP_LAYERS_REMOVED
6610     and the layer's LAYER_SHAPESTORE_REPLACED
6611     (Classifier.unsubscribe_messages): New. Unsubscribe from message
6612     subscribed to in __init__
6613     (Classifier.map_layers_removed)
6614     (Classifier.layer_shapestore_replaced): receivers for the messages
6615     subscribed to in __init__. Unsubscribe and close the dialog
6616    
6617     * Thuban/UI/mainwindow.py (MainWindow.OpenLayerProperties): Pass
6618     the map to the Classifier dialog
6619    
6620     * test/test_layer.py (SetShapeStoreTests): Derive from
6621     SubscriberMixin as well so we can test messages
6622     (SetShapeStoreTests.setUp): Subscribe to some of the layer's
6623     messages
6624     (SetShapeStoreTests.tearDown): Clear the messages again
6625     (SetShapeStoreTests.test_sanity): Expand the doc-string and check
6626     for the modified flag too
6627     (SetShapeStoreTests.test_set_shape_store_modified_flag): New test
6628     to check whether SetShapeStore sets the modified flag
6629     (SetShapeStoreTests.test_set_shape_store_different_field_name)
6630     (SetShapeStoreTests.test_set_shape_store_same_field)
6631     (SetShapeStoreTests.test_set_shape_store_same_field_different_type):
6632     Add tests for the messages. This checks both the new
6633     LAYER_SHAPESTORE_REPLACED and the older LAYER_CHANGED
6634    
6635 jan 1141 2003-06-06 Jan-Oliver Wagner <[email protected]>
6636    
6637     * Thuban/UI/mainwindow.py: Improved and partly added help texts for
6638     the menu items.
6639    
6640 frank 1134 2003-06-05 Frank Koormann <[email protected]>
6641    
6642 frank 1139 * Thuban/UI/identifyview.py (IdentifyView.__init__):
6643     Layout reimplemented without panel. Make life easier to fit the list
6644     in the dialog.
6645    
6646     2003-06-05 Frank Koormann <[email protected]>
6647    
6648 frank 1137 * Thuban/UI/projdialog.py (ProjFrame.__init__): Fill the projchoice
6649     once on initialisation (Former implementation resulted in multiple
6650     entries for each projection).
6651     (ProjFrame.__FillAvailList): selectProj as second optional parameter,
6652     if set, select the projection found under the specified name. This
6653     overwrites any other selection estimate.
6654     Removed projchoice filling from this method.
6655     (ProjFrame._OnSave, ProjFrame._OnAddToList):
6656     Updated call of ProjFrame.__FillAvailList
6657     (LCCPanel._DoLayout): Moved parameter controls in more common order.
6658    
6659     * Resources/Projections/defaults.proj: Extended defaults representing
6660     various common European projections.
6661    
6662     2003-06-05 Frank Koormann <[email protected]>
6663    
6664 frank 1134 * Thuban/UI/identifyview.py (IdentifyView.__init__):
6665     Use ListCtrl instead of GridCtrl
6666    
6667     * Thuban/Model/resource.py:
6668     Guess location of .thuban directory from tempdir parent directory.
6669    
6670     * Thuban/UI/application.py (ThubanApplication.read_startup_files):
6671     Guess location of .thuban directory from tempdir parent directory.
6672    
6673 bh 1130 2003-06-04 Bernhard Herzog <[email protected]>
6674    
6675     Do not cache the values returned by the tree widget's
6676     GetFirstChild and GetNextChild methods because it led to lots of
6677     segfaults. The new way requires more brute force but is more
6678     reliable.
6679    
6680     * Thuban/UI/legend.py (LegendTree.__init__): Remove instance
6681     variable layer2id
6682     (LegendTree.find_layer): New method to do with brute force what
6683     layer2id tried to accomplish
6684     (LegendTree._OnMsgLayerChanged)
6685     (LegendTree._OnMsgLayerTitleChanged, LegendTree.__ShowHideLayer):
6686     Use find_layer instead of layer2id
6687     (LegendTree.__RemoveLayer, LegendTree.__AddLayer): No need to
6688     update layer2id anymore
6689     (LegendTree._OnMsgMapLayersRemoved)
6690     (LegendTree._OnMsgMapLayersAdded): Get by without layer2id.
6691    
6692 tkoester 1128 2003-06-03 Thomas Koester <[email protected]>
6693    
6694     * Thuban/Model/classgen.py (GenQuantiles0): New function.
6695    
6696 bh 1120 2003-06-02 Bernhard Herzog <[email protected]>
6697    
6698 bh 1127 * Thuban/UI/mainwindow.py (layer_rename command, table_rename command):
6699     New commands.
6700     (main_menu): Add the new commands.
6701     (MainWindow.TableRename): New. Implementation of the table_rename
6702     command.
6703     (MainWindow.RenameLayer): New. Implementation of the layer_rename
6704     command.
6705    
6706     * Thuban/Model/session.py (Session.AddTable): call self.changed to
6707     set the modified flag
6708    
6709     * test/test_session.py (TestSessionSimple.test_add_table): Test
6710     whether the modified flag is set properly
6711    
6712     * Thuban/Model/base.py (TitledObject.SetTitle): Call changed
6713     instead of issue so that the modified flags get updated.
6714    
6715     * test/test_base.py (SomeTitledObject): Derive from Modifiable
6716     instead of Publisher to reflect reality better and to accomodate
6717     the fact that SetTitle now calls changed instead of issue
6718    
6719     2003-06-02 Bernhard Herzog <[email protected]>
6720    
6721     * Thuban/UI/classgen.py (GenQuantilesPanel.GetList): Resource
6722     acquisition has to happen before the try in a try-finally.
6723    
6724     2003-06-02 Bernhard Herzog <[email protected]>
6725    
6726 bh 1120 * Thuban/UI/legend.py (LegendTree._OnMsgMapLayersRemoved): It's
6727     possible that a layer is removed that is not currently selected in
6728     the legend so don't check for this.
6729    
6730 bh 1112 2003-05-30 Bernhard Herzog <[email protected]>
6731    
6732 bh 1118 * Thuban/Model/layer.py (Layer.Destroy): Set all instance
6733     variables to None that have direct or indirect references to
6734     shapefiles or dbf files to make sure that they do go away and the
6735     files are closed.
6736    
6737     2003-05-30 Bernhard Herzog <[email protected]>
6738    
6739 bh 1116 * Thuban/UI/legend.py (LegendTree.GetRootItem): Reset
6740     availImgListIndices when a new image list is created
6741    
6742     2003-05-30 Bernhard Herzog <[email protected]>
6743    
6744 bh 1114 * Thuban/UI/legend.py (LegendTree.__init__): New instance variable
6745     changing_selection to indicate whether the LegendTree code itself
6746     is currently changing the selection
6747     (LegendTree.normalize_selection): New method to normalize the
6748     selection by selecting the layer item even if the user clicked on
6749     the classification.
6750     (LegendTree._OnSelChanged): normalize the selection. This works
6751     around a bug in wx which doesn't keep track of the selection
6752     properly when subtrees are deleted.
6753    
6754     2003-05-30 Bernhard Herzog <[email protected]>
6755    
6756 bh 1112 * Thuban/UI/view.py (MapCanvas.set_view_transform): Limit the
6757     maximum and minimum scale factors.
6758    
6759     * test/test_classgen.py (ClassGenTest.test): Update to reflect the
6760     changes in classgen.py
6761    
6762 jonathan 1109 2003-05-30 Jonathan Coles <[email protected]>
6763    
6764     * Thuban/Model/classgen.py: Remove ClassGenerator class but make
6765     all the methods functions. Fixes RTBug #1903.
6766    
6767     * Thuban/Model/map.py (Map.TopLayer, Map.BottomLayer): Renamed
6768     to MoveLayerToTop and MoveLayerToBottom respectively. Fixes
6769     RTBug #1907.
6770    
6771     * Thuban/UI/classgen.py: Use classgen functions that were part
6772     of the ClassGenerator class. Put try/finally blocks around
6773     code that uses wxBeginBusyCursor()/wxEndBusyCursor(). Fixes
6774     RTBug #1904.
6775    
6776     * Thuban/UI/classifier.py: Remove unused import of ClassGenerator.
6777    
6778     * Thuban/UI/legend.py: The legend was cleared and repopulated any
6779     time something changed which caused some state to be lost such
6780     as which children were expanded or collapsed. Fixes RTBug #1901.
6781     (LegendTree._OnMsgMapLayersAdded): Add only new layers.
6782     (LegendTree.__OnMsgMapLayersRemoved): Remove layers that exist in
6783     the legend but not in the map.
6784     (LegendTree.__FillTree): Move main functionality out into smaller
6785     methods that can be used by other methods.
6786     (LegendTree.__FillTreeLayer): Reuse old slots in the image list
6787     if they are available.
6788     (LegendTree.DeleteAllItems): Renamed from __DeleteAllItems so
6789     that we override the wxTreeCtrl method. Iterate over children
6790     and call __RemoveLayer.
6791     (LegendTree.__AddLayer): New. Add a new layer to the legend.
6792     (LegendTree.__RemoveLayer): Remove a layer from the legend.
6793     (LegendTree.DeleteChildren): New, overrides wxTreeCtrl method.
6794     Should only be called with the id of a layer branch.
6795     (LegendTree.GetRootItem): New, overrides wxTreeCtrl method.
6796     Returns the root item or creates one if necessary.
6797    
6798     * Thuban/UI/renderer.py (MapRenderer.draw_raster_layer): Call
6799     ProjectRasterFile with tuple arguments instead of strings.
6800    
6801     * Thuban/UI/tableview.py (QueryTableFrame.OnQuery): Wrap code
6802     with try/finally. Fixes RTBug #1904.
6803    
6804     * Thuban/UI/view.py (MapCanvas.OnPaint): Wrap code
6805     with try/finally. Fixes RTBug #1904.
6806     (MapCanvas.FitSelectedToWindow): If a single point is selected
6807     simply center it on the display. Fixes RTBug #1849.
6808    
6809     * extensions/thuban/gdalwarp.cpp: Removed code that allowed gdalwarp
6810     to be compiled as a standalone app. Now the code can only be
6811     called from Python which simplifies the parameter passing.
6812     (ProjectRasterFile): Handle Python arguments. Remove code that
6813     checks for a destination dataset. Add more clean up code.
6814    
6815     * test/test_map.py (TestMapWithContents.test_raise_layer_top,
6816     TestMapWithContents.test_lower_layer_bottom):
6817     Test Map.MoveLayerToTop() and Map.MoveLayerToBottom() respectively.
6818     Fixes RTBug #1907.
6819    
6820     * Thuban/UI/mainwindow.py (MainWindow.ToggleLegend): Apply a full
6821     extent to the map when the legend is toggled. Fixes RTBug #1881.
6822    
6823 jan 1097 2003-05-29 Jan-Oliver Wagner <[email protected]>
6824    
6825     * Thuban/UI/tableview.py (LayerTableFrame.OnClose): Bug-fix: Now
6826     unsubscribes all that is subcribed in __init__.
6827    
6828 bh 1089 2003-05-28 Bernhard Herzog <[email protected]>
6829    
6830 bh 1095 * Thuban/UI/mainwindow.py (MainWindow.DuplicateLayer)
6831     (MainWindow.CanDuplicateLayer): New methods to implement the
6832     Layer/Duplicate command.
6833     (layer_duplicate command): New.
6834     (main_menu): Add layer_duplicate to the Layer menu.
6835    
6836     2003-05-28 Bernhard Herzog <[email protected]>
6837    
6838 bh 1093 * Thuban/UI/tableview.py (NullRenderer.Draw): New. Our own
6839     renderer so that NULL/None values get displayed differently (by a
6840     gray rectangle).
6841     (TableGrid.__init__): Override the default renderers
6842    
6843     2003-05-28 Bernhard Herzog <[email protected]>
6844    
6845 bh 1089 * Thuban/Model/layer.py (Layer.SetShapeStore): Set the
6846     classification to "None" if the type of the field has changed.
6847    
6848     * test/test_layer.py (SetShapeStoreTests): New. Class with a few
6849     test for the Layer.SetShapeStore method
6850    
6851 jan 1087 2003-05-28 Jan-Oliver Wagner <[email protected]>
6852 jan 1085
6853 jan 1087 * Thuban/Model/layer.py (Layer.TreeInfo): Fixed a bug (a layer
6854     does not necessarily have a filename).
6855    
6856     2003-05-28 Jan-Oliver Wagner <[email protected]>
6857    
6858 jan 1085 * Thuban/UI/mainwindow.py (MainWindow.TableClose, MainWindow.TableShow):
6859     sort the selection list for the dialog.
6860    
6861 frank 1083 2003-05-28 Frank Koormann <[email protected]>
6862    
6863     * extensions/thuban/wxproj.cpp
6864     (project_point): Removed cast to int for projected point coordinates.
6865     (shape_centroid): Return last point if all polygon vertices fall
6866     to one point.
6867    
6868 bh 1079 2003-05-28 Bernhard Herzog <[email protected]>
6869    
6870 bh 1081 * Thuban/UI/mainwindow.py (_can_unjoin): Add doc-string and cope
6871     with layers that don't have shapestores, i.e. raster layers.
6872    
6873     2003-05-28 Bernhard Herzog <[email protected]>
6874    
6875 bh 1079 * Thuban/Model/table.py (DBFTable.__init__): Omit the extension
6876     when determining the title from the filename.
6877    
6878     * test/test_dbf_table.py (TestDBFTable.test_title): Update to
6879     reflect changes in the way the title is derived from the filename
6880    
6881 frank 1077 2003-05-28 Frank Koormann <[email protected]>
6882    
6883     * Thuban/UI/mainwindow.py (MainWindow.TableShow):
6884     Added wxDEFAULT_DIALOG_STYLE to show table dialog styles.
6885    
6886 bh 1069 2003-05-27 Bernhard Herzog <[email protected]>
6887    
6888 bh 1075 * Thuban/UI/mainwindow.py (MainWindow.delegated_messages): Also
6889     delegate SelectedLayer.
6890     (MainWindow.LayerUnjoinTable): Implement.
6891     (_can_unjoin): New. Helper function for the sensitivity of the
6892     layer/unjoin command.
6893    
6894     * Thuban/Model/data.py (ShapefileStore.OrigShapeStore)
6895     (DerivedShapeStore.OrigShapeStore): New. Return the original
6896     shapestore. Used to figure out how to unjoin.
6897     (DerivedShapeStore.Shapefile): Fix a typo.
6898    
6899     2003-05-27 Bernhard Herzog <[email protected]>
6900    
6901 bh 1073 * Thuban/UI/join.py (JoinDialog): Extend to handle layer joins as
6902     well
6903     (JoinDialog.__init__): Use the layer parameter and only build the
6904     left choice when a layer is given
6905     (JoinDialog.OnJoin): Handle layer joins as well
6906     (JoinDialog.OnLeftTable, JoinDialog.OnRightTable): Handle the case
6907     that the user selects the "Select..." item. The sensitivitly
6908     updating is now in update_sensitivity
6909     (JoinDialog.y): New method to refactor the sensitivity update of
6910     the join button into its own method.
6911    
6912     * Thuban/UI/mainwindow.py (MainWindow.LayerJoinTable): Implement.
6913    
6914     2003-05-27 Bernhard Herzog <[email protected]>
6915    
6916 bh 1071 * Thuban/UI/mainwindow.py (table_close command): Make it sensitive
6917     iff there are unreferenced tables in the session
6918    
6919     2003-05-27 Bernhard Herzog <[email protected]>
6920    
6921 bh 1069 * Thuban/Model/messages.py (TABLE_REMOVED): New message.
6922    
6923     * Thuban/Model/session.py (Session.UnreferencedTables): New method
6924     to return tables that are not referenced by other tables or shape
6925     stores and can be removed.
6926     (Session.RemoveTable): Issue a TABLE_REMOVED message after
6927     removing the table
6928    
6929     * Thuban/UI/mainwindow.py: Remove unused imports
6930     (MainWindow.TableClose): Implement.
6931    
6932     * Thuban/UI/tableview.py (TableFrame.__init__): Subscribe to some
6933     messages so that the frame will be automatically closed when a new
6934     session is opened or the table is removed.
6935     (TableFrame.OnClose): Unsubscribe the Subscriptions made in
6936     __init__
6937     (TableFrame.close_on_session_replaced)
6938     (TableFrame.close_on_table_removed): New. Subscribers that close
6939     the window
6940    
6941     * test/test_session.py (TestSessionMessages.test_remove_table)
6942     (TestSessionSimple.test_remove_table): Move the test to
6943     TestSessionSimple and add test for the TABLE_REMOVED message
6944     (TestSessionBase.setUp): Also subscribe to TABLE_REMOVED
6945     (TestSessionSimple.test_unreferenced_tables) New. Test for the
6946     UnreferencedTables method.
6947     (UnreferencedTablesTests): New. Class with some more sophisticated
6948     tests for UnreferencedTables.
6949    
6950 frank 1065 2003-05-27 Frank Koormann <[email protected]>
6951    
6952 frank 1067 * Thuban/UI/tableview.py (QueryTableFrame.__init__): The "_S_election"
6953     display has some unwanted side effects. Removed again.
6954    
6955     2003-05-27 Frank Koormann <[email protected]>
6956    
6957 frank 1065 * Resources/Bitmaps/legend_icon_layer.xpm: New, icon for legend.
6958    
6959     * Thuban/UI/legend.py (LegendTree.__FillTree): Use "legend_icon_layer"
6960    
6961 jan 1062 2003-05-27 Jan-Oliver Wagner <[email protected]>
6962    
6963 bh 1069 * test/test_menu.py (MenuTest.test): Added test for
6964     Menu.RemoveItem().
6965 jan 1062
6966 bh 1069 * Thuban/UI/menu.py (Menu.RemoveItem): New. Remove an item from
6967     the menu.
6968 jan 1062
6969 frank 1059 2003-05-27 Frank Koormann <[email protected]>
6970    
6971     Nonmodal dialogs without parent (i.e. they can fall behind the main
6972     window)
6973    
6974     * Thuban/UI/mainwindow.py (MainWindow.OnClose): Explicitly destroy
6975     all dialogs in the dialogs dictionary and the canvas.
6976    
6977     * Thuban/UI/dialogs.py (NonModalNonParentDialog): New class, without
6978     parent, i.e. can fall behind other windows.
6979     (NonModalDialog.OnClose): Check is dialog is in mainwindow.dialog
6980     dictionary before removing it.
6981    
6982     * Thuban/UI/classifier.py: Dialog derived from NonModalNonParentDialog
6983    
6984     * Thuban/UI/projdialog.py: Dialog derived from NonModalNonParentDialog
6985     * Thuban/UI/tableview.py: Dialog derived from NonModalNonParentDialog
6986     * Thuban/UI/tree.py: Dialog derived from NonModalNonParentDialog
6987    
6988 bh 1053 2003-05-27 Bernhard Herzog <[email protected]>
6989    
6990 bh 1055 * Thuban/UI/mainwindow.py (MainWindow.ShowTableView): New. Open a
6991     tableview dialog
6992     (MainWindow.TableShow): Use ShowTableView to open the dialogs.
6993     Also, don't use the table's titles as the dialog names. The titles
6994     aren't guaranteed to be unique.
6995     (MainWindow.TableOpen): Open a table view dialog after opening the
6996     table
6997    
6998     2003-05-27 Bernhard Herzog <[email protected]>
6999    
7000 bh 1053 * Thuban/UI/mainwindow.py: Remove the Table/Hide menu item. Its
7001     effect can be achieved by simply closing the window showing the
7002     table.
7003     (MainWindow.TableHide): Removed.
7004     (main_menu): Removed "table_hide"
7005    
7006 frank 1051 2003-05-27 Frank Koormann <[email protected]>
7007    
7008     Fix legend tree display problems under Win32
7009    
7010     * Thuban/UI/legend.py: BMP_SIZE_W = 15
7011     (LegendTree.__FillTree): Display "legend_icon_map.xpm" with layer title.
7012     (LegendTree.__FillTreeLayer): Explicitely set SelectedImage.
7013    
7014     * Resources/Bitmaps/legend_icon_map.xpm: New icon for legend.
7015    
7016 jan 1048 2003-05-27 Jan-Oliver Wagner <[email protected]>
7017    
7018     * Thuban/UI/menu.py (Menu.InsertSeparator): Additional optional parameter
7019     'after' now allows to insert separators almost anywhere in the menu.
7020    
7021 frank 1046 2003-05-27 Frank Koormann <[email protected]>
7022    
7023     * Thuban/UI/tableview.py (QueryTableFrame.__init__): Underline the
7024     "S" of selection box label to hint on hot key (Alt-S). Works under
7025     Win32 but is ignored under GTK.
7026    
7027     2003-05-26 Frank Koormann <[email protected]>
7028    
7029     * Thuban/UI/projdialog.py (ProjFrame.__do_layout, ProjPanel._DoLayout):
7030     Center Choices.
7031    
7032 bh 1038 2003-05-26 Bernhard Herzog <[email protected]>
7033    
7034 bh 1044 Remove the Precision methods again. They're too DBF specific to be
7035     part of the table interface and they're only used in table_to_dbf
7036     anyway.
7037    
7038     * Thuban/Model/transientdb.py (TransientTableBase.Width):Use a
7039     fixed precision of 12 for doubles.
7040     (TransientTableBase.Precision): Removed
7041     (AutoTransientTable.Width): Delegate to self.table.
7042    
7043     * Thuban/Model/table.py (DBFTable.Precision)
7044     (MemoryTable.Precision): Removed.
7045     (MemoryTable.Width): Use a fixed precision of 12 for doubles.
7046     (table_to_dbf): Use a fixed precision of 12 for floats unless the
7047     column object specifies something else.
7048    
7049     * test/test_dbf_table.py (TestTableToDBF.test_table_to_dbf): New.
7050     test for table_to_dbf
7051    
7052     2003-05-26 Bernhard Herzog <[email protected]>
7053    
7054     * test/test_transientdb.py
7055     (TestTransientTable.run_iceland_political_tests): Fix a comment.
7056    
7057     2003-05-26 Bernhard Herzog <[email protected]>
7058    
7059 bh 1038 * Thuban/UI/mainwindow.py (MainWindow.TableOpen): Real
7060     implementation. Mark parts of the file format strings for
7061     localization.
7062    
7063     * Thuban/Model/session.py (Session.OpenTableFile): New. Open a dbf
7064     file and add the table to the tables managed by the session
7065    
7066 bh 1040 * test/test_session.py (TestSessionSimple.test_open_table_file):
7067     New. test case for OpenTableFile
7068    
7069 jan 1033 2003-05-26 Jan-Oliver Wagner <[email protected]>
7070    
7071 jan 1035 * Thuban/UI/controls.py, Thuban/UI/identifyview.py, Thuban/UI/join.py,
7072     Thuban/UI/labeldialog.py, Thuban/UI/mainwindow.py,
7073     Thuban/UI/proj4dialog.py, Thuban/UI/tableview.py, Thuban/UI/view.py:
7074     Replace the true/false of wxWindows by True/False of Python 2.2.1.
7075    
7076     2003-05-26 Jan-Oliver Wagner <[email protected]>
7077    
7078 bh 1038 * Thuban/UI/tableview.py (LayerTableFrame.__init__): If there is
7079     already a selection present, update the grid accordingly.
7080 jan 1033
7081     * Thuban/UI/mainwindow.py (MainWindow.TableShow): Make the dialog
7082     resizeable and increase its initial size.
7083    
7084 frank 1030 2003-05-26 Frank Koormann <[email protected]>
7085    
7086     Table export functionality
7087    
7088     * Thuban/Model/table.py (DBFTable.Width, MemoryTable.Width):
7089     Return width (in characters) for a column.
7090     (DBFTable.Precision, MemoryTable.Precision): Return decimal precision.
7091     (table_to_dbf): Write table to dbf file.
7092     (table_to_csv): Write table to csv file.
7093    
7094     * Thuban/Model/transientdb.py (TransientTableBase.Width,
7095     TransientTableBase.Precision): Return column width and precision.
7096    
7097     * Thuban/UI/tableview.py (QueryTableFrame.OnSaveAs): Call table_to_dbf
7098     or table_to_csv depending on file selection.
7099    
7100     * test/test_dbf_table.py:
7101     Test table_to_dbf (extension of former part of test).
7102    
7103     * test/test_csv_table.py:
7104     Test table_to_csv.
7105    
7106 jan 1021 2003-05-23 Jan-Oliver Wagner <[email protected]>
7107    
7108 jan 1024 * Thuban/UI/join.py (JoinDialog.OnJoin): Use _() for strings.
7109     Use QueryTableFrame instead of TableFrame.
7110 jan 1021
7111 jan 1024 * Thuban/UI/mainwindow.py (MainWindow.LayerShowTable): Prefix the
7112     table window with 'Layer Table:' instead of 'Table:'.
7113    
7114     2003-05-23 Jan-Oliver Wagner <[email protected]>
7115    
7116     Give all tables a title via mix-in TitledObject.LayerShowTable
7117    
7118 jan 1021 * Thuban/Model/base.py (TitledObject.SetTitle): Call method 'issue'
7119     only if it exists.
7120    
7121     * Thuban/Model/table.py (DBFTable, MemoryTable): mix-in TitledObject
7122     and call its init-method with a default title. Remove Title() method.
7123    
7124     * Thuban/Model/transientdb.py (TransientTable, TransientJoinedTable,
7125     AutoTransientTable): mix-in TitledObject and call its init-method with
7126     a default title. Remove Title() method.
7127    
7128 bh 1017 2003-05-23 Bernhard Herzog <[email protected]>
7129    
7130     * Thuban/Model/session.py (Session.AddShapeStore): Define
7131     AddShapeStore analogously to AddTable.
7132    
7133     * test/test_session.py (TestSessionSimple.test_add_shapestore):
7134     New. Test for AddShapeStore
7135    
7136 jan 1015 2003-05-23 Jan-Oliver Wagner <[email protected]>
7137    
7138     Introducing QueryTableFrame and a very coarse ShowTable implementation.
7139    
7140     * Thuban/UI/tableview.py (LayerTableFrame, QueryTableFrame): Split the
7141     class LayerTableFrame into two classes, LayerTableFrame and QueryTableFrame.
7142     The latter implements the selection GUI without dependency on a layer.
7143     LayerTableFrame now is derived from QueryTableFrame and connects
7144     to a layer.
7145    
7146     * Thuban/UI/mainwindow.py (MainWindow.TableShow): A very coarse
7147     implementation that still needs work.
7148    
7149     * Thuban/Model/layer.py (Layer.TreeInfo): Added filename.
7150    
7151 frank 1011 2003-05-22 Frank Koormann <[email protected]>
7152    
7153     * Thuban/Model/transientdb.py (TransientJoinedTable.__init__):
7154     Added "outer_join = False" as optional parameter.
7155     (TransientJoinedTable.create): If outer join is true, perform a
7156     "LEFT OUTER JOIN" instead of "JOIN", which preserves all records of
7157     the left table. Records not matching are filled with 0 / None.
7158    
7159     * Thuban/UI/join.py (JoinDialog.__init__): Checkbox for outer join.
7160     (JoinDialog.OnJoin): Consider outer join check box.
7161    
7162 bh 1006 2003-05-22 Bernhard Herzog <[email protected]>
7163    
7164 bh 1008 * Thuban/UI/join.py (JoinDialog.OnJoin): Use exc_info in a
7165     somewhat safer way. Storing the traceback in a local variable can
7166     lead to memory leaks
7167    
7168     2003-05-22 Bernhard Herzog <[email protected]>
7169    
7170 bh 1006 * Thuban/UI/join.py (JoinDialog.OnJoin): Make sure to really call
7171     the wxMessageDialog's Destroy() method.
7172    
7173 frank 1004 2003-05-22 Frank Koormann <[email protected]>
7174    
7175     * Thuban/UI/join.py (JoinDialog.__init__): Make use of
7176     TransientTable.Title()
7177    
7178     2003-05-22 Frank Koormann <[email protected]>
7179    
7180     Join Dialog, initial version.
7181    
7182     * Thuban/UI/mainwindow.py (MainWindow.TableJoin): Removed print.
7183    
7184     * Thuban/UI/join.py (JoinDialog): Functional implementation of
7185     former framework. Renamed Table1/Table2 to LeftTable/RightTable
7186     in all occurences.
7187    
7188     * Thuban/Model/transientdb.py (TransientJoinedTable.__doc__):
7189     Typo fixed.
7190    
7191 bh 995 2003-05-22 Bernhard Herzog <[email protected]>
7192    
7193 bh 999 Give the tables titles so that the GUI can display more meaningful
7194     names. For now the titles are fixed but depend on e.g. filenames
7195     or the titles of the joined tables.
7196    
7197     * Thuban/Model/transientdb.py (TransientTable.Title)
7198     (TransientJoinedTable.Title, AutoTransientTable.Title): New.
7199    
7200     * Thuban/Model/table.py (DBFTable.Title, MemoryTable.Title): New.
7201    
7202     * test/test_transientdb.py
7203     (TestTransientTable.test_auto_transient_table_title): New. Test
7204     for the Title method
7205     (TestTransientTable.test_transient_joined_table)
7206     (TestTransientTable.test_transient_table): Add test for the Title
7207     methods
7208    
7209     * test/test_memory_table.py (TestMemoryTable.test_title): New.
7210     Test for the Title method
7211    
7212     * test/test_dbf_table.py (TestDBFTable.test_title): New. Test for
7213     the Title method
7214    
7215     2003-05-22 Bernhard Herzog <[email protected]>
7216    
7217 bh 997 * test/test_layer.py (TestLayer.setUp, TestLayer.tearDown):
7218     Provide a better way to destroy the layers
7219     (TestLayer.test_base_layer, TestLayer.test_arc_layer)
7220     (TestLayer.test_point_layer, TestLayer.test_empty_layer)
7221     (TestLayer.test_polygon_layer, TestLayer.test_get_field_type): Use
7222     the new way to destroy the layers.
7223     (TestLayer.test_derived_store): New. Test for using a layer with a
7224     DerivedShapeStore
7225    
7226     * Thuban/Model/layer.py (Layer.SetShapeStore): Only set the
7227     filename if the shape store actually has one.
7228    
7229     2003-05-22 Bernhard Herzog <[email protected]>
7230    
7231 bh 995 * Thuban/Model/table.py (DBFTable.FileName): New. Accessor method
7232     for the filename
7233    
7234     * test/test_dbf_table.py (TestDBFTable.test_filename): New. Test
7235     for the FileName method
7236     (TestDBFTableWriting.test_write): Fix spelling of filename
7237    
7238 tkoester 993 2003-05-22 Thomas Koester <[email protected]>
7239    
7240     * Thuban/Model/range.py, test/test_range.py: Brought over new Range
7241     from SciParam that now really is immutable.
7242    
7243 frank 992 2003-05-22 Frank Koormann <[email protected]>
7244    
7245     Layer Top/Bottom placement added to legend.
7246    
7247     * Thuban/UI/legend.py
7248     (LegendPanel._OnMoveTop(), LayerPanel._OnMoveBottom): New, methods
7249     bound to tool events.
7250     (LegendTree.MoveCurrentItemTop(), LegendTree.MoveCurrentItemBottom):
7251     New, methods binding the event methods with the map methods.
7252    
7253     * Thuban/Model/map.py (Map.TopLayer(), Map.BottomLayer()): New, place
7254     layer at top/bottom of layer stack.
7255    
7256     * Resources/Bitmaps/top_layer.xpm: New button icon.
7257    
7258     * Resources/Bitmaps/bottom_layer.xpm: New button icon.
7259    
7260 bh 988 2003-05-22 Bernhard Herzog <[email protected]>
7261    
7262     * Thuban/Model/session.py (Session.RemoveTable): New method to
7263     remove tables
7264    
7265     * test/test_session.py (TestSessionSimple.test_remove_table): New.
7266     Test for RemoveTable
7267    
7268 tkoester 986 2003-05-22 Thomas Koester <[email protected]>
7269    
7270     * Thuban/Model/classgen.py: Added short module doc string and CVS id.
7271     (ClassGenerator.GenUniformDistribution): Use new Range __init__, too.
7272    
7273 bh 983 2003-05-22 Bernhard Herzog <[email protected]>
7274    
7275 bh 985 Implement a way to discover dependencies between tables and
7276     shapestores.
7277    
7278     * Thuban/Model/transientdb.py (TransientTableBase.Dependencies)
7279     (TransientJoinedTable.Dependencies)
7280     (AutoTransientTable.SimpleQuery): New. Implement the dependencies
7281     interface
7282     (TransientJoinedTable.__init__): Keep tack of the original table
7283     objects in addition to the corresponding transient tables.
7284    
7285     * Thuban/Model/table.py (DBFTable.Dependencies)
7286     (MemoryTable.Dependencies): New. Implement the dependencies
7287     interface
7288    
7289     * Thuban/Model/data.py (ShapeTable): New. Helper class for
7290     ShapefileStore
7291     (ShapefileStore.__init__): Use ShapeTable instead of
7292     AutoTransientTable
7293     (ShapefileStore.Table, ShapefileStore.Shapefile): Add doc-strings
7294     (ShapefileStore.FileName, ShapefileStore.FileType): New. Accessor
7295     methods for filename and type
7296     (ShapefileStore.Dependencies): New. Implement the dependencies
7297     interface
7298     (DerivedShapeStore): New class to replace SimpleStore. The main
7299     difference to SimpleStore is that it depends not on a shapefile
7300     but another shapestore which expresses the dependencies a bit
7301     better
7302     (SimpleStore.__init__): Add deprecation warning.
7303    
7304     * test/test_dbf_table.py (TestDBFTable.test_dependencies): New.
7305     Test for the Dependencies method.
7306    
7307     * test/test_memory_table.py (TestMemoryTable.test_dependencies):
7308     New. Test for the Dependencies method.
7309    
7310     * test/test_transientdb.py
7311     (TestTransientTable.test_auto_transient_table_dependencies): New.
7312     Test for the Dependencies method.
7313     (TestTransientTable.test_transient_joined_table): Add test for the
7314     Dependencies method.
7315    
7316     * test/test_session.py (TestSessionSimple.setUp)
7317     (TestSessionSimple.tearDown): New. Implement a better way to
7318     destroy the sessions.
7319     (TestSessionSimple.test_initial_state)
7320     (TestSessionSimple.test_add_table): Bind session to self.session
7321     so that it's destroyed by tearDown
7322     (TestSessionSimple.test_open_shapefile): New. Test for
7323     OpenShapefile and the object it returns
7324    
7325     2003-05-22 Bernhard Herzog <[email protected]>
7326    
7327 bh 983 * Thuban/Model/session.py (Session.AddTable): New method to
7328     register tables with the session.
7329     (Session.Tables): Return the tables registered with AddTable too.
7330    
7331     * test/test_session.py (TestSessionSimple.test_add_table): New.
7332     Test case for the AddTable method
7333    
7334 frank 981 2003-05-22 Frank Koormann <[email protected]>
7335    
7336     UI polishing updates: Place main buttons (OK, Cancel, etc) in the
7337     lower right corner, center labels for selections, initialize controls
7338     in reasonable order for keyboard navigation.
7339    
7340     * Thuban/UI/projdialog.py (ProjFrame.__init__, ProjFrame.__doLayout)
7341     (ProjFrame.__DoOnProjAvail): Determine position of current projection
7342     using the wxListBox.FindString() method. Still a problem (#1886)
7343    
7344     * Thuban/UI/classifier.py
7345     (Classifier.__init__, SelectPropertiesDialog.__init__)
7346    
7347     * Thuban/UI/classgen.py (ClassGenDialog.__init__,
7348     (ClassGenDialog.__DoOnGenTypeSelect): Moved initialization of the
7349     different classification types from here to __init__.
7350     (GenUniquePanel.__init__): Set the column width of the first field
7351     in the Field ListCtrl to the full width.
7352    
7353     * Thuban/UI/tableview.py (LayerTableFrame.__init__): Rename 'Save As'
7354     Button to 'Export'. Center Buttons in Selection Box, set Focus to
7355     Grid.
7356     (LayerTableFrame.OnKeyDown()): New, bound to the grid with EVT_KEY_DOWN,
7357     changes focus to the Selection when pressing "Alt-S".
7358    
7359     * Thuban/UI/legend.py (LegendTree.__SetVisibilityStyle): Only gray out
7360     the text if not visible. The italic font sometimes exceeds the
7361     rendering area.
7362    
7363 jonathan 972 2003-05-21 Jonathan Coles <[email protected]>
7364 jonathan 971
7365 jonathan 975 * Thuban/UI/dock.py (DockFrame): Rename references to _OnClose
7366     to OnClose so that Thuban closes correctly.
7367    
7368     * Thuban/UI/mainwindow.py (MainWindow.OnClose): Call
7369     DockFrame.OnClose, not DockFrame._OnClose.
7370    
7371     2003-05-21 Jonathan Coles <[email protected]>
7372    
7373 jonathan 971 * Thuban/Model/classgen.py (ClassGenerator.GenQuantiles): Remove
7374     references to 'inf' and use new Range __init__ to pass floats
7375     directly rather than converting them to strings first.
7376     Fixes RTBug #1876.
7377    
7378     * Thuban/Model/classification.py (ClassGroupRange.SetRange):
7379     Use new Range ___init__ to pass floats.
7380    
7381     * Thuban/Model/layer.py (RasterLayer.__init__): Test if the
7382     filename is a valid image file. Throw IOError otherwise.
7383    
7384     * Thuban/Model/range.py: Brought over new Range from SciParam that
7385     is immutable and has an __init__ which can accept floats.
7386    
7387     * Thuban/UI/mainwindow.py (MainWindow.AddLayer): Move OpenShapefile
7388     into try block. AddLayer doesn't throw any exceptions anymore.
7389     (MainWindow.AddRasterLayer): Move constructor of RasterLayer into
7390     try block.
7391    
7392     * Thuban/UI/projdialog.py (GeoPanel.__init__): Put Degrees as
7393     the first item in choices. Fixes RTBug #1882.
7394    
7395     * Thuban/UI/renderer.py (MapRenderer.render_map): Check if scale
7396     has gone to 0 which is a serious problem. abort.
7397     (MapRenderer.draw_raster_layer): Catch IOError seperately and
7398     print the error from GDAL.
7399    
7400     * Thuban/UI/tableview.py (TableGrid.__init__): Call
7401     ToggleEventListeners to turn on listening.
7402     (TableGrid.ToggleEventListeners): New. Turns event listening on
7403     and off so as to prevent excessive messages.
7404     (LayerTableFrame.OnQuery): Use TableGrid.ToggleEventListeners
7405     to suppress excessive messages when selecting many rows.
7406     Fixes RTBug #1880.
7407    
7408     * Thuban/UI/view.py: Added checks against if scale == 0. This
7409     is a serious problem that can occur when an image without
7410     geo data is loading and causes the map projection bounds to
7411     go to infinity. Right now, the solution is to simply try
7412     to recover.
7413    
7414     * extensions/thuban/cpl_mfile.cpp (MFILEClose): Make sure
7415     to set the MFILEReceiver attributes even if the data is NULL.
7416    
7417     * extensions/thuban/gdalwarp.cpp: Improved the error handling
7418     and passed GDAL messages back up to the Python layer. Also
7419     tried to fix some memory leaks that were present in the original
7420     utility but didn't matter because the program aborted.
7421    
7422     * test/test_range.py: Copied over tests from SciParam. Removed
7423     tests against importing. Fixes RTBug #1867.
7424    
7425 bh 958 2003-05-21 Bernhard Herzog <[email protected]>
7426    
7427     * test/test_load.py: Remove unused imports and restructure the
7428     test code
7429     (LoadSessionTest): Split into one class for each test and turn
7430     LoadSessionTest itself into the base class for all such session
7431     tests.
7432     (ClassificationTest): New base class for load tests that test
7433     classifications
7434     (TestSingleLayer, TestLayerVisibility, TestClassification)
7435     (TestLabels, TestLayerProjection, TestRasterLayer): New classes
7436     for the individual tests
7437    
7438     * test/support.py (FileLoadTestCase.filename): New base class for
7439     file loading tests
7440    
7441 jan 955 2003-05-21 Jan-Oliver Wagner <[email protected]>
7442    
7443     * Resources/Projections/defaults.proj: Renamed 'Universal Transverse
7444     Mercator' to 'UTM Zone 32' as a more convenient example.
7445     Added 'Gauss Krueger Zone 6'.
7446    
7447     * Data/iceland_sample_raster.thuban: political polygon now
7448     filled transparent to have the raster image visible at once.
7449    
7450 frank 952 2003-05-21 Frank Koormann <[email protected]>
7451    
7452     * Thuban/UI/mainwindow.py (MainWindow): Renamed _OnClose() back to
7453     OnClose() to keep in sync with extensions. Internally Thuban
7454     still uses "underscored" names.
7455    
7456 jonathan 949 2003-05-20 Jonathan Coles <[email protected]>
7457    
7458     This puts back Raster layer support. These layers support projections
7459     through the GDAL library. Currently, the CVS version is being used.
7460     There are no Debian packages available although this may change soon.
7461     A GDAL driver was extended to support writing to memory rather to
7462     files.
7463    
7464     There is still some work that needs to be done, such as some error
7465     handling when loading invalid images or when there is a problem
7466     projecting the image. This putback simply checks in the majority
7467     of the work.
7468    
7469     * setup.py: Add gdalwarp library extension.
7470    
7471     * Thuban/Model/layer.py (BaseLayer.HasClassification): New.
7472     Defaults to False, but can be overridden by subclasses if they
7473     support classification.
7474     (RasterLayer): New. Defines a new layer that represents an
7475     image.
7476    
7477     * Thuban/Model/load.py (SessionLoader.__init__): Add rasterlayer
7478     tag handler.
7479     (SessionLoader.start_layer): Encode the filename.
7480     (SessionLoader.start_rasterlayer, SessionLoader.end_rasterlayer):
7481     New. Supports reading a rasterlayer tag.
7482    
7483     * Thuban/Model/map.py (Map.BoundingBox): Fix typo in comment.
7484    
7485     * Thuban/Model/save.py (XMLWriter.encode): Don't assume that we
7486     get a string in Latin1. If we get such as string convert it to
7487     unicode first, otherwise leave if alone before encoding.
7488     (SessionSaver.write_layer): Add support for writing both Layers
7489     and RasterLayers.
7490    
7491     * Thuban/Model/transientdb.py (AutoTransientTable.SimpleQuery):
7492     The right argument may not be a string, it could also be a Column.
7493    
7494     * Thuban/UI/application.py (ThubanApplication.CreateMainWindow):
7495     Make initial window size 600x400. Fixes RTBug #1872.
7496    
7497     * Thuban/UI/classifier.py (Classifier.__init__): Rearrange how
7498     the dialog is constructed so that we can support layers that
7499     do not have classifications.
7500     (Classifier._OnTry): Only build a classification if the layer
7501     supports one.
7502    
7503     * Thuban/UI/legend.py: Change all checks that a layer is an
7504     instance of Layer into checks against BaseLayer.
7505     (LegendTree.__FillTreeLayer): Only add children to a branch if
7506     the layer supports classification.
7507    
7508     * Thuban/UI/mainwindow.py (MainWindow.NewSession,
7509     MainWindow.OpenSession): Don't proceed with an action if the
7510     user chooses Cancel when they are asked to save changes.
7511     (MainWindow.AddRasterLayer): New. Open a dialog to allow the
7512     user to select an image file. Create a new RasterLayer and add
7513     it to the map.
7514    
7515     * Thuban/UI/renderer.py (MapRenderer.render_map): Add support
7516     for rendering RasterLayer layers.
7517     (MapRenderer.draw_raster_layer): Actually method that calls
7518     the GDALWarp python wrapper and constructs an image from the
7519     data returned.
7520    
7521     * Thuban/UI/tableview.py (LayerTableFrame.__init__): Change the
7522     Choices symbols to match those used in the table query method.
7523     Replace deprecated method calls on table with new method names.
7524    
7525     * Thuban/UI/view.py (MapCanvas.set_view_transform): Try to limit
7526     how small the scale can get. This still needs more testing.
7527    
7528     * extensions/thuban/bmpdataset.cpp: New, but copied from GDAL.
7529     Provides a driver to output in .bmp format.
7530    
7531     * extensions/thuban/cpl_mfile.cpp, extensions/thuban/cpl_mfile.h:
7532     New. Provides IO routines which write to memory, rather than a file.
7533    
7534     * extensions/thuban/gdalwarp.cpp: New, but basically a direct copy
7535     of the gdalwarp utility provided in GDAL. Added function calls
7536     that can be accessed from python.
7537    
7538     * Data/iceland_sample_raster.thuban: New. Sample file that uses
7539     a raster layer.
7540    
7541     * Data/iceland/island.tfw, Data/iceland/island.tif: New. Raster
7542     layer image data.
7543    
7544     * Doc/thuban.dtd: Added rasterlayer attribute definition.
7545    
7546     * test/test_layer.py, test/test_load.py, test/test_save.py: Added
7547     tests associated with the raster layer code.
7548    
7549     * test/test_transientdb.py
7550     (TestTransientTable.test_auto_transient_table_query): Added a test
7551     for using a Column object as the "right" parameter to a query.
7552    
7553 frank 924 2003-05-19 Frank Koormann <[email protected]>
7554    
7555 frank 927 * Thuban/version.py (get_changelog_date):
7556     Catch exceptions if ChangeLog does not exist.
7557    
7558     * Thuban/UI/view.py (MapCanvas.Export): Bugfix
7559    
7560     2003-05-19 Frank Koormann <[email protected]>
7561    
7562 frank 924 Extended version information for Thuban
7563    
7564     * Thuban/version.py: New, version information for Thuban: Last
7565     modification date and last ChangeLog entry date.
7566    
7567     * Thuban/UI/mainwindow.py (MainWindow.About()): Extended version
7568     information: Display Thuban, wxPython and Python version.
7569    
7570 bh 919 2003-05-16 Bernhard Herzog <[email protected]>
7571    
7572 bh 921 * Thuban/Model/save.py: Remove some unused imports including the
7573     __future__ import for nested_scopes as Thuban relies on Python 2.2
7574     now.
7575     (XMLWriter.encode): Remove the special case for a None argument.
7576     In the saver encode is always called with a string argument.
7577    
7578     2003-05-16 Bernhard Herzog <[email protected]>
7579    
7580 bh 919 * Thuban/UI/__init__.py: Remove the work-around for the locale bug
7581     in wxPython (at least when usinvg wxGTK) prior to 2.4. The symptom
7582     of the bug was that e.g. float("1.2") would fail. Thuban now
7583     requires 2.4.x.
7584    
7585 frank 917 2003-05-16 Frank Koormann <[email protected]>
7586    
7587     Printing enhancement and WMF export (under Win32)
7588    
7589     * Thuban/UI/renderer.py (ExportRenderer): New, derived from
7590     ScreenRenderer. Renders Map, Legend and Scalebar for export.
7591     (PrinterRenderer): New, derived from ExportRenderer. Replaces the old
7592     PrintRender.
7593    
7594     * Thuban/UI/view.py (MapPrintout.__init__): Enhanced parameter set
7595     to fullfil information needed for PrinterRenderer.
7596     (MapCanvas.Export): New. Export Map (currently only to WMF on Win32).
7597     (MapCanvas.Print): Adapted to new MapPrintout.
7598     (OutputTransform): General calculations to transform from canvas
7599     coordinates to export/printing devices.
7600    
7601     * Thuban/UI/mainwindow.py (MainWindow.ExportMap()): New. Added also
7602     new method_command to call ExportMap, with platform dependency (only
7603     __WXMSW__)
7604    
7605     * Thuban/UI/scalebar.py (ScaleBar.DrawScaleBar): Position and Size
7606     of scalebar drawing area as new parameters.
7607    
7608     * Thuban/Model/scalebar.py (roundInterval): round long instead of int
7609    
7610     * Thuban/UI/legend.py (ScalebarBitmap.__SetScale):
7611     Update to extended scalebar.DrawScalebar header.
7612    
7613     * test/test_export.py: New, test Thuban.UI.view.OutputTransform()
7614    
7615     * test/test_scalebar.py: Made test executable as standalone.
7616    
7617 bh 908 2003-05-16 Bernhard Herzog <[email protected]>
7618    
7619     * Thuban/Model/table.py (Table): Remove this compatibility alias
7620     for DBFTable.
7621    
7622     * test/test_table.py: Import DBFTable as Table because that alias
7623     doesn't exist anymore.
7624    
7625     * Thuban/UI/classgen.py: Remove some unused imports
7626    
7627 jonathan 906 2003-05-14 Jonathan Coles <[email protected]>
7628    
7629     * Thuban/Model/classgen.py (ClassGenerator.GenSingletonsFromList):
7630     Fix docstring.
7631     (ClassGenerator.GenUniformDistribution): Fix spelling of method name.
7632     (ClassGenerator.GenQuantiles): Use the left/right brackets and min/max
7633     values of the supplied range to determine the beginning and end
7634     bounds of the generated classes.
7635    
7636     * Thuban/Model/range.py (Range.number_re): Now accepts floats that
7637     do not have a leading 0 (.5 is now accepted as well as 0.5).
7638    
7639     * Thuban/UI/classgen.py (ClassGenDialog.OnOK): Fix name of method
7640     call to ClassGenerator.GenUniformDistribution.
7641    
7642     * Thuban/UI/projdialog.py (ProjFrame.__do_layout): Fix Windows
7643     layout bug with the 'Projection' label.
7644    
7645     * test/support.py (FloatTestCase): New. Needed for the Range tests.
7646    
7647     * test/test_range.py: New. Imported from SciParam.
7648    
7649 jonathan 897 2003-05-12 Jonathan Coles <[email protected]>
7650    
7651 jonathan 899 * Thuban/UI/classgen.py (GenQuantilesPanel.GetList): Replace call
7652     to table.UniqueValues() with calls that retrieve all the values
7653     from the table. This will need to be replaced by a method on table
7654     which can simply return the list (perhaps more efficiently).
7655    
7656     2003-05-12 Jonathan Coles <[email protected]>
7657    
7658 jonathan 897 The return value of ClassGenerator.CalculateQuantiles has changed.
7659     Refer to the documentation for details.
7660    
7661     * test/test_classgen.py: Modified Quantile tests to use the
7662     new return values.
7663    
7664     * Thuban/Model/classgen.py
7665     (ClassGenerator.GenQuantiles): Add comments describing the parameters,
7666     use new return values from CalculateQuantiles to produce the correct
7667     range bounds in the Classification.
7668     (ClassGenerator.CalculateQuantiles): Add more comments describing
7669     the return values and parameters. Make minor adjustments to improve
7670     the legibility of the code. Fix problem with adjusted not being set
7671     in most cases.
7672    
7673 frank 893 2003-05-12 Frank Koormann <[email protected]>
7674    
7675     * Thuban/Model/save.py (XMLWriter.encode()): Explicite call to unicode
7676     and latin1. Fixes #1851 finally.
7677    
7678 jonathan 889 2003-05-09 Jonathan Coles <[email protected]>
7679    
7680 jonathan 897 * test/test_classgen.py: New. Tests the Quantile algorithm.
7681    
7682     * Thuban/Model/classgen.py (ClassGenerator.CalculateQuantiles):
7683     Clean up debugging statement, add comments, fix a small bug in the
7684     returned adjusted percentiles.
7685    
7686     2003-05-09 Jonathan Coles <[email protected]>
7687    
7688 jonathan 889 Introduces Range class from SciParam into the ClassGroupRange class,
7689     and such ranges can now be saved and loaded from disk.
7690    
7691     Quantiles are now available in the Classification Generator.
7692    
7693     Initial support for building Queries on a table. Doesn't do anything
7694     but run some tests.
7695    
7696     * Thuban/Model/classification.py: Explicit imports.
7697     (ClassGroupRange): Use the Range class to store the underlying
7698     range information. The interface remains the same, except for
7699     GetRange(), and you can also supply a Range object as the min
7700     parameter to SetRange or __init__.
7701    
7702     * Thuban/Model/load.py (XMLReader.encode): New. Encodes the given
7703     string appropriately for use in Thuban. Fixes RTbug #1851.
7704     (SessionLoader.end_projection): Handle the context of the
7705     projection tag a bit better by looking at what objects are not
7706     None. There was an assumption that a projection tag for a map
7707     could occur before any layers.
7708     (SessionLoader.start_clrange): Provide backward compatibility for
7709     reading min/max values as well as the new range parameter.
7710    
7711     * Thuban/Model/map.py: Explicit imports.
7712    
7713     * Thuban/Model/resource.py: Import _.
7714     (ProjFileSaver.write): write header using projfile.dtd.
7715    
7716     * Thuban/Model/save.py: Explicit imports.
7717     (XMLWriter.encode): New. Encode the given string from a format
7718     used by Thuban into UTF-8. Fixes RTbug #1851.
7719    
7720     * Thuban/UI/classgen.py: Explicit imports.
7721     (ClassGenDialog.__init__): Clean up the code and add support
7722     for Quantiles.
7723     (ClassGenDialog.OnOK): Add support for Quantiles.
7724     (GenQuantilesPanel): New. Input panel for Quantiles.
7725     (ClassGenerator, CustomRamp, MonochromaticRamp, GreyRamp, RedRamp,
7726     GreenRamp, BlueRamp, HotToColdRamp): Move to Thuban/Model/classgen.py
7727    
7728     * Thuban/Model/classgen.py: New. Contains all the classes named above.
7729    
7730     * Thuban/UI/classifier.py: Explicit imports.
7731     (ClassTable.GetValueAsCust, ClassTable.__ParseInput,
7732     ClassTable.SetValueAsCustom): Reworked to use new Range class.
7733    
7734     * Thuban/UI/legend.py: Explicit imports.
7735    
7736     * Thuban/UI/mainwindow.py: Add support for the Join Dialog. Added
7737     a Table menu and associated method calls.
7738     (MainWindow.choose_color): Removed. No longer needed.
7739    
7740     * Thuban/UI/projdialog.py (ProjFrame.__VerifyButtons): Save button
7741     should be disabled if no projection is selected in the available
7742     list.
7743    
7744     * Thuban/UI/renderer.py: Explicit imports.
7745    
7746     * Thuban/UI/tableview.py (TableGrid.OnRangeSelect): Fix some issues
7747     with correctly selecting the rows and issuing the right events.
7748     Be sure to call Skip() to allow the grid to do some of its own
7749     handling which allows the rows to actually be selected.
7750     (LayerTableGrid.select_shapes): Rename from select_shape. Supports
7751     selecting multiple shapes.
7752     (LayerTableFrame): Support for building Queries.
7753     (LayerTableFrame.select_shapes): Allow multiple shapes to be selected.
7754    
7755     * Thuban/UI/tree.py: Explicit imports.
7756    
7757     * Thuban/UI/view.py (MapCanvas): Delegate "SelectedShapes" so the
7758     table view can call it.
7759    
7760     * test/test_classification.py: Explicit imports.
7761     (TestClassification.test_ClassGroupRange): Fix test for new
7762     Range class.
7763    
7764     * Doc/thuban.dtd: Add range parameter for clrange.
7765    
7766     * Thuban/Model/range.py: Taken from SciParam. Used as the underlying
7767     object in ClassGroupRange, and also uesd for inputting ranges in
7768     the classifer table and elsewhere.
7769    
7770     * Thuban/UI/join.py: New. Initial Join dialog. No real functionality
7771     yet.
7772    
7773 frank 872 2003-05-09 Frank Koormann <[email protected]>
7774    
7775     * Thuban/UI/scalebar.py (DrawScaleBar): Draw only if interval > 0.0.
7776    
7777 frank 860 2003-05-08 Frank Koormann <[email protected]>
7778    
7779 frank 870 Coding style updates
7780    
7781     * test/test_scalebar.py: Replaced tab indentation by spaces.
7782    
7783     * Thuban/UI/scalebar.py: Explicit imports.
7784    
7785     2003-05-08 Frank Koormann <[email protected]>
7786    
7787 frank 867 * Thuban/UI/scalebar.py
7788     (ScaleBar.DrawScalebar): Format string bug fixed.
7789    
7790     2003-05-08 Frank Koormann <[email protected]>
7791    
7792 frank 865 Reorganization of scalebar component (no wx in Thuban/Model)
7793    
7794     * Thuban/Model/scalebar.py: Rendering moved to Thuban/UI/scalebar.py
7795     (deriveInterval):
7796     Calculate scalebar interval and unit which fits in width for scale.
7797     (roundInterval): Round float.
7798    
7799     * Thuban/UI/scalebar.py (ScaleBar): Scalebar rendering
7800    
7801     * test/test_scalebar.py: Test for Thuban/Model/scalebar.py methods.
7802    
7803     * Thuban/UI/legend.py: Import Thuban.UI.scalebar
7804    
7805     2003-05-08 Frank Koormann <[email protected]>
7806    
7807 frank 860 * Thuban/UI/legend.py (ScalebarBitmap.SetCanvas):
7808     Initialize ScaleBar with canvas.map
7809    
7810     * Thuban/Model/scalebar.py (ScaleBar.roundInterval()): New,
7811     round intervals to display smarter lengths
7812     (ScaleBar.DrawScalebar): Draw Scalebar only if the map contains a
7813     layer. If the maps has no projection applied grey the scalebar.
7814    
7815 frank 857 2003-05-07 Frank Koormann <[email protected]>
7816    
7817     Basic Scalebar features added.
7818    
7819     * Thuban/Model/scalebar.py (ScaleBar): New, scalebar rendering.
7820    
7821     * Thuban/UI/legend.py (LegendPanel): Added scalebar bitmap
7822     (ScaleBarBitmap): New, links the scalebar bitmap with view messages
7823     and the renderer.
7824    
7825     * Thuban/UI/view.py (MapCanvas.set_view_transform): Issue SCALE_CHANGED.
7826    
7827     * Thuban/UI/messages.py: SCALE_CHANGED added.
7828    
7829 bh 850 2003-05-07 Bernhard Herzog <[email protected]>
7830    
7831 bh 852 * Thuban/Model/session.py (Session.__init__): New instance
7832     variable shapestores to hold a list of all open shapestore objects
7833     (Session.ShapeStores): New. Accessor method for the shapestores
7834     list.
7835     (Session._add_shapestore, Session._clean_weak_store_refs): New.
7836     Internal methods to maintain the shapestores list.
7837     (Session.Tables): New. Return all tables open in the session.
7838     (Session.OpenShapefile): Insert the new ShapeStore into the
7839     shapestores list.
7840    
7841     * test/test_session.py (TestSessionSimple.test_initial_state): Add
7842     tests for ShapeStores and Tables
7843     (TestSessionWithContent.test_shape_stores)
7844     (TestSessionWithContent.test_tables): New. Test cases for
7845     ShapeStores and Tables
7846    
7847     2003-05-07 Bernhard Herzog <[email protected]>
7848    
7849 bh 850 * Thuban/Model/transientdb.py (TransientTableBase.ReadRowAsDict):
7850     Add comments about the optimizations used.
7851     (AutoTransientTable.ReadValue, TransientTableBase.ReadValue): New.
7852     Implement the ReadValue table interface method.
7853    
7854     * test/test_transientdb.py
7855     (TestTransientTable.run_iceland_political_tests)
7856     (TestTransientTable.test_transient_joined_table): Add tests for
7857     ReadValue
7858    
7859 frank 848 2003-05-07 Frank Koormann <[email protected]>
7860    
7861     * Resources/Bitmaps/fulllayerextent.xpm,
7862     Resources/Bitmaps/fullselextent.xpm: Replaced the place holders with
7863     new icons.
7864    
7865 bh 840 2003-05-06 Bernhard Herzog <[email protected]>
7866    
7867 bh 846 * Thuban/Model/transientdb.py (AutoTransientTable.SimpleQuery):
7868     New. Simply delegate to the transient table's version.
7869    
7870     * test/test_transientdb.py
7871     (TestTransientTable.test_auto_transient_table_query): New. Test
7872     case for AutoTransientTable's SimpleQuery
7873    
7874     2003-05-06 Bernhard Herzog <[email protected]>
7875    
7876 bh 843 * Thuban/Model/transientdb.py (TransientTableBase.SimpleQuery):
7877     Implement a simple query method for the query dialog
7878     (TransientTableBase.create): Add an INTEGER PRIMARY KEY that holds
7879     the row index or shapeid.
7880     (TransientTable.create): Insert the right value of the row index
7881     (TransientJoinedTable.create): Copy the row index of the left
7882     table to the joined result table
7883    
7884     * test/test_transientdb.py
7885     (TestTransientTable.test_transient_table_read_twice): Fix
7886     doc-string
7887     (TestTransientTable.test_transient_table_query): New. Test for the
7888     SimpleQuery method
7889    
7890     2003-05-06 Bernhard Herzog <[email protected]>
7891    
7892 bh 840 Convert all table users to use the new table interface. This only
7893     covers Thuban itself, not GREAT-ER or other applications built on
7894     Thuban yet, so the compatibility interface stays in place for the
7895     time being but it now issues DeprecationWarnings.
7896    
7897     Finally, the new Table interface has a new method, HasColumn.
7898    
7899     * Thuban/Model/table.py (OldTableInterfaceMixin): All methods
7900     issue deprecation warnings when they're. The warnings refer to the
7901     caller of the method.
7902     (OldTableInterfaceMixin.__deprecation_warning): New. Helper method
7903     for the deprecation warnings
7904    
7905     * test/test_table.py: Ignore the deprecation warnings for the old
7906     table in the tests in this module. The purpose of the tests is to
7907     test the old interface, after all.
7908    
7909     * test/test_transientdb.py
7910     (TestTransientTable.run_iceland_political_tests): Use the
7911     constants for the types. Add a test for HasColumn
7912     (TestTransientTable.test_transient_joined_table): Adapt to new
7913     table interface. Add a test for HasColumn
7914     (TestTransientTable.test_transient_table_read_twice): Adapt to new
7915     table interface
7916    
7917     * Thuban/UI/tableview.py (DataTable.SetTable, DataTable.GetValue):
7918     Adapt to new table interface
7919    
7920     * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Adapt to
7921     new table interface
7922    
7923     * Thuban/UI/controls.py (RecordListCtrl.fill_list)
7924     (RecordTable.SetTable): Adapt to new table interface
7925    
7926     * Thuban/UI/classifier.py (Classifier.__init__)
7927     (Classifier.__init__): Adapt to new table interface
7928    
7929     * Thuban/UI/classgen.py (ClassGenDialog.__init__)
7930     (GenUniformPanel._OnRetrieve, GenUniquePanel._OnRetrieve): Adapt
7931     to new table interface
7932    
7933     * Thuban/Model/transientdb.py (TransientTableBase.HasColumn)
7934     (AutoTransientTable.HasColumn): Implement the new table interface
7935     method
7936     (AutoTransientTable.ReadRowAsDict, AutoTransientTable.ValueRange)
7937     (AutoTransientTable.UniqueValues): Adapt to new table interface
7938    
7939     * Thuban/Model/layer.py (Layer.SetShapeStore, Layer.GetFieldType):
7940     Adapt to new table interface
7941    
7942     * test/test_layer.py (TestLayer.open_shapefile): Helper method to
7943     simplify opening shapefiles a bit easier.
7944     (TestLayer.test_arc_layer, TestLayer.test_polygon_layer)
7945     (TestLayer.test_point_layer): Use the new helper method
7946     (TestLayer.test_get_field_type): New. Test for the GetFieldType
7947     method
7948    
7949     * test/test_dbf_table.py (TestDBFTable.test_has_column): Test for
7950     the new table method
7951    
7952     * test/test_memory_table.py (TestMemoryTable.test_has_column):
7953     Test for the new table method HasColumn
7954    
7955 jonathan 833 2003-05-06 Jonathan Coles <[email protected]>
7956    
7957     Addresses the "Selection Extent" wish of RTbug #1787.
7958    
7959     * Resources/Bitmaps/fulllayerextent.xpm,
7960     Resources/Bitmaps/fullselextent.xpm: Bitmaps for layer and selection
7961     extent. These are just place holders for the real bitmaps.
7962    
7963     * Thuban/Model/layer.py (Shape): Since a Shape is immutable only
7964     calculate the bounding box once (the first time compute_bbox() is
7965     called).
7966     (Layer.ShapesBoundingBox): New. Given a list of shape ids, return
7967     the bounding box for the shapes in lat/long coordinates.
7968    
7969     * Thuban/UI/mainwindow.py: Added new "Full selection extent" menu
7970     option.
7971     (MainWindow.has_selected_shapes): New. Returns true if there are
7972     any selected shapes.
7973     (MainWindow.FullSelectionExtent): New. Calls
7974     MapCanvas.FitSelectedToWindow() when the user selects the menu option.
7975     (_has_selected_shapes): New. Returns true if there are any
7976     selected shapes.
7977    
7978     * Thuban/UI/selection.py (Selection.HasSelectedShapes): New. Returns
7979     true if there are any selected shapes.
7980    
7981     * Thuban/UI/view.py (MapCanvas): Added delegated method
7982     HasSelectedShapes.
7983     (MapCanvas.FitSelectedToWindow): New. Centers and scales any selected
7984     shapes on the canvas using the map projection (if any).
7985    
7986     * test/test_layer.py (TestLayer.test_arc_layer): Add some tests
7987     for Layer.ShapesBoundingBox().
7988    
7989 bh 826 2003-05-06 Bernhard Herzog <[email protected]>
7990    
7991     * Resources/Projections/defaults.proj: Fix spelling of Mercator
7992    
7993 jonathan 823 2003-05-05 Jonathan Coles <[email protected]>
7994    
7995     Addresses the "Full Layer Extent" wish of RTbug #1787.
7996    
7997     * Resources/Projections/defaults.proj: Added UK National Grid.
7998    
7999     * Thuban/UI/mainwindow.py: Added new "Full layer extent" menu option.
8000     (MainWindow.FullLayerExtent): New. Calls MapCanvas.FitLayerToWindow()
8001     when the user selects the menu option.
8002    
8003     * Thuban/UI/view.py (MapCanvas.FitLayerToWindow): New. Centers and
8004     scales the given layer on the canvas using the map projection.
8005    
8006 bh 819 2003-05-05 Bernhard Herzog <[email protected]>
8007    
8008     Convert the table implementations to a new table interface. All
8009     tables use a common mixin class to provide backwards compatibility
8010     until all table users have been updated.
8011    
8012     * Thuban/Model/table.py (OldTableInterfaceMixin): Mixin class to
8013     provide backwards compatibility for table classes implementing the
8014     new interface
8015     (DBFTable, MemoryTable): Implement the new table interface. Use
8016     OldTableInterfaceMixin as base for compatibility
8017     (DBFColumn, MemoryColumn): New. Column description for DBFTable
8018     and MemoryTable resp.
8019    
8020     * test/test_dbf_table.py: New. Test cases for the DBFTable with
8021     the new table interface.
8022    
8023     * test/test_memory_table.py: New. Test cases for the MemoryTable
8024     with the new table interface.
8025    
8026     * test/test_table.py: Document the all tests in this file as only
8027     for backwards compatibility. The equivalent tests for the new
8028     interface are in test_memory_table.py and test_dbf_table.py
8029     (MemoryTableTest.test_read): field_info should be returning tuples
8030     with four items
8031     (MemoryTableTest.test_write): Make doc-string a more precise.
8032    
8033     * Thuban/Model/transientdb.py (TransientTableBase): Convert to new
8034     table interface. Derive from from OldTableInterfaceMixin for
8035     compatibility.
8036     (TransientTableBase.create): New intance variable column_map to
8037     map from names and indices to column objects
8038     (TransientTable.create): Use the new table interface of the input
8039     table
8040     (AutoTransientTable): Convert to new table interface. Derive from
8041     from OldTableInterfaceMixin for compatibility.
8042     (AutoTransientTable.write_record): Removed. It's not implemented
8043     yet and we still have to decide how to handle writing with the new
8044     table and data framework.
8045    
8046     * test/test_transientdb.py
8047     (TestTransientTable.run_iceland_political_tests)
8048     (TestTransientTable.test_transient_joined_table): Use the new
8049     table interface
8050    
8051 jonathan 817 2003-05-05 Jonathan Coles <[email protected]>
8052    
8053     This is namely a collection of UI updates to improve user interactivity.
8054     Tabbing between controls now exists and you can use ESC to close dialog
8055     boxes; ENTER will active the default button.
8056    
8057     * Thuban/UI/classgen.py (ClassGenDialog.__init__): Rearrange the
8058     order that the controls are created so that tabbing works correctly.
8059     (ClassGenDialog.OnOK): Renamed from _OnGenerate() so that the
8060     wxDialog can handle the default button correctly.
8061     (ClassGenDialog.OnCancel): Renamed from _OnCloseBtn() for the
8062     same reasons as for OnOK.
8063     (GenUniformPanel._OnRetrieve): Call wxBeginBusyCursor/wxEndBusyCursor
8064     when we ask the table for the maximum/minimum values of a field
8065     which could take a very long time.
8066    
8067     * Thuban/UI/classifier.py (Classifier.__init__): Rearrange the
8068     order that the controls are created so that tabbing works correctly.
8069     (SelectPropertiesDialog.__init__): Rearrange the order that the
8070     controls are created so that tabbing works correctly.
8071    
8072     * Thuban/UI/dialogs.py: Copied NonModalDialog box and changed it
8073     to derive from a wxDialog but behave like the original implementation
8074     which was derived from a wxFrame. wxDialog provides useful key
8075     handling functionality like ESC calling OnCancel and ENTER calling
8076     OnOK which is lost with wxFrame.
8077    
8078     * Thuban/UI/mainwindow.py: Add "..." to menu items that will open
8079     new dialogs.
8080    
8081     * Thuban/UI/projdialog.py (ProjFrame.__init__): Rearrange the
8082     order that the controls are created so that tabbing works correctly.
8083     (ProjFrame.OnApply): Renamed from _OnTry() to use wxDialog behaviour.
8084     (ProjFrame.OnOK): Renamed from _OnOK() to use wxDialog behaviour.
8085     (ProjFrame.OnCancel): Renamed from _OnClose() to use wxDialog behaviour.
8086     (ProjPanel.__init__): Add "Airy" to the list of ellipsoids so we
8087     can provide the "UK National Grid" as a default projection.
8088     (UTMPanel.__init__): Rearrange the order that the controls are
8089     created so that tabbing works correctly.
8090    
8091 bh 809 2003-05-05 Bernhard Herzog <[email protected]>
8092    
8093 bh 811 * extensions/thuban/wxproj.cpp: Fix some of the comments.
8094     (project_point): If a map projection but no layer projection is
8095     given, convert degrees to radians before applying the map
8096     projection.
8097    
8098 bh 809 * Thuban/UI/tableview.py (TableGrid.disallow_messages)
8099     (TableGrid.allow_messages): New methods to make it possible to
8100     inhibit message sending.
8101     (TableGrid.issue): Only send the message if not inhibited.
8102     (LayerTableGrid.select_shape): Use the new methods to make sure
8103     that no ROW_SELECTED message is sent while we're updating the
8104     selected rows to match the selected shapes.
8105    
8106 jan 807 2003-05-02 Jan-Oliver Wagner <[email protected]>
8107    
8108     Implementation of MemoryTable.
8109    
8110     * Thuban/Model/table.py (MemoryTable): New. Quite simple table
8111     implementation that operates on a list of tuples. All of the data
8112     are kept in the memory.
8113    
8114     * test/test_table.py (MemoryTableTest): New.
8115    
8116     * test/test_transientdb.py (SimpleTable): Removed.
8117     (TestTransientTable.test_transient_joined_table,
8118     (TestTransientTable.test_transient_table_read_twice): Replaced
8119     SimpleTable by MemoryTable.
8120    
8121 jonathan 793 2003-04-30 Jonathan Coles <[email protected]>
8122    
8123 jonathan 803 * Data/iceland_sample.thuban: Now contains correct projections
8124     for each of the layers.
8125    
8126     * Resources/Projections/defaults.proj: Geographic projection
8127     contains unit conversion parameter.
8128    
8129     2003-04-30 Jonathan Coles <[email protected]>
8130    
8131 jonathan 793 The most important part of this putback is the projection changes.
8132     It should now be possible to specify the projection that a layer
8133     is in and then specify a different projection for the map. The
8134     projection dialog has an extra parameter for a geographic projection
8135     which lets the user select if the input is in degrees or radians.
8136    
8137     * Thuban/Model/layer.py (Layer.ShapesInRegion): Fix docstring
8138     to say that the parameter is a tuple of unprojected
8139     points (which is what the callers to this method were assuming).
8140     Also, since the points are unprojected we need to projected them.
8141    
8142     * Thuban/UI/legend.py (LegendTree.MoveCurrentItemUp,
8143     LegendTree.MoveCurrentItemDown): If the layer or any of the layer's
8144     groups are selected, move the layer up/down. Fixes RTbug #1833.
8145    
8146     * Thuban/UI/mainwindow.py: Move menu item map_rename up.
8147    
8148     * Thuban/UI/projdialog.py (ProjFrame._OnSave): Add missing
8149     parameter in call to SetClientData.
8150     (GeoPanel): Add support for selecting the units that the
8151     source data is in (Radians or Degrees).
8152    
8153     * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Optimize
8154     the rendering loop by reducing the number of if's, removing the
8155     unnecessary try/except block, and checking if the old group
8156     is the same as the new one (which happens a lot if there is
8157     no classification, or lots of shapes are in the same group).
8158    
8159     * Thuban/UI/view.py (MapCanvas.OnPaint): Add a try/except block
8160     around the redraw routine to try to catch problems that the user
8161     may create by selecting invalid projections for the data set and
8162     map. Clears the display if there are any problems and prints the
8163     error.
8164     (MapCanvas.do_redraw): Use DC.Clear() instead of drawing a filled
8165     rectangle.
8166    
8167     * extensions/thuban/wxproj.cpp (project_point): First invert the
8168     supplied point (which should be in projected coordinates) using
8169     the layer's projection and then project the point using the
8170     map's projection.
8171     (project_points): Use project_point() to project each point.
8172    
8173 jan 792 2003-04-30 Jan-Oliver Wagner <[email protected]>
8174    
8175     * Thuban/Model/layer.py (Layer.SetShapeStore): Fixed a bug:
8176     don't set the Classification to None if the classfication field
8177     is None (ie only a DEFAULT).
8178    
8179 bh 786 2003-04-30 Bernhard Herzog <[email protected]>
8180    
8181 bh 790 * Thuban/UI/view.py: Fix some typos.
8182    
8183 bh 788 * Thuban/UI/mainwindow.py (MainWindow.identify_view_on_demand): Do
8184     not pop up the dialog if the selection becomes empty (this could
8185     happen if e.g. a new selection is opened while the identify tool
8186     is active and dialog had been closed)
8187    
8188     2003-04-30 Bernhard Herzog <[email protected]>
8189    
8190 bh 786 * Thuban/Model/transientdb.py (TransientTableBase.__init__): New
8191     instance variable read_record_last_result
8192     (TransientTableBase.read_record): Make sure reading the same
8193     record twice works. The implementation uses the new instance
8194     variable read_record_last_result
8195    
8196     * test/test_transientdb.py
8197     (TestTransientTable.test_transient_table_read_twice): New test
8198     case for the above bug-fix.
8199    
8200 jonathan 793 2003-04-29 Jonathan Coles <[email protected]>
8201    
8202     * Thuban/common.py: Removed. No longer needed Str2Num. RTbug #1832.
8203    
8204     * Thuban/UI/classgen.py: Remove all uses of Str2Num.
8205    
8206     * Thuban/UI/classifier.py: Remove all uses of Str2Num.
8207     (ClassTable.SetValueAsCustom): Rename keyword argument in
8208     ClassGroup* constructors to match argument name.
8209    
8210 bh 779 2003-04-29 Bernhard Herzog <[email protected]>
8211    
8212     * Thuban/Model/session.py (Session.Destroy): Explicitly close the
8213     transient DB if it exists to make sure it doesn't leave a journal
8214     file in the temp directory.
8215    
8216     * Thuban/Model/transientdb.py (TransientDatabase.close): Set
8217     self.conn to None after closing the connection to make sure it's
8218     not closed twice
8219    
8220 jonathan 767 2003-04-29 Jonathan Coles <[email protected]>
8221    
8222 jonathan 769 Add a visible parameter in the layer XML tag. The default value is
8223     "true". If anything other than "false" is specified we also assume
8224 jonathan 776 "true". Addresses RTbug #1025.
8225 jonathan 769
8226     * Doc/thuban.dtd: Add visible parameter to a layer.
8227    
8228     * Thuban/Model/layer.py (BaseLayer.__init__): Change default value
8229     of visible from 1 to True.
8230     (Layer.__init__): Change default value of visible from 1 to True.
8231    
8232     * Thuban/Model/load.py (SessionLoader.start_layer): Read visible
8233     parameter.
8234    
8235     * Thuban/Model/save.py (SessionSaver.write_layer): Save visible
8236     parameter.
8237    
8238     * test/test_load.py: Add new test data contents_test_visible.
8239     (LoadSessionTest.setUp): save test data.
8240     (LoadSessionTest.testLayerVisibility): Test if the visible flag
8241     is loaded correctly.
8242    
8243     * test/test_save.py (SaveSessionTest.testSingleLayer): Add test
8244     for saving an invisible layer.
8245    
8246     2003-04-29 Jonathan Coles <[email protected]>
8247    
8248 jonathan 767 * Thuban/UI/mainwindow.py (MainWindow.SetMap): Look up the
8249     legend dialog box and tell it to change its map to the one
8250     supplied to SetMap(). Fixes RTbug #1770.
8251    
8252 bh 764 2003-04-29 Bernhard Herzog <[email protected]>
8253    
8254 bh 766 Next step of table implementation. Introduce a transient database
8255     using SQLite that some of the data is copied to on demand. This
8256     allows us to do joins and other operations that require an index
8257     for good performance with reasonable efficiency. Thuban now needs
8258     SQLite 2.8.0 and pysqlite 0.4.1. Older versions may work but I
8259     haven't tested that.
8260    
8261     * Thuban/Model/transientdb.py: New. Transient database
8262     implementation.
8263    
8264     * test/test_transientdb.py: New. Tests for the transient DB
8265     classes.
8266    
8267     * Thuban/Model/session.py (AutoRemoveFile, AutoRemoveDir): New
8268     classes to help automatically remove temporary files and
8269     directories.
8270     (Session.__init__): New instance variables temp_dir for the
8271     temporary directory and transient_db for the SQLite database
8272     (Session.temp_directory): New. Create a temporary directory if not
8273     yet done and return its name. Use AutoRemoveDir to have it
8274     automatically deleted
8275     (Session.TransientDB): Instantiate the transient database if not
8276     done yet and return it.
8277    
8278     * Thuban/Model/data.py (ShapefileStore.__init__): Use an
8279     AutoTransientTable so that data is copied to the transient DB on
8280     demand.
8281     (SimpleStore): New class that simply combines a table and a
8282     shapefile
8283    
8284     * Thuban/Model/table.py (Table, DBFTable): Rename Table into
8285     DBFTable and update its doc-string to reflect the fact that this
8286     is only the table interface to a DBF file. Table is now an alias
8287     for DBFTable for temporary backwards compatibility.
8288    
8289     * Thuban/UI/application.py (ThubanApplication.OnExit): Make sure
8290     the last reference to the session goes away so that the temporary
8291     files are removed properly.
8292    
8293     * test/test_load.py (LoadSessionTest.tearDown): Remove the
8294     reference to the session to make sure the temporary files are
8295     removed.
8296    
8297     2003-04-29 Bernhard Herzog <[email protected]>
8298    
8299 bh 764 * Thuban/Model/load.py (XMLReader.__init__, XMLReader.read): Turn
8300     the __parser instance variable into a normal local variable in
8301     read. It's only used there and read will never be called more than
8302     once. Plus it introduces a reference cycle that keeps can keep the
8303     session object alive for a long time.
8304    
8305 jonathan 767 2003-04-29 Jonathan Coles <[email protected]>
8306 jonathan 735
8307 jonathan 762 * Thuban/Model/proj.py (Projection): Removed Set*() methods to make
8308     Projection an immutable item. Fixes RTbug #1825.
8309     (Projection.__init__): Initialize instance variables here.
8310     (ProjFile.Replace): New. Replace the given projection object with
8311     the new projection object. This solves the problem of needing the
8312     mutator Projection.SetProjection() in the ProjFrame class and
8313     allows a projection to change parameters without changing its
8314     location in the file.
8315    
8316     * Thuban/UI/mainwindow.py (MainWindow.SaveSessionAs): Dialog should
8317     be of type wxSAVE and should verify overwriting a file.
8318    
8319     * Thuban/UI/projdialog.py (ProjFrame._OnSave): Use the new
8320     ProjFile.Replace() method instead of the mutator
8321     Projection.SetProjection(). Also requires that we reassign the
8322     client data to the new projection.
8323    
8324     * test/test_proj.py (TestProjection.test): Test GetName() and
8325     GetAllParameters()
8326     (TestProjFile.test): Remove tests for Set*() methods. Add tests
8327     for Replace().
8328    
8329     2003-04-25 Jonathan Coles <[email protected]>
8330    
8331 jonathan 756 * Thuban/Model/save.py (SessionSaver.write_projection): Make sure
8332     to save the name of the projection.
8333    
8334     * test/test_save.py (SaveSessionTest.testLayerProjection): New
8335     test to verify layer projections are saved correctly.
8336    
8337     2003-04-25 Jonathan Coles <[email protected]>
8338    
8339 jonathan 753 * Thuban/Model/proj.py (Projection.SetName): Set the name
8340     to "Unknown" if name is None.
8341     (Projection.SetAllParameters): New. Set the projection's
8342     parameter list to the one supplied.
8343     (Projection.SetProjection): New. Set the projection's
8344     properties to those of the supplied Projection.
8345    
8346     * Thuban/UI/mainwindow.py (MainWindow.MapProjection): Set
8347     the dialog title to include the map's title.
8348     (MainWindow.LayerProjection): Set the dialog title to include
8349     the layer's title.
8350    
8351     * Thuban/UI/projdialog.py (ProjFrame.__ShowError): Consolidate
8352     error dialogs into a single method call.
8353     (ProjFrame.__VerifyButtons): Add more states to check.
8354     (ProjFrame.__GetProjection): Return the current state of an
8355     edited projection or None.
8356     (ProjFrame.__FillAvailList): Remove checks for states that
8357     shouldn't exist.
8358     (ProjFrame._OnNew): Clear all selected items and supply
8359     a projection panel if necessary.
8360    
8361     * test/test_proj.py (TestProjFile.test): Add tests for
8362     ProjFile.SetAllParameters, ProjFile.SetProjection,
8363     ProjFile.SetName.
8364    
8365     2003-04-25 Jonathan Coles <[email protected]>
8366    
8367 jonathan 748 * Thuban/UI/projdialog.py (ProjFrame.__FillAvailList): Now
8368     takes an optional argument to select the current projection.
8369     This does not guarantee that the item is visible due to
8370     limited wxWindows functionality. Fixes RTBug #1821.
8371    
8372     2003-04-25 Jonathan Coles <[email protected]>
8373    
8374 jonathan 743 * Thuban/Model/load.py (SessionLoader.start_projection): Remember
8375     the projection name and use it when constructing the Projection
8376     object.
8377    
8378     * Thuban/Model/proj.py (Projection.__init__): Change the default
8379     value for 'name' to None and then test if name is equal to None
8380     in the body of the constructor. This way the caller doesn't have to
8381     know what the default value should be. Namely, useful in load.py
8382     where we have to pick a default value if the 'name' parameter
8383     doesn't exist in the XML file.
8384    
8385     * test/test_load.py (LoadSessionTest.testLayerProjection): New.
8386     Tests a file where a layer has a projection.
8387    
8388     2003-04-25 Jonathan Coles <[email protected]>
8389    
8390 jonathan 735 * Thuban/Model/layer.py (Layer.TreeInfo): Add an item to the
8391     tree for projection information.
8392    
8393     * Thuban/Model/load.py (XMLReader.GetFilename): Renamed from
8394     XMLReader.GetFileName.
8395     (SessionLoader): Added support for loading projection tags that
8396     appear inside a layer.
8397    
8398     * Thuban/Model/proj.py (ProjFile): Document the class. Move
8399     back to using a list because the order of the projections in
8400     the file is important to maintain. Fixes RTbug #1817.
8401    
8402     * Thuban/Model/resource.py: Rename calls to ProjFile.GetFileName
8403     to ProjFile.GetFilename.
8404    
8405     * Thuban/Model/save.py (SessionSaver.write_layer): Save projection
8406     information.
8407    
8408     * Thuban/UI/projdialog.py (ProjFrame._OnAddToList): Renamed from
8409     ProjFrame._OnSaveAs. Removed old dead code from previous
8410     implementation.
8411     (ProjFrame._OnExport): Add support for exporting more than one
8412     projection to a single file.
8413     (ProjFrame.__FillAvailList): use string formatting (% operator)
8414     to build strings that are (partly) translated. Fixes RTbug #1818.
8415    
8416     * test/test_proj.py (TestProjFile.test): New. Tests the base ProjFile
8417     class.
8418    
8419 bh 734 2003-04-24 Bernhard Herzog <[email protected]>
8420    
8421     * po/es.po: Updated Spanish translation by Daniel Calvelo Aros
8422    
8423     * po/fr.po: New. French translation by Daniel Calvelo Aros
8424    
8425     * Thuban/UI/projdialog.py (ProjFrame._OnSaveAs): Don't translate
8426     empty strings.
8427    
8428 jonathan 735 2003-04-24 Jonathan Coles <[email protected]>
8429 jonathan 724
8430     * Thuban/Model/layer.py (Layer.GetProjection): New. Needed to
8431     implement the interface that the ProjFrame dialog expects.
8432    
8433     * Thuban/Model/proj.py (Projection.SetName): New. Allows the
8434     name of the projection to be changed.
8435     (ProjFile): Use a dictionary instead of a list so that removing
8436     projections is easier and we are sure about uniqueness.
8437     (ProjFile.Remove): Remove the given projection object.
8438    
8439     * Thuban/Model/resource.py (GetSystemProjFiles, GetUserProjFiles):
8440     Return a list with only one projection file instead of searching for
8441     any projection file. This simplifies many things if the user can
8442     only have one system file and one user file.
8443    
8444     * Thuban/UI/classgen.py: Change all references to
8445     genCombo to genChoice.
8446    
8447     * Thuban/UI/mainwindow.py: Add a Projection option under the
8448     layer menu.
8449     (MainWindow.LayerProjection): New. Open up a projection window
8450     for a layer.
8451    
8452     * Thuban/UI/projdialog.py: Large changes to how the dialog is
8453     laid out. Use three panels instead of one. One for the list of
8454     projections, one for the edit controls, and one for the buttons.
8455     Fixed resizing problems so that the dialog resizes correctly
8456     when the projection panel changes. Added import/export, save, and
8457     new buttons/functionality.
8458    
8459 bh 723 2003-04-24 Bernhard Herzog <[email protected]>
8460    
8461     First step towards table management. Introduce a simple data
8462     abstraction so that we replace the data a layer uses more easily
8463     in the next step.
8464    
8465     * Thuban/Model/data.py: New file with a simple data abstraction
8466     that bundles shapefile and dbffile into one object.
8467    
8468     * Thuban/Model/session.py (Session.OpenShapefile): New method to
8469     open shapefiles and return a shape store object
8470    
8471     * Thuban/Model/layer.py (Layer.__init__): Pass the data as a store
8472     object instead of a shapefile filename. This introduces a new
8473     instance variable store holding the datastore. For intermediate
8474     backwards compatibility keep the old instance variables.
8475     (open_shapefile): Removed. No longer needed with the shape store.
8476     (Layer.SetShapeStore, Layer.ShapeStore): New methods to set and
8477     get the shape store used by a layer.
8478     (Layer.Destroy): No need to explicitly destroy the shapefile or
8479     table anymore.
8480    
8481     * Thuban/UI/mainwindow.py (MainWindow.AddLayer)
8482     (MainWindow.AddLayer): Use the session's OpenShapefile method to
8483     open shapefiles
8484    
8485     * Thuban/Model/load.py (ProcessSession.start_layer): Use the
8486     session's OpenShapefile method to open shapefiles
8487    
8488     * test/test_classification.py
8489     (TestClassification.test_classification): Use the session's
8490     OpenShapefile method to open shapefiles and build the filename in
8491     a more platform independed way
8492    
8493     * test/test_layer.py (TestLayer.setUp, TestLayer.tearDown):
8494     Implement to have a session to use in the tests
8495     (TestLayer.test_arc_layer, TestLayer.test_polygon_layer)
8496     (TestLayer.test_point_layer, TestLayer.test_empty_layer): Use the
8497     session's OpenShapefile method to open shapefiles
8498     (TestLayerLegend.setUp): Instantiate a session so that we can use
8499     it to open shapefiles.
8500     (TestLayerLegend.tearDown): Make sure that all references to
8501     layers and session are removed otherwise we may get a resource
8502     leak
8503    
8504     * test/test_map.py (TestMapAddLayer.test_add_layer)
8505     (TestMapWithContents.setUp): Instantiate a session so that we can
8506     use it to open shapefiles.
8507     (TestMapWithContents.tearDown): Make sure that all references to
8508     layers, maps and sessions are removed otherwise we may get a
8509     resource leak
8510     ("__main__"): use support.run_tests() so that more info about
8511     uncollected garbage is printed
8512    
8513     * test/test_save.py (SaveSessionTest.testSingleLayer): Use the
8514     session's OpenShapefile method to open shapefiles
8515     ("__main__"): use support.run_tests() so that more info about
8516     uncollected garbage is printed
8517    
8518     * test/test_selection.py (TestSelection.tearDown): Make sure that
8519     all references to the session and the selection are removed
8520     otherwise we may get a resource leak
8521     (TestSelection.get_layer): Instantiate a session so that we can
8522     use it to open shapefiles.
8523     ("__main__"): use support.run_tests() so that more info about
8524     uncollected garbage is printed
8525    
8526     * test/test_session.py (TestSessionBase.tearDown)
8527     (TestSessionWithContent.tearDown): Make sure that all references
8528     to the session and layers are removed otherwise we may get a
8529     resource leak
8530     (TestSessionWithContent.setUp): Use the session's OpenShapefile
8531     method to open shapefiles
8532    
8533 jonathan 721 2003-04-24 Jonathan Coles <[email protected]>
8534    
8535     * Thuban/Model/load.py (XMLReader.read): Should have been checking
8536     if the file_or_filename object had the 'read' attribute.
8537    
8538 jonathan 715 2003-04-23 Jonathan Coles <[email protected]>
8539    
8540 jonathan 720 * Thuban/Model/resource.py: Fixes RTbug #1813.
8541     (ReadProjFile): Add documentation about which exceptions are raised.
8542     Always pass the exceptions up to the caller.
8543     (GetProjFiles): If the directory can't be read return an empty list.
8544     If any of the proj files can't be read skip that file and go
8545     on to the next one.
8546    
8547     * test/test_proj.py: Added test cases to handle nonexistent files,
8548     unreadable files, and files that don't parse correctly.
8549    
8550     2003-04-23 Jonathan Coles <[email protected]>
8551    
8552 jonathan 716 Projection dialog. Allows the user to select from a list
8553     of projection templates and optionally edit them and save new ones.
8554    
8555     * Thuban/UI/projdialog.py (ProjFrame): New. Main dialog.
8556     (ProjPanel): Base class for projection specific panels.
8557     (TMPanel): Projection panel for Transverse Mercartor.
8558     (UTMPanel): Projection panel for Universal Transverse Mercartor.
8559     (LCCPanel): Projection panel for Lambert Conic Conformal.
8560     (GeoPanel): Projetion panel for Geographic Projection.
8561    
8562     2003-04-23 Jonathan Coles <[email protected]>
8563    
8564 jonathan 715 * Thuban/Model/load.py (XMLReader): Renamed from XMLProcessor to
8565     promote symmetry. There now exists XMLReader and XMLWriter.
8566     (XMLReader.read): New. Call to read the given file descriptor or
8567     filename.
8568     (XMLReader.close): New. Make sure the file is closed.
8569     (XMLReader.GetFileName): New. Return just the file name that is being
8570     read from.
8571     (XMLReader.GetDirectory): New. Return just the directory of the file
8572     that is being read.
8573     (XMLReader.AddDispatchers): New. Take a dictionary which contains
8574     the names of functions to call as the XML tree is parsed.
8575     (XMLReader.startElementNS): Updated to use new dispatcher dictionary.
8576     (XMLReader.endElementNS): Updated to use new dispatcher dictionary.
8577     (SessionLoader): Removed class variables start_dispatcher and
8578     end_dispatcher since this functionality is now part of a class
8579     instance. Fixes RTbug #1808.
8580     (SessionLoader.__init__): Add dispatcher functions.
8581     (load_xmlfile): Code was moved into the XMLReader.read().
8582     (load_session): Use modified SessionLoader.
8583    
8584     * Thuban/Model/map.py (Map.GetProjection): New. Returns the
8585     map's projection.
8586    
8587     * Thuban/Model/proj.py (Projection.GetParameters): Renamed to
8588     GetAllParameters.
8589     (Projection.GetParameter): Returns the value for the given parameter.
8590    
8591     * Thuban/Model/resource.py: Use XMLReader and XMLWriter.
8592     (GetProjFiles): Renamed from GetProjections. Now returns a list
8593     of ProjFile objects.
8594     (GetSystemProjFiles): Renamed from GetSuppliedProjections. Returns
8595     a list of ProjFile objects whose files are not user defined.
8596     (GetUserProjFiles): Renamed from GetUserProjections. Returns a
8597     list of ProjFile objects whose files are user defined.
8598     (ProjFileReader): Extend new XMLReader.
8599    
8600     * Thuban/Model/save.py (XMLWriter): Renamed from XMLSaver to
8601     promote symmetry.
8602    
8603     * Thuban/UI/classgen.py (ClassGenDialog.__init__): Use a wxChoice
8604     control instead of a wxComboBox. wxChoice controls do not generate
8605     events as the uses highlights possible choices which fixes problems
8606     with resizing the dialog when the use selects an option.
8607    
8608     * Thuban/UI/classifier.py (Classifier.__init__): Use a wxChoice
8609     control instead of a wxComboBox.
8610    
8611     * Thuban/UI/mainwindow.py (MainWindow.Projection): Use new projection
8612     dialog.
8613    
8614     * test/test_proj.py (TestProjection.test): New tests for GetParameter
8615     method.
8616    
8617 bh 703 2003-04-22 Bernhard Herzog <[email protected]>
8618    
8619 bh 705 * Thuban/UI/mainwindow.py: Remove some unused imports and global
8620     constants
8621    
8622 bh 703 * Thuban/UI/identifyview.py (IdentifyListCtrl.selected_shape)
8623     (IdentifyGridCtrl.selected_shape): Use table, not shapetable.
8624    
8625 bh 700 2003-04-17 Bernhard Herzog <[email protected]>
8626    
8627 bh 701 * Thuban/Model/layer.py: Don't import LAYER_LEGEND_CHANGED.
8628     (Layer): Update doc-string since LAYER_LEGEND_CHANGED is not used
8629     anymore.
8630     (Layer.BoundingBox, Layer.GetFieldType, Layer.NumShapes)
8631     (Layer.ShapeType, Layer.Shape): No need to call
8632     self.open_shapefile since it's always called in __init__
8633    
8634 bh 700 * Thuban/UI/application.py (ThubanApplication.MainLoop): Removed.
8635     In wxPython 2.4 there's no need to extend MainLoop anymore since
8636     wxPython itself makes sure OnExit is called.
8637    
8638 jonathan 688 2003-04-16 Jonathan Coles <[email protected]>
8639    
8640 jonathan 693 Initial putback of projection management code. Includes new
8641     classes to read and write projection files. The current load
8642     and save classes were abstracted a bit so they could be reused.
8643     The Projection class was extended to provide new methods and
8644     have a name.
8645    
8646     * Thuban/Model/load.py (XMLProcessor): New. Contains all the
8647     general XML reading methods that were part of ProcessSession.
8648    
8649     * Thuban/Model/proj.py (Projection.__init__): Accepts an optional
8650     name.
8651     (ProjFile): New. Represents a file that contains projection
8652     information.
8653    
8654     * Thuban/Model/resource.py: New. Contains general utilities
8655     for read and writing projection files.
8656    
8657     * Thuban/Model/save.py (XMLSaver): New. Contains all the
8658     general XML writing methods that were part of SessionSaver.
8659     (SessionSaver): Renamed from Saver.
8660    
8661     * test/test_proj.py: New test cases for the projection
8662     file read and write functions.
8663    
8664     2003-04-16 Jonathan Coles <[email protected]>
8665    
8666 jonathan 688 * Thuban/Model/classification.py: Use repr() around values
8667     in the ClassGroup*.__repr__() methods so it is clearer when
8668     a value is a string and when it is a number.
8669    
8670     * test/test_load.py: Rework the classification test to test
8671     that we can load old files.
8672     (testLabels): Test a file where the groups have labels.
8673    
8674 bh 687 2003-04-16 Bernhard Herzog <[email protected]>
8675    
8676     Safer implementation of the performance enhancements of the
8677     low-level renderer:
8678    
8679     * extensions/thuban/wxproj.cpp (extract_projection)
8680     (extract_pointer): Rename extract_projection to extract_pointer
8681     and redefine its purpose to return the pointer stored in a CObject
8682     returned by the object's cobject method. Update all callers.
8683     (s_draw_info, free_draw_info, draw_polygon_init): Implement the
8684     handling of these low-level parameters so that each s_draw_info
8685     instance is handled as a CObject at python level that also
8686     contains real references to the actual python objects which
8687     contain the values in the struct. Add free_draw_info as the
8688     destructor.
8689     (draw_polygon_shape): Add the py_draw_info parameter which must a
8690     cobject containing an s_draw_info pointer.
8691    
8692     * Thuban/UI/renderer.py (MapRenderer.polygon_render_param): New
8693     method to instantiat the low-level render parameter
8694     (MapRenderer.draw_shape_layer): Use the new method. Remove some
8695     commented out code.
8696     (MapRenderer.draw_polygon_shape): Make the first parameter not the
8697     layer but the low-level render parameter
8698     (ScreenRenderer.draw_shape_layer): Use the low-level render
8699     parameter.
8700    
8701 jonathan 673 2003-04-15 Jonathan Coles <[email protected]>
8702    
8703 jonathan 680 * Thuban/Model/classification.py: Implemented __repr__ for
8704     the ClassGroup* classes to make debugging a bit easier.
8705     (ClassGroup.SetLabel): Check that the string is an instance
8706     of StringTypes not StringType. Accounts for Unicode strings.
8707    
8708     * Thuban/Model/color.py: Implemented __repr__ to make
8709     debugging a bit easier.
8710    
8711     * Thuban/Model/save.py (Saver.write_classification): Need to
8712     save the group label.
8713    
8714     * test/test_load.py (testClassification): New. Loads the
8715     iceland_sample_test.thuban file and checks if it was loaded
8716     correctly.
8717    
8718     2003-04-15 Jonathan Coles <[email protected]>
8719    
8720 jonathan 673 * extensions/thuban/wxproj.cpp (draw_polygon_init): New. Used
8721     to improve rendering performance by initializing the variables
8722     that are not change each time draw_polygon_shape() is called.
8723     The values are stored in a global struct draw_info.
8724     (draw_polygon_shape): Removed initialization code that is
8725     now in draw_polygon_init().
8726    
8727     * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Make
8728 jonathan 674 drawing initialization call to draw_polygon_init()
8729     (MapRenderer.draw_polygon_shape): Use new signature of
8730     draw_polygon_shape.
8731 jonathan 673
8732 jonathan 674 * Thuban/UI/classgen.py (GenUniformPanel): Fix spin control
8733     weirdness by setting the range to (1, maxint).
8734 jonathan 673
8735 jonathan 674 * Thuban/Model/classification.py (ClassGroupProperties): Make
8736     instance variables private and optimize comparison operator
8737     by first checking if the color references are the same.
8738     (ClassGroupSingleton): Make instance variables private.
8739     (ClassGroupRange): Make instance variables private.
8740 jonathan 673
8741 jonathan 674 * HOWTO-Release: Filled in missing steps for releasing packages.
8742    
8743 bh 672 2003-04-15 Bernhard Herzog <[email protected]>
8744    
8745     First stab at internationalized messages:
8746    
8747     * Thuban/__init__.py (_): Implement the translation function for
8748     real using the python gettext module.
8749    
8750     * Thuban/UI/classifier.py (ClassTable.GetRowLabelValue): Don't
8751     translate empty strings.
8752    
8753     * Thuban/UI/application.py (ThubanApplication.read_startup_files):
8754     Add a missing space to a warning message
8755    
8756     * po/README: New. Notes about the management of the translation
8757     files.
8758    
8759     * po/Makefile: New. Makefile to help manage the translation files.
8760    
8761     * po/es.po: New. Spanish translation by Daniel Calvelo Aros
8762    
8763     * MANIFEST.in: Include the *.mo files in Resources/Locale and the
8764     translations and support files in po/
8765    
8766     * setup.py (data_files): Add the *.mo files to the data_files too
8767    
8768     * README: Add note about the translations when building from CVS
8769    
8770 jonathan 669 2003-04-14 Jonathan Coles <[email protected]>
8771    
8772     * Thuban/UI/dock.py: Fixes some window resizing problems most
8773     noticable under windows. Always assume the button bitmaps will
8774     be there. Code clean up.
8775     (DockabelWindow.Dock, DockableWindow.UnDock): Force all the
8776     images for the dock/undock button to the same images.
8777     Work around for RTbug #1801.
8778    
8779     * Thuban/UI/legend.py (LegendPanel.__init__): The toolbar should
8780     be allowed to grow within the sizer. Fixes a bug under Windows
8781     where the toolbar wasn't being drawn.
8782    
8783 frank 664 2003-04-14 Frank Koormann <[email protected]>
8784    
8785     * Resources/Bitmaps/dock_12.xpm, Resources/Bitmaps/undock_12.xpm:
8786     Updated design to try to make the button functionality more
8787     transparent.
8788    
8789 jonathan 662 2003-04-14 Jonathan Coles <[email protected]>
8790    
8791     * Thuban/UI/legend.py (LegendPanel.__init__): Call Create() to
8792     finalize the intialization of the panel.
8793    
8794     * Thuban/UI/dock.py (DockPanel.Create): New. Finalizes the
8795     creation of the panel. Should be the last thing called in the
8796     initializer of a subclass.
8797    
8798     * Thuban/UI/classgen.py (ClassGenDialog.__init__): Actively
8799     set the current selections in the combo boxes. This is needed
8800     under Windows.
8801    
8802     * Thuban/UI/classifier.py (Classifier.__init__): Add a top
8803     level panel to the dialog so that the background colors are
8804     consistent under Windows.
8805    
8806 jonathan 646 2003-04-11 Jonathan Coles <[email protected]>
8807    
8808 jonathan 662 * Thuban/UI/classgen.py: Change color ramps to start at white
8809     not black.
8810    
8811     * Thuban/UI/legend.py: Enable/disable the legend buttons when
8812     the legend changes. Fixes RTbug #1793.
8813    
8814     * test/test_classification.py: Added test for copying of
8815     classifications.
8816    
8817     2003-04-11 Jonathan Coles <[email protected]>
8818    
8819 jonathan 647 * Thuban/UI/resource.py: New. Centralize the loading of resources
8820     such as bitmaps.
8821    
8822     * Thuban/UI/classgen.py (GenUniquePanel.__init__): Reordered buttons,
8823     added images to the move buttons, added 'reverse' button.
8824     (CustomRampPanel.__init__): Added images to the move buttons.
8825     (GreyRamp): New. Generates a ramp from white to black.
8826     (HotToColdRamp): New. Generates a ramp from cold to hot colors.
8827    
8828     * Thuban/UI/classifier.py: Refactored ID's from ID_CLASSIFY_* to
8829     ID_PROPERTY_*.
8830     (Classifier.__init__): Minor changes to the layout.
8831     (Classifier._OnTitleChanged): Listen for when the user edits the
8832     title and update the dialog's title and the layer's title.
8833    
8834     * Thuban/UI/dock.py: Use new bitmaps for the control buttons.
8835    
8836     * Thuban/UI/legend.py: Use new bitmaps for the control buttons.
8837     (LegendTree._OnMsgLayerTitleChanged): Change the displayed title
8838     if the layer's title changes.
8839    
8840     * Thuban/UI/mainwindow.py: Added new menu item and associated code
8841     to open a dialog to rename the map.
8842     (MainWindow): Use new resource class to import bitmaps.
8843    
8844     2003-04-11 Jonathan Coles <[email protected]>
8845    
8846 jonathan 646 * Resources/Bitmaps/close_12.xpm, Resources/Bitmaps/dock_12.xpm,
8847 jonathan 647 Resources/Bitmaps/group_use.xpm, Resources/Bitmaps/group_use_all.xpm,
8848     Resources/Bitmaps/group_use_none.xpm,
8849     Resources/Bitmaps/group_use_not.xpm,
8850     Resources/Bitmaps/hide_layer.xpm,
8851     Resources/Bitmaps/layer_properties.xpm,
8852     Resources/Bitmaps/lower_layer.xpm, Resources/Bitmaps/raise_layer.xpm,
8853     Resources/Bitmaps/show_layer.xpm, Resources/Bitmaps/undock_12.xpm:
8854     New.
8855 jonathan 646
8856 jonathan 636 2003-04-10 Jonathan Coles <[email protected]>
8857    
8858 jonathan 644 * Thuban/Model/classification.py: (ClassGroupRange.__init__):
8859     Should pass group to ClassGroup constructor.
8860    
8861     2003-04-10 Jonathan Coles <[email protected]>
8862    
8863 jonathan 636 * Thuban/Model/classification.py: (ClassGroup): Move all the common
8864     methods of the derived classes ([Set|Get]Properties(), __eq__, __ne__)
8865     here. Implement SetVisible(), IsVisible().
8866     (ClassGroup.__init__): Add group parameter which acts as a copy
8867     constructor.
8868    
8869     * Thuban/UI/classifier.py (ClassTable): Add a new column for the
8870     "Visible" check boxes.
8871     (Classifier): Rename the buttons and refactor the code to match
8872     the new labels.
8873    
8874     * Thuban/UI/legend.py: Classify button is now called "Properties".
8875     Refactored the code to change variable names.
8876     (LegendTree.__FillTreeLayer): Only list a group if it is visible.
8877    
8878     * Thuban/UI/mainwindow.py: MainWindow.OpenClassifier renamed to
8879     MainWindow.OpenLayerProperties. MainWindow.LayerEditProperties
8880     renamed to MainWindow.LayerEditProperties.
8881     (MainWindow.ToggleLegend): Don't include map name in legend title.
8882     (MainWindow.SetMap): Added the map name to the window title.
8883     (MainWindow.LayerFillColor, MainWindow.LayerTransparentFill,
8884     MainWindow.LayerOutlineColor, MainWindow.LayerNoOutline): Removed.
8885     Functionality is found in the layer properties dialog.
8886    
8887     * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Only
8888     draw visible groups.
8889    
8890 jonathan 626 2003-04-09 Jonathan Coles <[email protected]>
8891    
8892 jonathan 634 * Thuban/UI/classgen.py: Modifications to allow simple
8893     addition and selection of new color schemes.
8894     (MonochromaticRamp): New. Generates a ramp between two colors.
8895     (RedRamp): New. Generates a ramp of all red.
8896     (GreenRamp): New. Generates a ramp of all green.
8897     (BlueRamp): New. Generates a ramp of all blue.
8898    
8899     2003-04-09 Jonathan Coles <[email protected]>
8900    
8901 jonathan 626 * Thuban/Model/classification.py (Classification.__deepcopy__):
8902     Need to copy over field and fieldType attributes.
8903    
8904     * Thuban/Model/table.py (Table.field_range): New. Retrive the
8905     maximum and minimum values over the entire table for a given
8906     field.
8907     (Table.GetUniqueValues): New. Retrieve all the unique values
8908     in the table for a given field.
8909    
8910     * Thuban/UI/classgen.py: Renamed GenRangePanel to GenUniformPanel.
8911     (GenUniquePanel): New. Controls to allow the user to select
8912     which unique field values they would like in the classification.
8913     (CustomRampPanel): Code that was in ClassGenDialog that allows
8914     the user to select the properties for a custom ramp.
8915     (ClassGenerator.GenUniformDistribution): Was called GenerateRanges.
8916    
8917     * Thuban/UI/classifier.py: Removed a lot of debugging code.
8918     (Classifier._SetClassification): Callback method so that the
8919     class generator can set the classification in the grid.
8920     (ClassGroupPropertiesCtrl): New. Encapsulates the drawing and
8921     editing of a group properties class into a wxWindows control.
8922    
8923     * Thuban/UI/dock.py: It was decided that if the user closes
8924     a dockable window the window should simply hide itself. That
8925     way if the user wants to show the dock again it appears in the
8926     same place as it was when it was closed.
8927     (DockableWindow.Destroy): Call renamed method OnDockDestroy().
8928     (DockableWindow._OnButtonClose): Hide the window instead of
8929     destroying it.
8930     (DockableWindow._OnClose): Hide the window instead of
8931     destroying it.
8932    
8933     * Thuban/UI/legend.py (LegendTree): Use a private method to
8934     consistently set the font and style of the text. Fixes RTbug #1786.
8935    
8936     * Thuban/UI/mainwindow.py: Import just the Classifier class.
8937    
8938 bh 623 2003-04-07 Bernhard Herzog <[email protected]>
8939    
8940 bh 625 * Thuban/UI/mainwindow.py (main_menu): Move the toggle_legend item
8941     to the map module
8942    
8943     2003-04-07 Bernhard Herzog <[email protected]>
8944    
8945 bh 623 * Thuban/UI/mainwindow.py (MainWindow.ShowSessionTree): Removed in
8946     favor of ToggleSessionTree
8947     (MainWindow.ToggleSessionTree): New method to toggle visibility of
8948     the session tree.
8949     (MainWindow.SessionTreeShown): New method to return whether the
8950     session tree is currently shown.
8951     (MainWindow.ToggleLegend): New method to toggle visibility of the
8952     legend
8953     (MainWindow.ShowLegend): Implement in terms of ToggleLegend and
8954     LegendShown
8955     (MainWindow.LegendShown): New method to return whether the legend
8956     is currently shown.
8957     (_method_command): Add checked parameter so we can define check
8958     menu items
8959     (_has_tree_window_shown, _has_legend_shown): Use the appropriate
8960     mainwindow methods.
8961     (show_session_tree, show_legend commands): Removed.
8962     (toggle_session_tree, toggle_legend commands): New commands to
8963     toggle the visibility of the dialogs
8964    
8965 jonathan 612 2003-04-07 Jonathan Coles <[email protected]>
8966    
8967 jonathan 619 * Thuban/UI/classgen.py: Fix Windows problem.
8968    
8969     * Thuban/UI/dock.py: Fix Windows problem.
8970    
8971     * Thuban/UI/mainwindow.py: Use False instead of false.
8972     (MainWindow.ShowLegend): Remove unnecessary switch parameter.
8973    
8974     2003-04-07 Jonathan Coles <[email protected]>
8975    
8976 jonathan 612 Since we now say that the order of the groups in a classification
8977     matters, it makes sense to be able to manipulate that order. Most
8978     of the changes to Thuban/Model/classification.py are to that end.
8979    
8980     * Thuban/Model/classification.py (Classification.AppendGroup,
8981     Classification.InsertGroup, Classification.ReplaceGroup,
8982     Classification.RemoveGroup, Classification.GetGroup): Do as the
8983     names imply.
8984     (Classification.FindGroup): This was called GetGroup, but GetGroup
8985     takes an index, while FindGroup takes a value.
8986     (Classification.__deepcopy__): Copy all the groups, BUT NOT THE LAYER
8987     REFERENCE. Currently there is a cyclic reference between the layer
8988     and its classification. If the classification doesn't need to know
8989     its owning layer we can change this, since it may make sense to be
8990     able to use the same classification with different layers.
8991    
8992     * Thuban/Model/load.py: Use Classification.AppendGroup(), not AddGroup()
8993    
8994     * Thuban/UI/classgen.py: Use Classification.AppendGroup(),
8995     not AddGroup()
8996    
8997     * Thuban/UI/classifier.py: Now that we can depend on the order in
8998     a Classification and have methods to manipulate that order we don't
8999     need to use our own data structures in the grid. We can simply make
9000     the grid/table access the information they need from a copy of
9001     the classification object.
9002     (Classifier._OnCloseBtn): Event handler for when the user clicks
9003     'Close'. This is needed so if the user applies changes and then
9004     continues to change the table the user has the option of discarding
9005     the most recent changes and keeping what they applied.
9006    
9007     * Thuban/UI/mainwindow.py: Put "Show Legend" and "Show Session Tree"
9008     into the same group.
9009    
9010     * extensions/thuban/wxproj.cpp (check_version): If Thuban is compiled
9011     with a really old version of proj, PJ_VERSION won't even be defined.
9012     If it isn't defined then just compile so that the function always
9013     returns Py_False.
9014    
9015     * test/test_classification.py: Fix tests to use the renamed methods.
9016     Still need to write tests for the new methods.
9017    
9018 jonathan 601 2003-04-04 Jonathan Coles <[email protected]>
9019 jonathan 608
9020 jonathan 612 * Thuban/UI/classifier.py (Classifier.__SelectField): Move the
9021     call to SetSelection out of the method and before the call
9022     to __SelectField in __init__. This prevents a recursion of events
9023     when _OnFieldSelect is triggered by the user.
9024    
9025     2003-04-04 Jonathan Coles <[email protected]>
9026    
9027 jonathan 608 * Thuban/Model/classification.py: Rename Color.None to
9028     Color.Transparent.
9029     (ClassGroupProperties.SetLineColori, ClassGroupProperties.SetFill):
9030     Don't bother copying the color, since Colors are immutable.
9031    
9032     * Thuban/Model/color.py, Thuban/Model/layer.py, Thuban/Model/load.py,
9033     Thuban/UI/classifier.py, Thuban/UI/mainwindow.py,
9034     Thuban/UI/renderer.py, Thuban/UI/view.py:
9035     Rename Color.None to Color.Transparent.
9036    
9037     * test/test_classification.py, test/test_load.py: Rename Color.None
9038     to Color.Transparent.
9039    
9040     2003-04-04 Jonathan Coles <[email protected]>
9041 jonathan 603
9042     * Thuban/Model/classification.py: Fix assert calls.
9043     (ClassGroupProperties.SetLineColor, ClassGroupProperties.SetFill):
9044     Copy the color parameter rather than hold onto a reference.
9045 jonathan 601
9046 jonathan 603 * Thuban/Model/color.py (Color.__copy__, Color.__deepcopy): Copy
9047     the color object.
9048     (NoColor.__copy__, NoColor.__deepcopy): Return 'self' so that we
9049     are sure there exists only one refernce to Color.None in the system.
9050     This allows us to use 'is' rather than the comparision functions.
9051    
9052     * Thuban/Model/save.py: Fix assert calls.
9053    
9054     * Thuban/UI/classifier.py: Fix assert calls.
9055     (ClassGrid._OnCellDClick): Call up to the classifier to open the
9056     dialog to edit the groups properties.
9057     (ClassGrid._OnCellResize): Make sure that the scollbars are drawn
9058     correctly if a cell is resized.
9059     (ClassTable.SetClassification): New. Changes the classification
9060     that is in the table.
9061     (ClassTable.__SetRow): Allow groups to be prepended.
9062     (Classifier): New code for opening the EditProperties and
9063     GenerateRanges dialogs.
9064     (SelectPropertiesDialog.__GetColor): Only set the color in the
9065     color dialog if the current color is not None.
9066    
9067     * Thuban/UI/dock.py: Fix assert calls.
9068    
9069     * Thuban/UI/legend.py: Fix assert calls.
9070    
9071     * Thuban/UI/renderer.py: Fix assert calls.
9072    
9073     * Thuban/UI/classgen.py (ClassGenDialog): Dialog for generating
9074     classifications.
9075     (GenRangePanel): Panel specific to range generation.
9076     (GenSingletonPanel): Panel specific to singleton generation.
9077     (ClassGenerator): Class responsible for actually generating
9078     the classification from the data gathered in the dialog box.
9079     (PropertyRamp): Generates properties whose values range from
9080     a starting property to an ending property.
9081 jonathan 601
9082 bh 600 2003-04-03 Bernhard Herzog <[email protected]>
9083    
9084     * test/support.py (print_garbage_information): New function that
9085     prints information about still connected messages and memory
9086     leaks.
9087     (run_suite): Removed.
9088     (run_tests): New function for use as a replacement of
9089     unittest.main in the test_* files. This one calls
9090     print_garbage_information at the end.
9091    
9092     * test/runtests.py (main): Use support.print_garbage_information
9093    
9094     * test/test_layer.py: Use support.run_tests instead of
9095     unittest.main so we get memory leak information
9096     (TestLayer.test_arc_layer, TestLayer.test_polygon_layer)
9097     (TestLayer.test_point_layer, TestLayer.test_empty_layer)
9098     (TestLayerLegend.test_visibility): Call the layer's Destroy method
9099     to fix a memory leak.
9100    
9101     * test/test_classification.py: Use support.run_tests instead of
9102     unittest.main so we get memory leak information
9103     (TestClassification.test_classification): Call the layer's Destroy
9104     method to fix a memory leak.
9105    
9106 bh 591 2003-04-02 Bernhard Herzog <[email protected]>
9107    
9108 bh 595 * extensions/thuban/wxproj.cpp (check_version, check_version_gtk):
9109     Handle the reference counts of the return value and errors in
9110     PyArg_ParseTuple correctly.
9111    
9112 bh 593 * Thuban/UI/application.py (ThubanApplication.OpenSession): Make
9113     sure the filename is absolute to avoid problems when saving the
9114     session again
9115    
9116 bh 591 * Thuban/Model/table.py: Remove unnecessary import. Fix a typo.
9117    
9118 jonathan 587 2003-04-01 Jonathan Coles <[email protected]>
9119    
9120 jonathan 589 * Thuban/UI/renderer.py (MapRenderer.draw_point_shape): Check
9121 jonathan 587 that there actually are points in the returned list of points
9122     before trying to index into the list. The list may be empty if
9123     the shape is a Null Shape.
9124    
9125 bh 586 2003-04-01 Bernhard Herzog <[email protected]>
9126    
9127     * test/test_map.py: Don't use from <module> import *
9128    
9129 jonathan 581 2003-04-01 Jonathan Coles <[email protected]>
9130    
9131     * Thuban/Model/session.py: Use LAYER_CHANGED instead of
9132     LAYER_LEGEND_CHANGED
9133    
9134     * Thuban/UI/dock.py (DockableWindow._OnButtonClose): Call
9135     self.Destroy() to close the window after yesterday's changes.
9136    
9137     * test/test_map.py, test/test_session.py: Fix messages that
9138     are sent from maps and layers.
9139    
9140 jonathan 575 2003-03-31 Jonathan Coles <[email protected]>
9141    
9142     * Thuban/UI/classifier.py: Commented out some debugging statements.
9143     (ClassDataPreviewer.Draw): Draw rectangles for polygon layers per
9144     RTbug #1769.
9145    
9146     * Thuban/UI/dock.py (DockableWindow.UnDock): Restore size and
9147     position (although position doesn't work yet under GTK).
9148     (DockableWindow.Destroy): New. Called when the window must be
9149     closed. Namely needed when the DockFrame closes and must close
9150     its children.
9151     (DockFrame): Listen for EVT_CLOSE and destroy all children.
9152    
9153     * Thuban/UI/legend.py (LegendPanel.Destroy): New. Cleans up
9154     when then window is told to close.
9155     (LegendTree._OnMsgLayerChanged): Fixes a seg fault bug. See
9156     comment in source for more info.
9157    
9158     * Thuban/UI/main.py: Show the legend by default when Thuban starts.
9159    
9160     * Thuban/UI/mainwindow.py: Renamed OnClose to _OnClose for
9161     symmetry with other such methods.
9162     (MainWindow.ShowLegend): Show the legend docked by default.
9163    
9164 jonathan 569 2003-03-28 Jonathan Coles <[email protected]>
9165    
9166     * Thuban/UI/classifier.py: Support for highlighting a specific
9167     group within the grid when the classification dialog is opened.
9168     Also contains a lot of debugging printouts which will later
9169     be removed.
9170    
9171     * Thuban/UI/dock.py: Complete rework on the dock code so that
9172     that it is fairly removed from the rest of the Thuban application.
9173     It is easy to add new docks which the rest of the program having
9174     to be aware of them.
9175    
9176     * Thuban/UI/legend.py: Modifications to support selecting a
9177     specific group in the classification dialog. Changed how layers
9178     are drawn when the layer is visible/invisible.
9179    
9180     * Thuban/UI/mainwindow.py: Removed legend specific code and
9181     replaced it with calls to the new dock code.
9182    
9183     * Thuban/UI/renderer.py (MapRenderer.__init__): Added assert
9184     to check if scale > 0. Trying to track down a divide by zero.
9185    
9186 jonathan 557 2003-03-26 Jonathan Coles <[email protected]>
9187    
9188 jonathan 567 * Thuban/UI/legend.py: Removed unnecessary LegendDialog class.
9189     (LegendPanel): Removed _OnDock()/_OnUnDock() methods which are
9190     now part of DockableWindow.
9191     (LegendPanel.DoOnSelChanged): Select the current layer in the
9192     map.
9193     (LegendTree._OnSelChanged): Call LegendPanel.DoOnSelChanged()
9194     with the selected layer and/or group.
9195    
9196     2003-03-26 Jonathan Coles <[email protected]>
9197    
9198 jonathan 557 This putback contains the code for dockable windows. There is
9199     no support in wxWindows as of this date for windows that can
9200     attach themselves to other windows.
9201    
9202     The current model contains a DockableWindow which has a parent
9203     window for when it is detached and a dock window that it puts
9204     its contents in when it is docked. The contents of a DockableWindow
9205     must be a DockPanel. DockPanel itself derives from wxPanel.
9206    
9207     * Thuban/Model/layer.py (Layer.ClassChanged): Send a LAYER_CHANGED
9208     message, not a LAYER_LEGEND_CHANGED message.
9209    
9210     * Thuban/Model/map.py (Map): Forward LAYER_CHANGED messages.
9211    
9212     * Thuban/UI/classifier.py (Classifier.__init__): Use wxADJUST_MINSIZE
9213     as one of the style properties for the fieldTypeText item to
9214     be sure that its size is correct when the text changes.
9215    
9216     * Thuban/UI/dock.py: New. Classes for the DockPanel and
9217     DockableWindow.
9218    
9219     * Thuban/UI/legend.py: Added some more buttons and made the
9220     LegendPanel a DockPanel.
9221    
9222     * Thuban/UI/mainwindow.py: Added sash windows to the main window
9223     and supporting functions for manipulating the sashes.
9224     (MainWindow.ShowLegend): Create a DockableWindow with the
9225     LegendPanel as the contents.
9226    
9227     * Thuban/UI/messages.py: Added DOCKABLE_* messages
9228    
9229     * Thuban/UI/view.py (MapCanves.SetMap): Listen for LAYER_CHANGED,
9230     not LAYER_LEGEND_CHANGED, messages.
9231    
9232 jonathan 554 2003-03-25 Jonathan Coles <[email protected]>
9233    
9234     * setup.py: Added custom script bdist_rpm_build_script so that
9235     when the rpm is built the path to wx-config is correct.
9236    
9237     * setup.cfg: Added line saying to use the custom build script
9238    
9239 jonathan 552 2003-03-20 Jonathan Coles <[email protected]>
9240    
9241     Initial implementation of the Legend.
9242    
9243     * Thuban/UI/legend.py: New. Creates a window that shows the map's
9244     Legend information and allows the user to add/modify classifications
9245     and how the layers are drawn on the map.
9246    
9247     * setup.py: New command 'build_docs' which currently uses
9248     happydoc to generate html documentation for Thuban.
9249    
9250     * Thuban/Model/classification.py (ClassGroup.GetDisplayText): New.
9251     Returns a string which is appropriately describes the group.
9252    
9253     * Thuban/Model/layer.py (Layer.SetClassification): Generate a
9254     LAYER_CHANGED event instead of a LAYER_LEGEND_CHANGED event.
9255    
9256     * Thuban/Model/map.py (Map): Rename messages and use new, more
9257     specific, messages.
9258    
9259     * Thuban/Model/messages.py: New message to indicate that a layer's
9260     data has changed (LAYER_CHANGED). New map messages to indicate
9261     when layers have been added/removed/changed or if the stacking order
9262     of the layers has changed.
9263    
9264     * Thuban/Model/session.py: Rename and use new messages.
9265    
9266     * Thuban/UI/classifier.py: Remember if any changes have actually
9267     been applied so that if the dialog is cancelled without an application
9268     of changes we don't have to set a new classification.
9269     (ClassDataPreviewer): Pulled out the window specific code and put it
9270     ClassDataPreviewWindow. ClassDataPreviewer can then be used to draw
9271     symbols on any DC.
9272    
9273     * Thuban/UI/mainwindow.py: New code to open the legend.
9274    
9275     * Thuban/UI/view.py: Use new message names.
9276    
9277 jonathan 541 2003-03-19 Jonathan Coles <[email protected]>
9278    
9279     * Thuban/UI/main.py (verify_versions): New. Checks the versions
9280     of Python, wxPython, and some other libraries.
9281    
9282     * extensions/thuban/wxproj.cpp (check_version): Checks the given
9283     version against what wxproj was compiled with.
9284     (check_version_gtk): If wxproj was compiled with gtk then check
9285     the given version against the version of the gtk library
9286     currently being used.
9287    
9288 bh 538 2003-03-14 Bernhard Herzog <[email protected]>
9289    
9290     * test/test_command.py: Run the tests when the module is run as a
9291     script
9292    
9293     2003-03-14 Bernhard Herzog <[email protected]>
9294    
9295     Implement selection of multiple selected shapes in the same layer:
9296    
9297     - Introduce a new class to hold the selection. This basically
9298     replaces the interactor which was nothing more than the
9299     selection anyway. A major difference is of course that the new
9300     selection class supports multiple selected shapes in one layer
9301    
9302     - Move the object that represents the selection from the
9303     application to the canvas. The canvas is a better place than the
9304     application because the selection represents which shapes and
9305     layer of the map displayed by the canvas are selected and
9306     affects how the map is drawn.
9307    
9308     - Make the selection and its messages publicly available through
9309     the mainwindow.
9310    
9311     - The non-modal dialogs do not get a reference to the interactor
9312     anymore as they can simply refer to their parent, the
9313     mainwindow, for the what the interactor had to offer.
9314    
9315     * Thuban/UI/selection.py: New module with a class to represent the
9316     selection.
9317    
9318     * Thuban/UI/messages.py (SELECTED_TABLE, SELECTED_MAP): Remove
9319     these unused messages
9320    
9321     * Thuban/UI/application.py (ThubanApplication.OnInit)
9322     (ThubanApplication.OnExit, ThubanApplication.SetSession): The
9323     interactor is gone now.
9324     (ThubanApplication.CreateMainWindow): There is no interactor
9325     anymore so we pass None as the interactor argument for now for
9326     compatibility.
9327    
9328     * Thuban/UI/view.py (MapCanvas.delegated_messages)
9329     (MapCanvas.Subscribe, MapCanvas.Unsubscribe): In Subscribe and
9330     Unsubscribe, delegate messages according to the delegated_messages
9331     class variable.
9332     (MapCanvas.__getattr__, MapCanvas.delegated_methods): Get some
9333     attributes from instance variables as described with the
9334     delegated_methods class variable.
9335     (MapCanvas.__init__): New instance variable selection holding the
9336     current selection
9337     (MapCanvas.do_redraw): Deal with multiple selected shapes. Simply
9338     pass them on to the renderer
9339     (MapCanvas.SetMap): Clear the selection when a different map is
9340     selected.
9341     (MapCanvas.shape_selected): Simple force a complete redraw. The
9342     selection class now takes care of only issueing SHAPES_SELECTED
9343     messages when the set of selected shapes actually does change.
9344     (MapCanvas.SelectShapeAt): The selection is now managed in
9345     self.selection
9346    
9347     * Thuban/UI/mainwindow.py (MainWindow.delegated_messages)
9348     (MainWindow.Subscribe, MainWindow.Unsubscribe): In Subscribe and
9349     Unsubscribe, delegate messages according to the delegated_messages
9350     class variable.
9351     (MainWindow.delegated_methods, MainWindow.__getattr__): Get some
9352     attributes from instance variables as described with the
9353     delegated_methods class variable.
9354     (MainWindow.__init__): The interactor as ivar is gone. The
9355     parameter is still there for compatibility. The selection messages
9356     now come from the canvas.
9357     (MainWindow.current_layer, MainWindow.has_selected_layer):
9358     Delegate to the the canvas.
9359     (MainWindow.LayerShowTable, MainWindow.Classify)
9360     (MainWindow.identify_view_on_demand): The dialogs don't need the
9361     interactor parameter anymore.
9362    
9363     * Thuban/UI/tableview.py (TableFrame.__init__)
9364     (LayerTableFrame.__init__, LayerTableFrame.OnClose)
9365     (LayerTableFrame.row_selected): The interactor is gone. It's job
9366     from the dialog's point of view is now done by the mainwindow,
9367     i.e. the parent. Subscribe to SHAPES_SELECTED instead
9368     of SELECTED_SHAPE
9369    
9370     * Thuban/UI/dialogs.py (NonModalDialog.__init__): The interactor
9371     is gone. It's job from the dialog's point of view is now done by
9372     the mainwindow, i.e. the parent.
9373    
9374     * Thuban/UI/classifier.py (Classifier.__init__): The interactor is
9375     gone. It's job from the dialog's point of view is now done by the
9376     mainwindow, i.e. the parent.
9377    
9378     * Thuban/UI/tree.py (SessionTreeView.__init__): The interactor is
9379     gone. It's job from the dialog's point of view is now done by the
9380     mainwindow, i.e. the parent.
9381     (SessionTreeCtrl.__init__): New parameter mainwindow which is
9382     stored as self.mainwindow. The mainwindow is need so that the tree
9383     can still subscribe to the selection messages.
9384     (SessionTreeCtrl.__init__, SessionTreeCtrl.unsubscribe_all)
9385     (SessionTreeCtrl.update_tree, SessionTreeCtrl.OnSelChanged): The
9386     selection is now accessible through the mainwindow. Subscribe to
9387     SHAPES_SELECTED instead of SELECTED_SHAPE
9388    
9389     * Thuban/UI/identifyview.py (IdentifyView.__init__): Use the
9390     SHAPES_SELECTED message now.
9391     (IdentifyView.selected_shape): Now subscribed to SHAPES_SELECTED,
9392     so deal with multiple shapes
9393     (IdentifyView.__init__, IdentifyView.OnClose): The interactor is
9394     gone. It's job from the dialog's point of view is now done by the
9395     mainwindow, i.e. the parent.
9396    
9397     * Thuban/UI/controls.py (RecordListCtrl.fill_list): The second
9398     parameter is now a list of shape ids.
9399     (RecordTable.SetTable): The second parameter is now a list of
9400     indices.
9401    
9402     * Thuban/UI/renderer.py (ScreenRenderer.RenderMap): Rename the
9403     selected_shape parameter and ivar to selected_shapes. It's now a
9404     list of shape ids.
9405     (MapRenderer.draw_label_layer): Deal with multiple selected
9406     shapes. Rearrange the code a bit so that the setup and shape type
9407     distinctions are only executed once.
9408    
9409     * test/test_selection.py: Test cases for the selection class
9410    
9411 jonathan 527 2003-03-11 Jonathan Coles <[email protected]>
9412    
9413     * Thuban/Model/load.py: Temporary fix so that the xml reader
9414     doesn't cause Thuban to crash.
9415    
9416     * Thuban/Model/layer.py: Handle the cyclic references between
9417     a layer and its classification better, and be sure to disconnect
9418     the classification from the layer when the layer is destroyed
9419     so that we don't maintain a cyclic reference that may not be
9420     garbage collected.
9421    
9422     * Thuban/Model/classification.py: See comment for layer.py.
9423    
9424 jan 523 2003-03-12 Jan-Oliver Wagner <[email protected]>
9425    
9426     * HOWTO-Release: New. Information on the steps for releasing
9427     a new version of Thuban.
9428    
9429 jonathan 514 2003-03-11 Jonathan Coles <[email protected]>
9430    
9431     * Thuban/UI/classifier.py: Add normal border to SelectPropertiesDialog.
9432     Use True instead of true.
9433     (Classifier): Should have a single panel in which all the controls lie.
9434    
9435     * Thuban/UI/proj4dialog.py: Add normal border.
9436    
9437     * Thuban/UI/tree.py: Fixed problem with bad item images under Windows.
9438    
9439     * Thuban/UI/mainwindow.py: Use True instead of true.
9440    
9441     * setup.py: Update some definitions to use wxWindows2.4 files
9442    
9443     * Data/iceland_sample_class.thuban: Fixed file so that the
9444     field_type information is present.
9445    
9446 jonathan 490 2003-03-10 Jonathan Coles <[email protected]>
9447    
9448 jonathan 505 * Thuban/UI/classifier.py (Classifier.__init__): Make the
9449     field type label grow so that when the text changes the
9450     size is updated correctly. This may be a wxWindows bug.
9451    
9452     2003-03-10 Jonathan Coles <[email protected]>
9453    
9454 jonathan 499 * Thuban/UI/application.py: Changed SESSION_CHANGED to
9455     SESSION_REPLACED.
9456    
9457     * Thuban/UI/classifier.py: Wrap text with _().
9458     (ClassGrid.CreateTable): Set dimensions and size hints here,
9459     instead of in Reset, so we only set the size once.
9460    
9461     * Thuban/UI/dialogs.py: Don't need Shutdown(); just use Close()!
9462    
9463     * Thuban/UI/mainwindow.py (MainWindow.prepare_new_session):
9464     Call Close() instead of Shutdown().
9465    
9466     * Thuban/UI/messages.py: Changed SESSION_CHANGED to SESSION_REPLACED.
9467    
9468     * Thuban/UI/tree.py: Changed SESSION_CHANGED to SESSION_REPLACED.
9469     Go back to using OnClose() instead of Shutdown().
9470    
9471     2003-03-10 Jonathan Coles <[email protected]>
9472    
9473 jonathan 497 * Thuban/UI/classifier.py (Classifier): SelectField() needed
9474     to know the old field index as well as the new one.
9475    
9476     2003-03-10 Jonathan Coles <[email protected]>
9477    
9478 jonathan 495 * Thuban/UI/classifier.py (Classifier): Use __SelectField()
9479     to correctly set the table information and call this from
9480     __init__ and from _OnFieldSelect so that all the information
9481     is up to date when the dialog opens and when a field is changed.
9482    
9483     2003-03-10 Jonathan Coles <[email protected]>
9484    
9485 jonathan 490 * Thuban/Model/classification.py (Classification): Don't use
9486     layer's message function directly, use the ClassChanged() method
9487     when then classification changes. SetField/SetFieldType/SetLayer
9488     must keep the information about field name and field type in
9489     sync when an owning layer is set or removed.
9490    
9491     * Thuban/Model/layer.py: Added ClassChanged() so that the
9492     classification can tell the layer when its data has changed.
9493     (Layer.SetClassification): Accepts None as an arguement to
9494     remove the current classification and correctly handles
9495     adding a new classification.
9496    
9497     * Thuban/Model/load.py: Comment out print statement
9498    
9499     * test/test_classification.py, test/test_save.py: New and
9500     improved tests.
9501    
9502 jonathan 483 2003-03-07 Jonathan Coles <[email protected]>
9503    
9504     * Thuban/Model/classification.py: Implemented __copy__ and
9505     __deepcopy__ for ClassGroup* and ClassGroupProperites so
9506     they can easily be copied by the classifier dialog.
9507     (ClassGroupProperites.__init__): The default line color should
9508     have been Color.Black.
9509    
9510     * Thuban/UI/classifier.py: Setting and Getting table values now
9511     uses a consistent set of functions.
9512     (Classifier): Now non-modal. Has field type label which changes
9513     as the field changes. Keep track of buttons in a list so that
9514     we can enable/disable the buttons when the None field is selected.
9515     (SelectPropertiesDialog): Add buttons to make the colors transparent.
9516    
9517     * Thuban/UI/dialogs.py (NonModalDialog.Shutdown): New method which
9518     does what OnClose did, but can be called by the application to
9519     close a window. Needed when a session changes, and we have to
9520     close the classifier windows.
9521    
9522     * Thuban/UI/mainwindow.py (MainWindow.prepare_new_session):
9523     Shuts down open dialogs. Used when a new session is created
9524     or a session is opened.
9525     (MainWindow.SaveSession): Should only call application.SaveSession()
9526     if we don't call SaveSessionAs first.
9527     (MainWindow.Classify): Allow different classifier dialogs for
9528     different layers.
9529    
9530     * Thuban/UI/tree.py (SessionTreeView): Remove OnClose and let
9531     the parent class handle it. Add Shutdown() to unsubscibe from
9532     event notification and call the parent Shutdown(). This was
9533     necessary so the application can close the tree window.
9534    
9535 jonathan 478 2003-03-06 Jonathan Coles <[email protected]>
9536    
9537     * Thuban/Model/classification.py: Minor documentation changes,
9538     Addition of __eq__ and __ne__ methods.
9539     (Classification.SetLayer): prevent recursion between this method
9540     and Layer.SetClassification().
9541    
9542     * Thuban/Model/color.py: Addition of __eq__ and __ne__ methods.
9543    
9544     * Thuban/Model/layer.py (SetClassification): prevent recursion
9545     between this method and Classification.SetLayer().
9546    
9547     * test/test_classification.py, test/test_load.py,
9548     test/test_session.py: Fixed and added tests for the classification
9549     classes.
9550    
9551 bh 477 2003-03-06 Bernhard Herzog <[email protected]>
9552    
9553     * Thuban/UI/classifier.py (ClassGrid.__init__)
9554     (ClassGrid.CreateTable): Move the SetSelectionMode call to
9555     CreateTable because otherwise it triggers an assertion in
9556     wxPython/wxGTK 2.4.
9557    
9558 jonathan 459 2003-03-05 Jonathan Coles <[email protected]>
9559    
9560 jonathan 475 * Thuban/common.py: Move FIELDTYPE constants back to table.py.
9561 jonathan 471
9562 jonathan 475 * Thuban/Model/load.py: import FIELDTYPE constants from table.
9563 jonathan 471
9564 jonathan 475 * Thuban/UI/classifier.py: import FIELDTYPE constants from table.
9565 jonathan 471
9566 jonathan 475 * Thuban/Model/table.py: Put FIELDTYPE constants back.
9567 jonathan 471
9568     2003-03-05 Jonathan Coles <[email protected]>
9569    
9570 jonathan 459 * Thuban/UI/classifier.py: Added class documentation.
9571     Fixed RTbug #1713, #1714. Added Move[Up|Down] buttons.
9572     Store just the groups in the table and generate the other
9573     column information when it is requested. Add "None" field
9574     to pull-down to select no classification.
9575    
9576     * Thuban/common.py: Moved FIELDTYPE constants from table.py
9577     (Str2Num): Only catch ValueError exceptions.
9578    
9579     * Thuban/Model/classification.py: Class documentation. Renaming
9580     of methods with Stroke to Line. Groups are stored in a single
9581     list with the default as the first element. Groups are searched
9582     in the order they appear in the list.
9583    
9584     * Thuban/Model/color.py: Documentation.
9585    
9586     * Thuban/Model/layer.py (Layer): Add GetFieldType to retreive
9587     the kind of data represented by a field.
9588    
9589     * Thuban/Model/load.py (ProcessSession): Use proper string
9590     conversion function; fixes RTbug #1713.
9591    
9592     * Thuban/Model/save.py (Saver): Store field type information.
9593    
9594     * Thuban/Model/table.py: Put FIELDTYPE constants in common.py.
9595     (Table): Add field_info_by_name() to retrieve field information
9596     by specifying the field name, not the number.
9597    
9598     * Thuban/UI/mainwindow.py: Function name changes.
9599    
9600     * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Only
9601     get the layer classification once. Don't try to classify
9602     values when the field is None: just use the default properties.
9603    
9604     * Thuban/UI/view.py: Function name changes.
9605    
9606     * Doc/thuban.dtd: Add field_type attribute to a classification.
9607    
9608 bh 456 2003-03-04 Bernhard Herzog <[email protected]>
9609    
9610 bh 458 * Doc/thuban.dtd: Use correct syntax for optional attributes. Make
9611     the fill and stroke layer attributes optional with suitable
9612     default values. Add the stroke_width layer attribute. Use correct
9613     syntax for empty elements. Make the attribute list for labels
9614     refer to the label element.
9615    
9616     2003-03-04 Bernhard Herzog <[email protected]>
9617    
9618 bh 456 * setup.py (thuban_build_py.build): Add a comment about distutils in
9619     Python 2.3 containing some of the functionality we implement in
9620     setup.py ourselves.
9621    
9622     * Thuban/UI/classifier.py (ClassGrid.__init__): Set the table
9623     before the selection mode. Doing it the other way round triggers
9624     an assertion in wxWindows.
9625    
9626     * Thuban/Model/save.py (escape): Fix typo in doc-string
9627    
9628     * Thuban/Model/classification.py: Remove unnecessary wxPython
9629     import
9630    
9631 jonathan 448 2003-03-04 Jonathan Coles <[email protected]>
9632    
9633     * Thuban/Model/classification.py (ClassGroupRange.GetProperties):
9634     Parameter 'value' should default to None.
9635    
9636     * Thuban/UI/mainwindow.py: Use Layer.GetClassification() since
9637     the class attribute __classification is now private.
9638    
9639     * Thuban/UI/classifier.py (ClassGrid): Moved OnCellDClick() from
9640     Classifier to ClassGrid. Added support for removing selected rows,
9641     which including code for keeping track of when cells are selected,
9642     and deselected.
9643     (ClassTable): Support for added/removing rows. Fixed a problem
9644     with __ParseInput whereby it would not allow strings (only numbers)
9645     to be entered.
9646     (Classifier): Added button and supporting code for removing
9647     selected rows.
9648    
9649 jonathan 445 2003-02-27 Jonathan Coles <[email protected]>
9650 jonathan 434
9651     * Thuban/common.py: Moved color conversion functions into
9652     Thuban/UI/common.py.
9653     (Str2Num): Now converts the float (not the string) to a long/int
9654     so that an exception isn't thrown.
9655    
9656     * Thuban/UI/common.py: Common functions used in several UI modules
9657    
9658     * Thuban/Model/classification.py: Changed the class hierarchy
9659     so that a Classification consists of Groups which return
9660     Properties when a value matches a Group.
9661    
9662     * Thuban/Model/layer.py: Fixed name resolution problem.
9663    
9664     * Thuban/Model/load.py: Use new Classification and Group functions.
9665    
9666     * Thuban/Model/save.py (Saver.write_attribs): Fixes a test case
9667     failure.
9668     (Saver.write_classification): Use new Classification and Group
9669     functions.
9670    
9671     * Thuban/UI/classifier.py: Changes to use new Classification and Group
9672 jonathan 445 functions. Fix to create a tuple with a single value instead of
9673     simply returning the value.
9674 jonathan 434
9675     * Thuban/UI/renderer.py: Use new Classification and Group functions.
9676     Use common.py functions.
9677    
9678 jonathan 445 * Thuban/UI/tree.py: Use common.py functions.
9679 jonathan 447
9680     * test/test_classification.py: Use new Classification and Group
9681     classes.
9682 jonathan 434
9683 jonathan 426 2003-02-24 Jonathan Coles <[email protected]>
9684    
9685     * Thuban/common.py (Color2wxColour, wxColour2Color): Conversion
9686     functions from Thuban color objects to wxWindow colour objects.
9687    
9688     * Thuban/Model/classification.py (Classification): Renamed
9689     GetProperties() to GetClassData(). Used the new iterator
9690     in TreeInfo().
9691     (ClassIterator): Iterator implementation to iterate over the
9692     ClassData objects in a classification object.
9693    
9694     * Thuban/Model/save.py (Saver.write_classificaton): Uses
9695     the new iterator to save the classification information.
9696    
9697     * Thuban/UI/classifier.py (SelectPropertiesDialog): Support
9698     for changing the stroke and fill colors and previewing the
9699     changes.
9700    
9701     * Thuban/UI/mainwindow.py (MainWindow.OpenSession,
9702     MainWindow.SaveSessionAs): Text string changes so the dialogs
9703     have more meaningful titles.
9704    
9705     * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Change
9706     Classification method name from GetProperties to GetClassData.
9707    
9708     * Thuban/UI/view.py (MapCanvas.find_shape_at): Use method calls
9709     instead of accessing now non-existent class variables.
9710    
9711 bh 425 2003-02-24 Bernhard Herzog <[email protected]>
9712    
9713     * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Remove
9714     unneeded Shape() call. Rendering is substantially faster without
9715     it and it avoids some problems with broken shape files.
9716    
9717 frank 423 2003-02-20 Frank Koormann <[email protected]>
9718    
9719     Force minimal size of identify and label dialogs. The autosizing
9720     looked too ugly.
9721    
9722     * Thuban/UI/controls.py (RecordListCtrl): Set minimal width for columns.
9723     * Thuban/UI/labeldialog.py (LabelDialog.dialog_layout):
9724     Set size of listctrl.
9725     * Thuban/UI/identifyview.py (IdentifyView.__init__):
9726     Set size of dialog.
9727    
9728 jonathan 408 2003-02-19 Jonathan Coles <[email protected]>
9729    
9730     * test/test_classification.py, test/test_layer.py,
9731     test/test_load.py, test/test_map.py, test/test_session.py:
9732     Updated the tests to use the new functions that are in the
9733     respective classes.
9734    
9735     * Thuban/Model/classification.py (Classification):
9736     Uses the new ClassData* classes. Modification messages are
9737     passed up to the parent layer (if it exists).
9738     (ClassData): New class to encapsulate the common data in each
9739     classification property.
9740     (ClassDataDefault): Represents the Default class. data.
9741     (ClassDataPoint): Represents a single class. data point
9742     (ClassDataRange): Represents a class. range
9743     (ClassDataMap): Represents a class. map (unused).
9744    
9745     * Thuban/Model/color.py: Added Color.None to represent something
9746     with no color. Color.Black represents the color black.
9747     (NoColor): Helper class derived from Color to represent something
9748     with no color.
9749    
9750     * Thuban/Model/layer.py (Layer): Removed references to fill, stroke,
9751     stroke_width attributes. Made the 'classification' attribute private.
9752     New methods for setting/getting the classification.
9753    
9754     * Thuban/Model/load.py (ProcessSession): Use new methods on Layer
9755     to get the classifcation and use the new ClassData* classes to
9756     hold the classification data. Use Str2Num to convert numbers
9757     properly.
9758    
9759     * Thuban/Model/save.py (Saver): Use new Color and Classification
9760     methods
9761    
9762     * Thuban/UI/classifier.py (ClassGrid): New class to represent a
9763     custom grid.
9764     (ClassTable): Support for editing Values and Labels and for
9765     changing what type (point or range) of data is stored in each
9766     property based on how the user enters the data.
9767     (Classifier): Support for saving the new classifications and
9768     launching the dialog to edit a property.
9769     (SelectPropertiesDialog): New class for editing the visual
9770     properties of a classification (stroke color, width, and fill color)
9771     (ClassPreviewer): Took the Draw method from ClassRenderer and
9772     made most of it into this new class. Intend to use this class in
9773     the SelectPropertiesDialog for previewing changes.
9774    
9775     * Thuban/UI/renderer.py: Use new Color and Classification methods.
9776    
9777     * Thuban/UI/tree.py: Formatting changes.
9778    
9779     * Doc/thuban.dtd: Add 'label' element
9780    
9781     * Thuban/common.py: New. Contains common routines used throughout
9782     the code.
9783     (Str2Num): Takes a string and converts it to the "best" type of
9784     number.
9785    
9786 bh 405 2003-02-14 Bernhard Herzog <[email protected]>
9787    
9788     * Thuban/UI/view.py (MapCanvas.OnLeftUp): Make sure that the
9789     dragging flag is always set to 0 even when the tool implementation
9790     raises an exception
9791    
9792 bh 402 2003-02-11 Bernhard Herzog <[email protected]>
9793    
9794     * Thuban/UI/application.py (ThubanApplication.splash_screen): New
9795     method to create a splash screen.
9796     (ThubanApplication.ShowMainWindow): New. Show the main window.
9797     Needed so the splash screen can display the mainwindow
9798     (ThubanApplication.OnInit): Call the
9799     new splash_screen method to determine whether the application
9800     should display a splash screen. If it displays a splash screen do
9801     not immediately show the main window.
9802    
9803 jonathan 399 2003-02-11 Jonathan Coles <[email protected]>
9804    
9805     * Thuban/Model/classification.py: Added import line to fix
9806     feature conflicts between running on python2.2 and python2.1.
9807    
9808     * Thuban/UI/classifier.py (ClassTable): Didn't need to hang
9809     onto the clinfo parameter, so removed the deepcopy().
9810    
9811 jonathan 396 2003-02-10 Jonathan Coles <[email protected]>
9812    
9813 tkoester 403 * Thuban/Model/save.py (Saver.open_element, Saver.close_element):
9814 jonathan 396 Added element_open variable to track opening and closing of tags
9815     so that tags that don't span more than one line are closed with
9816     /> instead of </tag_name>. Use the GetDefault*() methods of
9817     the Classification class.
9818    
9819     * Thuban/Model/classification.py (Classificaton): Added set and
9820     get methods for the default data. The class also takes a layer
9821     reference so that modification messages can be sent. Fixed the
9822     methods to use the new ClassData class.
9823     (ClassData): New class to encapsulate the classification data
9824    
9825     * Thuban/Model/layer.py (Layer): Remove the
9826 tkoester 403 Set[Fill|Stroke|StrokeWidth]() methods. Code should call the
9827 jonathan 396 SetDefault*() methods on the layer's classification object.
9828 tkoester 403 (Layer.__init__): Use the new SetDefault*() methods in the
9829 jonathan 396 Classification class.
9830    
9831     * Thuban/Model/load.py (ProcessSession): Use the new ClassData
9832     object instead of a dictionary.
9833    
9834 tkoester 403 * Thuban/UI/classifier.py (ClassRenderer): New class to
9835 jonathan 396 draw the classifications in the dialog box's table.
9836     (Classifier): Modified to use the ClassRenderer class.
9837    
9838 tkoester 403 * Thuban/UI/mainwindow.py (MainWindow): Use the SetDefault*()
9839     methods of the Classification class.
9840 jonathan 396
9841     * Thuban/UI/renderer.py (MapRenderer): Use the Get*() methods
9842     of the ClassData class.
9843    
9844     * test/test_classification.py, test/test_layer.py,
9845     test/test_map.py, test/test_session.py: Fix the tests to work
9846     with the above code changes.
9847    
9848 jonathan 387 2003-02-03 Jonathan Coles <[email protected]>
9849    
9850     * Thuban/Model/classification.py (Classification): Added getNull()
9851     to return the NullData reference
9852    
9853     * Thuban/Model/layer.py (Layer.SetFill, Layer.SetStroke,
9854     Layer.SetStrokeWidth): Modified these functions to change the
9855     null data in the classification rather than keep these values
9856     directly in the Layer class. Menu options to change these values
9857     work again.
9858    
9859 jonathan 380 2003-01-28 Jonathan Coles <[email protected]>
9860    
9861 jonathan 384 * Thuban/UI/classifier.py (Classifier): Resolved merging conflicts.
9862 tkoester 403 Fixed crashing problem on some systems. Dialog box shows
9863 jonathan 380 classification data.
9864    
9865 jonathan 384 * Thuban/UI/tree.py (SessionTreeCtrl.add_items): Handle drawing
9866     Colors in the tree view.
9867    
9868     * Thuban/Model/layer.py (Layer.TreeInfo): Added a call to build
9869     the tree info for classifications. Commented out unnecessary lines.
9870    
9871     * Thuban/Model/classification.py (Classification.TreeInfo): New
9872     function to add information about the classification into the
9873     tree view.
9874    
9875 tkoester 403 2003-01-27 Jan-Oliver Wagner <[email protected]>
9876 jan 375
9877 tkoester 403 * Thuban/__init__.py (_): New.
9878 jan 375
9879     * Thuban/Model/classification.py, Thuban/Model/extension.py,
9880     Thuban/Model/layer.py, Thuban/Model/load.py, Thuban/Model/map.py,
9881 tkoester 403 Thuban/Model/session.py, Thuban/UI/application.py,
9882     Thuban/UI/classifier.py, Thuban/UI/context.py, Thuban/UI/controls.py,
9883     Thuban/UI/identifyview.py, Thuban/UI/labeldialog.py,
9884     Thuban/UI/mainwindow.py, Thuban/UI/menu.py, Thuban/UI/proj4dialog.py,
9885     Thuban/UI/renderer.py, Thuban/UI/tree.py, Thuban/Lib/connector.py,
9886     Thuban/Lib/fileutil.py: Replace user string by _() for i18n.
9887 jan 375
9888 jonathan 370 2003-01-27 Jonathan Coles <[email protected]>
9889    
9890 tkoester 403 * Thuban/Model/layer.py: Classification initialization calls.
9891 jonathan 370
9892 tkoester 403 * Thuban/Model/classification.py: Created class to encapsulate
9893     a layer classification. Supports specific data points and
9894     ranges.
9895 jonathan 370
9896 tkoester 403 * Thuban/Model/load.py: Added support for loading classification
9897     information.
9898 jonathan 370
9899 tkoester 403 * Thuban/Model/save.py: Added support for saving classification
9900     information.
9901 jonathan 370
9902 tkoester 403 * Thuban/UI/classifier.py: Initial class for a dialog box for
9903     specifying classification information.
9904 jonathan 370
9905 tkoester 403 * Thuban/UI/mainwindows.py: Support for opening the classifier
9906     dialog.
9907 jonathan 370
9908 tkoester 403 * Thuban/UI/renderer.py: Support for drawing a layer with the
9909     classification information.
9910 jonathan 370
9911 tkoester 403 * Data/iceland_sample_class.thuban: iceland_sample with
9912     classification data.
9913 jonathan 370
9914 tkoester 403 * test/test_classification: Tests for the Classification class.
9915 jonathan 370
9916 bh 359 2002-12-09 Bernhard Herzog <[email protected]>
9917    
9918 bh 361 * test/test_command.py: New. Tests for the command classes.
9919    
9920 bh 359 * Thuban/UI/command.py (ToolCommand): New class for tool commands.
9921     (Command.IsTool): New method to distinguish between command
9922     switching tools and other commands.
9923    
9924     * Thuban/UI/view.py (MapCanvas.SelectTool): New method to select
9925     the tool to avoid direct assignments to instance variables
9926     (MapCanvas.ZoomInTool, MapCanvas.ZoomOutTool, MapCanvas.PanTool)
9927     (MapCanvas.IdentifyTool, MapCanvas.LabelTool): Use SelectTool to
9928     change the tool
9929    
9930     * Thuban/UI/mainwindow.py (MainWindow.update_command_ui): If an
9931     active tool's command turns insensitive, disable the tool.
9932     (_tool_command): Use the new ToolCommand class
9933    
9934     * Examples/simple_extensions/simple_tool.py (simple_tool): Use the
9935     SelectTool method to change the tool
9936     (iconfile): Use the ToolCommand class
9937    
9938 bh 354 2002-12-03 Bernhard Herzog <[email protected]>
9939    
9940     * Thuban/UI/tree.py (SessionTreeCtrl.normalize_selection): Handle
9941     the case of selected items that are not children of Layers or Maps
9942     properly. Previously this bug would trigger an assertion in
9943     wxWindows.
9944    
9945 frank 352 2002-11-06 Frank Koormann <[email protected]>
9946    
9947 bh 354 * Thuban/UI/mainwindow.py: Altered the order of tools in the
9948     toolbar: First now are all navigation tools (Zoom In/Out, Pan,
9949     Full Extent).
9950 tkoester 403
9951 bh 349 2002-10-23 Bernhard Herzog <[email protected]>
9952    
9953     * setup.py (setup call): version now 0.1.3
9954    
9955     * MANIFEST.in: Add the files in test/
9956    
9957     * test/README: Add note about tests requiring the iceland data
9958    
9959     * Thuban/UI/mainwindow.py (MainWindow.About): Add 2002 to
9960     copyright notice.
9961    
9962 bh 344 2002-10-18 Bernhard Herzog <[email protected]>
9963    
9964     * test/test_map.py
9965     (TestMapWithContents.test_projected_bounding_box): Use an explicit
9966     epsilon.
9967    
9968     * test/support.py (FloatComparisonMixin.assertFloatEqual)
9969     (FloatComparisonMixin.assertFloatSeqEqual): give a more useful
9970     message if the assertion fails and don't return the return value
9971     of self.assert_. In assertFloatSeqEqual the return meant that not
9972     all items of the sequence were compared.
9973    
9974 bh 326 2002-09-20 Bernhard Herzog <[email protected]>
9975    
9976 bh 341 * test/test_fileutil.py: New. Test cases for Thuban.Lib.fileutil
9977    
9978     * Thuban/Lib/fileutil.py: Fixup some whitespace and typos
9979    
9980 bh 338 * test/test_map.py (TestMapWithContents.test_tree_info): Create
9981     the string with the bounding box on the fly because of platform
9982     differences in the way %g is handled.
9983    
9984     * test/test_layer.py (TestLayer.test_empty_layer): Create an empty
9985     DBFfile too because Thuban layers can't yet cope missing DBF
9986     files.
9987    
9988     2002-09-20 Bernhard Herzog <[email protected]>
9989    
9990 bh 326 * test/test_menu.py: Use initthuban instead of
9991     add_thuban_dir_to_path to initialize Thuban.
9992    
9993     * test/support.py (FloatComparisonMixin.assertFloatEqual): New.
9994     Mixin class for float comparisons
9995     (SubscriberMixin): New. Mixin class to test messages sent through
9996     the Connector class
9997    
9998     * test/README: Fix a typo and add the -v flag to the command for
9999     individual tests
10000    
10001 bh 335 * test/test_session.py: New. Test cases for Thuban.Model.session
10002    
10003     * test/test_proj.py: New. Test cases for Thuban.Model.proj
10004    
10005     * test/test_map.py: New. Test cases for Thuban.Model.map
10006    
10007     * test/test_layer.py: New. Test cases for Thuban.Model.layer
10008    
10009     * test/test_label.py: New. Test cases for Thuban.Model.label
10010    
10011     * test/test_connector.py: New. Test cases for Thuban.Lib.connector
10012    
10013     * test/test_color.py: New. Test cases for Thuban.Model.color
10014    
10015     * test/test_base.py: New. Test cases for Thuban.Model.base
10016    
10017 bh 322 2002-09-13 Bernhard Herzog <[email protected]>
10018    
10019     * Thuban/Model/session.py (Session.forwarded_channels): Forward
10020     the CHANGED channel too.
10021    
10022     * Thuban/Model/map.py (Map.forwarded_channels): Forward the
10023     CHANGED channel too.
10024     (Map.__init__): Call the Modifiable constructor as well.
10025    
10026     * Thuban/Model/base.py (Modifiable.UnsetModified): Issue a CHANGED
10027     event if the modified flag changes.
10028     (Modifiable.changed): Tweak the doc-string.
10029    
10030     * Thuban/UI/mainwindow.py (MainWindow.view_position_changed)
10031     (MainWindow.set_position_text): Put the code that puts the text
10032     with the mouse position into the status bar into the new method
10033     set_position_text so that it can overwritten in derived classes.
10034    
10035 bh 317 2002-09-12 Bernhard Herzog <[email protected]>
10036    
10037     * Thuban/UI/mainwindow.py (MainWindow.RunMessageBox): Center the
10038     message box on the main window.
10039    
10040 bh 313 2002-09-11 Bernhard Herzog <[email protected]>
10041    
10042     * Thuban/UI/mainwindow.py: Underline the 'x' in "Exit" instead of
10043     the 'E' because it's less likely to interfere with other menu
10044     entries.
10045 bh 315 (MainWindow.build_menu): remove an incorrect comment.
10046 bh 313
10047 bh 311 2002-09-10 Bernhard Herzog <[email protected]>
10048    
10049     * Thuban/UI/mainwindow.py (MainWindow.Map): New.
10050     (_tool_command): Add sensitive parameter
10051     (_has_visible_map): Sensitivity callback to tools and other
10052     commands that require a visible map. Use it in map_zoom_in_tool,
10053     map_zoom_out_tool, map_pan_tool, map_identify_tool, map_label_tool
10054     and map_full_extent
10055    
10056 bh 308 2002-09-06 Bernhard Herzog <[email protected]>
10057    
10058     * Thuban/UI/mainwindow.py (MainWindow.OnClose): Unsubscribe
10059     VIEW_POSITION
10060    
10061 tkoester 403 2002-09-04 Frank Koormann <[email protected]>
10062 frank 306
10063     * Resources/Bitmaps/fullextent.xpm: Updated Icon (removed "potatoe")
10064    
10065 bh 302 2002-09-02 Bernhard Herzog <[email protected]>
10066    
10067 bh 304 * Thuban/UI/view.py: Get rid of the idle redraw. This is done by
10068     wxWindows already and our implementation doesn't work correctly
10069     with wxGTK 2.3:
10070     (MapCanvas.__init__): Remove the instance variable
10071     (MapCanvas.OnPaint): Always call do_redraw when there's a map to
10072     be drawin
10073     (MapCanvas.OnIdle): Removed.
10074    
10075 bh 302 * Thuban/UI/view.py (MapCanvas.unprojected_rect_around_point): Add
10076     a parameter to determine the size of the rectangle.
10077     (MapCanvas.find_shape_at): Create the box around the point on a
10078     layer by layer basis and make the size depend on the shape type.
10079     This solves a problem with the selection of point shapes at the
10080     border of the layer's bounding box
10081    
10082 bh 292 2002-08-30 Bernhard Herzog <[email protected]>
10083    
10084 bh 300 * Thuban/UI/mainwindow.py (MainWindow.CanRemoveLayer): New method
10085     for the sensitivity of remove layer.
10086     (_can_remove_layer): New. Sensitivity callback for remove layer
10087     (Command layer_remove): Use _can_remove_layer
10088    
10089     * Thuban/Model/map.py (Map.CanRemoveLayer): New method to
10090     determine whether a given layer can be deleted.
10091    
10092 bh 297 * Thuban/UI/view.py (MapCanvas.__init__, MapCanvas.OnPaint)
10093     (MapCanvas.do_redraw): Get rid of the unused update_region
10094     instance variable
10095    
10096 bh 294 * Thuban/UI/view.py: Add/update some doc-strings.
10097    
10098 bh 292 * test/: new subdirectory with a bunch of unit tests.
10099    
10100     * test/README, test/test_table.py, test/test_save.py,
10101     test/test_menu.py, test/test_load.py: Initial set of tests and
10102     brief instructions on how to run them
10103    
10104 bh 287 2002-08-29 Bernhard Herzog <[email protected]>
10105    
10106 bh 291 * Thuban/UI/renderer.py (ScreenRenderer.draw_shape_layer): Handle
10107     arcs with multiple parts.
10108    
10109 bh 289 * Thuban/UI/view.py (ZoomInTool.MouseUp, ZoomOutTool.MouseUp):
10110     Handle degenrate rectangles.
10111    
10112 bh 287 * Thuban/Model/table.py: Make writing records work correctly:
10113     (Table.__init__): Keep track of whether the DBF is open for
10114     writing
10115     (Table.write_record): Open the DBF file for writing when necessary
10116    
10117 bh 285 2002-08-27 Bernhard Herzog <[email protected]>
10118    
10119     * Thuban/Model/table.py (Table.write_record, Table.__init__): Open
10120     dbf files only for reading by default. Use a new writable dbf
10121     object for writing.
10122    
10123 bh 278 2002-08-26 Bernhard Herzog <[email protected]>
10124    
10125 bh 282 * Thuban/UI/mainwindow.py: Refactor the context creation:
10126     (MainWindow.Context): New method to return a context
10127     (MainWindow.invoke_command, MainWindow.update_command_ui): Use the
10128     new method
10129    
10130 bh 278 * Thuban/UI/tableview.py (TableGrid, LayerTableGrid): Split the
10131     layer table specific code from TableGrid into LayerTableGrid
10132     (TableFrame, LayerTableFrame): Split the layer table specific code
10133     from TableFrame into LayerTableFrame
10134 bh 280 (LayerTableGrid.select_shape): Remove a debug print
10135 bh 278
10136     * Thuban/UI/mainwindow.py (MainWindow.LayerShowTable): Use the
10137     LayerTableFrame
10138    
10139 bh 277 2002-08-23 Bernhard Herzog <[email protected]>
10140    
10141     * Thuban/Model/layer.py (Layer.__init__): Make sure we have an
10142     absolute filename.
10143    
10144 bh 269 2002-08-22 Bernhard Herzog <[email protected]>
10145    
10146 bh 275 * Thuban/Model/table.py (Table.write_record): New method to write
10147     records.
10148 tkoester 403 (Table.__init__): Open the DBF file for writing too.
10149 bh 275
10150     * Thuban/UI/controls.py (RecordTable.SetValue): Write the value
10151     into the underlying table.
10152    
10153     * extensions/shapelib/shapefil.h (DBFCommit),
10154     extensions/shapelib/dbfopen.c (DBFCommit): New API function to
10155     commit any changes made to the DBF file.
10156    
10157 bh 271 * Thuban/UI/mainwindow.py (make_check_current_tool)
10158     (_tool_command): Put the code that generates the "checked"
10159     callback into a separate function so that we can reuse it
10160     elsewhere
10161    
10162 bh 269 * Thuban/Model/save.py (Saver): New class to handle serializing a
10163     session into an XML file. The main reason to introduce a class is
10164     that applications built on Thuban can derive from it so that they
10165     can save additional information in a session file.
10166     (save_session): Delegate almost all the work to the Saver class.
10167     Rename the filename argument to file because it may be a file like
10168     object now.
10169    
10170     * Thuban/Model/load.py: Get rid of the Python 1.5.2 compatibility
10171     code. Remove the little test code which would be executed when the
10172     module is run as a script which didn't work anymore since it can't
10173     import the other Thuban modules.
10174     (ProcessSession, load_session): Refactor the ProcessSession to
10175     have one method for each element start and end tag so that derived
10176     classes can easily override the processing of individual tags.
10177     Also, always parse with namespaces enabled because applications
10178     built on top of Thuban will likely use namespaces if they extend
10179     the session file format.
10180    
10181 bh 266 2002-08-21 Bernhard Herzog <[email protected]>
10182    
10183     * setup.py (ThubanInstall.run): Don't repr install_lib_orig
10184     because thubaninit_contents will do it for us.
10185    
10186 tkoester 403 2002-08-16 Jan-Oliver Wagner <[email protected]>
10187 jan 265
10188     * Thuban/UI/mainwindow.py: menu item 'show session tree' now disable if
10189     tree window already open
10190    
10191 bh 259 2002-08-15 Bernhard Herzog <[email protected]>
10192    
10193 bh 263 * Thuban/Model/layer.py (Layer.Destroy): Call the unboundd method
10194     with self.
10195    
10196     * Thuban/UI/view.py (MapCanvas.OnLeftUp): Only release the mouse
10197     when we have actually captured it.
10198    
10199 bh 259 * Thuban/Model/layer.py (Layer.Destroy): New. Explicitly close the
10200     shapefile and destroy the table.
10201    
10202     * Thuban/Model/table.py (Table.Destroy): New. Close the DBF file.
10203    
10204 bh 254 2002-08-14 Bernhard Herzog <[email protected]>
10205    
10206 bh 256 * Thuban/UI/controls.py (RecordTable.__init__): Remove the unused
10207     instance variable columns
10208     (RecordTable.GetTypeName): row and col may be negative in some
10209     cases.
10210    
10211 bh 254 * setup.py (InstallLocal.initialize_options)
10212     (InstallLocal.finalize_options, InstallLocal.user_options): New
10213     option create-init-file to build a thubaninit.py when running
10214     install_local
10215     (InstallLocal.run): Create the thubaninit.py module when requested
10216     (thubaninit_contents): Split the template into several parts and
10217     create a new function thubaninit_contents that creates the
10218     contents of a thubaninit module.
10219     (ThubanInstall.run): Use the new function to create the thubaninit
10220     module.
10221    
10222 bh 252 2002-07-30 Bernhard Herzog <[email protected]>
10223    
10224     * Thuban/UI/application.py (ThubanApplication.OnExit): Do some
10225     cleanup.
10226     (ThubanApplication.MainLoop): Extend to automatically call OnExit.
10227    
10228     * Thuban/Model/session.py (Session.Destroy): Don't bypass the
10229     direct base class' Destroy method.
10230    
10231     * Thuban/Model/map.py (Map.ClearLayers): New method to delete all
10232     layers.
10233     (Map.Destroy): Destroy the label_layer as well and call the
10234     inherited Desatroymethod first so that no more messages are
10235     issued.
10236     (Map.RaiseLayer, Map.LowerLayer): Only issue LAYERS_CHANGED
10237     message if the stacking order actually has changed. Add
10238     doc-strings.
10239     (Map.BoundingBox): Correct the doc-string.
10240     (Map.AddLayer, Map.RemoveLayer, Map.Layers, Map.HasLayers)
10241     (Map.ProjectedBoundingBox, Map.SetProjection): Add doc-strings.
10242    
10243     * Thuban/Model/label.py (LabelLayer.ClearLabels): New to delete
10244     all labels.
10245    
10246 bh 247 2002-07-29 Bernhard Herzog <[email protected]>
10247    
10248     * Thuban/Model/map.py (Map.subscribe_layer_channels)
10249     (Map.unsubscribe_layer_channels): Put the code that (un)subscribes
10250     to a layer's channels into separate methods.
10251     (Map.RemoveLayer, Map.AddLayer): Call the new methods
10252     (Map.Destroy): Unsubscribe from a layer's channels before
10253     destroying it.
10254    
10255     * Thuban/UI/view.py (MapCanvas.find_shape_at): Change the
10256     selected_layer parameter to searched_layer which is the layer to
10257     search in.
10258     (MapCanvas.SelectShapeAt): New parameter layer to restrict the
10259     search to that layer. Return the selected layer and shape.
10260    
10261     * Examples/simple_extensions/simple_tool.py (simple_tool): Fix a
10262     typo
10263    
10264 bh 238 2002-07-24 Bernhard Herzog <[email protected]>
10265    
10266 bh 243 * Thuban/UI/application.py (ThubanApplication.create_session):
10267     Extend the doc string.
10268     (ThubanApplication.subscribe_session)
10269     (ThubanApplication.unsubscribe_session): New methods to
10270     subscribe/unsubscribe to/from session channels.
10271     (ThubanApplication.SetSession): Call the new methods here.
10272     (ThubanApplication.maps_changed, ThubanApplication.set_map):
10273     Renamed set_map to maps_changed. Its now a subscriber for
10274     MAPS_CHANGED.
10275    
10276     * Thuban/UI/view.py (ZoomOutTool.MouseUp): Use the correct
10277     x-coordinate in case of simple clicks
10278    
10279     * Thuban/Model/base.py (Modifiable.changed): Apply the args tuple,
10280     don't pass it as a parameter
10281    
10282     * Thuban/Model/session.py (Session.RemoveMap): New
10283    
10284 bh 238 * Thuban/UI/mainwindow.py (MainWindow.__init__): Turn the initial
10285     window size into a parameter.
10286    
10287 bh 235 2002-07-23 Bernhard Herzog <[email protected]>
10288    
10289 bh 237 * Thuban/UI/menu.py (Menu.item_index): Also search for menus not
10290     just commands.
10291    
10292 bh 235 * Thuban/UI/mainwindow.py (MainWindow.__init__): Change the
10293     parameter list a bit to allow setting the window title and the
10294     initial message in the status bar. Update the callers.
10295    
10296     * Thuban/UI/application.py (ThubanApplication.OnInit)
10297     (ThubanApplication.CreateMainWindow): Put the mainwindow
10298     instantiation into a separate method so that it can be overridden
10299     by a subclass.
10300    
10301 bh 230 2002-07-19 Bernhard Herzog <[email protected]>
10302    
10303 bh 234 * Thuban/Model/session.py: Issue a CHANGED message every time
10304     another changed message is issued to make it easier to get
10305     notified of changes.
10306     (Session): Update the doc string
10307     (Session.forward): Issue changed-events as CHANGED as well.
10308     (Session.changed): Overwrite the inherited version to issue
10309     CHANGED events as well.
10310    
10311     * Thuban/UI/tree.py: We can now simply subscribe to the session's
10312     CHANGED channel to be informed of changes.
10313     (SessionTreeCtrl.session_channels): Not needed any longer.
10314 tkoester 403 (SessionTreeCtrl.unsubscribe_all, SessionTreeCtrl.session_changed):
10315 bh 234 Only have to (un)subscribe CHANGED
10316    
10317     * Thuban/Model/map.py (Map.TreeInfo): Deal better with empty maps.
10318    
10319 bh 230 * Thuban/UI/main.py, Thuban/UI/__init__.py: Move the work-around
10320     for the wxPython locale bug to __init__.py so that it's
10321     automatically executed by anybody using UI code from Thuban.
10322    
10323 bh 225 2002-07-18 Bernhard Herzog <[email protected]>
10324    
10325 bh 228 * Thuban/UI/main.py (main): app no longer needs to be global
10326    
10327     * Thuban/UI/mainwindow.py (MainWindow.__init__): Add application
10328     as parameter and store it in an instance variable
10329     (MainWindow.invoke_command, MainWindow.update_command_ui)
10330     (MainWindow.save_modified_session, MainWindow.NewSession)
10331     (MainWindow.OpenSession, MainWindow.SaveSession)
10332     (MainWindow.SaveSessionAs, MainWindow.ShowSessionTree): Use self's
10333     application object.
10334    
10335     * Thuban/UI/application.py (ThubanApplication.OnInit): Instantiate
10336     the main window with self.
10337    
10338 bh 225 * Thuban/UI/context.py: New module with the context class
10339    
10340     * Thuban/UI/command.py (Command): Update doc string.
10341    
10342     * Thuban/UI/mainwindow.py (MainWindow.invoke_command,
10343     MainWindow.update_command_ui): Pass an instance of the context
10344     class to the command's methods
10345     (check_current_tool, call_method): Handle the new context
10346     implementation
10347    
10348     * Examples/simple_extensions/simple_tool.py (simple_tool,
10349     check_simple_tool): Handle the new context implementation
10350    
10351     * Examples/simple_extensions/simple_command.py (simple_command):
10352     Handle the new context implementation. Update the comments about
10353     the context.
10354    
10355     * Thuban/UI/application.py (ThubanApplication.SetSession): Add
10356     doc-string
10357     (ThubanApplication.Session): New method to return the session
10358     object
10359    
10360     * Thuban/UI/tree.py (SessionTreeCtrl.update_tree): The
10361     interactor's selected_layer may not be a layer of the current
10362     session when the tree is updated while a new session is being set.
10363    
10364 bh 217 2002-07-17 Bernhard Herzog <[email protected]>
10365    
10366     * Thuban/UI/tree.py (color_string): Removed. No longer used.
10367     (SessionTreeCtrl.update_tree, SessionTreeCtrl.add_items): Split
10368     update_tree into update_tree and add_items. The tree now uses a
10369     more generic way to display the contents of the tree.
10370     (SessionTreeCtrl): Add a doc string explaining the TreeInfo method
10371    
10372     * Thuban/Model/layer.py (Layer.TreeInfo),
10373     Thuban/Model/extension.py (Extension.TreeInfo),
10374     Thuban/Model/map.py (Map.TreeInfo),
10375 tkoester 403 Thuban/Model/session.py (Session.TreeInfo):
10376 bh 217 Add TreeInfo methods to implement the new tree view update scheme
10377    
10378 bh 216 2002-07-16 Bernhard Herzog <[email protected]>
10379    
10380     * Thuban/UI/application.py: Don't use "import from" for the
10381     MainWindow. It can't always be resolved.
10382     (ThubanApplication.OnInit): change reference to MainWindow
10383     accordingly.
10384    
10385     * Thuban/UI/menu.py (Menu.SetItems): New method to replace a menu
10386     completely
10387    
10388 bh 213 2002-07-10 Bernhard Herzog <[email protected]>
10389    
10390     * setup.py (create_init_module): New configurable variable whose
10391     default depends on the platform we're running on.
10392     (ThubanInstall.initialize_options): Initialize
10393     self.create_init_module from the global create_init_module
10394     (ThubanInstall.user_options): indictate that the options
10395     create-init-module and init-module-dir have arguments.
10396    
10397     * setup.py: In the setup call change the version number to include
10398     cvs.
10399    
10400     * MANIFEST.in: Add the files in Examples
10401    
10402 bh 205 2002-07-09 Bernhard Herzog <[email protected]>
10403    
10404 bh 210 * setup.py: In the setup call, use the thuban homepage as the
10405     value of the url parameter.
10406    
10407 bh 208 * Examples: New subdirectory for examples.
10408    
10409     * Examples/simple_extensions/simple_tool.xpm,
10410     Examples/simple_extensions/simple_tool.py,
10411     Examples/simple_extensions/simple_command.py,
10412     Examples/simple_extensions/README: Simple examples showing how to
10413     add new commands and tools.
10414    
10415 bh 207 * setup.cfg (bdist_rpm): Add the default value for prefix and tell
10416     bdist_rpm that we also have an install script.
10417     (bdist_inno): Add 2002 to the copyright notice.
10418    
10419 bh 205 * setup.py: Create a file in python's site-packages directory to
10420     make installation of Thuban as a library easier.
10421     (ThubanInstall.user_options): Add two new options,
10422     create-init-module and init-module-dir
10423     (ThubanInstall.expand_with_pure_python_dirs): New method to expand
10424     filenames for installation in the default directories.
10425     (ThubanInstall.select_scheme, ThubanInstall.convert_paths): Extend
10426     the inherited methods to capture some filenames before they're
10427     transformed too much by distutils.
10428     (ThubanInstall.run): Create the init module if requested.
10429     (ThubanInstall.thuban_init_filename): New method to return the
10430     full name of the init module.
10431     (ThubanInstall.get_outputs): Append the filename of the init
10432     module.
10433    
10434 bh 202 2002-07-08 Bernhard Herzog <[email protected]>
10435    
10436 bh 205 * setup.py (thuban_bdist_rpm): Extend this version of bdist_rpm to
10437     handle the prefix properly which means that the default for the
10438     installation prefix should be /usr for RPMs and /usr/local when
10439     doing a normal source install.
10440     (bdist_rpm_install_script): Script to override the default install
10441     commands in the specfile generated by the bdist_rpm command.
10442     (thuban_bdist_rpm.user_options): Add a prefix option
10443     (thuban_bdist_rpm.initialize_options): Init the prefix option.
10444     Create the script files for the spec files as empty files here
10445     (thuban_bdist_rpm._make_spec_file): Override the inherited method
10446     to fill the script files with content.
10447    
10448 bh 202 * Thuban/Model/save.py (relative_filename): Wrapper around
10449     Thuban.Lib.fileutil.relative_filename that accepts an empty dir
10450     argument. save_session now automatically uses this version,
10451     solving a problem when saving to a relative filename.
10452    
10453     * setup.py: In the setup call, make sure that the library
10454     directories are under $prefix/lib not directly under $prefix.
10455    
10456 tkoester 403 2002-06-20 Jan-Oliver Wagner <[email protected]>
10457 jan 199
10458     * Thuban/Model/extension.py: new module to handle extension objects.
10459     * Thuban/Model/messages.py: new messages for extensions.
10460     * Thuban/Model/session.py (Session.Extensions, Session.HasExtensions,
10461     Session.AddExtension): new for handling extensions.
10462     Also some other minor changes to round up extension handling.
10463     * Thuban/UI/tree.py (SessionTreeCrtl:update_tree): Added visualization
10464     of Extension titles and title and names of its objects.
10465    
10466 bh 194 2002-05-29 Bernhard Herzog <[email protected]>
10467    
10468     * Thuban/UI/mainwindow.py (MainWindow.bind_command_events): Bind
10469 bh 202 the events for a command.
10470 bh 194 (MainWindow.add_toolbar_command, MainWindow.add_menu_command):
10471     Call bind_command_events to bind the events. add_toolbar_command
10472     can now bind events too so that it's possible to have commands
10473     that are only available through the toolbar.
10474     (MainWindow.init_ids): New instance variable events_bound to keep
10475     track of for which commands events have been bound.
10476    
10477 bh 190 2002-05-28 Bernhard Herzog <[email protected]>
10478    
10479     * Thuban/UI/menu.py: New module to build and manage menus.
10480    
10481     * Thuban/UI/mainwindow.py: Remove some unused imports.
10482     (MainWindow.__init__, main_menu): move the definition of the main
10483     menu from __init__ to the Menu instance main_menu.
10484     (MainWindow.build_menu_bar, MainWindow.build_menu): New methods to
10485     build the menu bar and sub-menus from a menu description.
10486    
10487     * Thuban/UI/application.py (ThubanApplication.OnInit): Read the
10488     startup file
10489     (ThubanApplication.read_startup_files): New method to run
10490     ~/.thuban/thubanstart.py
10491    
10492 bh 192 * Thuban/UI/mainwindow.py (MainWindow.__init__, main_toolbar):
10493     Move the toolbar definition to the Menu instance main_toolbar.
10494     (MainWindow.build_toolbar): New method to build the toolbar
10495     similar to the build_menu methods
10496    
10497 bh 184 2002-05-23 Bernhard Herzog <[email protected]>
10498    
10499 bh 186 * Thuban/UI/mainwindow.py (MainWindow.__init__): Fix spelling of
10500     layer_outline_color. Fix it in the definition of the command too.
10501    
10502 bh 184 * Thuban/UI/command.py (Command): Fix typo in doc string
10503    
10504 bh 182 2002-05-22 Bernhard Herzog <[email protected]>
10505    
10506     * Thuban/UI/mainwindow.py (MainWindow.RunMessageBox): Fix a typo
10507     in the docstring
10508    
10509 bh 175 2002-05-15 Bernhard Herzog <[email protected]>
10510    
10511 bh 180 * Thuban/Model/layer.py (Layer.open_shapefile): Set bbox to None
10512     when the shapefile is empty.
10513     (Layer.BoundingBox, Layer.LatLongBoundingBox): Both methods may
10514     now return None for empty shapefiles. Update doc-strings.
10515    
10516     * Thuban/Model/map.py (Map.BoundingBox): Add doc-string. Deal with
10517     the layer's bbox being None.
10518    
10519     * Thuban/UI/tree.py (SessionTreeCtrl.update_tree): Deal with the
10520     layer's bbox being None.
10521    
10522 bh 175 * Thuban/UI/view.py (MapCanvas.shape_selected): Only redraw when
10523     necessary.
10524     (MapCanvas.__init__): New instance variables, last_selected_layer
10525     and last_selected_shape to determine how the selection has
10526     changed.
10527    
10528     * Thuban/UI/tableview.py (TableGrid.__init__): Do not call
10529     AutoSizeColumns because it will cause a traversal of the entire
10530     table which for large .dbf files will take a very long time.
10531    
10532 bh 172 2002-05-14 Bernhard Herzog <[email protected]>
10533    
10534     * Thuban/Model/layer.py (Layer.open_shapefile): Choose a better
10535     maximum depth for the tree than shapelib does by default.
10536    
10537 bh 165 2002-05-10 Bernhard Herzog <[email protected]>
10538    
10539     * setup.py (py_modules): The shptree modules doesn't have a
10540     wrapper, so don't include it in the py_modules
10541    
10542 bh 163 2002-05-08 Bernhard Herzog <[email protected]>
10543    
10544     * extensions/shapelib/shptree.c (compare_ints): Make arguments
10545     const void * as in the qsort prototype
10546     (SHPTreeFindLikelyShapes): Remove some unused variables.
10547    
10548     * Thuban/UI/view.py (PanTool.MouseMove): Use the bitmap the view
10549     maintains to redraw the window during a drag.
10550     (MapCanvas.unprojected_rect_around_point): New method to determine
10551     a small region around a point for hit-testing.
10552     (MapCanvas.find_shape_at): Only test the shapes in a small region
10553     around the point.
10554    
10555     * setup.py: Increment the version to 0.1.2
10556    
10557     * Thuban/UI/tree.py (SessionTreeCtrl.unsubscribe_all): Remove a
10558     debug print and set session to None after unsubscribing
10559    
10560 bh 146 2002-05-07 Bernhard Herzog <[email protected]>
10561    
10562 bh 154 * Data/iceland_sample.session, Data/iceland_sample.thuban: Rename
10563     the file to have a .thuban extension.
10564    
10565 bh 152 * Thuban/UI/tree.py (session_channels): New class constant with
10566     all the session channels to subscribe to to update the tree
10567     (SessionTreeCtrl.session_changed): Remember the session so that we
10568     can unsubscribe properly. Use the new class constant to
10569     unsubscribe from the old session and subscribe to the new one.
10570     (SessionTreeCtrl.unsubscribe_all): New method to unsubscribe all
10571     subscriptions of the SessionTreeCtrl.
10572     (SessionTreeView.OnClose): Call the tree's unsubscribe_all method.
10573    
10574     * Thuban/UI/mainwindow.py (MainWindow.__init__): Add the "Show
10575     Session Tree" command to the file menu.
10576    
10577     * Thuban/UI/view.py (MapCanvas.do_redraw): Pass the entire bitmap
10578     as update_region to the renderer.
10579    
10580     * Thuban/UI/renderer.py
10581     (ScreenRenderer.layer_ids, ScreenRenderer.draw_shape_layer): The
10582     update box is now directly a tuple, not a wxRect anymore.
10583    
10584     * Thuban/Model/layer.py (Layer.ShapesInRegion): Remove some debug
10585     prints.
10586    
10587     2002-05-07 Bernhard Herzog <[email protected]>
10588    
10589 bh 146 * setup.py: Add the shptree extension module. See
10590     extensions/pyshapelib/ChangeLog for more details.
10591    
10592     * extensions/shapelib/shpopen.c, extensions/shapelib/shapefil.h,
10593     extensions/shapelib/dbfopen.c: Really update to the versions of
10594     shapelib 1.2.9. For some reason it wasn't really done on
10595     2002-04-11.
10596    
10597     * extensions/shapelib/shptree.c: Modified version of shptree.c of
10598     shapelib 1.2.9. The only real difference is the use of qsort
10599     instead of a bubble sort implementation
10600    
10601     * Thuban/Model/layer.py (Layer.__init__): New instance variable
10602     shapetree to hold the shapelib quadtree for the shapefile
10603     (Layer.open_shapefile): Create the quad tree.
10604     (Layer.ShapesInRegion): New method to return the ids of shapes in
10605     a given region using the quad tree.
10606    
10607     * extensions/thuban/wxproj.cpp (project_points): Fix some typos in
10608     comment
10609     (draw_polygon_shape): Accept both arcs and polygons.
10610     (initwxproj): Use the new PYSHAPELIB_IMPORT_API macro to import
10611     the api.
10612    
10613     * Thuban/UI/renderer.py (MapRenderer.layer_ids): New method to
10614     return the shape ids to be rendered in a given layer.
10615     (MapRenderer.draw_shape_layer): Call layer_ids to get the list of
10616     ids. Use draw_polygon_shape to draw arc shapes as well.
10617     (ScreenRenderer.RenderMap): New parameter for the rectangle that
10618     has to be updated
10619     (ScreenRenderer.layer_ids): Make use of the layer's quadtree by
10620     calling it's ShapesInRegion method.
10621    
10622     * Thuban/UI/view.py (MapCanvas.__init__): New instance variable
10623     update_region for the update region.
10624     (MapCanvas.OnPaint): Maintain the update region
10625     (MapCanvas.do_redraw): Pass the bounding box of the update_region
10626     to the renderer when drawing the bitmap. Reset the update_region.
10627    
10628 bh 129 2002-05-03 Bernhard Herzog <[email protected]>
10629    
10630 bh 131 * Thuban/UI/mainwindow.py (MainWindow.SaveSessionAs,
10631     MainWindow.OpenSession): Change the file extension of the session
10632     files to .thuban
10633    
10634 bh 129 * Thuban/Model/session.py (Session.AddMap, forwarded_channels):
10635     Move the map channels to be forwarded by the session into the
10636 bh 146 class constant with forwarded_channels. Also add
10637     LAYER_PROJECTION_CHANGED and LAYER_VISIBILITY_CHANGED to
10638     forwarded_channels
10639 bh 129
10640     * Thuban/Model/base.py (Modifiable.changed): Fix doc-string (a
10641     typo and some rewording).
10642    
10643 bh 126 2002-05-02 Bernhard Herzog <[email protected]>
10644    
10645     * Thuban/UI/view.py: Keep the temporary bitmap used during drawing
10646     around to speed up most redraws:
10647     (MapCanvas.__init__): New instance variable bitmap which holds the
10648     bitmap
10649     (MapCanvas.do_redraw): Redraw self.bitmap if necessary. Use
10650     self.bitmap to draw.
10651     (MapCanvas.full_redraw): New method to force a full redraw
10652     including the bitmap
10653     (MapCanvas.SetMap): Subscribe full_redraw instead of redraw to
10654     make sure the bitmap is redrawn.
10655     (MapCanvas.projection_changed, MapCanvas.set_view_transform,
10656     MapCanvas.shape_selected): Call full_redraw instead of readraw to
10657     make sure the bitmap is redrawn.
10658     (MapCanvas.OnSize): New method to handle size events so that the
10659     bitmap can be redrawn.
10660    
10661 bh 124 2002-04-29 Bernhard Herzog <[email protected]>
10662    
10663     * Thuban/UI/mainwindow.py (MainWindow.__init__): Subscribe to the
10664     canvas' VIEW_POSITION event
10665     (MainWindow.view_position_changed): Handler for VIEW_POSITION.
10666     Update the text in the status-bar accordingly.
10667    
10668     * Thuban/UI/view.py (MapCanvas): Derive from Publisher as well
10669     (MapCanvas.__del__): Implement because Publisher.__del__ has to be
10670     called.
10671     (MapCanvas.__init__): Bind EVT_LEAVE_WINDOW too. Initialize
10672     current_position
10673     (MapCanvas.set_current_position): New method to set
10674     current_position. Issue a VIEW_POSITION event
10675     (MapCanvas.CurrentPosition): New public method to return the value
10676     of current_position. Should be called when the VIEW_POSITION event
10677     is processed.
10678     (MapCanvas.OnLeftDown, MapCanvas.OnLeftUp, MapCanvas.OnMotion):
10679     Update the position.
10680     (MapCanvas.OnLeaveWindow): Set the position to None.
10681    
10682     * Thuban/UI/messages.py (VIEW_POSITION): New message for the
10683     position in the statusbar
10684    
10685 tkoester 403 2002-04-26 Frank Koormann <[email protected]>
10686 frank 120
10687     * Thuban/UI/mainwindow.py: AddLayer, Dialog title s/session/data
10688    
10689 tkoester 403 2002-04-24 Frank Koormann <[email protected]>
10690    
10691 frank 118 * Resources/Bitmaps/identify.xpm: shadow added
10692    
10693     * Resources/Bitmaps/fullextent.xpm: new
10694 jan 116
10695 tkoester 403 2002-04-22 Jan-Oliver Wagner <[email protected]>
10696 jan 116
10697 tkoester 403 * Thuban/UI/tree.py (update_tree): added test for None on map bounding
10698     box
10699 jan 114
10700 tkoester 403 2002-04-21 Jan-Oliver Wagner <[email protected]>
10701    
10702 jan 114 * Thuban/UI/proj4dialog.py (UTMProposeZoneDialog): new
10703    
10704     * Thuban/UI/tree.py (update_tree): added added map extent
10705    
10706     * Thuban/UI/mainwindow.py (_method_command): extended by parameter
10707 tkoester 403 icon; added map_full_extend as tool
10708 jan 114
10709 tkoester 403 2002-04-19 Jan-Oliver Wagner <[email protected]>
10710 jan 107
10711     * Thuban/UI/mainwindow.py (SaveSession): launch save as dialog for
10712     saving _new_ sessions
10713    
10714     * Thuban/Model/session.py (create_empty_session): new session
10715     don't have a filename (set to None)
10716    
10717     * Thuban/UI/tree.py (update_tree): added filename and modified flag
10718    
10719     * Thuban/Model/load.py (ProcessSession): convert projection
10720     parameters from unicode to regular string
10721    
10722     * Data/iceland_sample.session: Added UTM Zone 26 projection.
10723    
10724 bh 100 2002-04-11 Bernhard Herzog <[email protected]>
10725    
10726     * extensions/shapelib/shapefil.h, extensions/shapelib/shpopen.c,
10727     extensions/shapelib/dbfopen.c: Update to the versions of shapelib
10728     1.2.9
10729    
10730     * setup.py (Lib.wxproj extension): Don't link shpopen.c and put
10731     the pyshapelib directoy into the list of include dirs, so that
10732     pyshapelib_api.h can be found.
10733    
10734     * extensions/thuban/wxproj.cpp (pyshapelib_api): New variable that
10735     holds the pyshapelib C-API
10736     (draw_polygon_shape, point_in_polygon_shape, shape_centroid): Use
10737     pyshapelib_api to access the shapelib functions.
10738     (initwxproj): Import the c_api from the shapelib module and
10739     initialize pyshapelib_api.
10740    
10741 bh 89 2002-04-04 Bernhard Herzog <[email protected]>
10742    
10743 bh 91 * setup.py (thuban_bdist_rpm.initialize_options): Use
10744     initialize_options to create the scripts for the rpm.
10745    
10746 bh 89 * extensions/pyprojection/setup.py (PROJ4_PREFIX): Just use /
10747    
10748 bh 85 2002-04-03 Bernhard Herzog <[email protected]>
10749    
10750 bh 87 * setup.py: Increment version to 0.1.1
10751    
10752 bh 85 * Thuban/UI/mainwindow.py (MainWindow.__init__): Move the "Add
10753     Layer" and "Remove Layer" commands from the layer menu to the map
10754     menu
10755    
10756 bh 83 2002-02-15 Bernhard Herzog <[email protected]>
10757    
10758     * Thuban/Model/layer.py (Layer.Shape): list append only takes one
10759     argument (python <= 1.5.2 erroneously accepted multiuple
10760     arguments)
10761    
10762 bh 81 2002-02-04 Bernhard Herzog <[email protected]>
10763    
10764     * Thuban/UI/identifyview.py (IdentifyGridCtrl): New class to use a
10765     RecordGrid in the identifyview.
10766     (IdentifyView.__init__): Use IdentifyGridCtrl instead of
10767     IdentifyListCtrl. The grid allows editing of the values.
10768    
10769     * Thuban/UI/controls.py (RecordTable, RecordGridCtrl): New classes
10770     implementing a grid for a single row of a thuban table.
10771    
10772     * Thuban/UI/view.py (MapCanvas.SelectShapeAt): Search through all
10773     layers by default. Easier to use than the previous default of only
10774     searching through the select layer which meant that if no layer
10775     was selected, you couldn't select a shape.
10776    
10777     * Thuban/UI/tableview.py (TableGrid.__init__): Fix typo
10778    
10779     * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Honour the
10780     stroke_width attribute
10781    
10782     * Thuban/Model/save.py (save_session): Write the new stroke_width
10783     attribute
10784    
10785     * Thuban/Model/load.py (ProcessSession.startElement): Read the
10786     stroke_width attribute
10787    
10788     * Thuban/Model/layer.py (Layer.__init__): New parameter and
10789     instance variable stroke_width
10790     (Layer.SetStrokeWidth): Set the stroke_width.
10791    
10792 bh 72 2002-02-01 Bernhard Herzog <[email protected]>
10793    
10794     * extensions/thuban/wxproj.cpp (project_points): Fix two
10795     off-by-one errors in the last loop that joins the various parts
10796     together.
10797    
10798 bh 71 2002-01-14 Bernhard Herzog <[email protected]>
10799    
10800     * setup.py (data_dist.make_distribution): Fix some typos
10801    
10802 bh 70 2001-09-18 Bernhard Herzog <[email protected]>
10803    
10804     * README: Slight tweaking in preparation for the 0.1 release
10805    
10806     * setup.cfg: Add section for sdist to create both tgz and zip
10807     archives
10808    
10809     * setup.py: increase version number to 0.1
10810     (data_dist): New command class for data distribution
10811    
10812 bh 64 2001-09-14 Bernhard Herzog <[email protected]>
10813    
10814 bh 70 * Thuban/UI/identifyview.py (IdentifyListCtrl.selected_shape):
10815     Handle the case of no layer (i.e. layer is None) properly.
10816    
10817 tkoester 403 * Thuban/UI/proj4dialog.py (UTMDialog.__init__, Proj4Dialog.__init__):
10818 bh 70 Set the initial selection of the combo boxes to reflect the
10819     projection we're starting with in a way that works on windows,
10820     too.
10821    
10822 bh 64 * Thuban/Lib/connector.py (Connector.print_connections): Print the
10823     puiblisher's ids in hex to make it easier to compare them to the
10824     standard repr of python methods
10825    
10826     * Thuban/Model/map.py (Map.Destroy): Unsubscribe the label_layer
10827     messages
10828    
10829 bh 59 2001-09-13 Bernhard Herzog <[email protected]>
10830    
10831 bh 64 * Thuban/UI/tree.py (SessionTreeCtrl.OnSelChanged): Make sure to
10832     deselect the layer if no layer is selected
10833    
10834 bh 59 * Thuban/UI/view.py (MapCanvas.OnPaint): Only delay drawing to
10835     idle time when there actually is something to draw. If there's
10836     nothing to draw simply clear the window
10837     (MapCanvas.do_redraw): Call dc.EndDrawing and add some comments.
10838     (MapCanvas.SetMap): force a redraw in all cases because
10839     FitMapToWindow doesn't always do it.
10840     (MapCanvas.ZoomFactor): Add an optional parameter, center, to
10841     specify the point to move into the center of the window
10842     (ZoomOutTool.MouseUp, ZoomInTool.MouseUp): If the mouse wasn't
10843     dragged, zoon in/out by a factor of 2
10844 bh 64 (MapCanvas.find_shape_at): Iterate backwards (i.e. with decreasing
10845     index, i.e. reversed drawing order) so that objects appearing to
10846     be in from of others are selected first. This is probably mostly
10847     relevant for point shapes where the symbols used may overlap
10848 bh 59
10849     * Thuban/Model/session.py (create_empty_session): Unset the
10850     modified bit before returning it
10851    
10852     * Thuban/UI/mainwindow.py (MainWindow.NewSession): Use
10853     create_empty_session session to create the new, empty session.
10854    
10855     * Thuban/UI/mainwindow.py (MainWindow.__init__): Set the size of
10856     the tool bitmaps.
10857     (MainWindow.OnClose, MainWindow.save_modified_session): Separate
10858     the code that asks whether the session should be saved into the
10859     new method save_modified_session.
10860     (MainWindow.OpenSession, MainWindow.NewSession): Use the new
10861     method to save modified session here too.
10862    
10863 bh 55 2001-09-11 Bernhard Herzog <[email protected]>
10864    
10865     * setup.py (InnoIconItem): fix typo
10866    
10867     (thuban_bdist_inno.run):
10868     (bdist_inno.run): Move the decision not to create symlinks on
10869     non-nt platforms to thuban_bdist_inno and do it unconditinally
10870     since we never want to create the symlinks here
10871    
10872 bh 48 2001-09-10 Bernhard Herzog <[email protected]>
10873    
10874 bh 53 * Thuban/UI/mainwindow.py (MainWindow.IdentifyTool): Popup the
10875     identify view immediately
10876    
10877     * Thuban/UI/controls.py: New file with two classes RecordListCtrl
10878     and SelectableRecordListCtrl that implement the code shared by the
10879     identify view and the label dialog
10880    
10881     * Thuban/UI/identifyview.py (IdentifyListCtrl): Derive from the
10882     new class RecordListCtrl
10883    
10884     * Thuban/UI/labeldialog.py (LabelDialog.OnOK): Check whether the
10885     return value of GetValue is None instead of using it as a boolean
10886     directly so that Zero numbers are handled properly.
10887     (LabelListCtrl): Derive from the new class
10888     SelectableRecordListCtrl
10889    
10890 bh 48 * Thuban/UI/proj4dialog.py (Proj4Dialog.__init__):
10891     (Proj4Dialog.dialogLayout): Make the window resizable and set the
10892     size of the text control explicitly to make the sizers work on
10893     both Windows and X.
10894    
10895 bh 44 2001-09-07 Bernhard Herzog <[email protected]>
10896    
10897     * Thuban/UI/view.py (MapCanvas.find_shape_at):Add a new parameter
10898     that can limit the search to the currently selected layer.
10899     (MapCanvas.SelectShapeAt): Make sure that the currently selected
10900     layer stays selected even when no shape is found
10901 bh 46 (MapCanvas.FitRectToWindow): If the rect has zero with or zero
10902     height do nothing (avoids zero division errors)
10903 bh 44
10904 bh 32 2001-09-06 Bernhard Herzog <[email protected]>
10905    
10906 bh 42 * Thuban/UI/tree.py (SessionTreeCtrl, SessionTreeView.__init__):
10907     Correct the spelling of SessionTreeCtrl. dabbrev is too damn
10908     convenient :-)
10909     (SessionTreeCtrl.__init__, SessionTreeCtrl.update_tree): Introduce
10910     a new instvar layer_to_item to map layers to tree items
10911     (SessionTreeCtrl.layer_selected): Select the appropriate tree item
10912     to match the current selection in the interactor
10913    
10914 bh 40 * Thuban/UI/interactor.py (Interactor.SelectedLayer):
10915     (Interactor.HasSelectedLayer): New methods to query the current
10916     selection
10917    
10918     * Thuban/UI/mainwindow.py (MainWindow.current_layer):
10919     (MainWindow.has_selected_layer): Simply call the appropriate
10920     interactor method
10921    
10922     * Thuban/UI/mainwindow.py (MainWindow.__init__):
10923     (MainWindow.LayerShowTable):
10924     (MainWindow.identify_view_on_demand): Store the interactor in an
10925     instvar and use that reference instead of going through main.app
10926    
10927 tkoester 403 * Thuban/UI/mainwindow.py (MainWindow.ShowSessionTree):
10928     * Thuban/UI/application.py (ThubanApplication.OnInit):
10929 bh 40 * Thuban/UI/main.py (main): Create the session tree view in main
10930     with the new mainwindow method ShowSessionTree and not directly
10931     the application's OnInit method
10932    
10933     * Thuban/UI/tree.py (myTreeCtrlPanel):
10934     (SessioinTreeCtrl): Rename to SessioinTreeCtrl and turn it into a
10935     TreeCtrl isntead of a panel. This affects most method since we now
10936     refer to self instead of self.tree
10937     (SessionTreeView): New class implementing a non-modal dialog
10938     showing the session tree.
10939    
10940 bh 35 * Thuban/UI/mainwindow.py (MainWindow.LayerShowTable): Pass the
10941     layer to the tableview dialog.
10942    
10943     * Thuban/UI/tableview.py: Add some doc-strings
10944 tkoester 403 (TableGrid):
10945 bh 35 (TableGrid.OnRangeSelect):
10946     (TableGrid.OnSelectCell):
10947     (TableFrame.__init__):
10948     (TableFrame.row_selected):
10949     Selecting rows in the grid view now updates the selected shapes
10950     through the TableFrame. To achieve this we derive TableGrid from
10951     Publisher and introduce the message type ROW_SELECTED which the
10952     TableFrame subscribes to and which is issued by OnRangeSelect and
10953     OnSelectCell
10954    
10955     (DataTable.SelectRow): Removed because it's no longer needed in
10956     the row/shape selection scheme
10957    
10958 bh 32 * Thuban/UI/dialogs.py: New file implementing common classes for
10959     dialogs
10960    
10961     * Thuban/UI/tableview.py (TableGrid.__init__): Don't subscribe to
10962     the SELECTED_SHAPE message anymore. This is now handled by the
10963     parent.
10964     (TableGrid.select_shape): Only update the selection if the shape
10965     is not None.
10966     (TableFrame): Inherit from the new NonModalDialog class.
10967     (TableFrame.__init__, TableFrame.select_shape): Handle the
10968     SELECT_SHAPE message.
10969     (TableFrame.OnClose): Extend the inherited method to unsubscribe
10970     SELECT_SHAPE
10971    
10972     * Thuban/UI/mainwindow.py (MainWindow.init_dialogs):
10973     (MainWindow.add_dialog):
10974     (MainWindow.dialog_open):
10975     (MainWindow.remove_dialog):
10976     (MainWindow.get_open_dialog): New methods to maintain a dictionary
10977     of opened non-modal dialogs.
10978    
10979     (MainWindow.__init__): Initialize the new non-modal dictionary
10980     management code
10981     (MainWindow.LayerShowTable): maintain separate dialogs for each
10982     table using the non-modal dialog management code to only open a
10983     view once for each table.
10984    
10985     (MainWindow.IdentifyTool):
10986     (MainWindow.__init__):
10987     (MainWindow.identify_view_on_demand): Don't open the identify view
10988     in IdentifyTool anymore. This will be done automatically by the
10989     new method identify_view_on_demand which handles the
10990     SELECTED_SHAPE message so that the identify view will be opened on
10991     demand
10992    
10993     * Thuban/UI/identifyview.py (IdentifyListCtrl.__init__): Remove
10994     the interactor argument. The SELECTED_SHAPE message is now handled
10995     by the parent.
10996     (IdentifyView.__init__): Add the interactor argument so that we
10997     can handle the SELECTED_SHAPE message here
10998     (IdentifyView.selected_shape): New method to handle the
10999     SELECTED_SHAPE messages
11000    
11001     * Thuban/UI/identifyview.py (IdentifyView): Derive from the new
11002     NonModalDialog class
11003     (IdentifyView.OnClose): Extend the inherited version to
11004     unsubscribe SELECT_SHAPE
11005    
11006     * Thuban/Model/session.py (Session.UnsetModified): Remove debug prints
11007    
11008 bh 26 2001-09-05 Bernhard Herzog <[email protected]>
11009    
11010     * Thuban/UI/view.py (MapCanvas.__init__): New argument, interactor.
11011 tkoester 403
11012 bh 26 * Thuban/UI/mainwindow.py (MainWindow.__init__): New argument
11013     interactor to pass through to the MapCanvas
11014 tkoester 403
11015 bh 26 * Thuban/UI/application.py (ThubanApplication.OnInit): Use the new
11016     argument to the MainWindow constructor to get rid of the ugly hack
11017     that made main.app available early just so that the mapcanvas
11018     could access the interactor object.
11019    
11020 bh 19 2001-09-04 Bernhard Herzog <[email protected]>
11021    
11022 bh 22 * Thuban/UI/mainwindow.py (MainWindow.RunMessageBox): New method
11023     that runs a modal message box
11024     (MainWindow.OnClose): Use the new method
11025     (MainWindow.RemoveLayer): Just do nothing in case no layer is
11026     selected. The command should be grayed out anyway, so there's no
11027     need to pop up a message box.
11028     (MainWindow.AddLayer): Pop up a message box with an error message
11029     if the shape file can't be opened
11030    
11031     * Thuban/Model/layer.py (Layer.__init__): Open the shapefile
11032     immediately. This will cause an exception in case the file can't
11033     be opened and we can display an appropriate message.
11034    
11035 bh 19 * MANIFEST.in: Add extensions/pyprojection/LICENSE
11036    
11037     * setup.py (thuban_bdist_rpm): New class implementing a Thuban
11038     specific bdist_rpm command.
11039    
11040     * Thuban/UI/main.py: Catch ImportError exceptions when importing
11041     the locale module because it may not be available on some
11042     installations.
11043    
11044     * extensions/pyprojection/LICENSE: Copy of the license text in
11045     Projection.i. Having it in a separate file makes it easier to
11046     refer to license text in e.g. RPMs
11047    
11048 bh 18 2001-09-03 Bernhard Herzog <[email protected]>
11049    
11050 bh 19 * setup.py: use wx-config instead of wxgtk-config because it's
11051     more generic
11052    
11053     * setup.py (ThubanInstall.get_outputs): Add the symlink in
11054     <prefix>/bin to the outputs
11055     (ThubanInstall.link_file): New method to link files. We need this
11056     because the standard copy_files refuses to link non-existing
11057     files.
11058     (ThubanInstall.run): Remove the leading install root from the
11059     script filename if an install root was specified and use the new
11060     link_file method
11061 tkoester 403
11062 bh 18 * Thuban/UI/mainwindow.py (MainWindow.AddLayer): Fit the map to
11063     the window when the first layer is added to the map.
11064    
11065     * setup.py (ThubanInstall.run): Honor the build root (self.root)
11066     when linking thuban.py to <prefix>/bin
11067    
11068 bh 16 2001-08-31 Bernhard Herzog <[email protected]>
11069    
11070     * setup.py: In the setup call, the install parameters shouldn't
11071     have trailing slashes because distutils on non-posix platforms
11072     doesn't like that. The same applies to other directories like
11073     "Resources/Bitmaps"
11074    
11075     In the configuration section for nt, move the wxWindows directory
11076     optins into the part clearly marked as editable.
11077    
11078     (InstallLocal.initialize_options):
11079     (InstallLocal.user_options): remove the currently unused debug
11080     flag
11081     (thuban_build_py.find_all_modules): Add this method so that it
11082     works for our case of having packages and modules in one
11083     distribution as well.
11084     (ThubanInstall.initialize_options):
11085     (ThubanInstall.finalize_options):
11086     (ThubanInstall.user_options):
11087     (ThubanInstall.boolean_options): Add new options, do-symlink and
11088     extra files. Since these are the first ThubanInstall specific
11089     options, override user_options and boolean_options
11090     (ThubanInstall.run): Honor the new do-symlink and extra-files
11091     options.
11092     (ThubanInstall.get_outputs): Add to override the base-class's
11093     version and add the extra-files to the outputs
11094     (bdist_inno): New class for windows distributions with Inno Setup
11095     (InnoIconItem): Helper class for bdist_inno
11096     (thuban_bdist_inno): Thuban specific version of bdist_inno. Added
11097     this together with the appropriate parameters, to the setup call.
11098 tkoester 403
11099 bh 16 * setup.cfg (bdist_inno): added new section for the inno setup
11100     installer
11101    
11102     * Thuban/UI/tree.py (myTreeCtrlPanel.__init__): New inst var
11103     changing_selection to avoid recursive selection events when
11104     modifying the selection in response to a selection event.
11105     (myTreeCtrlPanel.normalize_selection): Set the new inst var when
11106     changing the tree's selection.
11107     (myTreeCtrlPanel.OnSelChanged): Only normalize the selection when
11108     we're not being called indirectly from normalize_selection.
11109    
11110     * Thuban/UI/mainwindow.py (MainWindow.update_command_ui): Call
11111     event.Check only if the command is actuall checkable.
11112     (MainWindow.__init__): Call the toolbar's Realize method to make
11113     sure that the items are actually shown
11114    
11115 bh 7 2001-08-28 Bernhard Herzog <[email protected]>
11116    
11117 bh 9 * setup.py: Fix some doc strings
11118    
11119 bh 7 * ChangeLog: started
11120    

Properties

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

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26