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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 2511 - (hide annotations)
Mon Dec 27 16:31:32 2004 UTC (20 years, 2 months ago) by russell
Original Path: trunk/thuban/ChangeLog
File size: 426163 byte(s)
The middle button now pans the map view.

1 russell 2511 2004-12-27 Russell Nelson <[email protected]>
2    
3     * Middle button pans
4    
5 jan 2509 2004-12-27 Jan-Oliver Wagner <[email protected]>
6    
7     * Doc/manual/thuban-manual-de.xml: More translations.
8    
9 jan 2506 2004-12-23 Jan-Oliver Wagner <[email protected]>
10    
11     * Thuban/UI/projdialog.py (ProjFrame.load_user_proj): Added a
12     \n to stderr after the warnings. Thanks to Russell Nelson.
13    
14 nhueffme 2493 2004-12-20 Nina Hueffmeyer <[email protected]>
15    
16     * Extensions/ogr/ogrshapes.py: Fixed some issues from
17     Bernhard (coding guidelines etc.). Additionally it is now possible to
18     display shapefiles containing feature collections (e.g.polygons
19     with holes). Works with gdal 1.2.1 now.
20    
21     * Extensions/ogr/test/test_OGRShapestore.py: Fixed some issues
22     from Bernhard (coding guidelines etc.). If ogr can't be imported,
23     tests are skipped now.
24    
25     * Extensions/ogr/ogrstart.py: Fixed some typings.
26    
27 bernhard 2490 2004-12-20 Bernhard Reiter <[email protected]>
28    
29     * Extensions/svgexport/TODO: updated to add support for
30     raster layers and labels for 1.0.1.
31    
32     * Extensions/svgexport/svgmapwriter.py (draw_raster_layer):
33     Issue a warning now.
34    
35 bernhard 2488 2004-12-19 Bernhard Reiter <[email protected]>
36    
37 bernhard 2489 * Extensions/svgexport/TODO: Added idea to support triggering
38     the application down the pipe.
39    
40     2004-12-19 Bernhard Reiter <[email protected]>
41    
42 bernhard 2488 svgexport: Improved code quality, mainly by better naming.
43    
44     * Extensions/svgexport/svgmapwriter.py:
45     DrawPath() renamed to DrawPolygonPath(),
46     added documentation, improved comments and variable names.
47    
48     * Extensions/svgexport/svgmapwriter.py,
49     Extensions/svgexport/test/test_svgmapwriter.py:
50     All using DrawPolygonPath() now, the default parameter closed=True
51     omitted.
52    
53     * Extensions/svgexport/test/test_svgmapwriter.py:
54     renamed test_polygon_opened() to test_polyline()
55     renamed test_transparent_polygon() to test_transparent_polyline()
56    
57 jan 2487 2004-12-18 Jan-Oliver Wagner <[email protected]>
58    
59     Some fixes of gns2shp extension.
60    
61     * Extensions/gns2shp/test/__init__.py: New. Make this directory a
62     package.
63    
64     * Extensions/gns2shp/test/test_gns2shp.py: Add some import paths
65     dynamically.
66    
67     * Extensions/gns2shp/test/README: Simplified description how to test.
68    
69     * Extensions/gns2shp/gns2shp.py (gns2shp): Fixed doc-string,
70     fixed some dimensions of fields according to the GNS documentation
71     which seems to change undocumented.
72     Now killing trailing \n and/or \r from MODIFY_DATE.
73     This fixes RT#2453.
74    
75 bernhard 2479 2004-12-18 Bernhard Reiter <[email protected]>
76 bernhard 2480
77 bernhard 2482 svgexport 1.0.0: Treats holes and islands nicely. Documentation added.
78    
79     * Extensions/svgexport/test/test_svgmapwriter.py:
80     Added new tests: test_export_polygon_with_hole()
81     and test_polygon_with_hole().
82    
83     * Extensions/svgexport/svgmapwriter.py
84     (draw_polygon_shape()): Uses DrawPath correctly now.
85    
86     * Doc/manual/thuban-manual.xml: Added documentation for stable
87     extention svgexport.
88     * Doc/manual/thuban-manual-de.xml: Copied English section about
89     svexport over.
90    
91 jan 2509 * Extensions/svgexport/__init__.py: Bumped version number to 1.0.0.
92 bernhard 2482
93     * Extensions/svgexport/svgsaver.py,maplegend.py:
94     Moved from experimental to stable extension menu.
95    
96     * Extensions/svgexport/TODO: updated.
97    
98    
99     2004-12-18 Bernhard Reiter <[email protected]>
100    
101 bernhard 2481 Added Extensions/svgexport/TODO
102    
103     2004-12-18 Bernhard Reiter <[email protected]>
104    
105 bernhard 2480 Refactored in svgexport:
106     DrawPath replaces DrawPolygon; added newline in front of "M" in paths.
107    
108     * Extensions/svgexport/svgmapwriter.py
109     Added verbosity level 3 to print out polygon points.
110     (class Point): added __repr__
111     (class Brush, __str__()): Added space after ,.
112     (DrawPolygon): Renamed to DrawPath()
113     (DrawPath): Takes list of polygons as input now, adds \n before "M"s.
114     (DrawLines): Using DrawPath now.
115    
116     * Extensions/svgexport/test/test_svgmapwriter.py:
117     Replaced DrawPolygon() calls with DrawPath() and put the first argument
118     inside another list. Adapted test data with a newline before "M".
119    
120     2004-12-18 Bernhard Reiter <[email protected]>
121 bernhard 2479
122     Refactored svgexport tests: 9 double tests runs eliminated;
123     code size reduced by 8 lines.
124    
125     * Extensions/svgexport/test/test_svgmapwriter.py:
126     (class TestWithDC): Renamed to BaseTestWithDC, moved to top.
127     (class BaseWithDCtools): New, subclass from BaseTestWithDC.
128     (class TestDrawSplines): now subclass from BaseTestWithDCtools,
129     this fixed the double running of the nine tests of TestVirtualDC.
130     (class TestVirtualDC): Using self.dc and self.file from setUp().
131    
132 bh 2478 2004-12-17 Bernhard Herzog <[email protected]>
133    
134     Two windows specific fixes ported from thuban-1­0-branch:
135    
136     * Thuban/UI/about.py (unicodeToLocale): Use getdefaultlocale
137     instead of getlocale because getlocale doesn't return a usable
138     encoding name on a german windows 2000
139    
140     * setup.py: windows build: Removed the absolute path names and
141     made all prfixes relative to the directory containing setup.py.
142     Makes it a little easier to adapt to a different system.
143    
144 bh 2470 2004-12-16 Bernhard Herzog <[email protected]>
145    
146 bernhard 2479 Add support for PostGIS tables with LINESTRING geometries.
147 bh 2472 Fixes RT#2299
148    
149     * Thuban/Model/postgisdb.py (shapetype_map): Add LINESTRING
150    
151     * test/postgissupport.py
152     (PostgreSQLServer.get_default_static_data_db): Rename the "roads"
153     table to "roads-multi" because it now uses MULTILINESTRING
154     geometries and introduce a new "roads" table that uses LINESTRING
155     (coords_to_multilinestring): Make the doc string more precise
156     (coords_to_linestring): New. Create a LINESTRING WKT
157     representatin
158     (wkt_converter): Add coords_to_linestring
159     (upload_shapefile): Rephrase the doc-string a bit.
160    
161     * test/test_postgis_db.py (TestPostGISShapestoreArc)
162     (LineStringTests)
163     (TestPostGISShapestoreLineString)
164     (TestPostGISShapestoreMultiLineString): Split
165     TestPostGISShapestoreArc into a base class LineStringTests and two
166     derived classes TestPostGISShapestoreLineString for LINESTRING
167     geometries and TestPostGISShapestoreMultiLineString for
168     MULTILINESTRING geometries. Most test methods are in the base
169     class with the exception of tests that explicitly check the raw
170     format.
171    
172     2004-12-16 Bernhard Herzog <[email protected]>
173    
174 bh 2471 Make the test suite work with PostGIS 0.8.2 and PostgreSQL 7.4
175    
176     * test/postgissupport.py (find_postgis_sql): Different postgis
177     versions put the postgis.sql file into slightly different places
178     so we have to look in both. The updated doc string describes this
179     is more detail.
180    
181     * test/test_postgis_db.py
182     (TestPostGISSpecialCases.test_column_name_quoting): The return
183     value of UniqueValues is unsorted, so it has to be sorted for
184     comparison.
185    
186     2004-12-16 Bernhard Herzog <[email protected]>
187    
188 bh 2470 Fix for RT#2237
189    
190     * Thuban/UI/projdialog.py (ProjFrame._show_proj_panel): If the
191     panel to be shown is the UnknownProjPanel disable the OK and Try
192     buttons. Otherwise enable them.
193     (ProjFrame.__GetProjection): The UnknownProjPanel returns None for
194     the parameters. In that case __GetProjection also returns None
195     now.
196    
197 bh 2459 2004-12-15 Bernhard Herzog <[email protected]>
198    
199 bh 2462 * Thuban/UI/classgen.py (GenQuantilesPanel.__init__): Set the
200     minimum number of classes to 2. The calculate_quantiles needs at
201     least two and raises an exception otherwise.
202     Fixes RT#2549
203    
204     2004-12-15 Bernhard Herzog <[email protected]>
205    
206 bh 2460 * test/postgissupport.py (PostgreSQLServer.execute_sql): Extend to
207     so that it returns a result for select statements.
208     (PostgreSQLServer.server_version): New. Return the version of the
209     server software.
210     (PostgreSQLServer.require_authentication): The format of
211     pg_hba.conf has changed between PostgrSQL 7.2 and 7.3. Check the
212     server version and generate the file in the correct format
213    
214     2004-12-15 Bernhard Herzog <[email protected]>
215    
216 bh 2459 * test/postgissupport.py (PostgreSQLServer.is_running): Fix typo
217     in the doc string and rephrase it a little.
218    
219 frank 2457 2004-12-15 Frank Koormann <[email protected]>
220    
221     * test/test_load.py (TestAltPath.checkSession): New, extended checks if
222     session has been loaded successfully. The check is called by the relevant
223     tests after executing load_session().
224    
225 bh 2450 2004-12-13 Bernhard Herzog <[email protected]>
226    
227 bh 2454 Make sure the region used to determine which shapes are visible
228     actually matches the region on the printed page. If this isn't
229     done properly some shapes might not be printed.
230     Fixes RT #2692
231    
232     * Thuban/UI/view.py (MapPrintout.draw_on_dc): The region for the
233     renderer has to be at the same position as the mapregion
234    
235     * Thuban/UI/renderer.py (ExportRenderer.RenderMap): self.region
236     has to be moved by (self.shiftx, self.shifty) too.
237    
238     2004-12-13 Bernhard Herzog <[email protected]>
239    
240 bh 2452 * libraries/pyprojection/Projection.i: Work around a bug in the
241     generated python code which leads to exception in the __del__
242     method when the constructor fails. See the comments in the code
243     for more details.
244    
245     * libraries/pyprojection/Projection.py: Updated from Projection.i
246     with SWIG.
247    
248     2004-12-13 Bernhard Herzog <[email protected]>
249    
250 bh 2451 * test/test_load.py (TestAltPath.test_01_single_path_error_fix)
251     (TestAltPath.test_02_path_error_fix_from_list)
252     (TestAltPath.test_05_path_error_fix_from_list_changed)
253     (TestAltPath.test_06_path_error_fix_from_list_fails): self.session
254     is destroyed in tearDown, so there's no need to do it in a test
255     case.
256    
257     * Thuban/Model/load.py (SessionLoader.open_shapefile): Remove a
258     debug print
259    
260     2004-12-13 Bernhard Herzog <[email protected]>
261    
262 bh 2450 * Extensions/svgexport/test/test_svgmapwriter.py
263     (TestDrawSplines.setUp): Do not use super with the unittest
264     classes because in Python 2.2 they're still old-style classes.
265    
266 frank 2448 2004-12-13 Frank Koormann <[email protected]>
267    
268     Alternative Path feature: When loading a (moved) session where
269     shapefiles cannot be found, ask the user. Use the specified path
270     if further shapefiles are missing. However, ask the usr for confirmation
271     in such cases.
272    
273     * test/test_load.py (TestAltPath): New, tests for alternative path feature
274     in load_session()
275     (Shapefile_CallBack): Helper, implements controllable callback.
276    
277     * Thuban/UI/application.py (ThubanApplication.OnInit):
278     Added "alt_path" to self.path
279     (ThubanApplication.OpenSession): Added shapefile_callback as second
280     callback similar to db_connection_callback.
281     (ThubanApplication.run_alt_path_dialog): New, implementaion of
282     shapefile_callback. In addition to raising the dialog the control of
283     self.path('alt_path') is implemented here.
284    
285     * Thuban/Model/load.py (SessionLoader.__init__): Added shapefile_callback.
286     (SessionLoader.open_shapefile): Open shapefile, eventually with
287     alternative path. This wrapps the "theSession.OpenShapefile(filename)"
288     formerly used in start_fileshapesource()/start_layer().
289     (SessionLoader.start_fileshapesource): Call open_shapefile().
290     (SessionLoader.start_layer): Call open_shapefile().
291     (load_session): Added shapefile_callback.
292    
293     * Thuban/UI/altpathdialog.py: New, implements dialogs for alternative path
294     feature (search / check).
295    
296     * Doc/manual/thuban-manual.xml: Added documentation of new feature.
297    
298 bernhard 2443 2004-12-11 Bernhard Reiter <[email protected]>
299    
300 bernhard 2445 svgexport 0.9.2: Point size supports for maps.
301    
302     * Extensions/svgexport/svgmapwriter.py: Added import of SHAPETYPE_POINT
303     (def draw_point_shape): new parameter size defaults to 2 as before.
304     (draw_shape_layer_incrementally): Moved draw_func log line higher.
305     Added draw_func call with size when dealing with a point layer.
306    
307     * Extensions/svgexport/__init__.py: bumped version to 0.9.2.
308    
309     2004-12-11 Bernhard Reiter <[email protected]>
310    
311 bernhard 2444 Made sure that newlines are inserted in the svg path d attributes
312     to raise the chance that the line length will be below 255 characters,
313     as recommended by REC SVG 1.1 in section 8.3.1.
314    
315     * Extensions/svgexport/svgmapwriter.py(DrawPolygon):
316     Adding \n before L's and changed whitespace handling.
317    
318     * Extensions/svgexport/test/test_svgmapwriter.py:
319     Adapted tests to new whitespace handling of DrawPolygon.
320    
321     2004-12-11 Bernhard Reiter <[email protected]>
322    
323 bernhard 2443 * Doc/technotes/coding_guidelines.txt: easy typo fixed.
324    
325     * Extensions/svgexport/test/test_svgmapwriter.py:
326     Removed test_drawbezier in favour of new test_drawspline3 and
327     test_drawspline4 within new class TestDrawSplines(TestVirtualDC).
328     All only to test DrawSpline.
329    
330     * Extensions/svgexport/svgmapwriter.py(DrawSpline):
331     New implementation now really using the strange algorithm of
332     xfig 3.1's approximated splines and its conversion to postscript
333     with one twist: SVG can do quadratic beziers, so skipped translation
334     to cubic beziers.
335     (TestWithDC): Typo in comment fixed.
336    
337 joey 2442 2004-12-09 Martin Schulze <[email protected]>
338    
339     * Thuban/Model/classgen.py: Added missing character encoding
340    
341     * Extensions/wms/properties.py (OpenWMSProperties): removed
342    
343     * Extensions/wms/parser.py (WMSCapabilitiesParser.error): Dropped
344     support for get_srs_discrepancies() since there are no
345     discrepancies anymore (was a thinko)
346    
347     * Extensions/wms/layer.py (WMSLayer.GetMapImg): Improved graphic
348     format priority now that more formats are supported globally by
349     the render engine.
350    
351 silke 2437 2004-12-08 Silke Reimer <[email protected]>
352     * Extensions/ogr/ogrshapes.py: Substituted ogr-method CloseRings
353     because it is not available in all versions of ogr
354    
355 bernhard 2436 2004-12-08 Bernhard Reiter <[email protected]>
356     * Extensions/ogr/__init__.py: Added empty __init__.py to heal
357     global tests until a real one is commited.
358    
359 nhueffme 2435 2004-12-07 Nina Hüffmeyer <[email protected]>
360    
361     * /Extensions/ogr/: Adding a new extension to read shapefiles with
362     ogr. It is planned to add other vector formats.
363    
364     * /test/runtests.py: Adding tests from /Extensions/ogr/test/.
365    
366 jan 2434 2004-12-07 Jan-Oliver Wagner <[email protected]>
367    
368     * /Extensions/svgexport/test/test_svgmapwriter.py: Reverting
369     part of a (non-)fix to renable that the tests are always
370     executed.
371    
372 bernhard 2432 2004-12-07 Bernhard Reiter <[email protected]>
373    
374     * Extensions/svgexport/test/test_svgmapwriter.py:
375     Added test_drawbezier() to test DrawSpline().
376    
377     * Extensions/svgexport/svgmapwriter.py(DrawSpline):
378     Really implemented bezier drawing.
379    
380     * Extensions/svgexport/__init__.py: Bumped version of svgexport
381     to 0.9.1 because now the legend examples lines styles
382     will be drawing with beziers.
383    
384 joey 2431 2004-12-05 Martin Schulze <[email protected]>
385    
386     * Thuban/UI/renderer.py (raster_format_map): Added PNG, TIFF and
387     GIF as supported bitmap image formats (helpful for the WMS extension)
388    
389 joey 2430 2004-11-30 Martin Schulze <[email protected]>
390    
391     * Extensions/wms/test/test_ogclib.py (TestOGCLib.test_compareURLs):
392     Improved the test for the internal compare method
393    
394 jan 2429 2004-11-27 Jan-Oliver Wagner <[email protected]>
395    
396     * Thuban/UI/about.py (About.__init__): Added
397     Norbert Solymosi for hungarian translation and Ole Rahn
398     as contrbutor. Moved Bernhard Reiter from Contributor
399     to Developer.
400    
401 bernhard 2425 2004-11-27 Bernhard Reiter <[email protected]>
402    
403     * Extensions/svgexport/test/test_svgmapwriter.py:
404     Removed Jan from author list as he did not change enough significant
405     lines yet.
406    
407     * Extensions/svgexport/__init__.py: Added Bernhard as author
408     of the Extension.
409    
410 jan 2422 2004-11-27 Jan-Oliver Wagner <[email protected]>
411    
412     * po/hu.po: New. Hungarian translation. Contributed
413     by Norbert Solymosi.
414    
415 bh 2419 2004-11-26 Bernhard Herzog <[email protected]>
416    
417     * Extensions/svgexport/test/test_svgmapwriter.py
418     (Testobjectexport.test_transparent_polygon): Commented out some
419     debug prints
420    
421 jan 2418 2004-11-24 Jan-Oliver Wagner <[email protected]>
422    
423     Fix broken tests for svg extension and added svg legend
424     to Experimental menu.
425    
426     * Extensions/svgexport/test/test_svgmapwriter.py: Fix to have
427     the test run correctly even if the extension is a package.
428     Also removed the "import Thuban" which makes no sense.
429    
430     * Extensions/svgexport/__init__.py: Fix to have the extensions'
431     test module also be executed from the global test routine.
432     This is done by looking for the absense of the DISPLAY variable.
433    
434     * Extensions/svgexport/maplegend.py: Moved the menu entry from Extensions
435     to Experimental menu since this module has yet not reached a stable
436     status (ie. 1.0).
437    
438 bernhard 2414 2004-11-22 Bernhard Reiter <[email protected]>
439    
440     * Extensions/svgexport/svgmapwriter.py:
441     Added verbose variable and some logging depending on it.
442     (class VirtualDC(XMLWriter)): Minor improvement in the polygon loop,
443     because counting i is not necessary.
444     (class Pen, class Brush): Added simple __str__ methods.
445     (SVGRenderer.draw_polygone_shape): Fix #2698 (transparent polygons are
446     not exported to svg file) Note: holes still unhandled.
447    
448     * Extensions/svgexport/test/test_svgmapwriter.py:
449     Made a baseclass TestWithDC for test needed a DC.
450     Added tests for bug #2698 (transparent polygons are not
451     exported to svg file):
452     Testobjectexport.test_transparent_polygon()
453    
454     * Thuban/Model/base.py (UnsetModified):
455     Fixed some typos in docstring.
456    
457     * Thuban/UI/baserenderer.py (BaseRenderer.draw_polygon_shape()):
458     Added hints on the used algorithm for handling holes.
459    
460 jan 2403 2004-11-20 Jan-Oliver Wagner <[email protected]>
461    
462 jan 2412 Some face lifting for the examples.
463    
464     * Examples/__init__.py: Make this directory a package.
465    
466     * Examples/simple_extensions/__init__.py: Make this directory a package.
467    
468     * Examples/simple_extensions/hello_world.py: Moved entry from Extensions
469     menu to Examples menu.
470    
471     * Examples/simple_extensions/simple_command.py: Some more comments,
472     minor changes.
473    
474     * Examples/simple_extensions/simple_tool.py: Minor changes.
475    
476     2004-11-20 Jan-Oliver Wagner <[email protected]>
477    
478 jan 2407 Changed way of extension registry for wms and added extension
479     registry for umn_mapserver extension.
480    
481     * Extensions/wms/__init__.py: Added registry entry and the importing
482     of the actual wms module. Included a test for the required PyOGCLib.
483    
484     * Extensions/wms/wms.py: Removed registry entry (moved to __init__.py).
485    
486     * Extensions/umn_mapserver/__init__.py: Added registry entry and the
487     importing of the actual umn mapserver management modules.
488     Included a test for the required Python MapScript.
489    
490     2004-11-20 Jan-Oliver Wagner <[email protected]>
491    
492 jan 2403 Changed way of extension registry for importAPR, bboxdump
493     and added extension registry for svgexport.extension registry for
494     svgexport.
495    
496     * Extensions/importAPR/__init__.py: Added registry entry and the importing
497     of the actual importAPR module.
498    
499     * Extensions/importAPR/importAPR.py: Removed registry entry (moved to
500     __init__.py).
501    
502     * Extensions/bboxdump/__init__.py: Added registry entry and the importing
503     »···of the actual bboxdump module.
504    
505     * Extensions/bboxdump/bboxdump.py: Removed registry entry (moved to
506     »···__init__.py).
507    
508     * Extensions/svgexport/__init__.py: Added registry entry and the importing
509     of the svgsaver module.
510    
511     * Extensions/svgexport/svgsaver.py: Moved the menu entry from Extensions
512     to Experimental menu since this module has yet not reached a stable
513     status (ie. 1.0).
514    
515 jan 2397 2004-11-18 Jan-Oliver Wagner <[email protected]>
516    
517     Now the hit test considers the size of point symbols.
518    
519     * Thuban/UI/viewport.py (ViewPort._hit_point): Added optional parameter
520     'size' defaulting to the previously fixed value 5.
521     Extended doc-string.
522     (Viewport._find_shape_in_layer): Resolved FIXME regarding flexibility
523     for symbols.
524     Now the size of the largest point symbol is determined to find out
525     about whether the point has been hit.
526     This fixes the problem that only clicks inside a fixed distance of
527     5 where found.
528    
529 jan 2395 2004-11-17 Jan-Oliver Wagner <[email protected]>
530    
531 jan 2397 Another open issue fixed regarding sizeable symbols: correct rendering of
532 jan 2395 selected symbols.
533    
534     * Thuban/UI/renderer.py (ScreenRenderer.draw_selection_incrementally):
535     Added consideration of the specific size of point symbols.
536     The property for each point symbol is retrieved and the size applied
537     for the rendering method.
538     Added doc-string.
539    
540 jan 2393 2004-11-16 Jan-Oliver Wagner <[email protected]>
541    
542     Changed way of Extension Registry for gns2shp and profiling.
543    
544     * Extensions/gns2shp/gns2shp.py: Removed registry entry (moved to
545     __init__.py).
546    
547     * Extensions/gns2shp/__init__.py: Added registry entry and the importing
548     of the actual gns2shp module.
549    
550     * Extensions/profiling/profiling.py: Removed registry entry (moved to
551     __init__.py).
552    
553     * Extensions/profiling/__init__.py: Added registry entry and the importing
554     of the actual profiling module.
555    
556 bernhard 2388 2004-10-28 Bernhard Reiter <[email protected]>
557    
558     * Extensions/svgexport/: Minor improvements to doc strings.
559    
560 jan 2387 2004-10-07 Jan-Oliver Wagner <[email protected]>
561    
562     Further elements for sizable point objects now
563     making this feature usable though not yet complete.
564    
565     * Thuban/Model/save.py (SessionSaver.write_classification): Write
566     attribute 'size' for cldata when the shape layer is of point type.
567     This also now make the test_load.py tests happy.
568    
569     * Thuban/Model/classgen.py (CustomRamp.GetProperties): Added size
570     gradient.
571    
572     * Thuban/UI/classifier.py (ID_SELPROP_SPINCTRL): Renamed to
573     ID_SELPROP_SPINCTRL_LINEWIDTH.
574     (ID_SELPROP_SPINCTRL_LINEWIDTH): New Id replaces ID_SELPROP_SPINCTRL.
575     (ID_SELPROP_SPINCTRL_SIZE): New Id.
576     (SelectPropertiesDialog.__init__): Added a second spin control
577     for the size in case the corresponding layer is of point type.
578     (SelectPropertiesDialog._OnSpin): Renamed to _OnSpinLineWidth.
579     (SelectPropertiesDialog._OnSpinLineWidth): New. Former _OnSpin.
580     (SelectPropertiesDialog._OnSpinSize): New. Set size of property
581     and refresh preview.
582    
583    
584    
585 joey 2381 2004-10-04 Martin Schulze <[email protected]>
586    
587     * Extensions/wms/test/test_parser.py
588     (TestWMSCapabilitiesParser.test_compareLists): Added missing
589     self-test for compareLists()
590     (TestWMSCapabilitiesParser.test_compareDicts): Added missing
591     self-test for compareDicts()
592 joey 2382 (TestWMSCapabilitiesParser.test_compareLists): Adding more tests
593     to verify the test routine fails with non-equal arguments
594     (TestWMSCapabilitiesParser.test_compareDicts): Adding more tests
595     to verify the test routine fails with non-equal arguments
596 joey 2381
597 jan 2370 2004-10-03 Jan-Oliver Wagner <[email protected]>
598    
599 jan 2380 First elements for sizeable point objects.
600    
601     * Resources/XML/thuban-1.1.dtd: Added size attribute to cldata.
602    
603     * Data/iceland_sample_size.thuban: New. Sample for sized point objects.
604    
605     * test/test_load.py (ClassificationTest.TestLayers): Added SetSize in case
606     of a corresponding argument is given.
607     (TestSymbolSize): New. Test the size attribute of cldata.
608    
609     * Thuban/Model/classification.py: Removed some trailing whitespaces.
610     (ClassGroupProperties.__init__): Set default size.
611     (ClassGroupProperties.SetProperties): Set the size.
612     (ClassGroupProperties.GetSize): New. Return the size.
613     (ClassGroupProperties.SetSize): New. Set the size.
614     (ClassGroupProperties__eq__): Compare also size.
615     (ClassGroupProperties__repr__): Print also size.
616    
617     * Thuban/Model/load.py (SessionLoader.start_cldata): Also parse
618     the size attribute.
619    
620     * Thuban/UI/classifier.py (ClassDataPreviewer.Draw): Added doc-string.
621     Also, now there is a return value that indicates whether the drawing
622     size exceeded the given rect extent and if so the new extent.
623     Finally, point objects are drawn depending on the size. If either
624     the width or height is exceeded, the new extent is returned.
625     (ClassRenderer.Draw): Now when calling the previewer drawing function,
626     evaluate the return value and, if not None, adapt the grid widget size
627     accordingly and redraw again.
628    
629     * Thuban/UI/baserenderer.py (BaseRenderer.draw_shape_layer_incrementally):
630     If the draw function is for points, call it with the size as additional
631     parameter.
632     (BaseRenderer.draw_point_shape): Added additional, optional parameter for
633     the size. Compute the radius using the size.
634    
635     * Extensions/importAPR/apr.py (APR_BMkSym.GetThubanProp): Now
636     that Thuban supports size, apply this correctly.
637    
638     * Extensions/importAPR/importAPR.py: Bumped version to 0.1.1.
639    
640     2004-10-03 Jan-Oliver Wagner <[email protected]>
641    
642 jan 2370 * Doc/manual/thuban-manual-de.xml: Started translation of
643     Map chapter.
644    
645 joey 2368 2004-10-01 Martin Schulze <[email protected]>
646    
647     * Extensions/wms/properties.py (wmsProperties.__init__): Extended
648     argument for general use through properties-dialog selector
649    
650     * Thuban/UI/classifier.py: Register properties dialog classes for
651     both provided layer classes/types.
652    
653     * Thuban/UI/mainwindow.py (MainWindow.OpenLayerProperties): The
654     map can be retrieved through the parent which is passed to the
655     constructor anyway and doesn't require an argument of its own,
656     required for the unification of arguments for general use through
657     properties-dialog selector.
658     (MainWindow.OpenOrRaiseDialog): Move the logic for checking
659     whether a dialog is already opened (and raising it to the users
660     attention) and creating a new dialog into a function of its own
661     (MainWindow.OpenLayerProperties): Use the new OpenOrRaiseDialog()
662     method
663     (MainWindow.OpenLayerProperties): Utilise the new ClassMapper for
664     global registration of properties dialog classes (which are indeed
665     layer-specific).
666    
667     * Thuban/UI/classifier.py (Classifier.__init__): Unify arguments
668     for general use through properties-dialog selector, the map can be
669     retrieved through the parent and doesn't require an argument of
670     its own.
671    
672     * Extensions/wms/wms.py: Register the properties dialog class for
673     the provided WMS layer
674    
675 jan 2358 2004-09-28 Jan-Oliver Wagner <[email protected]>
676    
677     New feature: Registry for Extensions.
678    
679     * Thuban/UI/extensionregistry.py: This module defines a registry for
680     Extensions.
681    
682     * Thuban/UI/about.py (About.__init__): Added description
683     of the registered extensions with all of the information.
684    
685     * Thuban/Model/extension.py (Extension): Improved doc-string.
686    
687     * Extensions/gns2shp/gns2shp.py, Extensions/importAPR/importAPR.py,
688     Extensions/bboxdump/bboxdump.py, Extensions/profiling/profiling.py,
689     Extensions/wms/wms.py: Added registration of the extension.
690    
691 bernhard 2352 2004-09-27 Bernhard Reiter <[email protected]>
692    
693     More fixes to svgexport to make used ids unique and
694     conforming to XML's Name production.
695    
696     * Extensions/svgexport/test/test_svgmapwriter.py: Added new tests
697     test_xml_id_constraints(), test_make_ide_nosetbaseid() and
698     test_make_id_nonintegersetid(). Switched SetID and SetBaseID.
699     Added Bernhard R. as author.
700     * Extensions/svgexport/svgmapwriter.py (make_id): Using "_" as
701     concatenation char now (makes test_make_ide_nosetbaseid() valid).
702     Also transform second id part with "%d" and catch the TypeError
703     to raise SVGMapWriterError (making test_make_id_nonintegersetid() ok).
704     Corrected typo inBernhard's author line.
705     (SetBaseID): Return the transformed base id. Transform characters
706     which are not alnum() or in ".-_" to binascii.b2a_hex(). Added
707     import binascii. If to be set string starts with "xml" or so, add "t".
708     (draw_shape_layer_incrementally): use the returned value of SetBaseID
709     for used_baseids checks.
710    
711 bh 2351 2004-09-25 Bernhard Herzog <[email protected]>
712    
713     * test/test_layer.py (TestLayer.test_arc_layer_with_projection):
714     Remove a debug print and some tab characters.
715    
716 bernhard 2350 2004-09-25 Bernhard Reiter <[email protected]>
717    
718     * Extensions/svgexport/svgmapwriter.py: Added Bernhard R. as Author.
719     (SetBaseID, SetID, make_id): Improved docstring comments to explain
720     the interaction of the three functions and the XML id contrains.
721    
722 bernhard 2352
723 jan 2346 2004-09-23 Jan-Oliver Wagner <[email protected]>
724    
725 jan 2349 * Doc/ThubanModel.xmi: New. UML file for Thuban Model
726     Module.
727    
728     * Doc/README: Added info on ThubanModel.xmi.
729    
730     2004-09-23 Jan-Oliver Wagner <[email protected]>
731    
732 jan 2346 * Doc/README: New. Some info about how to generate technical
733     documentation from the source code.
734     This text was send to the Thuban developer mailing list on
735     September 21st 2004 by Bernhard Reiter.
736    
737 bernhard 2344 2004-09-21 Bernhard Reiter <[email protected]>
738    
739     Improved the svgexport to only use unique ids. Will issues
740     an error message dialoge when two layer names are the same.
741     ShapeIDs are now added with a dash within the svg ids.
742    
743     * Extensions/svgexport/svgmapwriter.py (SVGMapWriterError): New.
744     * Extensions/svgexport/test/test_svgmapwriter.py: Added imports
745     (TestSVGRenderer): New test class with test_make_in() and
746     test_check_for_layer_name_clash()
747     * Extensions/svgexport/svgmapwriter.py (SVGRenderer): Fixed __init__()
748     and draw_shape_layer_incrementally() to not use a baseid twice,
749     satisfying test_check_for_layer_name_clash()
750     (VirtualDC.make_id): Use a dash between baseit and id, satisfies
751     test_make_in().
752     * Extensions/svexport/svgsaver.py: Import SVGMapWriterError, wxOK
753     and wxICON_HAND.
754     (write_to_svg): Put dc and rendering in a try statement and on
755     catching SVGmapWriterError notify the user and delete the target file.
756    
757 bernhard 2343 2004-09-20 Bernhard Reiter <[email protected]>
758    
759     * Model/base.by, Model/layer.py: Fixed typos in docstrings.
760    
761 jschuengel 2342 2004-09-03 Jan Schüngel <[email protected]>
762    
763     * Extensions/umn_mapserver/mapfile(MF_Class.add_thubanstyle): Fix a
764     small bug with the line color. Now the line color will now only set
765     if it is set in Thuban an not Transparent.
766    
767     * Extensions/umn_mapserver/mf_export(tblayer_to_map): Fixed a bug with
768     deleting the layers from mapfile. Now all layers will delete backwards
769     from the last.
770    
771 silke 2339 2004-08-20 Silke Reimer <[email protected]>
772 silke 2338
773 silke 2339 * Thuban/Model/layer.py:
774     Fixes bug in projection handling: Otherwise very large region might not
775     have valid values in the layer's projection.
776    
777     2004-08-20 Silke Reimer <[email protected]>
778    
779 silke 2338 * Thuban/UI/about.py:
780     small changes to be consistent with coding style.
781    
782 joey 2337 2004-08-13 Martin Schulze <[email protected]>
783    
784     * Extensions/wms/test/test_ogclib.py (TestOGCLib.compare_URLs):
785     Adjusted a comment
786    
787 silke 2335 2004-08-11 Silke Reimer <[email protected]>
788 silke 2334
789 silke 2335 * Thuban/UI/about.py: Small changes to encoding related stuff to avoid
790     too many and too enhanced imports of locale
791    
792 silke 2334 2004-08-10 Silke Reimer <[email protected]>
793    
794     * Thuban/UI/about.py: Fixed encoding problem of about dialog: Added
795 silke 2339 function unicodeToLocale() to convert special characters to users
796     locale encoding
797 silke 2334
798 jan 2333 2004-08-10 Jan-Oliver Wagner <[email protected]>
799    
800     * Doc/technotes/coding_guidelines.txt: Added rule 'Method names start with
801     lower case letter'
802    
803 jschuengel 2331 2004-08-09 Jan Schüngel <[email protected]>
804    
805     * ChangeLog: Rewrite the last ChangeLog entry to follow
806     the standard way.
807    
808     * Extensions/umn_mapserver/mapfile: Moved the import AnnotationLayer to
809     the function where it is needed, because it don't works if it stands
810     at the beginning.
811     (MF_Layer.__init__): Removed the extra numclassed variable. Now
812     numclasses from the mapscript will be used.
813     (MF_Layer.get_index): New. Return the index of the layer in mapfile.
814     (MF_Layer.set_classes): New. A Classlist will be set to the layer.
815     (MF_Layer.set_metadata): New. A Metadata mapscript object will set.
816     (MF_Layer.remove_allclasses): New. All class of the layer will remove.
817     (MF_Map.create_new_layer): New. A new Layer is created and associated
818     with the mapscript object.
819     (MF_Map.set_layerorder): New. The Layer order like in thuban is set in
820     the mapscript.
821     (MF_Map.add_thubanlayer): Now a new layerobj is created if no one is
822     linked to the layer in thuban, else the layerobject linked to the
823     thubanlayer will be used.
824     AnnotationLayer will now store the filename of the shapefile.
825     (MF_Map.remove_layer): If a layer is removed the associated object
826     must be set new.
827    
828     * Extensions/umn_mapserver/mf_export.py(tb_layer_to_map): Add all
829     layers which are exists in thuban to the mapobj. All removed Layers
830     will be removed from the mapobj.
831     Added comments to all functions.
832     (thuban_to_map): No layer will be removed here.
833    
834     * Extensions/umn_mapserver/mf_handle.py
835     (_has_umn_mapobj_and_selectedlayer): Activating the layer menu. Now
836     Layersettings for the mapserver kann be edited.
837    
838     * Extensions/umn_mapserver/mf_import.py: Now all layers which are
839     imported, will be linked with the associated MF_Layer.
840     (import_mapfile): All layers, which are not selected, will be removed.
841     Disable the "import layer from mapfile" menu option.
842    
843     * Extensions/umn_mapserver/sample/iceland.map: Set the status of the
844     Annotation Layer from DEFAULT to OFF. The DEFAULT setting turns the
845     layer on permanently.
846    
847 jschuengel 2323 2004-08-03 Jan Schüngel <[email protected]>
848    
849 jschuengel 2331 * Extensions/umn_mapserver/mapfile.py(MF_Metadata.remove_allmetadata):
850     New. This function removes all metadata
851     (MF_Layer.set_group): New. Set the group setting.
852     (MF_Layer.get_group): New. Get the group setting.
853     (MF_Map): Removed the extra numlayers variable, used the mapscript
854     parameter instead.
855     (MF_Map.get_numlayers): New. This get numlayers.
856     (MF_Map.remove_all_layers): New. Removes all layers from the mapobj.
857 jschuengel 2323 (MF_Map.add_thubanlayer): Replaced the exception handling by a check
858     if the object is an instance. Also added the annotation layer here to
859     export, but only the layer is created in the mapfile.
860    
861 jschuengel 2331 * Extensions/umn_mapserver/mf_export.py(export_mapfile): Removed
862     the check if a mapobj exist, because its not needed anymore. The
863     export function is only available if a mapobj exist.
864     Use the new function to remove all layers.
865 jschuengel 2323
866 jschuengel 2331 * Extensions/umn_mapserver/mf_handle.py(Layer_Dialog): Added a group
867     option and the metadata button. The layer dialog is temporary disabled.
868     (Metadata_CustomDataTable): Added some functions to show the grid
869 jschuengel 2323 correct.
870    
871 jschuengel 2331 * Extensions/umn_mapserver/mf_import.py: Moved the code for showing
872     the number of layer from import_mapfile to this function.
873     (AnnotationLayer): New. This Class shows the Annotation layer in
874     thuban. The layer don't do anything. It's only to show the layer
875     and to save the layer order.
876     (add_annotationlayer): New. Import an annotation layer to thuban.
877     (select_layer2import): New. Import only layers to thuban and not
878     the other settings like projection or scalebar.
879     (create_new_mapfile): Moved the _has_umn_mapobj function and the
880     create_new_mapfile functions from mf_handle.py to mf_import.py.
881 jschuengel 2323
882     * Extensions/umn_mapserver/sample/iceland.map: Added the group
883     parameter to the roads and cultural layers. Also added a new
884     Annotation Layer for the cultural points.
885    
886     * Extensions/umn_mapserver/sample/iceland.html: Added the select
887     option for the annotation layer.
888    
889     * Extensions/umn_mapserver/sample/index.html: Added the start
890     parameter for the annotation layer.
891    
892 jan 2315 2004-08-01 Jan-Oliver Wagner <[email protected]>
893    
894     * Doc/manual/thuban-manual-de.xml (Chapter Session Management):
895     translation completed.
896    
897     * Doc/manual/thuban-manual.xml (Chapter Session Management):
898     Fixed unprecise description for Save Session.
899    
900 jan 2312 2004-07-31 Jan-Oliver Wagner <[email protected]>
901    
902     Started translation of Users Manual into german.
903    
904     * Doc/manual/thuban-manual-de.xml: New. German Users Manual.
905    
906     * Doc/manual/Makefile: Added build instructions for german
907     users manual.
908    
909     * Doc/manual/thuban-manual.xml: Minor corrections in Introduction.
910    
911 jschuengel 2308 2004-07-28 Jan Schüngel <[email protected]>
912    
913     * Extensions/umn_mapserver/mapfile.py(MF_Metadata): Changed all class
914     functions. Now all metadata will handle by the function and its not
915     needed to initialize it from outside. Therefor the associated mapobj
916     will be stored in the Metadata Object. So we can use the special
917     functions from the associated mapobj to get the Metadata.
918     Therefor all initialization code for the metadata is removed from the
919     other classes.
920     (MF_Layer): Added a function to get the metadata object.
921     (MF_Map): Added a function to set the mappath, the path where
922     the mapfile ist stored.
923    
924     * Extensions/umn_mapserver/mf_export.py(thuban_to_map): Changed the code
925     to set the extent in the mapfile. Now the code is set by the displayed
926     data in the Thuban-view.
927     (export_mapfile): The shapepath is now set empty, until relative
928     pathnames are supported.
929    
930     * Extension/umn_mapserver/mf_handle.py: Added a dialog to handle
931     metadata. Yet only mapfile metadata are supported. Layer and class
932     supported are not implemented.
933     Added a dialog to handle layer informations. The dialog only shows the
934     selected layer at the moment.
935    
936     * Extensions/umn_mapserver/mf_import.py(import_mapfile): Changed the
937     code for setting the extent in thuban. Now the extent is set to the
938     given extent from the mapfile.
939     Fixed a logical mistake. Now the extent is set when realy a layer is
940     loaded, and not if one is selected to load.
941    
942     * Extensions/umn_mapserver/sample/iceland.html: Added code to zoom and
943     move the shown map in the browser.
944    
945     * Extensions/umn_mapserver/sample/iceland.map: Added a new metadata
946     line to the mapobj and added metadata to the political layer.
947    
948     * Extensions/umn_mapserver/test/test_mapserver.py: Changed the test
949     for Metadata.
950    
951 joey 2300 2004-07-26 Martin Schulze <[email protected]>
952    
953     * Thuban/Lib/classmapper.py (ClassMapper.has): Added the new
954     ClassMapper
955    
956     * test/test_classmapper.py (TestMapping.test_mapper): Added a Test
957     case for the new ClassMapper
958    
959    
960 bh 2296 2004-07-22 Bernhard Herzog <[email protected]>
961    
962 bh 2297 * Thuban/UI/viewport.py (ViewPort.VisibleExtent): New. Return the
963     visible extent of the map in projected coordinates
964    
965     * test/test_viewport.py (SimpleViewPortTest.test_default_size)
966     (SimpleViewPortTest.test_init_with_size): Add some VisibleExtent()
967     tests.
968     (SimpleViewPortTest.test_visible_extent): New. The real test for
969     VisibleExtent()
970    
971     2004-07-22 Bernhard Herzog <[email protected]>
972    
973 bh 2296 * test/test_viewport.py: Use support.run_tests as the main
974     function when running asa script.
975    
976 jschuengel 2295 2004-07-22 Jan Schüngel <[email protected]>
977    
978     * Extensions/umn_mapserver/mf_export.py: Added "import os"
979     Removed the old "import Thuban.UI.mainwindow" code.
980     (tbextent_to_map): Removed the extra function and at the code direct
981     to "thuban_to_map" function.
982     (write_creatorcomment): Added. Now a short comment is added to the
983     beginning of an generated mapfile.
984     (export_mapfile): Now the Path and filename are saved in to variables,
985     and not together in one variable. This is needed for the new
986     write_creatorcomment function.
987    
988     * Extensions/umn_mapserver/mf_import.py (import_mapfile): Added the
989     import module "re". Also added Range and the ClassGroupRange import
990     from Thuban. Both are needed for the new range expression import.
991     (create_rangeexpression): Added. Creates a Range Expression in Thuban
992     style from a given mapfile expression.
993     (added_rasterlayer): Make some small code changes. The shapepath is
994     now stored in an extra variable and the clazz_name is set empty if no
995     class name set in the mapfile.
996     Changed the Error message for Range Expressions, becaus the new
997     function create a error string which will be shown in the dialog.
998    
999     * Extensions/umn_mapserver/test/test_mapserver.py: Added a test for the
1000     range expression import.
1001 jan 2312
1002 jan 2291 2004-07-21 Jan-Oliver Wagner <[email protected]>
1003    
1004     * Extensions/umn_mapserver/README: Added hint that
1005     installation as root can be avoided. Removed all tabs.
1006    
1007 bh 2289 2004-07-16 Bernhard Herzog <[email protected]>
1008    
1009     * test/test_viewport.py
1010     (ViewPortTest.test_changing_map_projection): Check that changing
1011     the projection of an empty map shown in a viewport doesn't lead to
1012     exceptions in the viewport's handler for the
1013     MAP_PROJECTION_CHANGED messages
1014    
1015     * Thuban/UI/viewport.py (ViewPort.map_projection_changed): Only
1016     try to keep the same region visible when the map actually contains
1017     something
1018    
1019 jschuengel 2288 2004-07-15 Jan Schüngel <[email protected]>
1020    
1021     * Extensions/umn_mapserver/mapfile.py: Added a function to get the
1022     mappath directly from the mapobj. Is needed because of the changes
1023     in mf_import.py.
1024     (MF_Layer.add_thubanclass): Added a new comment.
1025     (MF_Map.set_extent): Fixed a bug with exporting empty mapobj. If the
1026     mapobj is empty there is no extent get from thuban an so no one can
1027     set to th mapobj.
1028    
1029     * Extensions/umn_mapserver/mf_import.py (import_mapfile): Updated
1030     the discription.
1031     Split the funktion in to three smaller ones. The new functions are
1032     add_rasterlayer, add_polygonlayer and select_layer2import.
1033     Removed the mapfilepath and filepath initialisation, because its know
1034     include in the new functions.
1035     Now nothing will be imported if cancel is pressed in the
1036     layer choice dialog.
1037    
1038 jschuengel 2285 2004-07-14 Jan Schüngel <[email protected]>
1039    
1040     * Extensions/umn_mapserver/mapfile.py: Added ClassGroupDefault to
1041     import.
1042     (MF_Symbolset): Removed the extra variable for numsymbols.
1043     (MF_Class.__init__): Added a comment to the exception clause.
1044     Removed the extent init, because it was not needed anymore.
1045     (MF_Layer.add_thubanclass): Added the code to set the class name to
1046     the expression value from thuban if no label is defined.
1047     Added the code to export Range expressions from thuban to the mapfile.
1048     (MF_Map.set_extent): Removed the exception and replace it by some if
1049     code. If the size of a map is not defined the size will be set to 1,1.
1050     This is necessary because if the extent is set, mapscript checks if
1051     the size is greater than zero.
1052     (MF_Web): Added the get and set function for the template.
1053    
1054     * Extensions/umn_mapserver/mf_export.py: Added the function to check
1055     if a mapobject exists and used it to set the status of the menu items.
1056     If no mapfile exists the settings could not be edditied.
1057     Define after which menuitem the exportitem will include.
1058    
1059     * Extensions/umn_mapserver/mf_handle.py: Removed the import
1060     Thuban.UI.mainwindow clause, because it is not needed.
1061     Added the command Refresh() to all "OnChangeColor()" functions,
1062     because the color preview window was not updated on a color change.
1063     Added the function to check if a mapobject exists and used it to set the
1064     status of the menu items. If no mapobject exists the settings could not
1065     be edditied.
1066     (Map_Dialog): Moved the imagetype selector from the
1067     Outputformat_Dialog to Map_Dialog and removed Outputformat_Dialog.
1068     (Web_Dialog): Removed the name label and added the template textbox.
1069    
1070     * Extensions/umn_mapserver/mf_import.py (import_mapfile): Replace
1071     the exception handling on loading the layers by an if statement. It
1072     is not necessary to us the exception there.
1073     The Filepath creation now use os.path.join to build the path.
1074    
1075     * Extensions/umn_mapserver/test/test_mapserver.py: Moved the testMap
1076     definition from global to the setUp function. Now the testMap will
1077     initialize new on each test.
1078    
1079     * Extensions/umn_mapserver/sample/iceland.map: Include three new
1080     classes in the Line Layer, to test logical Expressions.
1081     Set the status of the class "Point9" in the Point Layer to off
1082    
1083 bh 2278 2004-07-13 Bernhard Herzog <[email protected]>
1084    
1085     * Thuban/UI/baserenderer.py
1086     (BaseRenderer.render_map_incrementally): Fix a logic bug in the
1087     optimization that tries not to draw layers under a raster layer.
1088     The bug was harmless. All it effectively did was to produce The a
1089     strange messages about not being able to draw Layer instances for
1090     all vector layers below a raster layer which would be invisible
1091     anyway because the raster layer currently always covers the entire
1092     window
1093    
1094 jschuengel 2277 2004-07-08 Jan Schüngel <[email protected]>
1095    
1096     * Extensions/umn_mapserver/mapfile.py: Added code to generade and get
1097     a list of supported outputformats. This formats are not alle supported
1098     because there is no possibility to get the outputformat without the
1099     name known. Make some formal changes to the code.
1100     (MF_Map.set_name()): Fixed a bug if the name is None.
1101    
1102     * Extensions/umn_mapserver/mf_handle.py: Removed the image_type import
1103     statement, because its not needed anymore. The Outputformat is now
1104     given as string from the object. Make some formal changes to the code.
1105    
1106     * Extensions/umn_mapserver/test/test_mapserver.py: Added new test for
1107     most of the new setting which were added during the last changes.
1108     Removed the MF_Size Test.
1109    
1110     * Extensions/umn_mapserver/test/test.map: Added a new class to the
1111     cultural Layer to test expressions and the the status of that layer
1112     from on to default.
1113     Changed the data path the the correct Thuban Data
1114     Added the Outputformat Object and Symbol Object
1115    
1116 jschuengel 2272 2004-07-07 Jan Schüngel <[email protected]>
1117    
1118     * Extensions/umn_mapserver/mapfile.py: Added some new
1119     settings to edit (outputformat, label, imagetype)
1120    
1121     * Extensions/umn_mapserver/mf_handle.py: Added some setting to
1122     the Label Dialog and add the OutputDialog.
1123     Make some changes to the code order.
1124    
1125 jschuengel 2269 2004-07-06 Jan Schüngel <[email protected]>
1126    
1127     * Extensions/umn_mapserver/mapfile.py: Added the symbolObj, pointObj
1128     and line Obj and add the scalebar_status_type, scalebar_style_type and
1129     scalebar_position_type.
1130     Added the symbol- and symbolsetObject (MF_Symbol,MF_Symbolset). The
1131     are only used to create a Symbol like the circle in Thuban.
1132     Added the scalebarObject (MF_Scalebar)
1133     (MF_Class): Added set_status and get_status.
1134     (MF_Layer.add_thubanclass): Added code to set the class status
1135     (MF_Map): Added code to handle the symbols and scalebar
1136     (MF_Label): Added the set_partials and get_partials functions
1137    
1138     * Extensions/umn_mapserver/mf_export.py: Added MF_Symbol to import
1139     from mapfile. Added a function to create a circle object like the one
1140     from thuban if no one exists.
1141    
1142     * Extensions/umn_mapserver/mf_handle.py: All colors are now set when
1143     press ok in the assosiated dialog and not at the end of the
1144     colordialog.
1145     Added the Dialog for the Scalebar.
1146     (Label_Dialog): Added the offset option
1147    
1148     * Extensions/umn_mapserver/mf_import.py: Added code to import the
1149     status of the Classes.
1150     Fixed a bug with the projection. Now the to_meter parameter will be
1151     added to the Projection only if it doesn't exists.
1152    
1153 jschuengel 2264 2004-07-01 Jan Schüngel <[email protected]>
1154    
1155     Added the functionality to handle the content thuban is not
1156     able to handle directly.
1157    
1158     * Extensions/umn_mapserver/mf_handle.py: New. This module extents
1159     Thuban with the possibility to edit the mapfile content.
1160    
1161     * Extensions/umn_mapserver/mf_import.py: Added the possibility
1162     to import mapfiles without any layer selected. So it is possible
1163     to edit the other settings in a mapfile.
1164     (import_mapfile): Added code to use the editing functions.
1165     Added the possibility to import the projection to a layer if one
1166     is defined.
1167     Status settings (On,Off) will now set in thuban (visible, invisible).
1168     fixed a bug with with classnames. If no classname is set in mapfile
1169     the value in Thuban will set to the expression.
1170    
1171     * Extensions/umn_mapserver/mf_export.py(export_mapfile): Added the
1172     possibility to save a new mapfile or use the old one which is
1173     imported or new created.
1174     Added code to use the editing functions.
1175     Remove some not needed import statements
1176    
1177     * Extensions/umn_mapserver/mapfile.py: Added new types which are
1178     need for the editing functions.
1179     Added needed set-functions for the editing functions.
1180     Added the possibility to export rasterimages.
1181     Added new classes (MF_Web, MF_Label, MF_Legend, MF_Symbol,
1182     MF_SymbolSet). MF_Symbol and MF_SymbolSet are not needed at the
1183     moment.
1184     (MF_Class.set_thubanstyle): Now point layers will set to a default
1185     symbol to show a circle in mapserver and not only a 1px dot.
1186     (MF_Style.__init__): Fixed a bug with the color. Color was not set
1187     correct before.
1188     (MF_Size): Removed, because it is not needed.
1189    
1190     * Extensions/umn_mapserver/README: Added the hints to use the
1191     export and editing functions, too.
1192    
1193     * Extensions/umn_mapserver/sample/iceland.map: Added the
1194     new parameter "UNITS METERS".
1195     Change the political layer to status OFF.
1196    
1197     * Extensions/umn_mapserver/sample/README: Added some
1198     more details to setup the sample in the MapServer.
1199    
1200 bernhard 2256 2004-06-26 Bernhard Reiter <[email protected]>
1201    
1202     * Extensions/svgexport/test/test_svgmapwriter.py:
1203     Removed class VFile and used standard StringIO instead.
1204    
1205 jschuengel 2255 2004-06-23 Jan Schüngel <[email protected]>
1206    
1207     Add the export function to the umn_mapserver extension.
1208    
1209     * Extension/umn_mapserver/mf_export.py: New. This module extents
1210     Thuban with the possibility to export the Thuban content.
1211    
1212     * Extensions/umn_mapserver/mapfile.py: Expand the classes to use
1213     with the export module. Especially added the possibility to
1214     add thuban objects directly to the map objects.
1215    
1216     * Extensions/umn_mapserver/mf_import.py: Removed the wxCHANGE_DIR,
1217     because of the hint from Bernhard Herzog.
1218     Corrected the handling of absolute pathnames.
1219     Changed the Text of the Menu-Item, now the beginning is upper case.
1220    
1221     * Extensions/umn_mapserver/README: Added the --with-tiff statement.
1222    
1223 jschuengel 2250 2004-06-16 Jan Schüngel <[email protected]>
1224 jschuengel 2242
1225 jschuengel 2250 Add a sample and make some changes.
1226    
1227     * Extension/umn_mapserver/mf_import.py: Changed the wxPython.wx
1228     import from * to explicit used statements. Changed the
1229     Thuban.UI.mainwindow import phrase, too.
1230     (import_mapfile):Corrected a clerical mistake.
1231     Added wxCHANGE_DIR in OpenFile Dialog.
1232     Added a MultipleChoiceDialog, to select the layers to load from
1233     mapfile into thuban. Thereby the projection is only set if one layer
1234     is selected.
1235     Added the possibility to handle relative pathnames which uses
1236     up-level references.
1237     Removed some doubled code.
1238     Corrected an error with integer values used as label in thuban
1239     ClassGroup.
1240    
1241     * Extensions/umn_mapserver/sample: New.
1242    
1243     * Extensions/umn_mapserver/sample/README: New. Describes the
1244     usage of the sample files.
1245    
1246     * Extensions/umn_mapserver/sample/iceland.map: New. This is
1247     a suitable .map-file for the iceland data.
1248    
1249     * Extensions/umn_mapserver/sample/index.html: New. The template
1250     for the mapfile.
1251    
1252     * Extensions/umn_mapserver/sample/iceland.html: New. Initialisation
1253     file for the Iceland Application on web.
1254    
1255     * Extensions/umn_mapserver/README: Corrected a inaccuracy and added
1256     some details.
1257    
1258     * Extensions/umn_mapserver/test/test_mapserver
1259     (mapserver_import_Test_generalClasses.test_MF_Color):
1260     Corrected the thubancolor test.
1261    
1262     2004-06-15 Jan Schüngel <[email protected]>
1263    
1264 jschuengel 2242 * Extensions/umn_mapserver/README: New. Install instruction.
1265    
1266 bernhard 2240 2004-06-14 Bernhard Reiter <[email protected]>
1267    
1268     * libraries/thuban/cpl_mfile.h: Added copyright header.
1269    
1270     * libraries/thuban/ cpl_mfile.cpp, cpl_mfile.h: Added non-protecting
1271     Free Software License so that it is most useful with gdalwarp
1272     and bmpdataset.
1273    
1274 bh 2239 2004-06-14 Bernhard Herzog <[email protected]>
1275    
1276     * Thuban/UI/multiplechoicedialog.py (__version__): Add missing
1277     import of wxPython.wx itself (as opposed to the contents of
1278     wxPython.wx). For some reason wxPython.wx is available as
1279     wxPython.wx.wx in at least some 2.4 releases. Fixes RT#2482
1280     wrt. wxPython 2.4.
1281    
1282 jschuengel 2238 2004-06-10 Jan Schüngel <[email protected]>
1283    
1284     Initial version of new extension "umn_mapserver". This extension aims
1285     to manage configuration for the UMN MapServer application. This
1286     inital version just imports the .map-files and displays all, Thuban is
1287     capable of.
1288    
1289     * Extensions/umn_mapserver, Extensions/umn_mapserver/test: New.
1290    
1291     * Extensions/umn_mapserver/test/README: New. Describes how to run the
1292     tests.
1293    
1294     * Extensions/umn_mapserver/test/test.map: New. This is a test
1295     .map-file for automated tests of the umn_mapserver extension of
1296     Thuban.
1297    
1298     * Extensions/umn_mapserver/test/test_mapserver.py: New. Tests for
1299     UMN Mapserver classes.
1300    
1301     * Extensions/umn_mapserver/__init__.py: New. Init to make this
1302     directory a package.
1303    
1304     * Extensions/umn_mapserver/mapfile.py: New. Classes to represent
1305     '.map'-file objects.
1306    
1307     * Extensions/umn_mapserver/mf_import.py: New. This module extends
1308     Thuban with the possibility to handle UMN MapServer mapfiles.
1309    
1310 bh 2230 2004-06-03 Bernhard Herzog <[email protected]>
1311    
1312     * Thuban/Model/layer.py (Layer.TreeInfo): Convert the bounding box
1313     to a tuple before using it as arguments to the % operator. This
1314     fixes the formatting issue filed in RT#2239 on 2004-01-13 and
1315     reported today on thuban-list by Jan Schüngel
1316    
1317     * test/test_layer.py (TestLayerModification.setUp): Save the
1318     filename as an instance variable so we can refer to it in tests
1319     (TestLayerModification.test_tree_info): Uncomment this method
1320     again and make it work. This tests for the formatting issue
1321     filed in RT#2239 on 2004-01-13
1322    
1323 bh 2224 2004-05-28 Bernhard Herzog <[email protected]>
1324    
1325     * Thuban/UI/baserenderer.py: Fix some typos.
1326    
1327 jan 2217 2004-05-18 Jan-Oliver Wagner <[email protected]>
1328    
1329     * Extensions/gns2shp/gns2shp.py (gns2shp): Fixed a bug
1330     by increasing a field size.
1331    
1332 bh 2213 2004-05-17 Bernhard Herzog <[email protected]>
1333    
1334     Update to newest shapelib and get rid of Thuban specific
1335     extensions, i.e. use the new DBFUpdateHeader instead of our
1336     DBFCommit kludge
1337    
1338     * libraries/shapelib/shpopen.c: Update to version from current
1339     shapelib CVS.
1340    
1341     * libraries/shapelib/shapefil.h: Update to version from current
1342     shapelib CVS.
1343    
1344     * libraries/shapelib/dbfopen.c: Update to version from current
1345     shapelib CVS.
1346     (DBFCommit): Effectively removed since shapelib itself has
1347     DBFUpdateHeader now which is better for what DBFCommit wanted to
1348     achieve.
1349     We're now using an unmodified version of dbfopen.
1350    
1351     * setup.py (extensions): Add the HAVE_UPDATE_HEADER macro with
1352     value '1' to the Lib.dbflibc extension. This simply reflects the
1353     shapelib and pyshapelib updates
1354    
1355 jan 2211 2004-05-16 Jan-Oliver Wagner <[email protected]>
1356    
1357     Finished introduction of Menu.FindOrInsertMenu.
1358    
1359     * Extensions/drawshape/drawshape.py: Add the command
1360     to the experimental menu additionally to the toolbar.
1361    
1362     * Extensions/svgexport/svgsaver.py: Use FindOrInsertMenu() instead of
1363     finding menu on its own.
1364    
1365     * Doc/manual/thuban-manual.xml: updated sample file
1366     to use FindOrInsertMenu().
1367    
1368     * Examples/simple_extensions/hello_world.py: Use FindOrInsertMenu()
1369     instead of finding menu on its own.
1370    
1371 jan 2206 2004-05-11 Jan-Oliver Wagner <[email protected]>
1372    
1373     * test/test_menu.py (MenuTest.test): Added testing
1374     of method Menu.FindOrInsertMenu.
1375    
1376 jan 2204 2004-05-10 Jan-Oliver Wagner <[email protected]>
1377    
1378     Introduce and use Menu.FindOrInsertMenu.
1379    
1380     * Thuban/UI/menu.py (Menu.FindOrInsertMenu): New. Find a
1381     given menu or, if not found, insert it.
1382    
1383     * Extensions/bboxdump/bboxdump.py, /Extensions/gns2shp/gns2shp.py,
1384     /Extensions/importAPR/importAPR.py, Extensions/profiling/profiling.py,
1385     /Extensions/wms/wms.py: Use FindOrInsertMenu() instead of finding
1386     menu on its own.
1387    
1388 jan 2201 2004-05-06 Jan-Oliver Wagner <[email protected]>
1389    
1390     Introduce a abstract ColorDialog class and remove
1391     and outdated file.
1392    
1393     * Thuban/UI/proj4dialog.py: Removed. It is has been
1394     replaced by projdialog for quite a while and is not used
1395     anymore.
1396    
1397     * Thuban/UI/colordialog.py: New. Abstraction for color selection
1398     dialog(s).
1399    
1400     * Thuban/UI/classifier.py (SelectPropertiesDialog.__GetColor):
1401     Now calls the abstract ColorDialog instead of wxColourDialog.
1402     This also removed the dependency to Color class conversion
1403     from this function.
1404    
1405 frank 2197 2004-05-04 Frank Koormann <[email protected]>
1406    
1407     * Extensions/bboxdump/__init__.py: Fixed string left over from
1408     copying.
1409    
1410     * Extensions/bboxdump/bboxdump.py (bboxdump):
1411     Use layer.ShapeStore().AllShapes() to loop over shapes instead of
1412     xrange(layer.NumShapes()). Compile the bboxmessage from a list
1413     of formatted outputs (string.join) instead of appending to the
1414     message. Two progress bar dialogs to report progress on the sometimes
1415     lenghty processing.
1416    
1417 frank 2196 2004-04-22 Frank Koormann <[email protected]>
1418    
1419     New Extension to dump bounding boxes of all shapes of the selected
1420     layer. An optional column can be specified to group the objects,
1421     in this case the bounding box is a union of the separate boxes.
1422     Dump can be displayed in a ScrolledMessageDialog or written to file.
1423     The Extension is simply a combination of available and well tested
1424     Thuban functionality.
1425    
1426     * Extensions/bboxdump/__init__.py: New: Init to make this
1427     directory a package.
1428    
1429     * Extensions/bboxdump/bboxdump.py: New: Dump bounding boxes of
1430     all shapes of the selected layer.
1431    
1432 jan 2192 2004-04-22 Jan-Oliver Wagner <[email protected]>
1433    
1434     * Thuban/UI/classgen.py (GenUniquePanel.__init__): Fixed two
1435     strings to be i18n now.
1436    
1437 jan 2188 2004-04-18 Jan-Oliver Wagner <[email protected]>
1438    
1439     Changing popup menu of legend from direct building
1440     to using the Menu construction as used for the mainwindow.
1441    
1442     * Thuban/UI/mainwindow.py: New method commands: layer_to_top,
1443     layer_to_bottom, layer_visibility
1444     (MainWindow.LayerToTop): New. Put current layer to the top.
1445     (MainWindow.LayerToBottom): New. Put current layer to bottom.
1446     (MainWindow.HideLayer, MainWindow.ShowLayer, _has_visible_map):
1447     Replace 1,0 by True, False.
1448     (MainWindow.ToggleLayerVisibility): New. Toggle visibility of
1449     current layer.
1450     (MainWindow.LayerShowTable): Removed raising of dialog.
1451     (_has_selected_layer_visible): New. Support function.
1452    
1453     * Thuban/UI/legend.py: ID_POP_xxx: removed.
1454     (LegendPanel.__init__): Removed EVT_MENU bindings.
1455     (LegendTree._OnRightClick): Replace direct creation of
1456     menu via wx Classes by applying the menu definition
1457     as of Menu class of menu.py.
1458    
1459 jan 2185 2004-04-16 Jan-Oliver Wagner <[email protected]>
1460    
1461     * Thuban/UI/exceptiondialog.py (ExceptionDialog.dialog_layout): Improved
1462     button string to stronger clearify that Thuban will be closed when hitting
1463     the button.
1464    
1465     * Thuban/UI/mainwindow.py (MainWindow.LayerShowTable): Added docstring.
1466     Now for layers without a ShapeStore a corresponding message is given
1467     to the user, that this layer has no table to show.
1468    
1469 joey 2182 2004-04-15 Martin Schulze <[email protected]>
1470    
1471     * Extensions/wms/layer.py (WMSLayer.setWMSFormat): Need to
1472     recalculate the format for the internal render engine as well.
1473    
1474     * Extensions/wms/properties.py (wmsProperties): First start for a
1475     properties dialog. It's functional for a first selection of
1476     layers, but still has some weired wxWidgets/GTK problems but
1477     beautification can be done later.
1478    
1479     * Extensions/wms/layer.py: Added more documentation
1480     (WMSLayer.getFormats): New: Return list of supported image formats
1481     by the WMS server
1482     (WMSLayer.getLayers): New: Return the list of layer names
1483     supported by the WMS server
1484     (WMSLayer.getLayerTitle): New: Return the title of the named layer
1485     (WMSLayer.getWMSFormat): New: Return the image format that is used
1486     for WMS GetMap requests
1487     (WMSLayer.setWMSFormat): New: Set the image format that is used
1488     for WMS GetMap requests
1489     (WMSLayer.__init__): Move away from using only one layer to using
1490     a list of layers (unsorted at the moment, though).
1491     (WMSLayer.getVisibleLayers): New: Return the list of names for all
1492     visible layers
1493     (WMSLayer.setVisibleLayers): New: Set the list of names for all
1494     visible layers
1495    
1496     * Extensions/wms/wms.py: Moved the WMS layer into layer.py in
1497     order to establish a clean structure.
1498    
1499     * Extensions/wms/layer.py: Moved the WMS layer into a file on its
1500     own in order to establish a clean structure.
1501    
1502 joey 2174 2004-04-13 Martin Schulze <[email protected]>
1503    
1504     * Extensions/wms/parser.py (WMSCapabilitiesParser.grok): Added
1505     support for oldstyle (WMS 1.0 apparently) image format
1506     specification.
1507    
1508     * Extensions/wms/wms.py (WMSLayer.calcFormat): Reduce the list of
1509     supported graphic formats back to JPEG and BMP, PNG and others are
1510     too *cough* experimental... Sorry, I meant to filter this out
1511     before I committed this part. This should make the WMS extension
1512     run from CVS again.
1513     (wms_dialog): Reset an empty URL to None so that the subsequent
1514     program can depend on this, since the dialog will indeed return an
1515     empty URL, causing another declaration of love by Python.
1516    
1517     * Extensions/wms/parser.py (WMSCapabilitiesParser.getLayerBBox):
1518     Whenever a native BoundingBox request cannot be fulfilled, check
1519     whether the requested SRS is EPSG:3426, in which case return the
1520     LatLonBoundingBox values.
1521    
1522     * Extensions/wms/test/test_parser.py
1523     (TestWMSCapabilitiesParser.test_LayerSRS): Added a test for
1524     ignoring AUTO:* SRS.
1525     (TestWMSCapabilitiesParser.test_LatLonBoundingBoxes_as_bboxes):
1526     Added another test method to test whether the LatLonBoundingBox
1527     values will be returned if BoundingBox values are requested with
1528     SRS set to EPSG:3426.
1529    
1530     * Extensions/wms/parser.py (WMSCapabilitiesParser.peekLayers):
1531     Added rudimentary support for non-EPSG SRS, i.e. ignore them for
1532     the moment by placing them into a variable which is currently
1533     unused. Also test whether the EPSG SRS is numerical as it should
1534     be and add an error message if it is not.
1535    
1536     * Extensions/wms/test/sample.xml: Added AUTO:* SRS since they
1537     appear in the real world as well. Since we cannot handle them yet
1538     (OGCLib can't either), we will ignore them for the moment.
1539    
1540     * Extensions/wms/parser.py: Use a variable for denoting the sample
1541     filename
1542     (WMSCapabilitiesParser.peekLayers): Added support for error
1543     messages during grok(). They will be aggregated in an array and
1544     may be displayed later. We may have to add a classification
1545     "Warning" and "Error" to this. That requires more experience,
1546     though, since not every error may be lethal.
1547    
1548     * Thuban/UI/mainwindow.py (MainWindow.LayerShowTable): Raise the
1549     ShowTable() dialog/frame when the user attempts to display it
1550     while it has been opened before already and not closed again.
1551    
1552 joey 2161 2004-04-11 Martin Schulze <[email protected]>
1553    
1554     * Extensions/wms/infodialog.py: Adjusted the class documentation
1555    
1556     * Extensions/wms/wms.py (WMSLayer.__init__, WMSLayer.GetMapImg):
1557     Switch to using Thuban{Begin,End}BusyCursor instead of the pure
1558     wxWidgets variants.
1559     (WMSLayer.__init__): The epsg_id variable is named top_srs now.
1560    
1561     * Extensions/wms/infodialog.py: Added an information dialog that
1562     will display various information about the WMS current resource,
1563     so that additional information such as the title, the abstract,
1564     fees and access constraints can be displayed for the user if they
1565     are documented in the WMS XML.
1566    
1567 joey 2156 2004-04-10 Martin Schulze <[email protected]>
1568    
1569     * Extensions/wms/parser.py (WMSCapabilitiesParser.grok): Adjusted
1570     string handling. It's "foo".lower() and not lower(foo) without
1571     lower imported from strings or something.
1572    
1573     * Extensions/wms/wms.py (WMSLayer): Incorporated WMSCapabilities
1574     from capabilities.py and parser.py. Implement priority list for
1575     supported graphics formats, take care of wbmp != bmp. PNG, TIFF
1576     and GIF are supported here, but not yet by main Thuban. Hence,
1577     support for them may be removed later. Special contribution to
1578     usability: get wxWidgets to change the cursor when we're waiting
1579     for data from the network so the user won't start to worry. This
1580     causes a redrawing error/warning, though.
1581    
1582     * Extensions/wms/parser.py (WMSCapabilitiesParser.grok): Unlink
1583     the DOM object.
1584    
1585     2004-04-01 Martin Schulze <[email protected]>
1586    
1587     * Extensions/wms/capabilities.py: Adjusted documentation
1588     (WMSCapabilities.__init__): Improved documentation, fixed syntax
1589     (WMSCapabilities.saveCapabilities): Only catch IOError when
1590     handling files
1591     (WMSCapabilities.loadCapabilities): Only catch IOError when
1592     handling files
1593     __main__: corrected variable naming
1594     (WMSCapabilities.fetchCapabilities,loadCapabilities): Make this
1595     class a specialisation of WMSCapabilitiesParser as well. Also
1596     execute grok() after loading or fetching capabilities, if that
1597     went well, so that subsequent calls can already access the data.
1598     (WMSCapabilities.getVersion): Export the used version of the
1599     GetCapabilities request, so we can use it for subsequent calls,
1600     i.e. for GetMap requests.
1601     (WMSCapabilities.fetchCapabilities): Added proper error handling
1602     when the GetCapabilities request failed, so that the surrounding
1603     program can act accordingly.
1604    
1605 joey 2146 2004-03-30 Martin Schulze <[email protected]>
1606    
1607     * Extensions/wms/parser.py (WMSCapabilitiesParser.getLayerSRS):
1608     Adjusted the getLayerSRS method to return the list of SRSes
1609     extracted from <SRS> elements instead of <BoundingBox> elements.
1610     Added a bit of documentation as well.
1611     (WMSCapabilitiesParser.checkLayerSRS): Removed integrity test
1612     since it was only implemented due to a misunderstanding.
1613    
1614     * Extensions/wms/test/test_parser.py
1615     (TestWMSCapabilitiesParser.test_LayerSRS): Adjust the tests to
1616     reflect the corrected interpretation of the standard: i.e. a layer
1617     does not have to define a BoundingBox for all SRSes it supports.
1618     Hence the <SRS></SRS> specification is authoritative, not the list
1619     of BoundingBoxes.
1620     (TestWMSCapabilitiesParser.test_BoundingBoxes): Added a new test
1621     to ensure None is returned for a non-existing SRS.
1622     (TestWMSCapabilitiesParser.test_grok): Removed test_grok method
1623     since it is not applicable anymore. Listing more SRSes in <SRS>
1624     elements is valid according to the specs.
1625    
1626 bernhard 2140 2004-03-26 Bernhard Reiter <[email protected]>
1627 joey 2146
1628 bernhard 2140 * README: Nicer formatting of text. Improved descriptions.
1629     Reflected wxWidgets name change.
1630    
1631     * Thuban/UI/about.py: Extended copyright to 2004 and added
1632     information about the thuban-devel mailinglist.
1633    
1634 joey 2138 2004-03-24 Martin Schulze <[email protected]>
1635 joey 2120
1636 joey 2138 * Extensions/wms/capabilities.py: Renamed the class to contain
1637     'WMS', also added a linebreak where required
1638    
1639     * Extensions/wms/parser.py: Finally added the XML parser for the
1640     GetCapabilities response.
1641    
1642     * Extensions/wms/test/sample.xml: Adjusted the sample file so that
1643     <SRS> elements match the <BoundingBox> elements, except for the
1644     layer 'beschriftung'.
1645    
1646     * Extensions/wms/test/test_parser.py: Encode non-ascii strings
1647     since Python uses unicode strings internally, otherwise
1648     comparisons will fail. Removed tests for getLayerBBoxSRS() since
1649     the SRS will be calculated anyway and this method is obsoleted by
1650     getLayerSRS(). Denote SRS as strings and not as cardinal numbers.
1651     Move loading the sample file into the setUp method. Added a test
1652     for finding the integrity problem in the sample response.
1653     Improved formatting.
1654    
1655     * Extensions/wms/domutils.py: Added convenience routines for
1656     handling of Document Object Model (DOM) nodes.
1657    
1658     * Extensions/wms/test/test_domutils.py: Added a test for the
1659     domutils module
1660    
1661     2004-03-19 Martin Schulze <[email protected]>
1662    
1663 joey 2120 * Extensions/wms/test/test_parser.py (TestWMSCapabilitiesParser):
1664     Moved path detection and adding into a module of its own,
1665     adjustpath, which exports thubandir as main Thuban directory.
1666    
1667     * Extensions/wms/test/test_ogclib.py (TestWMSLib): Moved path
1668     detection and adding into a module of its own, adjustpath, which
1669     exports thubandir as main Thuban directory. Reorganised the
1670     module in order to support the SkipTest feature for Thuban test
1671     cases.
1672    
1673     * Extensions/wms/test/adjustpath.py: Moved path detection and
1674     adding into a module of its own.
1675    
1676 joey 2115 2004-03-18 Martin Schulze <[email protected]>
1677    
1678     * Extensions/wms/test/test_parser.py: Added another test for
1679     checking whether the WMS XML parser (to be implemented) returns
1680     the information we expect. This requires a sample WMS WML file
1681     (sample.xml) which has been extracted from the frida server and
1682     "improved" manually.
1683    
1684     * Extensions/wms/test/test_ogclib.py: Added legacy code to add the
1685     main Thuban directory to the path in order to be able to import
1686     random modules. Adjusted the PyOGCLib detection to reuse the
1687     information gathered. Also added a note about the PYTHONPATH
1688     environment variable.
1689    
1690     * Extensions/wms/test/test_ogclib.py: The format specification is
1691     a mime-type, not a graphic format, hence image/jpeg wou ld be the
1692     proper format and not JPEG. We'll also have to take care of the
1693     encoding of / as %2F.
1694    
1695 joey 2111 2004-03-16 Martin Schulze <[email protected]>
1696    
1697     * Extensions/wms/test/test_ogclib.py: Added a (hopefully)
1698     comprehensive test for the getMapURL method, built compare URLs
1699     according to the documentation in OGC 01-068r3
1700    
1701     * Extensions/wms/capabilities.py (WMSCapabilities): Added the
1702     class WMSCapabilities to manage capabilites, will incorporate
1703     parsing the capabilities response and provide details for other
1704     classes.
1705    
1706 bh 2105 2004-03-12 Bernhard Herzog <[email protected]>
1707    
1708 bh 2107 Support views in addition to normal tables in the postgis
1709     shapestore
1710    
1711     * Thuban/Model/postgisdb.py
1712     (PostGISShapeStore._fetch_table_information): Add a fallback for
1713     the case where the table name is not in the geometry_columns
1714     table. This is usually the case for views. Also, set
1715     self.shapestore here.
1716     (PostGISShapeStore.ShapeType): No need to query the database all
1717     the time. The shape type is now determined in
1718     _fetch_table_information
1719    
1720     * test/postgissupport.py (PostgreSQLServer.new_postgis_db)
1721     (PostgreSQLServer.get_static_data_db, PostGISDatabase.__init__):
1722     New parameter to specify views.
1723     (PostGISDatabase.has_data): Also compare the views. New views
1724     parameter
1725     (PostGISDatabase.initdb): Create the views.
1726     (PostgreSQLServer.get_default_static_data_db): Add the v_landmarks
1727     view
1728    
1729     * test/test_postgis_db.py
1730     (TestPostGISShapestorePointFromViews): New. Test a
1731     PostGISShapeStore with a view
1732     (TestPostGISShapestorePointOIDAsGIDColumn.setUp): Pass the name of
1733     the geometry_column explicitly to test whether that works
1734    
1735     2004-03-12 Bernhard Herzog <[email protected]>
1736    
1737 bh 2105 Final step for explicit id/geometry columns: Loading and saving
1738    
1739     * Resources/XML/thuban-1.1.dtd: New. Derived from thuban-1.0.dtd
1740     with the following changes:
1741     (dbshapesource): Two new attributes id_column and geometry_column
1742    
1743     * Thuban/Model/save.py (SessionSaver.write): Use the new dtd
1744     (SessionSaver.write_session): Use the new namespace
1745     (SessionSaver.write_data_containers): Write the new dbshapesource
1746     parameters
1747    
1748     * Thuban/Model/load.py (SessionLoader.__init__): New namespace for
1749     the new file format version
1750     (SessionLoader.start_dbshapesource): Handle the new db parameters
1751    
1752     * test/test_save.py: Update to the new dtd and namespace
1753     (SaveSessionTest.test_save_postgis): Update the NonConnectionStore
1754     mock object to provide a working IDColumn method.
1755    
1756     * test/test_load_1_0.py: New. Copy of the test_load.py before
1757     today's changes but with the round-trip tests removed.
1758    
1759     * test/test_load_0_9.py: Update doc-string.
1760    
1761     * test/test_load.py: Update all .thuban files to the new dtd and
1762     namespace.
1763     (TestPostGISLayer.file_contents): Add the new dbshapesource
1764     paramters
1765    
1766 bh 2100 2004-03-11 Bernhard Herzog <[email protected]>
1767    
1768 bh 2103 Next step for explicit id/geometry columns: User interaction
1769    
1770     * Thuban/UI/dbdialog.py (ChooseDBTableDialog.__init__): Rework how
1771     the dialog is constructed. Add combo boxes to select id and
1772     geometry column. Rename some instance variables.
1773     (ChooseDBTableDialog.GetTable): Return id and geometry column
1774     names
1775     (ChooseDBTableDialog.OnTableSelect): New. Event handler for
1776     selections in the table list
1777    
1778     * Thuban/UI/mainwindow.py (MainWindow.AddDBLayer): Use id_column
1779     and geometry_column
1780    
1781     * Thuban/Model/session.py (Session.OpenDBShapeStore): Add the new
1782     parameters for id_column and geometry column of PostGISShapeStore
1783     here as well.
1784    
1785     * Thuban/Model/postgisdb.py (type_map): Add ROWID psycog type.
1786     (_raw_type_map): New. Map raw PostgreSQL type ints to thuban types
1787     (PostGISConnection.GeometryTables): Use a better query to
1788     determine which relations in the database might be usable for
1789     shapestores. Now supports views as well but is more PostgreSQL
1790     specific
1791     (PostGISConnection.table_columns): New. Somewhat experimental
1792     method to let the db dialogs provide lists of columns to users so
1793     that they can select id and geometry columns.
1794     (PostGISTable.__init__): The default value of the id_column
1795     parameter is now None it still means "gid" effectively, though.
1796     (PostGISTable.IDColumn): New introspection method to return a
1797     column object for the id column
1798     (PostGISShapeStore.GeometryColumn): New introspection method to
1799     return a column object for the geometry column
1800    
1801     * test/test_postgis_db.py
1802     (TestPostGISConnection.test_gis_tables_non_empty):
1803     Removed. Subsumed by the new:
1804     (TestPostGISConnection.test_gis_tables_with_views_and_tables):
1805     New. Tes the GeometryTables and table_columns methods with actual
1806     tables and views.
1807     (PointTests.test_id_column, PointTests.test_geometry_column):
1808     New. tests for the new methods.
1809     (TestPostGISShapestorePoint.setUp)
1810     (TestPostGISShapestorePointSRID.setUp)
1811     (TestPostGISShapestorePointExplicitGIDColumn.setUp): Fill the
1812     instance variables needed by the new tests
1813    
1814     2004-03-11 Bernhard Herzog <[email protected]>
1815    
1816 bh 2100 * Thuban/UI/classgen.py (GenQuantilesPanel.GetList): The row
1817     numbers given to ReadValue are ordinals.
1818    
1819     2004-03-11 Bernhard Herzog <[email protected]>
1820    
1821     Elimiate the requirement for PostGIS tables to have a column
1822     called "gid".
1823    
1824     * Thuban/Model/postgisdb.py (PostGISTable.__init__): New parameter
1825     id_column to specify which column to use to identify rows. Also
1826     new instance variables id_column and quoted_id_column
1827     (PostGISTable.RowIdToOrdinal, PostGISTable.RowOrdinalToId)
1828     (PostGISTable.ReadRowAsDict, PostGISTable.ReadValue)
1829     (PostGISTable.SimpleQuery): Use the id column name provided to the
1830     constructor instead of "gid"
1831     (PostGISShapeStore.__init__): New parameter id_column analogously
1832     to PostGISTable.__init__. This parameter is simply passed through
1833     to the base class constructor
1834     (PostGISShapeStore._create_col_from_description): Fix typo in
1835     doc-string
1836     (PostGISShapeStore.Shape, PostGISShapeStore.AllShapes)
1837     (PostGISShapeStore.ShapesInRegion): Use the id column name
1838     provided to the constructor instead of "gid"
1839    
1840     * test/postgissupport.py
1841     (PostgreSQLServer.get_default_static_data_db): New static table
1842     landmarks_point_id with an id column != "gid. Update the comments
1843     a bit.
1844     (skip_if_addgeometrycolumn_does_not_use_quote_ident): Fix typo in
1845     doc-
1846     (upload_shapefile): New parameter gid_column to use a name other
1847     than "gid" for the column to store the shape ids
1848    
1849     * test/test_postgis_db.py (TableTests): New. Mixin-class
1850     containing all tests previously in TestPostGISTable. The actual
1851     tests are the same but the code is a bit more configurable to
1852     allow for different id columns etc.
1853     (TestPostGISTable): Derive from TableTests now for the actual
1854     tests.
1855     (TestPostGISTableExplicitGIDColumn): New. Like TestPostGISTable
1856     except that it the landmarks_point_id table to test the id_column
1857     parameter
1858     (PointTests): Extend the doc-string
1859     (TestPostGISShapestorePointExplicitGIDColumn)
1860     (TestPostGISShapestorePointOIDAsGIDColumn): New classes derived
1861     from PointTests to test the explicit id_column parameter. One
1862     tests with the name of the column holding the shape ids, the other
1863     uses PostgreSQL's OID column. For the latter a number of methods
1864     have to be overwritten to make them independent of the actual id
1865     values.
1866    
1867 silke 2095 2004-03-08 Silke Reimer <[email protected]>
1868    
1869     Update debian directory:
1870    
1871     * debian/changelog: Added new version.
1872     * deiban/rules: Updated management of patches (with cbds)
1873     * debian/control: Added cbds to dependencies
1874     * debian/patches/*: New. Adds better support for patches of thuban in
1875     debian
1876     * debian/menu: Syntax of menu changed slightly
1877     * debian/setup.py.patch: removed because it has been moved to
1878     debian/patechs/setup.py.patch
1879    
1880    
1881 bh 2094 2004-02-26 Bernhard Herzog <[email protected]>
1882    
1883     Create the Doc/technotes directory for text files with information
1884     for developers
1885    
1886     * Doc/technotes/README: New. README for the technotes
1887    
1888     * Doc/technotes/coding_guidelines.txt: New. Coding guidelines for
1889     Thuban
1890    
1891     * Doc/technotes/release_process.txt: New. Used to be
1892     HOWTO-Release. Now slightly adapted to technote formatting style.
1893    
1894     * HOWTO-Release: Removed. It's contents are now in
1895     Doc/technotes/release_process.txt
1896    
1897 bh 2089 2004-02-25 Bernhard Herzog <[email protected]>
1898    
1899     * libraries/thuban/wxproj.cpp (get_wx_version): New. Return the
1900     version of wxWindows the module was compiled with so we can check
1901     that against the wxPython version.
1902    
1903     * Thuban/version.py (thuban_branch, thuban_release): New variables
1904     controlling which and how Thuban versions are shown. See the
1905     comments for details.
1906     (verify_versions): Also check that the wx version that wxproj is
1907     compiled against matches that of the wxPython we use at runtime
1908    
1909 bh 2080 2004-02-20 Bernhard Herzog <[email protected]>
1910    
1911 bh 2087 * Extensions/wms/wms.py (epsg_code_to_projection): Use
1912     get_system_proj_file to read the epsg projections. The old way
1913     depended on the current directory being the top Thuban directory.
1914    
1915     2004-02-20 Bernhard Herzog <[email protected]>
1916    
1917 bh 2085 * Extensions/svgexport/test/test_svgmapwriter.py
1918     (TestVirtualDC.test_clippath): Remove a debug print
1919    
1920     2004-02-20 Bernhard Herzog <[email protected]>
1921    
1922 bh 2083 * Extensions/svgexport/__init__.py: New. Turn
1923     Extensions/svgexport into a package.
1924    
1925     * Extensions/svgexport/svgmapwriter.py: Reorder the imports and
1926     doc-string a bit. The doc-string must come first, otherwise it's
1927     not a doc-string. The __future__ import must be the first thing
1928     after the doc-string. Use only double quotes in doc-strings.
1929     Single quotes trip up emacs syntax highlighting if the text
1930     contains apostrophes.
1931    
1932     2004-02-20 Bernhard Herzog <[email protected]>
1933    
1934 bh 2080 * Extensions/svgexport/test/__init__.py,
1935     Extensions/svgexport/test/test_svgmapwriter.py: New. Initial test
1936     suite for svgexport
1937    
1938     * test/runtests.py (find_test_modules): New. Function with the
1939     module finding code from main.
1940     (main): Use find_test_modules to figure out the default test
1941     modules and take modules from Extensions.svgexport.test too.
1942    
1943 bh 2075 2004-02-19 Bernhard Herzog <[email protected]>
1944    
1945 bh 2077 * Thuban/UI/application.py (ThubanApplication.OnInit): Make sure
1946     the mainwindow has a reference to the map of the initial session.
1947     This fixes a bug introduced with the fix for RT#2245
1948    
1949     2004-02-19 Bernhard Herzog <[email protected]>
1950    
1951 bh 2075 * Extensions/svgexport/svgsaver.py,
1952     Extensions/svgexport/svgmapwriter.py,
1953     Extensions/svgexport/maplegend.py: Added again. This time in the
1954     correct place.
1955    
1956 bh 2070 2004-02-17 Bernhard Herzog <[email protected]>
1957    
1958 bh 2073 Fix for RT#2245
1959    
1960     * Thuban/UI/application.py (ThubanApplication.OnInit): Initialize
1961     instance variables before trying to create any windows. Creating
1962     windows can start an event loop if e.g. message boxes are popped
1963     up for some reason, and event handlers, especially EVT_UPDATE_UI
1964     may want to access things from the application.
1965     (ThubanApplication.maps_changed): The mainwindow may not have been
1966     created yet, so check whether it has been created before calling
1967     its methods
1968    
1969     * Thuban/UI/view.py (MapCanvas.OnIdle): Only try to redraw if we
1970     have a map
1971    
1972     2004-02-17 Bernhard Herzog <[email protected]>
1973    
1974 bh 2070 * test/test_svgmapwriter.py, Extensions/svgsaver.py,
1975     Extensions/svgmapwriter.py, Extensions/maplegend.py,
1976     extensions/svgexport/svgsaver.py,
1977     extensions/svgexport/svgmapwriter.py,
1978     extensions/svgexport/maplegend.py: Removed. These files were in
1979     the wrong places or didn't work at all.
1980    
1981 bh 2067 2004-02-16 Bernhard Herzog <[email protected]>
1982    
1983 bh 2069 * Thuban/UI/view.py (MapCanvas.Export): Remove accidentally added
1984     line
1985    
1986     2004-02-16 Bernhard Herzog <[email protected]>
1987    
1988 bh 2067 * Thuban/UI/view.py (MapCanvas.Export): Avoid UnboundLocalError.
1989    
1990 mrechtie 2064 2004-02-15 Markus Rechtien <[email protected]>
1991    
1992     * Extensions/svgexport/svgmapwriter.py: New. Adds the capability
1993     to write a session to a file in SVG format.
1994     * Extensions/svgexport/svgsaver.py: New. Uses svgmapwriter.py
1995     to write a SVG map of a session.
1996     * Extensions/svgexport/maplegend: New. Writes a basic maplegend
1997     in SVG format for the current session.
1998    
1999 bh 2062 2004-02-13 Bernhard Herzog <[email protected]>
2000    
2001     * Thuban/UI/mainwindow.py (MainWindow.AddDBLayer): When the layer
2002     can't be created, return immediately after displaying the error
2003     message.
2004    
2005 bh 2060 2004-02-11 Bernhard Herzog <[email protected]>
2006    
2007     Handle postgis tables with more than one geometry column.
2008    
2009     * Thuban/Model/postgisdb.py
2010     (PostGISTable._fetch_table_information): Delegate the creation of
2011     column objects to a different method so that we can extend that in
2012     derived classes
2013     (PostGISTable._create_col_from_description): New. Column object
2014     creation part of _fetch_table_information
2015     (PostGISShapeStore._create_col_from_description): New. Extend
2016     inherited method to handle geometry columns
2017     (PostGISShapeStore.__init__): New parameter geometry_column to
2018     specify which geometry column to use. Optional but mandatory for
2019     tables with more than one geometry column
2020     (PostGISShapeStore._fetch_table_information): Also use the name of
2021     the geometry column when looking for the srid
2022     (PostGISShapeStore.ShapeType): Also use the name of the geometry
2023     column when looking for the shape type
2024    
2025     * test/test_save.py (SaveSessionTest.test_save_postgis): Adapt
2026     NonConnectionStore to changes in the PostGISShapeStore
2027    
2028     * test/test_postgis_db.py
2029     (TestPostGISSpecialCases.test_shapestore_two_geom_cols): Test
2030     PostGISShapeStore with tables having two geometry columns.
2031    
2032 bh 2058 2004-02-10 Bernhard Herzog <[email protected]>
2033    
2034     Fix some postgis problems. What remains to be done is real
2035     handling of SRIDs as they affect how reprojection is done
2036    
2037     * Thuban/Model/postgisdb.py (quote_identifier): Fix typo in
2038     doc-string
2039     (PostGISShapeStore._fetch_table_information): New. Extend
2040     inherited method to retrieve srid
2041     (PostGISShapeStore.BoundingBox): Handle tables without data.
2042     extent yields NULL for those
2043     (PostGISShapeStore.ShapesInRegion): Use the srid of the table.
2044    
2045     * test/test_postgis_db.py
2046     (TestPostGISSpecialCases.test_shapestore_empty_table): New test
2047     for the special case of a table without any data
2048     (TestPostGISShapestorePointSRID): New class with tests for a table
2049     that uses srids
2050     (PolygonTests): Fix a doc-string typo
2051    
2052     * test/postgissupport.py (PostGISDatabase.__init__): New parameter
2053     reference_systems with a specification of spacial reference
2054     systems to create in the new db.
2055     (PostgreSQLServer.new_postgis_db)
2056     (PostgreSQLServer.get_static_data_db): New parameter
2057     reference_systems to be passed through ultimately to
2058     PostGISDatabase. In new_postgis_db also check whether an existing
2059     db already has the right srids
2060     (PostgreSQLServer.get_default_static_data_db): Add srids and a
2061     table that uses srids
2062     (PostGISDatabase.initdb): Create the entries for the reference
2063     systems
2064     (PostGISDatabase.has_data): Add reference_systems parameter to
2065     check for those too
2066     (upload_shapefile): New parameter srid to create tables with a
2067     specific srid
2068    
2069 frank 2055 2004-02-06 Frank Koormann <[email protected]>
2070    
2071     * po/pt_BR.po: Fixed charset
2072    
2073 frank 2054 2004-02-05 Frank Koormann <[email protected]>
2074    
2075     * po/pt_BR.po: Fixed format string for error message, missing %s
2076     added (Thuban/UI/application.py:273)
2077    
2078 frank 2053 2004-02-03 Frank Koormann <[email protected]>
2079    
2080     First version of Portuguese (Brazilian) translation
2081    
2082     * po/pt_BR.po: New, translation of pot (2004-01-15 16:07+0300) for
2083     Brazilian Portuguese by Eduardo Patto Kanegae.
2084    
2085     * Thuban/UI/about.py (About.__init.py__): Added Eduardo to the list of
2086     translators.
2087    
2088    
2089 frank 2052 2004-01-22 Frank Koormann <[email protected]>
2090    
2091     * Doc/manual/thuban-manual.xml: Added section on installation of
2092     Thuban under Win32 systems. Fixed image path references in the postgis
2093     section. Some minor source formattings.
2094    
2095 frank 2051 2004-01-21 Frank Koormann <[email protected]>
2096    
2097     Make Thuban remember path selections (at least for one application run).
2098    
2099     * Thuban/UI/application.py (Application.OnInit): Initialize path as a
2100     attribute of application object. Path is a dictionary of
2101     strings, currently with the items "data" and "projection".
2102     (Application.SetPath): New, stores path for the specified item.
2103     (Application.Path): New, return path for the specified item.
2104    
2105     * Thuban/UI/mainwindow.py
2106     (MainWindow.OpenSession, MainWindow.SaveSessionAs,
2107     MainWindow.AddLayer, MainWindow.AddRasterLayer,
2108     MainWindow.TableOpen): Access "data" path information of the
2109     application.
2110    
2111     * Thuban/UI/projdialog.py (ProjFrame._OnImport, ProjFrame._OnExport):
2112     Access "projection" path information of the application.
2113    
2114 bh 2048 2004-01-05 Bernhard Herzog <[email protected]>
2115    
2116 bh 2050 * po/ru.po: Updated translations from Alex Shevlakov
2117    
2118     2004-01-05 Bernhard Herzog <[email protected]>
2119    
2120 bh 2048 * po/Makefile, po/README: Move the description of how to generate
2121     the translation statistics to the README.
2122    
2123 bh 2042 2003-12-23 Bernhard Herzog <[email protected]>
2124    
2125 bh 2045 * NEWS: Update for 1.0.0
2126    
2127     * po/it.po: Another update from Maurizio Napolitano
2128    
2129     2003-12-23 Bernhard Herzog <[email protected]>
2130    
2131 bh 2042 * po/it.po: Updated translation from Maurizio Napolitano
2132    
2133     2003-12-23 Bernhard Herzog <[email protected]>
2134    
2135     * Thuban/UI/join.py (JoinDialog.__init__): Mark one more string
2136     for translation
2137    
2138     * Thuban/UI/mainwindow.py (MainWindow.TableRename)
2139     (MainWindow.RenameMap, MainWindow.RenameLayer): Mark some more
2140     strings for translation
2141    
2142     * po/de.po: Update with the newly marked strings.
2143    
2144 bh 2033 2003-12-22 Bernhard Herzog <[email protected]>
2145    
2146 bh 2039 * HOWTO-Release: Fix the places where version numbers have to be
2147     updated
2148    
2149     2003-12-22 Bernhard Herzog <[email protected]>
2150    
2151 bh 2037 * setup.py (setup call): 1.0.0, yeah!
2152    
2153     * Thuban/version.py (longversion): 1.0.0, yeah!
2154    
2155     * Thuban/Model/load.py (SessionLoader.__init__): Accept the
2156     1.0.0 namespace too
2157    
2158     * Thuban/Model/save.py (SessionSaver.write_session): Save with
2159     1.0.0 namespace
2160    
2161     * test/test_load.py (LoadSessionTest.dtd)
2162     (TestSingleLayer.file_contents)
2163     (TestNonAsciiColumnName.file_contents)
2164     (TestLayerVisibility.file_contents)
2165     (TestClassification.file_contents, TestLabels.file_contents)
2166     (TestLayerProjection.file_contents)
2167     (TestRasterLayer.file_contents, TestJoinedTable.file_contents)
2168     (TestLabelLayer.file_contents, TestPostGISLayer.file_contents)
2169     (TestPostGISLayerPassword.file_contents)
2170     (TestLoadError.file_contents, TestLoadError.test): Update for
2171     1.0.0 namespace
2172    
2173     * test/test_save.py (SaveSessionTest.dtd)
2174     (SaveSessionTest.testEmptySession)
2175     (SaveSessionTest.testSingleLayer)
2176     (SaveSessionTest.testLayerProjection)
2177     (SaveSessionTest.testRasterLayer)
2178     (SaveSessionTest.testClassifiedLayer)
2179     (SaveSessionTest.test_dbf_table)
2180     (SaveSessionTest.test_joined_table)
2181     (SaveSessionTest.test_save_postgis): Update for 1.0.0 namespace
2182    
2183     2003-12-22 Bernhard Herzog <[email protected]>
2184    
2185 bh 2035 * Thuban/Model/load.py (SessionLoader.start_label): Make sure the
2186     alignment flags are byte strings not unicode and that they have
2187     valid values
2188    
2189     * test/test_load.py (TestLabelLayer): New. Test loading (and
2190     indirectly saving) of maps with labels.
2191    
2192     2003-12-22 Bernhard Herzog <[email protected]>
2193    
2194 bh 2033 * Thuban/UI/tableview.py (TableGrid.OnDestroy)
2195     (TableGrid.__init__): Handle EVT_WINDOW_DESTROY in the grid to
2196     unsubscribe all subscribers.
2197     (LayerTableFrame.OnDestroy): Do not unsubscribe any messages from
2198     self.grid since it may already have been destroyed.
2199     Fixes RT #2256
2200    
2201 bh 2031 2003-12-19 Bernhard Herzog <[email protected]>
2202    
2203     * po/fr.po, po/es.po: Updated translations from Daniel Calvelo
2204    
2205 bh 2028 2003-12-16 Bernhard Herzog <[email protected]>
2206 silke 2029
2207     * debian/bitmappath.patch, debian/setup.py.patch:
2208     added to ensure compliance with FHS for debian
2209     * debian/rules, debian/changelog:
2210     added patches in rules to ensure compliance with FHS for debian
2211 bh 2028
2212 silke 2029 2003-12-16 Bernhard Herzog <[email protected]>
2213    
2214 bh 2028 * po/Makefile (mo): Make the output a bit nicer so that it prints
2215     statistics about the translations. Add a comment how produce even
2216     nicer statistics with sed.
2217    
2218 frank 2026 2003-12-09 Frank Koormann <[email protected]>
2219    
2220     * Resources/Projections/defaults.proj:
2221     French projection sample with correct accents (UNICODE).
2222    
2223 bh 2025 2003-12-05 Bernhard Herzog <[email protected]>
2224    
2225     * MANIFEST.in: Add the devtools directory
2226    
2227     * setup.py (setup call): Use license instead of licence. This
2228     silences a deprecation warning on Python 2.3
2229    
2230 frank 2022 2003-12-05 Frank Koormann <[email protected]>
2231    
2232 frank 2023 Documentation synced with 1.0rc1
2233    
2234     * Doc/manual/thuban-manual.xml:
2235     Minor formatting changes and references to database layers .
2236     Introduction.Internationalization: New section on i18n.
2237     MapManagement.AddingandRemovingLayers: Added item on database layers.
2238     MapManagement.TheLegend: Added section and screenshot on popup menu.
2239     ProjectionManagement: Updated screenshot and sentence on EPSG.
2240     Appendix.SupportedDataSources: Added PostGIS.
2241     Appendix.WorkingwithPostGIS: New section.
2242    
2243     * Doc/manual/images/6_projection.png: Updated screenshot including
2244     EPSG checkboxes.
2245    
2246     * Doc/manual/images/3_5_popup_menu.png: New, popup menu screenshot.
2247    
2248     * Doc/manual/images/app_postgis_add_layer.png,
2249     Doc/manual/images/app_postgis_db_add.png,
2250     Doc/manual/images/app_postgis_db_management.png:
2251     New screenshots focussing on database layers
2252    
2253     2003-12-05 Frank Koormann <[email protected]>
2254    
2255 frank 2022 * Thuban/UI/projdialog.py (load_user_proj): If user.proj is missing
2256     write warning to stderr instead of rising a warning dialog
2257    
2258 bh 2016 2003-12-03 Bernhard Herzog <[email protected]>
2259    
2260 bh 2021 Fix for RT #2243
2261    
2262 bh 2020 * Thuban/UI/mainwindow.py (MainWindow.has_selected_shape_layer):
2263     New. Like has_selected_layer but for shape layers only
2264     (_has_selected_shape_layer): New. Like _has_selected_layer but for
2265     shape layers only
2266     (layer_show_table command, layer_jointable command): Use these
2267     commands should only be available for shape layers
2268    
2269     2003-12-03 Bernhard Herzog <[email protected]>
2270    
2271 bh 2018 * Thuban/UI/mainwindow.py (MainWindow.Unsubscribe): Deal with
2272     publishers that are wx objects and may have been destroyed by wx
2273     already. Fixes RT #2242.
2274    
2275     2003-12-03 Bernhard Herzog <[email protected]>
2276    
2277 bh 2016 * po/ru.po: Updates from Alex Shevlakov
2278    
2279 silke 2013 2003-12-03 Silke Reimer <silkeintevation.de>
2280    
2281     * debian/control, debian/changelog: Added gdal-support to
2282     debian package, updated to new thuban version
2283    
2284    
2285 bh 2012 2003-12-03 Bernhard Herzog <[email protected]>
2286    
2287     * Thuban/Lib/version.py: New. Module for version number
2288     manipulations. The version of make_tuple here also deals better
2289     with more unusual version number strings, such as e.g.
2290     "1.2+cvs20031111"
2291    
2292     * Thuban/version.py (make_tuple): Removed. It's now in
2293     Thuban.Lib.version. Use that implementation instead.
2294    
2295     * test/test_lib_version.py: New. Tests for Thuban/Lib/version.py
2296    
2297 bh 2005 2003-12-02 Bernhard Herzog <[email protected]>
2298    
2299 bh 2010 * MANIFEST.in: Add debian files
2300    
2301 bh 2008 * setup.py (setup call): Add packages for the Extensions so that
2302     they're installed too
2303     (data_files): Add READMEs and sample data from some Extensions
2304    
2305     * NEWS: Add note about the extensions in binary packages
2306    
2307     2003-12-02 Bernhard Herzog <[email protected]>
2308    
2309 bh 2005 * Thuban/Model/save.py (SessionSaver.write_session): Save files
2310     with the thuban-1.0rc1
2311    
2312     * Thuban/Model/load.py (SessionLoader.__init__): Recognize the
2313     thuban-1.0rc1 namespace too
2314    
2315     * test/test_save.py (SaveSessionTest.dtd)
2316     (SaveSessionTest.testEmptySession)
2317     (SaveSessionTest.testSingleLayer)
2318     (SaveSessionTest.testLayerProjection)
2319     (SaveSessionTest.testRasterLayer)
2320     (SaveSessionTest.testClassifiedLayer)
2321     (SaveSessionTest.test_dbf_table)
2322     (SaveSessionTest.test_joined_table)
2323     (SaveSessionTest.test_save_postgis): Update to thuban-1.0rc1
2324     namespace
2325    
2326     * test/test_load.py (LoadSessionTest.dtd): Update to thuban-1.0rc1
2327     namespace
2328     (TestSingleLayer.file_contents)
2329     (TestNonAsciiColumnName.file_contents)
2330     (TestLayerVisibility.file_contents)
2331     (TestClassification.file_contents, TestLabels.file_contents)
2332     (TestLayerProjection.file_contents)
2333     (TestRasterLayer.file_contents, TestJoinedTable.file_contents)
2334     (TestPostGISLayer.file_contents)
2335     (TestPostGISLayerPassword.file_contents)
2336     (TestLoadError.file_contents, TestLoadError.test): Update to
2337     thuban-1.0rc1 namespace
2338    
2339 bh 1996 2003-12-01 Bernhard Herzog <[email protected]>
2340    
2341 bh 2003 * setup.py (proj4_prefix, wx_prefix, gdal_prefix): Fix these for
2342     nt to better match Intevation's current w32 setup
2343    
2344 bh 2001 * HOWTO-Release: Add note about updating MANIFEST.in
2345    
2346     * MANIFEST.in: Add the Extensions
2347    
2348 bh 1998 * NEWS: Update for 1.0rc1
2349    
2350     2003-12-01 Bernhard Herzog <[email protected]>
2351    
2352 bh 1996 * Thuban/UI/mainwindow.py (MainWindow.AddLayer): Change the wild
2353     cards for the dialog so that shapefiles ending in all uppercase
2354     SHP are listed too
2355    
2356 bh 1988 2003-11-28 Bernhard Herzog <[email protected]>
2357    
2358 bh 1996 * Thuban/version.py (longversion): Update to 1.0rc1
2359    
2360     * setup.py (setup call): Update version to 1.0rc1. Use the
2361     [email protected] email address as author email instead of my
2362     personal one.
2363    
2364     2003-11-28 Bernhard Herzog <[email protected]>
2365    
2366 bh 1992 * po/de.po: Update german translation.
2367    
2368     2003-11-28 Bernhard Herzog <[email protected]>
2369    
2370 bh 1990 Unify the filenames stored in .thuban files so that the .thuban
2371     files are more platform independend
2372    
2373     * Thuban/Model/save.py (unify_filename): New. Unify filenames so
2374     that they can be used on both windows and unix
2375     (SessionSaver.prepare_filename): New. Handle all filename
2376     transformations for filenames stored in the thuban file
2377     (SessionSaver.write_data_containers, SessionSaver.write_layer):
2378     Use prepare_filename
2379    
2380     * test/test_save.py (SaveSessionTest.testSingleLayer)
2381     (SaveSessionTest.testLayerProjection)
2382     (SaveSessionTest.testRasterLayer)
2383     (SaveSessionTest.testClassifiedLayer)
2384     (SaveSessionTest.test_dbf_table)
2385     (SaveSessionTest.test_joined_table): Filenames are always stored
2386     with slashes on all currently supported platforms so adapt all
2387     tests to this
2388    
2389     * test/test_load.py (LoadSessionTest.filenames): With the new
2390     filename scheme the filenames in the tests should be
2391     understandable on all currently supported platforms so we turn
2392     this into an empty list because we don't have to normalize them
2393     anymore
2394    
2395     2003-11-28 Bernhard Herzog <[email protected]>
2396    
2397 bh 1988 * test/test_layer.py (TestLayer.test_arc_layer_with_projection):
2398     Add the ellipsoid to the projection since some Proj versions
2399     complain if it's missing.
2400    
2401 bh 1984 2003-11-27 Bernhard Herzog <[email protected]>
2402    
2403     Corect some bounding box projection problems
2404    
2405     * Thuban/Model/proj.py (Projection.InverseBBox): New. Inverse
2406     version of ForwardBBox
2407     (Projection._transform_bbox): New. common implementation of
2408     ForwardBBox and InverseBBox
2409     (Projection.ForwardBBox): Use _transform_bbox.
2410    
2411     * test/test_proj.py (TestProjection.test): Add test for
2412     InverseBBox
2413    
2414     * Thuban/Model/layer.py (Layer.LatLongBoundingBox)
2415     (Layer.ShapesBoundingBox, RasterLayer.LatLongBoundingBox): Use the
2416     new InverseBBox method to determine the unprojected bounding box
2417     (Layer.ShapesInRegion): Use the ForwardBBox method to project the
2418     bbox.
2419    
2420     * test/test_layer.py (TestLayer.test_point_layer_with_projection):
2421     Removed.
2422     (TestLayer.test_arc_layer_with_projection): New. This test is
2423     better able to test whether bounding boxes are projected correctly
2424     than test_point_layer_with_projection
2425    
2426 bh 1986 * Thuban/UI/viewport.py (ViewPort.map_projection_changed): Use
2427     InverseBBox to unproject bboxes
2428    
2429 bh 1975 2003-11-25 Bernhard Herzog <[email protected]>
2430    
2431 bh 1981 * Thuban/UI/about.py (About.__init__): Make sure we have ASCII
2432     source code.
2433    
2434     2003-11-25 Bernhard Herzog <[email protected]>
2435    
2436 bh 1979 * Thuban/Model/layer.py (Layer.__getattr__): Removed. It was only
2437     there for backwards compatibility and all code relying on that
2438     should have been updated by now.
2439    
2440     2003-11-25 Bernhard Herzog <[email protected]>
2441    
2442 bh 1977 * test/test_load.py (TestClassification.test): Add the missing
2443     round trip test.
2444     (TestClassification.file_contents): Update to the newest file
2445     format
2446    
2447     2003-11-25 Bernhard Herzog <[email protected]>
2448    
2449 bh 1975 Add very experimental (and possibly dangerous) extension to draw
2450     polygons:
2451    
2452     * Extensions/drawshape/README: New. Brief installation
2453     instructions
2454    
2455     * Extensions/drawshape/drawshape.py: New. Implementation of the
2456     drawshape extensions
2457    
2458     * Extensions/drawshape/patch.diff: Patch to apply before the
2459     extension can be used.
2460    
2461 bh 1971 2003-11-24 Bernhard Herzog <[email protected]>
2462    
2463 bh 1973 * Thuban/Model/data.py (ShapefileStore._open_shapefile)
2464     (ShapefileStore.__init__): Factor opening the shapefile into a
2465     separate method (the new _open_shapefile). This makes the code a
2466     bit more readable but the real reason is that it makes some evil
2467     hacks easier. :-)
2468    
2469     2003-11-24 Bernhard Herzog <[email protected]>
2470    
2471 bh 1971 * Thuban/Model/load.py (SessionLoader.check_attrs): If no
2472     converter is specified for an attribute assume it's a string
2473     containing only Latin1 characters. Update doc-string accordingly.
2474     This change should fix many places where unicode objects might
2475     accidentally enter Thuban.
2476    
2477     * test/test_load.py (TestNonAsciiColumnName): New test to check
2478     what happens with column names in DBF files that contain non-ascii
2479     characters
2480    
2481 bh 1969 2003-11-21 Bernhard Herzog <[email protected]>
2482    
2483     Enable the experimental attribute editing again and introduce a
2484     command line switch to actually activate it
2485    
2486     * Thuban/UI/main.py (options): New. Container for options set on
2487     the commmand line
2488     (main): Add the --enable-attribute-editing flag.
2489    
2490     * Thuban/UI/identifyview.py (IdentifyView.__init__): If attribute
2491     editing is enabled use the grid ctrl which allows editing of the
2492     values
2493    
2494     * Thuban/Model/transientdb.py (AutoTransientTable.write_record):
2495     New. Just delegate this to the underlying table.
2496    
2497 bh 1967 2003-11-20 Bernhard Herzog <[email protected]>
2498    
2499     * test/test_proj.py (ProjFileReadTests.test_read_unreadable_file):
2500     Skip this test if run under non-posix systems since it only works
2501     there
2502    
2503 bh 1960 2003-11-19 Bernhard Herzog <[email protected]>
2504    
2505 bh 1965 * Thuban/Model/resource.py: Rework the way gdal support is
2506     determined so that we can give a reason in the about why gdal is
2507     not supported.
2508     (gdal_support_status): New. Variable holding a string with the
2509     reason for no gdal support
2510    
2511     * Thuban/UI/about.py (About.__init__): Add the reason why gdal is
2512     not supported to the message
2513    
2514     2003-11-19 Bernhard Herzog <[email protected]>
2515    
2516 bh 1963 Remove the old table interface and its test cases
2517    
2518     * Thuban/Model/table.py (OldTableInterfaceMixin): Removed.
2519     (DBFTable, MemoryTable): Do not derive from OldTableInterfaceMixin
2520     anymore
2521    
2522     * Thuban/Model/transientdb.py (TransientTableBase)
2523     (AutoTransientTable): Do not derive from OldTableInterfaceMixin
2524     anymore
2525    
2526     * test/test_table.py: Removed since the old interface it tests is
2527     gone.
2528    
2529     * test/runtests.py (main): The old table interface is gone and
2530     with it the deprecation warnings so remove the code that turns
2531     these warnings into errors
2532    
2533     2003-11-19 Bernhard Herzog <[email protected]>
2534    
2535 bh 1960 * test/test_table.py: Revert to revision 1.5 again. Changing the
2536     tests to use the new table interface is completely wrong since the
2537     whole purpose of the tests in this module is to test the old
2538     interface.
2539    
2540 bh 1954 2003-11-18 Bernhard Herzog <[email protected]>
2541    
2542 bh 1958 * Thuban/Model/postgisdb.py (PostGISConnection.MatchesParameters):
2543     New. Test whether the connection matches a set of connection
2544     parameters
2545    
2546     * Thuban/UI/dbdialog.py (DBFrame.conns_changed): Fix doc-string
2547     (DBFrame.OnAdd): Use the new MatchesParameters method when looking
2548     for existing connections with the same parameters and break out of
2549     the loop correctly.
2550    
2551     * test/test_postgis_db.py (TestBriefDescription)
2552     (TestPostGISSimple.test_brief_description): Rename
2553     TestBriefDescription to TestPostGISSimple and the test method to
2554     test_brief_description so that we can add more test methods.
2555     (TestPostGISSimple.test_matches_parameters): New. Test the new
2556     MatchesParameters method
2557    
2558     2003-11-18 Bernhard Herzog <[email protected]>
2559    
2560 bh 1960 * Thuban/Lib/connector.py (Publisher): Introduce a new flag,
2561 bh 1954 _was_destroyed, to indicate whether an publisher instance has
2562     already been destroyed.
2563     (Publisher.Unsubscribe): Only disconnect if the publisher has not
2564     been destroyed yet.
2565     (Publisher.Destroy): Set the _was_destroyed flag to true.
2566    
2567     * test/test_connector.py
2568     (TestPublisher.test_unsubscribe_after_destroy): New. Test that
2569     calling Unsubscribe after Destroy doesn't raise an exception
2570    
2571 bh 1951 2003-11-14 Bernhard Herzog <[email protected]>
2572    
2573     * Thuban/UI/identifyview.py (IdentifyView.selected_shape): Fix
2574     typo in doc-string
2575    
2576 bh 1949 2003-11-13 Bernhard Herzog <[email protected]>
2577    
2578     Quote table and column names properly for postgis.
2579    
2580     * Thuban/Model/postgisdb.py (quote_identifier): New. Function to
2581     quote an identifier for use in an sql statement
2582     (PostGISColumn.__init__): Add the quoted_name attribute
2583     (PostGISTable.__init__): New instance variable quoted_tablename
2584     (PostGISTable._fetch_table_information): Use the quoted table
2585     name. New isntance variable quoted_geo_col with a quoted version
2586     of geometry_column
2587     (PostGISTable.NumRows, PostGISTable.RowIdToOrdinal)
2588     (PostGISTable.RowOrdinalToId): Use the quoted table name
2589     (PostGISTable.ReadValue, PostGISTable.ValueRange)
2590     (PostGISTable.UniqueValues, PostGISTable.SimpleQuery)
2591     (PostGISShapeStore.BoundingBox, PostGISShapeStore.Shape)
2592     (PostGISShapeStore.AllShapes, PostGISShapeStore.ShapesInRegion):
2593     Use quoted table and column names
2594    
2595     * test/test_postgis_db.py (TestPostGISSpecialCases)
2596     (TestPostGISIgnoredColumns): Rename the class to
2597     TestPostGISSpecialCases because that better describes the new
2598     cases
2599     (TestPostGISSpecialCases.test_unsupported_types)
2600     (TestPostGISSpecialCases.test): Rename the method to
2601     test_unsupported_types because we need a more descriptive name now
2602     that there are more methods
2603     (TestPostGISSpecialCases.test_table_name_quoting)
2604     (TestPostGISSpecialCases.test_column_name_quoting)
2605     (TestPostGISSpecialCases.test_shapestore_name_quoting): New test
2606     cases to test quoting of table and column names in PostGISTable
2607     and PostGISShapeStore
2608    
2609     * test/postgissupport.py
2610     (skip_if_addgeometrycolumn_does_not_use_quote_ident): New. Skip if
2611     AddGeometryColumn desn't support table or column names with sapces
2612     or double quotes
2613    
2614 jan 1945 2003-11-12 Jan-Oliver Wagner <[email protected]>
2615    
2616     * Extensions/wms/__init__.py: New: Init to make this
2617     directory a package.
2618    
2619     * Extensions/wms/wms.py: New: Provide layers via OGC WMS.
2620    
2621 bh 1932 2003-11-11 Bernhard Herzog <[email protected]>
2622    
2623 bh 1942 * Thuban/Model/resource.py (EPSG_DEPRECATED_PROJ_FILE): New.
2624     Constant for the file woth deprecated epsg projections
2625     (get_system_proj_file): Update doc-string
2626    
2627     * Thuban/UI/projdialog.py (ProjFrame.build_dialog): Add a space
2628     above the EPS widgets, introduce a check box for the deprecated
2629     eps projections and a label for the epsg widgets
2630     (ProjFrame._OnShowEPSG): Handle the deprecated EPSG projections
2631     too
2632    
2633     2003-11-11 Bernhard Herzog <[email protected]>
2634    
2635 bh 1939 Avoid warnings when run under Python 2.3
2636    
2637     * Thuban/UI/baserenderer.py (BaseRenderer.draw_point_shape)
2638     (BaseRenderer.draw_label_layer): Coordinates must be ints.
2639    
2640     * Thuban/UI/renderer.py (MapRenderer.make_point): Turn this into a
2641     real method so that we can convert to int.
2642     (MapRenderer.label_font): The font size mist be an int.
2643    
2644     * Thuban/UI/common.py (Color2wxColour): The color values must be
2645     ints. Also, remove the unnecessary asserts.
2646    
2647     * test/test_load_0_8.py (TestUnicodeStrings.file_contents)
2648     (TestUnicodeStrings.test): Python source code should not contain
2649     non-ascii characters unless an encoding is specified in the file.
2650     Therefore use \x escapes in the string literals for non-ascii
2651     characters.
2652    
2653     2003-11-11 Bernhard Herzog <[email protected]>
2654    
2655 bh 1934 * Thuban/Model/resource.py (get_system_proj_file): Add a filename
2656     parameter so that this function can be used for all proj files in
2657     Resource/Projections
2658     (DEFAULT_PROJ_FILE, EPSG_PROJ_FILE): New. Predefined filenames for
2659     get_system_proj_file
2660    
2661     * Thuban/UI/projdialog.py (ProjFrame.__init__): Instead of one
2662     ProjFile self.__sysProjFile use a dictionary of system ProjFile
2663     objects self._sys_proj_files
2664     (ProjFrame.build_dialog): Adapt to the new changes in the
2665     ProjectionList constructor. Add a check button to toggle whether
2666     EPSG projections are shown
2667     (ProjFrame._OnShowEPSG): New. Handler for the epsg check button
2668     events.
2669     (ProjFrame.load_user_proj, ProjFrame.load_system_proj): Only show
2670     the busy cursor if the files have not yet been loaded by the
2671     dialog.
2672     (ProjFrame.load_system_proj): Add a parameter for the name of the
2673     proj file. Maintain the dictionary of system projections
2674     self._sys_proj_files
2675    
2676     * Thuban/UI/projlist.py (ProjectionList): Merge the system_projs,
2677     user_projs parameters into one parameter proj_files which is a
2678     list of proj files.
2679     (ProjectionList._subscribe_proj_files)
2680     (ProjectionList._unsubscribe_proj_files): New. Move
2681     subscription/unsubscription of projfile messages to separate
2682     methods
2683     (ProjectionList.Destroy): The unsubscribe is now done in
2684     _unsubscribe_proj_files
2685     (ProjectionList.update_projections): We now have a list of proj
2686     file objects
2687     (ProjectionList.SetProjFiles): New method to set a new list of
2688     proj file objects
2689    
2690     * test/test_proj.py (ProjFileReadTests.test_get_system_proj_file):
2691     Specify explicitly which system proj file to load.
2692    
2693     2003-11-11 Bernhard Herzog <[email protected]>
2694    
2695 bh 1932 * Thuban/Model/load.py (SessionLoader.Destroy): New. Clear all
2696     instance variables to cut cyclic references. The GC would have
2697     collected the loader eventually but it can happen that it doesn't
2698     run at all until thuban is closed (2.3 but not 2.2 tries a bit
2699     harder and forces a collection when the interpreter terminates)
2700     (load_session): Call the handler's Destroy method to make sure
2701     that it gets garbage collected early. Otherwise it will be
2702     collected very late if at all and it holds some references to e.g.
2703     shapestores and the session which can lead to leaks (of e.g. the
2704     temporary files)
2705    
2706     * test/test_load.py (TestSingleLayer.test_leak): New. test for the
2707     resource leak in load_session
2708    
2709 bh 1929 2003-11-10 Bernhard Herzog <[email protected]>
2710    
2711     * Thuban/UI/baserenderer.py: Add a way to specify how layers in
2712     extensions are to be rendered.
2713     (_renderer_extensions): New. List with renderer for layers in
2714     extensions
2715     (add_renderer_extension): New. Add a renderer extension
2716     (init_renderer_extensions): New. Init the renderer extensions
2717     (BaseRenderer.render_map_incrementally): Search
2718     _renderer_extensions for how to draw unknown layer types
2719     (BaseRenderer.draw_raster_data): Add format parameter so that
2720     formats other than BMP can be drawn
2721     (BaseRenderer.draw_raster_layer): Pass an explicit format to
2722     draw_raster_data
2723    
2724     * Thuban/UI/renderer.py (raster_format_map): New. Mapping form the
2725     strings of the format parameter of draw_raster_data method to wx
2726     constants
2727     (MapRenderer.draw_raster_data): Add the format parameter and use
2728     raster_format_map to map it to the right wxwindows constant for
2729     wxImageFromStream
2730    
2731     * test/test_baserenderer.py (SimpleRenderer.draw_raster_data): Add
2732     the format parameter and record it
2733     (TestBaseRenderer.test_raster_no_projection): check the format
2734     paramter of the draw_raster_data method
2735     (TestBaseRenderer.test_renderer_extension): New. Test the renderer
2736     extension facility
2737    
2738 bh 1925 2003-11-07 Bernhard Herzog <[email protected]>
2739    
2740     Tweak the usage of the sqlite database to make common use cases
2741     more responsive. In most cases copying the data to the sqlite
2742     database takes so long that using sqlite doesn't have enough
2743     advantages.
2744    
2745     * Thuban/Model/transientdb.py (TransientTableBase.ValueRange): Add
2746     comments about performance and query the min and max in separate
2747     statements because only that way will indexes be used.
2748     (TransientTableBase.UniqueValues): Add some comments about
2749     performance.
2750     (AutoTransientTable.ValueRange, AutoTransientTable.UniqueValues):
2751     Do not copy the data to the transient DB but use the transient
2752     copy if it exists. See the new comments for the performance trade
2753     offs
2754    
2755     * test/test_transientdb.py
2756     (TestTransientTable.test_auto_transient_table): Make sure that the
2757     data is copied to the transient database at some point.
2758    
2759 bh 1913 2003-11-03 Bernhard Herzog <[email protected]>
2760    
2761 bh 1922 * Thuban/Model/data.py (ShapefileStore.ShapesInRegion): Bind some
2762     globals to locals so that it's a bit faster
2763    
2764     2003-11-03 Bernhard Herzog <[email protected]>
2765    
2766 bh 1920 * Thuban/UI/baserenderer.py
2767     (BaseRenderer.draw_shape_layer_incrementally): Use the ReadValue
2768     method. ReadValue is faster than ReadRowAsDict since it only reads
2769     one cell especially now that the dbf file objects actually
2770     implement it.
2771    
2772     * Thuban/Model/table.py (DBFTable.ReadValue): Use the new
2773     read_attribute method of the dbf objects
2774    
2775     2003-11-03 Bernhard Herzog <[email protected]>
2776    
2777 bh 1916 * Extensions/profiling/profiling.py (popup_dialog_box): New config
2778     variable to indicate whether the result should be shown in a
2779     dialog box
2780     (profile_screen_renderer, time_screen_renderer): Only show a
2781     dialog box if popup_dialog_box is true.
2782     (profile_screen_renderer): Flush stdout after the printing the
2783     first part of the "profiling..." message
2784    
2785     * Thuban/UI/baserenderer.py
2786     (BaseRenderer.draw_shape_layer_incrementally): Cache the pens and
2787     brushes for the groups so that they're not created over and over
2788     again
2789    
2790 bh 1913 * Thuban/Model/classification.py (Classification.__getattr__)
2791     (Classification._compile_classification)
2792     (Classification._clear_compiled_classification): New. Methods to
2793     manage a 'compiled' representation of the classification groups
2794     which is created on demand
2795     (Classification.InsertGroup, Classification.RemoveGroup)
2796     (Classification.ReplaceGroup): reset the compiled representation
2797     (Classification.FindGroup): Use the compiled representation to
2798     find the matching group
2799     (ClassGroupRange.GetRangeTuple): New. Return the range as a tuple
2800    
2801 bh 1904 2003-10-31 Bernhard Herzog <[email protected]>
2802    
2803 bh 1911 * Thuban/Model/classification.py (Classification.SetDefaultGroup):
2804     Send a CLASS_CHANGED message
2805     (Classification.RemoveGroup): Send a CLASS_CHANGED message and do
2806     not return the removed group since it wasn't used.
2807    
2808     * test/test_classification.py
2809     (TestClassification.test_set_default_group): New. Test the
2810     SetDefaultGroup method
2811     (TestClassification.test_insert_group): New. Test the InsertGroup
2812     method
2813     (TestClassification.test_remove_group): New. Test the RemoveGroup
2814     method
2815     (TestClassification.test_replace_group): New. Test the
2816     ReplaceGroup method
2817    
2818     2003-10-31 Bernhard Herzog <[email protected]>
2819    
2820 bh 1908 * test/test_classification.py (TestClassification.setUp):
2821     Subscribe to the CLASS_CHANGED messages
2822     (TestClassification.tearDown): New. Destroy the classification
2823     properly
2824     (TestClassification.test_defaults): Add tests for the default line
2825     width and whether no messages were sent yet
2826     (TestClassification.test_set_default_properties): Add tests for
2827     messages and setting the default line width
2828     (TestClassification.test_add_singleton)
2829     (TestClassification.test_add_range)
2830     (TestClassification.test_multiple_groups): Add tests for messages
2831    
2832     2003-10-31 Bernhard Herzog <[email protected]>
2833    
2834 bh 1906 Some more refactoring in preparation for new tests:
2835    
2836     * test/test_classification.py (TestClassification.setUp): New.
2837     Instantiate the classification here. Update the test methods
2838     accordingly.
2839     (TestClassification.test_multiple_groups): Make sure that the two
2840     singletons matching 1 are considered different.
2841    
2842     2003-10-31 Bernhard Herzog <[email protected]>
2843    
2844 bh 1904 * test/test_classification.py (red, green, blue): New. These
2845     constants were used in several cases. Update the relevant methods.
2846     (TestClassification.test_defaults)
2847     (TestClassification.test_set_default_properties)
2848     (TestClassification.test_add_singleton)
2849     (TestClassification.test_add_range)
2850     (TestClassification.test_multiple_groups)
2851     (TestClassification.test_deepcopy): New. These were formerly all
2852     part of the single method test.
2853     (TestClassification.test_deepcopy): Removed.
2854     (TestClassIterator): Removed. The test case is now a method of
2855     TestClassification since it tests part of the public interface of
2856     Classification
2857     (TestClassification.test_iterator): New. Used to be
2858     TestClassIterator effectively
2859    
2860 jan 1902 2003-10-31 Jan-Oliver Wagner <[email protected]>
2861    
2862     GUIfied the functions of the profiling extension.
2863    
2864     * /Extensions/profiling/__init__.py: New: Init to make this
2865     directory a package.
2866    
2867     * Extensions/profiling/profiling.py: Moved menu entries to
2868     the Extensions menu. Applied _() for strings.
2869     (profile_screen_renderer): Catch the detailed printout and present
2870     it in a dialog.
2871 bh 1904 (time_screen_renderer): Raise a dialog to present the result instead
2872 jan 1902 of printing it to stdout.
2873    
2874 bh 1897 2003-10-31 Bernhard Herzog <[email protected]>
2875    
2876 bh 1899 * test/test_classification.py (TestClassGroupProperties)
2877     (TestClassGroup, TestClassGroupDefault, TestClassGroupRange)
2878     (TestClassGroupSingleton, TestClassIterator, TestClassification):
2879     Split TestClassification into several classes, one for each class
2880     being tested. TestClassification itself now only tests
2881     Classification. This split makes changes to the tests a bit easier
2882    
2883     2003-10-31 Bernhard Herzog <[email protected]>
2884    
2885 bh 1897 * Extensions/profiling/profiling.py: New. Extension to measure
2886     Thuban performance
2887    
2888 frank 1895 2003-10-31 Frank Koormann <[email protected]>
2889    
2890     Added two items to legend popup menu: Remove Layer and Show Layer Table
2891    
2892     * Thuban/UI/legend.py (LegendPanel._OnRemoveLayer,
2893     LegendPanel._OnShowTable): New event handlers, call the corresponding
2894     mainwindow methods.
2895     (LegendTree._OnRightClick): Added items to popup menu.
2896    
2897 bh 1894 2003-10-30 Bernhard Herzog <[email protected]>
2898    
2899     * Thuban/UI/dialogs.py (ThubanFrame.__init__): Handle
2900     EVT_WINDOW_DESTROY
2901     (ThubanFrame.OnDestroy): New. Handler for EVT_WINDOW_DESTROY. Does
2902     nothing but is convenient for the derived classes.
2903    
2904     * Thuban/UI/tableview.py
2905     (TableFrame.OnDestroy, LayerTableFrame.OnDestroy): New.
2906     Unsubscribe the messages here not in OnClose because that might
2907     get called multiple times. Fixes RT #2196
2908     (TableFrame.OnClose, LayerTableFrame.OnClose): Removed. Not needed
2909     anymore.
2910    
2911     * README: Update the minimum requirement for wxPython. Since we
2912     now use the EVT_WINDOW_DESTROY event, we need at least 2.4.0.4,
2913     the version in which that was introduced for all platforms
2914    
2915 frank 1890 2003-10-30 Frank Koormann <[email protected]>
2916    
2917     * Thuban/UI/join.py (JoinDialog.OnJoin): Wrapped the major parts of
2918     the join process in a ThubanBeginBusyCursor, ThubanEndBusyCursor
2919     frame.
2920    
2921 jan 1889 2003-10-30 Jan-Oliver Wagner <[email protected]>
2922    
2923     Improved APR import extension, added further EPSG definitions
2924     and some cleanup regarding string class.
2925    
2926     * test/test_proj.py (TestProjection.test_get_projection_units_geo):
2927     Added test for alias 'longlat'.
2928    
2929     * Resources/Projections/epsg-deprecated.proj: New. Contains
2930     deprecated EPSG definitions.
2931    
2932     * Extensions/importAPR/odb.py (ODBBaseObject.TreeInfo): Added
2933     the variable names for objects.
2934    
2935     * Extensions/importAPR/apr.py (APR_BLnSym, APR_BMkSym, APR_BShSym): New.
2936     Copied from importAPR and provided with documentation.
2937    
2938     * Extensions/importAPR/importAPR.py (APR_BLnSym, APR_BMkSym, APR_BShSym):
2939     Moved to apr.py.
2940     (APR_View): Added object ref 'ITheme'.
2941    
2942     * Thuban/Lib/fileutil.py, Thuban/UI/proj4dialog.py: Replaced string
2943     split function by corresponding use of the string class method.
2944    
2945     * Thuban/Model/xmlwriter.py: Replaced string replace function by
2946     corresponding string method.
2947    
2948 bh 1880 2003-10-29 Bernhard Herzog <[email protected]>
2949    
2950     * Thuban/UI/baserenderer.py
2951     (BaseRenderer.draw_shape_layer_incrementally): Speed up the
2952     special case of a classification that only has the default group
2953    
2954 bh 1868 2003-10-27 Bernhard Herzog <[email protected]>
2955    
2956 bh 1878 * po/fr.po, po/es.po: Updated translations from Daniel Calvelo
2957    
2958 bh 1876 * po/de.po: Update.
2959    
2960     * Thuban/UI/application.py
2961     (ThubanApplication.ShowExceptionDialog): Handle translation of the
2962     dialog message properly
2963    
2964     2003-10-27 Bernhard Herzog <[email protected]>
2965    
2966 bh 1873 Rework how localization works so that we use wx's translation
2967     functions when running Thuban as a normal application but not when
2968     we don't need any UI, such as in the test suite. See the comment
2969     in Thuban/__init__.py for details
2970    
2971     * Thuban/__init__.py (_): Add one level of indirection to make the
2972     translation handling more flexible and to make it possible to use
2973     either wx's translation services or not.
2974     (gettext_identity, translation_function_installed)
2975     (install_translation_function): New function to help with this
2976    
2977     * Thuban/UI/__init__.py: Install the wx specific translation
2978     function if it's OK to do that
2979    
2980     * test/support.py (initthuban): Install a dummy translation
2981     function so that importing Thuban.UI doesn't install a wx specific
2982     one for which would need to import wxPython
2983    
2984     2003-10-27 Bernhard Herzog <[email protected]>
2985    
2986 bh 1870 * HOWTO-Release: Source archives should be created first and the
2987     binary packages should be created from the source archives.
2988     There's an official debian package now so there's no need to test
2989     the rpm on debian anymore
2990    
2991     2003-10-27 Bernhard Herzog <[email protected]>
2992    
2993 bh 1868 Several rendering changes:
2994    
2995     - Render the selection into a separate bitmap so that only that
2996     bitmap needs to be redrawn when the selection changes
2997    
2998     - Render incrementally showing previews and allowing interaction
2999     before rendering is complete
3000    
3001     - Update the renderer interface a bit. Most parameters of
3002     RenderMap are now parameters of the constructor
3003    
3004     * Thuban/UI/baserenderer.py (BaseRenderer.__init__): Add the map
3005     and the update region as parameters. Update the doc-string
3006     (BaseRenderer.render_map_incrementally): New. Generator function
3007     to renders the map incrementally
3008     (BaseRenderer.render_map): Remove the map argument (it's now in
3009     the constructor) and simply iterate over the
3010     render_map_incrementally generator to draw the map.
3011     (BaseRenderer.draw_shape_layer_incrementally)
3012     (BaseRenderer.draw_shape_layer): Renamed to
3013     draw_shape_layer_incrementally and changed into a generator that
3014     yields True every 500 shapes. Used by render_map_incrementally to
3015     render shape layers incrementally
3016    
3017     * Thuban/UI/renderer.py (ScreenRenderer.RenderMap): Removed the
3018     map and region parameters which are now in the constructor
3019     (ScreenRenderer.RenderMapIncrementally): New. Public frontend for
3020     the inherited render_map_incrementally.
3021     (BaseRenderer.draw_shape_layer): Removed.
3022     (ScreenRenderer.draw_selection_incrementally): New. The selection
3023     drawing part of the removed draw_shape_layer as a generator
3024     (ScreenRenderer.layer_shapes): Update because of the region
3025     parameter change
3026     (ExportRenderer.__init__): New. Extend the inherited constructor
3027     with the destination region for the drawing
3028     (ExportRenderer.RenderMap): Removed the map and region parameters
3029     which are now in the constructor
3030    
3031     * Thuban/UI/view.py (MapCanvas.PreviewBitmap): New. Return a
3032     bitmap suitable for a preview in a tool
3033     (CanvasPanTool.MouseMove): Use the PreviewBitmap method to get the
3034     bitmap
3035     (MapPrintout.draw_on_dc): Adapt to new renderer interface
3036     (MapCanvas.OnPaint): Handle drawing the selection bitmap if it
3037     exists
3038     (MapCanvas.OnIdle): Update the logic to deal with incremental
3039     rendering and the selection bitmap
3040     (MapCanvas._do_redraw): Handle the instantiation of the render
3041     iterator and the redraws during rendering
3042     (MapCanvas._render_iterator): New. Generator to incrementally
3043     redraw both bitmaps
3044     (MapCanvas.Export): Adapt to new renderer interface.
3045     (MapCanvas.full_redraw): Reset the selection bitmap and the
3046     renderer iterator too
3047     (MapCanvas.redraw_selection): New. Force a redraw of the selection
3048     bitmap
3049     (MapCanvas.shape_selected): Only redraw the selection bitmap
3050    
3051     * test/test_baserenderer.py
3052     (TestBaseRenderer.test_polygon_no_projection)
3053     (TestBaseRenderer.test_raster_no_projection)
3054     (TestBaseRenderer.test_point_map_projection)
3055     (TestBaseRenderer.test_point_layer_and_map_projection)
3056     (TestBaseRenderer.test_point_layer_projection)
3057     (TestBaseRenderer.test_point_with_classification): Adapt to new
3058     renderer interface
3059    
3060 bh 1865 2003-10-24 Bernhard Herzog <[email protected]>
3061    
3062     * libraries/thuban/wxproj.cpp (draw_polygon_shape)
3063     (point_in_polygon_shape, shape_centroid): Raise an exception if
3064     the shape can't be read. Previously invalid shape ids would lead
3065     to a segfault.
3066    
3067     * test/test_wxproj.py (TestShapeCentroid.test_invalid_shape_id):
3068     New. test whether an exception is raised for invalid shape ids
3069    
3070 jan 1857 2003-10-24 Jan-Oliver Wagner <[email protected]>
3071    
3072 jan 1862 * Thuban/Model/proj.py (Projection.GetProjectedUnits): Added 'longlat'
3073     as alias for 'latlong'.
3074    
3075     * Thuban/UI/projdialog.py (ProjFrame.__init__): Added 'longlat'
3076     as alias for 'latlong'.
3077    
3078     2003-10-24 Jan-Oliver Wagner <[email protected]>
3079    
3080 jan 1859 * Thuban/UI/projdialog.py (ProjFrame.proj_selection_changed): Set
3081     the projection even for the UnknownPanel.
3082     (UnknownProjPanel.__init__): Define the text and create the textctrl
3083     widget.
3084     (UnknownProjPanel._DoLayout): Replaced static text widget by the
3085     textctrl created in __init__.
3086     (UnknownProjPanel.SetProjection): Set the text for the text ctrl
3087     including the parameters of the projection.
3088    
3089     2003-10-24 Jan-Oliver Wagner <[email protected]>
3090    
3091 jan 1857 * Resources/Projections/epsg.proj: New. This is a list of
3092     EPSG codes with parameters for proj. The list has been
3093     generated using devtools/create_epsg.py based on the
3094     file nad/epsg of the proj 4.4.7 package. Four projection
3095     definitions have been deleted as they are not accepted by proj:
3096     "CH1903+ / LV95", "Bern 1898 (Bern) / LV03C", "CH1903 / LV03"
3097     and "HD72 / EOV".
3098    
3099 bh 1855 2003-10-22 Bernhard Herzog <[email protected]>
3100    
3101     Some more tweaks to the projection dialog which should fix RT
3102     #1886.
3103    
3104     * Thuban/UI/projlist.py (ProjectionList.Destroy): Unsubscribe from
3105     the ProjFile's messages and call the base class methods correctly
3106     (ProjectionList.SelectProjection): Set the wxLIST_STATE_FOCUSED
3107     flag on the newly selected item too. Otherwise some other item is
3108     focused and the first time the focus is moved with the keyboard
3109     the selection moves in unexpected ways.
3110    
3111     * Thuban/UI/projdialog.py (ProjFrame.__init__): Do not set the
3112     focus on the OK button, only on the projection list. That way the
3113     list really has the focus initially
3114     (ProjFrame.OnClose): Call the projection list's Destroy method to
3115     make it unsubscribe all messages
3116    
3117 bh 1840 2003-10-21 Bernhard Herzog <[email protected]>
3118    
3119 bh 1852 Rework the projection dialog to fix a few bugs, including RT 2166
3120     and most of 2168
3121    
3122     * Thuban/UI/projlist.py: New. The class ProjectionList is a
3123     special wxListCtrl to show a list of projections in a more MVC
3124     fashion
3125    
3126     * Thuban/UI/projdialog.py (ProjFrame): Substantial changes
3127     throughout the class. The main change is to use the ProjectionList
3128     class instead of a normal wxListBox. Also, add an explicit
3129     "Unknown" projection to the projection choice control.
3130     (ProjPanel.__init__): Add an "unknown" ellipsoid
3131     (TMPanel.__init__, LCCPanel.__init__): Tweak the order of
3132     instantiation of the panel's controls to make the tab-order more
3133     natural
3134    
3135     2003-10-21 Bernhard Herzog <[email protected]>
3136    
3137 bh 1849 * test/test_load.py (TestSingleLayer.file_contents)
3138     (TestSingleLayer.test): Add non-ascii characters to the titles of
3139     session, map and layer. This is effectively a port of the
3140     TestUnicodeStrings test in test_load_0_8.py which for some reason
3141     was only added there.
3142    
3143     * test/test_load_0_9.py (TestSingleLayer.file_contents)
3144     (TestSingleLayer.test): Same as in test_load.py: add non-ascii
3145     characters to the titles of session, map and layer,.
3146    
3147     2003-10-21 Bernhard Herzog <[email protected]>
3148    
3149 bh 1847 Add EPSG projection handling to .thuban files
3150    
3151     * test/test_save.py (SaveSessionTest.dtd)
3152     (SaveSessionTest.testEmptySession)
3153     (SaveSessionTest.testLayerProjection)
3154     (SaveSessionTest.testRasterLayer)
3155     (SaveSessionTest.testClassifiedLayer)
3156     (SaveSessionTest.test_dbf_table)
3157     (SaveSessionTest.test_joined_table)
3158     (SaveSessionTest.test_save_postgis): Update to 1.0-dev namespace
3159     (SaveSessionTest.testSingleLayer): Update to 1.0-dev namespace and
3160     use a and epsg projection to test saving them
3161    
3162     * test/test_load.py (LoadSessionTest.dtd): Update to 1.0-dev
3163     namespace
3164     (TestLayerVisibility.file_contents, TestLabels.file_contents)
3165     (TestLayerProjection.file_contents)
3166     (TestRasterLayer.file_contents, TestJoinedTable.file_contents)
3167     (TestPostGISLayer.file_contents)
3168     (TestPostGISLayerPassword.file_contents)
3169     (TestLoadError.file_contents, TestLoadError.test): Update to use
3170     1.0-dev namespace
3171     (TestSingleLayer.file_contents, TestSingleLayer.test): Update to
3172     use 1.0-dev namespace and use an EPSG projection to test whether
3173     loading it works
3174    
3175     * test/test_load_0_9.py: New. Effectively a copy of test_load.py
3176     as of Thuban 0.9. These are now tests to determine whether Thuban
3177     can still read files generated by Thuban 0.9
3178    
3179     * Thuban/Model/save.py (SessionSaver.write)
3180     (SessionSaver.write_session): Use the 1.0 dtd and 1.0-dev
3181     namespace
3182     (SessionSaver.write_projection): Write the projection's epsg
3183     attribute
3184    
3185     * Thuban/Model/load.py (SessionLoader.__init__): Also accept the
3186     thuban-1.0-dev.dtd namespace
3187     (SessionLoader.check_attrs): Allow a callable object as conversion
3188     too
3189     (SessionLoader.start_projection, SessionLoader.end_projection)
3190     (SessionLoader.start_parameter): Handle the epsg attribute and
3191     rename a few instance variables to lower case
3192    
3193     * Resources/XML/thuban-1.0.dtd: New. Only difference to
3194     thuban-0.9.dtd is the epsg attribute for projections.
3195    
3196     2003-10-21 Bernhard Herzog <[email protected]>
3197    
3198 bh 1840 * test/runtests.py (main): Let the user specify which tests to run
3199     on the command line
3200    
3201     * test/support.py (ThubanTestResult.getDescription): Override to
3202     give a better short description. The description can be used as a
3203     parameter to run_tests to run that particular test in isolation.
3204    
3205 frank 1837 2003-10-21 Frank Koormann <[email protected]>
3206    
3207     Popup menu for legend. Scheduled for the 1.2 release this was too
3208     simple to implement: The popup menu is bound to the legend tree, while
3209     the events are hanlded by its anchestor, the legend panel. This
3210     allows reuse of all the event handlers already implemented for the
3211     legend toolbar buttons.
3212    
3213     * Thuban/UI/legend.py (LegendPanel.__init__): EVT_MENU macros
3214     to add handlers for the events issued by the popup menu.
3215     (LegendPanel._OnToggleVisibility): Handler for toggling layer
3216     visibility event
3217     (LegendPanel._OnProjection): Handler for layer projection event.
3218     (LegendTree.__init__): Added EVT_TREE_ITEM_RIGHT_CLICK
3219     (LegendTree._OnRightClick): Event handler for right click, select item
3220     and pop up menu.
3221     (LegendTree.ToggleVisibility): Toggle layer visibility
3222     (LegendTree.LayerProjection): Raise layer projection dialog for
3223     current layer.
3224    
3225 bh 1836 2003-10-21 Bernhard Herzog <[email protected]>
3226    
3227     * Resources/Projections/defaults.proj: Use correct DOCTYPE
3228     declaration. The top-level element is projectionlist not projfile
3229    
3230 bh 1834 2003-10-20 Bernhard Herzog <[email protected]>
3231    
3232     * Thuban/UI/projdialog.py (ProjFrame.write_proj_file): New. helper
3233     method to write a projfile and display a busy cursor and error
3234     dialogs.
3235     (ProjFrame._OnSave, ProjFrame._OnAddToList, ProjFrame._OnImport)
3236     (ProjFrame._OnExport, ProjFrame._OnRemove): Use write_proj_file
3237     (ProjFrame.__FillAvailList): Translate "<None>" too and display a
3238     busy cursor while loading the user and system prj files.
3239    
3240 bh 1832 2003-10-16 Bernhard Herzog <[email protected]>
3241    
3242     * Thuban/Model/resource.py (projfile_cache): Introduce a cache for
3243     ProjFile objects
3244     (clear_proj_file_cache): New function to clear the cache. Mainly
3245     useful for use by the test suite
3246     (read_proj_file): Use the cache.
3247    
3248     * test/test_proj.py (TestProjFile): Clarify the doc-string
3249     (ProjFileReadTests): Update doc-string
3250     (ProjFileReadTests.test_get_system_proj_file): Check whether the
3251     system proj files is cached.
3252     (ProjFileLoadTestCase): New base class for the proj file tests
3253     derived from support.FileLoadTestCase to provide some common
3254     behavior.
3255     (TestLoadingProjFile)
3256     (TestLoadingProjFileWithEmptyProjectionlist.file_contents)
3257     (TestProjFileWithInvalidParameters.file_contents): Derive from
3258     ProjFileLoadTestCase
3259     (TestLoadingProjFile.test_caching): New. Test whether the cache
3260     works
3261    
3262 silke 1829 2003-10-16 Silke Reimer <[email protected]>
3263    
3264     * debian/*: New directory with configuration files for building a thuban
3265     deb-package.
3266    
3267 bh 1822 2003-10-14 Bernhard Herzog <[email protected]>
3268    
3269 bh 1828 * test/test_proj.py: Execute support.run_tests when run as
3270     __main__ so that missing unsubscribes are detected
3271     (TestProjFile.tearDown): Destroy the proj_file properly
3272    
3273     2003-10-14 Bernhard Herzog <[email protected]>
3274    
3275 bh 1826 * Thuban/Model/messages.py (PROJECTION_ADDED)
3276     (PROJECTION_REPLACED, PROJECTION_REMOVED): New message types for
3277     the ProjFile objects
3278    
3279     * Thuban/Model/proj.py (ProjFile): Derive from Publisher so we can
3280     easily send messages when the projections change
3281     (ProjFile.Add, ProjFile.Remove, ProjFile.Replace): Issue messages
3282     when the change was successful
3283    
3284     * test/test_proj.py (TestProjFile.setUp): Subscribe to some of the
3285     proj file messages
3286     (TestProjFile.test_add_remove)
3287     (TestProjFile.test_remove_non_existing)
3288     (TestProjFile.test_replace)
3289     (TestProjFile.test_replace_non_existing): Test whether the right
3290     messages are sent
3291    
3292     2003-10-14 Bernhard Herzog <[email protected]>
3293    
3294 bh 1822 * test/test_proj.py (TestProjFile.test): Refactor into several
3295     tests
3296     (TestProjFile.test_add_remove)
3297     (TestProjFile.test_remove_non_existing)
3298     (TestProjFile.test_replace)
3299     (TestProjFile.test_replace_non_existing): Some of the new
3300     individual test cases
3301     (TestProjFileSimple): New class for the rest of the test cases
3302     that came out of the refactoring
3303     (ProjFileTest): Derive from xmlsupport.ValidationTest so that the
3304     derived classes don't have to
3305    
3306 bh 1812 2003-10-13 Bernhard Herzog <[email protected]>
3307    
3308 bh 1820 Add an optional EPSG code to the projection objects and extend the
3309     .proj file format accordingly.
3310    
3311     * Resources/XML/projfile.dtd (element projection): Add epsg
3312     attribute
3313    
3314     * Thuban/Model/proj.py (Projection.__init__): New parameter and
3315     instance variable epsg. Update doc-string
3316     (Projection.EPSGCode, Projection.Label): New methods to provide
3317     access to EPSG code and a label for use in dialogs
3318    
3319     * Thuban/Model/resource.py (ProjFileReader.start_projection)
3320     (ProjFileReader.end_projection, ProjFileSaver.write_projfile):
3321     Handle the epsg code attribute when reading or writing proj files
3322    
3323     * Thuban/UI/projdialog.py (ProjFrame._OnSave)
3324     (ProjFrame._OnAddToList, ProjFrame.__DoOnProjAvail)
3325     (ProjFrame.__FillAvailList): Use the projection's Label method to
3326     get the string for the list box
3327    
3328     * test/test_proj.py (TestProjection.test_label)
3329     (TestProjection.test_label_epsg)
3330     (TestProjection.test_epsgcode_for_non_epsg_projection)
3331     (TestProjection.test_epsgcode_for_real_epsg_projection): New tests
3332     for the label and EPSGCode methods
3333     (WriteProjFileTests.doTestWrite, WriteProjFileTests.test_write)
3334     (WriteProjFileTests.test_write_empty_file): Create the ProjFile
3335     objects in the test cases and put the expected contents into the
3336     test case methods too. Update doTestWrite accordingly
3337     (TestLoadingProjFile)
3338     (TestLoadingProjFileWithEmptyProjectionlist): New classes with the
3339     read tests from TestProjFile.
3340     (TestProjFile.doTestRead, TestProjFile.testRead): Removed. These
3341     tests are now in the new classes.
3342     (sample_projfile, sample_projfile_data)
3343     (sample_projfile2, sample_projfile_data2): Removed. Not used
3344     anymore.
3345     (TestProjFile.test_read_unreadable_file): No need to reset the
3346     permissions at the end anymore since we use a unique filename
3347    
3348     2003-10-13 Bernhard Herzog <[email protected]>
3349    
3350 bh 1814 * test/test_proj.py: Some more refactoring of the test cases
3351     (ProjFileTest): New base class for the proj file tests.
3352     (TestProjFile): Derive from ProjFileTest
3353     (TestProjFile.test_read_unreadable_file)
3354     (TestProjFile.test_read_empty_file, TestProjFile.doTestRead): Use
3355     the new filename method to get a unique filename
3356     (TestProjFile.doTestWrite, TestProjFile.testWrite): Removed.
3357     (WriteProjFileTests): New class for proj file write tests.
3358     Contains the write test that were in TestProjFile originally.
3359    
3360     2003-10-13 Bernhard Herzog <[email protected]>
3361    
3362 bh 1812 * test/test_proj.py (TestProjFile.testRead)
3363     (TestProjFile.test_read_non_existing_file)
3364     (TestProjFile.test_read_unreadable_file)
3365     (TestProjFile.test_read_empty_file): Split into several methods.
3366    
3367 bh 1805 2003-10-10 Bernhard Herzog <[email protected]>
3368    
3369 bh 1810 * Thuban/UI/sizers.py: New file with custom sizers.
3370    
3371     * Thuban/UI/projdialog.py (ProjFrame.build_dialog): Instantiate
3372     all projection type specific panels and put them into a
3373     NotebookLikeSizer. This way the dialog doesn't change its size
3374     when a different projection is selected
3375     (ProjFrame.__init__): Rename projection_panels
3376     projection_panel_defs and reuse projection_panels for a list of
3377     the instantiated panels.
3378     (ProjFrame._show_proj_panel, ProjFrame.__DoOnProjAvail)
3379     (ProjFrame.__DoOnProjChoice): Changes due to the new handling of
3380     the panels
3381     (UnknownProjPanel._DoLayout): Place the newlines in the message
3382     differently to make the panel narrower.
3383     (TMPanel._DoLayout): Layout the parameters in one column.
3384    
3385     2003-10-10 Bernhard Herzog <[email protected]>
3386    
3387 bh 1807 * Thuban/UI/projdialog.py (ProjFrame.build_dialog): New method
3388     that contains all the setup for the dialog's widgets, layout and
3389     event handling.
3390     (__): Call build_dialog to build the dialog.
3391     (ProjFrame.__set_properties, ProjFrame.__do_layout): Removed.
3392     Their functionality is now in build_dialog
3393     (ProjFrame.__VerifyButtons, ProjFrame.__VerifyButtons)
3394     (ProjFrame.__DoOnProjAvail, ProjFrame.__DoOnProjAvail)
3395     (ProjFrame.__DoOnProjChoice): Small updates due to slightly
3396     different widget names and hierarchy introduced with build_dialog.
3397    
3398     2003-10-10 Bernhard Herzog <[email protected]>
3399    
3400 bh 1805 * README: Fix typo.
3401    
3402 bh 1803 2003-10-09 Bernhard Herzog <[email protected]>
3403    
3404     * Thuban/Model/proj.py (ProjFile.Add): Do not check whether the
3405     projection is already in the list. This is *a lot* faster when
3406     loading files with hundreds of projections since it saves a linear
3407     search. OTOH this will allow adding the same projection to the
3408     user.proj file multiple times in the projection dialog but we'll
3409     deal with that later
3410    
3411 jan 1801 2003-10-09 Jan-Oliver Wagner <[email protected]>
3412    
3413     * devtools: New. Directory for developer tools that are not intended
3414     for the regular user.
3415    
3416     * devtools/create_epsg.py: New. Convert the epsg file of proj into
3417     a python .proj file.
3418    
3419 bh 1799 2003-10-09 Bernhard Herzog <[email protected]>
3420    
3421     * test/test_proj.py
3422     (TestProjection.test_get_parameter_without_equals_sign): New. Test
3423     whether GetParameter handles parameters without "=" sign correctly
3424    
3425     * Thuban/Model/proj.py (Projection.GetParameter): Handle
3426     parameters that do not contain a "=". Update the doc-string
3427    
3428 bh 1794 2003-10-08 Bernhard Herzog <[email protected]>
3429    
3430 bh 1796 * Thuban/UI/projdialog.py (ProjFrame.__set_properties): Remove the
3431     length limit on the projname text control
3432    
3433     2003-10-08 Bernhard Herzog <[email protected]>
3434    
3435 bh 1794 * test/test_proj.py (TestProjection.test_get_projection_units_geo)
3436     (TestProjection.test_get_projection_units_normal): New. Tests for
3437     the Projection.GetProjectedUnits method
3438    
3439 jan 1792 2003-10-08 Jan-Oliver Wagner <[email protected]>
3440    
3441     * Thuban/Model/resource.py (get_user_proj_file): small bug-fix:
3442     Added missing 'val' parameter.
3443    
3444 bh 1788 2003-10-08 Bernhard Herzog <[email protected]>
3445    
3446 bh 1790 * Thuban/UI/projdialog.py (ProjFrame.__DoOnProjAvail): When the
3447     projection type of the currently selected projection is not known,
3448     i.e. there's no panel for it, use the UnknownProjPanel
3449     (ProjFrame.__DoOnProjChoice, ProjFrame._show_proj_panel): Split
3450     the actual replacing of the proj panel into the new method
3451     _show_proj_panel.
3452     (UnknownProjPanel): Add doc-string.
3453     (UnknownProjPanel._DoLayout): Insert a newline into the text so
3454     that the panel is not so wide.
3455    
3456     2003-10-08 Bernhard Herzog <[email protected]>
3457    
3458 bh 1788 * Thuban/Model/resource.py (read_proj_file): Return the warnings
3459     too. Update the doc-string
3460     (get_proj_files): Removed. It wasn't used anywhere
3461     (get_system_proj_files, get_system_proj_file): Rename to
3462     get_system_proj_file and return the ProjFile object and not a list
3463     of ProjFile objects. Update the callers.
3464     (get_user_proj_files, get_user_proj_file): Rename to
3465     get_user_proj_file return the ProjFile object and not a list of
3466     ProjFile objects. Update the callers.
3467     (ProjFileReader.__init__): New instance variable for the warnings.
3468     Rename the __pf ivar to projfile. Update the methods referring to
3469     __pf
3470     (ProjFileReader.end_projection): Catch any errors raised when
3471     instantiating the projection and record that as an error. The
3472     projection will not be in the final ProjFile object.
3473     (ProjFileReader.GetWarnings): New method to return the warnings.
3474    
3475     * Thuban/UI/projdialog.py (ProjFrame.show_warnings): New method to
3476     show the warnings from the projfile reader
3477     (ProjFrame._OnImport): Deal with any warnings returned by
3478     read_proj_file
3479     (ProjFrame.__FillAvailList): Deal with any warnings returned by
3480     get_system_proj_file or get_user_proj_file.
3481    
3482     * test/test_proj.py (TestProjFile.doTestRead): Check the warnings.
3483     (TestProjFileWithInvalidParameters.file_contents): New test cases
3484     to test whether read_proj_file handles invalid projection
3485     parameters correctly
3486     (TestProjFile.test_get_system_proj_file): New. Simple test for
3487     resource.get_system_proj_file
3488    
3489 bh 1785 2003-10-07 Bernhard Herzog <[email protected]>
3490    
3491     * test/test_derivedshapestore.py
3492     (TestDerivedShapeStoreExceptions.tearDown): Clear the session
3493     properly so that the temporary directories get deleted correctly
3494    
3495 bh 1773 2003-10-06 Bernhard Herzog <[email protected]>
3496    
3497 bh 1783 Handle the title changes in a proper MVC way.
3498    
3499     * Thuban/UI/mainwindow.py (MainWindow.__init__): Subscribe to the
3500     canvas' TITLE_CHANGED messages
3501     (MainWindow.update_title): New. Update the main window's title
3502     (MainWindow.__SetTitle): Removed. Use update_title instead.
3503     (MainWindow.SetMap): Use update_title instead of __SetTitle
3504     (MainWindow.RenameMap): Do change the window title explicitly
3505     here. That's handled in a proper MVC way now.
3506     (MainWindow.title_changed): New. Subscriber for the TITLE_CHANGED
3507     messages
3508    
3509     * Thuban/Lib/connector.py (Conduit): New class to help classes
3510     that forward messages
3511    
3512     * Thuban/UI/viewport.py: Forward the map's TITLE_CHANGED messages
3513     (ViewPort): Derive from Conduit instead of Publisher
3514     (ViewPort.Subscribe, ViewPort.Unsubscribe): Use the new base class
3515     when calling the inherited versions
3516     (ViewPort._subscribe_map, ViewPort._unsubscribe_map): New helper
3517     methods to subscribe and unsubscribe map messages
3518     (ViewPort.SetMap, ViewPort.Destroy): Use the new helper methods to
3519     handle the map subscriptions
3520     (ViewPort.Map, ViewPort.map_projection_changed)
3521     (ViewPort.layer_projection_changed): Add or update doc-strings
3522    
3523     * test/test_connector.py (TestPublisher.test_issue_simple): Fix
3524     typo
3525     (MyConduit): Helper class for the Conduit test.
3526     (TestConduit): Test cases for Conduit
3527    
3528     * test/test_connector.py: Use support.run_tests as main.
3529    
3530     * test/test_viewport.py (ViewPortTest.setUp): Also subscribe to
3531     the TITLE_CHANGED messages
3532     (ViewPortTest.test_forwarding_title_changed): New test to check
3533     whether the viewport forwards the map's TITLE_CHANGED messages
3534     (TestViewportWithPostGIS.tearDown): Call the map's Destroy method
3535     after the port's because the latter may require a still functional
3536     map.
3537    
3538     2003-10-06 Bernhard Herzog <[email protected]>
3539    
3540 bh 1777 * Thuban/UI/application.py (ThubanApplication.maps_changed): Add
3541     doc-string
3542    
3543     2003-10-06 Bernhard Herzog <[email protected]>
3544    
3545 bh 1775 * test/test_viewport.py (ViewPortTest.setUp)
3546     (SimpleViewPortTest.test_init_with_size): Move the test for the
3547     initial size as a constructor parameter from ViewPortTest.setUp
3548     method to a new separate test in SimpleViewPortTest.
3549    
3550     2003-10-06 Bernhard Herzog <[email protected]>
3551    
3552 bh 1773 * test/test_viewport.py (MockView): New class derived from
3553     ViewPort with a mock implementation of GetTextExtent to be used in
3554     the test cases
3555     (ViewPortTest.setUp): Use MockView instead of ViewPort
3556    
3557     * Thuban/UI/viewport.py (ViewPort.GetTextExtent): Turn this method
3558     into what would be a "pure virtual function" in C++: always raise
3559     NotImplementedError. Mock implementations for test cases don't
3560     belong into the real code
3561    
3562 bh 1770 2003-10-02 Bernhard Herzog <[email protected]>
3563    
3564     * test/test_layer.py (TestLayer.test_empty_layer): Explicitly
3565     close the dbf file we create so that it's contents have been
3566     written properly.
3567    
3568     * libraries/shapelib/shptree.c, libraries/shapelib/shpopen.c,
3569     libraries/shapelib/shapefil.h, libraries/shapelib/dbfopen.c:
3570     Update to shapelib 1.2.10
3571    
3572 jan 1767 2003-10-01 Jan-Oliver Wagner <[email protected]>
3573    
3574     * Thuban/UI/tree.py, Thuban/UI/main.py: Remove the #! line as
3575     it annoys lintian which warns about these files not being
3576     executable. The #! isn't necessary here since if you absolutely
3577     must execute them you can always say "python <filename>".
3578    
3579 bh 1757 2003-09-26 Bernhard Herzog <[email protected]>
3580    
3581 bh 1760 * Thuban/Model/classgen.py (GenQuantiles0): Removed since it's
3582     only used in GREAT-ER but not used in Thuban itself. When GREAT-ER
3583     is ported to a newer the import will fail, so it should be noticed
3584     immediately that this function is gone.
3585     Fixes RT#1919
3586    
3587     2003-09-26 Bernhard Herzog <[email protected]>
3588    
3589 bh 1757 Add a DTD for the projection files and make thuban write valid
3590     projection files
3591    
3592     * Resources/XML/projfile.dtd: New. DTD for thuban's projection
3593     files
3594    
3595     * Thuban/Model/resource.py (ProjFileSaver.write): Use
3596     'projectionlist' as the name in the document type declaration so
3597     that it matches the element type of the root element.
3598    
3599     * test/test_proj.py (sample_projfile, sample_projfile2): Use
3600     'projectionlist' as the name in the document type declaration just
3601     as it is done now in the files thuban would write
3602     (sample_projfile, sample_projfile_data): Fix spelling of
3603     "Mercator"
3604     (TestProjFile.doTestWrite): Validate the written and the expected
3605     XML data
3606     (TestProjFile): Derive from ValidationTest so that we can run xml
3607     validation tests
3608    
3609 bh 1751 2003-09-24 Bernhard Herzog <[email protected]>
3610    
3611     * Thuban/UI/renderer.py (ExportRenderer.render_legend): Do not
3612     modify the list returned by map.Layers() in place since it is the
3613     actual list of layers used by the map.
3614    
3615 jan 1745 2003-09-23 Jan-Oliver Wagner <[email protected]>
3616    
3617     * Doc/manual/thuban-manual.xml: Added subsection to chapter
3618     Extensions to describe the extensions coming with the Thuban
3619     standard package (gns2shp and importAPR).
3620    
3621 bh 1743 2003-09-23 Bernhard Herzog <[email protected]>
3622    
3623     * libraries/thuban/wxproj.cpp (project_point): if there's an
3624     inverse but no forward projection, convert to degrees after
3625     applying the inverse projection. Fixes RT#2096
3626    
3627     * test/test_wxproj.py: New. Test cases for wxproj.so. One test
3628     implicitly tests for the fix to RT#2096
3629    
3630     * test/support.py (FloatComparisonMixin.assertFloatSeqEqual):
3631     Check that the sequences have the same lengths
3632    
3633     * Resources/Projections/defaults.proj (Geographic projection): Use
3634     a much more precise value for the to_meter attribute.
3635    
3636 bh 1737 2003-09-22 Bernhard Herzog <[email protected]>
3637    
3638     * test/support.py (initthuban): Make sure to unset the LANG env.
3639     var. so that tests that compare translated strings work. Solves RT
3640     #2094
3641    
3642 jan 1730 2003-09-22 Jan-Oliver Wagner <[email protected]>
3643    
3644 jan 1735 Small improvement of APR import.
3645    
3646     * Extensions/importAPR/test/test_apr.py (aprTest.test_LClass):
3647     Added tests for text-ranges.
3648    
3649     * Extensions/importAPR/apr.py (APR_LClass.GetThubanRange): Now
3650     returns a string object if the range is based on text.
3651    
3652     * Extensions/importAPR/importAPR.py (import_apr_dialog): Unified
3653     range retrieval.
3654    
3655     2003-09-22 Jan-Oliver Wagner <[email protected]>
3656    
3657 jan 1730 Initial version of the importAPR extension which is in
3658     experimental state.
3659    
3660     * /Extensions/importAPR/, /Extensions/importAPR/samples/,
3661     /Extensions/importAPR/test/: New directories.
3662    
3663     * /Extensions/importAPR/samples/README: New: Howto load the samples.
3664    
3665     * /Extensions/importAPR/samples/iceland.apr: New: A sample APR
3666     file which refers to the Thuban Iceland demo data.
3667    
3668     * /Extensions/importAPR/test/README: New: Howto execute the tests.
3669    
3670     * /Extensions/importAPR/test/test_apr.py: New: Tests for APR classes.
3671    
3672     * /Extensions/importAPR/apr.py: New: Classes for ArcView Objects
3673     as in '.apr'-files.
3674    
3675     * /Extensions/importAPR/odb.py: New: Classes for generic ArcView
3676     ODB Objects as in '.apr', '.avl' and other files.
3677    
3678     * /Extensions/importAPR/__init__.py: New: Init to make this
3679     directory a package.
3680    
3681     * /Extensions/importAPR/importAPR.py: New: Import a ArcView
3682     project file (.apr) and convert it to Thuban.
3683    
3684     2003-09-22 Jan-Oliver Wagner <[email protected]>
3685    
3686     * Extensions/gns2shp.gns2shp.py: The main module of gns2shp.
3687    
3688 jan 1720 2003-09-19 Jan-Oliver Wagner <[email protected]>
3689    
3690     * Doc/manual/thuban-manual.xml: Extended section 'Installation'
3691     with description on RPM installation and RPM binary package
3692     creation.
3693    
3694 bh 1718 2003-09-18 Bernhard Herzog <[email protected]>
3695    
3696     * setup.py (data_files): Only add the mo files if the Locales
3697     directory actually exists, so that setup.py works with a fresh CVS
3698     checkout
3699    
3700 jan 1716 2003-09-12 Jan-Oliver Wagner <[email protected]>
3701    
3702     * Examples/simple_extensions/simple_tool.py: bugfix: Tool is now
3703     in viewport, not anymore in view
3704    
3705 jan 1714 2003-09-04 Jan-Oliver Wagner <[email protected]>
3706    
3707     Introducing first Extension (gns2shp).
3708    
3709     * Extensions, Extensions/gns2shp, Extensions/gns2shp/test: New.
3710    
3711     * Extensions/__init__.py: New. init to make this dir a package.
3712    
3713     * Extensions/gns2shp/__init__.py: New. init to make this dir a package.
3714    
3715     * Extensions/gns2shp/test/README: New. some info on this test directory.
3716    
3717     * Extensions/gns2shp/test/ls.txt: New. test data set (Liechtenstein).
3718    
3719     * Extensions/gns2shp/test/test_gns2shp.py: New. Test for correct creation
3720     of Shapefile from GNS text file format
3721    
3722 jan 1705 2003-09-03 Jan-Oliver Wagner <[email protected]>
3723    
3724 jan 1707 Fix/workaround for bug #2019:
3725     https://intevation.de/rt/webrt?serial_num=2019
3726    
3727     * Thuban/UI/identifyview.py (IdentifyView.ID_STOP): New.
3728     (IdentifyView.__init__): Added another button that allows to
3729     stop the identify mode.
3730     (IdentifyView.OnStop): New. Stops the identify mode.
3731    
3732     2003-09-03 Jan-Oliver Wagner <[email protected]>
3733    
3734 jan 1705 Introducing a new exception dialog that allows to exit the
3735     application immediately.
3736     This fixes bug #2060: https://intevation.de/rt/webrt?serial_num=2060
3737    
3738     * Thuban/UI/exceptiondialog.py: New. A special exception dialog.
3739    
3740     * Thuban/UI/application.py (ThubanApplication.ShowExceptionDialog):
3741     Made strings available to translations. Exchanged the simple
3742     ScrolledMessageDialog by the new ExceptionDialog.
3743    
3744 bh 1694 2003-09-01 Bernhard Herzog <[email protected]>
3745    
3746 bh 1701 * NEWS: New. Summary of changes and release notes.
3747    
3748     * MANIFEST.in: Add NEWS
3749    
3750     2003-09-01 Bernhard Herzog <[email protected]>
3751    
3752 bh 1699 * MANIFEST.in: Correct the include statement for the mo-files and
3753     include the documentation too.
3754    
3755     * setup.py (data_files): Add the .mo files
3756     (setup call): Up to version 0.9.0
3757    
3758     2003-09-01 Bernhard Herzog <[email protected]>
3759    
3760 bh 1696 * Thuban/UI/dbdialog.py (ChooseDBTableDialog.__init__): Change the
3761     parameter list to just parent and session
3762     (ChooseDBTableDialog.__set_properties): Removed. Setting the
3763     selection of empty list boxes is not allowed (and produces C++
3764     assertion errors) and the rest of the setup is better done in
3765     __init__ anyway.
3766     (ChooseDBTableDialog.OnCancel, ChooseDBTableDialog.OnOK)
3767     (ChooseDBTableDialog.OnLBDClick, DBDialog.OnOK): Use the Python
3768     builtins True/False for booleans to avoid warnings from wxPython
3769    
3770     * Thuban/UI/mainwindow.py (MainWindow.AddDBLayer): Adapt to new
3771     ChooseDBTableDialog constructor parameters.
3772    
3773     2003-09-01 Bernhard Herzog <[email protected]>
3774    
3775 bh 1694 * Thuban/Model/postgisdb.py
3776     (PostGISTable): Extend doc-string
3777     (PostGISTable._fetch_table_information): Set the column index
3778     correctly, pretending ignored columns don't exist.
3779    
3780     * test/test_postgis_db.py (TestPostGISIgnoredColumns): New tests
3781     for postgis tables with data types not yet supported by thuban.
3782    
3783 bh 1692 2003-08-29 Bernhard Herzog <[email protected]>
3784    
3785     * HOWTO-Release: Tweak item about running the tests.
3786    
3787 jan 1690 2003-08-29 Jan-Oliver Wagner <[email protected]>
3788    
3789     * /Doc/manual/thuban-manual.xml: updated to version 1.0pre2.
3790    
3791 bh 1688 2003-08-29 Bernhard Herzog <[email protected]>
3792    
3793     Add some missing parameters to projections. Proj complains about
3794     them on windows but for some reason not on Linux.
3795    
3796     * test/test_save.py (SaveSessionTest.testLayerProjection): Add
3797     missing required projection parameters
3798    
3799     * test/test_proj.py (TestProjFile.test): Add missing required
3800     projection parameters
3801    
3802     * test/test_load_0_8.py (TestLayerProjection.file_contents)
3803     (TestLayerProjection.test): Add missing required projection
3804     parameters and tests for them
3805    
3806     * test/test_load.py (TestLayerProjection.file_contents)
3807     (TestLayerProjection.test): Add missing required projection
3808     parameters and tests for them
3809    
3810     * test/test_layer.py (TestLayer.test_base_layer): Add missing
3811     required projection parameters
3812    
3813     2003-08-29 Bernhard Herzog <[email protected]>
3814    
3815     * libraries/pyprojection/Projection.i: Use pj_get_errno_ref to
3816     access the pj_errno because directly accessing pj_errno doesn't
3817     work on windows if the proj library is in a DLL
3818    
3819     * libraries/pyprojection/Projection_wrap.c: Update from Projection.i
3820    
3821 bh 1672 2003-08-28 Bernhard Herzog <[email protected]>
3822    
3823 bh 1685 * test/test_proj.py: Import things from Thuban after calling
3824     initthuban
3825    
3826     * test/test_load.py (LoadSessionTest.filenames): New class
3827     variable with the filename attributes to normalize
3828     (LoadSessionTest.check_format): Pass self.filenames to
3829     sax_eventlist to normalize the filename attributes
3830    
3831     * test/xmlsupport.py: Add cvs keywords
3832     (SaxEventLister.__init__): New parameter filenames which indicates
3833     attributes that contain filenames
3834     (SaxEventLister.startElementNS): Normalize the filename attributes
3835     with os.path.normpath
3836     (sax_eventlist): New parameter filenames to pass through to
3837     SaxEventLister
3838    
3839     * test/test_derivedshapestore.py: Make this file callable as a
3840     program to execute the tests
3841     (TestDerivedShapeStoreExceptions.test_table_with_wrong_size): Bind
3842     the session to self.session so that it gets destroyed properly
3843    
3844     * test/test_layer.py (TestLayer.tearDown): Call the session's
3845     Destroy method
3846    
3847     * test/test_map.py (TestMapBase.tearDown): Destroy self.session
3848     too if it exists
3849     (TestMapAddLayer.test_add_layer): Bind the session to self.session
3850     so that it gets destroyed properly
3851    
3852     * test/postgissupport.py (reason_for_not_running_tests): Add a
3853     test for the existence of popen2.Popen4.
3854    
3855     * test/test_save.py (SaveSessionTest.tearDown): New. Provide a
3856     reliable way to destroy the sessions created in the test cases
3857     (SaveSessionTest.test_dbf_table): Bind the session to self.session
3858     so that it gets destroyed properly
3859     (SaveSessionTest.testLayerProjection): Bind the session to
3860     self.session so that it gets destroyed properly
3861    
3862     * test/test_session.py (UnreferencedTablesTests.tearDown): Make
3863     sure that the session is destroyed properly
3864    
3865     * test/test_shapefilestore.py: Make this callable as a program to
3866     execute the tests
3867    
3868     * test/test_scalebar.py: Remove unnecessary import of _ from
3869     Thuban
3870    
3871     * test/support.py (print_garbage_information): Call initthuban
3872     here because it may be called indirectly from test cases that test
3873     test support modules which do not use anything from thuban itself
3874     (ThubanTestProgram.runTests): Remove unnecessary debug print
3875    
3876     2003-08-28 Bernhard Herzog <[email protected]>
3877    
3878 bh 1672 * Thuban/version.py (longversion): Update to 0.9
3879    
3880     * Thuban/UI/mainwindow.py: Remove some unused imports
3881    
3882     * README: Add section about required additional software. Add date
3883     and revision CVS keywords
3884    
3885     * HOWTO-Release: Add item about the translations. Add date and
3886     revision CVs keywords and change formatting to match README a bit
3887     better
3888    
3889     * po/de.po: Update for 0.9
3890    
3891     * test/README: Tweak the wording a little because many tests are
3892     not really unittest.
3893    
3894 bh 1663 2003-08-27 Bernhard Herzog <[email protected]>
3895    
3896 bh 1665 As preparation for the 0.9 release, switch thuban files to a
3897     non-dev namespace
3898    
3899     * Thuban/Model/save.py (SessionSaver.write_session): Write files
3900     with the http://thuban.intevation.org/dtds/thuban-0.9.dtd
3901     namespace
3902    
3903     * Thuban/Model/load.py (SessionLoader.__init__): Accept the
3904     http://thuban.intevation.org/dtds/thuban-0.9.dtd namespace too
3905    
3906     * test/test_save.py (SaveSessionTest.dtd)
3907     (SaveSessionTest.testEmptySession)
3908     (SaveSessionTest.testSingleLayer)
3909     (SaveSessionTest.testLayerProjection)
3910     (SaveSessionTest.testRasterLayer)
3911     (SaveSessionTest.testClassifiedLayer)
3912     (SaveSessionTest.test_dbf_table)
3913     (SaveSessionTest.test_joined_table)
3914     (SaveSessionTest.test_save_postgis): Update for new namespace
3915    
3916     * test/test_load.py (LoadSessionTest.dtd, TestSingleLayer)
3917     (TestLayerVisibility.file_contents, TestLabels.file_contents)
3918     (TestLayerProjection.file_contents)
3919     (TestRasterLayer.file_contents, TestJoinedTable.file_contents)
3920     (TestPostGISLayer.file_contents)
3921     (TestPostGISLayerPassword.file_contents)
3922     (TestLoadError.file_contents, TestLoadError.test): Update for new
3923     namespace
3924    
3925     2003-08-27 Bernhard Herzog <[email protected]>
3926    
3927 bh 1663 Make the table interface distinguish between row ids (an integer
3928     that uniquely identifies a row) and row ordinals (a simple row
3929     count from 0 to NumRows() - 1)
3930    
3931     * Thuban/Model/postgisdb.py (PostGISTable.RowIdToOrdinal)
3932     (PostGISTable.RowOrdinalToId): New methods to conver between row
3933     ids and row ordinals
3934     (PostGISTable.ReadRowAsDict, PostGISTable.ReadValue): New keyword
3935     parameter row_is_ordinal to indicate whether the row parameter is
3936     the row id or the ordinal
3937    
3938     * Thuban/Model/transientdb.py (TransientTableBase.RowIdToOrdinal)
3939     (TransientTableBase.RowOrdinalToId)
3940     (AutoTransientTable.RowIdToOrdinal)
3941     (AutoTransientTable.RowOrdinalToId): Same new methods as in
3942     PostGISTable.
3943     (TransientTableBase.ReadRowAsDict, TransientTableBase.ReadValue)
3944     (AutoTransientTable.ReadRowAsDict, AutoTransientTable.ReadValue):
3945     Same new parameter as in PostGISTable.
3946    
3947     * Thuban/Model/table.py (DBFTable.RowIdToOrdinal)
3948     (DBFTable.RowOrdinalToId, MemoryTable.RowIdToOrdinal)
3949     (MemoryTable.RowOrdinalToId): Same new methods as in PostGISTable.
3950     (DBFTable.ReadValue, DBFTable.ReadRowAsDict)
3951     (MemoryTable.ReadValue, MemoryTable.ReadRowAsDict): Same new
3952     parameter as in PostGISTable.
3953    
3954     * Thuban/UI/tableview.py (DataTable.RowIdToOrdinal)
3955     (DataTable.RowOrdinalToId): New methods to convert between row ids
3956     and row ordinals.
3957     (TableGrid.SelectRowById): New method to select a row based on its
3958     ID as opposed to its ordinal
3959     (DataTable.GetValue, TableGrid.OnRangeSelect)
3960     (TableGrid.OnSelectCell, LayerTableGrid.select_shapes)
3961     (QueryTableFrame.OnQuery, QueryTableFrame.get_selected)
3962     (LayerTableFrame.__init__): Convert between row ids and row
3963     ordinals as appropriate
3964    
3965     * test/postgissupport.py (PostGISDatabase.__init__): Add
3966     doc-string.
3967     (PostGISDatabase.initdb): The optional third item in a tuple in
3968     tables is now a (key, value) list with additional arguments to
3969     pass to upload_shapefile
3970     (upload_shapefile): New parameter gid_offset to allow gids that
3971     are not the same as the shapeids in the shapefile
3972     (PostgreSQLServer.get_default_static_data_db): Use the new
3973     gid_offset to make the gids in landmarks 1000 higher than the
3974     shapeids in the shapefile
3975    
3976     * test/test_viewport.py
3977     (TestViewportWithPostGIS.test_find_shape_at_point): Adapt to the
3978     new shapeids in the landmarks table
3979    
3980     * test/test_transientdb.py
3981     (TestTransientTable.run_iceland_political_tests)
3982     (TestTransientTable.test_transient_joined_table): Add tests for
3983     the new table methods and new keywords arguments.
3984    
3985     * test/test_postgis_db.py
3986     (TestPostGISTable.test_read_row_as_dict_row_count_mode)
3987     (TestPostGISTable.test_read_value_row_count_mode)
3988     (TestPostGISTable.test_row_id_to_ordinal)
3989     (TestPostGISTable.test_row_oridnal_to_id): New test for the new
3990     table methods and the new arguments
3991     (TestPostGISShapestorePoint.test_shapes_in_region)
3992     (TestPostGISShapestorePoint.test_shape_raw_data)
3993     (TestPostGISShapestorePoint.test_shape_points)
3994     (TestPostGISShapestorePoint.test_shape_shapeid)
3995     (TestPostGISShapestorePoint.test_all_shapes)
3996     (TestPostGISTable.test_simple_query)
3997     (TestPostGISTable.test_simple_query)
3998     (TestPostGISTable.test_simple_query)
3999     (TestPostGISTable.test_read_value)
4000     (TestPostGISTable.test_read_row_as_dict): Adapt to the new
4001     shapeids in the landmarks table
4002    
4003     * test/test_memory_table.py
4004     (TestMemoryTable.test_read_row_as_dict_row_count_mode)
4005     (TestMemoryTable.test_read_value_row_count_mode)
4006     (TestMemoryTable.test_row_id_to_ordinal)
4007     (TestMemoryTable.test_row_oridnal_to_id): New test for the new
4008     table methods and the new arguments
4009    
4010     * test/test_dbf_table.py
4011     (TestDBFTable.test_read_row_as_dict_row_count_mode)
4012     (TestDBFTable.test_read_value_row_count_mode)
4013     (TestDBFTable.test_row_id_to_ordinal)
4014     (TestDBFTable.test_row_oridnal_to_id): New test for the new table
4015     methods and the new arguments
4016    
4017 bh 1659 2003-08-26 Bernhard Herzog <[email protected]>
4018    
4019 bh 1661 * Thuban/Model/postgisdb.py (PostGISShapeStore.BoundingBox): Use a
4020     more postgis specific but much faster method to get the bounding
4021     box
4022    
4023     2003-08-26 Bernhard Herzog <[email protected]>
4024    
4025 bh 1659 * Thuban/Model/postgisdb.py (PostGISTable.Title)
4026     (PostGISShapeStore.AllShapes): Add these missing methods.
4027     (PostGISShapeStore.ShapesInRegion): No need to raise
4028     StopIteration. We can simply return
4029    
4030     * test/test_postgis_db.py (TestPostGISTable.test_title)
4031     (TestPostGISShapestorePoint.test_all_shapes): New tests for the
4032     new methods
4033    
4034 bh 1643 2003-08-25 Bernhard Herzog <[email protected]>
4035    
4036 bh 1657 * Thuban/Model/postgisdb.py (shapetype_map): Add MUTLIPOLYGON.
4037    
4038     * test/test_postgis_db.py (PolygonTests): New class containing
4039     those tests from TestPostGISShapestorePolygon that can also be
4040     used to test MUTLIPOLYGON tables
4041     (TestPostGISShapestorePolygon): Most tests are now in PolygonTests
4042     so derive from that
4043     (TestPostGISShapestoreMultiPolygon): New class with tests for
4044     MUTLIPOLYGON tables
4045    
4046     * test/postgissupport.py (PostGISDatabase.initdb): Allow the
4047     tables argument to have tuples with three items to override the
4048     WKT type used.
4049     (PostgreSQLServer.get_default_static_data_db): Use the above to
4050     create a polygon table with MUTLIPOLYGONs
4051     (point_to_wkt, coords_to_point, polygon_to_wkt, coords_to_polygon)
4052     (arc_to_wkt, coords_to_multilinestring): Rename from *_to_wkt to
4053     coords_to*
4054     (coords_to_multipolygon): New. Convert to MUTLIPOLYGON
4055     (wkt_converter): New. Map WKT types to converters
4056     (upload_shapefile): New parameter force_wkt_type to use a
4057     different WKT type than the default
4058    
4059     2003-08-25 Bernhard Herzog <[email protected]>
4060    
4061 bh 1655 * Thuban/UI/application.py
4062     (ThubanApplication.run_db_param_dialog): New. Suitable as a
4063     db_connection_callback. Main difference is that the dialog run
4064     from this method doesn't have a parent so it can be used even when
4065     there is no main window
4066     (ThubanApplication.OpenSession): Use self.run_db_param_dialog if
4067     no db_connection_callback was given. This way the dialog pops up
4068     even when the .thuban file was given as a command line parameter.
4069    
4070     2003-08-25 Bernhard Herzog <[email protected]>
4071    
4072 bh 1653 * Thuban/UI/view.py (MapCanvas.OnLeftUp): Release the the mouse
4073     before calling MouseLeftUp. MouseLeftUp may pop up modal dialogs
4074     which leads to an effectively frozen X session because the user
4075     can only interact with the dialog but the mouse is still grabbed
4076     by the canvas.
4077     Also, call the tool's Hide method before MouseLeftUp because
4078     MouseLeftUp may change the tool's coordinates.
4079    
4080     2003-08-25 Bernhard Herzog <[email protected]>
4081    
4082 bh 1651 * Thuban/UI/application.py (ThubanApplication.OpenSession): Catch
4083     LoadCancelled exceptions and handle them by returning immediately.
4084    
4085     2003-08-25 Bernhard Herzog <[email protected]>
4086    
4087 bh 1649 GUI part of loading sessions with postgis connections which may
4088     require user interaction to get passwords or updated parameters
4089    
4090     * Thuban/UI/dbdialog.py (DBDialog): Reimplement to make it look a
4091     bit nucer and be more generic.
4092     (DBFrame.OnAdd): Adapt to new DBDialog interface
4093    
4094     * Thuban/UI/application.py (ThubanApplication.OpenSession): New
4095     optional parameter db_connection_callback which is passed to
4096     load_session.
4097    
4098     * Thuban/UI/mainwindow.py (MainWindow.run_db_param_dialog): New.
4099     Suitable as a db_connection_callback
4100     (MainWindow.OpenSession): Use self.run_db_param_dialog as the
4101     db_connection_callback of the application's OpenSession method
4102    
4103    
4104     2003-08-25 Bernhard Herzog <[email protected]>
4105    
4106 bh 1647 Basic loading of sessions containing postgis connections:
4107    
4108     * Thuban/Model/load.py (LoadError): Add doc-string
4109     (LoadCancelled): New exception class to indicate a cancelled load
4110     (SessionLoader.__init__): Add the db_connection_callback parameter
4111     which will be used by the loader to get updated parameters and a
4112     password for a database connection
4113     (SessionLoader.__init__): Add the new XML elements to the
4114     dispatchers dictionary
4115     (SessionLoader.check_attrs): Two new conversions, ascii to convert
4116     to a byte-string object and idref as a generic id reference
4117     (SessionLoader.start_dbconnection)
4118     (SessionLoader.start_dbshapesource): New. Handlers for the new XML
4119     elements
4120     (load_session): Add the db_connection_callback to pass through the
4121     SessionLoader
4122    
4123     * test/test_load.py (TestPostGISLayer, TestPostGISLayerPassword):
4124     New classes to test loading of sessions with postgis database
4125     connections.
4126    
4127     2003-08-25 Bernhard Herzog <[email protected]>
4128    
4129 bh 1645 * Thuban/UI/mainwindow.py (__ThubanVersion__): Remove this and
4130     replace it and the comment with __BuildDate__ by the Source: and
4131     Id: cvs keywords as used in the other files.
4132    
4133     2003-08-25 Bernhard Herzog <[email protected]>
4134    
4135 bh 1643 * Thuban/Model/load.py (SessionLoader.check_attrs): Raise a
4136     LoadError when a required attribute is missing. The code used to
4137     be commented out for some reason, but probably should have been
4138     active.
4139    
4140     * test/test_load.py (TestLoadError.test): Test the message in the
4141     LoadError too to make sure it really is about the missing
4142     attribute
4143    
4144 bh 1632 2003-08-22 Bernhard Herzog <[email protected]>
4145 bh 1641
4146     * test/test_save.py (SaveSessionTest.test_dbf_table)
4147     (SaveSessionTest.test_joined_table): Add XML validation tests.
4148    
4149     2003-08-22 Bernhard Herzog <[email protected]>
4150    
4151 bh 1639 Implement saving a session with a postgis connection
4152 bh 1632
4153 bh 1639 * Resources/XML/thuban-0.9.dtd (dbconnection, dbshapesource) New
4154     elements for database connections and shapestores using db
4155     connections
4156     (session): Add the dbconnections to the content model
4157    
4158     * Thuban/Model/save.py (SessionSaver.write_db_connections): New.
4159     Write the db connections
4160     (SessionSaver.write_session): Call write_db_connections to write
4161     the connection before the data sources
4162     (SessionSaver.write_data_containers): Handle postgis shapestores
4163    
4164     * test/test_save.py (SaveSessionTest.thubanids)
4165     (SaveSessionTest.thubanidrefs): Update for new DTD
4166     (SaveSessionTest.test_save_postgis): New. Test saving a session
4167     with postgis connections
4168    
4169     * Thuban/Model/postgisdb.py (PostGISTable.DBConnection)
4170     (PostGISTable.TableName): New accessor methods for the connection
4171     and table name
4172    
4173     * test/test_postgis_db.py (TestPostGISTable.test_dbconn)
4174     (TestPostGISTable.test_dbname): New methods to test the new
4175     PostGISConnection methods
4176    
4177     2003-08-22 Bernhard Herzog <[email protected]>
4178    
4179 bh 1637 * Thuban/Model/postgisdb.py (ConnectionError): New exception class
4180     for exceptions occurring when establishing a Database connection
4181     (PostGISConnection.connect): Catch psycopg.OperationalError during
4182     connects and raise ConnectionError.
4183    
4184     * test/test_postgis_db.py (TestPostgisDBExceptions): New class for
4185     tests for database exceptions
4186    
4187     2003-08-22 Bernhard Herzog <[email protected]>
4188    
4189 bh 1635 Prepare the test suite for tests with required authentication
4190    
4191     * test/postgissupport.py (PostgreSQLServer.__init__): Add instance
4192     variables with two predefined users/passwords, one for the admin
4193     and one for a non-privileged user.
4194     (PostgreSQLServer.createdb): Pass the admin name to initdb and add
4195     the non-privileged user to the database and set the admin password
4196     (PostgreSQLServer.wait_for_postmaster): Use the admin user name.
4197     Better error reporting
4198     (PostgreSQLServer.connection_params)
4199     (PostgreSQLServer.connection_string): New methods to return
4200     information about how to connect to the server
4201     (PostgreSQLServer.execute_sql): New. Convenience method to execute
4202     SQL statements
4203     (PostgreSQLServer.require_authentication): Toggle whether the
4204     server requires authentication
4205     (PostgreSQLServer.create_user, PostgreSQLServer.alter_user): New.
4206     Add or alter users
4207     (PostGISDatabase.initdb): Pass the admin name one the
4208     subprocesses' command lines. Grant select rights on
4209     geometry_columns to everybody.
4210     (upload_shapefile): Use the admin name and password when
4211     connecting. Grant select rights on the new table to everybody.
4212    
4213     * test/test_viewport.py (TestViewportWithPostGIS.setUp): Use the
4214     server's new methods to get the connection parameters.
4215    
4216     * test/test_postgis_session.py (TestSessionWithPostGIS.setUp)
4217     (TestSessionWithPostGIS.test_remove_dbconn_exception): Use the
4218     server's new methods to get the connection parameters.
4219    
4220     * test/test_postgis_db.py
4221     (TestPostGISConnection.test_gis_tables_empty)
4222     (TestPostGISConnection.test_gis_tables_non_empty)
4223     (PostGISStaticTests.setUp): Use the server's new methods to get
4224     the connection parameters.
4225    
4226     2003-08-22 Bernhard Herzog <[email protected]>
4227    
4228 bh 1632 * Thuban/UI/about.py (About.__init__): Add the psycopg version.
4229    
4230     * Thuban/version.py: Add psycopg version
4231    
4232     * Thuban/Model/postgisdb.py (psycopg_version): New. Return the
4233     version of the psycopg module
4234    
4235     2003-08-22 Bernhard Herzog <[email protected]>
4236    
4237     * Thuban/UI/dbdialog.py (DBPwdDlg): Removed because it's not used.
4238     (DBFrame.OnEdit): Removed because it's not used and wouldn't work
4239     at the moment. The functionality should probably be implemented
4240     some time, though.
4241 bh 1633 (DBFrame.OnRemove): Display a message if the connection can't be
4242     removed because it's still in use.
4243 bh 1632
4244 jan 1629 2003-08-22 Jan-Oliver Wagner <[email protected]>
4245    
4246     * Thuban/UI/about.py (About.__init__): split up the huge about
4247     text into elements/lists for easier translation. This fixes bug
4248     https://intevation.de/rt/webrt?serial_num=2058
4249     Also, made some forgotten string available for the i18n.
4250    
4251 bh 1627 2003-08-21 Bernhard Herzog <[email protected]>
4252    
4253     Make postgis support really optional including insensitive menu
4254     items.
4255    
4256     * Thuban/Model/postgisdb.py (has_postgis_support): New. Return
4257     whether the postgis is supported.
4258    
4259     * Thuban/UI/dbdialog.py: Put the psycopg import into try..except
4260     to make postgis support optional
4261    
4262     * Thuban/UI/mainwindow.py (_has_postgis_support): New. Context
4263     version of Thuban.Model.postgisdb.has_postgis_support
4264     (database_management command): Make it only sensitive if postgis
4265     is supported.
4266    
4267 jan 1623 2003-08-21 Jan-Oliver Wagner <[email protected]>
4268    
4269 jan 1626 * Doc/manual/thuban-manual.xml: Added CVS revision for rev-history.
4270     (section Adding and Removing Layers): Added text and described
4271     multi-selection.
4272     (chapter Extensions): New.
4273    
4274     2003-08-21 Jan-Oliver Wagner <[email protected]>
4275    
4276 jan 1623 * Thuban/UI/mainwindow.py (MainWindow.AddLayer): Changed dialog
4277     settings to allow multiple files to load into the map.
4278     Also reduced selection to *.shp as a default.
4279    
4280 bh 1621 2003-08-20 Bernhard Herzog <[email protected]>
4281    
4282     Add dialogs and commands to open database connections and add
4283     database layers.
4284    
4285     * Thuban/UI/mainwindow.py (MainWindow.DatabaseManagement): New
4286     method to open the database connection management dialog
4287     (MainWindow.AddDBLayer): New method to add a layer from a database
4288     (_has_dbconnections): New helper function to use for sensitivity
4289     (database_management command, layer_add_db command): New commands
4290     that call the above new methods.
4291     (main_menu): Add the new commands to the menu.
4292    
4293     * Thuban/Model/postgisdb.py (PostGISConnection.__init__)
4294     (PostGISConnection.connect): Establish the actual connection in a
4295     separate method and call it in __init__. This makes it easier to
4296     override the behavior in test cases
4297     (PostGISConnection.BriefDescription): New method to return a brief
4298     description for use in dialogs.
4299    
4300     * test/test_postgis_db.py (NonConnection): DB connection that
4301     doesn't actually connect
4302     (TestBriefDescription): New class with tests for the new
4303     BriefDescription method
4304    
4305 jan 1619 2003-08-19 Jan-Oliver Wagner <[email protected]>
4306    
4307     Moved anything from extensions to libraries.
4308    
4309     * libraries: New.
4310    
4311     * libraries/ pyprojection, pyshapelib, shapelib, thuban: New.
4312    
4313     * libraries/pyprojection/ LICENSE, MANIFEST.in, Projection.i,
4314     Projection.py, Projection_wrap.c, setup.py, swighelp.txt: These files have
4315     been moved here from thuban/extensions/pyprojection/
4316     See there in the Attic for the older history.
4317    
4318     * libraries/pyshapelib/ COPYING, ChangeLog, NEWS, README, dbflib.i,
4319     dbflib.py, dbflib_wrap.c, pyshapelib_api.h, pytest.py, setup.py,
4320     shapelib.i, shapelib.py, shapelib_wrap.c, shptreemodule.c: These files
4321     have been moved here from thuban/extensions/pyshapelib/
4322     See there in the Attic for the older history.
4323    
4324     * libraries/shapelib/ dbfopen.c, shapefil.h, shpopen.c, shptree.c: These
4325     files have been moved here from thuban/extensions/shapelib/
4326     See there in the Attic for the older history.
4327    
4328     * libraries/thuban/ bmpdataset.cpp, cpl_mfile.cpp, cpl_mfile.h,
4329     gdalwarp.cpp, wxproj.cpp: These files have been moved here from
4330     thuban/extensions/thuban/
4331     See there in the Attic for the older history.
4332    
4333     * MANIFEST.in, setup.cfg, setup.py: renamed extensions to libraries.
4334    
4335     * extensions/thuban/ bmpdataset.cpp, cpl_mfile.cpp, cpl_mfile.h,
4336     gdalwarp.cpp, wxproj.cpp: Moved to libraries/thuban.
4337    
4338     * extensions/shapelib/ dbfopen.c, shapefil.h, shpopen.c, shptree.c:
4339     Moved to libraries/shapelib.
4340    
4341     * extensions/pyshapelib/ COPYING, NEWS, dbflib.py, pytest.py,
4342     shapelib.py, README, dbflib_wrap.c, setup.py, shapelib_wrap.c,
4343     ChangeLog, dbflib.i, pyshapelib_api.h, shapelib.i, shptreemodule.c:
4344     Moved to libraries/pyshapelib.
4345    
4346     * extensions/pyprojection/ MANIFEST.in, Projection.py, setup.py,
4347     LICENSE, Projection.i, Projection_wrap.c, swighelp.txt:
4348     Moved to libraries/pyprojection.
4349    
4350     * extensions/ pyprojection, pyshapelib, shapelib, thuban: Removed.
4351    
4352     * extensions: Removed.
4353    
4354 bh 1606 2003-08-19 Bernhard Herzog <[email protected]>
4355    
4356 bh 1609 * test/test_viewport.py (ViewPortTest): We don't use the
4357     facilities of FileTestMixin so don't derive from it.
4358     (TestViewportWithPostGIS): New class with tests for using a
4359     viewport on a map with postgis layers.
4360    
4361     2003-08-19 Bernhard Herzog <[email protected]>
4362    
4363     Add the db connection management to the session.
4364    
4365     * Thuban/Model/session.py (Session.__init__): New instance
4366     variable db_connections
4367     (Session.AddDBConnection, Session.DBConnections)
4368     (Session.HasDBConnections, Session.CanRemoveDBConnection)
4369     (Session.RemoveDBConnection): New methods to manage and query the
4370     db connections managed by the session
4371     (Session.OpenDBShapeStore): New method to open a shapestore from a
4372     db connection
4373    
4374     * Thuban/Model/messages.py (DBCONN_REMOVED, DBCONN_ADDED): New
4375     messages for the db connection handling in the session
4376    
4377     * test/test_postgis_session.py: New. test cases for the session's
4378     db connection handling with postgis connections
4379    
4380     2003-08-19 Bernhard Herzog <[email protected]>
4381    
4382 bh 1606 Add very basic postgis database support and the corresponding test
4383     cases. The test cases require a PostgreSQL + postgis installation
4384     but no existing database. The database will be created
4385     automatically by the test cases
4386    
4387     * test/README: Add note about skipped tests and the requirements
4388     of the postgis tests.
4389    
4390     * Thuban/Model/postgisdb.py: New. Basic postgis database support.
4391    
4392     * test/test_postgis_db.py: New. Test cases for the postgis
4393     support.
4394    
4395     * Thuban/Model/wellknowntext.py: New. Parser for well-known-text
4396     format
4397    
4398     * test/test_wellknowntext.py: New. Test cases for the
4399     wellknowntext parser
4400    
4401     * test/postgissupport.py: New. Support module for tests involving
4402     a postgis database.
4403    
4404     * test/support.py (execute_as_testsuite): Shut down the postmaster
4405     if it's still running after the tests
4406    
4407     * Thuban/Model/data.py (RAW_WKT): New constant for raw data in
4408     well known text format
4409    
4410 jan 1604 2003-08-19 Jan-Oliver Wagner <[email protected]>
4411    
4412     * Examples/simple_extensions/hello_world.py: New. Raises a Hello World
4413     message dialog.
4414    
4415 bh 1600 2003-08-18 Bernhard Herzog <[email protected]>
4416    
4417 bh 1602 * test/support.py (ThubanTestResult.printErrors): Indent the
4418     reason for the skips in the output to make it a bit more readable.
4419     (execute_as_testsuite): New helper function to run a test suite
4420     and print some more information.
4421     (run_tests): Use execute_as_testsuite to run the tests
4422    
4423     * test/runtests.py (main): Use execute_as_testsuite to run the
4424     tests
4425    
4426     2003-08-18 Bernhard Herzog <[email protected]>
4427    
4428 bh 1600 Fix some bugs in Thuban and the test suite that were uncovered by
4429     changes introduced in Python 2.3:
4430    
4431     * Thuban/Model/table.py (DBFTable.__init__): Make sure the
4432     filename is an absolute name
4433    
4434     * Thuban/Model/layer.py (RasterLayer.__init__): Make sure the
4435     filename is an absolute name
4436    
4437     * test/test_save.py (SaveSessionTest.testRasterLayer): Use a
4438     unique filename to save to and use the correct relative filename
4439     in the expected output.
4440     (SaveSessionTest.test_dbf_table): Use the correct relative
4441     filename in the expected output.
4442    
4443     * test/test_layer.py (TestLayer.test_raster_layer): Update the
4444     test to check whether the filename is absolute.
4445    
4446 jan 1596 2003-08-18 Jan-Oliver Wagner <[email protected]>
4447    
4448     * Thuban/UI/about.py (About.__init__): Added Silke Reimer.
4449    
4450 bh 1586 2003-08-15 Bernhard Herzog <[email protected]>
4451    
4452 bh 1594 Change the way shapes are returned by a shape store. The
4453     ShapesInRegion method returns an iterator over actual shape
4454     objects instead of a list of shape ids.
4455    
4456     * Thuban/Model/data.py (ShapefileShape.ShapeID): New. Return shape
4457     id.
4458     (ShapefileStore.ShapesInRegion): Return an iterator over the
4459     shapes which yields shape objects instead of returning a list of
4460     shape ids
4461     (ShapefileStore.AllShapes): New. Return an iterator over all
4462     shapes in the shape store
4463     (DerivedShapeStore.AllShapes): New. Like in ShapefileStore
4464    
4465     * Thuban/Model/layer.py (Layer.ShapesInRegion): Update
4466     doc-string.
4467    
4468     * Thuban/UI/baserenderer.py
4469     (BaseRenderer.layer_ids, BaseRenderer.layer_shapes): Rename to
4470     layer_shapes and make it return an iterator containg shapes
4471     instead of a list of ids.
4472     (BaseRenderer.draw_shape_layer): Update doc-string; Adapt to
4473     layer_shapes() change
4474    
4475     * Thuban/UI/renderer.py (ScreenRenderer.layer_ids)
4476     (ScreenRenderer.layer_shapes): Rename as in BaseRenderer
4477    
4478     * Thuban/UI/viewport.py (ViewPort._find_shape_in_layer): Adapt to
4479     changes in the ShapesInRegion return value.
4480     (ViewPort._get_hit_tester): Remove commented out code
4481    
4482     * test/mockgeo.py (SimpleShapeStore.ShapesInRegion): Adapt to the
4483     new return value.
4484     (SimpleShapeStore.AllShapes): New. Implement this method too.
4485    
4486     * test/test_layer.py (TestLayer.test_arc_layer)
4487     (TestLayer.test_polygon_layer, TestLayer.test_point_layer)
4488     (TestLayer.test_point_layer_with_projection)
4489     (TestLayer.test_derived_store): Adapt to changes in the
4490     ShapesInRegion return value.
4491    
4492     * test/test_shapefilestore.py
4493     (TestShapefileStoreArc.test_shapes_in_region)
4494     (TestShapefileStorePolygon.test_shapes_in_region)
4495     (TestShapefileStorePoint.test_shapes_in_region): Adapt to changes
4496     in the ShapesInRegion return value.
4497     (TestShapefileStorePoint.test_all_shapes)
4498     (TestShapefileStoreArc.test_shape_shapeid): New tests for the new
4499     methods
4500    
4501     * test/test_derivedshapestore.py
4502     (TestDerivedShapeStore.test_shapes_in_region): Adapt to changes in
4503     the ShapesInRegion return value.
4504     (TestDerivedShapeStore.test_all_shapes)
4505     (TestDerivedShapeStore.test_shape_shapeid): New tests for the new
4506     methods
4507    
4508     2003-08-15 Bernhard Herzog <[email protected]>
4509    
4510 bh 1592 Make the renderers deal correctly with raw vs. python level
4511     representation of shape geometries
4512    
4513     * Thuban/UI/baserenderer.py (BaseRenderer.low_level_renderer):
4514     Return a flag useraw in addition to the callable and the parameter
4515     to indicate whether the callable can deal with the raw shape data
4516     or uses the higher level python lists of coordinates. The callable
4517     now should accept either the raw data or the return value of the
4518     shape's Points() method.
4519     (BaseRenderer.draw_shape_layer): Adapt to the low_level_renderer
4520     change
4521     (BaseRenderer.projected_points): Instead of the shape id use the
4522     points list as parameter.
4523     (BaseRenderer.draw_polygon_shape, BaseRenderer.draw_arc_shape)
4524     (BaseRenderer.draw_point_shape): Adapt to projected_points()
4525     change and accept the points list as parameter instead of the
4526     shape id.
4527    
4528     * Thuban/UI/renderer.py (MapRenderer.low_level_renderer): Return
4529     the useraw flag as required by the BaseRenderer
4530     (ScreenRenderer.draw_shape_layer): Adapt to low-level renderer
4531     changes.
4532    
4533     * test/test_baserenderer.py
4534     (TestBaseRenderer.test_point_with_classification): New test for
4535     rendering a map with classifications.
4536    
4537     2003-08-15 Bernhard Herzog <[email protected]>
4538    
4539 bh 1590 * Thuban/UI/viewport.py (ViewPort.find_shape_at)
4540     (ViewPort._find_shape_in_layer, ViewPort._find_shape_in_layer)
4541     (ViewPort._get_hit_tester, ViewPort.projected_points)
4542     (ViewPort._hit_point, ViewPort._hit_arc, ViewPort._hit_polygon)
4543     (ViewPort._find_label_at): Split the find_shape_at method into
4544     several new methods and use the functions in the hit-test module.
4545    
4546     * Thuban/UI/hittest.py: New module with Python-level hit-testing
4547     functions
4548    
4549     * test/test_hittest.py: New. Test for the new hittest module
4550    
4551     2003-08-15 Bernhard Herzog <[email protected]>
4552    
4553 bh 1588 * Thuban/Model/layer.py (Layer.ShapesInRegion): Apply the layer
4554     projection to all corners of the bounding box to get a better
4555     approximation of the projected bounding box
4556    
4557     * test/test_layer.py (TestLayer.test_point_layer_with_projection):
4558     New. Test coordinate handling of a layer with a projection.
4559     Catches the bug fixed in Layer.ShapesInRegion
4560    
4561     2003-08-15 Bernhard Herzog <[email protected]>
4562    
4563 bh 1586 Move some of the mock objects in test_baserenderer into their own
4564     module so they can easily be used from other tests
4565    
4566     * test/mockgeo.py: New test helper module with some mock objects
4567     for geometry related things like shapes, shapestores and
4568     projections.
4569    
4570     * test/test_mockgeo.py: New. Tests for the new helper module
4571    
4572     * test/test_baserenderer.py: Some of the mock-objects are in
4573     mockgeo now.
4574    
4575 jan 1584 2003-08-12 Jan-Oliver Wagner <[email protected]>
4576    
4577     * Thuban/UI/about.py (About.__init__): Added Björn Broscheit.
4578    
4579 bh 1580 2003-08-12 Bernhard Herzog <[email protected]>
4580    
4581 bh 1582 * po/de.po: New. German translations by Bjoern Broscheit
4582    
4583     2003-08-12 Bernhard Herzog <[email protected]>
4584    
4585 bh 1580 * Thuban/UI/projdialog.py (UnknownProjPanel._DoLayout): Translated
4586     strings have to be one string literal.
4587    
4588 bh 1573 2003-08-11 Bernhard Herzog <[email protected]>
4589    
4590 bh 1578 * test/support.py (FloatComparisonMixin.assertPointListEquals):
4591     New. This method was used in various derived classes, but it's
4592     better to have it here.
4593    
4594     * test/test_shapefilestore.py
4595     (ShapefileStoreTests.assertPointListEquals): Removed. It's now in
4596     FloatComparisonMixin
4597    
4598     * test/test_layer.py (TestLayer.assertPointListEquals): Removed.
4599     It's now in FloatComparisonMixin
4600    
4601     * test/test_derivedshapestore.py
4602     (TestDerivedShapeStore.assertPointListEquals): Removed. It's now
4603     in FloatComparisonMixin
4604    
4605     2003-08-11 Bernhard Herzog <[email protected]>
4606    
4607 bh 1573 * Thuban/UI/join.py (JoinDialog.OnJoin): Add missing space to
4608     error message
4609    
4610 jan 1569 2003-08-08 Jan-Oliver Wagner <[email protected]>
4611    
4612 jan 1571 * Doc/manual/thuban-manual.xml: Now use authorgroup. Added revhistory
4613     with version number.
4614     Changed title to reflect version number of Thuban.
4615    
4616     2003-08-08 Jan-Oliver Wagner <[email protected]>
4617    
4618 jan 1569 * Thuban/UI/about.py (About.__init__): Reworked the hall of fame. Now
4619     the list corresponds to the "About" web page.
4620    
4621 bh 1567 2003-08-08 Bernhard Herzog <[email protected]>
4622    
4623     * Thuban/UI/projdialog.py (UTMProposeZoneDialog.dialogLayout):
4624     Make sure translated strings are recognized as one string literal.
4625    
4626     * Thuban/UI/proj4dialog.py (UTMProposeZoneDialog.dialogLayout):
4627     Make sure translated strings are recognized as one string literal.
4628    
4629     * Thuban/UI/classgen.py (ClassGenDialog.OnOK): Make sure
4630     translated strings are recognized as one string literal.
4631    
4632     * Thuban/UI/application.py (ThubanApplication.OpenSession): Make
4633     sure translated strings are recognized as one string literal.
4634    
4635 bh 1556 2003-08-07 Bernhard Herzog <[email protected]>
4636    
4637 bh 1565 * Thuban/Model/data.py (DerivedShapeStore.RawShapeFormat): New.
4638     Simply delegates to the original shapestore.
4639    
4640     * test/test_derivedshapestore.py
4641     (TestDerivedShapeStore.test_raw_format): New. Test case for
4642     DerivedShapeStore.RawShapeFormat
4643    
4644     2003-08-07 Bernhard Herzog <[email protected]>
4645    
4646 bh 1561 Add raw data interface to shape objects.
4647    
4648     * Thuban/Model/data.py (ShapefileShape, Shape): Rname the shape
4649     class to ShapefileShape which now holds shapefile specific
4650     information.
4651     (ShapefileShape.compute_bbox): Simplified to not cache any
4652     information. The way this method is used that shouldn't matter
4653     performance wise.
4654     (ShapefileShape.RawData): New. Return the shapeid which is the raw
4655     data format for shapes from shapefiles.
4656     (ShapefileStore.RawShapeFormat): New. Return the raw datatype used
4657     in the shape objects returned by a shapestore. For a
4658     ShapefileStore this is always RAW_SHAPEFILE.
4659     (RAW_PYTHON, RAW_SHAPEFILE): Constants for the RawShapeFormat
4660     method.
4661    
4662     * test/test_shapefilestore.py
4663     (TestShapefileStore.test_raw_format): New test to test the raw
4664     format feature of shapes.
4665    
4666 bh 1560 * Thuban/Model/layer.py: Remove the unused import of Shape from
4667     data. It was only there for interface compatibility but it's not
4668 bh 1561 used inside of Thuban and the generic Shape class has gone away.
4669 bh 1560
4670 bh 1563 * Thuban/UI/renderer.py (MapRenderer.low_level_renderer): Check
4671     the raw data format and only use an optimized version of its a
4672     shapefile.
4673    
4674 bh 1561 2003-08-07 Bernhard Herzog <[email protected]>
4675    
4676 bh 1559 * test/test_baserenderer.py (SimpleShape): Shape class for the
4677     tests.
4678     (SimpleShapeStore.Shape): Use SimpleShape instead of
4679     Thuban.Model.data.Shape to make the tests independed of the coming
4680     changes.
4681    
4682     2003-08-07 Bernhard Herzog <[email protected]>
4683    
4684 bh 1556 * test/support.py (SkipTest, ThubanTestResult, ThubanTestRunner)
4685     (ThubanTestProgram): New classes that extend the respective
4686     classes from unittest. These new version support skipping tests
4687     under certain expected conditions. In the Thuban test suite we
4688     uses this for tests that require the optional gdal support.
4689     (run_tests): Use ThubanTestProgram instead of the unittest.main()
4690    
4691     * test/runtests.py (main): Use the new ThubanTestRunner instead of
4692     the normal one from unittest
4693    
4694     * test/test_layer.py (TestLayer.test_raster_layer): If this test
4695     is not run because gdal support isn't available report this to the
4696     runner.
4697    
4698     * test/test_baserenderer.py
4699     (TestBaseRenderer.test_raster_no_projection): Do not run this test
4700     if gdal support isn't available and report this to the runner.
4701    
4702 bh 1553 2003-08-06 Bernhard Herzog <[email protected]>
4703    
4704     Rearrange the renderers a bit, partly in preparation for changes
4705     required for the postgis merge, partly to make it more testable.
4706     Also make the representation of coordinates in Shapes more
4707     consistent.
4708    
4709     * Thuban/UI/renderer.py (MapRenderer): Most of the code/methods in
4710     this class is now in BaseRenderer. This class is now practically
4711     only a specialization of BaseRenderer for rendering to an actual
4712     wx DC.
4713     (ScreenRenderer.draw_shape_layer): Use self.low_level_renderer()
4714     to get the shapetype specific rendering functions.
4715    
4716     * Thuban/UI/baserenderer.py: New file with the basic rendering
4717     logic. The code in this file is completely independend of wx.
4718     (BaseRenderer): Class with the basic rendering logic
4719    
4720     * test/test_baserenderer.py: New. Test cases for BaseRenderer
4721    
4722     * Thuban/UI/view.py (MapCanvas.__init__): New instance variable
4723     error_on_redraw to guard agains endless loops and stack overflows
4724     when there's a bug in the rendering code that raises exceptions.
4725     (MapCanvas.OnIdle, MapCanvas._do_redraw): Split the actual
4726     rendering into a separate method _do_redraw so that error handling
4727     is a bit easier. When an exception occurs, set error_on_redraw to
4728     true. When it's true on entry to OnIdle do nothing and return
4729     immediately.
4730    
4731     * Thuban/Model/data.py (ShapefileStore.Shape): For consistency, a
4732     Shape object will always have the coordinates as a list of list of
4733     coordinate pairs (tuples).
4734     (Shape.compute_bbox): Adapt to new representation.
4735    
4736     * Thuban/UI/viewport.py (ViewPort.find_shape_at)
4737     (ViewPort.LabelShapeAt): Adapt to new coordinate representation in
4738     Shape objects.
4739    
4740     * test/test_shapefilestore.py
4741     (ShapefileStoreTests.assertFloatTuplesEqual)
4742     (ShapefileStoreTests.assertPointListEquals): Rename to
4743     assertPointListEquals and change purpose to checking equality of
4744     the lists returned by Shape.Points().
4745     (TestShapefileStoreArc.test_shape)
4746     (TestShapefileStorePolygon.test_shape)
4747     (TestShapefileStorePoint.test_shape): Use the new
4748     assertPointListEquals instead of assertFloatTuplesEqual
4749    
4750     * test/test_layer.py (TestLayer.assertFloatTuplesEqual)
4751     (TestLayer.assertPointListEquals): Rename to assertPointListEquals
4752     and change purpose to checking equality of the lists returned by
4753     Shape.Points().
4754     (TestLayer.test_arc_layer, TestLayer.test_arc_layer)
4755     (TestLayer.test_polygon_layer, TestLayer.test_point_layer)
4756     (TestLayer.test_derived_store): Use the new assertPointListEquals
4757     instead of assertFloatTuplesEqual
4758    
4759     * test/test_derivedshapestore.py
4760     (TestDerivedShapeStore.assertFloatTuplesEqual)
4761     (TestDerivedShapeStore.assertPointListEquals): Rename to
4762     assertPointListEquals and change purpose to checking equality of
4763     the lists returned by Shape.Points().
4764     (TestDerivedShapeStore.test_shape): Use the new
4765     assertPointListEquals instead of assertFloatTuplesEqual
4766    
4767 jan 1550 2003-08-06 Jan-Oliver Wagner <[email protected]>
4768    
4769     * Thuban/UI/projdialog.py (UTMPanel._OnPropose): Added test for
4770     a bounding box. A dialog is raised in case, no bounding box
4771     is found. This fixes bug #2043:
4772     https://intevation.de/rt/webrt?serial_num=2043
4773    
4774 bh 1548 2003-08-05 Bernhard Herzog <[email protected]>
4775    
4776     * Thuban/Model/color.py (Color.__repr__): Make the repr of a color
4777     object look like a Color instantiation. Formerly it looked like a
4778     tuple.
4779    
4780     * test/test_color.py (TestColor.test_repr)
4781     (TestColor.test_equality, TestColor.test_inequality): New. test
4782     some more apects of the Color class
4783     (TestTransparent.test_repr, TestTransparent.test_hex)
4784     (TestTransparent.test_equality): New. Test cases for the
4785     Transparent object.
4786    
4787 jan 1545 2003-08-04 Jan-Oliver Wagner <[email protected]>
4788    
4789     * Doc/manual/thuban-manual.xml: a number of small improvements.
4790     The resulting file is the version submitted for GREAT-ER II.
4791    
4792 bh 1540 2003-08-01 Bernhard Herzog <[email protected]>
4793    
4794 bh 1543 * Thuban/UI/resource.py, Thuban/UI/projdialog.py,
4795     Thuban/UI/join.py, Thuban/UI/classgen.py, Thuban/UI/about.py,
4796     Thuban/Model/resource.py: Insert cvs keywords and doc-strings.
4797    
4798     * Thuban/UI/common.py: Insert cvs keywords and doc-strings.
4799     (Color2wxColour, wxColour2Color, ThubanBeginBusyCursor)
4800     (ThubanEndBusyCursor): Add doc-strings
4801    
4802     2003-08-01 Bernhard Herzog <[email protected]>
4803    
4804 bh 1540 First step towards PostGIS integration. More abstraction by movin
4805     more code from the layer to the shapestore. More methods of the
4806     layer are now simply delegated to the equivalent method of the
4807     shapestore. The SHAPETYPE_* constants are now in data not in
4808     layer.
4809    
4810     * Thuban/Model/data.py (SHAPETYPE_POLYGON, SHAPETYPE_ARC)
4811     (SHAPETYPE_POINT, Shape): Move these constants and classes from
4812     layer.py to data.py
4813     (ShapefileStore.__init__): More Initialization for the new methods
4814     and functionality.
4815     (ShapefileStore.ShapeType, ShapefileStore.NumShapes)
4816     (ShapefileStore.BoundingBox, ShapefileStore.ShapesInRegion)
4817     (ShapefileStore.Shape): New methods that were formerly implemented
4818     in the layer.
4819     (DerivedShapeStore.Shape, DerivedShapeStore.ShapesInRegion)
4820     (DerivedShapeStore.ShapeType, DerivedShapeStore.NumShapes)
4821     (DerivedShapeStore.BoundingBox): New. DerivedShapeStore
4822     equivalents of the new shape methods. These versions are simply
4823     delegated to the original shapstore.
4824    
4825     * Thuban/Model/layer.py (SHAPETYPE_POLYGON, SHAPETYPE_ARC)
4826     (SHAPETYPE_POINT, Shape): Removed. They're now in data.py
4827     (Layer.SetShapeStore): Removed the initializatin of instance
4828     variables that were needed for the stuff that's now in
4829     ShapefileStore
4830     (Layer.BoundingBox, Layer.NumShapes, Layer.ShapeType)
4831     (Layer.Shape, Layer.ShapesInRegion): Simply delegate to the
4832     shapestore.
4833    
4834     * Thuban/UI/classifier.py, Thuban/UI/renderer.py,
4835     Thuban/UI/viewport.py: Import the SHAPETYPE_* constants from data
4836     instead of layer.
4837    
4838     * test/test_shapefilestore.py: New. Tests for ShapefileStore.
4839    
4840     * test/test_derivedshapestore.py: New. Tests for DerivedShapeStore.
4841    
4842     * test/test_layer.py: Import the SHAPETYPE_* constants from data
4843     instead of layer.
4844     (TestLayer.test_derived_store): Remove the test for the exception
4845     when instantiating the DerivedShapeStore with an incompatible
4846     table which is now in test_derivedshapestore.py. Add some more
4847     tests of the layer methods to determine whether they work for a
4848     DerivedShapeStore as well.
4849    
4850 jonathan 1534 2003-07-31 Jonathan Coles <[email protected]>
4851    
4852     * Doc/manual/thuban-manual.xml: Fix the list of required packages
4853     by just listing the name and where they can be found.
4854    
4855 frank 1532 2003-07-31 Frank Koormann <[email protected]>
4856    
4857     * Doc/manual/thuban-manual.xml:
4858     Changed the screenshot elements to figure.
4859     Changed some variablelist elements to itemizedlist.
4860     Added section on GDAL formats.
4861    
4862 jonathan 1531 2003-07-31 Jonathan Coles <[email protected]>
4863    
4864     * Doc/manual/thuban-manual.xml: Added a few sentences about
4865     the Fix Border Color option when generating classes.
4866    
4867 jonathan 1529 2003-07-30 Jonathan Coles <[email protected]>
4868    
4869     * Thuban/Model/classgen.py: Add docstrings. Rename specific
4870     Ramp instances to use lower_case_style.
4871    
4872     * Thuban/UI/classgen.py: Use renamed Ramp instances.
4873    
4874     * Thuban/UI/classifier.py: Add docstrings.
4875    
4876     * Thuban/UI/dock.py: Add docstrings.
4877    
4878     * test/test_classgen.py: Use renamed Ramp instances.
4879    
4880 bh 1522 2003-07-30 Bernhard Herzog <[email protected]>
4881    
4882 bh 1524 * Thuban/Lib/connector.py (QueueingPublisher): Removed. This class
4883     was never used in Thuban.
4884    
4885     2003-07-30 Bernhard Herzog <[email protected]>
4886    
4887 bh 1522 * Thuban/UI/join.py (JoinDialog.__init__): Use the table's Title()
4888     method directly instead of going through the transient_table
4889     method. This faster because transient_table may force the copy of
4890     a DBF file into the transient database and setting a table's title
4891     doesnm't affect the title of the associated transient table, so
4892     this fixes RT #2042
4893    
4894     * Thuban/UI/main.py (__version__): Don't import the already
4895     removed show_exception_dialog.
4896    
4897 jonathan 1517 2003-07-29 Jonathan Coles <[email protected]>
4898    
4899 jonathan 1519 * Thuban/UI/application.py (ThubanApplication.ShowExceptionDialog):
4900     Put back this method and remove the equivalent function since we
4901     are setting the exception hook from within this class (OnInit).
4902    
4903     2003-07-29 Jonathan Coles <[email protected]>
4904    
4905 jonathan 1517 * Doc/manual/images/5_2_custom_ramp.png,
4906     Doc/manual/images/5_2_quantiles.png,
4907     Doc/manual/images/5_2_uniform_dist.png,
4908     Doc/manual/images/5_2_unique_values.png,
4909     Doc/manual/images/8_int_error.png: New screen shots.
4910    
4911     * Doc/manual/thuban-manual.xml: Fixed typos and wording, clarified
4912     some points, and added more screen shots.
4913    
4914 bh 1512 2003-07-29 Bernhard Herzog <[email protected]>
4915    
4916 bh 1516 * Thuban/Model/data.py: Remove the now unused import of warnings
4917    
4918     2003-07-29 Bernhard Herzog <[email protected]>
4919    
4920 bh 1514 * Thuban/Model/data.py (SimpleStore): Removed. This class has been
4921     deprecated since before the 0.8 release and isn't used in Thuban
4922     itself anymore.
4923    
4924 bh 1512 * Thuban/Model/transientdb.py: Remove some unnecessary imports
4925    
4926 jonathan 1503 2003-07-29 Jonathan Coles <[email protected]>
4927 jonathan 1506
4928     * Thuban/UI/application.py (ThubanApplication.OnInit): set the
4929     python exception hook here so that we are sure to catch any
4930     Thuban exception that happen during initialization.
4931    
4932     * Thuban/UI/main.py (main): Don't set the exception hook here,
4933     it will get set in ThubanApplication.OnInit.
4934    
4935     2003-07-29 Jonathan Coles <[email protected]>
4936 jonathan 1503
4937     * Thuban/UI/application.py (ThubanApplication.ShowExceptionDialog):
4938     Removed and called it show_exception_dialog() so that the exception
4939     handler can be set before the class is created.
4940    
4941     * Thuban/UI/main.py (main): Install the exception handler before
4942     a ThubanApplication is created.
4943    
4944 bh 1500 2003-07-29 Bernhard Herzog <[email protected]>
4945    
4946     * po/it.po: New. Italian translation by Maurizio Napolitano
4947    
4948     * po/ru.po: New. Russian translation by Alex Shevlakov
4949    
4950 frank 1497 2003-07-29 Frank Koormann <[email protected]>
4951    
4952 frank 1508 * Doc/manual/thuban-manual.xml: Extended section on supported
4953     projections.
4954    
4955     2003-07-29 Frank Koormann <[email protected]>
4956    
4957 frank 1497 * Doc/manual/thuban-manual.xml: gaspell-checked.
4958    
4959 jonathan 1493 2003-07-29 Jonathan Coles <[email protected]>
4960    
4961 jonathan 1495 * Doc/manual/images/3_5_legend.png: Added border to improve look
4962     on white background.
4963    
4964     2003-07-29 Jonathan Coles <[email protected]>
4965    
4966 jonathan 1493 * Doc/manual/thuban-manual.xml: Fixed grammar and typos. Added
4967     descriptions for the legend toolbar.
4968    
4969     * Doc/manual/images/4_2_raster_layer_properties.png: Removed
4970     cursor from dialog box.
4971    
4972     2003-07-28 Jonathan Coles <[email protected]>
4973    
4974     * Doc/manual/thuban-manual.xml: More screenshots and more chapters.
4975    
4976     * Doc/manual/images/2_4_session_tree.png,
4977     Doc/manual/images/3_5_legend.png, Doc/manual/images/3_rename_map.png,
4978     Doc/manual/images/4_2_layer_properties.png,
4979     Doc/manual/images/4_2_raster_layer_properties.png,
4980     Doc/manual/images/5_3_genclass.png,
4981     Doc/manual/images/5_classification.png,
4982     Doc/manual/images/6_projection.png,
4983     Doc/manual/images/7_1_table_view.png,
4984     Doc/manual/images/7_2_5_join.png: New screenshots.
4985    
4986     2003-07-24 Jonathan Coles <[email protected]>
4987    
4988     * Doc/manual/thuban-manual.xml: Chapter on Projection Management.
4989    
4990     2003-07-24 Jonathan Coles <[email protected]>
4991    
4992     * Doc/manual/thuban-manual.xml: Added EPS images and wrote
4993     chapter on Layer Management.
4994    
4995     * Doc/manual/Makefile: New. Makefile to generate all formats for the
4996     manual and images.
4997    
4998 bh 1483 2003-07-24 Bernhard Herzog <[email protected]>
4999    
5000     * Thuban/Model/range.py, Thuban/version.py: Remove the #! line as
5001     it annoys lintian which warns about these files not being
5002 jan 1767 executable. The #! isn't necessary here since if you absolutely
5003 bh 1483 must execute them you can always say "python <filename>".
5004    
5005     * Thuban/UI/renderer.py (ScreenRenderer.draw_shape_layer): Remove
5006     superfluous code to set brush and pen for point shapes
5007    
5008     * Thuban/UI/viewport.py: Remove commented out code that wouldn't
5009     belong in viewport anyway
5010    
5011 frank 1479 2003-07-24 Frank Koormann <[email protected]>
5012    
5013     * Doc/manual/thuban-manual.xml: Added section on table management.
5014    
5015 bh 1477 2003-07-24 Bernhard Herzog <[email protected]>
5016    
5017     * test/runtests.py (main): Recognize the long "verbose" option
5018     correctly.
5019    
5020 jonathan 1470 2003-07-22 Jonathan Coles <[email protected]>
5021    
5022     * Doc/manual/thuban-manual.xml: Continue to write first revision
5023     of the manual.
5024    
5025     * Thuban/UI/renderer.py (MapRenderer.render_map): Wrap method
5026     with Begin/EndDrawing() calls to ensure we aren't doing to
5027     many updates to the dc during rendering.
5028     (ScreenRenderer.draw_shape_layer): self.draw_point_shape takes
5029     a pen and brush argument so they need to be passed to the function.
5030    
5031     * Thuban/UI/viewport.py (ViewPort.calc_min_max_scales): New.
5032     Calculates the minimum and maximum scale values. Factored out
5033     of set_view_transform so that it could be used to zoom all the
5034     way into a single point.
5035     (ViewPort.set_view_transform): Call calc_min_max_scales().
5036     (ViewPort.FitSelectedToWindow): Zoom to the maximum scale
5037     if only a single point is selected.
5038    
5039     * Doc/manual/images/1_2_legend_close.png,
5040     Doc/manual/images/1_2_legend_dock.png,
5041     Doc/manual/images/1_2_mainwindow.png,
5042     Doc/manual/images/1_2_mainwindow.ps,
5043     Doc/manual/images/1_2_mainwindow.sk,
5044     Doc/manual/images/3_2_fullextent.png,
5045     Doc/manual/images/3_2_fulllayerextent.png,
5046     Doc/manual/images/3_2_fullshapeextent.png,
5047     Doc/manual/images/3_2_pan.png,
5048     Doc/manual/images/3_2_zoomin.png,
5049     Doc/manual/images/3_2_zoomout.png,
5050     Doc/manual/images/3_3_identify.png,
5051     Doc/manual/images/3_3_label.png,
5052     Doc/manual/images/3_5_invisible.png,
5053     Doc/manual/images/3_5_movedown.png,
5054     Doc/manual/images/3_5_moveup.png,
5055     Doc/manual/images/3_5_props.png,
5056     Doc/manual/images/3_5_tobottom.png,
5057     Doc/manual/images/3_5_totop.png,
5058     Doc/manual/images/3_5_visible.png: New. Images for the documentation.
5059    
5060 bh 1451 2003-07-18 Bernhard Herzog <[email protected]>
5061    
5062 bh 1465 * Thuban/UI/messages.py (MAP_REPLACED): New message.
5063    
5064     * Thuban/UI/viewport.py (ViewPort.SetMap): Issue MAP_REPLACED
5065     after the new map has been assigned
5066    
5067     * Thuban/UI/mainwindow.py (MainWindow.delegated_messages):
5068     Delegate MAP_REPLACED to the canvas too
5069     (MainWindow.prepare_new_session): Removed. Thanks to the new
5070     MAP_REPLACED message it's no longer needed
5071     (MainWindow.OpenSession, MainWindow.NewSession):
5072     prepare_new_session has been removed.
5073    
5074     * Thuban/UI/classifier.py (Classifier.__init__): Subscribe to
5075     MAP_REPLACED so that we can close the dialog if a new map is set.
5076     (Classifier.unsubscribe_messages): Unsubscribe from MAP_REPLACED
5077     (Classifier.map_replaced): Handle MAP_REPLACED by closing the
5078     dialog
5079    
5080     * test/test_viewport.py (SimpleViewPortTest)
5081     (SimpleViewPortTest.test_default_size): Add doc-strings
5082     (ViewPortTest.setUp): Bind map to self.map so we can use it in
5083     tests. Subscribe to MAP_REPLACED messages too.
5084     (ViewPortTest.tearDown): No need to explicitly unsubscribe
5085     (ViewPortTest.test_set_map): New test for the SetMap method.
5086    
5087     2003-07-18 Bernhard Herzog <[email protected]>
5088    
5089 bh 1463 * test/test_viewport.py (SimpleViewPortTest.test_default_size):
5090     Move this test from ViewPortTest.setUp to this new separate test
5091     case. setUp is not the place for the actual tests.
5092     (ViewPortTest.test_inital_settings, ViewPortTest.setUp): Move some
5093     more of the test from setUp to the new test test_inital_settings.
5094     (ViewPortTest.test_win_to_proj, ViewPortTest.test_proj_to_win)
5095     (ViewPortTest.test_proj_conv): Split test_proj_conv into
5096     test_win_to_proj and test_proj_to_win and make the tests easier to
5097     understand
5098     (ViewPortTest.testFitRectToWindow, ViewPortTest.testZoomFactor)
5099     (ViewPortTest.testZoomOutToRect, ViewPortTest.testTranslate)
5100     (ViewPortTest.test_unprojected_rect_around_point)
5101     (ViewPortTest.test_find_shape_at, ViewPortTest.testTools):
5102     Reformat to increase readability.
5103    
5104     2003-07-18 Bernhard Herzog <[email protected]>
5105    
5106 bh 1461 * Thuban/UI/view.py (MapCanvas.OnLeftDown): Capture the mouse.
5107    
5108     2003-07-18 Bernhard Herzog <[email protected]>
5109    
5110 bh 1459 * test/runtests.py: The test suite can now be run without an X
5111     connection. To make sure this remains true, remove the DISPLAY
5112     environment variable so that an error occurs if the wxGTK is
5113     imported accidentally
5114    
5115     2003-07-18 Bernhard Herzog <[email protected]>
5116    
5117 bh 1457 * Thuban/UI/viewport.py: Remove unused imports
5118    
5119     * Thuban/UI/view.py: Remove unused imports
5120    
5121     2003-07-18 Bernhard Herzog <[email protected]>
5122    
5123 bh 1455 * test/test_export.py Remove unused imports. The OutputTransform
5124     function is now in viewport.py and is called output_transform
5125     (TestScalebar.test_output_transform)
5126     (TestScalebar.test_OutputTransform): Renamed to
5127     test_output_transform and updated to use output_transform instead
5128     of OutputTransform
5129    
5130     * Thuban/UI/view.py (OutputTransform): Moved to viewport.py and
5131     renamed.
5132     (MapCanvas.Export, MapPrintout.draw_on_dc): OutputTransform was
5133     renamed to output_transform
5134    
5135     * Thuban/UI/viewport.py (OutputTransform, output_transform):
5136     Rename to output_transform
5137    
5138     2003-07-18 Bernhard Herzog <[email protected]>
5139    
5140 bh 1453 * Thuban/Model/layer.py (Layer.__init__): Rename
5141     classificationField to classificatin_column and init it here so
5142     that it can be used in SetClassificationColumn
5143     (Layer.GetClassificationColumn, Layer.GetClassificationField):
5144     Rename to GetClassificationColumn.
5145     (Layer.SetClassificationColumn, Layer.SetClassificationField):
5146     Rename to SetClassificationColumn and issue a LAYER_CHANGED
5147     message if the column changes.
5148     (Layer._classification_changed, Layer.ClassChanged): Rename to
5149     _classification_changed. Update the callers.
5150     (Layer.SetShapeStore): Further field->column renames.
5151    
5152     * Thuban/Model/load.py (SessionLoader.start_classification)
5153     (SessionLoader.start_clpoint): Updates because of
5154     field->column method name changes in the Layer class
5155    
5156     * Thuban/Model/save.py (SessionSaver.write_classification): Updates
5157     because of field->column method name changes in the Layer class
5158    
5159     * Thuban/UI/classifier.py (Classifier.__init__)
5160     (Classifier._OnTry, Classifier._OnRevert): Updates because of
5161     field->column method name changes in the Layer class
5162    
5163     * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Updates
5164     because of field->column method name changes in the Layer class
5165    
5166     * Thuban/UI/viewport.py (ViewPort.find_shape_at): Updates because
5167     of field->column method name changes in the Layer class
5168    
5169     * test/test_save.py (SaveSessionTest.testClassifiedLayer)
5170     (SaveSessionTest.testClassifiedLayer): Update because of
5171     field->column method name changes in the Layer class
5172    
5173     * test/test_layer.py (SetShapeStoreTests.setUp)
5174     (SetShapeStoreTests.test_sanity): Update because of field->column
5175     method name changes in the Layer class
5176     (TestLayerModification.setUp): Subscribe to LAYER_CHANGED as well
5177     (TestLayerModification.test_sanity)
5178     (TestLayerModification.test_initial_settings): remove unsued code
5179     and rename to test_sanity.
5180     (TestLayerModification.test_set_classification): New test for
5181     SetClassification and SetClassificationField.
5182    
5183     2003-07-18 Bernhard Herzog <[email protected]>
5184    
5185 bh 1451 * test/test_classgen.py (TestFixedRamp.test): Extend test to check
5186     the non-fixed values as well. The old test would have accepted a
5187     fixed ramp that only returnes the fixed properties
5188    
5189 jonathan 1449 2003-07-17 Jonathan Coles <[email protected]>
5190    
5191     * Doc/manual/mainwindow.png, Doc/manual/mainwindow.xcf: Screen
5192     shots for the manual. The XCF file is the source image and
5193     has additional layers to support changes.
5194    
5195     * Doc/manual/thuban-manual.xml: Wrote an initial Introduction.
5196    
5197     * Thuban/UI/classifier.py (Classifier.__BuildClassification):
5198     Return both the new class and the field name.
5199    
5200     * Thuban/UI/mainwindow.py (MainWindow.ToggleLegend): Don't
5201     fit the map to the window as this changes any zoom level that
5202     the user may have set.
5203    
5204 jonathan 1442 2003-07-16 Jonathan Coles <[email protected]>
5205    
5206     * Thuban/Model/classgen.py (generate_singletons,
5207     generate_uniform_distribution, generate_quantiles): Remove
5208     fixes parameter, but maintain the same functionality by having
5209     the calling function pass a FixedRamp object for the ramp.
5210     (FixedRamp): New. Adapts a ramp to have fixed property values.
5211    
5212     * Thuban/Model/classification.py: Use new CLASS_CHANGED message.
5213     (Classification): Inherit from Publisher.
5214     (Classification.__init__): Remove the layer parameter.
5215     Classifications no longer need to have a parent layer.
5216     (Classification.GetField, Classification.GetFieldType,
5217     Classification.SetFieldInfo): Removed. The field name is stored
5218     in the layer, and the type can be retreived by calling
5219     Layer.GetFieldType().
5220     (Classification._set_layer, Classification.GetLayer): Removed.
5221     Classifications no longer have a parent layer.
5222    
5223     * Thuban/Model/layer.py (Layer.Destroy): Unsubscribe from the
5224     classification.
5225     (Layer.SetShapeStore): Reset the classification first while
5226     we still have the old shape store to work with.
5227     (Layer.GetClassificationField, Layer.SetClassificationField):
5228     New. Method for getting/setting the field to classify on.
5229     (Layer.SetClassification): Simplified now that the layer
5230     simply has to hold a reference to the classification and not
5231     tell the classification who owns it.
5232     Fixes RTbug #2023.
5233    
5234     * Thuban/Model/load.py (SessionLoader.start_classification):
5235     Set the field name on the layer, not the classification.
5236    
5237     * Thuban/Model/messages.py: Add CLASS_CHANGED for when a
5238     classification is modified.
5239    
5240     * Thuban/Model/save.py (SessionSaver.write_classification):
5241     Get the field name and type from the layer.
5242    
5243     * Thuban/Model/table.py (table_to_dbf, table_to_csv): Renamed
5244     parameter records to rows and add docstring. Fixes RTbug #1997.
5245    
5246     * Thuban/UI/classgen.py (ClassGenDialog.OnOK): Use a fixed
5247     ramp when we need to fix certain values of a ramp rather than
5248     using the old fixes parameter. Fixes RTbug #2024.
5249    
5250     * Thuban/UI/classifier.py (ClassGrid.CreateTable): Add fieldType
5251     parameter.
5252     (ClassTable.Reset): Add fieldType parameter and use it, rather
5253     than asking the classification.
5254     (Classifier.__init__): Remember the original class's field
5255     and ask the layer for the field type, rather than the classification.
5256     (Classifier.__SetGridTable): Retrieve the field and field type
5257     for the table because they are not in the classification.
5258     (Classifier._OnTry, Classifier._OnRevert): Set the classification
5259     field on the layer in addition to the classification itself.
5260    
5261     * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Get the
5262     classification field from layer.
5263    
5264     * Thuban/UI/viewport.py (ViewPort.find_shape_at): Get the
5265     classification field from layer. Split up tests and remove
5266     *-imports. Fixes RTbug #1992.
5267    
5268     * test/test_classgen.py (TestFixedRamp): Test for the FixedRamp class.
5269    
5270     * test/test_classification.py
5271     (TestClassification.test_classification): Remove tests for methods
5272     that no longer exist.
5273    
5274     * test/test_layer.py (SetShapeStoreTests.setUp): Classification
5275     __init__ no longer has a field parameter, use SetClassificationField.
5276     (SetShapeStoreTests.test_sanity): Use layer object to get class
5277     field info.
5278    
5279     * test/test_save.py (SaveSessionTest.testClassifiedLayer): Use
5280     SetClassificationField on layer to set class field info.
5281    
5282     * test/test_viewport.py: Renamed from test/test_view.py.
5283    
5284 jan 1424 2003-07-16 Jan-Oliver Wagner <[email protected]>
5285    
5286     * Doc/manual/thuban-manual.xml: Added authors and an initial
5287     coarse structure.
5288    
5289 bh 1418 2003-07-15 Bernhard Herzog <[email protected]>
5290    
5291 bh 1422 * test/support.py (FloatComparisonMixin): This is a mix-in class
5292     and therefore should not be derived from any other class.
5293    
5294     * test/test_range.py (RangeTest): FloatComparisonMixin is a
5295     mix-in, so derive from TestCase as well.
5296    
5297     2003-07-15 Bernhard Herzog <[email protected]>
5298    
5299 bh 1420 * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Rework the
5300     draw_func handling a bit to remove one layer of indirection. This
5301     makes the renderer about 10% faster in the non-classifying case
5302     and the code a bit cleaner
5303     (MapRenderer.draw_point_shape): Add the pen and brush parameters
5304     and set them in the dc. Now the draw_point_shape method and
5305     wxproj's draw_polygon_shape function have basically the same
5306     signature so that both can be directly used as draw_func
5307    
5308     2003-07-15 Bernhard Herzog <[email protected]>
5309    
5310 bh 1418 * Thuban/Model/save.py (SessionSaver.write_classification): Encode
5311     string values (in addition to the labels) as UTF 8
5312    
5313     * Thuban/Model/load.py (SessionLoader.start_clpoint): Decode the
5314     values if the field type is string
5315    
5316     * test/test_save.py (SaveSessionTest.testClassifiedLayer): Test
5317     saving a session with non-ascii string classification values.
5318    
5319     * test/test_load.py (TestClassification.file_contents)
5320     (TestClassification.test): Check for non-ascii values in string
5321     classifications
5322    
5323 jonathan 1416 2003-07-14 Jonathan Coles <[email protected]>
5324    
5325     * test/test_view.py: New. Tests for ViewPort.
5326    
5327 frank 1409 2003-07-14 Frank Koormann <[email protected]>
5328    
5329     * Thuban/Model/load.py (SessionLoader.start_map): Encode map
5330     title to latin1. Fixes https://intevation.de/rt/webrt?serial_num=2013
5331    
5332 frank 1411 * test/test_load_0_8.py (TestUnicodeStrings): New, test load of
5333     unicode strings from session file: session title, map title and
5334     projection name.
5335    
5336 jonathan 1403 2003-07-10 Jonathan Coles <[email protected]>
5337    
5338 jonathan 1406 * Thuban/UI/viewport.py (Tool.MouseUp): Should have called
5339     drag_stop, not drag_move when the mouse is released.
5340    
5341     2003-07-10 Jonathan Coles <[email protected]>
5342    
5343 jonathan 1403 The most important part of this is the seperation of view.py into
5344     two pieces. viewport.py now has a class called ViewPort which
5345     contains all the non-wx parts of view.py and can therefore be
5346     tested. view.py contains only the wx-specific parts and is fairly
5347     simple.
5348    
5349     * Thuban/UI/view.py: Stripped out all non-wx functionality. Fixes
5350     RTTbug #1992.
5351     * Thuban/UI/viewport.py: New. Contains non-wx view functionality.
5352     RTTbug #1992.
5353    
5354     * Thuban/Model/classgen.py (generate_singletons,
5355     generate_uniform_distribution, generate_quantiles):
5356     Added 'fixes' parameter so that property attributes can
5357     be held constant over the generated classification groups.
5358     (CustomRamp.GetProperties): Remove unused variables.
5359    
5360     * Thuban/Model/map.py (Map.SetProjection): Send the old
5361     projection as an argument to listeners of the MAP_PROJECTION_CHANGED
5362     event.
5363    
5364     * Thuban/Model/table.py (table_to_dbf, table_to_csv): Added 'records'
5365     parameter which is a list of records that restricts which
5366     records are saved. Fixes RTbug #1997.
5367    
5368     * Thuban/UI/application.py (ThubanApplication.ShowExceptionDialog):
5369     Port exception dialog from GREAT-ER. Fixes RTbug #1993.
5370    
5371     * Thuban/UI/classgen.py (ClassGenDialog.__init__): Add controls
5372     to allow the user to fix line color/width on generated groups.
5373     (ClassGenDialog.OnOK): Use new 'fixes' parameter of the generate_*
5374     functions to optionally fix group properties.
5375    
5376     * Thuban/UI/main.py (main): Set exception hook to the
5377     ShowExceptionDialog. Fixes RTbug #1993.
5378    
5379     * Thuban/UI/mainwindow.py (MainWindow.ShowTableView): Raise
5380     the table window when it is selectd to be shown.
5381    
5382     * Thuban/UI/tableview.py (QueryTableFrame.__init__): Add an
5383     Export Selection button and move the export buttons underneath
5384     the table.
5385     (QueryTableFrame.UpdateStatusText): Added event argument so
5386     that it can respond to grid selection events. The status text
5387     is now updated even when the table is not associated with a
5388     layer as was previously assumed.
5389     (QueryTableFrame.OnGridSelectRange, OnGridSelectCell): Removed.
5390     UpdateStatusText responds to these events.
5391     (QueryTableFrame.OnSaveAs): Renamed to doExport.
5392     (QueryTableFrame.doExport): Helper function that saves the
5393     entire table, or selected rows, to a file.
5394     (QueryTableFrame.OnExport, QueryTableFrame.OnExportSel): New.
5395     Respond to export button events and call doExport.
5396    
5397     * extensions/thuban/gdalwarp.cpp (ProjectRasterFile): Make sure
5398     the function doesn't return NULL without first setting a Python
5399     Error.
5400    
5401     * test/runtests.py (main): Only print "Unknown option" for
5402     unsupported options.
5403    
5404     * test/support.py (FloatComparisonMixin.assertFloatEqual): Take
5405     optional epsilon argument to specify floating point accuracy.
5406     (FloatComparisonMixin.assertFloatSeqEqual): Call assertFloatEqual
5407     for each item test.
5408    
5409     * test/test_csv_table.py (TestCSVTable.test_table_to_cvs): Add
5410     tests for saving selected records.
5411    
5412     * test/test_dbf_table.py (TestTableToDBF.test_table_to_dbf): Add
5413     tests for saving selected records.
5414    
5415     * test/test_map.py (TestMapWithContents.test_set_projection):
5416     MAP_PROJECTION_CHANGED events send the old projection.
5417    
5418     * test/test_session.py
5419     (TestSessionWithContent.test_forward_map_projection):
5420     MAP_PROJECTION_CHANGED events send the old projection.
5421    
5422     * test/test_table.py (TableTest): Update tests to use non-deprecated
5423     functions.
5424    
5425 bh 1376 2003-07-08 Bernhard Herzog <[email protected]>
5426    
5427 bh 1382 * Thuban/Model/transientdb.py (TransientTableBase.Width): The type
5428     constants in the column objects are the standard ones defined in
5429     the table module.
5430    
5431     * test/test_transientdb.py
5432     (TestTransientTable.test_transienttable_to_dbf): New. Test whether
5433     exporting transient tables as DBF works. This should catch the bug
5434     just fixed in TransientTableBase.Width.
5435    
5436     2003-07-08 Bernhard Herzog <[email protected]>
5437    
5438 bh 1380 * Thuban/Model/classgen.py (CustomRamp.GetProperties): Compute the
5439     interpolated colors correctly.
5440    
5441     * test/test_classgen.py (TestCustomRamp.test_color_interpolation):
5442     New. Test case for the fix in classgen.py
5443    
5444     2003-07-08 Bernhard Herzog <[email protected]>
5445    
5446 bh 1378 * test/runtests.py (main): Make the default output less verbose
5447     and add a verbosity option (-v) to get the old output
5448    
5449     2003-07-08 Bernhard Herzog <[email protected]>
5450    
5451 bh 1376 * Resources/XML/thuban-0.9.dtd: New. This will become the DTD for
5452     0.9.
5453    
5454     * Thuban/Model/transientdb.py (TransientJoinedTable.JoinType):
5455     New. Return the join type
5456    
5457     * Thuban/Model/save.py (SessionSaver.write_session): Use new 0.9
5458     DTD
5459     (SessionSaver.write_data_containers): Save the join type for
5460     joined tables
5461    
5462     * Thuban/Model/load.py (SessionLoader.__init__): Add the new 0.9
5463     namespace
5464     (SessionLoader.start_jointable): Handle the jointype attribute
5465    
5466     * test/test_load_0_8.py: New. Effectively a copy of test_load.py
5467     as of Thuban 0.8. These are now tests to determine whether Thuban
5468     can still read files generated by Thuban 0.8
5469    
5470     * test/test_load.py (LoadSessionTest.dtd)
5471     (TestSingleLayer.file_contents)
5472     (TestLayerVisibility.file_contents, TestLabels.file_contents)
5473     (TestLayerProjection.file_contents)
5474     (TestRasterLayer.file_contents, TestJoinedTable.file_contents)
5475     (TestJoinedTable.file_contents)
5476     (TestLoadError.file_contents): Update for new DTD
5477     (TestJoinedTable.file_contents, TestJoinedTable.setUp): Add test
5478     for new join type attribute
5479    
5480     * test/test_save.py (SaveSessionTest.dtd)
5481     (SaveSessionTest.testEmptySession)
5482     (SaveSessionTest.testSingleLayer)
5483     (SaveSessionTest.testLayerProjection)
5484     (SaveSessionTest.testRasterLayer)
5485     (SaveSessionTest.testClassifiedLayer)
5486     (SaveSessionTest.test_dbf_table)
5487     (SaveSessionTest.test_joined_table): Update for new DTD
5488     (SaveSessionTest.test_joined_table): Add test for new join type
5489     attribute
5490    
5491 bh 1372 2003-07-04 Bernhard Herzog <[email protected]>
5492    
5493     * Thuban/Model/table.py (_find_dbf_column_names): New. Helper
5494     function for table_to_dbf
5495     (table_to_dbf): Deal with names longer than the 10 character limit
5496    
5497     * test/test_dbf_table.py (TestTableToDBF.test_table_to_dbf): Add
5498     doc-string
5499     (TestTableToDBF.test_table_to_dbf_long_col_names): New test for
5500     long column names
5501    
5502 bh 1365 2003-07-03 Bernhard Herzog <[email protected]>
5503    
5504 bh 1370 * Doc/manual/thuban-manual.xml: Fix the CVS Revision Tag syntax
5505    
5506     2003-07-03 Bernhard Herzog <[email protected]>
5507    
5508 bh 1368 * Doc/manual/thuban-manual.xml, Doc/manual/README: New. Skeleton
5509     for the Thuban manual and README with some basic information about
5510     the manual
5511    
5512     2003-07-03 Bernhard Herzog <[email protected]>
5513    
5514 bh 1365 * Thuban/Model/transientdb.py (TransientJoinedTable.__init__):
5515     Update doc-string
5516     (TransientJoinedTable.create): Do not modify the column objects of
5517     the input tables in place and copy all columns of the input tables
5518     into the joined table after all.
5519    
5520     * test/test_transientdb.py
5521     (TestTransientTable.test_transient_joined_table_same_column_name):
5522     Update to reflect the new behavior
5523     (TestTransientTable.test_transient_joined_table_with_equal_column_names):
5524     Update to reflect the new behavior
5525     (TestTransientTable.test_transient_joined_table_name_collisions_dont_modify_in_place):
5526     New test case for a bug which modified the column objects in place
5527    
5528 jonathan 1360 2003-07-02 Jonathan Coles <[email protected]>
5529 jonathan 1349
5530 jonathan 1360 * Thuban/Model/classgen.py (generate_singletons,
5531     generate_uniform_distribution, generate_quantiles,
5532 jonathan 1363 GenQuantiles0): Make sure maxValue isn't less than
5533     one, otherwise we could divide by zero.
5534    
5535     * test/test_classgen.py (ClassGenTest.doClassRangeTest,
5536     ClassGenTest.doClassSingleTest): Call doBoundsTest to
5537     check the end classification groups against the
5538     proper property values.
5539     (ClassGenTest.doBoundsTest): New. Checks the first and
5540     last classification groups to make sure their properties
5541     are the correct upper and lower bounds for a color ramp.
5542    
5543     2003-07-02 Jonathan Coles <[email protected]>
5544    
5545     * Thuban/Model/classgen.py (generate_singletons,
5546     generate_uniform_distribution, generate_quantiles,
5547 jonathan 1360 GenQuantiles0): The denominator was one to high when
5548     calculating the index for the ramp causing the index
5549     to never to reach one.
5550    
5551     2003-07-02 Jonathan Coles <[email protected]>
5552    
5553 jonathan 1358 Changed the singature of ClassGroupRange.__init__ and
5554     ClassGroupRange.SetRange() so that the min/max values are
5555     passed as a tuple. This makes a better calling scheme for
5556     when a Range object is passed instead.
5557    
5558     * Thuban/Model/classgen.py: Fixed parameters to
5559     ClassGroupRange constructor.
5560    
5561     * Thuban/Model/classification.py (ClassGroupRange.__init__):
5562     Consolidate the min/max parameters into a single _range which
5563     can either be a tuple or a Range object.
5564     (ClassGroupRange.SetRange): Consolidate the min/max parameters
5565     into a single _range which can either be a tuple or a Range object.
5566    
5567     * Thuban/Model/load.py (SessionLoader.start_clrange): Fix
5568     call to ClassGroupRange constructor to use a tuple.
5569    
5570     * Thuban/Model/layer.py (Layer.SetClassification): Switch
5571     the classification instance variable to the new class
5572     before calling _set_layer otherwise subscribers to a
5573     LAYER_CHANGED event will not see any difference.
5574    
5575     * test/test_classification.py: Fix tests of ClassGroupRange
5576     so that they use the new signature.
5577    
5578     * test/test_load.py: Fix use of ClassGroupRange so that it
5579     uses the new signature.
5580    
5581     * test/test_load_0_2.py: Fix use of ClassGroupRange so that it
5582     uses the new signature.
5583    
5584     * test/test_save.py: Fix use of ClassGroupRange so that it
5585     uses the new signature.
5586    
5587    
5588     2003-07-01 Jonathan Coles <[email protected]>
5589    
5590 jonathan 1349 * Thuban/Model/classgen.py: Fixes RTbug #1972, 1971.
5591     Import used objects/class from color.
5592     (generate_singletons): We don't
5593     need the numGroups parameter anymore because we are using
5594     the new ramps with GetProperties().
5595     (generate_uniform_distribution): Use new ramp method
5596     GetProperties().
5597     (generate_quantiles, GenQuantiles0): Use new ramp method
5598     GetProperties().
5599     (CustomRamp.SetNumGroups): Removed. The ramps now map
5600     a value from 0 to 1 to class properties so the number
5601     of groups is not needed ahead of time.
5602     (CustomRamp.next): Removed. CustomRamp does not support
5603     interation anymore.
5604     (CustomRamp.GetProperties): Returns a ClassGroupProperties
5605     object based on the index value from 0 to 1 that is
5606     passed to it.
5607     (GreyRamp, RedRamp, GreenRamp, BlueRamp, GreenToRedRamp):
5608     Made into instances of Monochromatic class instread of
5609     deriving from it.
5610     (HotToCold.SetNumGroups): Removed. See CustomRamp.
5611     (HotToCold.next): Removed. See CustomRamp.
5612    
5613     * Thuban/Model/classification.py: Fixes RTbug #1973, 1971.
5614     (Classification.SetField, Classification.SetFieldType):
5615     Replaced with SetFieldInfo.
5616     (Classification.SetFieldInfo): New. Does a better job of
5617     what SetField and SetFieldType used to do by combining
5618     their function since they should really always be done
5619     at the same time.
5620     (Classification.SetLayer): Renamed to _set_layer.
5621     (Classification._set_layer): Should only be called from
5622     Layer's SetClassification. This does not cause a recursive
5623     call as SetLayer did because we know that Layer knows about
5624     the classification.
5625    
5626     * Thuban/Model/color.py: Fixes RTbug #1971.
5627     (_Transparent): Renamed from Transparent so it doesn't
5628     conflict with the module variable.
5629     (Transparent, Black): Renamed from Color.Transparent,
5630     Color.Black so they are not class variables.
5631    
5632     * Thuban/Model/layer.py: Fixes RTbug #1971, 1973.
5633     (Layer.Destroy): We don't need to call SetClassification
5634     anymore to clear out the back reference in the classifcation
5635     to the layer. It's better to set it to None using _set_layer,
5636     and we won't be creating another clas object too.
5637     (Layer.SetClassification): Classification._set_layer is not
5638     recursive so remove all the locking variables. Also clean
5639     up the code so that it remains unchanged if something fails.
5640    
5641     * Thuban/Model/load.py: Fixes RTbug #1971.
5642     (SessionLoader.start_classification): Call
5643     Classification.SetFieldInfo().
5644    
5645     * Thuban/Model/save.py: Removed import of Color which wasn't
5646     being used.
5647    
5648     * Thuban/UI/classgen.py: Fixes RTbug #1972.
5649     (ClassGenDialog.__init__): Color ramps are now instances
5650     already so we don't need to create any new objects.
5651     (ClassGenDialog.OnOK): Check for numGroups is no longer
5652     necessary because we never use it.
5653    
5654     * Thuban/UI/classifier.py: Fixes RTbug #1971.
5655     (Classifier.__BuildClassification, Classifier.__SetGridTable):
5656     Call Classification.SetFieldInfo() instead of SetFieldType.
5657    
5658     * Thuban/UI/renderer.py: Fixes RTbug #1971.
5659    
5660     * Thuban/UI/view.py: Fixes RTbug #1974, 1971.
5661     (MapCanvas.__init__): Subscribe to the idle time event. Set
5662     background color to white.
5663     (MapCanvas.OnPaint): Set a flag indicating that we should
5664     render the map during idle time. If we already have a bitmap
5665     just draw it now.
5666     (MapCanvas.OnIdle): New. Render the map only during idle time.
5667     This also fixes a problem with the busy cursor under gtk.
5668    
5669     * test/test_classgen.py (ClassGenTest.test_generate_singletons):
5670     Fix calls to generate_singletons because the signature changed.
5671    
5672     * test/test_classification.py: Fix color references and
5673     change calls to Classification.[SetField|SetFieldType] to
5674     SetFieldInfo.
5675    
5676     * test/test_load.py: Fix color references.
5677    
5678     * test/test_load_0_2.py: Fix color references.
5679    
5680     * test/test_save.py (SaveSessionTest.testClassifiedLayer):
5681     Change calls to Classification.[SetField|SetFieldType] to
5682     SetFieldInfo.
5683    
5684 frank 1334 2003-07-01 Frank Koormann <[email protected]>
5685    
5686     MERGE from the greater-ms3 branch.
5687    
5688     * test/test_transientdb.py
5689     (TestTransientTable.test_transient_joined_table_with_equal_column_names):
5690     New. Test join of two tables with partly equal column names.
5691    
5692     * Thuban/Model/transientdb.py (TransientJoinedTable.create):
5693     If duplicates in left and right tables column names are found,
5694     append '_' (underscores) to the name until it is unique.
5695     Create always new internal names for the resulting table and reference
5696     columns in the join statement with <table>.<column>
5697    
5698 bh 1329 2003-07-01 Bernhard Herzog <[email protected]>
5699    
5700     * test/test_transientdb.py
5701     (TestTransientTable.test_transient_joined_table_same_column_name):
5702     New. Test whether joining on columns with the same names in both
5703     tables works.
5704 frank 1334
5705 bh 1329 * Thuban/Model/transientdb.py (TransientJoinedTable.create): Make
5706     sure to use the right internal names even when joining on field
5707     with the same names in both tables. Also, detect duplicate names
5708     in the joined table correctly.
5709    
5710 frank 1325 2003-07-01 Frank Koormann <[email protected]>
5711    
5712     * Thuban/UI/renderer.py (ExportRenderer.render_legend):
5713     Reverse List of layers to render in same order as in desktop legend.
5714    
5715 jonathan 1318 2003-06-30 Jonathan Coles <[email protected]>
5716    
5717 jonathan 1349 * Thuban/version.py (make_tuple): Takes a version string
5718     and splits it into a tuple of at most three integers.
5719     Used make_tuple() to make tuple versions of the version
5720     numbers.
5721    
5722     * Thuban/UI/about.py: Add Thuban email addresses.
5723    
5724     2003-06-30 Jonathan Coles <[email protected]>
5725    
5726 jonathan 1320 * Thuban/version.py: SQLite/PySQLite version dependencies
5727     were too high.
5728    
5729     2003-06-30 Jonathan Coles <[email protected]>
5730    
5731 jonathan 1318 * Thuban/version.py: Update version to 0.8.1
5732    
5733     * MANIFEST.in: Added Projections so that default.proj is
5734     included.
5735    
5736 jonathan 1312 2003-06-26 Jonathan Coles <[email protected]>
5737    
5738     New About box with lots more information including library
5739     versions and credits. More/better version checking before
5740     Thuban starts.
5741    
5742     * Thuban/UI/about.py: New. New About box that displays
5743     library version information and credits.
5744    
5745     * Thuban/version.py: Added new 'versions' dictionary which
5746     contains the verions of various libraries which are checked
5747     when the module loads.
5748     (verify_versions): Check all version numbers and returns
5749     a list of errors.
5750    
5751     * Thuban/UI/classifier.py (Classifier.__EnableButtons):
5752     Reset the status of the buttons as the situation warrants,
5753     but in a better more reliable way by not relying on the
5754     current status to determine what needs to change.
5755    
5756     * Thuban/UI/main.py (wxCHECK_VERSION): Removed. Not needed.
5757     (verify_versions): Remove most of the code since it is
5758     now in Thuban.version.verify_versions.o
5759    
5760     * Thuban/UI/mainwindow.py (MainWindow.About): Call new
5761     About box in Thuban.UI.about.
5762    
5763     * extensions/thuban/gdalwarp.cpp (get_gdal_version): New.
5764     Returns the version of gdal library being used as a string.
5765    
5766     * extensions/thuban/wxproj.cpp (check_version, check_version_gtk):
5767     Removed.
5768     (get_proj_version): Return the version of PROJ that the file
5769     was compiled with.
5770     (get_gtk_version): Return th version of GTK that the file
5771     was compiled with.
5772    
5773 jonathan 1304 2003-06-25 Jonathan Coles <[email protected]>
5774    
5775     * Thuban/UI/classifier.py (Classifier.EditSymbol): The parent
5776     of the SelectPropertiesDialog should be self so the window
5777     appears on top.
5778     (ClassGroupPropertiesCtrl.DoEdit): The parent
5779     of the SelectPropertiesDialog should be self so the window
5780     appears on top.
5781    
5782     * Thuban/UI/resource.py: Cleaned up how we determine file
5783     extensions.
5784     (GetImageResource): Return an wxImage from our Resources.
5785    
5786 jonathan 1299 2003-06-24 Jonathan Coles <[email protected]>
5787    
5788     * Thuban/UI/renderer.py (ExportRenderer.render_legend):
5789     Check that a layer has a classification before trying
5790     to get it. Raster layers don't have classifications.
5791    
5792 jonathan 1286 2003-06-23 Jonathan Coles <[email protected]>
5793 jonathan 1297
5794     * setup.py: Add Resources/XML to resource list.
5795    
5796     2003-06-23 Jonathan Coles <[email protected]>
5797 jonathan 1286
5798 jonathan 1297 * setup.cfg: Fix copyright dates
5799    
5800     2003-06-23 Jonathan Coles <[email protected]>
5801    
5802 jonathan 1294 * MANIFEST.in: Update with Resources/XML
5803    
5804     * setup.py: Don't include Locale resources yet as we don't
5805     have any and it causes problems building the distribution
5806     for Windows. Update version to 0.8.0.
5807    
5808     * Doc/thuban.dtd: Removed since it is now in Resources/XML.
5809    
5810     * Thuban/UI/mainwindow.py: Add blank line at the end because
5811     file was not being read correctly building the Windows
5812     distribution.
5813    
5814     2003-06-23 Jonathan Coles <[email protected]>
5815    
5816 jonathan 1289 * Thuban/UI/mainwindow.py (MainWindow.About): Fix text.
5817    
5818     * Thuban/version.py: Temporarily update longversion for
5819     the 0.8 release so that it doesn't have the cvs revision.
5820    
5821     2003-06-23 Jonathan Coles <[email protected]>
5822    
5823 jonathan 1286 * Thuban/UI/common.py (ThubanBeginBusyCursor): Call wxSafeYield
5824     to make sure that we don't create reentrant possibilities with
5825     wxYield.
5826    
5827     * Thuban/UI/view.py (MapCanvas.OnPaint): Call wxBeginBusyCursor()
5828     directly to avoid the wxSafeYield() call which generates an
5829     OnPaint event causing infinite recursion. Don't try to catch
5830     exception anymore. This was for before there were limits on map
5831     scaling.
5832    
5833 bh 1283 2003-06-23 Bernhard Herzog <[email protected]>
5834    
5835     Bug fix for RT #1961:
5836    
5837     * Thuban/Model/load.py (SessionLoader.start_derivedshapesource):
5838     Register DerivedShapestores with the session
5839    
5840     * Thuban/Model/session.py (Session.Tables): Make sure each table
5841     is only listed once.
5842    
5843     * test/test_load.py (TestJoinedTable.test): Add check_format call.
5844     Update file contents to match the one written out.
5845    
5846 bh 1281 2003-06-20 Bernhard Herzog <[email protected]>
5847    
5848     * test/xmlsupport.py (SaxEventLister.startElementNS)
5849     (SaxEventLister.endElementNS): Do not include the qname. Python
5850     2.2.1 and 2.2.2 and 2.2.3 differ in this regard. In 2.2.1 qname it
5851     is (presumably incorrectly) None, whereas it's a string with the
5852     element name in the later versions.
5853    
5854     * test/test_xmlsupport.py (TestEventList.test_even_list_simple)
5855     (TestEventList.test_even_list_namespace): Update tests to reflect
5856     the new behaviour
5857     (TestEventList.test_even_list_id_normalization): Fix doc-string
5858    
5859 jonathan 1272 2003-06-20 Jonathan Coles <[email protected]>
5860    
5861 jonathan 1279 * Thuban/Model/layer.py (BaseLayer.HasShapes): New. Overridden
5862     by deriving classes to determine if that layer supports shapes.
5863     (Layer): Override HasShapes and return true.
5864    
5865     * Thuban/UI/classgen.py: Use Thuban[Begin|End]BusyCursor()
5866     instead of a direct call to wx[Begin|End]CusyCursor().
5867     (GenUniquePanel._OnRetrieve): Set busy cursor while retrieving
5868     table data.
5869    
5870     * Thuban/UI/common.py (ThubanBeginBusyCursor, ThubanEndBusyCursor):
5871     New. Wrappers around the wxWindows functions that allow us to
5872     make additional calls such as wxYield which gives the native
5873     system a chance to update the cursor correctly.
5874    
5875     * Thuban/UI/tableview.py: Use Thuban[Begin|End]BusyCursor()
5876     instead of a direct call to wx[Begin|End]CusyCursor().
5877    
5878     * Thuban/UI/view.py: Use Thuban[Begin|End]BusyCursor()
5879     instead of a direct call to wx[Begin|End]CusyCursor().
5880     (MapCanvas.find_shape_at): Check if the current search layer
5881     support shapes, otherwise go on to the next layer.
5882    
5883     * test/test_layer.py: Add tests in each type of layer for
5884     HasClassification() and HasShapes()
5885    
5886     2003-06-20 Jonathan Coles <[email protected]>
5887    
5888 jonathan 1272 * Thuban/UI/view.py (MapCanvas.OnPaint): Call wxYield after
5889     turning on the busy cursor to allow the system to change the
5890     cursor before we begin painting. This fixes a problem that
5891     was occuring only under GTK. Fixes RTbug #1840.
5892    
5893 bh 1270 2003-06-20 Bernhard Herzog <[email protected]>
5894    
5895     * Resources/XML/thuban-0.8.dtd: New DTD for the new file format
5896     version.
5897    
5898     * Thuban/Model/save.py (sort_data_stores): New. Make topological
5899     sort of the data sources so they can be written with sources that
5900     data sources that depend on other data sources come after the
5901     sources they depend on.
5902     (SessionSaver.__init__): Add idmap instance variable to map from
5903     objects to the ids used in the file.
5904     (SessionSaver.get_id, SessionSaver.define_id)
5905     (SessionSaver.has_id): New. Methods to manage the idmap
5906     (SessionSaver.write): Use thuban-0.8.dtd
5907     (SessionSaver.write_session): Add a namespace on the session and
5908     write out the data sources before the maps.
5909     (SessionSaver.write_data_containers): New. Write the data
5910     containers.
5911     (SessionSaver.write_layer): Layer elements now refer to a
5912     shapestore and don't contain filenames anymore.
5913    
5914     * Thuban/Model/load.py (LoadError): Exception class to raise when
5915     errors in the files are discovered
5916     (SessionLoader.__init__): Define dispatchers for elements with a
5917     thuban-0.8 namespace too.
5918     (SessionLoader.check_attrs): New helper method to check and
5919     convert attributes
5920     (AttrDesc): New. Helper class for SessionLoader.check_attrs
5921     (SessionLoader.start_fileshapesource)
5922     (SessionLoader.start_derivedshapesource)
5923     (SessionLoader.start_filetable, SessionLoader.start_jointable):
5924     Handlers for the new elements in the new fileformat
5925     (SessionLoader.start_layer): Handle the shapestore attribute in
5926     addition to filename.
5927     (SessionLoader.start_table, SessionLoader.end_table): Removed.
5928     They were never used in the old formats and aren't needed for the
5929     new.
5930    
5931     * Thuban/Model/session.py (Session.DataContainers): New method to
5932     return all "data containers", i.e. shapestores and tables
5933    
5934     * test/xmlsupport.py (SaxEventLister.__init__)
5935     (SaxEventLister.startElementNS, sax_eventlist): Add support to
5936     normalize IDs.
5937    
5938     * test/test_xmlsupport.py
5939     (TestEventList.test_even_list_id_normalization): New test case for
5940     id normalization
5941    
5942     * test/test_load.py (LoadSessionTest.check_format): Use ID
5943     normalization
5944     (LoadSessionTest.thubanids, LoadSessionTest.thubanidrefs): New
5945     class atrributes used for ID normalization
5946     (TestSingleLayer, TestLayerVisibility, TestLabels.test)
5947     (TestLayerProjection.test, TestRasterLayer.test): Adapt to new
5948     file format
5949     (TestJoinedTable): New test for loading sessions with joined
5950     tables.
5951     (TestLoadError): New. Test whether missing required attributes
5952     cause a LoadError.
5953    
5954     * test/test_save.py (SaveSessionTest.thubanids)
5955     (SaveSessionTest.thubanidrefs): New class attributes for ID
5956     normalization in .thuban files.
5957     (SaveSessionTest.compare_xml): Use id-normalization.
5958     (SaveSessionTest.testEmptySession)
5959     (SaveSessionTest.testLayerProjection)
5960     (SaveSessionTest.testRasterLayer)
5961     (SaveSessionTest.testClassifiedLayer): Adapt to new file format.
5962     (SaveSessionTest.testLayerProjection): The filename used was the
5963     same as for testSingleLayer. Use a different one.
5964     (SaveSessionTest.test_dbf_table)
5965     (SaveSessionTest.test_joined_table): New test cases for saving the
5966     new data sources structures.
5967     (TestStoreSort, MockDataStore): Classes to test the sorting of the
5968     data stores for writing.
5969    
5970     * test/runtests.py: Add CVS keywords
5971    
5972 jonathan 1265 2003-06-20 Jonathan Coles <[email protected]>
5973    
5974 jonathan 1267 * test/test_session.py
5975     (UnreferencedTablesTests.test_unreferenced_tables_with_joins):
5976     Use the cultural_landmark-point.dbf file for the store so that
5977     the table rows and shape count match.
5978    
5979     2003-06-20 Jonathan Coles <[email protected]>
5980    
5981 jonathan 1265 * Thuban/Model/data.py (DerivedShapeStore.__init__): Raise
5982     an exception if the number of shapes is different from the
5983     number of rows in the table. Address RTbug #1933.
5984    
5985     * test/test_layer.py (TestLayer.test_derived_store): Add
5986     a test for the new exception in DerivedShapeStore.__init__.
5987    
5988     * test/support.py (FloatTestCase): Removed since there is
5989     already FloatComparisonMixin. Fixes RTbug #1954.
5990     (FloatComparisonMixin.assertFloatEqual): Include test for
5991     infinity that was part of FloatTestCase.
5992    
5993     * test/test_range.py (RangeTest): Inherit from
5994     support.FloatComparisonMixin now that we don't have
5995     support.FloatTestCase.
5996    
5997 bh 1256 2003-06-20 Bernhard Herzog <[email protected]>
5998    
5999 bh 1260 * test/test_save.py (SaxEventLister, sax_eventlist): Removed. Use
6000     the implementation in xmlsupport instead.
6001     (SaveSessionTest.compare_xml): sax_eventlist is now in xmlsupport
6002    
6003     * test/test_proj.py: Import sax_eventlist from xmlsupport instead
6004     of test_save
6005    
6006     2003-06-20 Bernhard Herzog <[email protected]>
6007    
6008 bh 1258 * test/test_load.py (LoadSessionTest.check_format): New helper
6009     method to make sure the test files we load might have been written
6010     by the current thuban version.
6011     (ClassificationTest.TestLayers, TestSingleLayer.test)
6012     (TestLayerVisibility.test, TestClassification.test)
6013     (TestLabels.test, TestLayerProjection.test, TestRasterLayer.test):
6014     Add check_format() calls and fix the thuban data to match the data
6015     that would be written by saving the session loaded from it.
6016    
6017     * test/xmlsupport.py (SaxEventLister, sax_eventlist): Copies of
6018     the same class and function in test_save.
6019    
6020     * test/test_xmlsupport.py (TestEventList): New. test cases for
6021     sax_eventlist
6022    
6023     2003-06-20 Bernhard Herzog <[email protected]>
6024    
6025 bh 1256 * Resources/XML/thuban.dtd: Add comment about which versions of
6026     Thuban are covered by this DTD
6027     (map): Fix content model for layers and raster layers. There can
6028     be any number or layers and raster layers in any order.
6029    
6030 jonathan 1254 2003-06-20 Jonathan Coles <[email protected]>
6031    
6032 jonathan 1265 This is mainly about fixing RTbug #1949.
6033    
6034 jonathan 1254 * Thuban/Model/classification.py: Remove "from __future__"
6035     import statement since python 2.2 is the earliest supported
6036     version.
6037    
6038     * Thuban/Model/proj.py (Projection.GetProjectedUnits): New.
6039     Currently returns PROJ_UNITS_METERS or PROJ_UNITS_DEGREES
6040     depending on the units this projection *forwards* into.
6041    
6042     * Thuban/Model/save.py (SessionSaver.write_classification):
6043     Remove unnecessary use of lambdas and nested functions.
6044    
6045     * Thuban/UI/legend.py (ScaleBarBitmap.__SetScale): Do scale
6046     adjustment here if the map projection uses degrees.
6047    
6048     * Thuban/UI/scalebar.py (ScaleBar.DrawScaleBar): Remove
6049     scale adjust code since it is now done before calling
6050     this method. Don't do anything if the map projection
6051     is None.
6052    
6053 bh 1244 2003-06-19 Bernhard Herzog <[email protected]>
6054    
6055 bh 1248 Move version specific load tests to their own file.
6056    
6057     * test/test_load.py: Expand the doc-string to explain a bit how to
6058     handle file format changes.
6059     (TestClassification.test): Update the docstring as this test is
6060     not about Thuban 0.2 anymore.
6061    
6062     * test/test_load_0_2.py: New file with the load tests for thuban
6063     files created with Thuban 0.2 and earlier.
6064    
6065     2003-06-19 Bernhard Herzog <[email protected]>
6066    
6067 bh 1246 Add XML validation to some of the tests. Validation will only be
6068     done if pyRXP is installed (http://reportlab.com/xml/pyrxp.html).
6069     To make the DTD available to the test cases it's moved into
6070     Resources/XML
6071    
6072     * Resources/XML/thuban.dtd: New. This is now the real Thuban DTD
6073     for versions up to and including 0.2. Two slight changes: added an
6074     encoding specification and fixed the comment which refered to
6075     GRASS, not Thuban
6076    
6077     * test/xmlsupport.py: New support module for tests involving XML.
6078     Currently there's a mix-in class for XML validation.
6079    
6080     * test/test_xmlsupport.py: New. Tests for the xmlsupport module
6081    
6082     * test/test_save.py (SaveSessionTest): Derive from ValidationTest
6083     so that we can validate the
6084     (SaveSessionTest.testEmptySession)
6085     (SaveSessionTest.testSingleLayer)
6086     (SaveSessionTest.testSingleLayer)
6087     (SaveSessionTest.testLayerProjection)
6088     (SaveSessionTest.testRasterLayer)
6089     (SaveSessionTest.testClassifiedLayer): Validate the generated XML
6090    
6091     * test/runtests.py (main): Call print_additional_summary instead
6092     of print_garbage_information
6093    
6094     * test/support.py (resource_dir): New function to return the
6095     "Resource" subdirectory
6096     (print_additional_summary): New function to combine several
6097     summary functions
6098     (run_tests): Use print_additional_summary instead of calling
6099     print_garbage_information directly
6100    
6101     2003-06-19 Bernhard Herzog <[email protected]>
6102    
6103 bh 1244 * Doc/thuban.dtd (classification): Correct the content model of
6104     the classification element.
6105     (projection): Add the "name" attribute
6106    
6107 frank 1242 2003-06-19 Frank Koormann <[email protected]>
6108    
6109     MERGE from the greater-ms3 branch.
6110    
6111     * Thuban/UI/scalebar.py (ScaleBar.DrawScaleBar): Apply conversion to
6112     scale if projection is latlong to get better estimate.
6113    
6114     Fix problem of hidden properties dialog under windows after double
6115     click on layer tree:
6116     The tree control always gets an Expanded / Collapsed event after
6117 joey 2162 the ItemActivated on double click, which raises the main window again.
6118     We add a second ItemActivated event to the queue, which simply
6119 frank 1242 raises the already displayed window.
6120    
6121     * Thuban/UI/legend.py (LegendTree.__init__): Instance variable
6122     raiseProperties initialized to prevent endless loops
6123     (LegendTree._OnItemActivated): Depending on self.raiseProperties
6124     simply raise the properties or open the dialog and issue a second
6125     event.
6126    
6127 jonathan 1235 2003-06-18 Jonathan Coles <[email protected]>
6128    
6129 jonathan 1239 * setup.py: Fix a few problems that occured under Windows.
6130    
6131     2003-06-18 Jonathan Coles <[email protected]>
6132    
6133 jonathan 1235 When Thuban loaded the map was redrawn twice because the
6134     legend was being opened after the mainwindow was created
6135     and not during its creation. This meant the map was drawn
6136     initially and then had to be redrawn when the legend
6137     caused the display to change. Now the legend is opened
6138     in the mainwindow constructor which resolves this issue.
6139    
6140     Also, although we were checking for the existence of
6141     gdal and gdalwarp modules, the gdalwarp extension was
6142     still being compiled (which may fail if the system doesn't
6143     have gdal installed). the build_ext command to setup.py
6144     now accepts the flags --with-gdal and --without-gdal.
6145     If --without-gdal is specified setup.py will try to
6146     use the gdal parameters specified by gdal-config. Under
6147     windows, those parameters have to be set in setup.py
6148     as with proj4 an wxWindows.
6149    
6150     * setup.py: Use a list instead of seperate variables for
6151     extension parameters so we can create a generic function
6152     that runs an appropriate *-config script.
6153     (run_cs_script): Renamed from run_wx_script and modified
6154     to accept a second argument which is a list of lists to
6155     be filled in by the values returned from running the command.
6156     (thuban_build_ext): New. Extends the build_ext command and
6157     provides the options --with-gdal/--without-gdal which then
6158     optionally includes the gdalwarp extension.
6159    
6160     * Thuban/Model/resource.py: First check if we can import
6161     the gdalwarp Thuban extension before checking for gdal.
6162     Also added some comments.
6163    
6164     * Thuban/UI/legend.py (ScaleBarBitmap.__SetScale): Check if
6165     the map is None which may be the case if none has been loaded
6166     yet.
6167    
6168     * Thuban/UI/main.py (main): Remove call to ShowLegend.
6169    
6170     * Thuban/UI/mainwindow.py (MainWindow.__init__): Call ShowLegend().
6171    
6172     * Thuban/UI/renderer.py: Check for gdal support before importing
6173     gdalwarp.
6174     (MapRenderer.render_map): Only try to optimize if we have gdal
6175     support otherwise nothing will get drawn.
6176    
6177 jonathan 1237 * Thuban/UI/view.py (MapCanvas.FitMapToWindow): This may be called
6178     during startup before a map has been created. Check if map is None
6179     before using it and do nothing if it is.
6180    
6181 jonathan 1224 2003-06-17 Jonathan Coles <[email protected]>
6182    
6183     Fix the problem with raster layers under Windows that caused
6184     Thuban to crash. The view should respond to layer projection
6185     changed events to update the display. Changes to a projection
6186     should not cause the map to be set to full extent.
6187    
6188     * Thuban/UI/view.py (MapCanvas.__init__): New instance variable
6189     current_map_proj to remember the current map projection so that
6190     when the projection changes we know what the previous projection
6191     was.
6192     (MapCanvas.SetMap): Unsubscribe and subscribe to
6193     LAYER_PROJECTION_CHANGED events.
6194     (MapCanvas.projection_changed): Split into two methods that respond
6195     to map and layer projection changes.
6196     (MapCanvas.map_projection_changed): New. Takes the current view and
6197     projects it using the new projection. This does not cause the
6198     map to be redrawn at full extent.
6199     (MapCanvas.layer_projection_changed): New. Cause a redraw which
6200     will draw each layer in its new projection.
6201    
6202     * extensions/thuban/bmpdataset.cpp (BMPDataset::Open): Call
6203     VSIFClose() not VSIFCloseL() to close the file. Fixes a crash
6204     under Windows.
6205    
6206     * extensions/thuban/gdalwarp.cpp (MFILENAME): Padding should be
6207     to twice sizeof(void*) because there are two digits for each
6208     hex byte.
6209    
6210 bh 1220 2003-06-16 Bernhard Herzog <[email protected]>
6211    
6212     Update to the layer interface: Direct access to the table,
6213     shapetable, shapefile and filename attributes is now actively
6214     deprecated by issuing deprecation warnings for all places where
6215     this happens.
6216    
6217     * Thuban/Model/layer.py (Layer.__getattr__): New. Implement access
6218     to the instance variables table, shapetable, shapefile and
6219     filename via __getattr__ so that we can issue a deprecation
6220     warning.
6221     (Layer.SetShapeStore): Don't set the deprecated instance variables
6222     any more
6223     (Layer.SetShapeStore): Don't use deprecated layer instance
6224     variables
6225     (Layer.Destroy): No need to explicitly remove the instance
6226     variables any more
6227     (Layer.GetFieldType, Layer.Shape): Don't use deprecated layer
6228     instance variables
6229    
6230     * Thuban/UI/classgen.py (ClassGenDialog.__init__)
6231     (GenUniformPanel._OnRetrieve, GenUniquePanel._OnRetrieve)
6232     (GenQuantilesPanel.GetList, GenQuantilesPanel.OnRetrieve): Don't
6233     use deprecated layer instance variables
6234    
6235     * Thuban/UI/classifier.py (Classifier.__init__): Don't use
6236     deprecated layer instance variables
6237    
6238     * Thuban/UI/identifyview.py (IdentifyListCtrl.selected_shape)
6239     (IdentifyGridCtrl.selected_shape): Don't set the deprecated layer
6240     instance variables
6241    
6242     * Thuban/UI/tableview.py (LayerTableGrid.select_shapes): Don't use
6243     deprecated layer instance variables
6244    
6245     * Thuban/UI/mainwindow.py (MainWindow.LayerShowTable): Don't use
6246     deprecated layer instance variables
6247    
6248     * Thuban/Model/save.py (SessionSaver.write_layer): Don't use
6249     deprecated layer instance variables
6250    
6251     * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer)
6252     (MapRenderer.polygon_render_param): Don't use deprecated layer instance
6253     variables
6254    
6255     * test/runtests.py (main): Turn Thuban's deprecation warnings into
6256     errors so that they're cought by the tests
6257    
6258     * test/test_load.py (TestSingleLayer.test): Don't use deprecated
6259     layer instance variables
6260    
6261 jonathan 1212 2003-06-16 Jonathan Coles <[email protected]>
6262    
6263     Fix a problem under Windows whereby if the user double-clicks on a
6264     layer in the legend that tree item will expand or collapse as well
6265     as open the layer properties dialog. The state of the tree item
6266     should not be affected.
6267    
6268     * Thuban/UI/legend.py (LegendTree.__init__): Add instance variable
6269     preventExpandCollapse and subscribe to expanding and collapsing
6270     events.
6271     (LegendTree.OnItemExpandCollapse): New. Responds to expanding and
6272     collapsing events and will veto the event if it has been triggered
6273     by the user double clicking on a layer.
6274     (LegendTree._OnItemActivated): Set preventExpandCollapse to indicate
6275     that an expanding/collapsing event should be vetoed.
6276    
6277 bh 1208 2003-06-13 Bernhard Herzog <[email protected]>
6278    
6279     * Thuban/UI/classifier.py (Classifier.OnClose)
6280     (Classifier.map_layers_removed)
6281     (Classifier.layer_shapestore_replaced): Unsubscribe the messages
6282     in OnClose and not in map_layers_removed or
6283     layer_shapestore_replaced to make sure it always happens when the
6284     dialog is closed
6285    
6286 jonathan 1201 2003-06-13 Jonathan Coles <[email protected]>
6287    
6288 jonathan 1203 This puts back a fix for Windows where a panel is needed so that
6289     the background of the table view appears correctly.
6290    
6291     * Thuban/UI/tableview.py (TableFrame.__init__): Add a panel
6292     object that can be used by derived classes to place any
6293     controls (including the grid) onto.
6294     (QueryTableFrame.__init__): Use the panel as the parent window
6295     for all the controls. Reparent the grid so that the panel is
6296     the parent. Call UpdateStatusText() to correctly initialize
6297     the status bar.
6298    
6299     2003-06-13 Jonathan Coles <[email protected]>
6300    
6301 jonathan 1201 * Thuban/UI/dialogs.py (ThubanFrame): New: a class that inherits
6302     from wxFrame (as opposed to wxDialog like the other classes)
6303     but otherwise behaves like the other classes. This is needed
6304     for the TableView which isn't really a dialog and needs to
6305     have a status bar and control buttons.
6306    
6307     * Thuban/UI/tableview.py (TableGrid.__init__): Create an
6308     instance variable to keep track of how many rows are selected.
6309     Subscribe once to the the events we are interested in.
6310     (ThubanGrid.OnRangeSelect): Only handle event if event handling
6311     hasn't been turned off.
6312     (ThubanGrid.OnSelectCell): Only handle event if event handling
6313     hasn't been turned off.
6314     (ThubanGrid.ToggleEventListeners): Rather than subscribe None
6315     as an event listener (which changes the event handler stack)
6316     simply set an instance variable to False. This is checked in
6317     the event handlers.
6318     (ThubanGrid.GetNumberSelected): Return the number of currently
6319     selected rows.
6320     (TableFrame): Inherit from ThubanFrame so we can have a
6321     status bar and control buttons.
6322     (QueryTableFrame.__init__): Create a status bar. Fixes RTbug #1942.
6323     Explicitly set which items are selected in the operator choice and
6324     action choice so there is always a valid selection. Fixes RTbug #1941.
6325     Subscribe to grid cell selection events so we can update the
6326     status bar.
6327     (QueryTableFrame.UpdateStatusText): Update the status bar with
6328     how many rows are in the grid, how many columns, and how many
6329     rows are selected.
6330     (QueryTableFrame.OnGridSelectRange, QueryTableFrame.OnGridSelectCell):
6331     Call UpdateStatusText when cells are (de)selected.
6332     (QueryTableFrame.OnQuery): Use the string value in the value
6333     combo if either the selected item index is 0 or if the string
6334     cannot be found in the predefined list (this happens if the
6335     user changes the text). Fixes RTbug #1940.
6336     Only turn off the grid event listeners if there a query comes
6337     back with a none empty list of ids. in the case that the list
6338     is empty this causes a grid.ClearSelection() call to actually
6339     clear the grid selection which causes the selected items in
6340     the map to be deselected. Fixes RTbug #1939.
6341    
6342     * test/test_save.py (XMLWriterTest.Encode): Check return values.
6343     Fixes RTbug #1851.
6344    
6345 bh 1195 2003-06-13 Bernhard Herzog <[email protected]>
6346    
6347     * Thuban/UI/identifyview.py (IdentifyView.__init__): Call
6348     self.selected_shape with the current selection to make sure the
6349     contents of the dialog are up to date when it's shown for the
6350     first time.
6351     The dialog used to work without this by luck. The recent fix to
6352     the connector module 'broke' a 'feature' the identify view was
6353     relying on, i.e that subscribing to a message in response to
6354     receiving a message of that type would mean that the new
6355     subscriber would also be called for the same message.
6356    
6357 jonathan 1169 2003-06-12 Jonathan Coles <[email protected]>
6358 jonathan 1175
6359 jonathan 1193 * extensions/thuban/gdalwarp.cpp: Removed debug printing as
6360     the image is rendered. Fixes RTbug #1937.
6361    
6362     2003-06-12 Jonathan Coles <[email protected]>
6363    
6364 jonathan 1191 * Thuban/Lib/fileutil.py: As is done under Windows, create the
6365 jonathan 1193 user directory if it doesn't exist on a posix system.
6366     Fixes RTbug #1815.
6367 jonathan 1191
6368     * Thuban/Model/resource.py (get_user_proj_files): Moved the
6369     called to get_application_dir here, so that the directory
6370     will only be called if this method is invoked.
6371    
6372     * Thuban/UI/projdialog.py (ProjFrame.__DoOnProjAvail): Clear
6373     the projfilepath if no projection is selected.
6374    
6375     2003-06-12 Jonathan Coles <[email protected]>
6376    
6377 jonathan 1182 * Thuban/UI/legend.py (ScaleBarBitmap.__SetScale): Don't draw
6378     the scalebar if the current map has no projection set.
6379    
6380     * Thuban/UI/projdialog.py (ProjFrame.__DoOnProjAvail): Set the
6381     projfilepath label to just the basename of the projection file
6382     rather than include the entire path.
6383    
6384     * Thuban/Model/resource.py: Fix missed proj functions that
6385     needed to be renamed.
6386    
6387     2003-06-12 Jonathan Coles <[email protected]>
6388    
6389 jonathan 1178 * Thuban/Model/classification.py: Removed assert statements that
6390     tested if the variable was an instance of Color.
6391    
6392     * Thuban/Model/color.py (Color): Remove commented code that isn't
6393     used.
6394     (Transparent): Renamed from NoColor. Doesn't inherit from Color.
6395     Fixes RTbug #1835.
6396     (Transparent.__eq__, Transparent.__ne, Transparent.__repr): New.
6397     Needed now that the class doesn't inherit from Color.
6398    
6399     2003-06-12 Jonathan Coles <[email protected]>
6400    
6401 jonathan 1175 * test/test_save.py (XMLWriterTest.testEncode): Explicitly
6402     check unicode strings.
6403    
6404     * test/test_layer.py: Check for existence of gdal.
6405    
6406     2003-06-12 Jonathan Coles <[email protected]>
6407 jonathan 1172
6408     * Thuban/Model/xmlreader.py: New. Contains the XMLReader class
6409     that was in load.py
6410 jonathan 1169
6411 jonathan 1172 * Thuban/Model/xmlwriter.py: New. Contains the XMLWriter class
6412     that was in save.py
6413    
6414     2003-06-12 Jonathan Coles <[email protected]>
6415    
6416 jonathan 1169 This is largely a collection of bug fixes. We also handle the
6417     case where gdal is not on the system. The XMLReader and XMLWriter
6418     classes were moved into there own files to resolve some circular
6419     import references and because they shouldn't really be in the
6420     file that is dediciated to reading/writing session files since
6421     they are also used elsewhere.
6422    
6423     * Thuban/Model/classgen.py: Renamed functions to follow the
6424     function_names_with_underscores style. Fixes RTbug #1903.
6425     (calculate_quantiles): Raise ValueError if 'percents' is invalid.
6426    
6427     * Thuban/Model/layer.py: Import gdal only if it available.
6428     (RasterLayer): Handle the case where the gdal library is unavailable.
6429     Addresses RTbug #1877.
6430    
6431     * Thuban/Model/load.py (XMLReader): Moved into seperate file
6432     xmlreader.py.
6433    
6434 jonathan 1172 2003-06-12 Jonathan Coles <[email protected]>
6435    
6436     This is largely a collection of bug fixes. We also handle the
6437     case where gdal is not on the system. The XMLReader and XMLWriter
6438     classes were moved into there own files to resolve some circular
6439     import references and because they shouldn't really be in the
6440     file that is dediciated to reading/writing session files since
6441     they are also used elsewhere.
6442    
6443     * Thuban/Model/classgen.py: Renamed functions to follow the
6444     function_names_with_underscores style. Fixes RTbug #1903.
6445     (calculate_quantiles): Raise ValueError if 'percents' is invalid.
6446    
6447     * Thuban/Model/layer.py: Import gdal only if it available.
6448     (RasterLayer): Handle the case where the gdal library is unavailable.
6449     Addresses RTbug #1877.
6450    
6451     * Thuban/Model/load.py (XMLReader): Moved into seperate file
6452     xmlreader.py.
6453    
6454 jonathan 1169 * Thuban/Model/save.py (escape, XMLWriter): Moved into seperate
6455     file xmlwriter.py.
6456    
6457     * Thuban/Model/resource.py: Renamed functions to following the
6458     function_names_with_underscores style.
6459     (has_gdal_support): New function that returns true if the gdal
6460     library is available. Addresses RTbug #1877.
6461    
6462     * Thuban/UI/application.py (ThubanApplication.OpenSession):
6463     Display a message box if the gdal library is not available, but
6464     only if there are any layers that would use it. Addresses RTbug #1877.
6465    
6466     * Thuban/UI/classgen.py: Use renamed projection resource functions.
6467     (GenUniformPanel.__CalcStepping): Fix a slight discrepency
6468     when using integers versus floats.
6469    
6470     * Thuban/UI/mainwindow.py (_has_gdal_support): New. Used to
6471     determine if the "Add Image Layer" menu option should be
6472     greyed out or not. Addresses RTbug #1877.
6473    
6474     * Thuban/UI/projdialog.py: Use renamed projection resource functions.
6475    
6476     * Thuban/UI/renderer.py (MapRenderer.render_map): Only try to
6477     optimize if a raster layer is visible. Fixes RTbug #1931.
6478     Only draw the raster layer if the gdal library is available.
6479     Addresses RTbug #1877.
6480    
6481     * test/test_classgen.py: Add tests for generate_singletons,
6482     generate_uniform_distribution, generate_quantiles. Fixes RTbug #1903.
6483     (test_calculate_quantiles): Fix some tests to catch the new
6484     ValueError that is raised.
6485    
6486     * test/test_proj.py: Use renamed projection resource functions.
6487    
6488     * test/test_save.py (SaveSessionTest.testClassifiedLayer): New
6489     test for saving classified layers. Fixes RTbug #1902.
6490     (XMLWriterTest): New. Tests the XMLWriter class. Fixes RTbug #1851.
6491    
6492 jan 1156 2003-06-12 Jan-Oliver Wagner <[email protected]>
6493    
6494     Fix for http://intevation.de/rt/webrt?serial_num=1900.
6495    
6496     * Thuban/UI/multiplechoicedialog.py: New. A multiple choice dialog.
6497    
6498     * Thuban/UI/mainwindow.py: import wxMultipleChoiceDialog from
6499     multiplechoicedialog.py rather than from the wxPython library.
6500    
6501 frank 1151 2003-06-11 Frank Koormann <[email protected]>
6502    
6503 frank 1152 * Thuban/Lib/fileutil.py (get_application_dir): Minor stability
6504     update.
6505    
6506     2003-06-11 Frank Koormann <[email protected]>
6507    
6508 frank 1151 * Thuban/Lib/fileutil.py (get_application_dir): New function to
6509     determine the absolute .thuban/thuban directory under
6510     "posix" (os.expanduser) and "nt" (read AppData registry key).
6511    
6512     * Thuban/Model/resource.py: Use get_application_dir
6513    
6514     * Thuban/UI/application.py (ThubanApplication.read_startup_files):
6515     Use get_application_dir.
6516    
6517 bh 1143 2003-06-10 Bernhard Herzog <[email protected]>
6518    
6519 bh 1147 * Thuban/UI/tableview.py (LayerTableFrame.__init__): Subscribe to
6520     the messages MAP_LAYERS_REMOVED messages
6521     (LayerTableFrame.OnClose): Unsubscribe from it.
6522     (LayerTableFrame.map_layers_removed): New. Receiver for
6523     MAP_LAYERS_REMOVED. Close the dialog when the layer whose the
6524     dialog is showing is removed.
6525    
6526     2003-06-10 Bernhard Herzog <[email protected]>
6527    
6528 bh 1145 * Thuban/Lib/connector.py (Connector.Issue): Iterate over a copy
6529     of the receivers list so that unsubscribing in a receiver doesn't
6530     modify it while iterating over it.
6531    
6532     * test/test_connector.py
6533     (ConnectorTest.test_disconnect_in_receiver): New. Test whether
6534     unsubscribing in a receiver works correctly. See docstring for
6535     details
6536    
6537     2003-06-10 Bernhard Herzog <[email protected]>
6538    
6539 bh 1143 * Thuban/Model/messages.py (LAYER_SHAPESTORE_REPLACED): New
6540     message.
6541    
6542     * Thuban/Model/layer.py (Layer.SetShapeStore): Send
6543     LAYER_SHAPESTORE_REPLACED when the shapestore changes. A
6544     LAYER_CHANGED will still be sent if the classification changes.
6545    
6546     * Thuban/UI/classifier.py (Classifier.__init__): Add the map as
6547     parameter so we can subscribe to some of its messages
6548     (Classifier.__init__): Subscribe to the map's MAP_LAYERS_REMOVED
6549     and the layer's LAYER_SHAPESTORE_REPLACED
6550     (Classifier.unsubscribe_messages): New. Unsubscribe from message
6551     subscribed to in __init__
6552     (Classifier.map_layers_removed)
6553     (Classifier.layer_shapestore_replaced): receivers for the messages
6554     subscribed to in __init__. Unsubscribe and close the dialog
6555    
6556     * Thuban/UI/mainwindow.py (MainWindow.OpenLayerProperties): Pass
6557     the map to the Classifier dialog
6558    
6559     * test/test_layer.py (SetShapeStoreTests): Derive from
6560     SubscriberMixin as well so we can test messages
6561     (SetShapeStoreTests.setUp): Subscribe to some of the layer's
6562     messages
6563     (SetShapeStoreTests.tearDown): Clear the messages again
6564     (SetShapeStoreTests.test_sanity): Expand the doc-string and check
6565     for the modified flag too
6566     (SetShapeStoreTests.test_set_shape_store_modified_flag): New test
6567     to check whether SetShapeStore sets the modified flag
6568     (SetShapeStoreTests.test_set_shape_store_different_field_name)
6569     (SetShapeStoreTests.test_set_shape_store_same_field)
6570     (SetShapeStoreTests.test_set_shape_store_same_field_different_type):
6571     Add tests for the messages. This checks both the new
6572     LAYER_SHAPESTORE_REPLACED and the older LAYER_CHANGED
6573    
6574 jan 1141 2003-06-06 Jan-Oliver Wagner <[email protected]>
6575    
6576     * Thuban/UI/mainwindow.py: Improved and partly added help texts for
6577     the menu items.
6578    
6579 frank 1134 2003-06-05 Frank Koormann <[email protected]>
6580    
6581 frank 1139 * Thuban/UI/identifyview.py (IdentifyView.__init__):
6582     Layout reimplemented without panel. Make life easier to fit the list
6583     in the dialog.
6584    
6585     2003-06-05 Frank Koormann <[email protected]>
6586    
6587 frank 1137 * Thuban/UI/projdialog.py (ProjFrame.__init__): Fill the projchoice
6588     once on initialisation (Former implementation resulted in multiple
6589     entries for each projection).
6590     (ProjFrame.__FillAvailList): selectProj as second optional parameter,
6591     if set, select the projection found under the specified name. This
6592     overwrites any other selection estimate.
6593     Removed projchoice filling from this method.
6594     (ProjFrame._OnSave, ProjFrame._OnAddToList):
6595     Updated call of ProjFrame.__FillAvailList
6596     (LCCPanel._DoLayout): Moved parameter controls in more common order.
6597    
6598     * Resources/Projections/defaults.proj: Extended defaults representing
6599     various common European projections.
6600    
6601     2003-06-05 Frank Koormann <[email protected]>
6602    
6603 frank 1134 * Thuban/UI/identifyview.py (IdentifyView.__init__):
6604     Use ListCtrl instead of GridCtrl
6605    
6606     * Thuban/Model/resource.py:
6607     Guess location of .thuban directory from tempdir parent directory.
6608    
6609     * Thuban/UI/application.py (ThubanApplication.read_startup_files):
6610     Guess location of .thuban directory from tempdir parent directory.
6611    
6612 bh 1130 2003-06-04 Bernhard Herzog <[email protected]>
6613    
6614     Do not cache the values returned by the tree widget's
6615     GetFirstChild and GetNextChild methods because it led to lots of
6616     segfaults. The new way requires more brute force but is more
6617     reliable.
6618    
6619     * Thuban/UI/legend.py (LegendTree.__init__): Remove instance
6620     variable layer2id
6621     (LegendTree.find_layer): New method to do with brute force what
6622     layer2id tried to accomplish
6623     (LegendTree._OnMsgLayerChanged)
6624     (LegendTree._OnMsgLayerTitleChanged, LegendTree.__ShowHideLayer):
6625     Use find_layer instead of layer2id
6626     (LegendTree.__RemoveLayer, LegendTree.__AddLayer): No need to
6627     update layer2id anymore
6628     (LegendTree._OnMsgMapLayersRemoved)
6629     (LegendTree._OnMsgMapLayersAdded): Get by without layer2id.
6630    
6631 tkoester 1128 2003-06-03 Thomas Koester <[email protected]>
6632    
6633     * Thuban/Model/classgen.py (GenQuantiles0): New function.
6634    
6635 bh 1120 2003-06-02 Bernhard Herzog <[email protected]>
6636    
6637 bh 1127 * Thuban/UI/mainwindow.py (layer_rename command, table_rename command):
6638     New commands.
6639     (main_menu): Add the new commands.
6640     (MainWindow.TableRename): New. Implementation of the table_rename
6641     command.
6642     (MainWindow.RenameLayer): New. Implementation of the layer_rename
6643     command.
6644    
6645     * Thuban/Model/session.py (Session.AddTable): call self.changed to
6646     set the modified flag
6647    
6648     * test/test_session.py (TestSessionSimple.test_add_table): Test
6649     whether the modified flag is set properly
6650    
6651     * Thuban/Model/base.py (TitledObject.SetTitle): Call changed
6652     instead of issue so that the modified flags get updated.
6653    
6654     * test/test_base.py (SomeTitledObject): Derive from Modifiable
6655     instead of Publisher to reflect reality better and to accomodate
6656     the fact that SetTitle now calls changed instead of issue
6657    
6658     2003-06-02 Bernhard Herzog <[email protected]>
6659    
6660     * Thuban/UI/classgen.py (GenQuantilesPanel.GetList): Resource
6661     acquisition has to happen before the try in a try-finally.
6662    
6663     2003-06-02 Bernhard Herzog <[email protected]>
6664    
6665 bh 1120 * Thuban/UI/legend.py (LegendTree._OnMsgMapLayersRemoved): It's
6666     possible that a layer is removed that is not currently selected in
6667     the legend so don't check for this.
6668    
6669 bh 1112 2003-05-30 Bernhard Herzog <[email protected]>
6670    
6671 bh 1118 * Thuban/Model/layer.py (Layer.Destroy): Set all instance
6672     variables to None that have direct or indirect references to
6673     shapefiles or dbf files to make sure that they do go away and the
6674     files are closed.
6675    
6676     2003-05-30 Bernhard Herzog <[email protected]>
6677    
6678 bh 1116 * Thuban/UI/legend.py (LegendTree.GetRootItem): Reset
6679     availImgListIndices when a new image list is created
6680    
6681     2003-05-30 Bernhard Herzog <[email protected]>
6682    
6683 bh 1114 * Thuban/UI/legend.py (LegendTree.__init__): New instance variable
6684     changing_selection to indicate whether the LegendTree code itself
6685     is currently changing the selection
6686     (LegendTree.normalize_selection): New method to normalize the
6687     selection by selecting the layer item even if the user clicked on
6688     the classification.
6689     (LegendTree._OnSelChanged): normalize the selection. This works
6690     around a bug in wx which doesn't keep track of the selection
6691     properly when subtrees are deleted.
6692    
6693     2003-05-30 Bernhard Herzog <[email protected]>
6694    
6695 bh 1112 * Thuban/UI/view.py (MapCanvas.set_view_transform): Limit the
6696     maximum and minimum scale factors.
6697    
6698     * test/test_classgen.py (ClassGenTest.test): Update to reflect the
6699     changes in classgen.py
6700    
6701 jonathan 1109 2003-05-30 Jonathan Coles <[email protected]>
6702    
6703     * Thuban/Model/classgen.py: Remove ClassGenerator class but make
6704     all the methods functions. Fixes RTBug #1903.
6705    
6706     * Thuban/Model/map.py (Map.TopLayer, Map.BottomLayer): Renamed
6707     to MoveLayerToTop and MoveLayerToBottom respectively. Fixes
6708     RTBug #1907.
6709    
6710     * Thuban/UI/classgen.py: Use classgen functions that were part
6711     of the ClassGenerator class. Put try/finally blocks around
6712     code that uses wxBeginBusyCursor()/wxEndBusyCursor(). Fixes
6713     RTBug #1904.
6714    
6715     * Thuban/UI/classifier.py: Remove unused import of ClassGenerator.
6716    
6717     * Thuban/UI/legend.py: The legend was cleared and repopulated any
6718     time something changed which caused some state to be lost such
6719     as which children were expanded or collapsed. Fixes RTBug #1901.
6720     (LegendTree._OnMsgMapLayersAdded): Add only new layers.
6721     (LegendTree.__OnMsgMapLayersRemoved): Remove layers that exist in
6722     the legend but not in the map.
6723     (LegendTree.__FillTree): Move main functionality out into smaller
6724     methods that can be used by other methods.
6725     (LegendTree.__FillTreeLayer): Reuse old slots in the image list
6726     if they are available.
6727     (LegendTree.DeleteAllItems): Renamed from __DeleteAllItems so
6728     that we override the wxTreeCtrl method. Iterate over children
6729     and call __RemoveLayer.
6730     (LegendTree.__AddLayer): New. Add a new layer to the legend.
6731     (LegendTree.__RemoveLayer): Remove a layer from the legend.
6732     (LegendTree.DeleteChildren): New, overrides wxTreeCtrl method.
6733     Should only be called with the id of a layer branch.
6734     (LegendTree.GetRootItem): New, overrides wxTreeCtrl method.
6735     Returns the root item or creates one if necessary.
6736    
6737     * Thuban/UI/renderer.py (MapRenderer.draw_raster_layer): Call
6738     ProjectRasterFile with tuple arguments instead of strings.
6739    
6740     * Thuban/UI/tableview.py (QueryTableFrame.OnQuery): Wrap code
6741     with try/finally. Fixes RTBug #1904.
6742    
6743     * Thuban/UI/view.py (MapCanvas.OnPaint): Wrap code
6744     with try/finally. Fixes RTBug #1904.
6745     (MapCanvas.FitSelectedToWindow): If a single point is selected
6746     simply center it on the display. Fixes RTBug #1849.
6747    
6748     * extensions/thuban/gdalwarp.cpp: Removed code that allowed gdalwarp
6749     to be compiled as a standalone app. Now the code can only be
6750     called from Python which simplifies the parameter passing.
6751     (ProjectRasterFile): Handle Python arguments. Remove code that
6752     checks for a destination dataset. Add more clean up code.
6753    
6754     * test/test_map.py (TestMapWithContents.test_raise_layer_top,
6755     TestMapWithContents.test_lower_layer_bottom):
6756     Test Map.MoveLayerToTop() and Map.MoveLayerToBottom() respectively.
6757     Fixes RTBug #1907.
6758    
6759     * Thuban/UI/mainwindow.py (MainWindow.ToggleLegend): Apply a full
6760     extent to the map when the legend is toggled. Fixes RTBug #1881.
6761    
6762 jan 1097 2003-05-29 Jan-Oliver Wagner <[email protected]>
6763    
6764     * Thuban/UI/tableview.py (LayerTableFrame.OnClose): Bug-fix: Now
6765     unsubscribes all that is subcribed in __init__.
6766    
6767 bh 1089 2003-05-28 Bernhard Herzog <[email protected]>
6768    
6769 bh 1095 * Thuban/UI/mainwindow.py (MainWindow.DuplicateLayer)
6770     (MainWindow.CanDuplicateLayer): New methods to implement the
6771     Layer/Duplicate command.
6772     (layer_duplicate command): New.
6773     (main_menu): Add layer_duplicate to the Layer menu.
6774    
6775     2003-05-28 Bernhard Herzog <[email protected]>
6776    
6777 bh 1093 * Thuban/UI/tableview.py (NullRenderer.Draw): New. Our own
6778     renderer so that NULL/None values get displayed differently (by a
6779     gray rectangle).
6780     (TableGrid.__init__): Override the default renderers
6781    
6782     2003-05-28 Bernhard Herzog <[email protected]>
6783    
6784 bh 1089 * Thuban/Model/layer.py (Layer.SetShapeStore): Set the
6785     classification to "None" if the type of the field has changed.
6786    
6787     * test/test_layer.py (SetShapeStoreTests): New. Class with a few
6788     test for the Layer.SetShapeStore method
6789    
6790 jan 1087 2003-05-28 Jan-Oliver Wagner <[email protected]>
6791 jan 1085
6792 jan 1087 * Thuban/Model/layer.py (Layer.TreeInfo): Fixed a bug (a layer
6793     does not necessarily have a filename).
6794    
6795     2003-05-28 Jan-Oliver Wagner <[email protected]>
6796    
6797 jan 1085 * Thuban/UI/mainwindow.py (MainWindow.TableClose, MainWindow.TableShow):
6798     sort the selection list for the dialog.
6799    
6800 frank 1083 2003-05-28 Frank Koormann <[email protected]>
6801    
6802     * extensions/thuban/wxproj.cpp
6803     (project_point): Removed cast to int for projected point coordinates.
6804     (shape_centroid): Return last point if all polygon vertices fall
6805     to one point.
6806    
6807 bh 1079 2003-05-28 Bernhard Herzog <[email protected]>
6808    
6809 bh 1081 * Thuban/UI/mainwindow.py (_can_unjoin): Add doc-string and cope
6810     with layers that don't have shapestores, i.e. raster layers.
6811    
6812     2003-05-28 Bernhard Herzog <[email protected]>
6813    
6814 bh 1079 * Thuban/Model/table.py (DBFTable.__init__): Omit the extension
6815     when determining the title from the filename.
6816    
6817     * test/test_dbf_table.py (TestDBFTable.test_title): Update to
6818     reflect changes in the way the title is derived from the filename
6819    
6820 frank 1077 2003-05-28 Frank Koormann <[email protected]>
6821    
6822     * Thuban/UI/mainwindow.py (MainWindow.TableShow):
6823     Added wxDEFAULT_DIALOG_STYLE to show table dialog styles.
6824    
6825 bh 1069 2003-05-27 Bernhard Herzog <[email protected]>
6826    
6827 bh 1075 * Thuban/UI/mainwindow.py (MainWindow.delegated_messages): Also
6828     delegate SelectedLayer.
6829     (MainWindow.LayerUnjoinTable): Implement.
6830     (_can_unjoin): New. Helper function for the sensitivity of the
6831     layer/unjoin command.
6832    
6833     * Thuban/Model/data.py (ShapefileStore.OrigShapeStore)
6834     (DerivedShapeStore.OrigShapeStore): New. Return the original
6835     shapestore. Used to figure out how to unjoin.
6836     (DerivedShapeStore.Shapefile): Fix a typo.
6837    
6838     2003-05-27 Bernhard Herzog <[email protected]>
6839    
6840 bh 1073 * Thuban/UI/join.py (JoinDialog): Extend to handle layer joins as
6841     well
6842     (JoinDialog.__init__): Use the layer parameter and only build the
6843     left choice when a layer is given
6844     (JoinDialog.OnJoin): Handle layer joins as well
6845     (JoinDialog.OnLeftTable, JoinDialog.OnRightTable): Handle the case
6846     that the user selects the "Select..." item. The sensitivitly
6847     updating is now in update_sensitivity
6848     (JoinDialog.y): New method to refactor the sensitivity update of
6849     the join button into its own method.
6850    
6851     * Thuban/UI/mainwindow.py (MainWindow.LayerJoinTable): Implement.
6852    
6853     2003-05-27 Bernhard Herzog <[email protected]>
6854    
6855 bh 1071 * Thuban/UI/mainwindow.py (table_close command): Make it sensitive
6856     iff there are unreferenced tables in the session
6857    
6858     2003-05-27 Bernhard Herzog <[email protected]>
6859    
6860 bh 1069 * Thuban/Model/messages.py (TABLE_REMOVED): New message.
6861    
6862     * Thuban/Model/session.py (Session.UnreferencedTables): New method
6863     to return tables that are not referenced by other tables or shape
6864     stores and can be removed.
6865     (Session.RemoveTable): Issue a TABLE_REMOVED message after
6866     removing the table
6867    
6868     * Thuban/UI/mainwindow.py: Remove unused imports
6869     (MainWindow.TableClose): Implement.
6870    
6871     * Thuban/UI/tableview.py (TableFrame.__init__): Subscribe to some
6872     messages so that the frame will be automatically closed when a new
6873     session is opened or the table is removed.
6874     (TableFrame.OnClose): Unsubscribe the Subscriptions made in
6875     __init__
6876     (TableFrame.close_on_session_replaced)
6877     (TableFrame.close_on_table_removed): New. Subscribers that close
6878     the window
6879    
6880     * test/test_session.py (TestSessionMessages.test_remove_table)
6881     (TestSessionSimple.test_remove_table): Move the test to
6882     TestSessionSimple and add test for the TABLE_REMOVED message
6883     (TestSessionBase.setUp): Also subscribe to TABLE_REMOVED
6884     (TestSessionSimple.test_unreferenced_tables) New. Test for the
6885     UnreferencedTables method.
6886     (UnreferencedTablesTests): New. Class with some more sophisticated
6887     tests for UnreferencedTables.
6888    
6889 frank 1065 2003-05-27 Frank Koormann <[email protected]>
6890    
6891 frank 1067 * Thuban/UI/tableview.py (QueryTableFrame.__init__): The "_S_election"
6892     display has some unwanted side effects. Removed again.
6893    
6894     2003-05-27 Frank Koormann <[email protected]>
6895    
6896 frank 1065 * Resources/Bitmaps/legend_icon_layer.xpm: New, icon for legend.
6897    
6898     * Thuban/UI/legend.py (LegendTree.__FillTree): Use "legend_icon_layer"
6899    
6900 jan 1062 2003-05-27 Jan-Oliver Wagner <[email protected]>
6901    
6902 bh 1069 * test/test_menu.py (MenuTest.test): Added test for
6903     Menu.RemoveItem().
6904 jan 1062
6905 bh 1069 * Thuban/UI/menu.py (Menu.RemoveItem): New. Remove an item from
6906     the menu.
6907 jan 1062
6908 frank 1059 2003-05-27 Frank Koormann <[email protected]>
6909    
6910     Nonmodal dialogs without parent (i.e. they can fall behind the main
6911     window)
6912    
6913     * Thuban/UI/mainwindow.py (MainWindow.OnClose): Explicitly destroy
6914     all dialogs in the dialogs dictionary and the canvas.
6915    
6916     * Thuban/UI/dialogs.py (NonModalNonParentDialog): New class, without
6917     parent, i.e. can fall behind other windows.
6918     (NonModalDialog.OnClose): Check is dialog is in mainwindow.dialog
6919     dictionary before removing it.
6920    
6921     * Thuban/UI/classifier.py: Dialog derived from NonModalNonParentDialog
6922    
6923     * Thuban/UI/projdialog.py: Dialog derived from NonModalNonParentDialog
6924     * Thuban/UI/tableview.py: Dialog derived from NonModalNonParentDialog
6925     * Thuban/UI/tree.py: Dialog derived from NonModalNonParentDialog
6926    
6927 bh 1053 2003-05-27 Bernhard Herzog <[email protected]>
6928    
6929 bh 1055 * Thuban/UI/mainwindow.py (MainWindow.ShowTableView): New. Open a
6930     tableview dialog
6931     (MainWindow.TableShow): Use ShowTableView to open the dialogs.
6932     Also, don't use the table's titles as the dialog names. The titles
6933     aren't guaranteed to be unique.
6934     (MainWindow.TableOpen): Open a table view dialog after opening the
6935     table
6936    
6937     2003-05-27 Bernhard Herzog <[email protected]>
6938    
6939 bh 1053 * Thuban/UI/mainwindow.py: Remove the Table/Hide menu item. Its
6940     effect can be achieved by simply closing the window showing the
6941     table.
6942     (MainWindow.TableHide): Removed.
6943     (main_menu): Removed "table_hide"
6944    
6945 frank 1051 2003-05-27 Frank Koormann <[email protected]>
6946    
6947     Fix legend tree display problems under Win32
6948    
6949     * Thuban/UI/legend.py: BMP_SIZE_W = 15
6950     (LegendTree.__FillTree): Display "legend_icon_map.xpm" with layer title.
6951     (LegendTree.__FillTreeLayer): Explicitely set SelectedImage.
6952    
6953     * Resources/Bitmaps/legend_icon_map.xpm: New icon for legend.
6954    
6955 jan 1048 2003-05-27 Jan-Oliver Wagner <[email protected]>
6956    
6957     * Thuban/UI/menu.py (Menu.InsertSeparator): Additional optional parameter
6958     'after' now allows to insert separators almost anywhere in the menu.
6959    
6960 frank 1046 2003-05-27 Frank Koormann <[email protected]>
6961    
6962     * Thuban/UI/tableview.py (QueryTableFrame.__init__): Underline the
6963     "S" of selection box label to hint on hot key (Alt-S). Works under
6964     Win32 but is ignored under GTK.
6965    
6966     2003-05-26 Frank Koormann <[email protected]>
6967    
6968     * Thuban/UI/projdialog.py (ProjFrame.__do_layout, ProjPanel._DoLayout):
6969     Center Choices.
6970    
6971 bh 1038 2003-05-26 Bernhard Herzog <[email protected]>
6972    
6973 bh 1044 Remove the Precision methods again. They're too DBF specific to be
6974     part of the table interface and they're only used in table_to_dbf
6975     anyway.
6976    
6977     * Thuban/Model/transientdb.py (TransientTableBase.Width):Use a
6978     fixed precision of 12 for doubles.
6979     (TransientTableBase.Precision): Removed
6980     (AutoTransientTable.Width): Delegate to self.table.
6981    
6982     * Thuban/Model/table.py (DBFTable.Precision)
6983     (MemoryTable.Precision): Removed.
6984     (MemoryTable.Width): Use a fixed precision of 12 for doubles.
6985     (table_to_dbf): Use a fixed precision of 12 for floats unless the
6986     column object specifies something else.
6987    
6988     * test/test_dbf_table.py (TestTableToDBF.test_table_to_dbf): New.
6989     test for table_to_dbf
6990    
6991     2003-05-26 Bernhard Herzog <[email protected]>
6992    
6993     * test/test_transientdb.py
6994     (TestTransientTable.run_iceland_political_tests): Fix a comment.
6995    
6996     2003-05-26 Bernhard Herzog <[email protected]>
6997    
6998 bh 1038 * Thuban/UI/mainwindow.py (MainWindow.TableOpen): Real
6999     implementation. Mark parts of the file format strings for
7000     localization.
7001    
7002     * Thuban/Model/session.py (Session.OpenTableFile): New. Open a dbf
7003     file and add the table to the tables managed by the session
7004    
7005 bh 1040 * test/test_session.py (TestSessionSimple.test_open_table_file):
7006     New. test case for OpenTableFile
7007    
7008 jan 1033 2003-05-26 Jan-Oliver Wagner <[email protected]>
7009    
7010 jan 1035 * Thuban/UI/controls.py, Thuban/UI/identifyview.py, Thuban/UI/join.py,
7011     Thuban/UI/labeldialog.py, Thuban/UI/mainwindow.py,
7012     Thuban/UI/proj4dialog.py, Thuban/UI/tableview.py, Thuban/UI/view.py:
7013     Replace the true/false of wxWindows by True/False of Python 2.2.1.
7014    
7015     2003-05-26 Jan-Oliver Wagner <[email protected]>
7016    
7017 bh 1038 * Thuban/UI/tableview.py (LayerTableFrame.__init__): If there is
7018     already a selection present, update the grid accordingly.
7019 jan 1033
7020     * Thuban/UI/mainwindow.py (MainWindow.TableShow): Make the dialog
7021     resizeable and increase its initial size.
7022    
7023 frank 1030 2003-05-26 Frank Koormann <[email protected]>
7024    
7025     Table export functionality
7026    
7027     * Thuban/Model/table.py (DBFTable.Width, MemoryTable.Width):
7028     Return width (in characters) for a column.
7029     (DBFTable.Precision, MemoryTable.Precision): Return decimal precision.
7030     (table_to_dbf): Write table to dbf file.
7031     (table_to_csv): Write table to csv file.
7032    
7033     * Thuban/Model/transientdb.py (TransientTableBase.Width,
7034     TransientTableBase.Precision): Return column width and precision.
7035    
7036     * Thuban/UI/tableview.py (QueryTableFrame.OnSaveAs): Call table_to_dbf
7037     or table_to_csv depending on file selection.
7038    
7039     * test/test_dbf_table.py:
7040     Test table_to_dbf (extension of former part of test).
7041    
7042     * test/test_csv_table.py:
7043     Test table_to_csv.
7044    
7045 jan 1021 2003-05-23 Jan-Oliver Wagner <[email protected]>
7046    
7047 jan 1024 * Thuban/UI/join.py (JoinDialog.OnJoin): Use _() for strings.
7048     Use QueryTableFrame instead of TableFrame.
7049 jan 1021
7050 jan 1024 * Thuban/UI/mainwindow.py (MainWindow.LayerShowTable): Prefix the
7051     table window with 'Layer Table:' instead of 'Table:'.
7052    
7053     2003-05-23 Jan-Oliver Wagner <[email protected]>
7054    
7055     Give all tables a title via mix-in TitledObject.LayerShowTable
7056    
7057 jan 1021 * Thuban/Model/base.py (TitledObject.SetTitle): Call method 'issue'
7058     only if it exists.
7059    
7060     * Thuban/Model/table.py (DBFTable, MemoryTable): mix-in TitledObject
7061     and call its init-method with a default title. Remove Title() method.
7062    
7063     * Thuban/Model/transientdb.py (TransientTable, TransientJoinedTable,
7064     AutoTransientTable): mix-in TitledObject and call its init-method with
7065     a default title. Remove Title() method.
7066    
7067 bh 1017 2003-05-23 Bernhard Herzog <[email protected]>
7068    
7069     * Thuban/Model/session.py (Session.AddShapeStore): Define
7070     AddShapeStore analogously to AddTable.
7071    
7072     * test/test_session.py (TestSessionSimple.test_add_shapestore):
7073     New. Test for AddShapeStore
7074    
7075 jan 1015 2003-05-23 Jan-Oliver Wagner <[email protected]>
7076    
7077     Introducing QueryTableFrame and a very coarse ShowTable implementation.
7078    
7079     * Thuban/UI/tableview.py (LayerTableFrame, QueryTableFrame): Split the
7080     class LayerTableFrame into two classes, LayerTableFrame and QueryTableFrame.
7081     The latter implements the selection GUI without dependency on a layer.
7082     LayerTableFrame now is derived from QueryTableFrame and connects
7083     to a layer.
7084    
7085     * Thuban/UI/mainwindow.py (MainWindow.TableShow): A very coarse
7086     implementation that still needs work.
7087    
7088     * Thuban/Model/layer.py (Layer.TreeInfo): Added filename.
7089    
7090 frank 1011 2003-05-22 Frank Koormann <[email protected]>
7091    
7092     * Thuban/Model/transientdb.py (TransientJoinedTable.__init__):
7093     Added "outer_join = False" as optional parameter.
7094     (TransientJoinedTable.create): If outer join is true, perform a
7095     "LEFT OUTER JOIN" instead of "JOIN", which preserves all records of
7096     the left table. Records not matching are filled with 0 / None.
7097    
7098     * Thuban/UI/join.py (JoinDialog.__init__): Checkbox for outer join.
7099     (JoinDialog.OnJoin): Consider outer join check box.
7100    
7101 bh 1006 2003-05-22 Bernhard Herzog <[email protected]>
7102    
7103 bh 1008 * Thuban/UI/join.py (JoinDialog.OnJoin): Use exc_info in a
7104     somewhat safer way. Storing the traceback in a local variable can
7105     lead to memory leaks
7106    
7107     2003-05-22 Bernhard Herzog <[email protected]>
7108    
7109 bh 1006 * Thuban/UI/join.py (JoinDialog.OnJoin): Make sure to really call
7110     the wxMessageDialog's Destroy() method.
7111    
7112 frank 1004 2003-05-22 Frank Koormann <[email protected]>
7113    
7114     * Thuban/UI/join.py (JoinDialog.__init__): Make use of
7115     TransientTable.Title()
7116    
7117     2003-05-22 Frank Koormann <[email protected]>
7118    
7119     Join Dialog, initial version.
7120    
7121     * Thuban/UI/mainwindow.py (MainWindow.TableJoin): Removed print.
7122    
7123     * Thuban/UI/join.py (JoinDialog): Functional implementation of
7124     former framework. Renamed Table1/Table2 to LeftTable/RightTable
7125     in all occurences.
7126    
7127     * Thuban/Model/transientdb.py (TransientJoinedTable.__doc__):
7128     Typo fixed.
7129    
7130 bh 995 2003-05-22 Bernhard Herzog <[email protected]>
7131    
7132 bh 999 Give the tables titles so that the GUI can display more meaningful
7133     names. For now the titles are fixed but depend on e.g. filenames
7134     or the titles of the joined tables.
7135    
7136     * Thuban/Model/transientdb.py (TransientTable.Title)
7137     (TransientJoinedTable.Title, AutoTransientTable.Title): New.
7138    
7139     * Thuban/Model/table.py (DBFTable.Title, MemoryTable.Title): New.
7140    
7141     * test/test_transientdb.py
7142     (TestTransientTable.test_auto_transient_table_title): New. Test
7143     for the Title method
7144     (TestTransientTable.test_transient_joined_table)
7145     (TestTransientTable.test_transient_table): Add test for the Title
7146     methods
7147    
7148     * test/test_memory_table.py (TestMemoryTable.test_title): New.
7149     Test for the Title method
7150    
7151     * test/test_dbf_table.py (TestDBFTable.test_title): New. Test for
7152     the Title method
7153    
7154     2003-05-22 Bernhard Herzog <[email protected]>
7155    
7156 bh 997 * test/test_layer.py (TestLayer.setUp, TestLayer.tearDown):
7157     Provide a better way to destroy the layers
7158     (TestLayer.test_base_layer, TestLayer.test_arc_layer)
7159     (TestLayer.test_point_layer, TestLayer.test_empty_layer)
7160     (TestLayer.test_polygon_layer, TestLayer.test_get_field_type): Use
7161     the new way to destroy the layers.
7162     (TestLayer.test_derived_store): New. Test for using a layer with a
7163     DerivedShapeStore
7164    
7165     * Thuban/Model/layer.py (Layer.SetShapeStore): Only set the
7166     filename if the shape store actually has one.
7167    
7168     2003-05-22 Bernhard Herzog <[email protected]>
7169    
7170 bh 995 * Thuban/Model/table.py (DBFTable.FileName): New. Accessor method
7171     for the filename
7172    
7173     * test/test_dbf_table.py (TestDBFTable.test_filename): New. Test
7174     for the FileName method
7175     (TestDBFTableWriting.test_write): Fix spelling of filename
7176    
7177 tkoester 993 2003-05-22 Thomas Koester <[email protected]>
7178    
7179     * Thuban/Model/range.py, test/test_range.py: Brought over new Range
7180     from SciParam that now really is immutable.
7181    
7182 frank 992 2003-05-22 Frank Koormann <[email protected]>
7183    
7184     Layer Top/Bottom placement added to legend.
7185    
7186     * Thuban/UI/legend.py
7187     (LegendPanel._OnMoveTop(), LayerPanel._OnMoveBottom): New, methods
7188     bound to tool events.
7189     (LegendTree.MoveCurrentItemTop(), LegendTree.MoveCurrentItemBottom):
7190     New, methods binding the event methods with the map methods.
7191    
7192     * Thuban/Model/map.py (Map.TopLayer(), Map.BottomLayer()): New, place
7193     layer at top/bottom of layer stack.
7194    
7195     * Resources/Bitmaps/top_layer.xpm: New button icon.
7196    
7197     * Resources/Bitmaps/bottom_layer.xpm: New button icon.
7198    
7199 bh 988 2003-05-22 Bernhard Herzog <[email protected]>
7200    
7201     * Thuban/Model/session.py (Session.RemoveTable): New method to
7202     remove tables
7203    
7204     * test/test_session.py (TestSessionSimple.test_remove_table): New.
7205     Test for RemoveTable
7206    
7207 tkoester 986 2003-05-22 Thomas Koester <[email protected]>
7208    
7209     * Thuban/Model/classgen.py: Added short module doc string and CVS id.
7210     (ClassGenerator.GenUniformDistribution): Use new Range __init__, too.
7211    
7212 bh 983 2003-05-22 Bernhard Herzog <[email protected]>
7213    
7214 bh 985 Implement a way to discover dependencies between tables and
7215     shapestores.
7216    
7217     * Thuban/Model/transientdb.py (TransientTableBase.Dependencies)
7218     (TransientJoinedTable.Dependencies)
7219     (AutoTransientTable.SimpleQuery): New. Implement the dependencies
7220     interface
7221     (TransientJoinedTable.__init__): Keep tack of the original table
7222     objects in addition to the corresponding transient tables.
7223    
7224     * Thuban/Model/table.py (DBFTable.Dependencies)
7225     (MemoryTable.Dependencies): New. Implement the dependencies
7226     interface
7227    
7228     * Thuban/Model/data.py (ShapeTable): New. Helper class for
7229     ShapefileStore
7230     (ShapefileStore.__init__): Use ShapeTable instead of
7231     AutoTransientTable
7232     (ShapefileStore.Table, ShapefileStore.Shapefile): Add doc-strings
7233     (ShapefileStore.FileName, ShapefileStore.FileType): New. Accessor
7234     methods for filename and type
7235     (ShapefileStore.Dependencies): New. Implement the dependencies
7236     interface
7237     (DerivedShapeStore): New class to replace SimpleStore. The main
7238     difference to SimpleStore is that it depends not on a shapefile
7239     but another shapestore which expresses the dependencies a bit
7240     better
7241     (SimpleStore.__init__): Add deprecation warning.
7242    
7243     * test/test_dbf_table.py (TestDBFTable.test_dependencies): New.
7244     Test for the Dependencies method.
7245    
7246     * test/test_memory_table.py (TestMemoryTable.test_dependencies):
7247     New. Test for the Dependencies method.
7248    
7249     * test/test_transientdb.py
7250     (TestTransientTable.test_auto_transient_table_dependencies): New.
7251     Test for the Dependencies method.
7252     (TestTransientTable.test_transient_joined_table): Add test for the
7253     Dependencies method.
7254    
7255     * test/test_session.py (TestSessionSimple.setUp)
7256     (TestSessionSimple.tearDown): New. Implement a better way to
7257     destroy the sessions.
7258     (TestSessionSimple.test_initial_state)
7259     (TestSessionSimple.test_add_table): Bind session to self.session
7260     so that it's destroyed by tearDown
7261     (TestSessionSimple.test_open_shapefile): New. Test for
7262     OpenShapefile and the object it returns
7263    
7264     2003-05-22 Bernhard Herzog <[email protected]>
7265    
7266 bh 983 * Thuban/Model/session.py (Session.AddTable): New method to
7267     register tables with the session.
7268     (Session.Tables): Return the tables registered with AddTable too.
7269    
7270     * test/test_session.py (TestSessionSimple.test_add_table): New.
7271     Test case for the AddTable method
7272    
7273 frank 981 2003-05-22 Frank Koormann <[email protected]>
7274    
7275     UI polishing updates: Place main buttons (OK, Cancel, etc) in the
7276     lower right corner, center labels for selections, initialize controls
7277     in reasonable order for keyboard navigation.
7278    
7279     * Thuban/UI/projdialog.py (ProjFrame.__init__, ProjFrame.__doLayout)
7280     (ProjFrame.__DoOnProjAvail): Determine position of current projection
7281     using the wxListBox.FindString() method. Still a problem (#1886)
7282    
7283     * Thuban/UI/classifier.py
7284     (Classifier.__init__, SelectPropertiesDialog.__init__)
7285    
7286     * Thuban/UI/classgen.py (ClassGenDialog.__init__,
7287     (ClassGenDialog.__DoOnGenTypeSelect): Moved initialization of the
7288     different classification types from here to __init__.
7289     (GenUniquePanel.__init__): Set the column width of the first field
7290     in the Field ListCtrl to the full width.
7291    
7292     * Thuban/UI/tableview.py (LayerTableFrame.__init__): Rename 'Save As'
7293     Button to 'Export'. Center Buttons in Selection Box, set Focus to
7294     Grid.
7295     (LayerTableFrame.OnKeyDown()): New, bound to the grid with EVT_KEY_DOWN,
7296     changes focus to the Selection when pressing "Alt-S".
7297    
7298     * Thuban/UI/legend.py (LegendTree.__SetVisibilityStyle): Only gray out
7299     the text if not visible. The italic font sometimes exceeds the
7300     rendering area.
7301    
7302 jonathan 972 2003-05-21 Jonathan Coles <[email protected]>
7303 jonathan 971
7304 jonathan 975 * Thuban/UI/dock.py (DockFrame): Rename references to _OnClose
7305     to OnClose so that Thuban closes correctly.
7306    
7307     * Thuban/UI/mainwindow.py (MainWindow.OnClose): Call
7308     DockFrame.OnClose, not DockFrame._OnClose.
7309    
7310     2003-05-21 Jonathan Coles <[email protected]>
7311    
7312 jonathan 971 * Thuban/Model/classgen.py (ClassGenerator.GenQuantiles): Remove
7313     references to 'inf' and use new Range __init__ to pass floats
7314     directly rather than converting them to strings first.
7315     Fixes RTBug #1876.
7316    
7317     * Thuban/Model/classification.py (ClassGroupRange.SetRange):
7318     Use new Range ___init__ to pass floats.
7319    
7320     * Thuban/Model/layer.py (RasterLayer.__init__): Test if the
7321     filename is a valid image file. Throw IOError otherwise.
7322    
7323     * Thuban/Model/range.py: Brought over new Range from SciParam that
7324     is immutable and has an __init__ which can accept floats.
7325    
7326     * Thuban/UI/mainwindow.py (MainWindow.AddLayer): Move OpenShapefile
7327     into try block. AddLayer doesn't throw any exceptions anymore.
7328     (MainWindow.AddRasterLayer): Move constructor of RasterLayer into
7329     try block.
7330    
7331     * Thuban/UI/projdialog.py (GeoPanel.__init__): Put Degrees as
7332     the first item in choices. Fixes RTBug #1882.
7333    
7334     * Thuban/UI/renderer.py (MapRenderer.render_map): Check if scale
7335     has gone to 0 which is a serious problem. abort.
7336     (MapRenderer.draw_raster_layer): Catch IOError seperately and
7337     print the error from GDAL.
7338    
7339     * Thuban/UI/tableview.py (TableGrid.__init__): Call
7340     ToggleEventListeners to turn on listening.
7341     (TableGrid.ToggleEventListeners): New. Turns event listening on
7342     and off so as to prevent excessive messages.
7343     (LayerTableFrame.OnQuery): Use TableGrid.ToggleEventListeners
7344     to suppress excessive messages when selecting many rows.
7345     Fixes RTBug #1880.
7346    
7347     * Thuban/UI/view.py: Added checks against if scale == 0. This
7348     is a serious problem that can occur when an image without
7349     geo data is loading and causes the map projection bounds to
7350     go to infinity. Right now, the solution is to simply try
7351     to recover.
7352    
7353     * extensions/thuban/cpl_mfile.cpp (MFILEClose): Make sure
7354     to set the MFILEReceiver attributes even if the data is NULL.
7355    
7356     * extensions/thuban/gdalwarp.cpp: Improved the error handling
7357     and passed GDAL messages back up to the Python layer. Also
7358     tried to fix some memory leaks that were present in the original
7359     utility but didn't matter because the program aborted.
7360    
7361     * test/test_range.py: Copied over tests from SciParam. Removed
7362     tests against importing. Fixes RTBug #1867.
7363    
7364 bh 958 2003-05-21 Bernhard Herzog <[email protected]>
7365    
7366     * test/test_load.py: Remove unused imports and restructure the
7367     test code
7368     (LoadSessionTest): Split into one class for each test and turn
7369     LoadSessionTest itself into the base class for all such session
7370     tests.
7371     (ClassificationTest): New base class for load tests that test
7372     classifications
7373     (TestSingleLayer, TestLayerVisibility, TestClassification)
7374     (TestLabels, TestLayerProjection, TestRasterLayer): New classes
7375     for the individual tests
7376    
7377     * test/support.py (FileLoadTestCase.filename): New base class for
7378     file loading tests
7379    
7380 jan 955 2003-05-21 Jan-Oliver Wagner <[email protected]>
7381    
7382     * Resources/Projections/defaults.proj: Renamed 'Universal Transverse
7383     Mercator' to 'UTM Zone 32' as a more convenient example.
7384     Added 'Gauss Krueger Zone 6'.
7385    
7386     * Data/iceland_sample_raster.thuban: political polygon now
7387     filled transparent to have the raster image visible at once.
7388    
7389 frank 952 2003-05-21 Frank Koormann <[email protected]>
7390    
7391     * Thuban/UI/mainwindow.py (MainWindow): Renamed _OnClose() back to
7392     OnClose() to keep in sync with extensions. Internally Thuban
7393     still uses "underscored" names.
7394    
7395 jonathan 949 2003-05-20 Jonathan Coles <[email protected]>
7396    
7397     This puts back Raster layer support. These layers support projections
7398     through the GDAL library. Currently, the CVS version is being used.
7399     There are no Debian packages available although this may change soon.
7400     A GDAL driver was extended to support writing to memory rather to
7401     files.
7402    
7403     There is still some work that needs to be done, such as some error
7404     handling when loading invalid images or when there is a problem
7405     projecting the image. This putback simply checks in the majority
7406     of the work.
7407    
7408     * setup.py: Add gdalwarp library extension.
7409    
7410     * Thuban/Model/layer.py (BaseLayer.HasClassification): New.
7411     Defaults to False, but can be overridden by subclasses if they
7412     support classification.
7413     (RasterLayer): New. Defines a new layer that represents an
7414     image.
7415    
7416     * Thuban/Model/load.py (SessionLoader.__init__): Add rasterlayer
7417     tag handler.
7418     (SessionLoader.start_layer): Encode the filename.
7419     (SessionLoader.start_rasterlayer, SessionLoader.end_rasterlayer):
7420     New. Supports reading a rasterlayer tag.
7421    
7422     * Thuban/Model/map.py (Map.BoundingBox): Fix typo in comment.
7423    
7424     * Thuban/Model/save.py (XMLWriter.encode): Don't assume that we
7425     get a string in Latin1. If we get such as string convert it to
7426     unicode first, otherwise leave if alone before encoding.
7427     (SessionSaver.write_layer): Add support for writing both Layers
7428     and RasterLayers.
7429    
7430     * Thuban/Model/transientdb.py (AutoTransientTable.SimpleQuery):
7431     The right argument may not be a string, it could also be a Column.
7432    
7433     * Thuban/UI/application.py (ThubanApplication.CreateMainWindow):
7434     Make initial window size 600x400. Fixes RTBug #1872.
7435    
7436     * Thuban/UI/classifier.py (Classifier.__init__): Rearrange how
7437     the dialog is constructed so that we can support layers that
7438     do not have classifications.
7439     (Classifier._OnTry): Only build a classification if the layer
7440     supports one.
7441    
7442     * Thuban/UI/legend.py: Change all checks that a layer is an
7443     instance of Layer into checks against BaseLayer.
7444     (LegendTree.__FillTreeLayer): Only add children to a branch if
7445     the layer supports classification.
7446    
7447     * Thuban/UI/mainwindow.py (MainWindow.NewSession,
7448     MainWindow.OpenSession): Don't proceed with an action if the
7449     user chooses Cancel when they are asked to save changes.
7450     (MainWindow.AddRasterLayer): New. Open a dialog to allow the
7451     user to select an image file. Create a new RasterLayer and add
7452     it to the map.
7453    
7454     * Thuban/UI/renderer.py (MapRenderer.render_map): Add support
7455     for rendering RasterLayer layers.
7456     (MapRenderer.draw_raster_layer): Actually method that calls
7457     the GDALWarp python wrapper and constructs an image from the
7458     data returned.
7459    
7460     * Thuban/UI/tableview.py (LayerTableFrame.__init__): Change the
7461     Choices symbols to match those used in the table query method.
7462     Replace deprecated method calls on table with new method names.
7463    
7464     * Thuban/UI/view.py (MapCanvas.set_view_transform): Try to limit
7465     how small the scale can get. This still needs more testing.
7466    
7467     * extensions/thuban/bmpdataset.cpp: New, but copied from GDAL.
7468     Provides a driver to output in .bmp format.
7469    
7470     * extensions/thuban/cpl_mfile.cpp, extensions/thuban/cpl_mfile.h:
7471     New. Provides IO routines which write to memory, rather than a file.
7472    
7473     * extensions/thuban/gdalwarp.cpp: New, but basically a direct copy
7474     of the gdalwarp utility provided in GDAL. Added function calls
7475     that can be accessed from python.
7476    
7477     * Data/iceland_sample_raster.thuban: New. Sample file that uses
7478     a raster layer.
7479    
7480     * Data/iceland/island.tfw, Data/iceland/island.tif: New. Raster
7481     layer image data.
7482    
7483     * Doc/thuban.dtd: Added rasterlayer attribute definition.
7484    
7485     * test/test_layer.py, test/test_load.py, test/test_save.py: Added
7486     tests associated with the raster layer code.
7487    
7488     * test/test_transientdb.py
7489     (TestTransientTable.test_auto_transient_table_query): Added a test
7490     for using a Column object as the "right" parameter to a query.
7491    
7492 frank 924 2003-05-19 Frank Koormann <[email protected]>
7493    
7494 frank 927 * Thuban/version.py (get_changelog_date):
7495     Catch exceptions if ChangeLog does not exist.
7496    
7497     * Thuban/UI/view.py (MapCanvas.Export): Bugfix
7498    
7499     2003-05-19 Frank Koormann <[email protected]>
7500    
7501 frank 924 Extended version information for Thuban
7502    
7503     * Thuban/version.py: New, version information for Thuban: Last
7504     modification date and last ChangeLog entry date.
7505    
7506     * Thuban/UI/mainwindow.py (MainWindow.About()): Extended version
7507     information: Display Thuban, wxPython and Python version.
7508    
7509 bh 919 2003-05-16 Bernhard Herzog <[email protected]>
7510    
7511 bh 921 * Thuban/Model/save.py: Remove some unused imports including the
7512     __future__ import for nested_scopes as Thuban relies on Python 2.2
7513     now.
7514     (XMLWriter.encode): Remove the special case for a None argument.
7515     In the saver encode is always called with a string argument.
7516    
7517     2003-05-16 Bernhard Herzog <[email protected]>
7518    
7519 bh 919 * Thuban/UI/__init__.py: Remove the work-around for the locale bug
7520     in wxPython (at least when usinvg wxGTK) prior to 2.4. The symptom
7521     of the bug was that e.g. float("1.2") would fail. Thuban now
7522     requires 2.4.x.
7523    
7524 frank 917 2003-05-16 Frank Koormann <[email protected]>
7525    
7526     Printing enhancement and WMF export (under Win32)
7527    
7528     * Thuban/UI/renderer.py (ExportRenderer): New, derived from
7529     ScreenRenderer. Renders Map, Legend and Scalebar for export.
7530     (PrinterRenderer): New, derived from ExportRenderer. Replaces the old
7531     PrintRender.
7532    
7533     * Thuban/UI/view.py (MapPrintout.__init__): Enhanced parameter set
7534     to fullfil information needed for PrinterRenderer.
7535     (MapCanvas.Export): New. Export Map (currently only to WMF on Win32).
7536     (MapCanvas.Print): Adapted to new MapPrintout.
7537     (OutputTransform): General calculations to transform from canvas
7538     coordinates to export/printing devices.
7539    
7540     * Thuban/UI/mainwindow.py (MainWindow.ExportMap()): New. Added also
7541     new method_command to call ExportMap, with platform dependency (only
7542     __WXMSW__)
7543    
7544     * Thuban/UI/scalebar.py (ScaleBar.DrawScaleBar): Position and Size
7545     of scalebar drawing area as new parameters.
7546    
7547     * Thuban/Model/scalebar.py (roundInterval): round long instead of int
7548    
7549     * Thuban/UI/legend.py (ScalebarBitmap.__SetScale):
7550     Update to extended scalebar.DrawScalebar header.
7551    
7552     * test/test_export.py: New, test Thuban.UI.view.OutputTransform()
7553    
7554     * test/test_scalebar.py: Made test executable as standalone.
7555    
7556 bh 908 2003-05-16 Bernhard Herzog <[email protected]>
7557    
7558     * Thuban/Model/table.py (Table): Remove this compatibility alias
7559     for DBFTable.
7560    
7561     * test/test_table.py: Import DBFTable as Table because that alias
7562     doesn't exist anymore.
7563    
7564     * Thuban/UI/classgen.py: Remove some unused imports
7565    
7566 jonathan 906 2003-05-14 Jonathan Coles <[email protected]>
7567    
7568     * Thuban/Model/classgen.py (ClassGenerator.GenSingletonsFromList):
7569     Fix docstring.
7570     (ClassGenerator.GenUniformDistribution): Fix spelling of method name.
7571     (ClassGenerator.GenQuantiles): Use the left/right brackets and min/max
7572     values of the supplied range to determine the beginning and end
7573     bounds of the generated classes.
7574    
7575     * Thuban/Model/range.py (Range.number_re): Now accepts floats that
7576     do not have a leading 0 (.5 is now accepted as well as 0.5).
7577    
7578     * Thuban/UI/classgen.py (ClassGenDialog.OnOK): Fix name of method
7579     call to ClassGenerator.GenUniformDistribution.
7580    
7581     * Thuban/UI/projdialog.py (ProjFrame.__do_layout): Fix Windows
7582     layout bug with the 'Projection' label.
7583    
7584     * test/support.py (FloatTestCase): New. Needed for the Range tests.
7585    
7586     * test/test_range.py: New. Imported from SciParam.
7587    
7588 jonathan 897 2003-05-12 Jonathan Coles <[email protected]>
7589    
7590 jonathan 899 * Thuban/UI/classgen.py (GenQuantilesPanel.GetList): Replace call
7591     to table.UniqueValues() with calls that retrieve all the values
7592     from the table. This will need to be replaced by a method on table
7593     which can simply return the list (perhaps more efficiently).
7594    
7595     2003-05-12 Jonathan Coles <[email protected]>
7596    
7597 jonathan 897 The return value of ClassGenerator.CalculateQuantiles has changed.
7598     Refer to the documentation for details.
7599    
7600     * test/test_classgen.py: Modified Quantile tests to use the
7601     new return values.
7602    
7603     * Thuban/Model/classgen.py
7604     (ClassGenerator.GenQuantiles): Add comments describing the parameters,
7605     use new return values from CalculateQuantiles to produce the correct
7606     range bounds in the Classification.
7607     (ClassGenerator.CalculateQuantiles): Add more comments describing
7608     the return values and parameters. Make minor adjustments to improve
7609     the legibility of the code. Fix problem with adjusted not being set
7610     in most cases.
7611    
7612 frank 893 2003-05-12 Frank Koormann <[email protected]>
7613    
7614     * Thuban/Model/save.py (XMLWriter.encode()): Explicite call to unicode
7615     and latin1. Fixes #1851 finally.
7616    
7617 jonathan 889 2003-05-09 Jonathan Coles <[email protected]>
7618    
7619 jonathan 897 * test/test_classgen.py: New. Tests the Quantile algorithm.
7620    
7621     * Thuban/Model/classgen.py (ClassGenerator.CalculateQuantiles):
7622     Clean up debugging statement, add comments, fix a small bug in the
7623     returned adjusted percentiles.
7624    
7625     2003-05-09 Jonathan Coles <[email protected]>
7626    
7627 jonathan 889 Introduces Range class from SciParam into the ClassGroupRange class,
7628     and such ranges can now be saved and loaded from disk.
7629    
7630     Quantiles are now available in the Classification Generator.
7631    
7632     Initial support for building Queries on a table. Doesn't do anything
7633     but run some tests.
7634    
7635     * Thuban/Model/classification.py: Explicit imports.
7636     (ClassGroupRange): Use the Range class to store the underlying
7637     range information. The interface remains the same, except for
7638     GetRange(), and you can also supply a Range object as the min
7639     parameter to SetRange or __init__.
7640    
7641     * Thuban/Model/load.py (XMLReader.encode): New. Encodes the given
7642     string appropriately for use in Thuban. Fixes RTbug #1851.
7643     (SessionLoader.end_projection): Handle the context of the
7644     projection tag a bit better by looking at what objects are not
7645     None. There was an assumption that a projection tag for a map
7646     could occur before any layers.
7647     (SessionLoader.start_clrange): Provide backward compatibility for
7648     reading min/max values as well as the new range parameter.
7649    
7650     * Thuban/Model/map.py: Explicit imports.
7651    
7652     * Thuban/Model/resource.py: Import _.
7653     (ProjFileSaver.write): write header using projfile.dtd.
7654    
7655     * Thuban/Model/save.py: Explicit imports.
7656     (XMLWriter.encode): New. Encode the given string from a format
7657     used by Thuban into UTF-8. Fixes RTbug #1851.
7658    
7659     * Thuban/UI/classgen.py: Explicit imports.
7660     (ClassGenDialog.__init__): Clean up the code and add support
7661     for Quantiles.
7662     (ClassGenDialog.OnOK): Add support for Quantiles.
7663     (GenQuantilesPanel): New. Input panel for Quantiles.
7664     (ClassGenerator, CustomRamp, MonochromaticRamp, GreyRamp, RedRamp,
7665     GreenRamp, BlueRamp, HotToColdRamp): Move to Thuban/Model/classgen.py
7666    
7667     * Thuban/Model/classgen.py: New. Contains all the classes named above.
7668    
7669     * Thuban/UI/classifier.py: Explicit imports.
7670     (ClassTable.GetValueAsCust, ClassTable.__ParseInput,
7671     ClassTable.SetValueAsCustom): Reworked to use new Range class.
7672    
7673     * Thuban/UI/legend.py: Explicit imports.
7674    
7675     * Thuban/UI/mainwindow.py: Add support for the Join Dialog. Added
7676     a Table menu and associated method calls.
7677     (MainWindow.choose_color): Removed. No longer needed.
7678    
7679     * Thuban/UI/projdialog.py (ProjFrame.__VerifyButtons): Save button
7680     should be disabled if no projection is selected in the available
7681     list.
7682    
7683     * Thuban/UI/renderer.py: Explicit imports.
7684    
7685     * Thuban/UI/tableview.py (TableGrid.OnRangeSelect): Fix some issues
7686     with correctly selecting the rows and issuing the right events.
7687     Be sure to call Skip() to allow the grid to do some of its own
7688     handling which allows the rows to actually be selected.
7689     (LayerTableGrid.select_shapes): Rename from select_shape. Supports
7690     selecting multiple shapes.
7691     (LayerTableFrame): Support for building Queries.
7692     (LayerTableFrame.select_shapes): Allow multiple shapes to be selected.
7693    
7694     * Thuban/UI/tree.py: Explicit imports.
7695    
7696     * Thuban/UI/view.py (MapCanvas): Delegate "SelectedShapes" so the
7697     table view can call it.
7698    
7699     * test/test_classification.py: Explicit imports.
7700     (TestClassification.test_ClassGroupRange): Fix test for new
7701     Range class.
7702    
7703     * Doc/thuban.dtd: Add range parameter for clrange.
7704    
7705     * Thuban/Model/range.py: Taken from SciParam. Used as the underlying
7706     object in ClassGroupRange, and also uesd for inputting ranges in
7707     the classifer table and elsewhere.
7708    
7709     * Thuban/UI/join.py: New. Initial Join dialog. No real functionality
7710     yet.
7711    
7712 frank 872 2003-05-09 Frank Koormann <[email protected]>
7713    
7714     * Thuban/UI/scalebar.py (DrawScaleBar): Draw only if interval > 0.0.
7715    
7716 frank 860 2003-05-08 Frank Koormann <[email protected]>
7717    
7718 frank 870 Coding style updates
7719    
7720     * test/test_scalebar.py: Replaced tab indentation by spaces.
7721    
7722     * Thuban/UI/scalebar.py: Explicit imports.
7723    
7724     2003-05-08 Frank Koormann <[email protected]>
7725    
7726 frank 867 * Thuban/UI/scalebar.py
7727     (ScaleBar.DrawScalebar): Format string bug fixed.
7728    
7729     2003-05-08 Frank Koormann <[email protected]>
7730    
7731 frank 865 Reorganization of scalebar component (no wx in Thuban/Model)
7732    
7733     * Thuban/Model/scalebar.py: Rendering moved to Thuban/UI/scalebar.py
7734     (deriveInterval):
7735     Calculate scalebar interval and unit which fits in width for scale.
7736     (roundInterval): Round float.
7737    
7738     * Thuban/UI/scalebar.py (ScaleBar): Scalebar rendering
7739    
7740     * test/test_scalebar.py: Test for Thuban/Model/scalebar.py methods.
7741    
7742     * Thuban/UI/legend.py: Import Thuban.UI.scalebar
7743    
7744     2003-05-08 Frank Koormann <[email protected]>
7745    
7746 frank 860 * Thuban/UI/legend.py (ScalebarBitmap.SetCanvas):
7747     Initialize ScaleBar with canvas.map
7748    
7749     * Thuban/Model/scalebar.py (ScaleBar.roundInterval()): New,
7750     round intervals to display smarter lengths
7751     (ScaleBar.DrawScalebar): Draw Scalebar only if the map contains a
7752     layer. If the maps has no projection applied grey the scalebar.
7753    
7754 frank 857 2003-05-07 Frank Koormann <[email protected]>
7755    
7756     Basic Scalebar features added.
7757    
7758     * Thuban/Model/scalebar.py (ScaleBar): New, scalebar rendering.
7759    
7760     * Thuban/UI/legend.py (LegendPanel): Added scalebar bitmap
7761     (ScaleBarBitmap): New, links the scalebar bitmap with view messages
7762     and the renderer.
7763    
7764     * Thuban/UI/view.py (MapCanvas.set_view_transform): Issue SCALE_CHANGED.
7765    
7766     * Thuban/UI/messages.py: SCALE_CHANGED added.
7767    
7768 bh 850 2003-05-07 Bernhard Herzog <[email protected]>
7769    
7770 bh 852 * Thuban/Model/session.py (Session.__init__): New instance
7771     variable shapestores to hold a list of all open shapestore objects
7772     (Session.ShapeStores): New. Accessor method for the shapestores
7773     list.
7774     (Session._add_shapestore, Session._clean_weak_store_refs): New.
7775     Internal methods to maintain the shapestores list.
7776     (Session.Tables): New. Return all tables open in the session.
7777     (Session.OpenShapefile): Insert the new ShapeStore into the
7778     shapestores list.
7779    
7780     * test/test_session.py (TestSessionSimple.test_initial_state): Add
7781     tests for ShapeStores and Tables
7782     (TestSessionWithContent.test_shape_stores)
7783     (TestSessionWithContent.test_tables): New. Test cases for
7784     ShapeStores and Tables
7785    
7786     2003-05-07 Bernhard Herzog <[email protected]>
7787    
7788 bh 850 * Thuban/Model/transientdb.py (TransientTableBase.ReadRowAsDict):
7789     Add comments about the optimizations used.
7790     (AutoTransientTable.ReadValue, TransientTableBase.ReadValue): New.
7791     Implement the ReadValue table interface method.
7792    
7793     * test/test_transientdb.py
7794     (TestTransientTable.run_iceland_political_tests)
7795     (TestTransientTable.test_transient_joined_table): Add tests for
7796     ReadValue
7797    
7798 frank 848 2003-05-07 Frank Koormann <[email protected]>
7799    
7800     * Resources/Bitmaps/fulllayerextent.xpm,
7801     Resources/Bitmaps/fullselextent.xpm: Replaced the place holders with
7802     new icons.
7803    
7804 bh 840 2003-05-06 Bernhard Herzog <[email protected]>
7805    
7806 bh 846 * Thuban/Model/transientdb.py (AutoTransientTable.SimpleQuery):
7807     New. Simply delegate to the transient table's version.
7808    
7809     * test/test_transientdb.py
7810     (TestTransientTable.test_auto_transient_table_query): New. Test
7811     case for AutoTransientTable's SimpleQuery
7812    
7813     2003-05-06 Bernhard Herzog <[email protected]>
7814    
7815 bh 843 * Thuban/Model/transientdb.py (TransientTableBase.SimpleQuery):
7816     Implement a simple query method for the query dialog
7817     (TransientTableBase.create): Add an INTEGER PRIMARY KEY that holds
7818     the row index or shapeid.
7819     (TransientTable.create): Insert the right value of the row index
7820     (TransientJoinedTable.create): Copy the row index of the left
7821     table to the joined result table
7822    
7823     * test/test_transientdb.py
7824     (TestTransientTable.test_transient_table_read_twice): Fix
7825     doc-string
7826     (TestTransientTable.test_transient_table_query): New. Test for the
7827     SimpleQuery method
7828    
7829     2003-05-06 Bernhard Herzog <[email protected]>
7830    
7831 bh 840 Convert all table users to use the new table interface. This only
7832     covers Thuban itself, not GREAT-ER or other applications built on
7833     Thuban yet, so the compatibility interface stays in place for the
7834     time being but it now issues DeprecationWarnings.
7835    
7836     Finally, the new Table interface has a new method, HasColumn.
7837    
7838     * Thuban/Model/table.py (OldTableInterfaceMixin): All methods
7839     issue deprecation warnings when they're. The warnings refer to the
7840     caller of the method.
7841     (OldTableInterfaceMixin.__deprecation_warning): New. Helper method
7842     for the deprecation warnings
7843    
7844     * test/test_table.py: Ignore the deprecation warnings for the old
7845     table in the tests in this module. The purpose of the tests is to
7846     test the old interface, after all.
7847    
7848     * test/test_transientdb.py
7849     (TestTransientTable.run_iceland_political_tests): Use the
7850     constants for the types. Add a test for HasColumn
7851     (TestTransientTable.test_transient_joined_table): Adapt to new
7852     table interface. Add a test for HasColumn
7853     (TestTransientTable.test_transient_table_read_twice): Adapt to new
7854     table interface
7855    
7856     * Thuban/UI/tableview.py (DataTable.SetTable, DataTable.GetValue):
7857     Adapt to new table interface
7858    
7859     * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Adapt to
7860     new table interface
7861    
7862     * Thuban/UI/controls.py (RecordListCtrl.fill_list)
7863     (RecordTable.SetTable): Adapt to new table interface
7864    
7865     * Thuban/UI/classifier.py (Classifier.__init__)
7866     (Classifier.__init__): Adapt to new table interface
7867    
7868     * Thuban/UI/classgen.py (ClassGenDialog.__init__)
7869     (GenUniformPanel._OnRetrieve, GenUniquePanel._OnRetrieve): Adapt
7870     to new table interface
7871    
7872     * Thuban/Model/transientdb.py (TransientTableBase.HasColumn)
7873     (AutoTransientTable.HasColumn): Implement the new table interface
7874     method
7875     (AutoTransientTable.ReadRowAsDict, AutoTransientTable.ValueRange)
7876     (AutoTransientTable.UniqueValues): Adapt to new table interface
7877    
7878     * Thuban/Model/layer.py (Layer.SetShapeStore, Layer.GetFieldType):
7879     Adapt to new table interface
7880    
7881     * test/test_layer.py (TestLayer.open_shapefile): Helper method to
7882     simplify opening shapefiles a bit easier.
7883     (TestLayer.test_arc_layer, TestLayer.test_polygon_layer)
7884     (TestLayer.test_point_layer): Use the new helper method
7885     (TestLayer.test_get_field_type): New. Test for the GetFieldType
7886     method
7887    
7888     * test/test_dbf_table.py (TestDBFTable.test_has_column): Test for
7889     the new table method
7890    
7891     * test/test_memory_table.py (TestMemoryTable.test_has_column):
7892     Test for the new table method HasColumn
7893    
7894 jonathan 833 2003-05-06 Jonathan Coles <[email protected]>
7895    
7896     Addresses the "Selection Extent" wish of RTbug #1787.
7897    
7898     * Resources/Bitmaps/fulllayerextent.xpm,
7899     Resources/Bitmaps/fullselextent.xpm: Bitmaps for layer and selection
7900     extent. These are just place holders for the real bitmaps.
7901    
7902     * Thuban/Model/layer.py (Shape): Since a Shape is immutable only
7903     calculate the bounding box once (the first time compute_bbox() is
7904     called).
7905     (Layer.ShapesBoundingBox): New. Given a list of shape ids, return
7906     the bounding box for the shapes in lat/long coordinates.
7907    
7908     * Thuban/UI/mainwindow.py: Added new "Full selection extent" menu
7909     option.
7910     (MainWindow.has_selected_shapes): New. Returns true if there are
7911     any selected shapes.
7912     (MainWindow.FullSelectionExtent): New. Calls
7913     MapCanvas.FitSelectedToWindow() when the user selects the menu option.
7914     (_has_selected_shapes): New. Returns true if there are any
7915     selected shapes.
7916    
7917     * Thuban/UI/selection.py (Selection.HasSelectedShapes): New. Returns
7918     true if there are any selected shapes.
7919    
7920     * Thuban/UI/view.py (MapCanvas): Added delegated method
7921     HasSelectedShapes.
7922     (MapCanvas.FitSelectedToWindow): New. Centers and scales any selected
7923     shapes on the canvas using the map projection (if any).
7924    
7925     * test/test_layer.py (TestLayer.test_arc_layer): Add some tests
7926     for Layer.ShapesBoundingBox().
7927    
7928 bh 826 2003-05-06 Bernhard Herzog <[email protected]>
7929    
7930     * Resources/Projections/defaults.proj: Fix spelling of Mercator
7931    
7932 jonathan 823 2003-05-05 Jonathan Coles <[email protected]>
7933    
7934     Addresses the "Full Layer Extent" wish of RTbug #1787.
7935    
7936     * Resources/Projections/defaults.proj: Added UK National Grid.
7937    
7938     * Thuban/UI/mainwindow.py: Added new "Full layer extent" menu option.
7939     (MainWindow.FullLayerExtent): New. Calls MapCanvas.FitLayerToWindow()
7940     when the user selects the menu option.
7941    
7942     * Thuban/UI/view.py (MapCanvas.FitLayerToWindow): New. Centers and
7943     scales the given layer on the canvas using the map projection.
7944    
7945 bh 819 2003-05-05 Bernhard Herzog <[email protected]>
7946    
7947     Convert the table implementations to a new table interface. All
7948     tables use a common mixin class to provide backwards compatibility
7949     until all table users have been updated.
7950    
7951     * Thuban/Model/table.py (OldTableInterfaceMixin): Mixin class to
7952     provide backwards compatibility for table classes implementing the
7953     new interface
7954     (DBFTable, MemoryTable): Implement the new table interface. Use
7955     OldTableInterfaceMixin as base for compatibility
7956     (DBFColumn, MemoryColumn): New. Column description for DBFTable
7957     and MemoryTable resp.
7958    
7959     * test/test_dbf_table.py: New. Test cases for the DBFTable with
7960     the new table interface.
7961    
7962     * test/test_memory_table.py: New. Test cases for the MemoryTable
7963     with the new table interface.
7964    
7965     * test/test_table.py: Document the all tests in this file as only
7966     for backwards compatibility. The equivalent tests for the new
7967     interface are in test_memory_table.py and test_dbf_table.py
7968     (MemoryTableTest.test_read): field_info should be returning tuples
7969     with four items
7970     (MemoryTableTest.test_write): Make doc-string a more precise.
7971    
7972     * Thuban/Model/transientdb.py (TransientTableBase): Convert to new
7973     table interface. Derive from from OldTableInterfaceMixin for
7974     compatibility.
7975     (TransientTableBase.create): New intance variable column_map to
7976     map from names and indices to column objects
7977     (TransientTable.create): Use the new table interface of the input
7978     table
7979     (AutoTransientTable): Convert to new table interface. Derive from
7980     from OldTableInterfaceMixin for compatibility.
7981     (AutoTransientTable.write_record): Removed. It's not implemented
7982     yet and we still have to decide how to handle writing with the new
7983     table and data framework.
7984    
7985     * test/test_transientdb.py
7986     (TestTransientTable.run_iceland_political_tests)
7987     (TestTransientTable.test_transient_joined_table): Use the new
7988     table interface
7989    
7990 jonathan 817 2003-05-05 Jonathan Coles <[email protected]>
7991    
7992     This is namely a collection of UI updates to improve user interactivity.
7993     Tabbing between controls now exists and you can use ESC to close dialog
7994     boxes; ENTER will active the default button.
7995    
7996     * Thuban/UI/classgen.py (ClassGenDialog.__init__): Rearrange the
7997     order that the controls are created so that tabbing works correctly.
7998     (ClassGenDialog.OnOK): Renamed from _OnGenerate() so that the
7999     wxDialog can handle the default button correctly.
8000     (ClassGenDialog.OnCancel): Renamed from _OnCloseBtn() for the
8001     same reasons as for OnOK.
8002     (GenUniformPanel._OnRetrieve): Call wxBeginBusyCursor/wxEndBusyCursor
8003     when we ask the table for the maximum/minimum values of a field
8004     which could take a very long time.
8005    
8006     * Thuban/UI/classifier.py (Classifier.__init__): Rearrange the
8007     order that the controls are created so that tabbing works correctly.
8008     (SelectPropertiesDialog.__init__): Rearrange the order that the
8009     controls are created so that tabbing works correctly.
8010    
8011     * Thuban/UI/dialogs.py: Copied NonModalDialog box and changed it
8012     to derive from a wxDialog but behave like the original implementation
8013     which was derived from a wxFrame. wxDialog provides useful key
8014     handling functionality like ESC calling OnCancel and ENTER calling
8015     OnOK which is lost with wxFrame.
8016    
8017     * Thuban/UI/mainwindow.py: Add "..." to menu items that will open
8018     new dialogs.
8019    
8020     * Thuban/UI/projdialog.py (ProjFrame.__init__): Rearrange the
8021     order that the controls are created so that tabbing works correctly.
8022     (ProjFrame.OnApply): Renamed from _OnTry() to use wxDialog behaviour.
8023     (ProjFrame.OnOK): Renamed from _OnOK() to use wxDialog behaviour.
8024     (ProjFrame.OnCancel): Renamed from _OnClose() to use wxDialog behaviour.
8025     (ProjPanel.__init__): Add "Airy" to the list of ellipsoids so we
8026     can provide the "UK National Grid" as a default projection.
8027     (UTMPanel.__init__): Rearrange the order that the controls are
8028     created so that tabbing works correctly.
8029    
8030 bh 809 2003-05-05 Bernhard Herzog <[email protected]>
8031    
8032 bh 811 * extensions/thuban/wxproj.cpp: Fix some of the comments.
8033     (project_point): If a map projection but no layer projection is
8034     given, convert degrees to radians before applying the map
8035     projection.
8036    
8037 bh 809 * Thuban/UI/tableview.py (TableGrid.disallow_messages)
8038     (TableGrid.allow_messages): New methods to make it possible to
8039     inhibit message sending.
8040     (TableGrid.issue): Only send the message if not inhibited.
8041     (LayerTableGrid.select_shape): Use the new methods to make sure
8042     that no ROW_SELECTED message is sent while we're updating the
8043     selected rows to match the selected shapes.
8044    
8045 jan 807 2003-05-02 Jan-Oliver Wagner <[email protected]>
8046    
8047     Implementation of MemoryTable.
8048    
8049     * Thuban/Model/table.py (MemoryTable): New. Quite simple table
8050     implementation that operates on a list of tuples. All of the data
8051     are kept in the memory.
8052    
8053     * test/test_table.py (MemoryTableTest): New.
8054    
8055     * test/test_transientdb.py (SimpleTable): Removed.
8056     (TestTransientTable.test_transient_joined_table,
8057     (TestTransientTable.test_transient_table_read_twice): Replaced
8058     SimpleTable by MemoryTable.
8059    
8060 jonathan 793 2003-04-30 Jonathan Coles <[email protected]>
8061    
8062 jonathan 803 * Data/iceland_sample.thuban: Now contains correct projections
8063     for each of the layers.
8064    
8065     * Resources/Projections/defaults.proj: Geographic projection
8066     contains unit conversion parameter.
8067    
8068     2003-04-30 Jonathan Coles <[email protected]>
8069    
8070 jonathan 793 The most important part of this putback is the projection changes.
8071     It should now be possible to specify the projection that a layer
8072     is in and then specify a different projection for the map. The
8073     projection dialog has an extra parameter for a geographic projection
8074     which lets the user select if the input is in degrees or radians.
8075    
8076     * Thuban/Model/layer.py (Layer.ShapesInRegion): Fix docstring
8077     to say that the parameter is a tuple of unprojected
8078     points (which is what the callers to this method were assuming).
8079     Also, since the points are unprojected we need to projected them.
8080    
8081     * Thuban/UI/legend.py (LegendTree.MoveCurrentItemUp,
8082     LegendTree.MoveCurrentItemDown): If the layer or any of the layer's
8083     groups are selected, move the layer up/down. Fixes RTbug #1833.
8084    
8085     * Thuban/UI/mainwindow.py: Move menu item map_rename up.
8086    
8087     * Thuban/UI/projdialog.py (ProjFrame._OnSave): Add missing
8088     parameter in call to SetClientData.
8089     (GeoPanel): Add support for selecting the units that the
8090     source data is in (Radians or Degrees).
8091    
8092     * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Optimize
8093     the rendering loop by reducing the number of if's, removing the
8094     unnecessary try/except block, and checking if the old group
8095     is the same as the new one (which happens a lot if there is
8096     no classification, or lots of shapes are in the same group).
8097    
8098     * Thuban/UI/view.py (MapCanvas.OnPaint): Add a try/except block
8099     around the redraw routine to try to catch problems that the user
8100     may create by selecting invalid projections for the data set and
8101     map. Clears the display if there are any problems and prints the
8102     error.
8103     (MapCanvas.do_redraw): Use DC.Clear() instead of drawing a filled
8104     rectangle.
8105    
8106     * extensions/thuban/wxproj.cpp (project_point): First invert the
8107     supplied point (which should be in projected coordinates) using
8108     the layer's projection and then project the point using the
8109     map's projection.
8110     (project_points): Use project_point() to project each point.
8111    
8112 jan 792 2003-04-30 Jan-Oliver Wagner <[email protected]>
8113    
8114     * Thuban/Model/layer.py (Layer.SetShapeStore): Fixed a bug:
8115     don't set the Classification to None if the classfication field
8116     is None (ie only a DEFAULT).
8117    
8118 bh 786 2003-04-30 Bernhard Herzog <[email protected]>
8119    
8120 bh 790 * Thuban/UI/view.py: Fix some typos.
8121    
8122 bh 788 * Thuban/UI/mainwindow.py (MainWindow.identify_view_on_demand): Do
8123     not pop up the dialog if the selection becomes empty (this could
8124     happen if e.g. a new selection is opened while the identify tool
8125     is active and dialog had been closed)
8126    
8127     2003-04-30 Bernhard Herzog <[email protected]>
8128    
8129 bh 786 * Thuban/Model/transientdb.py (TransientTableBase.__init__): New
8130     instance variable read_record_last_result
8131     (TransientTableBase.read_record): Make sure reading the same
8132     record twice works. The implementation uses the new instance
8133     variable read_record_last_result
8134    
8135     * test/test_transientdb.py
8136     (TestTransientTable.test_transient_table_read_twice): New test
8137     case for the above bug-fix.
8138    
8139 jonathan 793 2003-04-29 Jonathan Coles <[email protected]>
8140    
8141     * Thuban/common.py: Removed. No longer needed Str2Num. RTbug #1832.
8142    
8143     * Thuban/UI/classgen.py: Remove all uses of Str2Num.
8144    
8145     * Thuban/UI/classifier.py: Remove all uses of Str2Num.
8146     (ClassTable.SetValueAsCustom): Rename keyword argument in
8147     ClassGroup* constructors to match argument name.
8148    
8149 bh 779 2003-04-29 Bernhard Herzog <[email protected]>
8150    
8151     * Thuban/Model/session.py (Session.Destroy): Explicitly close the
8152     transient DB if it exists to make sure it doesn't leave a journal
8153     file in the temp directory.
8154    
8155     * Thuban/Model/transientdb.py (TransientDatabase.close): Set
8156     self.conn to None after closing the connection to make sure it's
8157     not closed twice
8158    
8159 jonathan 767 2003-04-29 Jonathan Coles <[email protected]>
8160    
8161 jonathan 769 Add a visible parameter in the layer XML tag. The default value is
8162     "true". If anything other than "false" is specified we also assume
8163 jonathan 776 "true". Addresses RTbug #1025.
8164 jonathan 769
8165     * Doc/thuban.dtd: Add visible parameter to a layer.
8166    
8167     * Thuban/Model/layer.py (BaseLayer.__init__): Change default value
8168     of visible from 1 to True.
8169     (Layer.__init__): Change default value of visible from 1 to True.
8170    
8171     * Thuban/Model/load.py (SessionLoader.start_layer): Read visible
8172     parameter.
8173    
8174     * Thuban/Model/save.py (SessionSaver.write_layer): Save visible
8175     parameter.
8176    
8177     * test/test_load.py: Add new test data contents_test_visible.
8178     (LoadSessionTest.setUp): save test data.
8179     (LoadSessionTest.testLayerVisibility): Test if the visible flag
8180     is loaded correctly.
8181    
8182     * test/test_save.py (SaveSessionTest.testSingleLayer): Add test
8183     for saving an invisible layer.
8184    
8185     2003-04-29 Jonathan Coles <[email protected]>
8186    
8187 jonathan 767 * Thuban/UI/mainwindow.py (MainWindow.SetMap): Look up the
8188     legend dialog box and tell it to change its map to the one
8189     supplied to SetMap(). Fixes RTbug #1770.
8190    
8191 bh 764 2003-04-29 Bernhard Herzog <[email protected]>
8192    
8193 bh 766 Next step of table implementation. Introduce a transient database
8194     using SQLite that some of the data is copied to on demand. This
8195     allows us to do joins and other operations that require an index
8196     for good performance with reasonable efficiency. Thuban now needs
8197     SQLite 2.8.0 and pysqlite 0.4.1. Older versions may work but I
8198     haven't tested that.
8199    
8200     * Thuban/Model/transientdb.py: New. Transient database
8201     implementation.
8202    
8203     * test/test_transientdb.py: New. Tests for the transient DB
8204     classes.
8205    
8206     * Thuban/Model/session.py (AutoRemoveFile, AutoRemoveDir): New
8207     classes to help automatically remove temporary files and
8208     directories.
8209     (Session.__init__): New instance variables temp_dir for the
8210     temporary directory and transient_db for the SQLite database
8211     (Session.temp_directory): New. Create a temporary directory if not
8212     yet done and return its name. Use AutoRemoveDir to have it
8213     automatically deleted
8214     (Session.TransientDB): Instantiate the transient database if not
8215     done yet and return it.
8216    
8217     * Thuban/Model/data.py (ShapefileStore.__init__): Use an
8218     AutoTransientTable so that data is copied to the transient DB on
8219     demand.
8220     (SimpleStore): New class that simply combines a table and a
8221     shapefile
8222    
8223     * Thuban/Model/table.py (Table, DBFTable): Rename Table into
8224     DBFTable and update its doc-string to reflect the fact that this
8225     is only the table interface to a DBF file. Table is now an alias
8226     for DBFTable for temporary backwards compatibility.
8227    
8228     * Thuban/UI/application.py (ThubanApplication.OnExit): Make sure
8229     the last reference to the session goes away so that the temporary
8230     files are removed properly.
8231    
8232     * test/test_load.py (LoadSessionTest.tearDown): Remove the
8233     reference to the session to make sure the temporary files are
8234     removed.
8235    
8236     2003-04-29 Bernhard Herzog <[email protected]>
8237    
8238 bh 764 * Thuban/Model/load.py (XMLReader.__init__, XMLReader.read): Turn
8239     the __parser instance variable into a normal local variable in
8240     read. It's only used there and read will never be called more than
8241     once. Plus it introduces a reference cycle that keeps can keep the
8242     session object alive for a long time.
8243    
8244 jonathan 767 2003-04-29 Jonathan Coles <[email protected]>
8245 jonathan 735
8246 jonathan 762 * Thuban/Model/proj.py (Projection): Removed Set*() methods to make
8247     Projection an immutable item. Fixes RTbug #1825.
8248     (Projection.__init__): Initialize instance variables here.
8249     (ProjFile.Replace): New. Replace the given projection object with
8250     the new projection object. This solves the problem of needing the
8251     mutator Projection.SetProjection() in the ProjFrame class and
8252     allows a projection to change parameters without changing its
8253     location in the file.
8254    
8255     * Thuban/UI/mainwindow.py (MainWindow.SaveSessionAs): Dialog should
8256     be of type wxSAVE and should verify overwriting a file.
8257    
8258     * Thuban/UI/projdialog.py (ProjFrame._OnSave): Use the new
8259     ProjFile.Replace() method instead of the mutator
8260     Projection.SetProjection(). Also requires that we reassign the
8261     client data to the new projection.
8262    
8263     * test/test_proj.py (TestProjection.test): Test GetName() and
8264     GetAllParameters()
8265     (TestProjFile.test): Remove tests for Set*() methods. Add tests
8266     for Replace().
8267    
8268     2003-04-25 Jonathan Coles <[email protected]>
8269    
8270 jonathan 756 * Thuban/Model/save.py (SessionSaver.write_projection): Make sure
8271     to save the name of the projection.
8272    
8273     * test/test_save.py (SaveSessionTest.testLayerProjection): New
8274     test to verify layer projections are saved correctly.
8275    
8276     2003-04-25 Jonathan Coles <[email protected]>
8277    
8278 jonathan 753 * Thuban/Model/proj.py (Projection.SetName): Set the name
8279     to "Unknown" if name is None.
8280     (Projection.SetAllParameters): New. Set the projection's
8281     parameter list to the one supplied.
8282     (Projection.SetProjection): New. Set the projection's
8283     properties to those of the supplied Projection.
8284    
8285     * Thuban/UI/mainwindow.py (MainWindow.MapProjection): Set
8286     the dialog title to include the map's title.
8287     (MainWindow.LayerProjection): Set the dialog title to include
8288     the layer's title.
8289    
8290     * Thuban/UI/projdialog.py (ProjFrame.__ShowError): Consolidate
8291     error dialogs into a single method call.
8292     (ProjFrame.__VerifyButtons): Add more states to check.
8293     (ProjFrame.__GetProjection): Return the current state of an
8294     edited projection or None.
8295     (ProjFrame.__FillAvailList): Remove checks for states that
8296     shouldn't exist.
8297     (ProjFrame._OnNew): Clear all selected items and supply
8298     a projection panel if necessary.
8299    
8300     * test/test_proj.py (TestProjFile.test): Add tests for
8301     ProjFile.SetAllParameters, ProjFile.SetProjection,
8302     ProjFile.SetName.
8303    
8304     2003-04-25 Jonathan Coles <[email protected]>
8305    
8306 jonathan 748 * Thuban/UI/projdialog.py (ProjFrame.__FillAvailList): Now
8307     takes an optional argument to select the current projection.
8308     This does not guarantee that the item is visible due to
8309     limited wxWindows functionality. Fixes RTBug #1821.
8310    
8311     2003-04-25 Jonathan Coles <[email protected]>
8312    
8313 jonathan 743 * Thuban/Model/load.py (SessionLoader.start_projection): Remember
8314     the projection name and use it when constructing the Projection
8315     object.
8316    
8317     * Thuban/Model/proj.py (Projection.__init__): Change the default
8318     value for 'name' to None and then test if name is equal to None
8319     in the body of the constructor. This way the caller doesn't have to
8320     know what the default value should be. Namely, useful in load.py
8321     where we have to pick a default value if the 'name' parameter
8322     doesn't exist in the XML file.
8323    
8324     * test/test_load.py (LoadSessionTest.testLayerProjection): New.
8325     Tests a file where a layer has a projection.
8326    
8327     2003-04-25 Jonathan Coles <[email protected]>
8328    
8329 jonathan 735 * Thuban/Model/layer.py (Layer.TreeInfo): Add an item to the
8330     tree for projection information.
8331    
8332     * Thuban/Model/load.py (XMLReader.GetFilename): Renamed from
8333     XMLReader.GetFileName.
8334     (SessionLoader): Added support for loading projection tags that
8335     appear inside a layer.
8336    
8337     * Thuban/Model/proj.py (ProjFile): Document the class. Move
8338     back to using a list because the order of the projections in
8339     the file is important to maintain. Fixes RTbug #1817.
8340    
8341     * Thuban/Model/resource.py: Rename calls to ProjFile.GetFileName
8342     to ProjFile.GetFilename.
8343    
8344     * Thuban/Model/save.py (SessionSaver.write_layer): Save projection
8345     information.
8346    
8347     * Thuban/UI/projdialog.py (ProjFrame._OnAddToList): Renamed from
8348     ProjFrame._OnSaveAs. Removed old dead code from previous
8349     implementation.
8350     (ProjFrame._OnExport): Add support for exporting more than one
8351     projection to a single file.
8352     (ProjFrame.__FillAvailList): use string formatting (% operator)
8353     to build strings that are (partly) translated. Fixes RTbug #1818.
8354    
8355     * test/test_proj.py (TestProjFile.test): New. Tests the base ProjFile
8356     class.
8357    
8358 bh 734 2003-04-24 Bernhard Herzog <[email protected]>
8359    
8360     * po/es.po: Updated Spanish translation by Daniel Calvelo Aros
8361    
8362     * po/fr.po: New. French translation by Daniel Calvelo Aros
8363    
8364     * Thuban/UI/projdialog.py (ProjFrame._OnSaveAs): Don't translate
8365     empty strings.
8366    
8367 jonathan 735 2003-04-24 Jonathan Coles <[email protected]>
8368 jonathan 724
8369     * Thuban/Model/layer.py (Layer.GetProjection): New. Needed to
8370     implement the interface that the ProjFrame dialog expects.
8371    
8372     * Thuban/Model/proj.py (Projection.SetName): New. Allows the
8373     name of the projection to be changed.
8374     (ProjFile): Use a dictionary instead of a list so that removing
8375     projections is easier and we are sure about uniqueness.
8376     (ProjFile.Remove): Remove the given projection object.
8377    
8378     * Thuban/Model/resource.py (GetSystemProjFiles, GetUserProjFiles):
8379     Return a list with only one projection file instead of searching for
8380     any projection file. This simplifies many things if the user can
8381     only have one system file and one user file.
8382    
8383     * Thuban/UI/classgen.py: Change all references to
8384     genCombo to genChoice.
8385    
8386     * Thuban/UI/mainwindow.py: Add a Projection option under the
8387     layer menu.
8388     (MainWindow.LayerProjection): New. Open up a projection window
8389     for a layer.
8390    
8391     * Thuban/UI/projdialog.py: Large changes to how the dialog is
8392     laid out. Use three panels instead of one. One for the list of
8393     projections, one for the edit controls, and one for the buttons.
8394     Fixed resizing problems so that the dialog resizes correctly
8395     when the projection panel changes. Added import/export, save, and
8396     new buttons/functionality.
8397    
8398 bh 723 2003-04-24 Bernhard Herzog <[email protected]>
8399    
8400     First step towards table management. Introduce a simple data
8401     abstraction so that we replace the data a layer uses more easily
8402     in the next step.
8403    
8404     * Thuban/Model/data.py: New file with a simple data abstraction
8405     that bundles shapefile and dbffile into one object.
8406    
8407     * Thuban/Model/session.py (Session.OpenShapefile): New method to
8408     open shapefiles and return a shape store object
8409    
8410     * Thuban/Model/layer.py (Layer.__init__): Pass the data as a store
8411     object instead of a shapefile filename. This introduces a new
8412     instance variable store holding the datastore. For intermediate
8413     backwards compatibility keep the old instance variables.
8414     (open_shapefile): Removed. No longer needed with the shape store.
8415     (Layer.SetShapeStore, Layer.ShapeStore): New methods to set and
8416     get the shape store used by a layer.
8417     (Layer.Destroy): No need to explicitly destroy the shapefile or
8418     table anymore.
8419    
8420     * Thuban/UI/mainwindow.py (MainWindow.AddLayer)
8421     (MainWindow.AddLayer): Use the session's OpenShapefile method to
8422     open shapefiles
8423    
8424     * Thuban/Model/load.py (ProcessSession.start_layer): Use the
8425     session's OpenShapefile method to open shapefiles
8426    
8427     * test/test_classification.py
8428     (TestClassification.test_classification): Use the session's
8429     OpenShapefile method to open shapefiles and build the filename in
8430     a more platform independed way
8431    
8432     * test/test_layer.py (TestLayer.setUp, TestLayer.tearDown):
8433     Implement to have a session to use in the tests
8434     (TestLayer.test_arc_layer, TestLayer.test_polygon_layer)
8435     (TestLayer.test_point_layer, TestLayer.test_empty_layer): Use the
8436     session's OpenShapefile method to open shapefiles
8437     (TestLayerLegend.setUp): Instantiate a session so that we can use
8438     it to open shapefiles.
8439     (TestLayerLegend.tearDown): Make sure that all references to
8440     layers and session are removed otherwise we may get a resource
8441     leak
8442    
8443     * test/test_map.py (TestMapAddLayer.test_add_layer)
8444     (TestMapWithContents.setUp): Instantiate a session so that we can
8445     use it to open shapefiles.
8446     (TestMapWithContents.tearDown): Make sure that all references to
8447     layers, maps and sessions are removed otherwise we may get a
8448     resource leak
8449     ("__main__"): use support.run_tests() so that more info about
8450     uncollected garbage is printed
8451    
8452     * test/test_save.py (SaveSessionTest.testSingleLayer): Use the
8453     session's OpenShapefile method to open shapefiles
8454     ("__main__"): use support.run_tests() so that more info about
8455     uncollected garbage is printed
8456    
8457     * test/test_selection.py (TestSelection.tearDown): Make sure that
8458     all references to the session and the selection are removed
8459     otherwise we may get a resource leak
8460     (TestSelection.get_layer): Instantiate a session so that we can
8461     use it to open shapefiles.
8462     ("__main__"): use support.run_tests() so that more info about
8463     uncollected garbage is printed
8464    
8465     * test/test_session.py (TestSessionBase.tearDown)
8466     (TestSessionWithContent.tearDown): Make sure that all references
8467     to the session and layers are removed otherwise we may get a
8468     resource leak
8469     (TestSessionWithContent.setUp): Use the session's OpenShapefile
8470     method to open shapefiles
8471    
8472 jonathan 721 2003-04-24 Jonathan Coles <[email protected]>
8473    
8474     * Thuban/Model/load.py (XMLReader.read): Should have been checking
8475     if the file_or_filename object had the 'read' attribute.
8476    
8477 jonathan 715 2003-04-23 Jonathan Coles <[email protected]>
8478    
8479 jonathan 720 * Thuban/Model/resource.py: Fixes RTbug #1813.
8480     (ReadProjFile): Add documentation about which exceptions are raised.
8481     Always pass the exceptions up to the caller.
8482     (GetProjFiles): If the directory can't be read return an empty list.
8483     If any of the proj files can't be read skip that file and go
8484     on to the next one.
8485    
8486     * test/test_proj.py: Added test cases to handle nonexistent files,
8487     unreadable files, and files that don't parse correctly.
8488    
8489     2003-04-23 Jonathan Coles <[email protected]>
8490    
8491 jonathan 716 Projection dialog. Allows the user to select from a list
8492     of projection templates and optionally edit them and save new ones.
8493    
8494     * Thuban/UI/projdialog.py (ProjFrame): New. Main dialog.
8495     (ProjPanel): Base class for projection specific panels.
8496     (TMPanel): Projection panel for Transverse Mercartor.
8497     (UTMPanel): Projection panel for Universal Transverse Mercartor.
8498     (LCCPanel): Projection panel for Lambert Conic Conformal.
8499     (GeoPanel): Projetion panel for Geographic Projection.
8500    
8501     2003-04-23 Jonathan Coles <[email protected]>
8502    
8503 jonathan 715 * Thuban/Model/load.py (XMLReader): Renamed from XMLProcessor to
8504     promote symmetry. There now exists XMLReader and XMLWriter.
8505     (XMLReader.read): New. Call to read the given file descriptor or
8506     filename.
8507     (XMLReader.close): New. Make sure the file is closed.
8508     (XMLReader.GetFileName): New. Return just the file name that is being
8509     read from.
8510     (XMLReader.GetDirectory): New. Return just the directory of the file
8511     that is being read.
8512     (XMLReader.AddDispatchers): New. Take a dictionary which contains
8513     the names of functions to call as the XML tree is parsed.
8514     (XMLReader.startElementNS): Updated to use new dispatcher dictionary.
8515     (XMLReader.endElementNS): Updated to use new dispatcher dictionary.
8516     (SessionLoader): Removed class variables start_dispatcher and
8517     end_dispatcher since this functionality is now part of a class
8518     instance. Fixes RTbug #1808.
8519     (SessionLoader.__init__): Add dispatcher functions.
8520     (load_xmlfile): Code was moved into the XMLReader.read().
8521     (load_session): Use modified SessionLoader.
8522    
8523     * Thuban/Model/map.py (Map.GetProjection): New. Returns the
8524     map's projection.
8525    
8526     * Thuban/Model/proj.py (Projection.GetParameters): Renamed to
8527     GetAllParameters.
8528     (Projection.GetParameter): Returns the value for the given parameter.
8529    
8530     * Thuban/Model/resource.py: Use XMLReader and XMLWriter.
8531     (GetProjFiles): Renamed from GetProjections. Now returns a list
8532     of ProjFile objects.
8533     (GetSystemProjFiles): Renamed from GetSuppliedProjections. Returns
8534     a list of ProjFile objects whose files are not user defined.
8535     (GetUserProjFiles): Renamed from GetUserProjections. Returns a
8536     list of ProjFile objects whose files are user defined.
8537     (ProjFileReader): Extend new XMLReader.
8538    
8539     * Thuban/Model/save.py (XMLWriter): Renamed from XMLSaver to
8540     promote symmetry.
8541    
8542     * Thuban/UI/classgen.py (ClassGenDialog.__init__): Use a wxChoice
8543     control instead of a wxComboBox. wxChoice controls do not generate
8544     events as the uses highlights possible choices which fixes problems
8545     with resizing the dialog when the use selects an option.
8546    
8547     * Thuban/UI/classifier.py (Classifier.__init__): Use a wxChoice
8548     control instead of a wxComboBox.
8549    
8550     * Thuban/UI/mainwindow.py (MainWindow.Projection): Use new projection
8551     dialog.
8552    
8553     * test/test_proj.py (TestProjection.test): New tests for GetParameter
8554     method.
8555    
8556 bh 703 2003-04-22 Bernhard Herzog <[email protected]>
8557    
8558 bh 705 * Thuban/UI/mainwindow.py: Remove some unused imports and global
8559     constants
8560    
8561 bh 703 * Thuban/UI/identifyview.py (IdentifyListCtrl.selected_shape)
8562     (IdentifyGridCtrl.selected_shape): Use table, not shapetable.
8563    
8564 bh 700 2003-04-17 Bernhard Herzog <[email protected]>
8565    
8566 bh 701 * Thuban/Model/layer.py: Don't import LAYER_LEGEND_CHANGED.
8567     (Layer): Update doc-string since LAYER_LEGEND_CHANGED is not used
8568     anymore.
8569     (Layer.BoundingBox, Layer.GetFieldType, Layer.NumShapes)
8570     (Layer.ShapeType, Layer.Shape): No need to call
8571     self.open_shapefile since it's always called in __init__
8572    
8573 bh 700 * Thuban/UI/application.py (ThubanApplication.MainLoop): Removed.
8574     In wxPython 2.4 there's no need to extend MainLoop anymore since
8575     wxPython itself makes sure OnExit is called.
8576    
8577 jonathan 688 2003-04-16 Jonathan Coles <[email protected]>
8578    
8579 jonathan 693 Initial putback of projection management code. Includes new
8580     classes to read and write projection files. The current load
8581     and save classes were abstracted a bit so they could be reused.
8582     The Projection class was extended to provide new methods and
8583     have a name.
8584    
8585     * Thuban/Model/load.py (XMLProcessor): New. Contains all the
8586     general XML reading methods that were part of ProcessSession.
8587    
8588     * Thuban/Model/proj.py (Projection.__init__): Accepts an optional
8589     name.
8590     (ProjFile): New. Represents a file that contains projection
8591     information.
8592    
8593     * Thuban/Model/resource.py: New. Contains general utilities
8594     for read and writing projection files.
8595    
8596     * Thuban/Model/save.py (XMLSaver): New. Contains all the
8597     general XML writing methods that were part of SessionSaver.
8598     (SessionSaver): Renamed from Saver.
8599    
8600     * test/test_proj.py: New test cases for the projection
8601     file read and write functions.
8602    
8603     2003-04-16 Jonathan Coles <[email protected]>
8604    
8605 jonathan 688 * Thuban/Model/classification.py: Use repr() around values
8606     in the ClassGroup*.__repr__() methods so it is clearer when
8607     a value is a string and when it is a number.
8608    
8609     * test/test_load.py: Rework the classification test to test
8610     that we can load old files.
8611     (testLabels): Test a file where the groups have labels.
8612    
8613 bh 687 2003-04-16 Bernhard Herzog <[email protected]>
8614    
8615     Safer implementation of the performance enhancements of the
8616     low-level renderer:
8617    
8618     * extensions/thuban/wxproj.cpp (extract_projection)
8619     (extract_pointer): Rename extract_projection to extract_pointer
8620     and redefine its purpose to return the pointer stored in a CObject
8621     returned by the object's cobject method. Update all callers.
8622     (s_draw_info, free_draw_info, draw_polygon_init): Implement the
8623     handling of these low-level parameters so that each s_draw_info
8624     instance is handled as a CObject at python level that also
8625     contains real references to the actual python objects which
8626     contain the values in the struct. Add free_draw_info as the
8627     destructor.
8628     (draw_polygon_shape): Add the py_draw_info parameter which must a
8629     cobject containing an s_draw_info pointer.
8630    
8631     * Thuban/UI/renderer.py (MapRenderer.polygon_render_param): New
8632     method to instantiat the low-level render parameter
8633     (MapRenderer.draw_shape_layer): Use the new method. Remove some
8634     commented out code.
8635     (MapRenderer.draw_polygon_shape): Make the first parameter not the
8636     layer but the low-level render parameter
8637     (ScreenRenderer.draw_shape_layer): Use the low-level render
8638     parameter.
8639    
8640 jonathan 673 2003-04-15 Jonathan Coles <[email protected]>
8641    
8642 jonathan 680 * Thuban/Model/classification.py: Implemented __repr__ for
8643     the ClassGroup* classes to make debugging a bit easier.
8644     (ClassGroup.SetLabel): Check that the string is an instance
8645     of StringTypes not StringType. Accounts for Unicode strings.
8646    
8647     * Thuban/Model/color.py: Implemented __repr__ to make
8648     debugging a bit easier.
8649    
8650     * Thuban/Model/save.py (Saver.write_classification): Need to
8651     save the group label.
8652    
8653     * test/test_load.py (testClassification): New. Loads the
8654     iceland_sample_test.thuban file and checks if it was loaded
8655     correctly.
8656    
8657     2003-04-15 Jonathan Coles <[email protected]>
8658    
8659 jonathan 673 * extensions/thuban/wxproj.cpp (draw_polygon_init): New. Used
8660     to improve rendering performance by initializing the variables
8661     that are not change each time draw_polygon_shape() is called.
8662     The values are stored in a global struct draw_info.
8663     (draw_polygon_shape): Removed initialization code that is
8664     now in draw_polygon_init().
8665    
8666     * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Make
8667 jonathan 674 drawing initialization call to draw_polygon_init()
8668     (MapRenderer.draw_polygon_shape): Use new signature of
8669     draw_polygon_shape.
8670 jonathan 673
8671 jonathan 674 * Thuban/UI/classgen.py (GenUniformPanel): Fix spin control
8672     weirdness by setting the range to (1, maxint).
8673 jonathan 673
8674 jonathan 674 * Thuban/Model/classification.py (ClassGroupProperties): Make
8675     instance variables private and optimize comparison operator
8676     by first checking if the color references are the same.
8677     (ClassGroupSingleton): Make instance variables private.
8678     (ClassGroupRange): Make instance variables private.
8679 jonathan 673
8680 jonathan 674 * HOWTO-Release: Filled in missing steps for releasing packages.
8681    
8682 bh 672 2003-04-15 Bernhard Herzog <[email protected]>
8683    
8684     First stab at internationalized messages:
8685    
8686     * Thuban/__init__.py (_): Implement the translation function for
8687     real using the python gettext module.
8688    
8689     * Thuban/UI/classifier.py (ClassTable.GetRowLabelValue): Don't
8690     translate empty strings.
8691    
8692     * Thuban/UI/application.py (ThubanApplication.read_startup_files):
8693     Add a missing space to a warning message
8694    
8695     * po/README: New. Notes about the management of the translation
8696     files.
8697    
8698     * po/Makefile: New. Makefile to help manage the translation files.
8699    
8700     * po/es.po: New. Spanish translation by Daniel Calvelo Aros
8701    
8702     * MANIFEST.in: Include the *.mo files in Resources/Locale and the
8703     translations and support files in po/
8704    
8705     * setup.py (data_files): Add the *.mo files to the data_files too
8706    
8707     * README: Add note about the translations when building from CVS
8708    
8709 jonathan 669 2003-04-14 Jonathan Coles <[email protected]>
8710    
8711     * Thuban/UI/dock.py: Fixes some window resizing problems most
8712     noticable under windows. Always assume the button bitmaps will
8713     be there. Code clean up.
8714     (DockabelWindow.Dock, DockableWindow.UnDock): Force all the
8715     images for the dock/undock button to the same images.
8716     Work around for RTbug #1801.
8717    
8718     * Thuban/UI/legend.py (LegendPanel.__init__): The toolbar should
8719     be allowed to grow within the sizer. Fixes a bug under Windows
8720     where the toolbar wasn't being drawn.
8721    
8722 frank 664 2003-04-14 Frank Koormann <[email protected]>
8723    
8724     * Resources/Bitmaps/dock_12.xpm, Resources/Bitmaps/undock_12.xpm:
8725     Updated design to try to make the button functionality more
8726     transparent.
8727    
8728 jonathan 662 2003-04-14 Jonathan Coles <[email protected]>
8729    
8730     * Thuban/UI/legend.py (LegendPanel.__init__): Call Create() to
8731     finalize the intialization of the panel.
8732    
8733     * Thuban/UI/dock.py (DockPanel.Create): New. Finalizes the
8734     creation of the panel. Should be the last thing called in the
8735     initializer of a subclass.
8736    
8737     * Thuban/UI/classgen.py (ClassGenDialog.__init__): Actively
8738     set the current selections in the combo boxes. This is needed
8739     under Windows.
8740    
8741     * Thuban/UI/classifier.py (Classifier.__init__): Add a top
8742     level panel to the dialog so that the background colors are
8743     consistent under Windows.
8744    
8745 jonathan 646 2003-04-11 Jonathan Coles <[email protected]>
8746    
8747 jonathan 662 * Thuban/UI/classgen.py: Change color ramps to start at white
8748     not black.
8749    
8750     * Thuban/UI/legend.py: Enable/disable the legend buttons when
8751     the legend changes. Fixes RTbug #1793.
8752    
8753     * test/test_classification.py: Added test for copying of
8754     classifications.
8755    
8756     2003-04-11 Jonathan Coles <[email protected]>
8757    
8758 jonathan 647 * Thuban/UI/resource.py: New. Centralize the loading of resources
8759     such as bitmaps.
8760    
8761     * Thuban/UI/classgen.py (GenUniquePanel.__init__): Reordered buttons,
8762     added images to the move buttons, added 'reverse' button.
8763     (CustomRampPanel.__init__): Added images to the move buttons.
8764     (GreyRamp): New. Generates a ramp from white to black.
8765     (HotToColdRamp): New. Generates a ramp from cold to hot colors.
8766    
8767     * Thuban/UI/classifier.py: Refactored ID's from ID_CLASSIFY_* to
8768     ID_PROPERTY_*.
8769     (Classifier.__init__): Minor changes to the layout.
8770     (Classifier._OnTitleChanged): Listen for when the user edits the
8771     title and update the dialog's title and the layer's title.
8772    
8773     * Thuban/UI/dock.py: Use new bitmaps for the control buttons.
8774    
8775     * Thuban/UI/legend.py: Use new bitmaps for the control buttons.
8776     (LegendTree._OnMsgLayerTitleChanged): Change the displayed title
8777     if the layer's title changes.
8778    
8779     * Thuban/UI/mainwindow.py: Added new menu item and associated code
8780     to open a dialog to rename the map.
8781     (MainWindow): Use new resource class to import bitmaps.
8782    
8783     2003-04-11 Jonathan Coles <[email protected]>
8784    
8785 jonathan 646 * Resources/Bitmaps/close_12.xpm, Resources/Bitmaps/dock_12.xpm,
8786 jonathan 647 Resources/Bitmaps/group_use.xpm, Resources/Bitmaps/group_use_all.xpm,
8787     Resources/Bitmaps/group_use_none.xpm,
8788     Resources/Bitmaps/group_use_not.xpm,
8789     Resources/Bitmaps/hide_layer.xpm,
8790     Resources/Bitmaps/layer_properties.xpm,
8791     Resources/Bitmaps/lower_layer.xpm, Resources/Bitmaps/raise_layer.xpm,
8792     Resources/Bitmaps/show_layer.xpm, Resources/Bitmaps/undock_12.xpm:
8793     New.
8794 jonathan 646
8795 jonathan 636 2003-04-10 Jonathan Coles <[email protected]>
8796    
8797 jonathan 644 * Thuban/Model/classification.py: (ClassGroupRange.__init__):
8798     Should pass group to ClassGroup constructor.
8799    
8800     2003-04-10 Jonathan Coles <[email protected]>
8801    
8802 jonathan 636 * Thuban/Model/classification.py: (ClassGroup): Move all the common
8803     methods of the derived classes ([Set|Get]Properties(), __eq__, __ne__)
8804     here. Implement SetVisible(), IsVisible().
8805     (ClassGroup.__init__): Add group parameter which acts as a copy
8806     constructor.
8807    
8808     * Thuban/UI/classifier.py (ClassTable): Add a new column for the
8809     "Visible" check boxes.
8810     (Classifier): Rename the buttons and refactor the code to match
8811     the new labels.
8812    
8813     * Thuban/UI/legend.py: Classify button is now called "Properties".
8814     Refactored the code to change variable names.
8815     (LegendTree.__FillTreeLayer): Only list a group if it is visible.
8816    
8817     * Thuban/UI/mainwindow.py: MainWindow.OpenClassifier renamed to
8818     MainWindow.OpenLayerProperties. MainWindow.LayerEditProperties
8819     renamed to MainWindow.LayerEditProperties.
8820     (MainWindow.ToggleLegend): Don't include map name in legend title.
8821     (MainWindow.SetMap): Added the map name to the window title.
8822     (MainWindow.LayerFillColor, MainWindow.LayerTransparentFill,
8823     MainWindow.LayerOutlineColor, MainWindow.LayerNoOutline): Removed.
8824     Functionality is found in the layer properties dialog.
8825    
8826     * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Only
8827     draw visible groups.
8828    
8829 jonathan 626 2003-04-09 Jonathan Coles <[email protected]>
8830    
8831 jonathan 634 * Thuban/UI/classgen.py: Modifications to allow simple
8832     addition and selection of new color schemes.
8833     (MonochromaticRamp): New. Generates a ramp between two colors.
8834     (RedRamp): New. Generates a ramp of all red.
8835     (GreenRamp): New. Generates a ramp of all green.
8836     (BlueRamp): New. Generates a ramp of all blue.
8837    
8838     2003-04-09 Jonathan Coles <[email protected]>
8839    
8840 jonathan 626 * Thuban/Model/classification.py (Classification.__deepcopy__):
8841     Need to copy over field and fieldType attributes.
8842    
8843     * Thuban/Model/table.py (Table.field_range): New. Retrive the
8844     maximum and minimum values over the entire table for a given
8845     field.
8846     (Table.GetUniqueValues): New. Retrieve all the unique values
8847     in the table for a given field.
8848    
8849     * Thuban/UI/classgen.py: Renamed GenRangePanel to GenUniformPanel.
8850     (GenUniquePanel): New. Controls to allow the user to select
8851     which unique field values they would like in the classification.
8852     (CustomRampPanel): Code that was in ClassGenDialog that allows
8853     the user to select the properties for a custom ramp.
8854     (ClassGenerator.GenUniformDistribution): Was called GenerateRanges.
8855    
8856     * Thuban/UI/classifier.py: Removed a lot of debugging code.
8857     (Classifier._SetClassification): Callback method so that the
8858     class generator can set the classification in the grid.
8859     (ClassGroupPropertiesCtrl): New. Encapsulates the drawing and
8860     editing of a group properties class into a wxWindows control.
8861    
8862     * Thuban/UI/dock.py: It was decided that if the user closes
8863     a dockable window the window should simply hide itself. That
8864     way if the user wants to show the dock again it appears in the
8865     same place as it was when it was closed.
8866     (DockableWindow.Destroy): Call renamed method OnDockDestroy().
8867     (DockableWindow._OnButtonClose): Hide the window instead of
8868     destroying it.
8869     (DockableWindow._OnClose): Hide the window instead of
8870     destroying it.
8871    
8872     * Thuban/UI/legend.py (LegendTree): Use a private method to
8873     consistently set the font and style of the text. Fixes RTbug #1786.
8874    
8875     * Thuban/UI/mainwindow.py: Import just the Classifier class.
8876    
8877 bh 623 2003-04-07 Bernhard Herzog <[email protected]>
8878    
8879 bh 625 * Thuban/UI/mainwindow.py (main_menu): Move the toggle_legend item
8880     to the map module
8881    
8882     2003-04-07 Bernhard Herzog <[email protected]>
8883    
8884 bh 623 * Thuban/UI/mainwindow.py (MainWindow.ShowSessionTree): Removed in
8885     favor of ToggleSessionTree
8886     (MainWindow.ToggleSessionTree): New method to toggle visibility of
8887     the session tree.
8888     (MainWindow.SessionTreeShown): New method to return whether the
8889     session tree is currently shown.
8890     (MainWindow.ToggleLegend): New method to toggle visibility of the
8891     legend
8892     (MainWindow.ShowLegend): Implement in terms of ToggleLegend and
8893     LegendShown
8894     (MainWindow.LegendShown): New method to return whether the legend
8895     is currently shown.
8896     (_method_command): Add checked parameter so we can define check
8897     menu items
8898     (_has_tree_window_shown, _has_legend_shown): Use the appropriate
8899     mainwindow methods.
8900     (show_session_tree, show_legend commands): Removed.
8901     (toggle_session_tree, toggle_legend commands): New commands to
8902     toggle the visibility of the dialogs
8903    
8904 jonathan 612 2003-04-07 Jonathan Coles <[email protected]>
8905    
8906 jonathan 619 * Thuban/UI/classgen.py: Fix Windows problem.
8907    
8908     * Thuban/UI/dock.py: Fix Windows problem.
8909    
8910     * Thuban/UI/mainwindow.py: Use False instead of false.
8911     (MainWindow.ShowLegend): Remove unnecessary switch parameter.
8912    
8913     2003-04-07 Jonathan Coles <[email protected]>
8914    
8915 jonathan 612 Since we now say that the order of the groups in a classification
8916     matters, it makes sense to be able to manipulate that order. Most
8917     of the changes to Thuban/Model/classification.py are to that end.
8918    
8919     * Thuban/Model/classification.py (Classification.AppendGroup,
8920     Classification.InsertGroup, Classification.ReplaceGroup,
8921     Classification.RemoveGroup, Classification.GetGroup): Do as the
8922     names imply.
8923     (Classification.FindGroup): This was called GetGroup, but GetGroup
8924     takes an index, while FindGroup takes a value.
8925     (Classification.__deepcopy__): Copy all the groups, BUT NOT THE LAYER
8926     REFERENCE. Currently there is a cyclic reference between the layer
8927     and its classification. If the classification doesn't need to know
8928     its owning layer we can change this, since it may make sense to be
8929     able to use the same classification with different layers.
8930    
8931     * Thuban/Model/load.py: Use Classification.AppendGroup(), not AddGroup()
8932    
8933     * Thuban/UI/classgen.py: Use Classification.AppendGroup(),
8934     not AddGroup()
8935    
8936     * Thuban/UI/classifier.py: Now that we can depend on the order in
8937     a Classification and have methods to manipulate that order we don't
8938     need to use our own data structures in the grid. We can simply make
8939     the grid/table access the information they need from a copy of
8940     the classification object.
8941     (Classifier._OnCloseBtn): Event handler for when the user clicks
8942     'Close'. This is needed so if the user applies changes and then
8943     continues to change the table the user has the option of discarding
8944     the most recent changes and keeping what they applied.
8945    
8946     * Thuban/UI/mainwindow.py: Put "Show Legend" and "Show Session Tree"
8947     into the same group.
8948    
8949     * extensions/thuban/wxproj.cpp (check_version): If Thuban is compiled
8950     with a really old version of proj, PJ_VERSION won't even be defined.
8951     If it isn't defined then just compile so that the function always
8952     returns Py_False.
8953    
8954     * test/test_classification.py: Fix tests to use the renamed methods.
8955     Still need to write tests for the new methods.
8956    
8957 jonathan 601 2003-04-04 Jonathan Coles <[email protected]>
8958 jonathan 608
8959 jonathan 612 * Thuban/UI/classifier.py (Classifier.__SelectField): Move the
8960     call to SetSelection out of the method and before the call
8961     to __SelectField in __init__. This prevents a recursion of events
8962     when _OnFieldSelect is triggered by the user.
8963    
8964     2003-04-04 Jonathan Coles <[email protected]>
8965    
8966 jonathan 608 * Thuban/Model/classification.py: Rename Color.None to
8967     Color.Transparent.
8968     (ClassGroupProperties.SetLineColori, ClassGroupProperties.SetFill):
8969     Don't bother copying the color, since Colors are immutable.
8970    
8971     * Thuban/Model/color.py, Thuban/Model/layer.py, Thuban/Model/load.py,
8972     Thuban/UI/classifier.py, Thuban/UI/mainwindow.py,
8973     Thuban/UI/renderer.py, Thuban/UI/view.py:
8974     Rename Color.None to Color.Transparent.
8975    
8976     * test/test_classification.py, test/test_load.py: Rename Color.None
8977     to Color.Transparent.
8978    
8979     2003-04-04 Jonathan Coles <[email protected]>
8980 jonathan 603
8981     * Thuban/Model/classification.py: Fix assert calls.
8982     (ClassGroupProperties.SetLineColor, ClassGroupProperties.SetFill):
8983     Copy the color parameter rather than hold onto a reference.
8984 jonathan 601
8985 jonathan 603 * Thuban/Model/color.py (Color.__copy__, Color.__deepcopy): Copy
8986     the color object.
8987     (NoColor.__copy__, NoColor.__deepcopy): Return 'self' so that we
8988     are sure there exists only one refernce to Color.None in the system.
8989     This allows us to use 'is' rather than the comparision functions.
8990    
8991     * Thuban/Model/save.py: Fix assert calls.
8992    
8993     * Thuban/UI/classifier.py: Fix assert calls.
8994     (ClassGrid._OnCellDClick): Call up to the classifier to open the
8995     dialog to edit the groups properties.
8996     (ClassGrid._OnCellResize): Make sure that the scollbars are drawn
8997     correctly if a cell is resized.
8998     (ClassTable.SetClassification): New. Changes the classification
8999     that is in the table.
9000     (ClassTable.__SetRow): Allow groups to be prepended.
9001     (Classifier): New code for opening the EditProperties and
9002     GenerateRanges dialogs.
9003     (SelectPropertiesDialog.__GetColor): Only set the color in the
9004     color dialog if the current color is not None.
9005    
9006     * Thuban/UI/dock.py: Fix assert calls.
9007    
9008     * Thuban/UI/legend.py: Fix assert calls.
9009    
9010     * Thuban/UI/renderer.py: Fix assert calls.
9011    
9012     * Thuban/UI/classgen.py (ClassGenDialog): Dialog for generating
9013     classifications.
9014     (GenRangePanel): Panel specific to range generation.
9015     (GenSingletonPanel): Panel specific to singleton generation.
9016     (ClassGenerator): Class responsible for actually generating
9017     the classification from the data gathered in the dialog box.
9018     (PropertyRamp): Generates properties whose values range from
9019     a starting property to an ending property.
9020 jonathan 601
9021 bh 600 2003-04-03 Bernhard Herzog <[email protected]>
9022    
9023     * test/support.py (print_garbage_information): New function that
9024     prints information about still connected messages and memory
9025     leaks.
9026     (run_suite): Removed.
9027     (run_tests): New function for use as a replacement of
9028     unittest.main in the test_* files. This one calls
9029     print_garbage_information at the end.
9030    
9031     * test/runtests.py (main): Use support.print_garbage_information
9032    
9033     * test/test_layer.py: Use support.run_tests instead of
9034     unittest.main so we get memory leak information
9035     (TestLayer.test_arc_layer, TestLayer.test_polygon_layer)
9036     (TestLayer.test_point_layer, TestLayer.test_empty_layer)
9037     (TestLayerLegend.test_visibility): Call the layer's Destroy method
9038     to fix a memory leak.
9039    
9040     * test/test_classification.py: Use support.run_tests instead of
9041     unittest.main so we get memory leak information
9042     (TestClassification.test_classification): Call the layer's Destroy
9043     method to fix a memory leak.
9044    
9045 bh 591 2003-04-02 Bernhard Herzog <[email protected]>
9046    
9047 bh 595 * extensions/thuban/wxproj.cpp (check_version, check_version_gtk):
9048     Handle the reference counts of the return value and errors in
9049     PyArg_ParseTuple correctly.
9050    
9051 bh 593 * Thuban/UI/application.py (ThubanApplication.OpenSession): Make
9052     sure the filename is absolute to avoid problems when saving the
9053     session again
9054    
9055 bh 591 * Thuban/Model/table.py: Remove unnecessary import. Fix a typo.
9056    
9057 jonathan 587 2003-04-01 Jonathan Coles <[email protected]>
9058    
9059 jonathan 589 * Thuban/UI/renderer.py (MapRenderer.draw_point_shape): Check
9060 jonathan 587 that there actually are points in the returned list of points
9061     before trying to index into the list. The list may be empty if
9062     the shape is a Null Shape.
9063    
9064 bh 586 2003-04-01 Bernhard Herzog <[email protected]>
9065    
9066     * test/test_map.py: Don't use from <module> import *
9067    
9068 jonathan 581 2003-04-01 Jonathan Coles <[email protected]>
9069    
9070     * Thuban/Model/session.py: Use LAYER_CHANGED instead of
9071     LAYER_LEGEND_CHANGED
9072    
9073     * Thuban/UI/dock.py (DockableWindow._OnButtonClose): Call
9074     self.Destroy() to close the window after yesterday's changes.
9075    
9076     * test/test_map.py, test/test_session.py: Fix messages that
9077     are sent from maps and layers.
9078    
9079 jonathan 575 2003-03-31 Jonathan Coles <[email protected]>
9080    
9081     * Thuban/UI/classifier.py: Commented out some debugging statements.
9082     (ClassDataPreviewer.Draw): Draw rectangles for polygon layers per
9083     RTbug #1769.
9084    
9085     * Thuban/UI/dock.py (DockableWindow.UnDock): Restore size and
9086     position (although position doesn't work yet under GTK).
9087     (DockableWindow.Destroy): New. Called when the window must be
9088     closed. Namely needed when the DockFrame closes and must close
9089     its children.
9090     (DockFrame): Listen for EVT_CLOSE and destroy all children.
9091    
9092     * Thuban/UI/legend.py (LegendPanel.Destroy): New. Cleans up
9093     when then window is told to close.
9094     (LegendTree._OnMsgLayerChanged): Fixes a seg fault bug. See
9095     comment in source for more info.
9096    
9097     * Thuban/UI/main.py: Show the legend by default when Thuban starts.
9098    
9099     * Thuban/UI/mainwindow.py: Renamed OnClose to _OnClose for
9100     symmetry with other such methods.
9101     (MainWindow.ShowLegend): Show the legend docked by default.
9102    
9103 jonathan 569 2003-03-28 Jonathan Coles <[email protected]>
9104    
9105     * Thuban/UI/classifier.py: Support for highlighting a specific
9106     group within the grid when the classification dialog is opened.
9107     Also contains a lot of debugging printouts which will later
9108     be removed.
9109    
9110     * Thuban/UI/dock.py: Complete rework on the dock code so that
9111     that it is fairly removed from the rest of the Thuban application.
9112     It is easy to add new docks which the rest of the program having
9113     to be aware of them.
9114    
9115     * Thuban/UI/legend.py: Modifications to support selecting a
9116     specific group in the classification dialog. Changed how layers
9117     are drawn when the layer is visible/invisible.
9118    
9119     * Thuban/UI/mainwindow.py: Removed legend specific code and
9120     replaced it with calls to the new dock code.
9121    
9122     * Thuban/UI/renderer.py (MapRenderer.__init__): Added assert
9123     to check if scale > 0. Trying to track down a divide by zero.
9124    
9125 jonathan 557 2003-03-26 Jonathan Coles <[email protected]>
9126    
9127 jonathan 567 * Thuban/UI/legend.py: Removed unnecessary LegendDialog class.
9128     (LegendPanel): Removed _OnDock()/_OnUnDock() methods which are
9129     now part of DockableWindow.
9130     (LegendPanel.DoOnSelChanged): Select the current layer in the
9131     map.
9132     (LegendTree._OnSelChanged): Call LegendPanel.DoOnSelChanged()
9133     with the selected layer and/or group.
9134    
9135     2003-03-26 Jonathan Coles <[email protected]>
9136    
9137 jonathan 557 This putback contains the code for dockable windows. There is
9138     no support in wxWindows as of this date for windows that can
9139     attach themselves to other windows.
9140    
9141     The current model contains a DockableWindow which has a parent
9142     window for when it is detached and a dock window that it puts
9143     its contents in when it is docked. The contents of a DockableWindow
9144     must be a DockPanel. DockPanel itself derives from wxPanel.
9145    
9146     * Thuban/Model/layer.py (Layer.ClassChanged): Send a LAYER_CHANGED
9147     message, not a LAYER_LEGEND_CHANGED message.
9148    
9149     * Thuban/Model/map.py (Map): Forward LAYER_CHANGED messages.
9150    
9151     * Thuban/UI/classifier.py (Classifier.__init__): Use wxADJUST_MINSIZE
9152     as one of the style properties for the fieldTypeText item to
9153     be sure that its size is correct when the text changes.
9154    
9155     * Thuban/UI/dock.py: New. Classes for the DockPanel and
9156     DockableWindow.
9157    
9158     * Thuban/UI/legend.py: Added some more buttons and made the
9159     LegendPanel a DockPanel.
9160    
9161     * Thuban/UI/mainwindow.py: Added sash windows to the main window
9162     and supporting functions for manipulating the sashes.
9163     (MainWindow.ShowLegend): Create a DockableWindow with the
9164     LegendPanel as the contents.
9165    
9166     * Thuban/UI/messages.py: Added DOCKABLE_* messages
9167    
9168     * Thuban/UI/view.py (MapCanves.SetMap): Listen for LAYER_CHANGED,
9169     not LAYER_LEGEND_CHANGED, messages.
9170    
9171 jonathan 554 2003-03-25 Jonathan Coles <[email protected]>
9172    
9173     * setup.py: Added custom script bdist_rpm_build_script so that
9174     when the rpm is built the path to wx-config is correct.
9175    
9176     * setup.cfg: Added line saying to use the custom build script
9177    
9178 jonathan 552 2003-03-20 Jonathan Coles <[email protected]>
9179    
9180     Initial implementation of the Legend.
9181    
9182     * Thuban/UI/legend.py: New. Creates a window that shows the map's
9183     Legend information and allows the user to add/modify classifications
9184     and how the layers are drawn on the map.
9185    
9186     * setup.py: New command 'build_docs' which currently uses
9187     happydoc to generate html documentation for Thuban.
9188    
9189     * Thuban/Model/classification.py (ClassGroup.GetDisplayText): New.
9190     Returns a string which is appropriately describes the group.
9191    
9192     * Thuban/Model/layer.py (Layer.SetClassification): Generate a
9193     LAYER_CHANGED event instead of a LAYER_LEGEND_CHANGED event.
9194    
9195     * Thuban/Model/map.py (Map): Rename messages and use new, more
9196     specific, messages.
9197    
9198     * Thuban/Model/messages.py: New message to indicate that a layer's
9199     data has changed (LAYER_CHANGED). New map messages to indicate
9200     when layers have been added/removed/changed or if the stacking order
9201     of the layers has changed.
9202    
9203     * Thuban/Model/session.py: Rename and use new messages.
9204    
9205     * Thuban/UI/classifier.py: Remember if any changes have actually
9206     been applied so that if the dialog is cancelled without an application
9207     of changes we don't have to set a new classification.
9208     (ClassDataPreviewer): Pulled out the window specific code and put it
9209     ClassDataPreviewWindow. ClassDataPreviewer can then be used to draw
9210     symbols on any DC.
9211    
9212     * Thuban/UI/mainwindow.py: New code to open the legend.
9213    
9214     * Thuban/UI/view.py: Use new message names.
9215    
9216 jonathan 541 2003-03-19 Jonathan Coles <[email protected]>
9217    
9218     * Thuban/UI/main.py (verify_versions): New. Checks the versions
9219     of Python, wxPython, and some other libraries.
9220    
9221     * extensions/thuban/wxproj.cpp (check_version): Checks the given
9222     version against what wxproj was compiled with.
9223     (check_version_gtk): If wxproj was compiled with gtk then check
9224     the given version against the version of the gtk library
9225     currently being used.
9226    
9227 bh 538 2003-03-14 Bernhard Herzog <[email protected]>
9228    
9229     * test/test_command.py: Run the tests when the module is run as a
9230     script
9231    
9232     2003-03-14 Bernhard Herzog <[email protected]>
9233    
9234     Implement selection of multiple selected shapes in the same layer:
9235    
9236     - Introduce a new class to hold the selection. This basically
9237     replaces the interactor which was nothing more than the
9238     selection anyway. A major difference is of course that the new
9239     selection class supports multiple selected shapes in one layer
9240    
9241     - Move the object that represents the selection from the
9242     application to the canvas. The canvas is a better place than the
9243     application because the selection represents which shapes and
9244     layer of the map displayed by the canvas are selected and
9245     affects how the map is drawn.
9246    
9247     - Make the selection and its messages publicly available through
9248     the mainwindow.
9249    
9250     - The non-modal dialogs do not get a reference to the interactor
9251     anymore as they can simply refer to their parent, the
9252     mainwindow, for the what the interactor had to offer.
9253    
9254     * Thuban/UI/selection.py: New module with a class to represent the
9255     selection.
9256    
9257     * Thuban/UI/messages.py (SELECTED_TABLE, SELECTED_MAP): Remove
9258     these unused messages
9259    
9260     * Thuban/UI/application.py (ThubanApplication.OnInit)
9261     (ThubanApplication.OnExit, ThubanApplication.SetSession): The
9262     interactor is gone now.
9263     (ThubanApplication.CreateMainWindow): There is no interactor
9264     anymore so we pass None as the interactor argument for now for
9265     compatibility.
9266    
9267     * Thuban/UI/view.py (MapCanvas.delegated_messages)
9268     (MapCanvas.Subscribe, MapCanvas.Unsubscribe): In Subscribe and
9269     Unsubscribe, delegate messages according to the delegated_messages
9270     class variable.
9271     (MapCanvas.__getattr__, MapCanvas.delegated_methods): Get some
9272     attributes from instance variables as described with the
9273     delegated_methods class variable.
9274     (MapCanvas.__init__): New instance variable selection holding the
9275     current selection
9276     (MapCanvas.do_redraw): Deal with multiple selected shapes. Simply
9277     pass them on to the renderer
9278     (MapCanvas.SetMap): Clear the selection when a different map is
9279     selected.
9280     (MapCanvas.shape_selected): Simple force a complete redraw. The
9281     selection class now takes care of only issueing SHAPES_SELECTED
9282     messages when the set of selected shapes actually does change.
9283     (MapCanvas.SelectShapeAt): The selection is now managed in
9284     self.selection
9285    
9286     * Thuban/UI/mainwindow.py (MainWindow.delegated_messages)
9287     (MainWindow.Subscribe, MainWindow.Unsubscribe): In Subscribe and
9288     Unsubscribe, delegate messages according to the delegated_messages
9289     class variable.
9290     (MainWindow.delegated_methods, MainWindow.__getattr__): Get some
9291     attributes from instance variables as described with the
9292     delegated_methods class variable.
9293     (MainWindow.__init__): The interactor as ivar is gone. The
9294     parameter is still there for compatibility. The selection messages
9295     now come from the canvas.
9296     (MainWindow.current_layer, MainWindow.has_selected_layer):
9297     Delegate to the the canvas.
9298     (MainWindow.LayerShowTable, MainWindow.Classify)
9299     (MainWindow.identify_view_on_demand): The dialogs don't need the
9300     interactor parameter anymore.
9301    
9302     * Thuban/UI/tableview.py (TableFrame.__init__)
9303     (LayerTableFrame.__init__, LayerTableFrame.OnClose)
9304     (LayerTableFrame.row_selected): The interactor is gone. It's job
9305     from the dialog's point of view is now done by the mainwindow,
9306     i.e. the parent. Subscribe to SHAPES_SELECTED instead
9307     of SELECTED_SHAPE
9308    
9309     * Thuban/UI/dialogs.py (NonModalDialog.__init__): The interactor
9310     is gone. It's job from the dialog's point of view is now done by
9311     the mainwindow, i.e. the parent.
9312    
9313     * Thuban/UI/classifier.py (Classifier.__init__): The interactor is
9314     gone. It's job from the dialog's point of view is now done by the
9315     mainwindow, i.e. the parent.
9316    
9317     * Thuban/UI/tree.py (SessionTreeView.__init__): The interactor is
9318     gone. It's job from the dialog's point of view is now done by the
9319     mainwindow, i.e. the parent.
9320     (SessionTreeCtrl.__init__): New parameter mainwindow which is
9321     stored as self.mainwindow. The mainwindow is need so that the tree
9322     can still subscribe to the selection messages.
9323     (SessionTreeCtrl.__init__, SessionTreeCtrl.unsubscribe_all)
9324     (SessionTreeCtrl.update_tree, SessionTreeCtrl.OnSelChanged): The
9325     selection is now accessible through the mainwindow. Subscribe to
9326     SHAPES_SELECTED instead of SELECTED_SHAPE
9327    
9328     * Thuban/UI/identifyview.py (IdentifyView.__init__): Use the
9329     SHAPES_SELECTED message now.
9330     (IdentifyView.selected_shape): Now subscribed to SHAPES_SELECTED,
9331     so deal with multiple shapes
9332     (IdentifyView.__init__, IdentifyView.OnClose): The interactor is
9333     gone. It's job from the dialog's point of view is now done by the
9334     mainwindow, i.e. the parent.
9335    
9336     * Thuban/UI/controls.py (RecordListCtrl.fill_list): The second
9337     parameter is now a list of shape ids.
9338     (RecordTable.SetTable): The second parameter is now a list of
9339     indices.
9340    
9341     * Thuban/UI/renderer.py (ScreenRenderer.RenderMap): Rename the
9342     selected_shape parameter and ivar to selected_shapes. It's now a
9343     list of shape ids.
9344     (MapRenderer.draw_label_layer): Deal with multiple selected
9345     shapes. Rearrange the code a bit so that the setup and shape type
9346     distinctions are only executed once.
9347    
9348     * test/test_selection.py: Test cases for the selection class
9349    
9350 jonathan 527 2003-03-11 Jonathan Coles <[email protected]>
9351    
9352     * Thuban/Model/load.py: Temporary fix so that the xml reader
9353     doesn't cause Thuban to crash.
9354    
9355     * Thuban/Model/layer.py: Handle the cyclic references between
9356     a layer and its classification better, and be sure to disconnect
9357     the classification from the layer when the layer is destroyed
9358     so that we don't maintain a cyclic reference that may not be
9359     garbage collected.
9360    
9361     * Thuban/Model/classification.py: See comment for layer.py.
9362    
9363 jan 523 2003-03-12 Jan-Oliver Wagner <[email protected]>
9364    
9365     * HOWTO-Release: New. Information on the steps for releasing
9366     a new version of Thuban.
9367    
9368 jonathan 514 2003-03-11 Jonathan Coles <[email protected]>
9369    
9370     * Thuban/UI/classifier.py: Add normal border to SelectPropertiesDialog.
9371     Use True instead of true.
9372     (Classifier): Should have a single panel in which all the controls lie.
9373    
9374     * Thuban/UI/proj4dialog.py: Add normal border.
9375    
9376     * Thuban/UI/tree.py: Fixed problem with bad item images under Windows.
9377    
9378     * Thuban/UI/mainwindow.py: Use True instead of true.
9379    
9380     * setup.py: Update some definitions to use wxWindows2.4 files
9381    
9382     * Data/iceland_sample_class.thuban: Fixed file so that the
9383     field_type information is present.
9384    
9385 jonathan 490 2003-03-10 Jonathan Coles <[email protected]>
9386    
9387 jonathan 505 * Thuban/UI/classifier.py (Classifier.__init__): Make the
9388     field type label grow so that when the text changes the
9389     size is updated correctly. This may be a wxWindows bug.
9390    
9391     2003-03-10 Jonathan Coles <[email protected]>
9392    
9393 jonathan 499 * Thuban/UI/application.py: Changed SESSION_CHANGED to
9394     SESSION_REPLACED.
9395    
9396     * Thuban/UI/classifier.py: Wrap text with _().
9397     (ClassGrid.CreateTable): Set dimensions and size hints here,
9398     instead of in Reset, so we only set the size once.
9399    
9400     * Thuban/UI/dialogs.py: Don't need Shutdown(); just use Close()!
9401    
9402     * Thuban/UI/mainwindow.py (MainWindow.prepare_new_session):
9403     Call Close() instead of Shutdown().
9404    
9405     * Thuban/UI/messages.py: Changed SESSION_CHANGED to SESSION_REPLACED.
9406    
9407     * Thuban/UI/tree.py: Changed SESSION_CHANGED to SESSION_REPLACED.
9408     Go back to using OnClose() instead of Shutdown().
9409    
9410     2003-03-10 Jonathan Coles <[email protected]>
9411    
9412 jonathan 497 * Thuban/UI/classifier.py (Classifier): SelectField() needed
9413     to know the old field index as well as the new one.
9414    
9415     2003-03-10 Jonathan Coles <[email protected]>
9416    
9417 jonathan 495 * Thuban/UI/classifier.py (Classifier): Use __SelectField()
9418     to correctly set the table information and call this from
9419     __init__ and from _OnFieldSelect so that all the information
9420     is up to date when the dialog opens and when a field is changed.
9421    
9422     2003-03-10 Jonathan Coles <[email protected]>
9423    
9424 jonathan 490 * Thuban/Model/classification.py (Classification): Don't use
9425     layer's message function directly, use the ClassChanged() method
9426     when then classification changes. SetField/SetFieldType/SetLayer
9427     must keep the information about field name and field type in
9428     sync when an owning layer is set or removed.
9429    
9430     * Thuban/Model/layer.py: Added ClassChanged() so that the
9431     classification can tell the layer when its data has changed.
9432     (Layer.SetClassification): Accepts None as an arguement to
9433     remove the current classification and correctly handles
9434     adding a new classification.
9435    
9436     * Thuban/Model/load.py: Comment out print statement
9437    
9438     * test/test_classification.py, test/test_save.py: New and
9439     improved tests.
9440    
9441 jonathan 483 2003-03-07 Jonathan Coles <[email protected]>
9442    
9443     * Thuban/Model/classification.py: Implemented __copy__ and
9444     __deepcopy__ for ClassGroup* and ClassGroupProperites so
9445     they can easily be copied by the classifier dialog.
9446     (ClassGroupProperites.__init__): The default line color should
9447     have been Color.Black.
9448    
9449     * Thuban/UI/classifier.py: Setting and Getting table values now
9450     uses a consistent set of functions.
9451     (Classifier): Now non-modal. Has field type label which changes
9452     as the field changes. Keep track of buttons in a list so that
9453     we can enable/disable the buttons when the None field is selected.
9454     (SelectPropertiesDialog): Add buttons to make the colors transparent.
9455    
9456     * Thuban/UI/dialogs.py (NonModalDialog.Shutdown): New method which
9457     does what OnClose did, but can be called by the application to
9458     close a window. Needed when a session changes, and we have to
9459     close the classifier windows.
9460    
9461     * Thuban/UI/mainwindow.py (MainWindow.prepare_new_session):
9462     Shuts down open dialogs. Used when a new session is created
9463     or a session is opened.
9464     (MainWindow.SaveSession): Should only call application.SaveSession()
9465     if we don't call SaveSessionAs first.
9466     (MainWindow.Classify): Allow different classifier dialogs for
9467     different layers.
9468    
9469     * Thuban/UI/tree.py (SessionTreeView): Remove OnClose and let
9470     the parent class handle it. Add Shutdown() to unsubscibe from
9471     event notification and call the parent Shutdown(). This was
9472     necessary so the application can close the tree window.
9473    
9474 jonathan 478 2003-03-06 Jonathan Coles <[email protected]>
9475    
9476     * Thuban/Model/classification.py: Minor documentation changes,
9477     Addition of __eq__ and __ne__ methods.
9478     (Classification.SetLayer): prevent recursion between this method
9479     and Layer.SetClassification().
9480    
9481     * Thuban/Model/color.py: Addition of __eq__ and __ne__ methods.
9482    
9483     * Thuban/Model/layer.py (SetClassification): prevent recursion
9484     between this method and Classification.SetLayer().
9485    
9486     * test/test_classification.py, test/test_load.py,
9487     test/test_session.py: Fixed and added tests for the classification
9488     classes.
9489    
9490 bh 477 2003-03-06 Bernhard Herzog <[email protected]>
9491    
9492     * Thuban/UI/classifier.py (ClassGrid.__init__)
9493     (ClassGrid.CreateTable): Move the SetSelectionMode call to
9494     CreateTable because otherwise it triggers an assertion in
9495     wxPython/wxGTK 2.4.
9496    
9497 jonathan 459 2003-03-05 Jonathan Coles <[email protected]>
9498    
9499 jonathan 475 * Thuban/common.py: Move FIELDTYPE constants back to table.py.
9500 jonathan 471
9501 jonathan 475 * Thuban/Model/load.py: import FIELDTYPE constants from table.
9502 jonathan 471
9503 jonathan 475 * Thuban/UI/classifier.py: import FIELDTYPE constants from table.
9504 jonathan 471
9505 jonathan 475 * Thuban/Model/table.py: Put FIELDTYPE constants back.
9506 jonathan 471
9507     2003-03-05 Jonathan Coles <[email protected]>
9508    
9509 jonathan 459 * Thuban/UI/classifier.py: Added class documentation.
9510     Fixed RTbug #1713, #1714. Added Move[Up|Down] buttons.
9511     Store just the groups in the table and generate the other
9512     column information when it is requested. Add "None" field
9513     to pull-down to select no classification.
9514    
9515     * Thuban/common.py: Moved FIELDTYPE constants from table.py
9516     (Str2Num): Only catch ValueError exceptions.
9517    
9518     * Thuban/Model/classification.py: Class documentation. Renaming
9519     of methods with Stroke to Line. Groups are stored in a single
9520     list with the default as the first element. Groups are searched
9521     in the order they appear in the list.
9522    
9523     * Thuban/Model/color.py: Documentation.
9524    
9525     * Thuban/Model/layer.py (Layer): Add GetFieldType to retreive
9526     the kind of data represented by a field.
9527    
9528     * Thuban/Model/load.py (ProcessSession): Use proper string
9529     conversion function; fixes RTbug #1713.
9530    
9531     * Thuban/Model/save.py (Saver): Store field type information.
9532    
9533     * Thuban/Model/table.py: Put FIELDTYPE constants in common.py.
9534     (Table): Add field_info_by_name() to retrieve field information
9535     by specifying the field name, not the number.
9536    
9537     * Thuban/UI/mainwindow.py: Function name changes.
9538    
9539     * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Only
9540     get the layer classification once. Don't try to classify
9541     values when the field is None: just use the default properties.
9542    
9543     * Thuban/UI/view.py: Function name changes.
9544    
9545     * Doc/thuban.dtd: Add field_type attribute to a classification.
9546    
9547 bh 456 2003-03-04 Bernhard Herzog <[email protected]>
9548    
9549 bh 458 * Doc/thuban.dtd: Use correct syntax for optional attributes. Make
9550     the fill and stroke layer attributes optional with suitable
9551     default values. Add the stroke_width layer attribute. Use correct
9552     syntax for empty elements. Make the attribute list for labels
9553     refer to the label element.
9554    
9555     2003-03-04 Bernhard Herzog <[email protected]>
9556    
9557 bh 456 * setup.py (thuban_build_py.build): Add a comment about distutils in
9558     Python 2.3 containing some of the functionality we implement in
9559     setup.py ourselves.
9560    
9561     * Thuban/UI/classifier.py (ClassGrid.__init__): Set the table
9562     before the selection mode. Doing it the other way round triggers
9563     an assertion in wxWindows.
9564    
9565     * Thuban/Model/save.py (escape): Fix typo in doc-string
9566    
9567     * Thuban/Model/classification.py: Remove unnecessary wxPython
9568     import
9569    
9570 jonathan 448 2003-03-04 Jonathan Coles <[email protected]>
9571    
9572     * Thuban/Model/classification.py (ClassGroupRange.GetProperties):
9573     Parameter 'value' should default to None.
9574    
9575     * Thuban/UI/mainwindow.py: Use Layer.GetClassification() since
9576     the class attribute __classification is now private.
9577    
9578     * Thuban/UI/classifier.py (ClassGrid): Moved OnCellDClick() from
9579     Classifier to ClassGrid. Added support for removing selected rows,
9580     which including code for keeping track of when cells are selected,
9581     and deselected.
9582     (ClassTable): Support for added/removing rows. Fixed a problem
9583     with __ParseInput whereby it would not allow strings (only numbers)
9584     to be entered.
9585     (Classifier): Added button and supporting code for removing
9586     selected rows.
9587    
9588 jonathan 445 2003-02-27 Jonathan Coles <[email protected]>
9589 jonathan 434
9590     * Thuban/common.py: Moved color conversion functions into
9591     Thuban/UI/common.py.
9592     (Str2Num): Now converts the float (not the string) to a long/int
9593     so that an exception isn't thrown.
9594    
9595     * Thuban/UI/common.py: Common functions used in several UI modules
9596    
9597     * Thuban/Model/classification.py: Changed the class hierarchy
9598     so that a Classification consists of Groups which return
9599     Properties when a value matches a Group.
9600    
9601     * Thuban/Model/layer.py: Fixed name resolution problem.
9602    
9603     * Thuban/Model/load.py: Use new Classification and Group functions.
9604    
9605     * Thuban/Model/save.py (Saver.write_attribs): Fixes a test case
9606     failure.
9607     (Saver.write_classification): Use new Classification and Group
9608     functions.
9609    
9610     * Thuban/UI/classifier.py: Changes to use new Classification and Group
9611 jonathan 445 functions. Fix to create a tuple with a single value instead of
9612     simply returning the value.
9613 jonathan 434
9614     * Thuban/UI/renderer.py: Use new Classification and Group functions.
9615     Use common.py functions.
9616    
9617 jonathan 445 * Thuban/UI/tree.py: Use common.py functions.
9618 jonathan 447
9619     * test/test_classification.py: Use new Classification and Group
9620     classes.
9621 jonathan 434
9622 jonathan 426 2003-02-24 Jonathan Coles <[email protected]>
9623    
9624     * Thuban/common.py (Color2wxColour, wxColour2Color): Conversion
9625     functions from Thuban color objects to wxWindow colour objects.
9626    
9627     * Thuban/Model/classification.py (Classification): Renamed
9628     GetProperties() to GetClassData(). Used the new iterator
9629     in TreeInfo().
9630     (ClassIterator): Iterator implementation to iterate over the
9631     ClassData objects in a classification object.
9632    
9633     * Thuban/Model/save.py (Saver.write_classificaton): Uses
9634     the new iterator to save the classification information.
9635    
9636     * Thuban/UI/classifier.py (SelectPropertiesDialog): Support
9637     for changing the stroke and fill colors and previewing the
9638     changes.
9639    
9640     * Thuban/UI/mainwindow.py (MainWindow.OpenSession,
9641     MainWindow.SaveSessionAs): Text string changes so the dialogs
9642     have more meaningful titles.
9643    
9644     * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Change
9645     Classification method name from GetProperties to GetClassData.
9646    
9647     * Thuban/UI/view.py (MapCanvas.find_shape_at): Use method calls
9648     instead of accessing now non-existent class variables.
9649    
9650 bh 425 2003-02-24 Bernhard Herzog <[email protected]>
9651    
9652     * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Remove
9653     unneeded Shape() call. Rendering is substantially faster without
9654     it and it avoids some problems with broken shape files.
9655    
9656 frank 423 2003-02-20 Frank Koormann <[email protected]>
9657    
9658     Force minimal size of identify and label dialogs. The autosizing
9659     looked too ugly.
9660    
9661     * Thuban/UI/controls.py (RecordListCtrl): Set minimal width for columns.
9662     * Thuban/UI/labeldialog.py (LabelDialog.dialog_layout):
9663     Set size of listctrl.
9664     * Thuban/UI/identifyview.py (IdentifyView.__init__):
9665     Set size of dialog.
9666    
9667 jonathan 408 2003-02-19 Jonathan Coles <[email protected]>
9668    
9669     * test/test_classification.py, test/test_layer.py,
9670     test/test_load.py, test/test_map.py, test/test_session.py:
9671     Updated the tests to use the new functions that are in the
9672     respective classes.
9673    
9674     * Thuban/Model/classification.py (Classification):
9675     Uses the new ClassData* classes. Modification messages are
9676     passed up to the parent layer (if it exists).
9677     (ClassData): New class to encapsulate the common data in each
9678     classification property.
9679     (ClassDataDefault): Represents the Default class. data.
9680     (ClassDataPoint): Represents a single class. data point
9681     (ClassDataRange): Represents a class. range
9682     (ClassDataMap): Represents a class. map (unused).
9683    
9684     * Thuban/Model/color.py: Added Color.None to represent something
9685     with no color. Color.Black represents the color black.
9686     (NoColor): Helper class derived from Color to represent something
9687     with no color.
9688    
9689     * Thuban/Model/layer.py (Layer): Removed references to fill, stroke,
9690     stroke_width attributes. Made the 'classification' attribute private.
9691     New methods for setting/getting the classification.
9692    
9693     * Thuban/Model/load.py (ProcessSession): Use new methods on Layer
9694     to get the classifcation and use the new ClassData* classes to
9695     hold the classification data. Use Str2Num to convert numbers
9696     properly.
9697    
9698     * Thuban/Model/save.py (Saver): Use new Color and Classification
9699     methods
9700    
9701     * Thuban/UI/classifier.py (ClassGrid): New class to represent a
9702     custom grid.
9703     (ClassTable): Support for editing Values and Labels and for
9704     changing what type (point or range) of data is stored in each
9705     property based on how the user enters the data.
9706     (Classifier): Support for saving the new classifications and
9707     launching the dialog to edit a property.
9708     (SelectPropertiesDialog): New class for editing the visual
9709     properties of a classification (stroke color, width, and fill color)
9710     (ClassPreviewer): Took the Draw method from ClassRenderer and
9711     made most of it into this new class. Intend to use this class in
9712     the SelectPropertiesDialog for previewing changes.
9713    
9714     * Thuban/UI/renderer.py: Use new Color and Classification methods.
9715    
9716     * Thuban/UI/tree.py: Formatting changes.
9717    
9718     * Doc/thuban.dtd: Add 'label' element
9719    
9720     * Thuban/common.py: New. Contains common routines used throughout
9721     the code.
9722     (Str2Num): Takes a string and converts it to the "best" type of
9723     number.
9724    
9725 bh 405 2003-02-14 Bernhard Herzog <[email protected]>
9726    
9727     * Thuban/UI/view.py (MapCanvas.OnLeftUp): Make sure that the
9728     dragging flag is always set to 0 even when the tool implementation
9729     raises an exception
9730    
9731 bh 402 2003-02-11 Bernhard Herzog <[email protected]>
9732    
9733     * Thuban/UI/application.py (ThubanApplication.splash_screen): New
9734     method to create a splash screen.
9735     (ThubanApplication.ShowMainWindow): New. Show the main window.
9736     Needed so the splash screen can display the mainwindow
9737     (ThubanApplication.OnInit): Call the
9738     new splash_screen method to determine whether the application
9739     should display a splash screen. If it displays a splash screen do
9740     not immediately show the main window.
9741    
9742 jonathan 399 2003-02-11 Jonathan Coles <[email protected]>
9743    
9744     * Thuban/Model/classification.py: Added import line to fix
9745     feature conflicts between running on python2.2 and python2.1.
9746    
9747     * Thuban/UI/classifier.py (ClassTable): Didn't need to hang
9748     onto the clinfo parameter, so removed the deepcopy().
9749    
9750 jonathan 396 2003-02-10 Jonathan Coles <[email protected]>
9751    
9752 tkoester 403 * Thuban/Model/save.py (Saver.open_element, Saver.close_element):
9753 jonathan 396 Added element_open variable to track opening and closing of tags
9754     so that tags that don't span more than one line are closed with
9755     /> instead of </tag_name>. Use the GetDefault*() methods of
9756     the Classification class.
9757    
9758     * Thuban/Model/classification.py (Classificaton): Added set and
9759     get methods for the default data. The class also takes a layer
9760     reference so that modification messages can be sent. Fixed the
9761     methods to use the new ClassData class.
9762     (ClassData): New class to encapsulate the classification data
9763    
9764     * Thuban/Model/layer.py (Layer): Remove the
9765 tkoester 403 Set[Fill|Stroke|StrokeWidth]() methods. Code should call the
9766 jonathan 396 SetDefault*() methods on the layer's classification object.
9767 tkoester 403 (Layer.__init__): Use the new SetDefault*() methods in the
9768 jonathan 396 Classification class.
9769    
9770     * Thuban/Model/load.py (ProcessSession): Use the new ClassData
9771     object instead of a dictionary.
9772    
9773 tkoester 403 * Thuban/UI/classifier.py (ClassRenderer): New class to
9774 jonathan 396 draw the classifications in the dialog box's table.
9775     (Classifier): Modified to use the ClassRenderer class.
9776    
9777 tkoester 403 * Thuban/UI/mainwindow.py (MainWindow): Use the SetDefault*()
9778     methods of the Classification class.
9779 jonathan 396
9780     * Thuban/UI/renderer.py (MapRenderer): Use the Get*() methods
9781     of the ClassData class.
9782    
9783     * test/test_classification.py, test/test_layer.py,
9784     test/test_map.py, test/test_session.py: Fix the tests to work
9785     with the above code changes.
9786    
9787 jonathan 387 2003-02-03 Jonathan Coles <[email protected]>
9788    
9789     * Thuban/Model/classification.py (Classification): Added getNull()
9790     to return the NullData reference
9791    
9792     * Thuban/Model/layer.py (Layer.SetFill, Layer.SetStroke,
9793     Layer.SetStrokeWidth): Modified these functions to change the
9794     null data in the classification rather than keep these values
9795     directly in the Layer class. Menu options to change these values
9796     work again.
9797    
9798 jonathan 380 2003-01-28 Jonathan Coles <[email protected]>
9799    
9800 jonathan 384 * Thuban/UI/classifier.py (Classifier): Resolved merging conflicts.
9801 tkoester 403 Fixed crashing problem on some systems. Dialog box shows
9802 jonathan 380 classification data.
9803    
9804 jonathan 384 * Thuban/UI/tree.py (SessionTreeCtrl.add_items): Handle drawing
9805     Colors in the tree view.
9806    
9807     * Thuban/Model/layer.py (Layer.TreeInfo): Added a call to build
9808     the tree info for classifications. Commented out unnecessary lines.
9809    
9810     * Thuban/Model/classification.py (Classification.TreeInfo): New
9811     function to add information about the classification into the
9812     tree view.
9813    
9814 tkoester 403 2003-01-27 Jan-Oliver Wagner <[email protected]>
9815 jan 375
9816 tkoester 403 * Thuban/__init__.py (_): New.
9817 jan 375
9818     * Thuban/Model/classification.py, Thuban/Model/extension.py,
9819     Thuban/Model/layer.py, Thuban/Model/load.py, Thuban/Model/map.py,
9820 tkoester 403 Thuban/Model/session.py, Thuban/UI/application.py,
9821     Thuban/UI/classifier.py, Thuban/UI/context.py, Thuban/UI/controls.py,
9822     Thuban/UI/identifyview.py, Thuban/UI/labeldialog.py,
9823     Thuban/UI/mainwindow.py, Thuban/UI/menu.py, Thuban/UI/proj4dialog.py,
9824     Thuban/UI/renderer.py, Thuban/UI/tree.py, Thuban/Lib/connector.py,
9825     Thuban/Lib/fileutil.py: Replace user string by _() for i18n.
9826 jan 375
9827 jonathan 370 2003-01-27 Jonathan Coles <[email protected]>
9828    
9829 tkoester 403 * Thuban/Model/layer.py: Classification initialization calls.
9830 jonathan 370
9831 tkoester 403 * Thuban/Model/classification.py: Created class to encapsulate
9832     a layer classification. Supports specific data points and
9833     ranges.
9834 jonathan 370
9835 tkoester 403 * Thuban/Model/load.py: Added support for loading classification
9836     information.
9837 jonathan 370
9838 tkoester 403 * Thuban/Model/save.py: Added support for saving classification
9839     information.
9840 jonathan 370
9841 tkoester 403 * Thuban/UI/classifier.py: Initial class for a dialog box for
9842     specifying classification information.
9843 jonathan 370
9844 tkoester 403 * Thuban/UI/mainwindows.py: Support for opening the classifier
9845     dialog.
9846 jonathan 370
9847 tkoester 403 * Thuban/UI/renderer.py: Support for drawing a layer with the
9848     classification information.
9849 jonathan 370
9850 tkoester 403 * Data/iceland_sample_class.thuban: iceland_sample with
9851     classification data.
9852 jonathan 370
9853 tkoester 403 * test/test_classification: Tests for the Classification class.
9854 jonathan 370
9855 bh 359 2002-12-09 Bernhard Herzog <[email protected]>
9856    
9857 bh 361 * test/test_command.py: New. Tests for the command classes.
9858    
9859 bh 359 * Thuban/UI/command.py (ToolCommand): New class for tool commands.
9860     (Command.IsTool): New method to distinguish between command
9861     switching tools and other commands.
9862    
9863     * Thuban/UI/view.py (MapCanvas.SelectTool): New method to select
9864     the tool to avoid direct assignments to instance variables
9865     (MapCanvas.ZoomInTool, MapCanvas.ZoomOutTool, MapCanvas.PanTool)
9866     (MapCanvas.IdentifyTool, MapCanvas.LabelTool): Use SelectTool to
9867     change the tool
9868    
9869     * Thuban/UI/mainwindow.py (MainWindow.update_command_ui): If an
9870     active tool's command turns insensitive, disable the tool.
9871     (_tool_command): Use the new ToolCommand class
9872    
9873     * Examples/simple_extensions/simple_tool.py (simple_tool): Use the
9874     SelectTool method to change the tool
9875     (iconfile): Use the ToolCommand class
9876    
9877 bh 354 2002-12-03 Bernhard Herzog <[email protected]>
9878    
9879     * Thuban/UI/tree.py (SessionTreeCtrl.normalize_selection): Handle
9880     the case of selected items that are not children of Layers or Maps
9881     properly. Previously this bug would trigger an assertion in
9882     wxWindows.
9883    
9884 frank 352 2002-11-06 Frank Koormann <[email protected]>
9885    
9886 bh 354 * Thuban/UI/mainwindow.py: Altered the order of tools in the
9887     toolbar: First now are all navigation tools (Zoom In/Out, Pan,
9888     Full Extent).
9889 tkoester 403
9890 bh 349 2002-10-23 Bernhard Herzog <[email protected]>
9891    
9892     * setup.py (setup call): version now 0.1.3
9893    
9894     * MANIFEST.in: Add the files in test/
9895    
9896     * test/README: Add note about tests requiring the iceland data
9897    
9898     * Thuban/UI/mainwindow.py (MainWindow.About): Add 2002 to
9899     copyright notice.
9900    
9901 bh 344 2002-10-18 Bernhard Herzog <[email protected]>
9902    
9903     * test/test_map.py
9904     (TestMapWithContents.test_projected_bounding_box): Use an explicit
9905     epsilon.
9906    
9907     * test/support.py (FloatComparisonMixin.assertFloatEqual)
9908     (FloatComparisonMixin.assertFloatSeqEqual): give a more useful
9909     message if the assertion fails and don't return the return value
9910     of self.assert_. In assertFloatSeqEqual the return meant that not
9911     all items of the sequence were compared.
9912    
9913 bh 326 2002-09-20 Bernhard Herzog <[email protected]>
9914    
9915 bh 341 * test/test_fileutil.py: New. Test cases for Thuban.Lib.fileutil
9916    
9917     * Thuban/Lib/fileutil.py: Fixup some whitespace and typos
9918    
9919 bh 338 * test/test_map.py (TestMapWithContents.test_tree_info): Create
9920     the string with the bounding box on the fly because of platform
9921     differences in the way %g is handled.
9922    
9923     * test/test_layer.py (TestLayer.test_empty_layer): Create an empty
9924     DBFfile too because Thuban layers can't yet cope missing DBF
9925     files.
9926    
9927     2002-09-20 Bernhard Herzog <[email protected]>
9928    
9929 bh 326 * test/test_menu.py: Use initthuban instead of
9930     add_thuban_dir_to_path to initialize Thuban.
9931    
9932     * test/support.py (FloatComparisonMixin.assertFloatEqual): New.
9933     Mixin class for float comparisons
9934     (SubscriberMixin): New. Mixin class to test messages sent through
9935     the Connector class
9936    
9937     * test/README: Fix a typo and add the -v flag to the command for
9938     individual tests
9939    
9940 bh 335 * test/test_session.py: New. Test cases for Thuban.Model.session
9941    
9942     * test/test_proj.py: New. Test cases for Thuban.Model.proj
9943    
9944     * test/test_map.py: New. Test cases for Thuban.Model.map
9945    
9946     * test/test_layer.py: New. Test cases for Thuban.Model.layer
9947    
9948     * test/test_label.py: New. Test cases for Thuban.Model.label
9949    
9950     * test/test_connector.py: New. Test cases for Thuban.Lib.connector
9951    
9952     * test/test_color.py: New. Test cases for Thuban.Model.color
9953    
9954     * test/test_base.py: New. Test cases for Thuban.Model.base
9955    
9956 bh 322 2002-09-13 Bernhard Herzog <[email protected]>
9957    
9958     * Thuban/Model/session.py (Session.forwarded_channels): Forward
9959     the CHANGED channel too.
9960    
9961     * Thuban/Model/map.py (Map.forwarded_channels): Forward the
9962     CHANGED channel too.
9963     (Map.__init__): Call the Modifiable constructor as well.
9964    
9965     * Thuban/Model/base.py (Modifiable.UnsetModified): Issue a CHANGED
9966     event if the modified flag changes.
9967     (Modifiable.changed): Tweak the doc-string.
9968    
9969     * Thuban/UI/mainwindow.py (MainWindow.view_position_changed)
9970     (MainWindow.set_position_text): Put the code that puts the text
9971     with the mouse position into the status bar into the new method
9972     set_position_text so that it can overwritten in derived classes.
9973    
9974 bh 317 2002-09-12 Bernhard Herzog <[email protected]>
9975    
9976     * Thuban/UI/mainwindow.py (MainWindow.RunMessageBox): Center the
9977     message box on the main window.
9978    
9979 bh 313 2002-09-11 Bernhard Herzog <[email protected]>
9980    
9981     * Thuban/UI/mainwindow.py: Underline the 'x' in "Exit" instead of
9982     the 'E' because it's less likely to interfere with other menu
9983     entries.
9984 bh 315 (MainWindow.build_menu): remove an incorrect comment.
9985 bh 313
9986 bh 311 2002-09-10 Bernhard Herzog <[email protected]>
9987    
9988     * Thuban/UI/mainwindow.py (MainWindow.Map): New.
9989     (_tool_command): Add sensitive parameter
9990     (_has_visible_map): Sensitivity callback to tools and other
9991     commands that require a visible map. Use it in map_zoom_in_tool,
9992     map_zoom_out_tool, map_pan_tool, map_identify_tool, map_label_tool
9993     and map_full_extent
9994    
9995 bh 308 2002-09-06 Bernhard Herzog <[email protected]>
9996    
9997     * Thuban/UI/mainwindow.py (MainWindow.OnClose): Unsubscribe
9998     VIEW_POSITION
9999    
10000 tkoester 403 2002-09-04 Frank Koormann <[email protected]>
10001 frank 306
10002     * Resources/Bitmaps/fullextent.xpm: Updated Icon (removed "potatoe")
10003    
10004 bh 302 2002-09-02 Bernhard Herzog <[email protected]>
10005    
10006 bh 304 * Thuban/UI/view.py: Get rid of the idle redraw. This is done by
10007     wxWindows already and our implementation doesn't work correctly
10008     with wxGTK 2.3:
10009     (MapCanvas.__init__): Remove the instance variable
10010     (MapCanvas.OnPaint): Always call do_redraw when there's a map to
10011     be drawin
10012     (MapCanvas.OnIdle): Removed.
10013    
10014 bh 302 * Thuban/UI/view.py (MapCanvas.unprojected_rect_around_point): Add
10015     a parameter to determine the size of the rectangle.
10016     (MapCanvas.find_shape_at): Create the box around the point on a
10017     layer by layer basis and make the size depend on the shape type.
10018     This solves a problem with the selection of point shapes at the
10019     border of the layer's bounding box
10020    
10021 bh 292 2002-08-30 Bernhard Herzog <[email protected]>
10022    
10023 bh 300 * Thuban/UI/mainwindow.py (MainWindow.CanRemoveLayer): New method
10024     for the sensitivity of remove layer.
10025     (_can_remove_layer): New. Sensitivity callback for remove layer
10026     (Command layer_remove): Use _can_remove_layer
10027    
10028     * Thuban/Model/map.py (Map.CanRemoveLayer): New method to
10029     determine whether a given layer can be deleted.
10030    
10031 bh 297 * Thuban/UI/view.py (MapCanvas.__init__, MapCanvas.OnPaint)
10032     (MapCanvas.do_redraw): Get rid of the unused update_region
10033     instance variable
10034    
10035 bh 294 * Thuban/UI/view.py: Add/update some doc-strings.
10036    
10037 bh 292 * test/: new subdirectory with a bunch of unit tests.
10038    
10039     * test/README, test/test_table.py, test/test_save.py,
10040     test/test_menu.py, test/test_load.py: Initial set of tests and
10041     brief instructions on how to run them
10042    
10043 bh 287 2002-08-29 Bernhard Herzog <[email protected]>
10044    
10045 bh 291 * Thuban/UI/renderer.py (ScreenRenderer.draw_shape_layer): Handle
10046     arcs with multiple parts.
10047    
10048 bh 289 * Thuban/UI/view.py (ZoomInTool.MouseUp, ZoomOutTool.MouseUp):
10049     Handle degenrate rectangles.
10050    
10051 bh 287 * Thuban/Model/table.py: Make writing records work correctly:
10052     (Table.__init__): Keep track of whether the DBF is open for
10053     writing
10054     (Table.write_record): Open the DBF file for writing when necessary
10055    
10056 bh 285 2002-08-27 Bernhard Herzog <[email protected]>
10057    
10058     * Thuban/Model/table.py (Table.write_record, Table.__init__): Open
10059     dbf files only for reading by default. Use a new writable dbf
10060     object for writing.
10061    
10062 bh 278 2002-08-26 Bernhard Herzog <[email protected]>
10063    
10064 bh 282 * Thuban/UI/mainwindow.py: Refactor the context creation:
10065     (MainWindow.Context): New method to return a context
10066     (MainWindow.invoke_command, MainWindow.update_command_ui): Use the
10067     new method
10068    
10069 bh 278 * Thuban/UI/tableview.py (TableGrid, LayerTableGrid): Split the
10070     layer table specific code from TableGrid into LayerTableGrid
10071     (TableFrame, LayerTableFrame): Split the layer table specific code
10072     from TableFrame into LayerTableFrame
10073 bh 280 (LayerTableGrid.select_shape): Remove a debug print
10074 bh 278
10075     * Thuban/UI/mainwindow.py (MainWindow.LayerShowTable): Use the
10076     LayerTableFrame
10077    
10078 bh 277 2002-08-23 Bernhard Herzog <[email protected]>
10079    
10080     * Thuban/Model/layer.py (Layer.__init__): Make sure we have an
10081     absolute filename.
10082    
10083 bh 269 2002-08-22 Bernhard Herzog <[email protected]>
10084    
10085 bh 275 * Thuban/Model/table.py (Table.write_record): New method to write
10086     records.
10087 tkoester 403 (Table.__init__): Open the DBF file for writing too.
10088 bh 275
10089     * Thuban/UI/controls.py (RecordTable.SetValue): Write the value
10090     into the underlying table.
10091    
10092     * extensions/shapelib/shapefil.h (DBFCommit),
10093     extensions/shapelib/dbfopen.c (DBFCommit): New API function to
10094     commit any changes made to the DBF file.
10095    
10096 bh 271 * Thuban/UI/mainwindow.py (make_check_current_tool)
10097     (_tool_command): Put the code that generates the "checked"
10098     callback into a separate function so that we can reuse it
10099     elsewhere
10100    
10101 bh 269 * Thuban/Model/save.py (Saver): New class to handle serializing a
10102     session into an XML file. The main reason to introduce a class is
10103     that applications built on Thuban can derive from it so that they
10104     can save additional information in a session file.
10105     (save_session): Delegate almost all the work to the Saver class.
10106     Rename the filename argument to file because it may be a file like
10107     object now.
10108    
10109     * Thuban/Model/load.py: Get rid of the Python 1.5.2 compatibility
10110     code. Remove the little test code which would be executed when the
10111     module is run as a script which didn't work anymore since it can't
10112     import the other Thuban modules.
10113     (ProcessSession, load_session): Refactor the ProcessSession to
10114     have one method for each element start and end tag so that derived
10115     classes can easily override the processing of individual tags.
10116     Also, always parse with namespaces enabled because applications
10117     built on top of Thuban will likely use namespaces if they extend
10118     the session file format.
10119    
10120 bh 266 2002-08-21 Bernhard Herzog <[email protected]>
10121    
10122     * setup.py (ThubanInstall.run): Don't repr install_lib_orig
10123     because thubaninit_contents will do it for us.
10124    
10125 tkoester 403 2002-08-16 Jan-Oliver Wagner <[email protected]>
10126 jan 265
10127     * Thuban/UI/mainwindow.py: menu item 'show session tree' now disable if
10128     tree window already open
10129    
10130 bh 259 2002-08-15 Bernhard Herzog <[email protected]>
10131    
10132 bh 263 * Thuban/Model/layer.py (Layer.Destroy): Call the unboundd method
10133     with self.
10134    
10135     * Thuban/UI/view.py (MapCanvas.OnLeftUp): Only release the mouse
10136     when we have actually captured it.
10137    
10138 bh 259 * Thuban/Model/layer.py (Layer.Destroy): New. Explicitly close the
10139     shapefile and destroy the table.
10140    
10141     * Thuban/Model/table.py (Table.Destroy): New. Close the DBF file.
10142    
10143 bh 254 2002-08-14 Bernhard Herzog <[email protected]>
10144    
10145 bh 256 * Thuban/UI/controls.py (RecordTable.__init__): Remove the unused
10146     instance variable columns
10147     (RecordTable.GetTypeName): row and col may be negative in some
10148     cases.
10149    
10150 bh 254 * setup.py (InstallLocal.initialize_options)
10151     (InstallLocal.finalize_options, InstallLocal.user_options): New
10152     option create-init-file to build a thubaninit.py when running
10153     install_local
10154     (InstallLocal.run): Create the thubaninit.py module when requested
10155     (thubaninit_contents): Split the template into several parts and
10156     create a new function thubaninit_contents that creates the
10157     contents of a thubaninit module.
10158     (ThubanInstall.run): Use the new function to create the thubaninit
10159     module.
10160    
10161 bh 252 2002-07-30 Bernhard Herzog <[email protected]>
10162    
10163     * Thuban/UI/application.py (ThubanApplication.OnExit): Do some
10164     cleanup.
10165     (ThubanApplication.MainLoop): Extend to automatically call OnExit.
10166    
10167     * Thuban/Model/session.py (Session.Destroy): Don't bypass the
10168     direct base class' Destroy method.
10169    
10170     * Thuban/Model/map.py (Map.ClearLayers): New method to delete all
10171     layers.
10172     (Map.Destroy): Destroy the label_layer as well and call the
10173     inherited Desatroymethod first so that no more messages are
10174     issued.
10175     (Map.RaiseLayer, Map.LowerLayer): Only issue LAYERS_CHANGED
10176     message if the stacking order actually has changed. Add
10177     doc-strings.
10178     (Map.BoundingBox): Correct the doc-string.
10179     (Map.AddLayer, Map.RemoveLayer, Map.Layers, Map.HasLayers)
10180     (Map.ProjectedBoundingBox, Map.SetProjection): Add doc-strings.
10181    
10182     * Thuban/Model/label.py (LabelLayer.ClearLabels): New to delete
10183     all labels.
10184    
10185 bh 247 2002-07-29 Bernhard Herzog <[email protected]>
10186    
10187     * Thuban/Model/map.py (Map.subscribe_layer_channels)
10188     (Map.unsubscribe_layer_channels): Put the code that (un)subscribes
10189     to a layer's channels into separate methods.
10190     (Map.RemoveLayer, Map.AddLayer): Call the new methods
10191     (Map.Destroy): Unsubscribe from a layer's channels before
10192     destroying it.
10193    
10194     * Thuban/UI/view.py (MapCanvas.find_shape_at): Change the
10195     selected_layer parameter to searched_layer which is the layer to
10196     search in.
10197     (MapCanvas.SelectShapeAt): New parameter layer to restrict the
10198     search to that layer. Return the selected layer and shape.
10199    
10200     * Examples/simple_extensions/simple_tool.py (simple_tool): Fix a
10201     typo
10202    
10203 bh 238 2002-07-24 Bernhard Herzog <[email protected]>
10204    
10205 bh 243 * Thuban/UI/application.py (ThubanApplication.create_session):
10206     Extend the doc string.
10207     (ThubanApplication.subscribe_session)
10208     (ThubanApplication.unsubscribe_session): New methods to
10209     subscribe/unsubscribe to/from session channels.
10210     (ThubanApplication.SetSession): Call the new methods here.
10211     (ThubanApplication.maps_changed, ThubanApplication.set_map):
10212     Renamed set_map to maps_changed. Its now a subscriber for
10213     MAPS_CHANGED.
10214    
10215     * Thuban/UI/view.py (ZoomOutTool.MouseUp): Use the correct
10216     x-coordinate in case of simple clicks
10217    
10218     * Thuban/Model/base.py (Modifiable.changed): Apply the args tuple,
10219     don't pass it as a parameter
10220    
10221     * Thuban/Model/session.py (Session.RemoveMap): New
10222    
10223 bh 238 * Thuban/UI/mainwindow.py (MainWindow.__init__): Turn the initial
10224     window size into a parameter.
10225    
10226 bh 235 2002-07-23 Bernhard Herzog <[email protected]>
10227    
10228 bh 237 * Thuban/UI/menu.py (Menu.item_index): Also search for menus not
10229     just commands.
10230    
10231 bh 235 * Thuban/UI/mainwindow.py (MainWindow.__init__): Change the
10232     parameter list a bit to allow setting the window title and the
10233     initial message in the status bar. Update the callers.
10234    
10235     * Thuban/UI/application.py (ThubanApplication.OnInit)
10236     (ThubanApplication.CreateMainWindow): Put the mainwindow
10237     instantiation into a separate method so that it can be overridden
10238     by a subclass.
10239    
10240 bh 230 2002-07-19 Bernhard Herzog <[email protected]>
10241    
10242 bh 234 * Thuban/Model/session.py: Issue a CHANGED message every time
10243     another changed message is issued to make it easier to get
10244     notified of changes.
10245     (Session): Update the doc string
10246     (Session.forward): Issue changed-events as CHANGED as well.
10247     (Session.changed): Overwrite the inherited version to issue
10248     CHANGED events as well.
10249    
10250     * Thuban/UI/tree.py: We can now simply subscribe to the session's
10251     CHANGED channel to be informed of changes.
10252     (SessionTreeCtrl.session_channels): Not needed any longer.
10253 tkoester 403 (SessionTreeCtrl.unsubscribe_all, SessionTreeCtrl.session_changed):
10254 bh 234 Only have to (un)subscribe CHANGED
10255    
10256     * Thuban/Model/map.py (Map.TreeInfo): Deal better with empty maps.
10257    
10258 bh 230 * Thuban/UI/main.py, Thuban/UI/__init__.py: Move the work-around
10259     for the wxPython locale bug to __init__.py so that it's
10260     automatically executed by anybody using UI code from Thuban.
10261    
10262 bh 225 2002-07-18 Bernhard Herzog <[email protected]>
10263    
10264 bh 228 * Thuban/UI/main.py (main): app no longer needs to be global
10265    
10266     * Thuban/UI/mainwindow.py (MainWindow.__init__): Add application
10267     as parameter and store it in an instance variable
10268     (MainWindow.invoke_command, MainWindow.update_command_ui)
10269     (MainWindow.save_modified_session, MainWindow.NewSession)
10270     (MainWindow.OpenSession, MainWindow.SaveSession)
10271     (MainWindow.SaveSessionAs, MainWindow.ShowSessionTree): Use self's
10272     application object.
10273    
10274     * Thuban/UI/application.py (ThubanApplication.OnInit): Instantiate
10275     the main window with self.
10276    
10277 bh 225 * Thuban/UI/context.py: New module with the context class
10278    
10279     * Thuban/UI/command.py (Command): Update doc string.
10280    
10281     * Thuban/UI/mainwindow.py (MainWindow.invoke_command,
10282     MainWindow.update_command_ui): Pass an instance of the context
10283     class to the command's methods
10284     (check_current_tool, call_method): Handle the new context
10285     implementation
10286    
10287     * Examples/simple_extensions/simple_tool.py (simple_tool,
10288     check_simple_tool): Handle the new context implementation
10289    
10290     * Examples/simple_extensions/simple_command.py (simple_command):
10291     Handle the new context implementation. Update the comments about
10292     the context.
10293    
10294     * Thuban/UI/application.py (ThubanApplication.SetSession): Add
10295     doc-string
10296     (ThubanApplication.Session): New method to return the session
10297     object
10298    
10299     * Thuban/UI/tree.py (SessionTreeCtrl.update_tree): The
10300     interactor's selected_layer may not be a layer of the current
10301     session when the tree is updated while a new session is being set.
10302    
10303 bh 217 2002-07-17 Bernhard Herzog <[email protected]>
10304    
10305     * Thuban/UI/tree.py (color_string): Removed. No longer used.
10306     (SessionTreeCtrl.update_tree, SessionTreeCtrl.add_items): Split
10307     update_tree into update_tree and add_items. The tree now uses a
10308     more generic way to display the contents of the tree.
10309     (SessionTreeCtrl): Add a doc string explaining the TreeInfo method
10310    
10311     * Thuban/Model/layer.py (Layer.TreeInfo),
10312     Thuban/Model/extension.py (Extension.TreeInfo),
10313     Thuban/Model/map.py (Map.TreeInfo),
10314 tkoester 403 Thuban/Model/session.py (Session.TreeInfo):
10315 bh 217 Add TreeInfo methods to implement the new tree view update scheme
10316    
10317 bh 216 2002-07-16 Bernhard Herzog <[email protected]>
10318    
10319     * Thuban/UI/application.py: Don't use "import from" for the
10320     MainWindow. It can't always be resolved.
10321     (ThubanApplication.OnInit): change reference to MainWindow
10322     accordingly.
10323    
10324     * Thuban/UI/menu.py (Menu.SetItems): New method to replace a menu
10325     completely
10326    
10327 bh 213 2002-07-10 Bernhard Herzog <[email protected]>
10328    
10329     * setup.py (create_init_module): New configurable variable whose
10330     default depends on the platform we're running on.
10331     (ThubanInstall.initialize_options): Initialize
10332     self.create_init_module from the global create_init_module
10333     (ThubanInstall.user_options): indictate that the options
10334     create-init-module and init-module-dir have arguments.
10335    
10336     * setup.py: In the setup call change the version number to include
10337     cvs.
10338    
10339     * MANIFEST.in: Add the files in Examples
10340    
10341 bh 205 2002-07-09 Bernhard Herzog <[email protected]>
10342    
10343 bh 210 * setup.py: In the setup call, use the thuban homepage as the
10344     value of the url parameter.
10345    
10346 bh 208 * Examples: New subdirectory for examples.
10347    
10348     * Examples/simple_extensions/simple_tool.xpm,
10349     Examples/simple_extensions/simple_tool.py,
10350     Examples/simple_extensions/simple_command.py,
10351     Examples/simple_extensions/README: Simple examples showing how to
10352     add new commands and tools.
10353    
10354 bh 207 * setup.cfg (bdist_rpm): Add the default value for prefix and tell
10355     bdist_rpm that we also have an install script.
10356     (bdist_inno): Add 2002 to the copyright notice.
10357    
10358 bh 205 * setup.py: Create a file in python's site-packages directory to
10359     make installation of Thuban as a library easier.
10360     (ThubanInstall.user_options): Add two new options,
10361     create-init-module and init-module-dir
10362     (ThubanInstall.expand_with_pure_python_dirs): New method to expand
10363     filenames for installation in the default directories.
10364     (ThubanInstall.select_scheme, ThubanInstall.convert_paths): Extend
10365     the inherited methods to capture some filenames before they're
10366     transformed too much by distutils.
10367     (ThubanInstall.run): Create the init module if requested.
10368     (ThubanInstall.thuban_init_filename): New method to return the
10369     full name of the init module.
10370     (ThubanInstall.get_outputs): Append the filename of the init
10371     module.
10372    
10373 bh 202 2002-07-08 Bernhard Herzog <[email protected]>
10374    
10375 bh 205 * setup.py (thuban_bdist_rpm): Extend this version of bdist_rpm to
10376     handle the prefix properly which means that the default for the
10377     installation prefix should be /usr for RPMs and /usr/local when
10378     doing a normal source install.
10379     (bdist_rpm_install_script): Script to override the default install
10380     commands in the specfile generated by the bdist_rpm command.
10381     (thuban_bdist_rpm.user_options): Add a prefix option
10382     (thuban_bdist_rpm.initialize_options): Init the prefix option.
10383     Create the script files for the spec files as empty files here
10384     (thuban_bdist_rpm._make_spec_file): Override the inherited method
10385     to fill the script files with content.
10386    
10387 bh 202 * Thuban/Model/save.py (relative_filename): Wrapper around
10388     Thuban.Lib.fileutil.relative_filename that accepts an empty dir
10389     argument. save_session now automatically uses this version,
10390     solving a problem when saving to a relative filename.
10391    
10392     * setup.py: In the setup call, make sure that the library
10393     directories are under $prefix/lib not directly under $prefix.
10394    
10395 tkoester 403 2002-06-20 Jan-Oliver Wagner <[email protected]>
10396 jan 199
10397     * Thuban/Model/extension.py: new module to handle extension objects.
10398     * Thuban/Model/messages.py: new messages for extensions.
10399     * Thuban/Model/session.py (Session.Extensions, Session.HasExtensions,
10400     Session.AddExtension): new for handling extensions.
10401     Also some other minor changes to round up extension handling.
10402     * Thuban/UI/tree.py (SessionTreeCrtl:update_tree): Added visualization
10403     of Extension titles and title and names of its objects.
10404    
10405 bh 194 2002-05-29 Bernhard Herzog <[email protected]>
10406    
10407     * Thuban/UI/mainwindow.py (MainWindow.bind_command_events): Bind
10408 bh 202 the events for a command.
10409 bh 194 (MainWindow.add_toolbar_command, MainWindow.add_menu_command):
10410     Call bind_command_events to bind the events. add_toolbar_command
10411     can now bind events too so that it's possible to have commands
10412     that are only available through the toolbar.
10413     (MainWindow.init_ids): New instance variable events_bound to keep
10414     track of for which commands events have been bound.
10415    
10416 bh 190 2002-05-28 Bernhard Herzog <[email protected]>
10417    
10418     * Thuban/UI/menu.py: New module to build and manage menus.
10419    
10420     * Thuban/UI/mainwindow.py: Remove some unused imports.
10421     (MainWindow.__init__, main_menu): move the definition of the main
10422     menu from __init__ to the Menu instance main_menu.
10423     (MainWindow.build_menu_bar, MainWindow.build_menu): New methods to
10424     build the menu bar and sub-menus from a menu description.
10425    
10426     * Thuban/UI/application.py (ThubanApplication.OnInit): Read the
10427     startup file
10428     (ThubanApplication.read_startup_files): New method to run
10429     ~/.thuban/thubanstart.py
10430    
10431 bh 192 * Thuban/UI/mainwindow.py (MainWindow.__init__, main_toolbar):
10432     Move the toolbar definition to the Menu instance main_toolbar.
10433     (MainWindow.build_toolbar): New method to build the toolbar
10434     similar to the build_menu methods
10435    
10436 bh 184 2002-05-23 Bernhard Herzog <[email protected]>
10437    
10438 bh 186 * Thuban/UI/mainwindow.py (MainWindow.__init__): Fix spelling of
10439     layer_outline_color. Fix it in the definition of the command too.
10440    
10441 bh 184 * Thuban/UI/command.py (Command): Fix typo in doc string
10442    
10443 bh 182 2002-05-22 Bernhard Herzog <[email protected]>
10444    
10445     * Thuban/UI/mainwindow.py (MainWindow.RunMessageBox): Fix a typo
10446     in the docstring
10447    
10448 bh 175 2002-05-15 Bernhard Herzog <[email protected]>
10449    
10450 bh 180 * Thuban/Model/layer.py (Layer.open_shapefile): Set bbox to None
10451     when the shapefile is empty.
10452     (Layer.BoundingBox, Layer.LatLongBoundingBox): Both methods may
10453     now return None for empty shapefiles. Update doc-strings.
10454    
10455     * Thuban/Model/map.py (Map.BoundingBox): Add doc-string. Deal with
10456     the layer's bbox being None.
10457    
10458     * Thuban/UI/tree.py (SessionTreeCtrl.update_tree): Deal with the
10459     layer's bbox being None.
10460    
10461 bh 175 * Thuban/UI/view.py (MapCanvas.shape_selected): Only redraw when
10462     necessary.
10463     (MapCanvas.__init__): New instance variables, last_selected_layer
10464     and last_selected_shape to determine how the selection has
10465     changed.
10466    
10467     * Thuban/UI/tableview.py (TableGrid.__init__): Do not call
10468     AutoSizeColumns because it will cause a traversal of the entire
10469     table which for large .dbf files will take a very long time.
10470    
10471 bh 172 2002-05-14 Bernhard Herzog <[email protected]>
10472    
10473     * Thuban/Model/layer.py (Layer.open_shapefile): Choose a better
10474     maximum depth for the tree than shapelib does by default.
10475    
10476 bh 165 2002-05-10 Bernhard Herzog <[email protected]>
10477    
10478     * setup.py (py_modules): The shptree modules doesn't have a
10479     wrapper, so don't include it in the py_modules
10480    
10481 bh 163 2002-05-08 Bernhard Herzog <[email protected]>
10482    
10483     * extensions/shapelib/shptree.c (compare_ints): Make arguments
10484     const void * as in the qsort prototype
10485     (SHPTreeFindLikelyShapes): Remove some unused variables.
10486    
10487     * Thuban/UI/view.py (PanTool.MouseMove): Use the bitmap the view
10488     maintains to redraw the window during a drag.
10489     (MapCanvas.unprojected_rect_around_point): New method to determine
10490     a small region around a point for hit-testing.
10491     (MapCanvas.find_shape_at): Only test the shapes in a small region
10492     around the point.
10493    
10494     * setup.py: Increment the version to 0.1.2
10495    
10496     * Thuban/UI/tree.py (SessionTreeCtrl.unsubscribe_all): Remove a
10497     debug print and set session to None after unsubscribing
10498    
10499 bh 146 2002-05-07 Bernhard Herzog <[email protected]>
10500    
10501 bh 154 * Data/iceland_sample.session, Data/iceland_sample.thuban: Rename
10502     the file to have a .thuban extension.
10503    
10504 bh 152 * Thuban/UI/tree.py (session_channels): New class constant with
10505     all the session channels to subscribe to to update the tree
10506     (SessionTreeCtrl.session_changed): Remember the session so that we
10507     can unsubscribe properly. Use the new class constant to
10508     unsubscribe from the old session and subscribe to the new one.
10509     (SessionTreeCtrl.unsubscribe_all): New method to unsubscribe all
10510     subscriptions of the SessionTreeCtrl.
10511     (SessionTreeView.OnClose): Call the tree's unsubscribe_all method.
10512    
10513     * Thuban/UI/mainwindow.py (MainWindow.__init__): Add the "Show
10514     Session Tree" command to the file menu.
10515    
10516     * Thuban/UI/view.py (MapCanvas.do_redraw): Pass the entire bitmap
10517     as update_region to the renderer.
10518    
10519     * Thuban/UI/renderer.py
10520     (ScreenRenderer.layer_ids, ScreenRenderer.draw_shape_layer): The
10521     update box is now directly a tuple, not a wxRect anymore.
10522    
10523     * Thuban/Model/layer.py (Layer.ShapesInRegion): Remove some debug
10524     prints.
10525    
10526     2002-05-07 Bernhard Herzog <[email protected]>
10527    
10528 bh 146 * setup.py: Add the shptree extension module. See
10529     extensions/pyshapelib/ChangeLog for more details.
10530    
10531     * extensions/shapelib/shpopen.c, extensions/shapelib/shapefil.h,
10532     extensions/shapelib/dbfopen.c: Really update to the versions of
10533     shapelib 1.2.9. For some reason it wasn't really done on
10534     2002-04-11.
10535    
10536     * extensions/shapelib/shptree.c: Modified version of shptree.c of
10537     shapelib 1.2.9. The only real difference is the use of qsort
10538     instead of a bubble sort implementation
10539    
10540     * Thuban/Model/layer.py (Layer.__init__): New instance variable
10541     shapetree to hold the shapelib quadtree for the shapefile
10542     (Layer.open_shapefile): Create the quad tree.
10543     (Layer.ShapesInRegion): New method to return the ids of shapes in
10544     a given region using the quad tree.
10545    
10546     * extensions/thuban/wxproj.cpp (project_points): Fix some typos in
10547     comment
10548     (draw_polygon_shape): Accept both arcs and polygons.
10549     (initwxproj): Use the new PYSHAPELIB_IMPORT_API macro to import
10550     the api.
10551    
10552     * Thuban/UI/renderer.py (MapRenderer.layer_ids): New method to
10553     return the shape ids to be rendered in a given layer.
10554     (MapRenderer.draw_shape_layer): Call layer_ids to get the list of
10555     ids. Use draw_polygon_shape to draw arc shapes as well.
10556     (ScreenRenderer.RenderMap): New parameter for the rectangle that
10557     has to be updated
10558     (ScreenRenderer.layer_ids): Make use of the layer's quadtree by
10559     calling it's ShapesInRegion method.
10560    
10561     * Thuban/UI/view.py (MapCanvas.__init__): New instance variable
10562     update_region for the update region.
10563     (MapCanvas.OnPaint): Maintain the update region
10564     (MapCanvas.do_redraw): Pass the bounding box of the update_region
10565     to the renderer when drawing the bitmap. Reset the update_region.
10566    
10567 bh 129 2002-05-03 Bernhard Herzog <[email protected]>
10568    
10569 bh 131 * Thuban/UI/mainwindow.py (MainWindow.SaveSessionAs,
10570     MainWindow.OpenSession): Change the file extension of the session
10571     files to .thuban
10572    
10573 bh 129 * Thuban/Model/session.py (Session.AddMap, forwarded_channels):
10574     Move the map channels to be forwarded by the session into the
10575 bh 146 class constant with forwarded_channels. Also add
10576     LAYER_PROJECTION_CHANGED and LAYER_VISIBILITY_CHANGED to
10577     forwarded_channels
10578 bh 129
10579     * Thuban/Model/base.py (Modifiable.changed): Fix doc-string (a
10580     typo and some rewording).
10581    
10582 bh 126 2002-05-02 Bernhard Herzog <[email protected]>
10583    
10584     * Thuban/UI/view.py: Keep the temporary bitmap used during drawing
10585     around to speed up most redraws:
10586     (MapCanvas.__init__): New instance variable bitmap which holds the
10587     bitmap
10588     (MapCanvas.do_redraw): Redraw self.bitmap if necessary. Use
10589     self.bitmap to draw.
10590     (MapCanvas.full_redraw): New method to force a full redraw
10591     including the bitmap
10592     (MapCanvas.SetMap): Subscribe full_redraw instead of redraw to
10593     make sure the bitmap is redrawn.
10594     (MapCanvas.projection_changed, MapCanvas.set_view_transform,
10595     MapCanvas.shape_selected): Call full_redraw instead of readraw to
10596     make sure the bitmap is redrawn.
10597     (MapCanvas.OnSize): New method to handle size events so that the
10598     bitmap can be redrawn.
10599    
10600 bh 124 2002-04-29 Bernhard Herzog <[email protected]>
10601    
10602     * Thuban/UI/mainwindow.py (MainWindow.__init__): Subscribe to the
10603     canvas' VIEW_POSITION event
10604     (MainWindow.view_position_changed): Handler for VIEW_POSITION.
10605     Update the text in the status-bar accordingly.
10606    
10607     * Thuban/UI/view.py (MapCanvas): Derive from Publisher as well
10608     (MapCanvas.__del__): Implement because Publisher.__del__ has to be
10609     called.
10610     (MapCanvas.__init__): Bind EVT_LEAVE_WINDOW too. Initialize
10611     current_position
10612     (MapCanvas.set_current_position): New method to set
10613     current_position. Issue a VIEW_POSITION event
10614     (MapCanvas.CurrentPosition): New public method to return the value
10615     of current_position. Should be called when the VIEW_POSITION event
10616     is processed.
10617     (MapCanvas.OnLeftDown, MapCanvas.OnLeftUp, MapCanvas.OnMotion):
10618     Update the position.
10619     (MapCanvas.OnLeaveWindow): Set the position to None.
10620    
10621     * Thuban/UI/messages.py (VIEW_POSITION): New message for the
10622     position in the statusbar
10623    
10624 tkoester 403 2002-04-26 Frank Koormann <[email protected]>
10625 frank 120
10626     * Thuban/UI/mainwindow.py: AddLayer, Dialog title s/session/data
10627    
10628 tkoester 403 2002-04-24 Frank Koormann <[email protected]>
10629    
10630 frank 118 * Resources/Bitmaps/identify.xpm: shadow added
10631    
10632     * Resources/Bitmaps/fullextent.xpm: new
10633 jan 116
10634 tkoester 403 2002-04-22 Jan-Oliver Wagner <[email protected]>
10635 jan 116
10636 tkoester 403 * Thuban/UI/tree.py (update_tree): added test for None on map bounding
10637     box
10638 jan 114
10639 tkoester 403 2002-04-21 Jan-Oliver Wagner <[email protected]>
10640    
10641 jan 114 * Thuban/UI/proj4dialog.py (UTMProposeZoneDialog): new
10642    
10643     * Thuban/UI/tree.py (update_tree): added added map extent
10644    
10645     * Thuban/UI/mainwindow.py (_method_command): extended by parameter
10646 tkoester 403 icon; added map_full_extend as tool
10647 jan 114
10648 tkoester 403 2002-04-19 Jan-Oliver Wagner <[email protected]>
10649 jan 107
10650     * Thuban/UI/mainwindow.py (SaveSession): launch save as dialog for
10651     saving _new_ sessions
10652    
10653     * Thuban/Model/session.py (create_empty_session): new session
10654     don't have a filename (set to None)
10655    
10656     * Thuban/UI/tree.py (update_tree): added filename and modified flag
10657    
10658     * Thuban/Model/load.py (ProcessSession): convert projection
10659     parameters from unicode to regular string
10660    
10661     * Data/iceland_sample.session: Added UTM Zone 26 projection.
10662    
10663 bh 100 2002-04-11 Bernhard Herzog <[email protected]>
10664    
10665     * extensions/shapelib/shapefil.h, extensions/shapelib/shpopen.c,
10666     extensions/shapelib/dbfopen.c: Update to the versions of shapelib
10667     1.2.9
10668    
10669     * setup.py (Lib.wxproj extension): Don't link shpopen.c and put
10670     the pyshapelib directoy into the list of include dirs, so that
10671     pyshapelib_api.h can be found.
10672    
10673     * extensions/thuban/wxproj.cpp (pyshapelib_api): New variable that
10674     holds the pyshapelib C-API
10675     (draw_polygon_shape, point_in_polygon_shape, shape_centroid): Use
10676     pyshapelib_api to access the shapelib functions.
10677     (initwxproj): Import the c_api from the shapelib module and
10678     initialize pyshapelib_api.
10679    
10680 bh 89 2002-04-04 Bernhard Herzog <[email protected]>
10681    
10682 bh 91 * setup.py (thuban_bdist_rpm.initialize_options): Use
10683     initialize_options to create the scripts for the rpm.
10684    
10685 bh 89 * extensions/pyprojection/setup.py (PROJ4_PREFIX): Just use /
10686    
10687 bh 85 2002-04-03 Bernhard Herzog <[email protected]>
10688    
10689 bh 87 * setup.py: Increment version to 0.1.1
10690    
10691 bh 85 * Thuban/UI/mainwindow.py (MainWindow.__init__): Move the "Add
10692     Layer" and "Remove Layer" commands from the layer menu to the map
10693     menu
10694    
10695 bh 83 2002-02-15 Bernhard Herzog <[email protected]>
10696    
10697     * Thuban/Model/layer.py (Layer.Shape): list append only takes one
10698     argument (python <= 1.5.2 erroneously accepted multiuple
10699     arguments)
10700    
10701 bh 81 2002-02-04 Bernhard Herzog <[email protected]>
10702    
10703     * Thuban/UI/identifyview.py (IdentifyGridCtrl): New class to use a
10704     RecordGrid in the identifyview.
10705     (IdentifyView.__init__): Use IdentifyGridCtrl instead of
10706     IdentifyListCtrl. The grid allows editing of the values.
10707    
10708     * Thuban/UI/controls.py (RecordTable, RecordGridCtrl): New classes
10709     implementing a grid for a single row of a thuban table.
10710    
10711     * Thuban/UI/view.py (MapCanvas.SelectShapeAt): Search through all
10712     layers by default. Easier to use than the previous default of only
10713     searching through the select layer which meant that if no layer
10714     was selected, you couldn't select a shape.
10715    
10716     * Thuban/UI/tableview.py (TableGrid.__init__): Fix typo
10717    
10718     * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Honour the
10719     stroke_width attribute
10720    
10721     * Thuban/Model/save.py (save_session): Write the new stroke_width
10722     attribute
10723    
10724     * Thuban/Model/load.py (ProcessSession.startElement): Read the
10725     stroke_width attribute
10726    
10727     * Thuban/Model/layer.py (Layer.__init__): New parameter and
10728     instance variable stroke_width
10729     (Layer.SetStrokeWidth): Set the stroke_width.
10730    
10731 bh 72 2002-02-01 Bernhard Herzog <[email protected]>
10732    
10733     * extensions/thuban/wxproj.cpp (project_points): Fix two
10734     off-by-one errors in the last loop that joins the various parts
10735     together.
10736    
10737 bh 71 2002-01-14 Bernhard Herzog <[email protected]>
10738    
10739     * setup.py (data_dist.make_distribution): Fix some typos
10740    
10741 bh 70 2001-09-18 Bernhard Herzog <[email protected]>
10742    
10743     * README: Slight tweaking in preparation for the 0.1 release
10744    
10745     * setup.cfg: Add section for sdist to create both tgz and zip
10746     archives
10747    
10748     * setup.py: increase version number to 0.1
10749     (data_dist): New command class for data distribution
10750    
10751 bh 64 2001-09-14 Bernhard Herzog <[email protected]>
10752    
10753 bh 70 * Thuban/UI/identifyview.py (IdentifyListCtrl.selected_shape):
10754     Handle the case of no layer (i.e. layer is None) properly.
10755    
10756 tkoester 403 * Thuban/UI/proj4dialog.py (UTMDialog.__init__, Proj4Dialog.__init__):
10757 bh 70 Set the initial selection of the combo boxes to reflect the
10758     projection we're starting with in a way that works on windows,
10759     too.
10760    
10761 bh 64 * Thuban/Lib/connector.py (Connector.print_connections): Print the
10762     puiblisher's ids in hex to make it easier to compare them to the
10763     standard repr of python methods
10764    
10765     * Thuban/Model/map.py (Map.Destroy): Unsubscribe the label_layer
10766     messages
10767    
10768 bh 59 2001-09-13 Bernhard Herzog <[email protected]>
10769    
10770 bh 64 * Thuban/UI/tree.py (SessionTreeCtrl.OnSelChanged): Make sure to
10771     deselect the layer if no layer is selected
10772    
10773 bh 59 * Thuban/UI/view.py (MapCanvas.OnPaint): Only delay drawing to
10774     idle time when there actually is something to draw. If there's
10775     nothing to draw simply clear the window
10776     (MapCanvas.do_redraw): Call dc.EndDrawing and add some comments.
10777     (MapCanvas.SetMap): force a redraw in all cases because
10778     FitMapToWindow doesn't always do it.
10779     (MapCanvas.ZoomFactor): Add an optional parameter, center, to
10780     specify the point to move into the center of the window
10781     (ZoomOutTool.MouseUp, ZoomInTool.MouseUp): If the mouse wasn't
10782     dragged, zoon in/out by a factor of 2
10783 bh 64 (MapCanvas.find_shape_at): Iterate backwards (i.e. with decreasing
10784     index, i.e. reversed drawing order) so that objects appearing to
10785     be in from of others are selected first. This is probably mostly
10786     relevant for point shapes where the symbols used may overlap
10787 bh 59
10788     * Thuban/Model/session.py (create_empty_session): Unset the
10789     modified bit before returning it
10790    
10791     * Thuban/UI/mainwindow.py (MainWindow.NewSession): Use
10792     create_empty_session session to create the new, empty session.
10793    
10794     * Thuban/UI/mainwindow.py (MainWindow.__init__): Set the size of
10795     the tool bitmaps.
10796     (MainWindow.OnClose, MainWindow.save_modified_session): Separate
10797     the code that asks whether the session should be saved into the
10798     new method save_modified_session.
10799     (MainWindow.OpenSession, MainWindow.NewSession): Use the new
10800     method to save modified session here too.
10801    
10802 bh 55 2001-09-11 Bernhard Herzog <[email protected]>
10803    
10804     * setup.py (InnoIconItem): fix typo
10805    
10806     (thuban_bdist_inno.run):
10807     (bdist_inno.run): Move the decision not to create symlinks on
10808     non-nt platforms to thuban_bdist_inno and do it unconditinally
10809     since we never want to create the symlinks here
10810    
10811 bh 48 2001-09-10 Bernhard Herzog <[email protected]>
10812    
10813 bh 53 * Thuban/UI/mainwindow.py (MainWindow.IdentifyTool): Popup the
10814     identify view immediately
10815    
10816     * Thuban/UI/controls.py: New file with two classes RecordListCtrl
10817     and SelectableRecordListCtrl that implement the code shared by the
10818     identify view and the label dialog
10819    
10820     * Thuban/UI/identifyview.py (IdentifyListCtrl): Derive from the
10821     new class RecordListCtrl
10822    
10823     * Thuban/UI/labeldialog.py (LabelDialog.OnOK): Check whether the
10824     return value of GetValue is None instead of using it as a boolean
10825     directly so that Zero numbers are handled properly.
10826     (LabelListCtrl): Derive from the new class
10827     SelectableRecordListCtrl
10828    
10829 bh 48 * Thuban/UI/proj4dialog.py (Proj4Dialog.__init__):
10830     (Proj4Dialog.dialogLayout): Make the window resizable and set the
10831     size of the text control explicitly to make the sizers work on
10832     both Windows and X.
10833    
10834 bh 44 2001-09-07 Bernhard Herzog <[email protected]>
10835    
10836     * Thuban/UI/view.py (MapCanvas.find_shape_at):Add a new parameter
10837     that can limit the search to the currently selected layer.
10838     (MapCanvas.SelectShapeAt): Make sure that the currently selected
10839     layer stays selected even when no shape is found
10840 bh 46 (MapCanvas.FitRectToWindow): If the rect has zero with or zero
10841     height do nothing (avoids zero division errors)
10842 bh 44
10843 bh 32 2001-09-06 Bernhard Herzog <[email protected]>
10844    
10845 bh 42 * Thuban/UI/tree.py (SessionTreeCtrl, SessionTreeView.__init__):
10846     Correct the spelling of SessionTreeCtrl. dabbrev is too damn
10847     convenient :-)
10848     (SessionTreeCtrl.__init__, SessionTreeCtrl.update_tree): Introduce
10849     a new instvar layer_to_item to map layers to tree items
10850     (SessionTreeCtrl.layer_selected): Select the appropriate tree item
10851     to match the current selection in the interactor
10852    
10853 bh 40 * Thuban/UI/interactor.py (Interactor.SelectedLayer):
10854     (Interactor.HasSelectedLayer): New methods to query the current
10855     selection
10856    
10857     * Thuban/UI/mainwindow.py (MainWindow.current_layer):
10858     (MainWindow.has_selected_layer): Simply call the appropriate
10859     interactor method
10860    
10861     * Thuban/UI/mainwindow.py (MainWindow.__init__):
10862     (MainWindow.LayerShowTable):
10863     (MainWindow.identify_view_on_demand): Store the interactor in an
10864     instvar and use that reference instead of going through main.app
10865    
10866 tkoester 403 * Thuban/UI/mainwindow.py (MainWindow.ShowSessionTree):
10867     * Thuban/UI/application.py (ThubanApplication.OnInit):
10868 bh 40 * Thuban/UI/main.py (main): Create the session tree view in main
10869     with the new mainwindow method ShowSessionTree and not directly
10870     the application's OnInit method
10871    
10872     * Thuban/UI/tree.py (myTreeCtrlPanel):
10873     (SessioinTreeCtrl): Rename to SessioinTreeCtrl and turn it into a
10874     TreeCtrl isntead of a panel. This affects most method since we now
10875     refer to self instead of self.tree
10876     (SessionTreeView): New class implementing a non-modal dialog
10877     showing the session tree.
10878    
10879 bh 35 * Thuban/UI/mainwindow.py (MainWindow.LayerShowTable): Pass the
10880     layer to the tableview dialog.
10881    
10882     * Thuban/UI/tableview.py: Add some doc-strings
10883 tkoester 403 (TableGrid):
10884 bh 35 (TableGrid.OnRangeSelect):
10885     (TableGrid.OnSelectCell):
10886     (TableFrame.__init__):
10887     (TableFrame.row_selected):
10888     Selecting rows in the grid view now updates the selected shapes
10889     through the TableFrame. To achieve this we derive TableGrid from
10890     Publisher and introduce the message type ROW_SELECTED which the
10891     TableFrame subscribes to and which is issued by OnRangeSelect and
10892     OnSelectCell
10893    
10894     (DataTable.SelectRow): Removed because it's no longer needed in
10895     the row/shape selection scheme
10896    
10897 bh 32 * Thuban/UI/dialogs.py: New file implementing common classes for
10898     dialogs
10899    
10900     * Thuban/UI/tableview.py (TableGrid.__init__): Don't subscribe to
10901     the SELECTED_SHAPE message anymore. This is now handled by the
10902     parent.
10903     (TableGrid.select_shape): Only update the selection if the shape
10904     is not None.
10905     (TableFrame): Inherit from the new NonModalDialog class.
10906     (TableFrame.__init__, TableFrame.select_shape): Handle the
10907     SELECT_SHAPE message.
10908     (TableFrame.OnClose): Extend the inherited method to unsubscribe
10909     SELECT_SHAPE
10910    
10911     * Thuban/UI/mainwindow.py (MainWindow.init_dialogs):
10912     (MainWindow.add_dialog):
10913     (MainWindow.dialog_open):
10914     (MainWindow.remove_dialog):
10915     (MainWindow.get_open_dialog): New methods to maintain a dictionary
10916     of opened non-modal dialogs.
10917    
10918     (MainWindow.__init__): Initialize the new non-modal dictionary
10919     management code
10920     (MainWindow.LayerShowTable): maintain separate dialogs for each
10921     table using the non-modal dialog management code to only open a
10922     view once for each table.
10923    
10924     (MainWindow.IdentifyTool):
10925     (MainWindow.__init__):
10926     (MainWindow.identify_view_on_demand): Don't open the identify view
10927     in IdentifyTool anymore. This will be done automatically by the
10928     new method identify_view_on_demand which handles the
10929     SELECTED_SHAPE message so that the identify view will be opened on
10930     demand
10931    
10932     * Thuban/UI/identifyview.py (IdentifyListCtrl.__init__): Remove
10933     the interactor argument. The SELECTED_SHAPE message is now handled
10934     by the parent.
10935     (IdentifyView.__init__): Add the interactor argument so that we
10936     can handle the SELECTED_SHAPE message here
10937     (IdentifyView.selected_shape): New method to handle the
10938     SELECTED_SHAPE messages
10939    
10940     * Thuban/UI/identifyview.py (IdentifyView): Derive from the new
10941     NonModalDialog class
10942     (IdentifyView.OnClose): Extend the inherited version to
10943     unsubscribe SELECT_SHAPE
10944    
10945     * Thuban/Model/session.py (Session.UnsetModified): Remove debug prints
10946    
10947 bh 26 2001-09-05 Bernhard Herzog <[email protected]>
10948    
10949     * Thuban/UI/view.py (MapCanvas.__init__): New argument, interactor.
10950 tkoester 403
10951 bh 26 * Thuban/UI/mainwindow.py (MainWindow.__init__): New argument
10952     interactor to pass through to the MapCanvas
10953 tkoester 403
10954 bh 26 * Thuban/UI/application.py (ThubanApplication.OnInit): Use the new
10955     argument to the MainWindow constructor to get rid of the ugly hack
10956     that made main.app available early just so that the mapcanvas
10957     could access the interactor object.
10958    
10959 bh 19 2001-09-04 Bernhard Herzog <[email protected]>
10960    
10961 bh 22 * Thuban/UI/mainwindow.py (MainWindow.RunMessageBox): New method
10962     that runs a modal message box
10963     (MainWindow.OnClose): Use the new method
10964     (MainWindow.RemoveLayer): Just do nothing in case no layer is
10965     selected. The command should be grayed out anyway, so there's no
10966     need to pop up a message box.
10967     (MainWindow.AddLayer): Pop up a message box with an error message
10968     if the shape file can't be opened
10969    
10970     * Thuban/Model/layer.py (Layer.__init__): Open the shapefile
10971     immediately. This will cause an exception in case the file can't
10972     be opened and we can display an appropriate message.
10973    
10974 bh 19 * MANIFEST.in: Add extensions/pyprojection/LICENSE
10975    
10976     * setup.py (thuban_bdist_rpm): New class implementing a Thuban
10977     specific bdist_rpm command.
10978    
10979     * Thuban/UI/main.py: Catch ImportError exceptions when importing
10980     the locale module because it may not be available on some
10981     installations.
10982    
10983     * extensions/pyprojection/LICENSE: Copy of the license text in
10984     Projection.i. Having it in a separate file makes it easier to
10985     refer to license text in e.g. RPMs
10986    
10987 bh 18 2001-09-03 Bernhard Herzog <[email protected]>
10988    
10989 bh 19 * setup.py: use wx-config instead of wxgtk-config because it's
10990     more generic
10991    
10992     * setup.py (ThubanInstall.get_outputs): Add the symlink in
10993     <prefix>/bin to the outputs
10994     (ThubanInstall.link_file): New method to link files. We need this
10995     because the standard copy_files refuses to link non-existing
10996     files.
10997     (ThubanInstall.run): Remove the leading install root from the
10998     script filename if an install root was specified and use the new
10999     link_file method
11000 tkoester 403
11001 bh 18 * Thuban/UI/mainwindow.py (MainWindow.AddLayer): Fit the map to
11002     the window when the first layer is added to the map.
11003    
11004     * setup.py (ThubanInstall.run): Honor the build root (self.root)
11005     when linking thuban.py to <prefix>/bin
11006    
11007 bh 16 2001-08-31 Bernhard Herzog <[email protected]>
11008    
11009     * setup.py: In the setup call, the install parameters shouldn't
11010     have trailing slashes because distutils on non-posix platforms
11011     doesn't like that. The same applies to other directories like
11012     "Resources/Bitmaps"
11013    
11014     In the configuration section for nt, move the wxWindows directory
11015     optins into the part clearly marked as editable.
11016    
11017     (InstallLocal.initialize_options):
11018     (InstallLocal.user_options): remove the currently unused debug
11019     flag
11020     (thuban_build_py.find_all_modules): Add this method so that it
11021     works for our case of having packages and modules in one
11022     distribution as well.
11023     (ThubanInstall.initialize_options):
11024     (ThubanInstall.finalize_options):
11025     (ThubanInstall.user_options):
11026     (ThubanInstall.boolean_options): Add new options, do-symlink and
11027     extra files. Since these are the first ThubanInstall specific
11028     options, override user_options and boolean_options
11029     (ThubanInstall.run): Honor the new do-symlink and extra-files
11030     options.
11031     (ThubanInstall.get_outputs): Add to override the base-class's
11032     version and add the extra-files to the outputs
11033     (bdist_inno): New class for windows distributions with Inno Setup
11034     (InnoIconItem): Helper class for bdist_inno
11035     (thuban_bdist_inno): Thuban specific version of bdist_inno. Added
11036     this together with the appropriate parameters, to the setup call.
11037 tkoester 403
11038 bh 16 * setup.cfg (bdist_inno): added new section for the inno setup
11039     installer
11040    
11041     * Thuban/UI/tree.py (myTreeCtrlPanel.__init__): New inst var
11042     changing_selection to avoid recursive selection events when
11043     modifying the selection in response to a selection event.
11044     (myTreeCtrlPanel.normalize_selection): Set the new inst var when
11045     changing the tree's selection.
11046     (myTreeCtrlPanel.OnSelChanged): Only normalize the selection when
11047     we're not being called indirectly from normalize_selection.
11048    
11049     * Thuban/UI/mainwindow.py (MainWindow.update_command_ui): Call
11050     event.Check only if the command is actuall checkable.
11051     (MainWindow.__init__): Call the toolbar's Realize method to make
11052     sure that the items are actually shown
11053    
11054 bh 7 2001-08-28 Bernhard Herzog <[email protected]>
11055    
11056 bh 9 * setup.py: Fix some doc strings
11057    
11058 bh 7 * ChangeLog: started
11059    

Properties

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

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26