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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 2489 - (hide annotations)
Sun Dec 19 11:34:25 2004 UTC (20 years, 2 months ago) by bernhard
Original Path: trunk/thuban/ChangeLog
File size: 425078 byte(s)
	* Extensions/svgexport/TODO: Added idea to support triggering
	the application down the pipe.

1 bernhard 2488 2004-12-19 Bernhard Reiter <[email protected]>
2    
3 bernhard 2489 * Extensions/svgexport/TODO: Added idea to support triggering
4     the application down the pipe.
5    
6     2004-12-19 Bernhard Reiter <[email protected]>
7    
8 bernhard 2488 svgexport: Improved code quality, mainly by better naming.
9    
10     * Extensions/svgexport/svgmapwriter.py:
11     DrawPath() renamed to DrawPolygonPath(),
12     added documentation, improved comments and variable names.
13    
14     * Extensions/svgexport/svgmapwriter.py,
15     Extensions/svgexport/test/test_svgmapwriter.py:
16     All using DrawPolygonPath() now, the default parameter closed=True
17     omitted.
18    
19     * Extensions/svgexport/test/test_svgmapwriter.py:
20     renamed test_polygon_opened() to test_polyline()
21     renamed test_transparent_polygon() to test_transparent_polyline()
22    
23 jan 2487 2004-12-18 Jan-Oliver Wagner <[email protected]>
24    
25     Some fixes of gns2shp extension.
26    
27     * Extensions/gns2shp/test/__init__.py: New. Make this directory a
28     package.
29    
30     * Extensions/gns2shp/test/test_gns2shp.py: Add some import paths
31     dynamically.
32    
33     * Extensions/gns2shp/test/README: Simplified description how to test.
34    
35     * Extensions/gns2shp/gns2shp.py (gns2shp): Fixed doc-string,
36     fixed some dimensions of fields according to the GNS documentation
37     which seems to change undocumented.
38     Now killing trailing \n and/or \r from MODIFY_DATE.
39     This fixes RT#2453.
40    
41 bernhard 2479 2004-12-18 Bernhard Reiter <[email protected]>
42 bernhard 2480
43 bernhard 2482 svgexport 1.0.0: Treats holes and islands nicely. Documentation added.
44    
45     * Extensions/svgexport/test/test_svgmapwriter.py:
46     Added new tests: test_export_polygon_with_hole()
47     and test_polygon_with_hole().
48    
49     * Extensions/svgexport/svgmapwriter.py
50     (draw_polygon_shape()): Uses DrawPath correctly now.
51    
52     * Doc/manual/thuban-manual.xml: Added documentation for stable
53     extention svgexport.
54     * Doc/manual/thuban-manual-de.xml: Copied English section about
55     svexport over.
56    
57     * Extensions/svgexport/__init__.py: Bumped version number to 1.0.0.
58    
59     * Extensions/svgexport/svgsaver.py,maplegend.py:
60     Moved from experimental to stable extension menu.
61    
62     * Extensions/svgexport/TODO: updated.
63    
64    
65     2004-12-18 Bernhard Reiter <[email protected]>
66    
67 bernhard 2481 Added Extensions/svgexport/TODO
68    
69     2004-12-18 Bernhard Reiter <[email protected]>
70    
71 bernhard 2480 Refactored in svgexport:
72     DrawPath replaces DrawPolygon; added newline in front of "M" in paths.
73    
74     * Extensions/svgexport/svgmapwriter.py
75     Added verbosity level 3 to print out polygon points.
76     (class Point): added __repr__
77     (class Brush, __str__()): Added space after ,.
78     (DrawPolygon): Renamed to DrawPath()
79     (DrawPath): Takes list of polygons as input now, adds \n before "M"s.
80     (DrawLines): Using DrawPath now.
81    
82     * Extensions/svgexport/test/test_svgmapwriter.py:
83     Replaced DrawPolygon() calls with DrawPath() and put the first argument
84     inside another list. Adapted test data with a newline before "M".
85    
86     2004-12-18 Bernhard Reiter <[email protected]>
87 bernhard 2479
88     Refactored svgexport tests: 9 double tests runs eliminated;
89     code size reduced by 8 lines.
90    
91     * Extensions/svgexport/test/test_svgmapwriter.py:
92     (class TestWithDC): Renamed to BaseTestWithDC, moved to top.
93     (class BaseWithDCtools): New, subclass from BaseTestWithDC.
94     (class TestDrawSplines): now subclass from BaseTestWithDCtools,
95     this fixed the double running of the nine tests of TestVirtualDC.
96     (class TestVirtualDC): Using self.dc and self.file from setUp().
97    
98 bh 2478 2004-12-17 Bernhard Herzog <[email protected]>
99    
100     Two windows specific fixes ported from thuban-1­0-branch:
101    
102     * Thuban/UI/about.py (unicodeToLocale): Use getdefaultlocale
103     instead of getlocale because getlocale doesn't return a usable
104     encoding name on a german windows 2000
105    
106     * setup.py: windows build: Removed the absolute path names and
107     made all prfixes relative to the directory containing setup.py.
108     Makes it a little easier to adapt to a different system.
109    
110 bh 2470 2004-12-16 Bernhard Herzog <[email protected]>
111    
112 bernhard 2479 Add support for PostGIS tables with LINESTRING geometries.
113 bh 2472 Fixes RT#2299
114    
115     * Thuban/Model/postgisdb.py (shapetype_map): Add LINESTRING
116    
117     * test/postgissupport.py
118     (PostgreSQLServer.get_default_static_data_db): Rename the "roads"
119     table to "roads-multi" because it now uses MULTILINESTRING
120     geometries and introduce a new "roads" table that uses LINESTRING
121     (coords_to_multilinestring): Make the doc string more precise
122     (coords_to_linestring): New. Create a LINESTRING WKT
123     representatin
124     (wkt_converter): Add coords_to_linestring
125     (upload_shapefile): Rephrase the doc-string a bit.
126    
127     * test/test_postgis_db.py (TestPostGISShapestoreArc)
128     (LineStringTests)
129     (TestPostGISShapestoreLineString)
130     (TestPostGISShapestoreMultiLineString): Split
131     TestPostGISShapestoreArc into a base class LineStringTests and two
132     derived classes TestPostGISShapestoreLineString for LINESTRING
133     geometries and TestPostGISShapestoreMultiLineString for
134     MULTILINESTRING geometries. Most test methods are in the base
135     class with the exception of tests that explicitly check the raw
136     format.
137    
138     2004-12-16 Bernhard Herzog <[email protected]>
139    
140 bh 2471 Make the test suite work with PostGIS 0.8.2 and PostgreSQL 7.4
141    
142     * test/postgissupport.py (find_postgis_sql): Different postgis
143     versions put the postgis.sql file into slightly different places
144     so we have to look in both. The updated doc string describes this
145     is more detail.
146    
147     * test/test_postgis_db.py
148     (TestPostGISSpecialCases.test_column_name_quoting): The return
149     value of UniqueValues is unsorted, so it has to be sorted for
150     comparison.
151    
152     2004-12-16 Bernhard Herzog <[email protected]>
153    
154 bh 2470 Fix for RT#2237
155    
156     * Thuban/UI/projdialog.py (ProjFrame._show_proj_panel): If the
157     panel to be shown is the UnknownProjPanel disable the OK and Try
158     buttons. Otherwise enable them.
159     (ProjFrame.__GetProjection): The UnknownProjPanel returns None for
160     the parameters. In that case __GetProjection also returns None
161     now.
162    
163 bh 2459 2004-12-15 Bernhard Herzog <[email protected]>
164    
165 bh 2462 * Thuban/UI/classgen.py (GenQuantilesPanel.__init__): Set the
166     minimum number of classes to 2. The calculate_quantiles needs at
167     least two and raises an exception otherwise.
168     Fixes RT#2549
169    
170     2004-12-15 Bernhard Herzog <[email protected]>
171    
172 bh 2460 * test/postgissupport.py (PostgreSQLServer.execute_sql): Extend to
173     so that it returns a result for select statements.
174     (PostgreSQLServer.server_version): New. Return the version of the
175     server software.
176     (PostgreSQLServer.require_authentication): The format of
177     pg_hba.conf has changed between PostgrSQL 7.2 and 7.3. Check the
178     server version and generate the file in the correct format
179    
180     2004-12-15 Bernhard Herzog <[email protected]>
181    
182 bh 2459 * test/postgissupport.py (PostgreSQLServer.is_running): Fix typo
183     in the doc string and rephrase it a little.
184    
185 frank 2457 2004-12-15 Frank Koormann <[email protected]>
186    
187     * test/test_load.py (TestAltPath.checkSession): New, extended checks if
188     session has been loaded successfully. The check is called by the relevant
189     tests after executing load_session().
190    
191 bh 2450 2004-12-13 Bernhard Herzog <[email protected]>
192    
193 bh 2454 Make sure the region used to determine which shapes are visible
194     actually matches the region on the printed page. If this isn't
195     done properly some shapes might not be printed.
196     Fixes RT #2692
197    
198     * Thuban/UI/view.py (MapPrintout.draw_on_dc): The region for the
199     renderer has to be at the same position as the mapregion
200    
201     * Thuban/UI/renderer.py (ExportRenderer.RenderMap): self.region
202     has to be moved by (self.shiftx, self.shifty) too.
203    
204     2004-12-13 Bernhard Herzog <[email protected]>
205    
206 bh 2452 * libraries/pyprojection/Projection.i: Work around a bug in the
207     generated python code which leads to exception in the __del__
208     method when the constructor fails. See the comments in the code
209     for more details.
210    
211     * libraries/pyprojection/Projection.py: Updated from Projection.i
212     with SWIG.
213    
214     2004-12-13 Bernhard Herzog <[email protected]>
215    
216 bh 2451 * test/test_load.py (TestAltPath.test_01_single_path_error_fix)
217     (TestAltPath.test_02_path_error_fix_from_list)
218     (TestAltPath.test_05_path_error_fix_from_list_changed)
219     (TestAltPath.test_06_path_error_fix_from_list_fails): self.session
220     is destroyed in tearDown, so there's no need to do it in a test
221     case.
222    
223     * Thuban/Model/load.py (SessionLoader.open_shapefile): Remove a
224     debug print
225    
226     2004-12-13 Bernhard Herzog <[email protected]>
227    
228 bh 2450 * Extensions/svgexport/test/test_svgmapwriter.py
229     (TestDrawSplines.setUp): Do not use super with the unittest
230     classes because in Python 2.2 they're still old-style classes.
231    
232 frank 2448 2004-12-13 Frank Koormann <[email protected]>
233    
234     Alternative Path feature: When loading a (moved) session where
235     shapefiles cannot be found, ask the user. Use the specified path
236     if further shapefiles are missing. However, ask the usr for confirmation
237     in such cases.
238    
239     * test/test_load.py (TestAltPath): New, tests for alternative path feature
240     in load_session()
241     (Shapefile_CallBack): Helper, implements controllable callback.
242    
243     * Thuban/UI/application.py (ThubanApplication.OnInit):
244     Added "alt_path" to self.path
245     (ThubanApplication.OpenSession): Added shapefile_callback as second
246     callback similar to db_connection_callback.
247     (ThubanApplication.run_alt_path_dialog): New, implementaion of
248     shapefile_callback. In addition to raising the dialog the control of
249     self.path('alt_path') is implemented here.
250    
251     * Thuban/Model/load.py (SessionLoader.__init__): Added shapefile_callback.
252     (SessionLoader.open_shapefile): Open shapefile, eventually with
253     alternative path. This wrapps the "theSession.OpenShapefile(filename)"
254     formerly used in start_fileshapesource()/start_layer().
255     (SessionLoader.start_fileshapesource): Call open_shapefile().
256     (SessionLoader.start_layer): Call open_shapefile().
257     (load_session): Added shapefile_callback.
258    
259     * Thuban/UI/altpathdialog.py: New, implements dialogs for alternative path
260     feature (search / check).
261    
262     * Doc/manual/thuban-manual.xml: Added documentation of new feature.
263    
264 bernhard 2443 2004-12-11 Bernhard Reiter <[email protected]>
265    
266 bernhard 2445 svgexport 0.9.2: Point size supports for maps.
267    
268     * Extensions/svgexport/svgmapwriter.py: Added import of SHAPETYPE_POINT
269     (def draw_point_shape): new parameter size defaults to 2 as before.
270     (draw_shape_layer_incrementally): Moved draw_func log line higher.
271     Added draw_func call with size when dealing with a point layer.
272    
273     * Extensions/svgexport/__init__.py: bumped version to 0.9.2.
274    
275     2004-12-11 Bernhard Reiter <[email protected]>
276    
277 bernhard 2444 Made sure that newlines are inserted in the svg path d attributes
278     to raise the chance that the line length will be below 255 characters,
279     as recommended by REC SVG 1.1 in section 8.3.1.
280    
281     * Extensions/svgexport/svgmapwriter.py(DrawPolygon):
282     Adding \n before L's and changed whitespace handling.
283    
284     * Extensions/svgexport/test/test_svgmapwriter.py:
285     Adapted tests to new whitespace handling of DrawPolygon.
286    
287     2004-12-11 Bernhard Reiter <[email protected]>
288    
289 bernhard 2443 * Doc/technotes/coding_guidelines.txt: easy typo fixed.
290    
291     * Extensions/svgexport/test/test_svgmapwriter.py:
292     Removed test_drawbezier in favour of new test_drawspline3 and
293     test_drawspline4 within new class TestDrawSplines(TestVirtualDC).
294     All only to test DrawSpline.
295    
296     * Extensions/svgexport/svgmapwriter.py(DrawSpline):
297     New implementation now really using the strange algorithm of
298     xfig 3.1's approximated splines and its conversion to postscript
299     with one twist: SVG can do quadratic beziers, so skipped translation
300     to cubic beziers.
301     (TestWithDC): Typo in comment fixed.
302    
303 joey 2442 2004-12-09 Martin Schulze <[email protected]>
304    
305     * Thuban/Model/classgen.py: Added missing character encoding
306    
307     * Extensions/wms/properties.py (OpenWMSProperties): removed
308    
309     * Extensions/wms/parser.py (WMSCapabilitiesParser.error): Dropped
310     support for get_srs_discrepancies() since there are no
311     discrepancies anymore (was a thinko)
312    
313     * Extensions/wms/layer.py (WMSLayer.GetMapImg): Improved graphic
314     format priority now that more formats are supported globally by
315     the render engine.
316    
317 silke 2437 2004-12-08 Silke Reimer <[email protected]>
318     * Extensions/ogr/ogrshapes.py: Substituted ogr-method CloseRings
319     because it is not available in all versions of ogr
320    
321 bernhard 2436 2004-12-08 Bernhard Reiter <[email protected]>
322     * Extensions/ogr/__init__.py: Added empty __init__.py to heal
323     global tests until a real one is commited.
324    
325 nhueffme 2435 2004-12-07 Nina Hüffmeyer <[email protected]>
326    
327     * /Extensions/ogr/: Adding a new extension to read shapefiles with
328     ogr. It is planned to add other vector formats.
329    
330     * /test/runtests.py: Adding tests from /Extensions/ogr/test/.
331    
332 jan 2434 2004-12-07 Jan-Oliver Wagner <[email protected]>
333    
334     * /Extensions/svgexport/test/test_svgmapwriter.py: Reverting
335     part of a (non-)fix to renable that the tests are always
336     executed.
337    
338 bernhard 2432 2004-12-07 Bernhard Reiter <[email protected]>
339    
340     * Extensions/svgexport/test/test_svgmapwriter.py:
341     Added test_drawbezier() to test DrawSpline().
342    
343     * Extensions/svgexport/svgmapwriter.py(DrawSpline):
344     Really implemented bezier drawing.
345    
346     * Extensions/svgexport/__init__.py: Bumped version of svgexport
347     to 0.9.1 because now the legend examples lines styles
348     will be drawing with beziers.
349    
350 joey 2431 2004-12-05 Martin Schulze <[email protected]>
351    
352     * Thuban/UI/renderer.py (raster_format_map): Added PNG, TIFF and
353     GIF as supported bitmap image formats (helpful for the WMS extension)
354    
355 joey 2430 2004-11-30 Martin Schulze <[email protected]>
356    
357     * Extensions/wms/test/test_ogclib.py (TestOGCLib.test_compareURLs):
358     Improved the test for the internal compare method
359    
360 jan 2429 2004-11-27 Jan-Oliver Wagner <[email protected]>
361    
362     * Thuban/UI/about.py (About.__init__): Added
363     Norbert Solymosi for hungarian translation and Ole Rahn
364     as contrbutor. Moved Bernhard Reiter from Contributor
365     to Developer.
366    
367 bernhard 2425 2004-11-27 Bernhard Reiter <[email protected]>
368    
369     * Extensions/svgexport/test/test_svgmapwriter.py:
370     Removed Jan from author list as he did not change enough significant
371     lines yet.
372    
373     * Extensions/svgexport/__init__.py: Added Bernhard as author
374     of the Extension.
375    
376 jan 2422 2004-11-27 Jan-Oliver Wagner <[email protected]>
377    
378     * po/hu.po: New. Hungarian translation. Contributed
379     by Norbert Solymosi.
380    
381 bh 2419 2004-11-26 Bernhard Herzog <[email protected]>
382    
383     * Extensions/svgexport/test/test_svgmapwriter.py
384     (Testobjectexport.test_transparent_polygon): Commented out some
385     debug prints
386    
387 jan 2418 2004-11-24 Jan-Oliver Wagner <[email protected]>
388    
389     Fix broken tests for svg extension and added svg legend
390     to Experimental menu.
391    
392     * Extensions/svgexport/test/test_svgmapwriter.py: Fix to have
393     the test run correctly even if the extension is a package.
394     Also removed the "import Thuban" which makes no sense.
395    
396     * Extensions/svgexport/__init__.py: Fix to have the extensions'
397     test module also be executed from the global test routine.
398     This is done by looking for the absense of the DISPLAY variable.
399    
400     * Extensions/svgexport/maplegend.py: Moved the menu entry from Extensions
401     to Experimental menu since this module has yet not reached a stable
402     status (ie. 1.0).
403    
404 bernhard 2414 2004-11-22 Bernhard Reiter <[email protected]>
405    
406     * Extensions/svgexport/svgmapwriter.py:
407     Added verbose variable and some logging depending on it.
408     (class VirtualDC(XMLWriter)): Minor improvement in the polygon loop,
409     because counting i is not necessary.
410     (class Pen, class Brush): Added simple __str__ methods.
411     (SVGRenderer.draw_polygone_shape): Fix #2698 (transparent polygons are
412     not exported to svg file) Note: holes still unhandled.
413    
414     * Extensions/svgexport/test/test_svgmapwriter.py:
415     Made a baseclass TestWithDC for test needed a DC.
416     Added tests for bug #2698 (transparent polygons are not
417     exported to svg file):
418     Testobjectexport.test_transparent_polygon()
419    
420     * Thuban/Model/base.py (UnsetModified):
421     Fixed some typos in docstring.
422    
423     * Thuban/UI/baserenderer.py (BaseRenderer.draw_polygon_shape()):
424     Added hints on the used algorithm for handling holes.
425    
426 jan 2403 2004-11-20 Jan-Oliver Wagner <[email protected]>
427    
428 jan 2412 Some face lifting for the examples.
429    
430     * Examples/__init__.py: Make this directory a package.
431    
432     * Examples/simple_extensions/__init__.py: Make this directory a package.
433    
434     * Examples/simple_extensions/hello_world.py: Moved entry from Extensions
435     menu to Examples menu.
436    
437     * Examples/simple_extensions/simple_command.py: Some more comments,
438     minor changes.
439    
440     * Examples/simple_extensions/simple_tool.py: Minor changes.
441    
442     2004-11-20 Jan-Oliver Wagner <[email protected]>
443    
444 jan 2407 Changed way of extension registry for wms and added extension
445     registry for umn_mapserver extension.
446    
447     * Extensions/wms/__init__.py: Added registry entry and the importing
448     of the actual wms module. Included a test for the required PyOGCLib.
449    
450     * Extensions/wms/wms.py: Removed registry entry (moved to __init__.py).
451    
452     * Extensions/umn_mapserver/__init__.py: Added registry entry and the
453     importing of the actual umn mapserver management modules.
454     Included a test for the required Python MapScript.
455    
456     2004-11-20 Jan-Oliver Wagner <[email protected]>
457    
458 jan 2403 Changed way of extension registry for importAPR, bboxdump
459     and added extension registry for svgexport.extension registry for
460     svgexport.
461    
462     * Extensions/importAPR/__init__.py: Added registry entry and the importing
463     of the actual importAPR module.
464    
465     * Extensions/importAPR/importAPR.py: Removed registry entry (moved to
466     __init__.py).
467    
468     * Extensions/bboxdump/__init__.py: Added registry entry and the importing
469     »···of the actual bboxdump module.
470    
471     * Extensions/bboxdump/bboxdump.py: Removed registry entry (moved to
472     »···__init__.py).
473    
474     * Extensions/svgexport/__init__.py: Added registry entry and the importing
475     of the svgsaver module.
476    
477     * Extensions/svgexport/svgsaver.py: Moved the menu entry from Extensions
478     to Experimental menu since this module has yet not reached a stable
479     status (ie. 1.0).
480    
481 jan 2397 2004-11-18 Jan-Oliver Wagner <[email protected]>
482    
483     Now the hit test considers the size of point symbols.
484    
485     * Thuban/UI/viewport.py (ViewPort._hit_point): Added optional parameter
486     'size' defaulting to the previously fixed value 5.
487     Extended doc-string.
488     (Viewport._find_shape_in_layer): Resolved FIXME regarding flexibility
489     for symbols.
490     Now the size of the largest point symbol is determined to find out
491     about whether the point has been hit.
492     This fixes the problem that only clicks inside a fixed distance of
493     5 where found.
494    
495 jan 2395 2004-11-17 Jan-Oliver Wagner <[email protected]>
496    
497 jan 2397 Another open issue fixed regarding sizeable symbols: correct rendering of
498 jan 2395 selected symbols.
499    
500     * Thuban/UI/renderer.py (ScreenRenderer.draw_selection_incrementally):
501     Added consideration of the specific size of point symbols.
502     The property for each point symbol is retrieved and the size applied
503     for the rendering method.
504     Added doc-string.
505    
506 jan 2393 2004-11-16 Jan-Oliver Wagner <[email protected]>
507    
508     Changed way of Extension Registry for gns2shp and profiling.
509    
510     * Extensions/gns2shp/gns2shp.py: Removed registry entry (moved to
511     __init__.py).
512    
513     * Extensions/gns2shp/__init__.py: Added registry entry and the importing
514     of the actual gns2shp module.
515    
516     * Extensions/profiling/profiling.py: Removed registry entry (moved to
517     __init__.py).
518    
519     * Extensions/profiling/__init__.py: Added registry entry and the importing
520     of the actual profiling module.
521    
522 bernhard 2388 2004-10-28 Bernhard Reiter <[email protected]>
523    
524     * Extensions/svgexport/: Minor improvements to doc strings.
525    
526 jan 2387 2004-10-07 Jan-Oliver Wagner <[email protected]>
527    
528     Further elements for sizable point objects now
529     making this feature usable though not yet complete.
530    
531     * Thuban/Model/save.py (SessionSaver.write_classification): Write
532     attribute 'size' for cldata when the shape layer is of point type.
533     This also now make the test_load.py tests happy.
534    
535     * Thuban/Model/classgen.py (CustomRamp.GetProperties): Added size
536     gradient.
537    
538     * Thuban/UI/classifier.py (ID_SELPROP_SPINCTRL): Renamed to
539     ID_SELPROP_SPINCTRL_LINEWIDTH.
540     (ID_SELPROP_SPINCTRL_LINEWIDTH): New Id replaces ID_SELPROP_SPINCTRL.
541     (ID_SELPROP_SPINCTRL_SIZE): New Id.
542     (SelectPropertiesDialog.__init__): Added a second spin control
543     for the size in case the corresponding layer is of point type.
544     (SelectPropertiesDialog._OnSpin): Renamed to _OnSpinLineWidth.
545     (SelectPropertiesDialog._OnSpinLineWidth): New. Former _OnSpin.
546     (SelectPropertiesDialog._OnSpinSize): New. Set size of property
547     and refresh preview.
548    
549    
550    
551 joey 2381 2004-10-04 Martin Schulze <[email protected]>
552    
553     * Extensions/wms/test/test_parser.py
554     (TestWMSCapabilitiesParser.test_compareLists): Added missing
555     self-test for compareLists()
556     (TestWMSCapabilitiesParser.test_compareDicts): Added missing
557     self-test for compareDicts()
558 joey 2382 (TestWMSCapabilitiesParser.test_compareLists): Adding more tests
559     to verify the test routine fails with non-equal arguments
560     (TestWMSCapabilitiesParser.test_compareDicts): Adding more tests
561     to verify the test routine fails with non-equal arguments
562 joey 2381
563 jan 2370 2004-10-03 Jan-Oliver Wagner <[email protected]>
564    
565 jan 2380 First elements for sizeable point objects.
566    
567     * Resources/XML/thuban-1.1.dtd: Added size attribute to cldata.
568    
569     * Data/iceland_sample_size.thuban: New. Sample for sized point objects.
570    
571     * test/test_load.py (ClassificationTest.TestLayers): Added SetSize in case
572     of a corresponding argument is given.
573     (TestSymbolSize): New. Test the size attribute of cldata.
574    
575     * Thuban/Model/classification.py: Removed some trailing whitespaces.
576     (ClassGroupProperties.__init__): Set default size.
577     (ClassGroupProperties.SetProperties): Set the size.
578     (ClassGroupProperties.GetSize): New. Return the size.
579     (ClassGroupProperties.SetSize): New. Set the size.
580     (ClassGroupProperties__eq__): Compare also size.
581     (ClassGroupProperties__repr__): Print also size.
582    
583     * Thuban/Model/load.py (SessionLoader.start_cldata): Also parse
584     the size attribute.
585    
586     * Thuban/UI/classifier.py (ClassDataPreviewer.Draw): Added doc-string.
587     Also, now there is a return value that indicates whether the drawing
588     size exceeded the given rect extent and if so the new extent.
589     Finally, point objects are drawn depending on the size. If either
590     the width or height is exceeded, the new extent is returned.
591     (ClassRenderer.Draw): Now when calling the previewer drawing function,
592     evaluate the return value and, if not None, adapt the grid widget size
593     accordingly and redraw again.
594    
595     * Thuban/UI/baserenderer.py (BaseRenderer.draw_shape_layer_incrementally):
596     If the draw function is for points, call it with the size as additional
597     parameter.
598     (BaseRenderer.draw_point_shape): Added additional, optional parameter for
599     the size. Compute the radius using the size.
600    
601     * Extensions/importAPR/apr.py (APR_BMkSym.GetThubanProp): Now
602     that Thuban supports size, apply this correctly.
603    
604     * Extensions/importAPR/importAPR.py: Bumped version to 0.1.1.
605    
606     2004-10-03 Jan-Oliver Wagner <[email protected]>
607    
608 jan 2370 * Doc/manual/thuban-manual-de.xml: Started translation of
609     Map chapter.
610    
611 joey 2368 2004-10-01 Martin Schulze <[email protected]>
612    
613     * Extensions/wms/properties.py (wmsProperties.__init__): Extended
614     argument for general use through properties-dialog selector
615    
616     * Thuban/UI/classifier.py: Register properties dialog classes for
617     both provided layer classes/types.
618    
619     * Thuban/UI/mainwindow.py (MainWindow.OpenLayerProperties): The
620     map can be retrieved through the parent which is passed to the
621     constructor anyway and doesn't require an argument of its own,
622     required for the unification of arguments for general use through
623     properties-dialog selector.
624     (MainWindow.OpenOrRaiseDialog): Move the logic for checking
625     whether a dialog is already opened (and raising it to the users
626     attention) and creating a new dialog into a function of its own
627     (MainWindow.OpenLayerProperties): Use the new OpenOrRaiseDialog()
628     method
629     (MainWindow.OpenLayerProperties): Utilise the new ClassMapper for
630     global registration of properties dialog classes (which are indeed
631     layer-specific).
632    
633     * Thuban/UI/classifier.py (Classifier.__init__): Unify arguments
634     for general use through properties-dialog selector, the map can be
635     retrieved through the parent and doesn't require an argument of
636     its own.
637    
638     * Extensions/wms/wms.py: Register the properties dialog class for
639     the provided WMS layer
640    
641 jan 2358 2004-09-28 Jan-Oliver Wagner <[email protected]>
642    
643     New feature: Registry for Extensions.
644    
645     * Thuban/UI/extensionregistry.py: This module defines a registry for
646     Extensions.
647    
648     * Thuban/UI/about.py (About.__init__): Added description
649     of the registered extensions with all of the information.
650    
651     * Thuban/Model/extension.py (Extension): Improved doc-string.
652    
653     * Extensions/gns2shp/gns2shp.py, Extensions/importAPR/importAPR.py,
654     Extensions/bboxdump/bboxdump.py, Extensions/profiling/profiling.py,
655     Extensions/wms/wms.py: Added registration of the extension.
656    
657 bernhard 2352 2004-09-27 Bernhard Reiter <[email protected]>
658    
659     More fixes to svgexport to make used ids unique and
660     conforming to XML's Name production.
661    
662     * Extensions/svgexport/test/test_svgmapwriter.py: Added new tests
663     test_xml_id_constraints(), test_make_ide_nosetbaseid() and
664     test_make_id_nonintegersetid(). Switched SetID and SetBaseID.
665     Added Bernhard R. as author.
666     * Extensions/svgexport/svgmapwriter.py (make_id): Using "_" as
667     concatenation char now (makes test_make_ide_nosetbaseid() valid).
668     Also transform second id part with "%d" and catch the TypeError
669     to raise SVGMapWriterError (making test_make_id_nonintegersetid() ok).
670     Corrected typo inBernhard's author line.
671     (SetBaseID): Return the transformed base id. Transform characters
672     which are not alnum() or in ".-_" to binascii.b2a_hex(). Added
673     import binascii. If to be set string starts with "xml" or so, add "t".
674     (draw_shape_layer_incrementally): use the returned value of SetBaseID
675     for used_baseids checks.
676    
677 bh 2351 2004-09-25 Bernhard Herzog <[email protected]>
678    
679     * test/test_layer.py (TestLayer.test_arc_layer_with_projection):
680     Remove a debug print and some tab characters.
681    
682 bernhard 2350 2004-09-25 Bernhard Reiter <[email protected]>
683    
684     * Extensions/svgexport/svgmapwriter.py: Added Bernhard R. as Author.
685     (SetBaseID, SetID, make_id): Improved docstring comments to explain
686     the interaction of the three functions and the XML id contrains.
687    
688 bernhard 2352
689 jan 2346 2004-09-23 Jan-Oliver Wagner <[email protected]>
690    
691 jan 2349 * Doc/ThubanModel.xmi: New. UML file for Thuban Model
692     Module.
693    
694     * Doc/README: Added info on ThubanModel.xmi.
695    
696     2004-09-23 Jan-Oliver Wagner <[email protected]>
697    
698 jan 2346 * Doc/README: New. Some info about how to generate technical
699     documentation from the source code.
700     This text was send to the Thuban developer mailing list on
701     September 21st 2004 by Bernhard Reiter.
702    
703 bernhard 2344 2004-09-21 Bernhard Reiter <[email protected]>
704    
705     Improved the svgexport to only use unique ids. Will issues
706     an error message dialoge when two layer names are the same.
707     ShapeIDs are now added with a dash within the svg ids.
708    
709     * Extensions/svgexport/svgmapwriter.py (SVGMapWriterError): New.
710     * Extensions/svgexport/test/test_svgmapwriter.py: Added imports
711     (TestSVGRenderer): New test class with test_make_in() and
712     test_check_for_layer_name_clash()
713     * Extensions/svgexport/svgmapwriter.py (SVGRenderer): Fixed __init__()
714     and draw_shape_layer_incrementally() to not use a baseid twice,
715     satisfying test_check_for_layer_name_clash()
716     (VirtualDC.make_id): Use a dash between baseit and id, satisfies
717     test_make_in().
718     * Extensions/svexport/svgsaver.py: Import SVGMapWriterError, wxOK
719     and wxICON_HAND.
720     (write_to_svg): Put dc and rendering in a try statement and on
721     catching SVGmapWriterError notify the user and delete the target file.
722    
723 bernhard 2343 2004-09-20 Bernhard Reiter <[email protected]>
724    
725     * Model/base.by, Model/layer.py: Fixed typos in docstrings.
726    
727 jschuengel 2342 2004-09-03 Jan Schüngel <[email protected]>
728    
729     * Extensions/umn_mapserver/mapfile(MF_Class.add_thubanstyle): Fix a
730     small bug with the line color. Now the line color will now only set
731     if it is set in Thuban an not Transparent.
732    
733     * Extensions/umn_mapserver/mf_export(tblayer_to_map): Fixed a bug with
734     deleting the layers from mapfile. Now all layers will delete backwards
735     from the last.
736    
737 silke 2339 2004-08-20 Silke Reimer <[email protected]>
738 silke 2338
739 silke 2339 * Thuban/Model/layer.py:
740     Fixes bug in projection handling: Otherwise very large region might not
741     have valid values in the layer's projection.
742    
743     2004-08-20 Silke Reimer <[email protected]>
744    
745 silke 2338 * Thuban/UI/about.py:
746     small changes to be consistent with coding style.
747    
748 joey 2337 2004-08-13 Martin Schulze <[email protected]>
749    
750     * Extensions/wms/test/test_ogclib.py (TestOGCLib.compare_URLs):
751     Adjusted a comment
752    
753 silke 2335 2004-08-11 Silke Reimer <[email protected]>
754 silke 2334
755 silke 2335 * Thuban/UI/about.py: Small changes to encoding related stuff to avoid
756     too many and too enhanced imports of locale
757    
758 silke 2334 2004-08-10 Silke Reimer <[email protected]>
759    
760     * Thuban/UI/about.py: Fixed encoding problem of about dialog: Added
761 silke 2339 function unicodeToLocale() to convert special characters to users
762     locale encoding
763 silke 2334
764 jan 2333 2004-08-10 Jan-Oliver Wagner <[email protected]>
765    
766     * Doc/technotes/coding_guidelines.txt: Added rule 'Method names start with
767     lower case letter'
768    
769 jschuengel 2331 2004-08-09 Jan Schüngel <[email protected]>
770    
771     * ChangeLog: Rewrite the last ChangeLog entry to follow
772     the standard way.
773    
774     * Extensions/umn_mapserver/mapfile: Moved the import AnnotationLayer to
775     the function where it is needed, because it don't works if it stands
776     at the beginning.
777     (MF_Layer.__init__): Removed the extra numclassed variable. Now
778     numclasses from the mapscript will be used.
779     (MF_Layer.get_index): New. Return the index of the layer in mapfile.
780     (MF_Layer.set_classes): New. A Classlist will be set to the layer.
781     (MF_Layer.set_metadata): New. A Metadata mapscript object will set.
782     (MF_Layer.remove_allclasses): New. All class of the layer will remove.
783     (MF_Map.create_new_layer): New. A new Layer is created and associated
784     with the mapscript object.
785     (MF_Map.set_layerorder): New. The Layer order like in thuban is set in
786     the mapscript.
787     (MF_Map.add_thubanlayer): Now a new layerobj is created if no one is
788     linked to the layer in thuban, else the layerobject linked to the
789     thubanlayer will be used.
790     AnnotationLayer will now store the filename of the shapefile.
791     (MF_Map.remove_layer): If a layer is removed the associated object
792     must be set new.
793    
794     * Extensions/umn_mapserver/mf_export.py(tb_layer_to_map): Add all
795     layers which are exists in thuban to the mapobj. All removed Layers
796     will be removed from the mapobj.
797     Added comments to all functions.
798     (thuban_to_map): No layer will be removed here.
799    
800     * Extensions/umn_mapserver/mf_handle.py
801     (_has_umn_mapobj_and_selectedlayer): Activating the layer menu. Now
802     Layersettings for the mapserver kann be edited.
803    
804     * Extensions/umn_mapserver/mf_import.py: Now all layers which are
805     imported, will be linked with the associated MF_Layer.
806     (import_mapfile): All layers, which are not selected, will be removed.
807     Disable the "import layer from mapfile" menu option.
808    
809     * Extensions/umn_mapserver/sample/iceland.map: Set the status of the
810     Annotation Layer from DEFAULT to OFF. The DEFAULT setting turns the
811     layer on permanently.
812    
813 jschuengel 2323 2004-08-03 Jan Schüngel <[email protected]>
814    
815 jschuengel 2331 * Extensions/umn_mapserver/mapfile.py(MF_Metadata.remove_allmetadata):
816     New. This function removes all metadata
817     (MF_Layer.set_group): New. Set the group setting.
818     (MF_Layer.get_group): New. Get the group setting.
819     (MF_Map): Removed the extra numlayers variable, used the mapscript
820     parameter instead.
821     (MF_Map.get_numlayers): New. This get numlayers.
822     (MF_Map.remove_all_layers): New. Removes all layers from the mapobj.
823 jschuengel 2323 (MF_Map.add_thubanlayer): Replaced the exception handling by a check
824     if the object is an instance. Also added the annotation layer here to
825     export, but only the layer is created in the mapfile.
826    
827 jschuengel 2331 * Extensions/umn_mapserver/mf_export.py(export_mapfile): Removed
828     the check if a mapobj exist, because its not needed anymore. The
829     export function is only available if a mapobj exist.
830     Use the new function to remove all layers.
831 jschuengel 2323
832 jschuengel 2331 * Extensions/umn_mapserver/mf_handle.py(Layer_Dialog): Added a group
833     option and the metadata button. The layer dialog is temporary disabled.
834     (Metadata_CustomDataTable): Added some functions to show the grid
835 jschuengel 2323 correct.
836    
837 jschuengel 2331 * Extensions/umn_mapserver/mf_import.py: Moved the code for showing
838     the number of layer from import_mapfile to this function.
839     (AnnotationLayer): New. This Class shows the Annotation layer in
840     thuban. The layer don't do anything. It's only to show the layer
841     and to save the layer order.
842     (add_annotationlayer): New. Import an annotation layer to thuban.
843     (select_layer2import): New. Import only layers to thuban and not
844     the other settings like projection or scalebar.
845     (create_new_mapfile): Moved the _has_umn_mapobj function and the
846     create_new_mapfile functions from mf_handle.py to mf_import.py.
847 jschuengel 2323
848     * Extensions/umn_mapserver/sample/iceland.map: Added the group
849     parameter to the roads and cultural layers. Also added a new
850     Annotation Layer for the cultural points.
851    
852     * Extensions/umn_mapserver/sample/iceland.html: Added the select
853     option for the annotation layer.
854    
855     * Extensions/umn_mapserver/sample/index.html: Added the start
856     parameter for the annotation layer.
857    
858 jan 2315 2004-08-01 Jan-Oliver Wagner <[email protected]>
859    
860     * Doc/manual/thuban-manual-de.xml (Chapter Session Management):
861     translation completed.
862    
863     * Doc/manual/thuban-manual.xml (Chapter Session Management):
864     Fixed unprecise description for Save Session.
865    
866 jan 2312 2004-07-31 Jan-Oliver Wagner <[email protected]>
867    
868     Started translation of Users Manual into german.
869    
870     * Doc/manual/thuban-manual-de.xml: New. German Users Manual.
871    
872     * Doc/manual/Makefile: Added build instructions for german
873     users manual.
874    
875     * Doc/manual/thuban-manual.xml: Minor corrections in Introduction.
876    
877 jschuengel 2308 2004-07-28 Jan Schüngel <[email protected]>
878    
879     * Extensions/umn_mapserver/mapfile.py(MF_Metadata): Changed all class
880     functions. Now all metadata will handle by the function and its not
881     needed to initialize it from outside. Therefor the associated mapobj
882     will be stored in the Metadata Object. So we can use the special
883     functions from the associated mapobj to get the Metadata.
884     Therefor all initialization code for the metadata is removed from the
885     other classes.
886     (MF_Layer): Added a function to get the metadata object.
887     (MF_Map): Added a function to set the mappath, the path where
888     the mapfile ist stored.
889    
890     * Extensions/umn_mapserver/mf_export.py(thuban_to_map): Changed the code
891     to set the extent in the mapfile. Now the code is set by the displayed
892     data in the Thuban-view.
893     (export_mapfile): The shapepath is now set empty, until relative
894     pathnames are supported.
895    
896     * Extension/umn_mapserver/mf_handle.py: Added a dialog to handle
897     metadata. Yet only mapfile metadata are supported. Layer and class
898     supported are not implemented.
899     Added a dialog to handle layer informations. The dialog only shows the
900     selected layer at the moment.
901    
902     * Extensions/umn_mapserver/mf_import.py(import_mapfile): Changed the
903     code for setting the extent in thuban. Now the extent is set to the
904     given extent from the mapfile.
905     Fixed a logical mistake. Now the extent is set when realy a layer is
906     loaded, and not if one is selected to load.
907    
908     * Extensions/umn_mapserver/sample/iceland.html: Added code to zoom and
909     move the shown map in the browser.
910    
911     * Extensions/umn_mapserver/sample/iceland.map: Added a new metadata
912     line to the mapobj and added metadata to the political layer.
913    
914     * Extensions/umn_mapserver/test/test_mapserver.py: Changed the test
915     for Metadata.
916    
917 joey 2300 2004-07-26 Martin Schulze <[email protected]>
918    
919     * Thuban/Lib/classmapper.py (ClassMapper.has): Added the new
920     ClassMapper
921    
922     * test/test_classmapper.py (TestMapping.test_mapper): Added a Test
923     case for the new ClassMapper
924    
925    
926 bh 2296 2004-07-22 Bernhard Herzog <[email protected]>
927    
928 bh 2297 * Thuban/UI/viewport.py (ViewPort.VisibleExtent): New. Return the
929     visible extent of the map in projected coordinates
930    
931     * test/test_viewport.py (SimpleViewPortTest.test_default_size)
932     (SimpleViewPortTest.test_init_with_size): Add some VisibleExtent()
933     tests.
934     (SimpleViewPortTest.test_visible_extent): New. The real test for
935     VisibleExtent()
936    
937     2004-07-22 Bernhard Herzog <[email protected]>
938    
939 bh 2296 * test/test_viewport.py: Use support.run_tests as the main
940     function when running asa script.
941    
942 jschuengel 2295 2004-07-22 Jan Schüngel <[email protected]>
943    
944     * Extensions/umn_mapserver/mf_export.py: Added "import os"
945     Removed the old "import Thuban.UI.mainwindow" code.
946     (tbextent_to_map): Removed the extra function and at the code direct
947     to "thuban_to_map" function.
948     (write_creatorcomment): Added. Now a short comment is added to the
949     beginning of an generated mapfile.
950     (export_mapfile): Now the Path and filename are saved in to variables,
951     and not together in one variable. This is needed for the new
952     write_creatorcomment function.
953    
954     * Extensions/umn_mapserver/mf_import.py (import_mapfile): Added the
955     import module "re". Also added Range and the ClassGroupRange import
956     from Thuban. Both are needed for the new range expression import.
957     (create_rangeexpression): Added. Creates a Range Expression in Thuban
958     style from a given mapfile expression.
959     (added_rasterlayer): Make some small code changes. The shapepath is
960     now stored in an extra variable and the clazz_name is set empty if no
961     class name set in the mapfile.
962     Changed the Error message for Range Expressions, becaus the new
963     function create a error string which will be shown in the dialog.
964    
965     * Extensions/umn_mapserver/test/test_mapserver.py: Added a test for the
966     range expression import.
967 jan 2312
968 jan 2291 2004-07-21 Jan-Oliver Wagner <[email protected]>
969    
970     * Extensions/umn_mapserver/README: Added hint that
971     installation as root can be avoided. Removed all tabs.
972    
973 bh 2289 2004-07-16 Bernhard Herzog <[email protected]>
974    
975     * test/test_viewport.py
976     (ViewPortTest.test_changing_map_projection): Check that changing
977     the projection of an empty map shown in a viewport doesn't lead to
978     exceptions in the viewport's handler for the
979     MAP_PROJECTION_CHANGED messages
980    
981     * Thuban/UI/viewport.py (ViewPort.map_projection_changed): Only
982     try to keep the same region visible when the map actually contains
983     something
984    
985 jschuengel 2288 2004-07-15 Jan Schüngel <[email protected]>
986    
987     * Extensions/umn_mapserver/mapfile.py: Added a function to get the
988     mappath directly from the mapobj. Is needed because of the changes
989     in mf_import.py.
990     (MF_Layer.add_thubanclass): Added a new comment.
991     (MF_Map.set_extent): Fixed a bug with exporting empty mapobj. If the
992     mapobj is empty there is no extent get from thuban an so no one can
993     set to th mapobj.
994    
995     * Extensions/umn_mapserver/mf_import.py (import_mapfile): Updated
996     the discription.
997     Split the funktion in to three smaller ones. The new functions are
998     add_rasterlayer, add_polygonlayer and select_layer2import.
999     Removed the mapfilepath and filepath initialisation, because its know
1000     include in the new functions.
1001     Now nothing will be imported if cancel is pressed in the
1002     layer choice dialog.
1003    
1004 jschuengel 2285 2004-07-14 Jan Schüngel <[email protected]>
1005    
1006     * Extensions/umn_mapserver/mapfile.py: Added ClassGroupDefault to
1007     import.
1008     (MF_Symbolset): Removed the extra variable for numsymbols.
1009     (MF_Class.__init__): Added a comment to the exception clause.
1010     Removed the extent init, because it was not needed anymore.
1011     (MF_Layer.add_thubanclass): Added the code to set the class name to
1012     the expression value from thuban if no label is defined.
1013     Added the code to export Range expressions from thuban to the mapfile.
1014     (MF_Map.set_extent): Removed the exception and replace it by some if
1015     code. If the size of a map is not defined the size will be set to 1,1.
1016     This is necessary because if the extent is set, mapscript checks if
1017     the size is greater than zero.
1018     (MF_Web): Added the get and set function for the template.
1019    
1020     * Extensions/umn_mapserver/mf_export.py: Added the function to check
1021     if a mapobject exists and used it to set the status of the menu items.
1022     If no mapfile exists the settings could not be edditied.
1023     Define after which menuitem the exportitem will include.
1024    
1025     * Extensions/umn_mapserver/mf_handle.py: Removed the import
1026     Thuban.UI.mainwindow clause, because it is not needed.
1027     Added the command Refresh() to all "OnChangeColor()" functions,
1028     because the color preview window was not updated on a color change.
1029     Added the function to check if a mapobject exists and used it to set the
1030     status of the menu items. If no mapobject exists the settings could not
1031     be edditied.
1032     (Map_Dialog): Moved the imagetype selector from the
1033     Outputformat_Dialog to Map_Dialog and removed Outputformat_Dialog.
1034     (Web_Dialog): Removed the name label and added the template textbox.
1035    
1036     * Extensions/umn_mapserver/mf_import.py (import_mapfile): Replace
1037     the exception handling on loading the layers by an if statement. It
1038     is not necessary to us the exception there.
1039     The Filepath creation now use os.path.join to build the path.
1040    
1041     * Extensions/umn_mapserver/test/test_mapserver.py: Moved the testMap
1042     definition from global to the setUp function. Now the testMap will
1043     initialize new on each test.
1044    
1045     * Extensions/umn_mapserver/sample/iceland.map: Include three new
1046     classes in the Line Layer, to test logical Expressions.
1047     Set the status of the class "Point9" in the Point Layer to off
1048    
1049 bh 2278 2004-07-13 Bernhard Herzog <[email protected]>
1050    
1051     * Thuban/UI/baserenderer.py
1052     (BaseRenderer.render_map_incrementally): Fix a logic bug in the
1053     optimization that tries not to draw layers under a raster layer.
1054     The bug was harmless. All it effectively did was to produce The a
1055     strange messages about not being able to draw Layer instances for
1056     all vector layers below a raster layer which would be invisible
1057     anyway because the raster layer currently always covers the entire
1058     window
1059    
1060 jschuengel 2277 2004-07-08 Jan Schüngel <[email protected]>
1061    
1062     * Extensions/umn_mapserver/mapfile.py: Added code to generade and get
1063     a list of supported outputformats. This formats are not alle supported
1064     because there is no possibility to get the outputformat without the
1065     name known. Make some formal changes to the code.
1066     (MF_Map.set_name()): Fixed a bug if the name is None.
1067    
1068     * Extensions/umn_mapserver/mf_handle.py: Removed the image_type import
1069     statement, because its not needed anymore. The Outputformat is now
1070     given as string from the object. Make some formal changes to the code.
1071    
1072     * Extensions/umn_mapserver/test/test_mapserver.py: Added new test for
1073     most of the new setting which were added during the last changes.
1074     Removed the MF_Size Test.
1075    
1076     * Extensions/umn_mapserver/test/test.map: Added a new class to the
1077     cultural Layer to test expressions and the the status of that layer
1078     from on to default.
1079     Changed the data path the the correct Thuban Data
1080     Added the Outputformat Object and Symbol Object
1081    
1082 jschuengel 2272 2004-07-07 Jan Schüngel <[email protected]>
1083    
1084     * Extensions/umn_mapserver/mapfile.py: Added some new
1085     settings to edit (outputformat, label, imagetype)
1086    
1087     * Extensions/umn_mapserver/mf_handle.py: Added some setting to
1088     the Label Dialog and add the OutputDialog.
1089     Make some changes to the code order.
1090    
1091 jschuengel 2269 2004-07-06 Jan Schüngel <[email protected]>
1092    
1093     * Extensions/umn_mapserver/mapfile.py: Added the symbolObj, pointObj
1094     and line Obj and add the scalebar_status_type, scalebar_style_type and
1095     scalebar_position_type.
1096     Added the symbol- and symbolsetObject (MF_Symbol,MF_Symbolset). The
1097     are only used to create a Symbol like the circle in Thuban.
1098     Added the scalebarObject (MF_Scalebar)
1099     (MF_Class): Added set_status and get_status.
1100     (MF_Layer.add_thubanclass): Added code to set the class status
1101     (MF_Map): Added code to handle the symbols and scalebar
1102     (MF_Label): Added the set_partials and get_partials functions
1103    
1104     * Extensions/umn_mapserver/mf_export.py: Added MF_Symbol to import
1105     from mapfile. Added a function to create a circle object like the one
1106     from thuban if no one exists.
1107    
1108     * Extensions/umn_mapserver/mf_handle.py: All colors are now set when
1109     press ok in the assosiated dialog and not at the end of the
1110     colordialog.
1111     Added the Dialog for the Scalebar.
1112     (Label_Dialog): Added the offset option
1113    
1114     * Extensions/umn_mapserver/mf_import.py: Added code to import the
1115     status of the Classes.
1116     Fixed a bug with the projection. Now the to_meter parameter will be
1117     added to the Projection only if it doesn't exists.
1118    
1119 jschuengel 2264 2004-07-01 Jan Schüngel <[email protected]>
1120    
1121     Added the functionality to handle the content thuban is not
1122     able to handle directly.
1123    
1124     * Extensions/umn_mapserver/mf_handle.py: New. This module extents
1125     Thuban with the possibility to edit the mapfile content.
1126    
1127     * Extensions/umn_mapserver/mf_import.py: Added the possibility
1128     to import mapfiles without any layer selected. So it is possible
1129     to edit the other settings in a mapfile.
1130     (import_mapfile): Added code to use the editing functions.
1131     Added the possibility to import the projection to a layer if one
1132     is defined.
1133     Status settings (On,Off) will now set in thuban (visible, invisible).
1134     fixed a bug with with classnames. If no classname is set in mapfile
1135     the value in Thuban will set to the expression.
1136    
1137     * Extensions/umn_mapserver/mf_export.py(export_mapfile): Added the
1138     possibility to save a new mapfile or use the old one which is
1139     imported or new created.
1140     Added code to use the editing functions.
1141     Remove some not needed import statements
1142    
1143     * Extensions/umn_mapserver/mapfile.py: Added new types which are
1144     need for the editing functions.
1145     Added needed set-functions for the editing functions.
1146     Added the possibility to export rasterimages.
1147     Added new classes (MF_Web, MF_Label, MF_Legend, MF_Symbol,
1148     MF_SymbolSet). MF_Symbol and MF_SymbolSet are not needed at the
1149     moment.
1150     (MF_Class.set_thubanstyle): Now point layers will set to a default
1151     symbol to show a circle in mapserver and not only a 1px dot.
1152     (MF_Style.__init__): Fixed a bug with the color. Color was not set
1153     correct before.
1154     (MF_Size): Removed, because it is not needed.
1155    
1156     * Extensions/umn_mapserver/README: Added the hints to use the
1157     export and editing functions, too.
1158    
1159     * Extensions/umn_mapserver/sample/iceland.map: Added the
1160     new parameter "UNITS METERS".
1161     Change the political layer to status OFF.
1162    
1163     * Extensions/umn_mapserver/sample/README: Added some
1164     more details to setup the sample in the MapServer.
1165    
1166 bernhard 2256 2004-06-26 Bernhard Reiter <[email protected]>
1167    
1168     * Extensions/svgexport/test/test_svgmapwriter.py:
1169     Removed class VFile and used standard StringIO instead.
1170    
1171 jschuengel 2255 2004-06-23 Jan Schüngel <[email protected]>
1172    
1173     Add the export function to the umn_mapserver extension.
1174    
1175     * Extension/umn_mapserver/mf_export.py: New. This module extents
1176     Thuban with the possibility to export the Thuban content.
1177    
1178     * Extensions/umn_mapserver/mapfile.py: Expand the classes to use
1179     with the export module. Especially added the possibility to
1180     add thuban objects directly to the map objects.
1181    
1182     * Extensions/umn_mapserver/mf_import.py: Removed the wxCHANGE_DIR,
1183     because of the hint from Bernhard Herzog.
1184     Corrected the handling of absolute pathnames.
1185     Changed the Text of the Menu-Item, now the beginning is upper case.
1186    
1187     * Extensions/umn_mapserver/README: Added the --with-tiff statement.
1188    
1189 jschuengel 2250 2004-06-16 Jan Schüngel <[email protected]>
1190 jschuengel 2242
1191 jschuengel 2250 Add a sample and make some changes.
1192    
1193     * Extension/umn_mapserver/mf_import.py: Changed the wxPython.wx
1194     import from * to explicit used statements. Changed the
1195     Thuban.UI.mainwindow import phrase, too.
1196     (import_mapfile):Corrected a clerical mistake.
1197     Added wxCHANGE_DIR in OpenFile Dialog.
1198     Added a MultipleChoiceDialog, to select the layers to load from
1199     mapfile into thuban. Thereby the projection is only set if one layer
1200     is selected.
1201     Added the possibility to handle relative pathnames which uses
1202     up-level references.
1203     Removed some doubled code.
1204     Corrected an error with integer values used as label in thuban
1205     ClassGroup.
1206    
1207     * Extensions/umn_mapserver/sample: New.
1208    
1209     * Extensions/umn_mapserver/sample/README: New. Describes the
1210     usage of the sample files.
1211    
1212     * Extensions/umn_mapserver/sample/iceland.map: New. This is
1213     a suitable .map-file for the iceland data.
1214    
1215     * Extensions/umn_mapserver/sample/index.html: New. The template
1216     for the mapfile.
1217    
1218     * Extensions/umn_mapserver/sample/iceland.html: New. Initialisation
1219     file for the Iceland Application on web.
1220    
1221     * Extensions/umn_mapserver/README: Corrected a inaccuracy and added
1222     some details.
1223    
1224     * Extensions/umn_mapserver/test/test_mapserver
1225     (mapserver_import_Test_generalClasses.test_MF_Color):
1226     Corrected the thubancolor test.
1227    
1228     2004-06-15 Jan Schüngel <[email protected]>
1229    
1230 jschuengel 2242 * Extensions/umn_mapserver/README: New. Install instruction.
1231    
1232 bernhard 2240 2004-06-14 Bernhard Reiter <[email protected]>
1233    
1234     * libraries/thuban/cpl_mfile.h: Added copyright header.
1235    
1236     * libraries/thuban/ cpl_mfile.cpp, cpl_mfile.h: Added non-protecting
1237     Free Software License so that it is most useful with gdalwarp
1238     and bmpdataset.
1239    
1240 bh 2239 2004-06-14 Bernhard Herzog <[email protected]>
1241    
1242     * Thuban/UI/multiplechoicedialog.py (__version__): Add missing
1243     import of wxPython.wx itself (as opposed to the contents of
1244     wxPython.wx). For some reason wxPython.wx is available as
1245     wxPython.wx.wx in at least some 2.4 releases. Fixes RT#2482
1246     wrt. wxPython 2.4.
1247    
1248 jschuengel 2238 2004-06-10 Jan Schüngel <[email protected]>
1249    
1250     Initial version of new extension "umn_mapserver". This extension aims
1251     to manage configuration for the UMN MapServer application. This
1252     inital version just imports the .map-files and displays all, Thuban is
1253     capable of.
1254    
1255     * Extensions/umn_mapserver, Extensions/umn_mapserver/test: New.
1256    
1257     * Extensions/umn_mapserver/test/README: New. Describes how to run the
1258     tests.
1259    
1260     * Extensions/umn_mapserver/test/test.map: New. This is a test
1261     .map-file for automated tests of the umn_mapserver extension of
1262     Thuban.
1263    
1264     * Extensions/umn_mapserver/test/test_mapserver.py: New. Tests for
1265     UMN Mapserver classes.
1266    
1267     * Extensions/umn_mapserver/__init__.py: New. Init to make this
1268     directory a package.
1269    
1270     * Extensions/umn_mapserver/mapfile.py: New. Classes to represent
1271     '.map'-file objects.
1272    
1273     * Extensions/umn_mapserver/mf_import.py: New. This module extends
1274     Thuban with the possibility to handle UMN MapServer mapfiles.
1275    
1276 bh 2230 2004-06-03 Bernhard Herzog <[email protected]>
1277    
1278     * Thuban/Model/layer.py (Layer.TreeInfo): Convert the bounding box
1279     to a tuple before using it as arguments to the % operator. This
1280     fixes the formatting issue filed in RT#2239 on 2004-01-13 and
1281     reported today on thuban-list by Jan Schüngel
1282    
1283     * test/test_layer.py (TestLayerModification.setUp): Save the
1284     filename as an instance variable so we can refer to it in tests
1285     (TestLayerModification.test_tree_info): Uncomment this method
1286     again and make it work. This tests for the formatting issue
1287     filed in RT#2239 on 2004-01-13
1288    
1289 bh 2224 2004-05-28 Bernhard Herzog <[email protected]>
1290    
1291     * Thuban/UI/baserenderer.py: Fix some typos.
1292    
1293 jan 2217 2004-05-18 Jan-Oliver Wagner <[email protected]>
1294    
1295     * Extensions/gns2shp/gns2shp.py (gns2shp): Fixed a bug
1296     by increasing a field size.
1297    
1298 bh 2213 2004-05-17 Bernhard Herzog <[email protected]>
1299    
1300     Update to newest shapelib and get rid of Thuban specific
1301     extensions, i.e. use the new DBFUpdateHeader instead of our
1302     DBFCommit kludge
1303    
1304     * libraries/shapelib/shpopen.c: Update to version from current
1305     shapelib CVS.
1306    
1307     * libraries/shapelib/shapefil.h: Update to version from current
1308     shapelib CVS.
1309    
1310     * libraries/shapelib/dbfopen.c: Update to version from current
1311     shapelib CVS.
1312     (DBFCommit): Effectively removed since shapelib itself has
1313     DBFUpdateHeader now which is better for what DBFCommit wanted to
1314     achieve.
1315     We're now using an unmodified version of dbfopen.
1316    
1317     * setup.py (extensions): Add the HAVE_UPDATE_HEADER macro with
1318     value '1' to the Lib.dbflibc extension. This simply reflects the
1319     shapelib and pyshapelib updates
1320    
1321 jan 2211 2004-05-16 Jan-Oliver Wagner <[email protected]>
1322    
1323     Finished introduction of Menu.FindOrInsertMenu.
1324    
1325     * Extensions/drawshape/drawshape.py: Add the command
1326     to the experimental menu additionally to the toolbar.
1327    
1328     * Extensions/svgexport/svgsaver.py: Use FindOrInsertMenu() instead of
1329     finding menu on its own.
1330    
1331     * Doc/manual/thuban-manual.xml: updated sample file
1332     to use FindOrInsertMenu().
1333    
1334     * Examples/simple_extensions/hello_world.py: Use FindOrInsertMenu()
1335     instead of finding menu on its own.
1336    
1337 jan 2206 2004-05-11 Jan-Oliver Wagner <[email protected]>
1338    
1339     * test/test_menu.py (MenuTest.test): Added testing
1340     of method Menu.FindOrInsertMenu.
1341    
1342 jan 2204 2004-05-10 Jan-Oliver Wagner <[email protected]>
1343    
1344     Introduce and use Menu.FindOrInsertMenu.
1345    
1346     * Thuban/UI/menu.py (Menu.FindOrInsertMenu): New. Find a
1347     given menu or, if not found, insert it.
1348    
1349     * Extensions/bboxdump/bboxdump.py, /Extensions/gns2shp/gns2shp.py,
1350     /Extensions/importAPR/importAPR.py, Extensions/profiling/profiling.py,
1351     /Extensions/wms/wms.py: Use FindOrInsertMenu() instead of finding
1352     menu on its own.
1353    
1354 jan 2201 2004-05-06 Jan-Oliver Wagner <[email protected]>
1355    
1356     Introduce a abstract ColorDialog class and remove
1357     and outdated file.
1358    
1359     * Thuban/UI/proj4dialog.py: Removed. It is has been
1360     replaced by projdialog for quite a while and is not used
1361     anymore.
1362    
1363     * Thuban/UI/colordialog.py: New. Abstraction for color selection
1364     dialog(s).
1365    
1366     * Thuban/UI/classifier.py (SelectPropertiesDialog.__GetColor):
1367     Now calls the abstract ColorDialog instead of wxColourDialog.
1368     This also removed the dependency to Color class conversion
1369     from this function.
1370    
1371 frank 2197 2004-05-04 Frank Koormann <[email protected]>
1372    
1373     * Extensions/bboxdump/__init__.py: Fixed string left over from
1374     copying.
1375    
1376     * Extensions/bboxdump/bboxdump.py (bboxdump):
1377     Use layer.ShapeStore().AllShapes() to loop over shapes instead of
1378     xrange(layer.NumShapes()). Compile the bboxmessage from a list
1379     of formatted outputs (string.join) instead of appending to the
1380     message. Two progress bar dialogs to report progress on the sometimes
1381     lenghty processing.
1382    
1383 frank 2196 2004-04-22 Frank Koormann <[email protected]>
1384    
1385     New Extension to dump bounding boxes of all shapes of the selected
1386     layer. An optional column can be specified to group the objects,
1387     in this case the bounding box is a union of the separate boxes.
1388     Dump can be displayed in a ScrolledMessageDialog or written to file.
1389     The Extension is simply a combination of available and well tested
1390     Thuban functionality.
1391    
1392     * Extensions/bboxdump/__init__.py: New: Init to make this
1393     directory a package.
1394    
1395     * Extensions/bboxdump/bboxdump.py: New: Dump bounding boxes of
1396     all shapes of the selected layer.
1397    
1398 jan 2192 2004-04-22 Jan-Oliver Wagner <[email protected]>
1399    
1400     * Thuban/UI/classgen.py (GenUniquePanel.__init__): Fixed two
1401     strings to be i18n now.
1402    
1403 jan 2188 2004-04-18 Jan-Oliver Wagner <[email protected]>
1404    
1405     Changing popup menu of legend from direct building
1406     to using the Menu construction as used for the mainwindow.
1407    
1408     * Thuban/UI/mainwindow.py: New method commands: layer_to_top,
1409     layer_to_bottom, layer_visibility
1410     (MainWindow.LayerToTop): New. Put current layer to the top.
1411     (MainWindow.LayerToBottom): New. Put current layer to bottom.
1412     (MainWindow.HideLayer, MainWindow.ShowLayer, _has_visible_map):
1413     Replace 1,0 by True, False.
1414     (MainWindow.ToggleLayerVisibility): New. Toggle visibility of
1415     current layer.
1416     (MainWindow.LayerShowTable): Removed raising of dialog.
1417     (_has_selected_layer_visible): New. Support function.
1418    
1419     * Thuban/UI/legend.py: ID_POP_xxx: removed.
1420     (LegendPanel.__init__): Removed EVT_MENU bindings.
1421     (LegendTree._OnRightClick): Replace direct creation of
1422     menu via wx Classes by applying the menu definition
1423     as of Menu class of menu.py.
1424    
1425 jan 2185 2004-04-16 Jan-Oliver Wagner <[email protected]>
1426    
1427     * Thuban/UI/exceptiondialog.py (ExceptionDialog.dialog_layout): Improved
1428     button string to stronger clearify that Thuban will be closed when hitting
1429     the button.
1430    
1431     * Thuban/UI/mainwindow.py (MainWindow.LayerShowTable): Added docstring.
1432     Now for layers without a ShapeStore a corresponding message is given
1433     to the user, that this layer has no table to show.
1434    
1435 joey 2182 2004-04-15 Martin Schulze <[email protected]>
1436    
1437     * Extensions/wms/layer.py (WMSLayer.setWMSFormat): Need to
1438     recalculate the format for the internal render engine as well.
1439    
1440     * Extensions/wms/properties.py (wmsProperties): First start for a
1441     properties dialog. It's functional for a first selection of
1442     layers, but still has some weired wxWidgets/GTK problems but
1443     beautification can be done later.
1444    
1445     * Extensions/wms/layer.py: Added more documentation
1446     (WMSLayer.getFormats): New: Return list of supported image formats
1447     by the WMS server
1448     (WMSLayer.getLayers): New: Return the list of layer names
1449     supported by the WMS server
1450     (WMSLayer.getLayerTitle): New: Return the title of the named layer
1451     (WMSLayer.getWMSFormat): New: Return the image format that is used
1452     for WMS GetMap requests
1453     (WMSLayer.setWMSFormat): New: Set the image format that is used
1454     for WMS GetMap requests
1455     (WMSLayer.__init__): Move away from using only one layer to using
1456     a list of layers (unsorted at the moment, though).
1457     (WMSLayer.getVisibleLayers): New: Return the list of names for all
1458     visible layers
1459     (WMSLayer.setVisibleLayers): New: Set the list of names for all
1460     visible layers
1461    
1462     * Extensions/wms/wms.py: Moved the WMS layer into layer.py in
1463     order to establish a clean structure.
1464    
1465     * Extensions/wms/layer.py: Moved the WMS layer into a file on its
1466     own in order to establish a clean structure.
1467    
1468 joey 2174 2004-04-13 Martin Schulze <[email protected]>
1469    
1470     * Extensions/wms/parser.py (WMSCapabilitiesParser.grok): Added
1471     support for oldstyle (WMS 1.0 apparently) image format
1472     specification.
1473    
1474     * Extensions/wms/wms.py (WMSLayer.calcFormat): Reduce the list of
1475     supported graphic formats back to JPEG and BMP, PNG and others are
1476     too *cough* experimental... Sorry, I meant to filter this out
1477     before I committed this part. This should make the WMS extension
1478     run from CVS again.
1479     (wms_dialog): Reset an empty URL to None so that the subsequent
1480     program can depend on this, since the dialog will indeed return an
1481     empty URL, causing another declaration of love by Python.
1482    
1483     * Extensions/wms/parser.py (WMSCapabilitiesParser.getLayerBBox):
1484     Whenever a native BoundingBox request cannot be fulfilled, check
1485     whether the requested SRS is EPSG:3426, in which case return the
1486     LatLonBoundingBox values.
1487    
1488     * Extensions/wms/test/test_parser.py
1489     (TestWMSCapabilitiesParser.test_LayerSRS): Added a test for
1490     ignoring AUTO:* SRS.
1491     (TestWMSCapabilitiesParser.test_LatLonBoundingBoxes_as_bboxes):
1492     Added another test method to test whether the LatLonBoundingBox
1493     values will be returned if BoundingBox values are requested with
1494     SRS set to EPSG:3426.
1495    
1496     * Extensions/wms/parser.py (WMSCapabilitiesParser.peekLayers):
1497     Added rudimentary support for non-EPSG SRS, i.e. ignore them for
1498     the moment by placing them into a variable which is currently
1499     unused. Also test whether the EPSG SRS is numerical as it should
1500     be and add an error message if it is not.
1501    
1502     * Extensions/wms/test/sample.xml: Added AUTO:* SRS since they
1503     appear in the real world as well. Since we cannot handle them yet
1504     (OGCLib can't either), we will ignore them for the moment.
1505    
1506     * Extensions/wms/parser.py: Use a variable for denoting the sample
1507     filename
1508     (WMSCapabilitiesParser.peekLayers): Added support for error
1509     messages during grok(). They will be aggregated in an array and
1510     may be displayed later. We may have to add a classification
1511     "Warning" and "Error" to this. That requires more experience,
1512     though, since not every error may be lethal.
1513    
1514     * Thuban/UI/mainwindow.py (MainWindow.LayerShowTable): Raise the
1515     ShowTable() dialog/frame when the user attempts to display it
1516     while it has been opened before already and not closed again.
1517    
1518 joey 2161 2004-04-11 Martin Schulze <[email protected]>
1519    
1520     * Extensions/wms/infodialog.py: Adjusted the class documentation
1521    
1522     * Extensions/wms/wms.py (WMSLayer.__init__, WMSLayer.GetMapImg):
1523     Switch to using Thuban{Begin,End}BusyCursor instead of the pure
1524     wxWidgets variants.
1525     (WMSLayer.__init__): The epsg_id variable is named top_srs now.
1526    
1527     * Extensions/wms/infodialog.py: Added an information dialog that
1528     will display various information about the WMS current resource,
1529     so that additional information such as the title, the abstract,
1530     fees and access constraints can be displayed for the user if they
1531     are documented in the WMS XML.
1532    
1533 joey 2156 2004-04-10 Martin Schulze <[email protected]>
1534    
1535     * Extensions/wms/parser.py (WMSCapabilitiesParser.grok): Adjusted
1536     string handling. It's "foo".lower() and not lower(foo) without
1537     lower imported from strings or something.
1538    
1539     * Extensions/wms/wms.py (WMSLayer): Incorporated WMSCapabilities
1540     from capabilities.py and parser.py. Implement priority list for
1541     supported graphics formats, take care of wbmp != bmp. PNG, TIFF
1542     and GIF are supported here, but not yet by main Thuban. Hence,
1543     support for them may be removed later. Special contribution to
1544     usability: get wxWidgets to change the cursor when we're waiting
1545     for data from the network so the user won't start to worry. This
1546     causes a redrawing error/warning, though.
1547    
1548     * Extensions/wms/parser.py (WMSCapabilitiesParser.grok): Unlink
1549     the DOM object.
1550    
1551     2004-04-01 Martin Schulze <[email protected]>
1552    
1553     * Extensions/wms/capabilities.py: Adjusted documentation
1554     (WMSCapabilities.__init__): Improved documentation, fixed syntax
1555     (WMSCapabilities.saveCapabilities): Only catch IOError when
1556     handling files
1557     (WMSCapabilities.loadCapabilities): Only catch IOError when
1558     handling files
1559     __main__: corrected variable naming
1560     (WMSCapabilities.fetchCapabilities,loadCapabilities): Make this
1561     class a specialisation of WMSCapabilitiesParser as well. Also
1562     execute grok() after loading or fetching capabilities, if that
1563     went well, so that subsequent calls can already access the data.
1564     (WMSCapabilities.getVersion): Export the used version of the
1565     GetCapabilities request, so we can use it for subsequent calls,
1566     i.e. for GetMap requests.
1567     (WMSCapabilities.fetchCapabilities): Added proper error handling
1568     when the GetCapabilities request failed, so that the surrounding
1569     program can act accordingly.
1570    
1571 joey 2146 2004-03-30 Martin Schulze <[email protected]>
1572    
1573     * Extensions/wms/parser.py (WMSCapabilitiesParser.getLayerSRS):
1574     Adjusted the getLayerSRS method to return the list of SRSes
1575     extracted from <SRS> elements instead of <BoundingBox> elements.
1576     Added a bit of documentation as well.
1577     (WMSCapabilitiesParser.checkLayerSRS): Removed integrity test
1578     since it was only implemented due to a misunderstanding.
1579    
1580     * Extensions/wms/test/test_parser.py
1581     (TestWMSCapabilitiesParser.test_LayerSRS): Adjust the tests to
1582     reflect the corrected interpretation of the standard: i.e. a layer
1583     does not have to define a BoundingBox for all SRSes it supports.
1584     Hence the <SRS></SRS> specification is authoritative, not the list
1585     of BoundingBoxes.
1586     (TestWMSCapabilitiesParser.test_BoundingBoxes): Added a new test
1587     to ensure None is returned for a non-existing SRS.
1588     (TestWMSCapabilitiesParser.test_grok): Removed test_grok method
1589     since it is not applicable anymore. Listing more SRSes in <SRS>
1590     elements is valid according to the specs.
1591    
1592 bernhard 2140 2004-03-26 Bernhard Reiter <[email protected]>
1593 joey 2146
1594 bernhard 2140 * README: Nicer formatting of text. Improved descriptions.
1595     Reflected wxWidgets name change.
1596    
1597     * Thuban/UI/about.py: Extended copyright to 2004 and added
1598     information about the thuban-devel mailinglist.
1599    
1600 joey 2138 2004-03-24 Martin Schulze <[email protected]>
1601 joey 2120
1602 joey 2138 * Extensions/wms/capabilities.py: Renamed the class to contain
1603     'WMS', also added a linebreak where required
1604    
1605     * Extensions/wms/parser.py: Finally added the XML parser for the
1606     GetCapabilities response.
1607    
1608     * Extensions/wms/test/sample.xml: Adjusted the sample file so that
1609     <SRS> elements match the <BoundingBox> elements, except for the
1610     layer 'beschriftung'.
1611    
1612     * Extensions/wms/test/test_parser.py: Encode non-ascii strings
1613     since Python uses unicode strings internally, otherwise
1614     comparisons will fail. Removed tests for getLayerBBoxSRS() since
1615     the SRS will be calculated anyway and this method is obsoleted by
1616     getLayerSRS(). Denote SRS as strings and not as cardinal numbers.
1617     Move loading the sample file into the setUp method. Added a test
1618     for finding the integrity problem in the sample response.
1619     Improved formatting.
1620    
1621     * Extensions/wms/domutils.py: Added convenience routines for
1622     handling of Document Object Model (DOM) nodes.
1623    
1624     * Extensions/wms/test/test_domutils.py: Added a test for the
1625     domutils module
1626    
1627     2004-03-19 Martin Schulze <[email protected]>
1628    
1629 joey 2120 * Extensions/wms/test/test_parser.py (TestWMSCapabilitiesParser):
1630     Moved path detection and adding into a module of its own,
1631     adjustpath, which exports thubandir as main Thuban directory.
1632    
1633     * Extensions/wms/test/test_ogclib.py (TestWMSLib): Moved path
1634     detection and adding into a module of its own, adjustpath, which
1635     exports thubandir as main Thuban directory. Reorganised the
1636     module in order to support the SkipTest feature for Thuban test
1637     cases.
1638    
1639     * Extensions/wms/test/adjustpath.py: Moved path detection and
1640     adding into a module of its own.
1641    
1642 joey 2115 2004-03-18 Martin Schulze <[email protected]>
1643    
1644     * Extensions/wms/test/test_parser.py: Added another test for
1645     checking whether the WMS XML parser (to be implemented) returns
1646     the information we expect. This requires a sample WMS WML file
1647     (sample.xml) which has been extracted from the frida server and
1648     "improved" manually.
1649    
1650     * Extensions/wms/test/test_ogclib.py: Added legacy code to add the
1651     main Thuban directory to the path in order to be able to import
1652     random modules. Adjusted the PyOGCLib detection to reuse the
1653     information gathered. Also added a note about the PYTHONPATH
1654     environment variable.
1655    
1656     * Extensions/wms/test/test_ogclib.py: The format specification is
1657     a mime-type, not a graphic format, hence image/jpeg wou ld be the
1658     proper format and not JPEG. We'll also have to take care of the
1659     encoding of / as %2F.
1660    
1661 joey 2111 2004-03-16 Martin Schulze <[email protected]>
1662    
1663     * Extensions/wms/test/test_ogclib.py: Added a (hopefully)
1664     comprehensive test for the getMapURL method, built compare URLs
1665     according to the documentation in OGC 01-068r3
1666    
1667     * Extensions/wms/capabilities.py (WMSCapabilities): Added the
1668     class WMSCapabilities to manage capabilites, will incorporate
1669     parsing the capabilities response and provide details for other
1670     classes.
1671    
1672 bh 2105 2004-03-12 Bernhard Herzog <[email protected]>
1673    
1674 bh 2107 Support views in addition to normal tables in the postgis
1675     shapestore
1676    
1677     * Thuban/Model/postgisdb.py
1678     (PostGISShapeStore._fetch_table_information): Add a fallback for
1679     the case where the table name is not in the geometry_columns
1680     table. This is usually the case for views. Also, set
1681     self.shapestore here.
1682     (PostGISShapeStore.ShapeType): No need to query the database all
1683     the time. The shape type is now determined in
1684     _fetch_table_information
1685    
1686     * test/postgissupport.py (PostgreSQLServer.new_postgis_db)
1687     (PostgreSQLServer.get_static_data_db, PostGISDatabase.__init__):
1688     New parameter to specify views.
1689     (PostGISDatabase.has_data): Also compare the views. New views
1690     parameter
1691     (PostGISDatabase.initdb): Create the views.
1692     (PostgreSQLServer.get_default_static_data_db): Add the v_landmarks
1693     view
1694    
1695     * test/test_postgis_db.py
1696     (TestPostGISShapestorePointFromViews): New. Test a
1697     PostGISShapeStore with a view
1698     (TestPostGISShapestorePointOIDAsGIDColumn.setUp): Pass the name of
1699     the geometry_column explicitly to test whether that works
1700    
1701     2004-03-12 Bernhard Herzog <[email protected]>
1702    
1703 bh 2105 Final step for explicit id/geometry columns: Loading and saving
1704    
1705     * Resources/XML/thuban-1.1.dtd: New. Derived from thuban-1.0.dtd
1706     with the following changes:
1707     (dbshapesource): Two new attributes id_column and geometry_column
1708    
1709     * Thuban/Model/save.py (SessionSaver.write): Use the new dtd
1710     (SessionSaver.write_session): Use the new namespace
1711     (SessionSaver.write_data_containers): Write the new dbshapesource
1712     parameters
1713    
1714     * Thuban/Model/load.py (SessionLoader.__init__): New namespace for
1715     the new file format version
1716     (SessionLoader.start_dbshapesource): Handle the new db parameters
1717    
1718     * test/test_save.py: Update to the new dtd and namespace
1719     (SaveSessionTest.test_save_postgis): Update the NonConnectionStore
1720     mock object to provide a working IDColumn method.
1721    
1722     * test/test_load_1_0.py: New. Copy of the test_load.py before
1723     today's changes but with the round-trip tests removed.
1724    
1725     * test/test_load_0_9.py: Update doc-string.
1726    
1727     * test/test_load.py: Update all .thuban files to the new dtd and
1728     namespace.
1729     (TestPostGISLayer.file_contents): Add the new dbshapesource
1730     paramters
1731    
1732 bh 2100 2004-03-11 Bernhard Herzog <[email protected]>
1733    
1734 bh 2103 Next step for explicit id/geometry columns: User interaction
1735    
1736     * Thuban/UI/dbdialog.py (ChooseDBTableDialog.__init__): Rework how
1737     the dialog is constructed. Add combo boxes to select id and
1738     geometry column. Rename some instance variables.
1739     (ChooseDBTableDialog.GetTable): Return id and geometry column
1740     names
1741     (ChooseDBTableDialog.OnTableSelect): New. Event handler for
1742     selections in the table list
1743    
1744     * Thuban/UI/mainwindow.py (MainWindow.AddDBLayer): Use id_column
1745     and geometry_column
1746    
1747     * Thuban/Model/session.py (Session.OpenDBShapeStore): Add the new
1748     parameters for id_column and geometry column of PostGISShapeStore
1749     here as well.
1750    
1751     * Thuban/Model/postgisdb.py (type_map): Add ROWID psycog type.
1752     (_raw_type_map): New. Map raw PostgreSQL type ints to thuban types
1753     (PostGISConnection.GeometryTables): Use a better query to
1754     determine which relations in the database might be usable for
1755     shapestores. Now supports views as well but is more PostgreSQL
1756     specific
1757     (PostGISConnection.table_columns): New. Somewhat experimental
1758     method to let the db dialogs provide lists of columns to users so
1759     that they can select id and geometry columns.
1760     (PostGISTable.__init__): The default value of the id_column
1761     parameter is now None it still means "gid" effectively, though.
1762     (PostGISTable.IDColumn): New introspection method to return a
1763     column object for the id column
1764     (PostGISShapeStore.GeometryColumn): New introspection method to
1765     return a column object for the geometry column
1766    
1767     * test/test_postgis_db.py
1768     (TestPostGISConnection.test_gis_tables_non_empty):
1769     Removed. Subsumed by the new:
1770     (TestPostGISConnection.test_gis_tables_with_views_and_tables):
1771     New. Tes the GeometryTables and table_columns methods with actual
1772     tables and views.
1773     (PointTests.test_id_column, PointTests.test_geometry_column):
1774     New. tests for the new methods.
1775     (TestPostGISShapestorePoint.setUp)
1776     (TestPostGISShapestorePointSRID.setUp)
1777     (TestPostGISShapestorePointExplicitGIDColumn.setUp): Fill the
1778     instance variables needed by the new tests
1779    
1780     2004-03-11 Bernhard Herzog <[email protected]>
1781    
1782 bh 2100 * Thuban/UI/classgen.py (GenQuantilesPanel.GetList): The row
1783     numbers given to ReadValue are ordinals.
1784    
1785     2004-03-11 Bernhard Herzog <[email protected]>
1786    
1787     Elimiate the requirement for PostGIS tables to have a column
1788     called "gid".
1789    
1790     * Thuban/Model/postgisdb.py (PostGISTable.__init__): New parameter
1791     id_column to specify which column to use to identify rows. Also
1792     new instance variables id_column and quoted_id_column
1793     (PostGISTable.RowIdToOrdinal, PostGISTable.RowOrdinalToId)
1794     (PostGISTable.ReadRowAsDict, PostGISTable.ReadValue)
1795     (PostGISTable.SimpleQuery): Use the id column name provided to the
1796     constructor instead of "gid"
1797     (PostGISShapeStore.__init__): New parameter id_column analogously
1798     to PostGISTable.__init__. This parameter is simply passed through
1799     to the base class constructor
1800     (PostGISShapeStore._create_col_from_description): Fix typo in
1801     doc-string
1802     (PostGISShapeStore.Shape, PostGISShapeStore.AllShapes)
1803     (PostGISShapeStore.ShapesInRegion): Use the id column name
1804     provided to the constructor instead of "gid"
1805    
1806     * test/postgissupport.py
1807     (PostgreSQLServer.get_default_static_data_db): New static table
1808     landmarks_point_id with an id column != "gid. Update the comments
1809     a bit.
1810     (skip_if_addgeometrycolumn_does_not_use_quote_ident): Fix typo in
1811     doc-
1812     (upload_shapefile): New parameter gid_column to use a name other
1813     than "gid" for the column to store the shape ids
1814    
1815     * test/test_postgis_db.py (TableTests): New. Mixin-class
1816     containing all tests previously in TestPostGISTable. The actual
1817     tests are the same but the code is a bit more configurable to
1818     allow for different id columns etc.
1819     (TestPostGISTable): Derive from TableTests now for the actual
1820     tests.
1821     (TestPostGISTableExplicitGIDColumn): New. Like TestPostGISTable
1822     except that it the landmarks_point_id table to test the id_column
1823     parameter
1824     (PointTests): Extend the doc-string
1825     (TestPostGISShapestorePointExplicitGIDColumn)
1826     (TestPostGISShapestorePointOIDAsGIDColumn): New classes derived
1827     from PointTests to test the explicit id_column parameter. One
1828     tests with the name of the column holding the shape ids, the other
1829     uses PostgreSQL's OID column. For the latter a number of methods
1830     have to be overwritten to make them independent of the actual id
1831     values.
1832    
1833 silke 2095 2004-03-08 Silke Reimer <[email protected]>
1834    
1835     Update debian directory:
1836    
1837     * debian/changelog: Added new version.
1838     * deiban/rules: Updated management of patches (with cbds)
1839     * debian/control: Added cbds to dependencies
1840     * debian/patches/*: New. Adds better support for patches of thuban in
1841     debian
1842     * debian/menu: Syntax of menu changed slightly
1843     * debian/setup.py.patch: removed because it has been moved to
1844     debian/patechs/setup.py.patch
1845    
1846    
1847 bh 2094 2004-02-26 Bernhard Herzog <[email protected]>
1848    
1849     Create the Doc/technotes directory for text files with information
1850     for developers
1851    
1852     * Doc/technotes/README: New. README for the technotes
1853    
1854     * Doc/technotes/coding_guidelines.txt: New. Coding guidelines for
1855     Thuban
1856    
1857     * Doc/technotes/release_process.txt: New. Used to be
1858     HOWTO-Release. Now slightly adapted to technote formatting style.
1859    
1860     * HOWTO-Release: Removed. It's contents are now in
1861     Doc/technotes/release_process.txt
1862    
1863 bh 2089 2004-02-25 Bernhard Herzog <[email protected]>
1864    
1865     * libraries/thuban/wxproj.cpp (get_wx_version): New. Return the
1866     version of wxWindows the module was compiled with so we can check
1867     that against the wxPython version.
1868    
1869     * Thuban/version.py (thuban_branch, thuban_release): New variables
1870     controlling which and how Thuban versions are shown. See the
1871     comments for details.
1872     (verify_versions): Also check that the wx version that wxproj is
1873     compiled against matches that of the wxPython we use at runtime
1874    
1875 bh 2080 2004-02-20 Bernhard Herzog <[email protected]>
1876    
1877 bh 2087 * Extensions/wms/wms.py (epsg_code_to_projection): Use
1878     get_system_proj_file to read the epsg projections. The old way
1879     depended on the current directory being the top Thuban directory.
1880    
1881     2004-02-20 Bernhard Herzog <[email protected]>
1882    
1883 bh 2085 * Extensions/svgexport/test/test_svgmapwriter.py
1884     (TestVirtualDC.test_clippath): Remove a debug print
1885    
1886     2004-02-20 Bernhard Herzog <[email protected]>
1887    
1888 bh 2083 * Extensions/svgexport/__init__.py: New. Turn
1889     Extensions/svgexport into a package.
1890    
1891     * Extensions/svgexport/svgmapwriter.py: Reorder the imports and
1892     doc-string a bit. The doc-string must come first, otherwise it's
1893     not a doc-string. The __future__ import must be the first thing
1894     after the doc-string. Use only double quotes in doc-strings.
1895     Single quotes trip up emacs syntax highlighting if the text
1896     contains apostrophes.
1897    
1898     2004-02-20 Bernhard Herzog <[email protected]>
1899    
1900 bh 2080 * Extensions/svgexport/test/__init__.py,
1901     Extensions/svgexport/test/test_svgmapwriter.py: New. Initial test
1902     suite for svgexport
1903    
1904     * test/runtests.py (find_test_modules): New. Function with the
1905     module finding code from main.
1906     (main): Use find_test_modules to figure out the default test
1907     modules and take modules from Extensions.svgexport.test too.
1908    
1909 bh 2075 2004-02-19 Bernhard Herzog <[email protected]>
1910    
1911 bh 2077 * Thuban/UI/application.py (ThubanApplication.OnInit): Make sure
1912     the mainwindow has a reference to the map of the initial session.
1913     This fixes a bug introduced with the fix for RT#2245
1914    
1915     2004-02-19 Bernhard Herzog <[email protected]>
1916    
1917 bh 2075 * Extensions/svgexport/svgsaver.py,
1918     Extensions/svgexport/svgmapwriter.py,
1919     Extensions/svgexport/maplegend.py: Added again. This time in the
1920     correct place.
1921    
1922 bh 2070 2004-02-17 Bernhard Herzog <[email protected]>
1923    
1924 bh 2073 Fix for RT#2245
1925    
1926     * Thuban/UI/application.py (ThubanApplication.OnInit): Initialize
1927     instance variables before trying to create any windows. Creating
1928     windows can start an event loop if e.g. message boxes are popped
1929     up for some reason, and event handlers, especially EVT_UPDATE_UI
1930     may want to access things from the application.
1931     (ThubanApplication.maps_changed): The mainwindow may not have been
1932     created yet, so check whether it has been created before calling
1933     its methods
1934    
1935     * Thuban/UI/view.py (MapCanvas.OnIdle): Only try to redraw if we
1936     have a map
1937    
1938     2004-02-17 Bernhard Herzog <[email protected]>
1939    
1940 bh 2070 * test/test_svgmapwriter.py, Extensions/svgsaver.py,
1941     Extensions/svgmapwriter.py, Extensions/maplegend.py,
1942     extensions/svgexport/svgsaver.py,
1943     extensions/svgexport/svgmapwriter.py,
1944     extensions/svgexport/maplegend.py: Removed. These files were in
1945     the wrong places or didn't work at all.
1946    
1947 bh 2067 2004-02-16 Bernhard Herzog <[email protected]>
1948    
1949 bh 2069 * Thuban/UI/view.py (MapCanvas.Export): Remove accidentally added
1950     line
1951    
1952     2004-02-16 Bernhard Herzog <[email protected]>
1953    
1954 bh 2067 * Thuban/UI/view.py (MapCanvas.Export): Avoid UnboundLocalError.
1955    
1956 mrechtie 2064 2004-02-15 Markus Rechtien <[email protected]>
1957    
1958     * Extensions/svgexport/svgmapwriter.py: New. Adds the capability
1959     to write a session to a file in SVG format.
1960     * Extensions/svgexport/svgsaver.py: New. Uses svgmapwriter.py
1961     to write a SVG map of a session.
1962     * Extensions/svgexport/maplegend: New. Writes a basic maplegend
1963     in SVG format for the current session.
1964    
1965 bh 2062 2004-02-13 Bernhard Herzog <[email protected]>
1966    
1967     * Thuban/UI/mainwindow.py (MainWindow.AddDBLayer): When the layer
1968     can't be created, return immediately after displaying the error
1969     message.
1970    
1971 bh 2060 2004-02-11 Bernhard Herzog <[email protected]>
1972    
1973     Handle postgis tables with more than one geometry column.
1974    
1975     * Thuban/Model/postgisdb.py
1976     (PostGISTable._fetch_table_information): Delegate the creation of
1977     column objects to a different method so that we can extend that in
1978     derived classes
1979     (PostGISTable._create_col_from_description): New. Column object
1980     creation part of _fetch_table_information
1981     (PostGISShapeStore._create_col_from_description): New. Extend
1982     inherited method to handle geometry columns
1983     (PostGISShapeStore.__init__): New parameter geometry_column to
1984     specify which geometry column to use. Optional but mandatory for
1985     tables with more than one geometry column
1986     (PostGISShapeStore._fetch_table_information): Also use the name of
1987     the geometry column when looking for the srid
1988     (PostGISShapeStore.ShapeType): Also use the name of the geometry
1989     column when looking for the shape type
1990    
1991     * test/test_save.py (SaveSessionTest.test_save_postgis): Adapt
1992     NonConnectionStore to changes in the PostGISShapeStore
1993    
1994     * test/test_postgis_db.py
1995     (TestPostGISSpecialCases.test_shapestore_two_geom_cols): Test
1996     PostGISShapeStore with tables having two geometry columns.
1997    
1998 bh 2058 2004-02-10 Bernhard Herzog <[email protected]>
1999    
2000     Fix some postgis problems. What remains to be done is real
2001     handling of SRIDs as they affect how reprojection is done
2002    
2003     * Thuban/Model/postgisdb.py (quote_identifier): Fix typo in
2004     doc-string
2005     (PostGISShapeStore._fetch_table_information): New. Extend
2006     inherited method to retrieve srid
2007     (PostGISShapeStore.BoundingBox): Handle tables without data.
2008     extent yields NULL for those
2009     (PostGISShapeStore.ShapesInRegion): Use the srid of the table.
2010    
2011     * test/test_postgis_db.py
2012     (TestPostGISSpecialCases.test_shapestore_empty_table): New test
2013     for the special case of a table without any data
2014     (TestPostGISShapestorePointSRID): New class with tests for a table
2015     that uses srids
2016     (PolygonTests): Fix a doc-string typo
2017    
2018     * test/postgissupport.py (PostGISDatabase.__init__): New parameter
2019     reference_systems with a specification of spacial reference
2020     systems to create in the new db.
2021     (PostgreSQLServer.new_postgis_db)
2022     (PostgreSQLServer.get_static_data_db): New parameter
2023     reference_systems to be passed through ultimately to
2024     PostGISDatabase. In new_postgis_db also check whether an existing
2025     db already has the right srids
2026     (PostgreSQLServer.get_default_static_data_db): Add srids and a
2027     table that uses srids
2028     (PostGISDatabase.initdb): Create the entries for the reference
2029     systems
2030     (PostGISDatabase.has_data): Add reference_systems parameter to
2031     check for those too
2032     (upload_shapefile): New parameter srid to create tables with a
2033     specific srid
2034    
2035 frank 2055 2004-02-06 Frank Koormann <[email protected]>
2036    
2037     * po/pt_BR.po: Fixed charset
2038    
2039 frank 2054 2004-02-05 Frank Koormann <[email protected]>
2040    
2041     * po/pt_BR.po: Fixed format string for error message, missing %s
2042     added (Thuban/UI/application.py:273)
2043    
2044 frank 2053 2004-02-03 Frank Koormann <[email protected]>
2045    
2046     First version of Portuguese (Brazilian) translation
2047    
2048     * po/pt_BR.po: New, translation of pot (2004-01-15 16:07+0300) for
2049     Brazilian Portuguese by Eduardo Patto Kanegae.
2050    
2051     * Thuban/UI/about.py (About.__init.py__): Added Eduardo to the list of
2052     translators.
2053    
2054    
2055 frank 2052 2004-01-22 Frank Koormann <[email protected]>
2056    
2057     * Doc/manual/thuban-manual.xml: Added section on installation of
2058     Thuban under Win32 systems. Fixed image path references in the postgis
2059     section. Some minor source formattings.
2060    
2061 frank 2051 2004-01-21 Frank Koormann <[email protected]>
2062    
2063     Make Thuban remember path selections (at least for one application run).
2064    
2065     * Thuban/UI/application.py (Application.OnInit): Initialize path as a
2066     attribute of application object. Path is a dictionary of
2067     strings, currently with the items "data" and "projection".
2068     (Application.SetPath): New, stores path for the specified item.
2069     (Application.Path): New, return path for the specified item.
2070    
2071     * Thuban/UI/mainwindow.py
2072     (MainWindow.OpenSession, MainWindow.SaveSessionAs,
2073     MainWindow.AddLayer, MainWindow.AddRasterLayer,
2074     MainWindow.TableOpen): Access "data" path information of the
2075     application.
2076    
2077     * Thuban/UI/projdialog.py (ProjFrame._OnImport, ProjFrame._OnExport):
2078     Access "projection" path information of the application.
2079    
2080 bh 2048 2004-01-05 Bernhard Herzog <[email protected]>
2081    
2082 bh 2050 * po/ru.po: Updated translations from Alex Shevlakov
2083    
2084     2004-01-05 Bernhard Herzog <[email protected]>
2085    
2086 bh 2048 * po/Makefile, po/README: Move the description of how to generate
2087     the translation statistics to the README.
2088    
2089 bh 2042 2003-12-23 Bernhard Herzog <[email protected]>
2090    
2091 bh 2045 * NEWS: Update for 1.0.0
2092    
2093     * po/it.po: Another update from Maurizio Napolitano
2094    
2095     2003-12-23 Bernhard Herzog <[email protected]>
2096    
2097 bh 2042 * po/it.po: Updated translation from Maurizio Napolitano
2098    
2099     2003-12-23 Bernhard Herzog <[email protected]>
2100    
2101     * Thuban/UI/join.py (JoinDialog.__init__): Mark one more string
2102     for translation
2103    
2104     * Thuban/UI/mainwindow.py (MainWindow.TableRename)
2105     (MainWindow.RenameMap, MainWindow.RenameLayer): Mark some more
2106     strings for translation
2107    
2108     * po/de.po: Update with the newly marked strings.
2109    
2110 bh 2033 2003-12-22 Bernhard Herzog <[email protected]>
2111    
2112 bh 2039 * HOWTO-Release: Fix the places where version numbers have to be
2113     updated
2114    
2115     2003-12-22 Bernhard Herzog <[email protected]>
2116    
2117 bh 2037 * setup.py (setup call): 1.0.0, yeah!
2118    
2119     * Thuban/version.py (longversion): 1.0.0, yeah!
2120    
2121     * Thuban/Model/load.py (SessionLoader.__init__): Accept the
2122     1.0.0 namespace too
2123    
2124     * Thuban/Model/save.py (SessionSaver.write_session): Save with
2125     1.0.0 namespace
2126    
2127     * test/test_load.py (LoadSessionTest.dtd)
2128     (TestSingleLayer.file_contents)
2129     (TestNonAsciiColumnName.file_contents)
2130     (TestLayerVisibility.file_contents)
2131     (TestClassification.file_contents, TestLabels.file_contents)
2132     (TestLayerProjection.file_contents)
2133     (TestRasterLayer.file_contents, TestJoinedTable.file_contents)
2134     (TestLabelLayer.file_contents, TestPostGISLayer.file_contents)
2135     (TestPostGISLayerPassword.file_contents)
2136     (TestLoadError.file_contents, TestLoadError.test): Update for
2137     1.0.0 namespace
2138    
2139     * test/test_save.py (SaveSessionTest.dtd)
2140     (SaveSessionTest.testEmptySession)
2141     (SaveSessionTest.testSingleLayer)
2142     (SaveSessionTest.testLayerProjection)
2143     (SaveSessionTest.testRasterLayer)
2144     (SaveSessionTest.testClassifiedLayer)
2145     (SaveSessionTest.test_dbf_table)
2146     (SaveSessionTest.test_joined_table)
2147     (SaveSessionTest.test_save_postgis): Update for 1.0.0 namespace
2148    
2149     2003-12-22 Bernhard Herzog <[email protected]>
2150    
2151 bh 2035 * Thuban/Model/load.py (SessionLoader.start_label): Make sure the
2152     alignment flags are byte strings not unicode and that they have
2153     valid values
2154    
2155     * test/test_load.py (TestLabelLayer): New. Test loading (and
2156     indirectly saving) of maps with labels.
2157    
2158     2003-12-22 Bernhard Herzog <[email protected]>
2159    
2160 bh 2033 * Thuban/UI/tableview.py (TableGrid.OnDestroy)
2161     (TableGrid.__init__): Handle EVT_WINDOW_DESTROY in the grid to
2162     unsubscribe all subscribers.
2163     (LayerTableFrame.OnDestroy): Do not unsubscribe any messages from
2164     self.grid since it may already have been destroyed.
2165     Fixes RT #2256
2166    
2167 bh 2031 2003-12-19 Bernhard Herzog <[email protected]>
2168    
2169     * po/fr.po, po/es.po: Updated translations from Daniel Calvelo
2170    
2171 bh 2028 2003-12-16 Bernhard Herzog <[email protected]>
2172 silke 2029
2173     * debian/bitmappath.patch, debian/setup.py.patch:
2174     added to ensure compliance with FHS for debian
2175     * debian/rules, debian/changelog:
2176     added patches in rules to ensure compliance with FHS for debian
2177 bh 2028
2178 silke 2029 2003-12-16 Bernhard Herzog <[email protected]>
2179    
2180 bh 2028 * po/Makefile (mo): Make the output a bit nicer so that it prints
2181     statistics about the translations. Add a comment how produce even
2182     nicer statistics with sed.
2183    
2184 frank 2026 2003-12-09 Frank Koormann <[email protected]>
2185    
2186     * Resources/Projections/defaults.proj:
2187     French projection sample with correct accents (UNICODE).
2188    
2189 bh 2025 2003-12-05 Bernhard Herzog <[email protected]>
2190    
2191     * MANIFEST.in: Add the devtools directory
2192    
2193     * setup.py (setup call): Use license instead of licence. This
2194     silences a deprecation warning on Python 2.3
2195    
2196 frank 2022 2003-12-05 Frank Koormann <[email protected]>
2197    
2198 frank 2023 Documentation synced with 1.0rc1
2199    
2200     * Doc/manual/thuban-manual.xml:
2201     Minor formatting changes and references to database layers .
2202     Introduction.Internationalization: New section on i18n.
2203     MapManagement.AddingandRemovingLayers: Added item on database layers.
2204     MapManagement.TheLegend: Added section and screenshot on popup menu.
2205     ProjectionManagement: Updated screenshot and sentence on EPSG.
2206     Appendix.SupportedDataSources: Added PostGIS.
2207     Appendix.WorkingwithPostGIS: New section.
2208    
2209     * Doc/manual/images/6_projection.png: Updated screenshot including
2210     EPSG checkboxes.
2211    
2212     * Doc/manual/images/3_5_popup_menu.png: New, popup menu screenshot.
2213    
2214     * Doc/manual/images/app_postgis_add_layer.png,
2215     Doc/manual/images/app_postgis_db_add.png,
2216     Doc/manual/images/app_postgis_db_management.png:
2217     New screenshots focussing on database layers
2218    
2219     2003-12-05 Frank Koormann <[email protected]>
2220    
2221 frank 2022 * Thuban/UI/projdialog.py (load_user_proj): If user.proj is missing
2222     write warning to stderr instead of rising a warning dialog
2223    
2224 bh 2016 2003-12-03 Bernhard Herzog <[email protected]>
2225    
2226 bh 2021 Fix for RT #2243
2227    
2228 bh 2020 * Thuban/UI/mainwindow.py (MainWindow.has_selected_shape_layer):
2229     New. Like has_selected_layer but for shape layers only
2230     (_has_selected_shape_layer): New. Like _has_selected_layer but for
2231     shape layers only
2232     (layer_show_table command, layer_jointable command): Use these
2233     commands should only be available for shape layers
2234    
2235     2003-12-03 Bernhard Herzog <[email protected]>
2236    
2237 bh 2018 * Thuban/UI/mainwindow.py (MainWindow.Unsubscribe): Deal with
2238     publishers that are wx objects and may have been destroyed by wx
2239     already. Fixes RT #2242.
2240    
2241     2003-12-03 Bernhard Herzog <[email protected]>
2242    
2243 bh 2016 * po/ru.po: Updates from Alex Shevlakov
2244    
2245 silke 2013 2003-12-03 Silke Reimer <silkeintevation.de>
2246    
2247     * debian/control, debian/changelog: Added gdal-support to
2248     debian package, updated to new thuban version
2249    
2250    
2251 bh 2012 2003-12-03 Bernhard Herzog <[email protected]>
2252    
2253     * Thuban/Lib/version.py: New. Module for version number
2254     manipulations. The version of make_tuple here also deals better
2255     with more unusual version number strings, such as e.g.
2256     "1.2+cvs20031111"
2257    
2258     * Thuban/version.py (make_tuple): Removed. It's now in
2259     Thuban.Lib.version. Use that implementation instead.
2260    
2261     * test/test_lib_version.py: New. Tests for Thuban/Lib/version.py
2262    
2263 bh 2005 2003-12-02 Bernhard Herzog <[email protected]>
2264    
2265 bh 2010 * MANIFEST.in: Add debian files
2266    
2267 bh 2008 * setup.py (setup call): Add packages for the Extensions so that
2268     they're installed too
2269     (data_files): Add READMEs and sample data from some Extensions
2270    
2271     * NEWS: Add note about the extensions in binary packages
2272    
2273     2003-12-02 Bernhard Herzog <[email protected]>
2274    
2275 bh 2005 * Thuban/Model/save.py (SessionSaver.write_session): Save files
2276     with the thuban-1.0rc1
2277    
2278     * Thuban/Model/load.py (SessionLoader.__init__): Recognize the
2279     thuban-1.0rc1 namespace too
2280    
2281     * test/test_save.py (SaveSessionTest.dtd)
2282     (SaveSessionTest.testEmptySession)
2283     (SaveSessionTest.testSingleLayer)
2284     (SaveSessionTest.testLayerProjection)
2285     (SaveSessionTest.testRasterLayer)
2286     (SaveSessionTest.testClassifiedLayer)
2287     (SaveSessionTest.test_dbf_table)
2288     (SaveSessionTest.test_joined_table)
2289     (SaveSessionTest.test_save_postgis): Update to thuban-1.0rc1
2290     namespace
2291    
2292     * test/test_load.py (LoadSessionTest.dtd): Update to thuban-1.0rc1
2293     namespace
2294     (TestSingleLayer.file_contents)
2295     (TestNonAsciiColumnName.file_contents)
2296     (TestLayerVisibility.file_contents)
2297     (TestClassification.file_contents, TestLabels.file_contents)
2298     (TestLayerProjection.file_contents)
2299     (TestRasterLayer.file_contents, TestJoinedTable.file_contents)
2300     (TestPostGISLayer.file_contents)
2301     (TestPostGISLayerPassword.file_contents)
2302     (TestLoadError.file_contents, TestLoadError.test): Update to
2303     thuban-1.0rc1 namespace
2304    
2305 bh 1996 2003-12-01 Bernhard Herzog <[email protected]>
2306    
2307 bh 2003 * setup.py (proj4_prefix, wx_prefix, gdal_prefix): Fix these for
2308     nt to better match Intevation's current w32 setup
2309    
2310 bh 2001 * HOWTO-Release: Add note about updating MANIFEST.in
2311    
2312     * MANIFEST.in: Add the Extensions
2313    
2314 bh 1998 * NEWS: Update for 1.0rc1
2315    
2316     2003-12-01 Bernhard Herzog <[email protected]>
2317    
2318 bh 1996 * Thuban/UI/mainwindow.py (MainWindow.AddLayer): Change the wild
2319     cards for the dialog so that shapefiles ending in all uppercase
2320     SHP are listed too
2321    
2322 bh 1988 2003-11-28 Bernhard Herzog <[email protected]>
2323    
2324 bh 1996 * Thuban/version.py (longversion): Update to 1.0rc1
2325    
2326     * setup.py (setup call): Update version to 1.0rc1. Use the
2327     [email protected] email address as author email instead of my
2328     personal one.
2329    
2330     2003-11-28 Bernhard Herzog <[email protected]>
2331    
2332 bh 1992 * po/de.po: Update german translation.
2333    
2334     2003-11-28 Bernhard Herzog <[email protected]>
2335    
2336 bh 1990 Unify the filenames stored in .thuban files so that the .thuban
2337     files are more platform independend
2338    
2339     * Thuban/Model/save.py (unify_filename): New. Unify filenames so
2340     that they can be used on both windows and unix
2341     (SessionSaver.prepare_filename): New. Handle all filename
2342     transformations for filenames stored in the thuban file
2343     (SessionSaver.write_data_containers, SessionSaver.write_layer):
2344     Use prepare_filename
2345    
2346     * test/test_save.py (SaveSessionTest.testSingleLayer)
2347     (SaveSessionTest.testLayerProjection)
2348     (SaveSessionTest.testRasterLayer)
2349     (SaveSessionTest.testClassifiedLayer)
2350     (SaveSessionTest.test_dbf_table)
2351     (SaveSessionTest.test_joined_table): Filenames are always stored
2352     with slashes on all currently supported platforms so adapt all
2353     tests to this
2354    
2355     * test/test_load.py (LoadSessionTest.filenames): With the new
2356     filename scheme the filenames in the tests should be
2357     understandable on all currently supported platforms so we turn
2358     this into an empty list because we don't have to normalize them
2359     anymore
2360    
2361     2003-11-28 Bernhard Herzog <[email protected]>
2362    
2363 bh 1988 * test/test_layer.py (TestLayer.test_arc_layer_with_projection):
2364     Add the ellipsoid to the projection since some Proj versions
2365     complain if it's missing.
2366    
2367 bh 1984 2003-11-27 Bernhard Herzog <[email protected]>
2368    
2369     Corect some bounding box projection problems
2370    
2371     * Thuban/Model/proj.py (Projection.InverseBBox): New. Inverse
2372     version of ForwardBBox
2373     (Projection._transform_bbox): New. common implementation of
2374     ForwardBBox and InverseBBox
2375     (Projection.ForwardBBox): Use _transform_bbox.
2376    
2377     * test/test_proj.py (TestProjection.test): Add test for
2378     InverseBBox
2379    
2380     * Thuban/Model/layer.py (Layer.LatLongBoundingBox)
2381     (Layer.ShapesBoundingBox, RasterLayer.LatLongBoundingBox): Use the
2382     new InverseBBox method to determine the unprojected bounding box
2383     (Layer.ShapesInRegion): Use the ForwardBBox method to project the
2384     bbox.
2385    
2386     * test/test_layer.py (TestLayer.test_point_layer_with_projection):
2387     Removed.
2388     (TestLayer.test_arc_layer_with_projection): New. This test is
2389     better able to test whether bounding boxes are projected correctly
2390     than test_point_layer_with_projection
2391    
2392 bh 1986 * Thuban/UI/viewport.py (ViewPort.map_projection_changed): Use
2393     InverseBBox to unproject bboxes
2394    
2395 bh 1975 2003-11-25 Bernhard Herzog <[email protected]>
2396    
2397 bh 1981 * Thuban/UI/about.py (About.__init__): Make sure we have ASCII
2398     source code.
2399    
2400     2003-11-25 Bernhard Herzog <[email protected]>
2401    
2402 bh 1979 * Thuban/Model/layer.py (Layer.__getattr__): Removed. It was only
2403     there for backwards compatibility and all code relying on that
2404     should have been updated by now.
2405    
2406     2003-11-25 Bernhard Herzog <[email protected]>
2407    
2408 bh 1977 * test/test_load.py (TestClassification.test): Add the missing
2409     round trip test.
2410     (TestClassification.file_contents): Update to the newest file
2411     format
2412    
2413     2003-11-25 Bernhard Herzog <[email protected]>
2414    
2415 bh 1975 Add very experimental (and possibly dangerous) extension to draw
2416     polygons:
2417    
2418     * Extensions/drawshape/README: New. Brief installation
2419     instructions
2420    
2421     * Extensions/drawshape/drawshape.py: New. Implementation of the
2422     drawshape extensions
2423    
2424     * Extensions/drawshape/patch.diff: Patch to apply before the
2425     extension can be used.
2426    
2427 bh 1971 2003-11-24 Bernhard Herzog <[email protected]>
2428    
2429 bh 1973 * Thuban/Model/data.py (ShapefileStore._open_shapefile)
2430     (ShapefileStore.__init__): Factor opening the shapefile into a
2431     separate method (the new _open_shapefile). This makes the code a
2432     bit more readable but the real reason is that it makes some evil
2433     hacks easier. :-)
2434    
2435     2003-11-24 Bernhard Herzog <[email protected]>
2436    
2437 bh 1971 * Thuban/Model/load.py (SessionLoader.check_attrs): If no
2438     converter is specified for an attribute assume it's a string
2439     containing only Latin1 characters. Update doc-string accordingly.
2440     This change should fix many places where unicode objects might
2441     accidentally enter Thuban.
2442    
2443     * test/test_load.py (TestNonAsciiColumnName): New test to check
2444     what happens with column names in DBF files that contain non-ascii
2445     characters
2446    
2447 bh 1969 2003-11-21 Bernhard Herzog <[email protected]>
2448    
2449     Enable the experimental attribute editing again and introduce a
2450     command line switch to actually activate it
2451    
2452     * Thuban/UI/main.py (options): New. Container for options set on
2453     the commmand line
2454     (main): Add the --enable-attribute-editing flag.
2455    
2456     * Thuban/UI/identifyview.py (IdentifyView.__init__): If attribute
2457     editing is enabled use the grid ctrl which allows editing of the
2458     values
2459    
2460     * Thuban/Model/transientdb.py (AutoTransientTable.write_record):
2461     New. Just delegate this to the underlying table.
2462    
2463 bh 1967 2003-11-20 Bernhard Herzog <[email protected]>
2464    
2465     * test/test_proj.py (ProjFileReadTests.test_read_unreadable_file):
2466     Skip this test if run under non-posix systems since it only works
2467     there
2468    
2469 bh 1960 2003-11-19 Bernhard Herzog <[email protected]>
2470    
2471 bh 1965 * Thuban/Model/resource.py: Rework the way gdal support is
2472     determined so that we can give a reason in the about why gdal is
2473     not supported.
2474     (gdal_support_status): New. Variable holding a string with the
2475     reason for no gdal support
2476    
2477     * Thuban/UI/about.py (About.__init__): Add the reason why gdal is
2478     not supported to the message
2479    
2480     2003-11-19 Bernhard Herzog <[email protected]>
2481    
2482 bh 1963 Remove the old table interface and its test cases
2483    
2484     * Thuban/Model/table.py (OldTableInterfaceMixin): Removed.
2485     (DBFTable, MemoryTable): Do not derive from OldTableInterfaceMixin
2486     anymore
2487    
2488     * Thuban/Model/transientdb.py (TransientTableBase)
2489     (AutoTransientTable): Do not derive from OldTableInterfaceMixin
2490     anymore
2491    
2492     * test/test_table.py: Removed since the old interface it tests is
2493     gone.
2494    
2495     * test/runtests.py (main): The old table interface is gone and
2496     with it the deprecation warnings so remove the code that turns
2497     these warnings into errors
2498    
2499     2003-11-19 Bernhard Herzog <[email protected]>
2500    
2501 bh 1960 * test/test_table.py: Revert to revision 1.5 again. Changing the
2502     tests to use the new table interface is completely wrong since the
2503     whole purpose of the tests in this module is to test the old
2504     interface.
2505    
2506 bh 1954 2003-11-18 Bernhard Herzog <[email protected]>
2507    
2508 bh 1958 * Thuban/Model/postgisdb.py (PostGISConnection.MatchesParameters):
2509     New. Test whether the connection matches a set of connection
2510     parameters
2511    
2512     * Thuban/UI/dbdialog.py (DBFrame.conns_changed): Fix doc-string
2513     (DBFrame.OnAdd): Use the new MatchesParameters method when looking
2514     for existing connections with the same parameters and break out of
2515     the loop correctly.
2516    
2517     * test/test_postgis_db.py (TestBriefDescription)
2518     (TestPostGISSimple.test_brief_description): Rename
2519     TestBriefDescription to TestPostGISSimple and the test method to
2520     test_brief_description so that we can add more test methods.
2521     (TestPostGISSimple.test_matches_parameters): New. Test the new
2522     MatchesParameters method
2523    
2524     2003-11-18 Bernhard Herzog <[email protected]>
2525    
2526 bh 1960 * Thuban/Lib/connector.py (Publisher): Introduce a new flag,
2527 bh 1954 _was_destroyed, to indicate whether an publisher instance has
2528     already been destroyed.
2529     (Publisher.Unsubscribe): Only disconnect if the publisher has not
2530     been destroyed yet.
2531     (Publisher.Destroy): Set the _was_destroyed flag to true.
2532    
2533     * test/test_connector.py
2534     (TestPublisher.test_unsubscribe_after_destroy): New. Test that
2535     calling Unsubscribe after Destroy doesn't raise an exception
2536    
2537 bh 1951 2003-11-14 Bernhard Herzog <[email protected]>
2538    
2539     * Thuban/UI/identifyview.py (IdentifyView.selected_shape): Fix
2540     typo in doc-string
2541    
2542 bh 1949 2003-11-13 Bernhard Herzog <[email protected]>
2543    
2544     Quote table and column names properly for postgis.
2545    
2546     * Thuban/Model/postgisdb.py (quote_identifier): New. Function to
2547     quote an identifier for use in an sql statement
2548     (PostGISColumn.__init__): Add the quoted_name attribute
2549     (PostGISTable.__init__): New instance variable quoted_tablename
2550     (PostGISTable._fetch_table_information): Use the quoted table
2551     name. New isntance variable quoted_geo_col with a quoted version
2552     of geometry_column
2553     (PostGISTable.NumRows, PostGISTable.RowIdToOrdinal)
2554     (PostGISTable.RowOrdinalToId): Use the quoted table name
2555     (PostGISTable.ReadValue, PostGISTable.ValueRange)
2556     (PostGISTable.UniqueValues, PostGISTable.SimpleQuery)
2557     (PostGISShapeStore.BoundingBox, PostGISShapeStore.Shape)
2558     (PostGISShapeStore.AllShapes, PostGISShapeStore.ShapesInRegion):
2559     Use quoted table and column names
2560    
2561     * test/test_postgis_db.py (TestPostGISSpecialCases)
2562     (TestPostGISIgnoredColumns): Rename the class to
2563     TestPostGISSpecialCases because that better describes the new
2564     cases
2565     (TestPostGISSpecialCases.test_unsupported_types)
2566     (TestPostGISSpecialCases.test): Rename the method to
2567     test_unsupported_types because we need a more descriptive name now
2568     that there are more methods
2569     (TestPostGISSpecialCases.test_table_name_quoting)
2570     (TestPostGISSpecialCases.test_column_name_quoting)
2571     (TestPostGISSpecialCases.test_shapestore_name_quoting): New test
2572     cases to test quoting of table and column names in PostGISTable
2573     and PostGISShapeStore
2574    
2575     * test/postgissupport.py
2576     (skip_if_addgeometrycolumn_does_not_use_quote_ident): New. Skip if
2577     AddGeometryColumn desn't support table or column names with sapces
2578     or double quotes
2579    
2580 jan 1945 2003-11-12 Jan-Oliver Wagner <[email protected]>
2581    
2582     * Extensions/wms/__init__.py: New: Init to make this
2583     directory a package.
2584    
2585     * Extensions/wms/wms.py: New: Provide layers via OGC WMS.
2586    
2587 bh 1932 2003-11-11 Bernhard Herzog <[email protected]>
2588    
2589 bh 1942 * Thuban/Model/resource.py (EPSG_DEPRECATED_PROJ_FILE): New.
2590     Constant for the file woth deprecated epsg projections
2591     (get_system_proj_file): Update doc-string
2592    
2593     * Thuban/UI/projdialog.py (ProjFrame.build_dialog): Add a space
2594     above the EPS widgets, introduce a check box for the deprecated
2595     eps projections and a label for the epsg widgets
2596     (ProjFrame._OnShowEPSG): Handle the deprecated EPSG projections
2597     too
2598    
2599     2003-11-11 Bernhard Herzog <[email protected]>
2600    
2601 bh 1939 Avoid warnings when run under Python 2.3
2602    
2603     * Thuban/UI/baserenderer.py (BaseRenderer.draw_point_shape)
2604     (BaseRenderer.draw_label_layer): Coordinates must be ints.
2605    
2606     * Thuban/UI/renderer.py (MapRenderer.make_point): Turn this into a
2607     real method so that we can convert to int.
2608     (MapRenderer.label_font): The font size mist be an int.
2609    
2610     * Thuban/UI/common.py (Color2wxColour): The color values must be
2611     ints. Also, remove the unnecessary asserts.
2612    
2613     * test/test_load_0_8.py (TestUnicodeStrings.file_contents)
2614     (TestUnicodeStrings.test): Python source code should not contain
2615     non-ascii characters unless an encoding is specified in the file.
2616     Therefore use \x escapes in the string literals for non-ascii
2617     characters.
2618    
2619     2003-11-11 Bernhard Herzog <[email protected]>
2620    
2621 bh 1934 * Thuban/Model/resource.py (get_system_proj_file): Add a filename
2622     parameter so that this function can be used for all proj files in
2623     Resource/Projections
2624     (DEFAULT_PROJ_FILE, EPSG_PROJ_FILE): New. Predefined filenames for
2625     get_system_proj_file
2626    
2627     * Thuban/UI/projdialog.py (ProjFrame.__init__): Instead of one
2628     ProjFile self.__sysProjFile use a dictionary of system ProjFile
2629     objects self._sys_proj_files
2630     (ProjFrame.build_dialog): Adapt to the new changes in the
2631     ProjectionList constructor. Add a check button to toggle whether
2632     EPSG projections are shown
2633     (ProjFrame._OnShowEPSG): New. Handler for the epsg check button
2634     events.
2635     (ProjFrame.load_user_proj, ProjFrame.load_system_proj): Only show
2636     the busy cursor if the files have not yet been loaded by the
2637     dialog.
2638     (ProjFrame.load_system_proj): Add a parameter for the name of the
2639     proj file. Maintain the dictionary of system projections
2640     self._sys_proj_files
2641    
2642     * Thuban/UI/projlist.py (ProjectionList): Merge the system_projs,
2643     user_projs parameters into one parameter proj_files which is a
2644     list of proj files.
2645     (ProjectionList._subscribe_proj_files)
2646     (ProjectionList._unsubscribe_proj_files): New. Move
2647     subscription/unsubscription of projfile messages to separate
2648     methods
2649     (ProjectionList.Destroy): The unsubscribe is now done in
2650     _unsubscribe_proj_files
2651     (ProjectionList.update_projections): We now have a list of proj
2652     file objects
2653     (ProjectionList.SetProjFiles): New method to set a new list of
2654     proj file objects
2655    
2656     * test/test_proj.py (ProjFileReadTests.test_get_system_proj_file):
2657     Specify explicitly which system proj file to load.
2658    
2659     2003-11-11 Bernhard Herzog <[email protected]>
2660    
2661 bh 1932 * Thuban/Model/load.py (SessionLoader.Destroy): New. Clear all
2662     instance variables to cut cyclic references. The GC would have
2663     collected the loader eventually but it can happen that it doesn't
2664     run at all until thuban is closed (2.3 but not 2.2 tries a bit
2665     harder and forces a collection when the interpreter terminates)
2666     (load_session): Call the handler's Destroy method to make sure
2667     that it gets garbage collected early. Otherwise it will be
2668     collected very late if at all and it holds some references to e.g.
2669     shapestores and the session which can lead to leaks (of e.g. the
2670     temporary files)
2671    
2672     * test/test_load.py (TestSingleLayer.test_leak): New. test for the
2673     resource leak in load_session
2674    
2675 bh 1929 2003-11-10 Bernhard Herzog <[email protected]>
2676    
2677     * Thuban/UI/baserenderer.py: Add a way to specify how layers in
2678     extensions are to be rendered.
2679     (_renderer_extensions): New. List with renderer for layers in
2680     extensions
2681     (add_renderer_extension): New. Add a renderer extension
2682     (init_renderer_extensions): New. Init the renderer extensions
2683     (BaseRenderer.render_map_incrementally): Search
2684     _renderer_extensions for how to draw unknown layer types
2685     (BaseRenderer.draw_raster_data): Add format parameter so that
2686     formats other than BMP can be drawn
2687     (BaseRenderer.draw_raster_layer): Pass an explicit format to
2688     draw_raster_data
2689    
2690     * Thuban/UI/renderer.py (raster_format_map): New. Mapping form the
2691     strings of the format parameter of draw_raster_data method to wx
2692     constants
2693     (MapRenderer.draw_raster_data): Add the format parameter and use
2694     raster_format_map to map it to the right wxwindows constant for
2695     wxImageFromStream
2696    
2697     * test/test_baserenderer.py (SimpleRenderer.draw_raster_data): Add
2698     the format parameter and record it
2699     (TestBaseRenderer.test_raster_no_projection): check the format
2700     paramter of the draw_raster_data method
2701     (TestBaseRenderer.test_renderer_extension): New. Test the renderer
2702     extension facility
2703    
2704 bh 1925 2003-11-07 Bernhard Herzog <[email protected]>
2705    
2706     Tweak the usage of the sqlite database to make common use cases
2707     more responsive. In most cases copying the data to the sqlite
2708     database takes so long that using sqlite doesn't have enough
2709     advantages.
2710    
2711     * Thuban/Model/transientdb.py (TransientTableBase.ValueRange): Add
2712     comments about performance and query the min and max in separate
2713     statements because only that way will indexes be used.
2714     (TransientTableBase.UniqueValues): Add some comments about
2715     performance.
2716     (AutoTransientTable.ValueRange, AutoTransientTable.UniqueValues):
2717     Do not copy the data to the transient DB but use the transient
2718     copy if it exists. See the new comments for the performance trade
2719     offs
2720    
2721     * test/test_transientdb.py
2722     (TestTransientTable.test_auto_transient_table): Make sure that the
2723     data is copied to the transient database at some point.
2724    
2725 bh 1913 2003-11-03 Bernhard Herzog <[email protected]>
2726    
2727 bh 1922 * Thuban/Model/data.py (ShapefileStore.ShapesInRegion): Bind some
2728     globals to locals so that it's a bit faster
2729    
2730     2003-11-03 Bernhard Herzog <[email protected]>
2731    
2732 bh 1920 * Thuban/UI/baserenderer.py
2733     (BaseRenderer.draw_shape_layer_incrementally): Use the ReadValue
2734     method. ReadValue is faster than ReadRowAsDict since it only reads
2735     one cell especially now that the dbf file objects actually
2736     implement it.
2737    
2738     * Thuban/Model/table.py (DBFTable.ReadValue): Use the new
2739     read_attribute method of the dbf objects
2740    
2741     2003-11-03 Bernhard Herzog <[email protected]>
2742    
2743 bh 1916 * Extensions/profiling/profiling.py (popup_dialog_box): New config
2744     variable to indicate whether the result should be shown in a
2745     dialog box
2746     (profile_screen_renderer, time_screen_renderer): Only show a
2747     dialog box if popup_dialog_box is true.
2748     (profile_screen_renderer): Flush stdout after the printing the
2749     first part of the "profiling..." message
2750    
2751     * Thuban/UI/baserenderer.py
2752     (BaseRenderer.draw_shape_layer_incrementally): Cache the pens and
2753     brushes for the groups so that they're not created over and over
2754     again
2755    
2756 bh 1913 * Thuban/Model/classification.py (Classification.__getattr__)
2757     (Classification._compile_classification)
2758     (Classification._clear_compiled_classification): New. Methods to
2759     manage a 'compiled' representation of the classification groups
2760     which is created on demand
2761     (Classification.InsertGroup, Classification.RemoveGroup)
2762     (Classification.ReplaceGroup): reset the compiled representation
2763     (Classification.FindGroup): Use the compiled representation to
2764     find the matching group
2765     (ClassGroupRange.GetRangeTuple): New. Return the range as a tuple
2766    
2767 bh 1904 2003-10-31 Bernhard Herzog <[email protected]>
2768    
2769 bh 1911 * Thuban/Model/classification.py (Classification.SetDefaultGroup):
2770     Send a CLASS_CHANGED message
2771     (Classification.RemoveGroup): Send a CLASS_CHANGED message and do
2772     not return the removed group since it wasn't used.
2773    
2774     * test/test_classification.py
2775     (TestClassification.test_set_default_group): New. Test the
2776     SetDefaultGroup method
2777     (TestClassification.test_insert_group): New. Test the InsertGroup
2778     method
2779     (TestClassification.test_remove_group): New. Test the RemoveGroup
2780     method
2781     (TestClassification.test_replace_group): New. Test the
2782     ReplaceGroup method
2783    
2784     2003-10-31 Bernhard Herzog <[email protected]>
2785    
2786 bh 1908 * test/test_classification.py (TestClassification.setUp):
2787     Subscribe to the CLASS_CHANGED messages
2788     (TestClassification.tearDown): New. Destroy the classification
2789     properly
2790     (TestClassification.test_defaults): Add tests for the default line
2791     width and whether no messages were sent yet
2792     (TestClassification.test_set_default_properties): Add tests for
2793     messages and setting the default line width
2794     (TestClassification.test_add_singleton)
2795     (TestClassification.test_add_range)
2796     (TestClassification.test_multiple_groups): Add tests for messages
2797    
2798     2003-10-31 Bernhard Herzog <[email protected]>
2799    
2800 bh 1906 Some more refactoring in preparation for new tests:
2801    
2802     * test/test_classification.py (TestClassification.setUp): New.
2803     Instantiate the classification here. Update the test methods
2804     accordingly.
2805     (TestClassification.test_multiple_groups): Make sure that the two
2806     singletons matching 1 are considered different.
2807    
2808     2003-10-31 Bernhard Herzog <[email protected]>
2809    
2810 bh 1904 * test/test_classification.py (red, green, blue): New. These
2811     constants were used in several cases. Update the relevant methods.
2812     (TestClassification.test_defaults)
2813     (TestClassification.test_set_default_properties)
2814     (TestClassification.test_add_singleton)
2815     (TestClassification.test_add_range)
2816     (TestClassification.test_multiple_groups)
2817     (TestClassification.test_deepcopy): New. These were formerly all
2818     part of the single method test.
2819     (TestClassification.test_deepcopy): Removed.
2820     (TestClassIterator): Removed. The test case is now a method of
2821     TestClassification since it tests part of the public interface of
2822     Classification
2823     (TestClassification.test_iterator): New. Used to be
2824     TestClassIterator effectively
2825    
2826 jan 1902 2003-10-31 Jan-Oliver Wagner <[email protected]>
2827    
2828     GUIfied the functions of the profiling extension.
2829    
2830     * /Extensions/profiling/__init__.py: New: Init to make this
2831     directory a package.
2832    
2833     * Extensions/profiling/profiling.py: Moved menu entries to
2834     the Extensions menu. Applied _() for strings.
2835     (profile_screen_renderer): Catch the detailed printout and present
2836     it in a dialog.
2837 bh 1904 (time_screen_renderer): Raise a dialog to present the result instead
2838 jan 1902 of printing it to stdout.
2839    
2840 bh 1897 2003-10-31 Bernhard Herzog <[email protected]>
2841    
2842 bh 1899 * test/test_classification.py (TestClassGroupProperties)
2843     (TestClassGroup, TestClassGroupDefault, TestClassGroupRange)
2844     (TestClassGroupSingleton, TestClassIterator, TestClassification):
2845     Split TestClassification into several classes, one for each class
2846     being tested. TestClassification itself now only tests
2847     Classification. This split makes changes to the tests a bit easier
2848    
2849     2003-10-31 Bernhard Herzog <[email protected]>
2850    
2851 bh 1897 * Extensions/profiling/profiling.py: New. Extension to measure
2852     Thuban performance
2853    
2854 frank 1895 2003-10-31 Frank Koormann <[email protected]>
2855    
2856     Added two items to legend popup menu: Remove Layer and Show Layer Table
2857    
2858     * Thuban/UI/legend.py (LegendPanel._OnRemoveLayer,
2859     LegendPanel._OnShowTable): New event handlers, call the corresponding
2860     mainwindow methods.
2861     (LegendTree._OnRightClick): Added items to popup menu.
2862    
2863 bh 1894 2003-10-30 Bernhard Herzog <[email protected]>
2864    
2865     * Thuban/UI/dialogs.py (ThubanFrame.__init__): Handle
2866     EVT_WINDOW_DESTROY
2867     (ThubanFrame.OnDestroy): New. Handler for EVT_WINDOW_DESTROY. Does
2868     nothing but is convenient for the derived classes.
2869    
2870     * Thuban/UI/tableview.py
2871     (TableFrame.OnDestroy, LayerTableFrame.OnDestroy): New.
2872     Unsubscribe the messages here not in OnClose because that might
2873     get called multiple times. Fixes RT #2196
2874     (TableFrame.OnClose, LayerTableFrame.OnClose): Removed. Not needed
2875     anymore.
2876    
2877     * README: Update the minimum requirement for wxPython. Since we
2878     now use the EVT_WINDOW_DESTROY event, we need at least 2.4.0.4,
2879     the version in which that was introduced for all platforms
2880    
2881 frank 1890 2003-10-30 Frank Koormann <[email protected]>
2882    
2883     * Thuban/UI/join.py (JoinDialog.OnJoin): Wrapped the major parts of
2884     the join process in a ThubanBeginBusyCursor, ThubanEndBusyCursor
2885     frame.
2886    
2887 jan 1889 2003-10-30 Jan-Oliver Wagner <[email protected]>
2888    
2889     Improved APR import extension, added further EPSG definitions
2890     and some cleanup regarding string class.
2891    
2892     * test/test_proj.py (TestProjection.test_get_projection_units_geo):
2893     Added test for alias 'longlat'.
2894    
2895     * Resources/Projections/epsg-deprecated.proj: New. Contains
2896     deprecated EPSG definitions.
2897    
2898     * Extensions/importAPR/odb.py (ODBBaseObject.TreeInfo): Added
2899     the variable names for objects.
2900    
2901     * Extensions/importAPR/apr.py (APR_BLnSym, APR_BMkSym, APR_BShSym): New.
2902     Copied from importAPR and provided with documentation.
2903    
2904     * Extensions/importAPR/importAPR.py (APR_BLnSym, APR_BMkSym, APR_BShSym):
2905     Moved to apr.py.
2906     (APR_View): Added object ref 'ITheme'.
2907    
2908     * Thuban/Lib/fileutil.py, Thuban/UI/proj4dialog.py: Replaced string
2909     split function by corresponding use of the string class method.
2910    
2911     * Thuban/Model/xmlwriter.py: Replaced string replace function by
2912     corresponding string method.
2913    
2914 bh 1880 2003-10-29 Bernhard Herzog <[email protected]>
2915    
2916     * Thuban/UI/baserenderer.py
2917     (BaseRenderer.draw_shape_layer_incrementally): Speed up the
2918     special case of a classification that only has the default group
2919    
2920 bh 1868 2003-10-27 Bernhard Herzog <[email protected]>
2921    
2922 bh 1878 * po/fr.po, po/es.po: Updated translations from Daniel Calvelo
2923    
2924 bh 1876 * po/de.po: Update.
2925    
2926     * Thuban/UI/application.py
2927     (ThubanApplication.ShowExceptionDialog): Handle translation of the
2928     dialog message properly
2929    
2930     2003-10-27 Bernhard Herzog <[email protected]>
2931    
2932 bh 1873 Rework how localization works so that we use wx's translation
2933     functions when running Thuban as a normal application but not when
2934     we don't need any UI, such as in the test suite. See the comment
2935     in Thuban/__init__.py for details
2936    
2937     * Thuban/__init__.py (_): Add one level of indirection to make the
2938     translation handling more flexible and to make it possible to use
2939     either wx's translation services or not.
2940     (gettext_identity, translation_function_installed)
2941     (install_translation_function): New function to help with this
2942    
2943     * Thuban/UI/__init__.py: Install the wx specific translation
2944     function if it's OK to do that
2945    
2946     * test/support.py (initthuban): Install a dummy translation
2947     function so that importing Thuban.UI doesn't install a wx specific
2948     one for which would need to import wxPython
2949    
2950     2003-10-27 Bernhard Herzog <[email protected]>
2951    
2952 bh 1870 * HOWTO-Release: Source archives should be created first and the
2953     binary packages should be created from the source archives.
2954     There's an official debian package now so there's no need to test
2955     the rpm on debian anymore
2956    
2957     2003-10-27 Bernhard Herzog <[email protected]>
2958    
2959 bh 1868 Several rendering changes:
2960    
2961     - Render the selection into a separate bitmap so that only that
2962     bitmap needs to be redrawn when the selection changes
2963    
2964     - Render incrementally showing previews and allowing interaction
2965     before rendering is complete
2966    
2967     - Update the renderer interface a bit. Most parameters of
2968     RenderMap are now parameters of the constructor
2969    
2970     * Thuban/UI/baserenderer.py (BaseRenderer.__init__): Add the map
2971     and the update region as parameters. Update the doc-string
2972     (BaseRenderer.render_map_incrementally): New. Generator function
2973     to renders the map incrementally
2974     (BaseRenderer.render_map): Remove the map argument (it's now in
2975     the constructor) and simply iterate over the
2976     render_map_incrementally generator to draw the map.
2977     (BaseRenderer.draw_shape_layer_incrementally)
2978     (BaseRenderer.draw_shape_layer): Renamed to
2979     draw_shape_layer_incrementally and changed into a generator that
2980     yields True every 500 shapes. Used by render_map_incrementally to
2981     render shape layers incrementally
2982    
2983     * Thuban/UI/renderer.py (ScreenRenderer.RenderMap): Removed the
2984     map and region parameters which are now in the constructor
2985     (ScreenRenderer.RenderMapIncrementally): New. Public frontend for
2986     the inherited render_map_incrementally.
2987     (BaseRenderer.draw_shape_layer): Removed.
2988     (ScreenRenderer.draw_selection_incrementally): New. The selection
2989     drawing part of the removed draw_shape_layer as a generator
2990     (ScreenRenderer.layer_shapes): Update because of the region
2991     parameter change
2992     (ExportRenderer.__init__): New. Extend the inherited constructor
2993     with the destination region for the drawing
2994     (ExportRenderer.RenderMap): Removed the map and region parameters
2995     which are now in the constructor
2996    
2997     * Thuban/UI/view.py (MapCanvas.PreviewBitmap): New. Return a
2998     bitmap suitable for a preview in a tool
2999     (CanvasPanTool.MouseMove): Use the PreviewBitmap method to get the
3000     bitmap
3001     (MapPrintout.draw_on_dc): Adapt to new renderer interface
3002     (MapCanvas.OnPaint): Handle drawing the selection bitmap if it
3003     exists
3004     (MapCanvas.OnIdle): Update the logic to deal with incremental
3005     rendering and the selection bitmap
3006     (MapCanvas._do_redraw): Handle the instantiation of the render
3007     iterator and the redraws during rendering
3008     (MapCanvas._render_iterator): New. Generator to incrementally
3009     redraw both bitmaps
3010     (MapCanvas.Export): Adapt to new renderer interface.
3011     (MapCanvas.full_redraw): Reset the selection bitmap and the
3012     renderer iterator too
3013     (MapCanvas.redraw_selection): New. Force a redraw of the selection
3014     bitmap
3015     (MapCanvas.shape_selected): Only redraw the selection bitmap
3016    
3017     * test/test_baserenderer.py
3018     (TestBaseRenderer.test_polygon_no_projection)
3019     (TestBaseRenderer.test_raster_no_projection)
3020     (TestBaseRenderer.test_point_map_projection)
3021     (TestBaseRenderer.test_point_layer_and_map_projection)
3022     (TestBaseRenderer.test_point_layer_projection)
3023     (TestBaseRenderer.test_point_with_classification): Adapt to new
3024     renderer interface
3025    
3026 bh 1865 2003-10-24 Bernhard Herzog <[email protected]>
3027    
3028     * libraries/thuban/wxproj.cpp (draw_polygon_shape)
3029     (point_in_polygon_shape, shape_centroid): Raise an exception if
3030     the shape can't be read. Previously invalid shape ids would lead
3031     to a segfault.
3032    
3033     * test/test_wxproj.py (TestShapeCentroid.test_invalid_shape_id):
3034     New. test whether an exception is raised for invalid shape ids
3035    
3036 jan 1857 2003-10-24 Jan-Oliver Wagner <[email protected]>
3037    
3038 jan 1862 * Thuban/Model/proj.py (Projection.GetProjectedUnits): Added 'longlat'
3039     as alias for 'latlong'.
3040    
3041     * Thuban/UI/projdialog.py (ProjFrame.__init__): Added 'longlat'
3042     as alias for 'latlong'.
3043    
3044     2003-10-24 Jan-Oliver Wagner <[email protected]>
3045    
3046 jan 1859 * Thuban/UI/projdialog.py (ProjFrame.proj_selection_changed): Set
3047     the projection even for the UnknownPanel.
3048     (UnknownProjPanel.__init__): Define the text and create the textctrl
3049     widget.
3050     (UnknownProjPanel._DoLayout): Replaced static text widget by the
3051     textctrl created in __init__.
3052     (UnknownProjPanel.SetProjection): Set the text for the text ctrl
3053     including the parameters of the projection.
3054    
3055     2003-10-24 Jan-Oliver Wagner <[email protected]>
3056    
3057 jan 1857 * Resources/Projections/epsg.proj: New. This is a list of
3058     EPSG codes with parameters for proj. The list has been
3059     generated using devtools/create_epsg.py based on the
3060     file nad/epsg of the proj 4.4.7 package. Four projection
3061     definitions have been deleted as they are not accepted by proj:
3062     "CH1903+ / LV95", "Bern 1898 (Bern) / LV03C", "CH1903 / LV03"
3063     and "HD72 / EOV".
3064    
3065 bh 1855 2003-10-22 Bernhard Herzog <[email protected]>
3066    
3067     Some more tweaks to the projection dialog which should fix RT
3068     #1886.
3069    
3070     * Thuban/UI/projlist.py (ProjectionList.Destroy): Unsubscribe from
3071     the ProjFile's messages and call the base class methods correctly
3072     (ProjectionList.SelectProjection): Set the wxLIST_STATE_FOCUSED
3073     flag on the newly selected item too. Otherwise some other item is
3074     focused and the first time the focus is moved with the keyboard
3075     the selection moves in unexpected ways.
3076    
3077     * Thuban/UI/projdialog.py (ProjFrame.__init__): Do not set the
3078     focus on the OK button, only on the projection list. That way the
3079     list really has the focus initially
3080     (ProjFrame.OnClose): Call the projection list's Destroy method to
3081     make it unsubscribe all messages
3082    
3083 bh 1840 2003-10-21 Bernhard Herzog <[email protected]>
3084    
3085 bh 1852 Rework the projection dialog to fix a few bugs, including RT 2166
3086     and most of 2168
3087    
3088     * Thuban/UI/projlist.py: New. The class ProjectionList is a
3089     special wxListCtrl to show a list of projections in a more MVC
3090     fashion
3091    
3092     * Thuban/UI/projdialog.py (ProjFrame): Substantial changes
3093     throughout the class. The main change is to use the ProjectionList
3094     class instead of a normal wxListBox. Also, add an explicit
3095     "Unknown" projection to the projection choice control.
3096     (ProjPanel.__init__): Add an "unknown" ellipsoid
3097     (TMPanel.__init__, LCCPanel.__init__): Tweak the order of
3098     instantiation of the panel's controls to make the tab-order more
3099     natural
3100    
3101     2003-10-21 Bernhard Herzog <[email protected]>
3102    
3103 bh 1849 * test/test_load.py (TestSingleLayer.file_contents)
3104     (TestSingleLayer.test): Add non-ascii characters to the titles of
3105     session, map and layer. This is effectively a port of the
3106     TestUnicodeStrings test in test_load_0_8.py which for some reason
3107     was only added there.
3108    
3109     * test/test_load_0_9.py (TestSingleLayer.file_contents)
3110     (TestSingleLayer.test): Same as in test_load.py: add non-ascii
3111     characters to the titles of session, map and layer,.
3112    
3113     2003-10-21 Bernhard Herzog <[email protected]>
3114    
3115 bh 1847 Add EPSG projection handling to .thuban files
3116    
3117     * test/test_save.py (SaveSessionTest.dtd)
3118     (SaveSessionTest.testEmptySession)
3119     (SaveSessionTest.testLayerProjection)
3120     (SaveSessionTest.testRasterLayer)
3121     (SaveSessionTest.testClassifiedLayer)
3122     (SaveSessionTest.test_dbf_table)
3123     (SaveSessionTest.test_joined_table)
3124     (SaveSessionTest.test_save_postgis): Update to 1.0-dev namespace
3125     (SaveSessionTest.testSingleLayer): Update to 1.0-dev namespace and
3126     use a and epsg projection to test saving them
3127    
3128     * test/test_load.py (LoadSessionTest.dtd): Update to 1.0-dev
3129     namespace
3130     (TestLayerVisibility.file_contents, TestLabels.file_contents)
3131     (TestLayerProjection.file_contents)
3132     (TestRasterLayer.file_contents, TestJoinedTable.file_contents)
3133     (TestPostGISLayer.file_contents)
3134     (TestPostGISLayerPassword.file_contents)
3135     (TestLoadError.file_contents, TestLoadError.test): Update to use
3136     1.0-dev namespace
3137     (TestSingleLayer.file_contents, TestSingleLayer.test): Update to
3138     use 1.0-dev namespace and use an EPSG projection to test whether
3139     loading it works
3140    
3141     * test/test_load_0_9.py: New. Effectively a copy of test_load.py
3142     as of Thuban 0.9. These are now tests to determine whether Thuban
3143     can still read files generated by Thuban 0.9
3144    
3145     * Thuban/Model/save.py (SessionSaver.write)
3146     (SessionSaver.write_session): Use the 1.0 dtd and 1.0-dev
3147     namespace
3148     (SessionSaver.write_projection): Write the projection's epsg
3149     attribute
3150    
3151     * Thuban/Model/load.py (SessionLoader.__init__): Also accept the
3152     thuban-1.0-dev.dtd namespace
3153     (SessionLoader.check_attrs): Allow a callable object as conversion
3154     too
3155     (SessionLoader.start_projection, SessionLoader.end_projection)
3156     (SessionLoader.start_parameter): Handle the epsg attribute and
3157     rename a few instance variables to lower case
3158    
3159     * Resources/XML/thuban-1.0.dtd: New. Only difference to
3160     thuban-0.9.dtd is the epsg attribute for projections.
3161    
3162     2003-10-21 Bernhard Herzog <[email protected]>
3163    
3164 bh 1840 * test/runtests.py (main): Let the user specify which tests to run
3165     on the command line
3166    
3167     * test/support.py (ThubanTestResult.getDescription): Override to
3168     give a better short description. The description can be used as a
3169     parameter to run_tests to run that particular test in isolation.
3170    
3171 frank 1837 2003-10-21 Frank Koormann <[email protected]>
3172    
3173     Popup menu for legend. Scheduled for the 1.2 release this was too
3174     simple to implement: The popup menu is bound to the legend tree, while
3175     the events are hanlded by its anchestor, the legend panel. This
3176     allows reuse of all the event handlers already implemented for the
3177     legend toolbar buttons.
3178    
3179     * Thuban/UI/legend.py (LegendPanel.__init__): EVT_MENU macros
3180     to add handlers for the events issued by the popup menu.
3181     (LegendPanel._OnToggleVisibility): Handler for toggling layer
3182     visibility event
3183     (LegendPanel._OnProjection): Handler for layer projection event.
3184     (LegendTree.__init__): Added EVT_TREE_ITEM_RIGHT_CLICK
3185     (LegendTree._OnRightClick): Event handler for right click, select item
3186     and pop up menu.
3187     (LegendTree.ToggleVisibility): Toggle layer visibility
3188     (LegendTree.LayerProjection): Raise layer projection dialog for
3189     current layer.
3190    
3191 bh 1836 2003-10-21 Bernhard Herzog <[email protected]>
3192    
3193     * Resources/Projections/defaults.proj: Use correct DOCTYPE
3194     declaration. The top-level element is projectionlist not projfile
3195    
3196 bh 1834 2003-10-20 Bernhard Herzog <[email protected]>
3197    
3198     * Thuban/UI/projdialog.py (ProjFrame.write_proj_file): New. helper
3199     method to write a projfile and display a busy cursor and error
3200     dialogs.
3201     (ProjFrame._OnSave, ProjFrame._OnAddToList, ProjFrame._OnImport)
3202     (ProjFrame._OnExport, ProjFrame._OnRemove): Use write_proj_file
3203     (ProjFrame.__FillAvailList): Translate "<None>" too and display a
3204     busy cursor while loading the user and system prj files.
3205    
3206 bh 1832 2003-10-16 Bernhard Herzog <[email protected]>
3207    
3208     * Thuban/Model/resource.py (projfile_cache): Introduce a cache for
3209     ProjFile objects
3210     (clear_proj_file_cache): New function to clear the cache. Mainly
3211     useful for use by the test suite
3212     (read_proj_file): Use the cache.
3213    
3214     * test/test_proj.py (TestProjFile): Clarify the doc-string
3215     (ProjFileReadTests): Update doc-string
3216     (ProjFileReadTests.test_get_system_proj_file): Check whether the
3217     system proj files is cached.
3218     (ProjFileLoadTestCase): New base class for the proj file tests
3219     derived from support.FileLoadTestCase to provide some common
3220     behavior.
3221     (TestLoadingProjFile)
3222     (TestLoadingProjFileWithEmptyProjectionlist.file_contents)
3223     (TestProjFileWithInvalidParameters.file_contents): Derive from
3224     ProjFileLoadTestCase
3225     (TestLoadingProjFile.test_caching): New. Test whether the cache
3226     works
3227    
3228 silke 1829 2003-10-16 Silke Reimer <[email protected]>
3229    
3230     * debian/*: New directory with configuration files for building a thuban
3231     deb-package.
3232    
3233 bh 1822 2003-10-14 Bernhard Herzog <[email protected]>
3234    
3235 bh 1828 * test/test_proj.py: Execute support.run_tests when run as
3236     __main__ so that missing unsubscribes are detected
3237     (TestProjFile.tearDown): Destroy the proj_file properly
3238    
3239     2003-10-14 Bernhard Herzog <[email protected]>
3240    
3241 bh 1826 * Thuban/Model/messages.py (PROJECTION_ADDED)
3242     (PROJECTION_REPLACED, PROJECTION_REMOVED): New message types for
3243     the ProjFile objects
3244    
3245     * Thuban/Model/proj.py (ProjFile): Derive from Publisher so we can
3246     easily send messages when the projections change
3247     (ProjFile.Add, ProjFile.Remove, ProjFile.Replace): Issue messages
3248     when the change was successful
3249    
3250     * test/test_proj.py (TestProjFile.setUp): Subscribe to some of the
3251     proj file messages
3252     (TestProjFile.test_add_remove)
3253     (TestProjFile.test_remove_non_existing)
3254     (TestProjFile.test_replace)
3255     (TestProjFile.test_replace_non_existing): Test whether the right
3256     messages are sent
3257    
3258     2003-10-14 Bernhard Herzog <[email protected]>
3259    
3260 bh 1822 * test/test_proj.py (TestProjFile.test): Refactor into several
3261     tests
3262     (TestProjFile.test_add_remove)
3263     (TestProjFile.test_remove_non_existing)
3264     (TestProjFile.test_replace)
3265     (TestProjFile.test_replace_non_existing): Some of the new
3266     individual test cases
3267     (TestProjFileSimple): New class for the rest of the test cases
3268     that came out of the refactoring
3269     (ProjFileTest): Derive from xmlsupport.ValidationTest so that the
3270     derived classes don't have to
3271    
3272 bh 1812 2003-10-13 Bernhard Herzog <[email protected]>
3273    
3274 bh 1820 Add an optional EPSG code to the projection objects and extend the
3275     .proj file format accordingly.
3276    
3277     * Resources/XML/projfile.dtd (element projection): Add epsg
3278     attribute
3279    
3280     * Thuban/Model/proj.py (Projection.__init__): New parameter and
3281     instance variable epsg. Update doc-string
3282     (Projection.EPSGCode, Projection.Label): New methods to provide
3283     access to EPSG code and a label for use in dialogs
3284    
3285     * Thuban/Model/resource.py (ProjFileReader.start_projection)
3286     (ProjFileReader.end_projection, ProjFileSaver.write_projfile):
3287     Handle the epsg code attribute when reading or writing proj files
3288    
3289     * Thuban/UI/projdialog.py (ProjFrame._OnSave)
3290     (ProjFrame._OnAddToList, ProjFrame.__DoOnProjAvail)
3291     (ProjFrame.__FillAvailList): Use the projection's Label method to
3292     get the string for the list box
3293    
3294     * test/test_proj.py (TestProjection.test_label)
3295     (TestProjection.test_label_epsg)
3296     (TestProjection.test_epsgcode_for_non_epsg_projection)
3297     (TestProjection.test_epsgcode_for_real_epsg_projection): New tests
3298     for the label and EPSGCode methods
3299     (WriteProjFileTests.doTestWrite, WriteProjFileTests.test_write)
3300     (WriteProjFileTests.test_write_empty_file): Create the ProjFile
3301     objects in the test cases and put the expected contents into the
3302     test case methods too. Update doTestWrite accordingly
3303     (TestLoadingProjFile)
3304     (TestLoadingProjFileWithEmptyProjectionlist): New classes with the
3305     read tests from TestProjFile.
3306     (TestProjFile.doTestRead, TestProjFile.testRead): Removed. These
3307     tests are now in the new classes.
3308     (sample_projfile, sample_projfile_data)
3309     (sample_projfile2, sample_projfile_data2): Removed. Not used
3310     anymore.
3311     (TestProjFile.test_read_unreadable_file): No need to reset the
3312     permissions at the end anymore since we use a unique filename
3313    
3314     2003-10-13 Bernhard Herzog <[email protected]>
3315    
3316 bh 1814 * test/test_proj.py: Some more refactoring of the test cases
3317     (ProjFileTest): New base class for the proj file tests.
3318     (TestProjFile): Derive from ProjFileTest
3319     (TestProjFile.test_read_unreadable_file)
3320     (TestProjFile.test_read_empty_file, TestProjFile.doTestRead): Use
3321     the new filename method to get a unique filename
3322     (TestProjFile.doTestWrite, TestProjFile.testWrite): Removed.
3323     (WriteProjFileTests): New class for proj file write tests.
3324     Contains the write test that were in TestProjFile originally.
3325    
3326     2003-10-13 Bernhard Herzog <[email protected]>
3327    
3328 bh 1812 * test/test_proj.py (TestProjFile.testRead)
3329     (TestProjFile.test_read_non_existing_file)
3330     (TestProjFile.test_read_unreadable_file)
3331     (TestProjFile.test_read_empty_file): Split into several methods.
3332    
3333 bh 1805 2003-10-10 Bernhard Herzog <[email protected]>
3334    
3335 bh 1810 * Thuban/UI/sizers.py: New file with custom sizers.
3336    
3337     * Thuban/UI/projdialog.py (ProjFrame.build_dialog): Instantiate
3338     all projection type specific panels and put them into a
3339     NotebookLikeSizer. This way the dialog doesn't change its size
3340     when a different projection is selected
3341     (ProjFrame.__init__): Rename projection_panels
3342     projection_panel_defs and reuse projection_panels for a list of
3343     the instantiated panels.
3344     (ProjFrame._show_proj_panel, ProjFrame.__DoOnProjAvail)
3345     (ProjFrame.__DoOnProjChoice): Changes due to the new handling of
3346     the panels
3347     (UnknownProjPanel._DoLayout): Place the newlines in the message
3348     differently to make the panel narrower.
3349     (TMPanel._DoLayout): Layout the parameters in one column.
3350    
3351     2003-10-10 Bernhard Herzog <[email protected]>
3352    
3353 bh 1807 * Thuban/UI/projdialog.py (ProjFrame.build_dialog): New method
3354     that contains all the setup for the dialog's widgets, layout and
3355     event handling.
3356     (__): Call build_dialog to build the dialog.
3357     (ProjFrame.__set_properties, ProjFrame.__do_layout): Removed.
3358     Their functionality is now in build_dialog
3359     (ProjFrame.__VerifyButtons, ProjFrame.__VerifyButtons)
3360     (ProjFrame.__DoOnProjAvail, ProjFrame.__DoOnProjAvail)
3361     (ProjFrame.__DoOnProjChoice): Small updates due to slightly
3362     different widget names and hierarchy introduced with build_dialog.
3363    
3364     2003-10-10 Bernhard Herzog <[email protected]>
3365    
3366 bh 1805 * README: Fix typo.
3367    
3368 bh 1803 2003-10-09 Bernhard Herzog <[email protected]>
3369    
3370     * Thuban/Model/proj.py (ProjFile.Add): Do not check whether the
3371     projection is already in the list. This is *a lot* faster when
3372     loading files with hundreds of projections since it saves a linear
3373     search. OTOH this will allow adding the same projection to the
3374     user.proj file multiple times in the projection dialog but we'll
3375     deal with that later
3376    
3377 jan 1801 2003-10-09 Jan-Oliver Wagner <[email protected]>
3378    
3379     * devtools: New. Directory for developer tools that are not intended
3380     for the regular user.
3381    
3382     * devtools/create_epsg.py: New. Convert the epsg file of proj into
3383     a python .proj file.
3384    
3385 bh 1799 2003-10-09 Bernhard Herzog <[email protected]>
3386    
3387     * test/test_proj.py
3388     (TestProjection.test_get_parameter_without_equals_sign): New. Test
3389     whether GetParameter handles parameters without "=" sign correctly
3390    
3391     * Thuban/Model/proj.py (Projection.GetParameter): Handle
3392     parameters that do not contain a "=". Update the doc-string
3393    
3394 bh 1794 2003-10-08 Bernhard Herzog <[email protected]>
3395    
3396 bh 1796 * Thuban/UI/projdialog.py (ProjFrame.__set_properties): Remove the
3397     length limit on the projname text control
3398    
3399     2003-10-08 Bernhard Herzog <[email protected]>
3400    
3401 bh 1794 * test/test_proj.py (TestProjection.test_get_projection_units_geo)
3402     (TestProjection.test_get_projection_units_normal): New. Tests for
3403     the Projection.GetProjectedUnits method
3404    
3405 jan 1792 2003-10-08 Jan-Oliver Wagner <[email protected]>
3406    
3407     * Thuban/Model/resource.py (get_user_proj_file): small bug-fix:
3408     Added missing 'val' parameter.
3409    
3410 bh 1788 2003-10-08 Bernhard Herzog <[email protected]>
3411    
3412 bh 1790 * Thuban/UI/projdialog.py (ProjFrame.__DoOnProjAvail): When the
3413     projection type of the currently selected projection is not known,
3414     i.e. there's no panel for it, use the UnknownProjPanel
3415     (ProjFrame.__DoOnProjChoice, ProjFrame._show_proj_panel): Split
3416     the actual replacing of the proj panel into the new method
3417     _show_proj_panel.
3418     (UnknownProjPanel): Add doc-string.
3419     (UnknownProjPanel._DoLayout): Insert a newline into the text so
3420     that the panel is not so wide.
3421    
3422     2003-10-08 Bernhard Herzog <[email protected]>
3423    
3424 bh 1788 * Thuban/Model/resource.py (read_proj_file): Return the warnings
3425     too. Update the doc-string
3426     (get_proj_files): Removed. It wasn't used anywhere
3427     (get_system_proj_files, get_system_proj_file): Rename to
3428     get_system_proj_file and return the ProjFile object and not a list
3429     of ProjFile objects. Update the callers.
3430     (get_user_proj_files, get_user_proj_file): Rename to
3431     get_user_proj_file return the ProjFile object and not a list of
3432     ProjFile objects. Update the callers.
3433     (ProjFileReader.__init__): New instance variable for the warnings.
3434     Rename the __pf ivar to projfile. Update the methods referring to
3435     __pf
3436     (ProjFileReader.end_projection): Catch any errors raised when
3437     instantiating the projection and record that as an error. The
3438     projection will not be in the final ProjFile object.
3439     (ProjFileReader.GetWarnings): New method to return the warnings.
3440    
3441     * Thuban/UI/projdialog.py (ProjFrame.show_warnings): New method to
3442     show the warnings from the projfile reader
3443     (ProjFrame._OnImport): Deal with any warnings returned by
3444     read_proj_file
3445     (ProjFrame.__FillAvailList): Deal with any warnings returned by
3446     get_system_proj_file or get_user_proj_file.
3447    
3448     * test/test_proj.py (TestProjFile.doTestRead): Check the warnings.
3449     (TestProjFileWithInvalidParameters.file_contents): New test cases
3450     to test whether read_proj_file handles invalid projection
3451     parameters correctly
3452     (TestProjFile.test_get_system_proj_file): New. Simple test for
3453     resource.get_system_proj_file
3454    
3455 bh 1785 2003-10-07 Bernhard Herzog <[email protected]>
3456    
3457     * test/test_derivedshapestore.py
3458     (TestDerivedShapeStoreExceptions.tearDown): Clear the session
3459     properly so that the temporary directories get deleted correctly
3460    
3461 bh 1773 2003-10-06 Bernhard Herzog <[email protected]>
3462    
3463 bh 1783 Handle the title changes in a proper MVC way.
3464    
3465     * Thuban/UI/mainwindow.py (MainWindow.__init__): Subscribe to the
3466     canvas' TITLE_CHANGED messages
3467     (MainWindow.update_title): New. Update the main window's title
3468     (MainWindow.__SetTitle): Removed. Use update_title instead.
3469     (MainWindow.SetMap): Use update_title instead of __SetTitle
3470     (MainWindow.RenameMap): Do change the window title explicitly
3471     here. That's handled in a proper MVC way now.
3472     (MainWindow.title_changed): New. Subscriber for the TITLE_CHANGED
3473     messages
3474    
3475     * Thuban/Lib/connector.py (Conduit): New class to help classes
3476     that forward messages
3477    
3478     * Thuban/UI/viewport.py: Forward the map's TITLE_CHANGED messages
3479     (ViewPort): Derive from Conduit instead of Publisher
3480     (ViewPort.Subscribe, ViewPort.Unsubscribe): Use the new base class
3481     when calling the inherited versions
3482     (ViewPort._subscribe_map, ViewPort._unsubscribe_map): New helper
3483     methods to subscribe and unsubscribe map messages
3484     (ViewPort.SetMap, ViewPort.Destroy): Use the new helper methods to
3485     handle the map subscriptions
3486     (ViewPort.Map, ViewPort.map_projection_changed)
3487     (ViewPort.layer_projection_changed): Add or update doc-strings
3488    
3489     * test/test_connector.py (TestPublisher.test_issue_simple): Fix
3490     typo
3491     (MyConduit): Helper class for the Conduit test.
3492     (TestConduit): Test cases for Conduit
3493    
3494     * test/test_connector.py: Use support.run_tests as main.
3495    
3496     * test/test_viewport.py (ViewPortTest.setUp): Also subscribe to
3497     the TITLE_CHANGED messages
3498     (ViewPortTest.test_forwarding_title_changed): New test to check
3499     whether the viewport forwards the map's TITLE_CHANGED messages
3500     (TestViewportWithPostGIS.tearDown): Call the map's Destroy method
3501     after the port's because the latter may require a still functional
3502     map.
3503    
3504     2003-10-06 Bernhard Herzog <[email protected]>
3505    
3506 bh 1777 * Thuban/UI/application.py (ThubanApplication.maps_changed): Add
3507     doc-string
3508    
3509     2003-10-06 Bernhard Herzog <[email protected]>
3510    
3511 bh 1775 * test/test_viewport.py (ViewPortTest.setUp)
3512     (SimpleViewPortTest.test_init_with_size): Move the test for the
3513     initial size as a constructor parameter from ViewPortTest.setUp
3514     method to a new separate test in SimpleViewPortTest.
3515    
3516     2003-10-06 Bernhard Herzog <[email protected]>
3517    
3518 bh 1773 * test/test_viewport.py (MockView): New class derived from
3519     ViewPort with a mock implementation of GetTextExtent to be used in
3520     the test cases
3521     (ViewPortTest.setUp): Use MockView instead of ViewPort
3522    
3523     * Thuban/UI/viewport.py (ViewPort.GetTextExtent): Turn this method
3524     into what would be a "pure virtual function" in C++: always raise
3525     NotImplementedError. Mock implementations for test cases don't
3526     belong into the real code
3527    
3528 bh 1770 2003-10-02 Bernhard Herzog <[email protected]>
3529    
3530     * test/test_layer.py (TestLayer.test_empty_layer): Explicitly
3531     close the dbf file we create so that it's contents have been
3532     written properly.
3533    
3534     * libraries/shapelib/shptree.c, libraries/shapelib/shpopen.c,
3535     libraries/shapelib/shapefil.h, libraries/shapelib/dbfopen.c:
3536     Update to shapelib 1.2.10
3537    
3538 jan 1767 2003-10-01 Jan-Oliver Wagner <[email protected]>
3539    
3540     * Thuban/UI/tree.py, Thuban/UI/main.py: Remove the #! line as
3541     it annoys lintian which warns about these files not being
3542     executable. The #! isn't necessary here since if you absolutely
3543     must execute them you can always say "python <filename>".
3544    
3545 bh 1757 2003-09-26 Bernhard Herzog <[email protected]>
3546    
3547 bh 1760 * Thuban/Model/classgen.py (GenQuantiles0): Removed since it's
3548     only used in GREAT-ER but not used in Thuban itself. When GREAT-ER
3549     is ported to a newer the import will fail, so it should be noticed
3550     immediately that this function is gone.
3551     Fixes RT#1919
3552    
3553     2003-09-26 Bernhard Herzog <[email protected]>
3554    
3555 bh 1757 Add a DTD for the projection files and make thuban write valid
3556     projection files
3557    
3558     * Resources/XML/projfile.dtd: New. DTD for thuban's projection
3559     files
3560    
3561     * Thuban/Model/resource.py (ProjFileSaver.write): Use
3562     'projectionlist' as the name in the document type declaration so
3563     that it matches the element type of the root element.
3564    
3565     * test/test_proj.py (sample_projfile, sample_projfile2): Use
3566     'projectionlist' as the name in the document type declaration just
3567     as it is done now in the files thuban would write
3568     (sample_projfile, sample_projfile_data): Fix spelling of
3569     "Mercator"
3570     (TestProjFile.doTestWrite): Validate the written and the expected
3571     XML data
3572     (TestProjFile): Derive from ValidationTest so that we can run xml
3573     validation tests
3574    
3575 bh 1751 2003-09-24 Bernhard Herzog <[email protected]>
3576    
3577     * Thuban/UI/renderer.py (ExportRenderer.render_legend): Do not
3578     modify the list returned by map.Layers() in place since it is the
3579     actual list of layers used by the map.
3580    
3581 jan 1745 2003-09-23 Jan-Oliver Wagner <[email protected]>
3582    
3583     * Doc/manual/thuban-manual.xml: Added subsection to chapter
3584     Extensions to describe the extensions coming with the Thuban
3585     standard package (gns2shp and importAPR).
3586    
3587 bh 1743 2003-09-23 Bernhard Herzog <[email protected]>
3588    
3589     * libraries/thuban/wxproj.cpp (project_point): if there's an
3590     inverse but no forward projection, convert to degrees after
3591     applying the inverse projection. Fixes RT#2096
3592    
3593     * test/test_wxproj.py: New. Test cases for wxproj.so. One test
3594     implicitly tests for the fix to RT#2096
3595    
3596     * test/support.py (FloatComparisonMixin.assertFloatSeqEqual):
3597     Check that the sequences have the same lengths
3598    
3599     * Resources/Projections/defaults.proj (Geographic projection): Use
3600     a much more precise value for the to_meter attribute.
3601    
3602 bh 1737 2003-09-22 Bernhard Herzog <[email protected]>
3603    
3604     * test/support.py (initthuban): Make sure to unset the LANG env.
3605     var. so that tests that compare translated strings work. Solves RT
3606     #2094
3607    
3608 jan 1730 2003-09-22 Jan-Oliver Wagner <[email protected]>
3609    
3610 jan 1735 Small improvement of APR import.
3611    
3612     * Extensions/importAPR/test/test_apr.py (aprTest.test_LClass):
3613     Added tests for text-ranges.
3614    
3615     * Extensions/importAPR/apr.py (APR_LClass.GetThubanRange): Now
3616     returns a string object if the range is based on text.
3617    
3618     * Extensions/importAPR/importAPR.py (import_apr_dialog): Unified
3619     range retrieval.
3620    
3621     2003-09-22 Jan-Oliver Wagner <[email protected]>
3622    
3623 jan 1730 Initial version of the importAPR extension which is in
3624     experimental state.
3625    
3626     * /Extensions/importAPR/, /Extensions/importAPR/samples/,
3627     /Extensions/importAPR/test/: New directories.
3628    
3629     * /Extensions/importAPR/samples/README: New: Howto load the samples.
3630    
3631     * /Extensions/importAPR/samples/iceland.apr: New: A sample APR
3632     file which refers to the Thuban Iceland demo data.
3633    
3634     * /Extensions/importAPR/test/README: New: Howto execute the tests.
3635    
3636     * /Extensions/importAPR/test/test_apr.py: New: Tests for APR classes.
3637    
3638     * /Extensions/importAPR/apr.py: New: Classes for ArcView Objects
3639     as in '.apr'-files.
3640    
3641     * /Extensions/importAPR/odb.py: New: Classes for generic ArcView
3642     ODB Objects as in '.apr', '.avl' and other files.
3643    
3644     * /Extensions/importAPR/__init__.py: New: Init to make this
3645     directory a package.
3646    
3647     * /Extensions/importAPR/importAPR.py: New: Import a ArcView
3648     project file (.apr) and convert it to Thuban.
3649    
3650     2003-09-22 Jan-Oliver Wagner <[email protected]>
3651    
3652     * Extensions/gns2shp.gns2shp.py: The main module of gns2shp.
3653    
3654 jan 1720 2003-09-19 Jan-Oliver Wagner <[email protected]>
3655    
3656     * Doc/manual/thuban-manual.xml: Extended section 'Installation'
3657     with description on RPM installation and RPM binary package
3658     creation.
3659    
3660 bh 1718 2003-09-18 Bernhard Herzog <[email protected]>
3661    
3662     * setup.py (data_files): Only add the mo files if the Locales
3663     directory actually exists, so that setup.py works with a fresh CVS
3664     checkout
3665    
3666 jan 1716 2003-09-12 Jan-Oliver Wagner <[email protected]>
3667    
3668     * Examples/simple_extensions/simple_tool.py: bugfix: Tool is now
3669     in viewport, not anymore in view
3670    
3671 jan 1714 2003-09-04 Jan-Oliver Wagner <[email protected]>
3672    
3673     Introducing first Extension (gns2shp).
3674    
3675     * Extensions, Extensions/gns2shp, Extensions/gns2shp/test: New.
3676    
3677     * Extensions/__init__.py: New. init to make this dir a package.
3678    
3679     * Extensions/gns2shp/__init__.py: New. init to make this dir a package.
3680    
3681     * Extensions/gns2shp/test/README: New. some info on this test directory.
3682    
3683     * Extensions/gns2shp/test/ls.txt: New. test data set (Liechtenstein).
3684    
3685     * Extensions/gns2shp/test/test_gns2shp.py: New. Test for correct creation
3686     of Shapefile from GNS text file format
3687    
3688 jan 1705 2003-09-03 Jan-Oliver Wagner <[email protected]>
3689    
3690 jan 1707 Fix/workaround for bug #2019:
3691     https://intevation.de/rt/webrt?serial_num=2019
3692    
3693     * Thuban/UI/identifyview.py (IdentifyView.ID_STOP): New.
3694     (IdentifyView.__init__): Added another button that allows to
3695     stop the identify mode.
3696     (IdentifyView.OnStop): New. Stops the identify mode.
3697    
3698     2003-09-03 Jan-Oliver Wagner <[email protected]>
3699    
3700 jan 1705 Introducing a new exception dialog that allows to exit the
3701     application immediately.
3702     This fixes bug #2060: https://intevation.de/rt/webrt?serial_num=2060
3703    
3704     * Thuban/UI/exceptiondialog.py: New. A special exception dialog.
3705    
3706     * Thuban/UI/application.py (ThubanApplication.ShowExceptionDialog):
3707     Made strings available to translations. Exchanged the simple
3708     ScrolledMessageDialog by the new ExceptionDialog.
3709    
3710 bh 1694 2003-09-01 Bernhard Herzog <[email protected]>
3711    
3712 bh 1701 * NEWS: New. Summary of changes and release notes.
3713    
3714     * MANIFEST.in: Add NEWS
3715    
3716     2003-09-01 Bernhard Herzog <[email protected]>
3717    
3718 bh 1699 * MANIFEST.in: Correct the include statement for the mo-files and
3719     include the documentation too.
3720    
3721     * setup.py (data_files): Add the .mo files
3722     (setup call): Up to version 0.9.0
3723    
3724     2003-09-01 Bernhard Herzog <[email protected]>
3725    
3726 bh 1696 * Thuban/UI/dbdialog.py (ChooseDBTableDialog.__init__): Change the
3727     parameter list to just parent and session
3728     (ChooseDBTableDialog.__set_properties): Removed. Setting the
3729     selection of empty list boxes is not allowed (and produces C++
3730     assertion errors) and the rest of the setup is better done in
3731     __init__ anyway.
3732     (ChooseDBTableDialog.OnCancel, ChooseDBTableDialog.OnOK)
3733     (ChooseDBTableDialog.OnLBDClick, DBDialog.OnOK): Use the Python
3734     builtins True/False for booleans to avoid warnings from wxPython
3735    
3736     * Thuban/UI/mainwindow.py (MainWindow.AddDBLayer): Adapt to new
3737     ChooseDBTableDialog constructor parameters.
3738    
3739     2003-09-01 Bernhard Herzog <[email protected]>
3740    
3741 bh 1694 * Thuban/Model/postgisdb.py
3742     (PostGISTable): Extend doc-string
3743     (PostGISTable._fetch_table_information): Set the column index
3744     correctly, pretending ignored columns don't exist.
3745    
3746     * test/test_postgis_db.py (TestPostGISIgnoredColumns): New tests
3747     for postgis tables with data types not yet supported by thuban.
3748    
3749 bh 1692 2003-08-29 Bernhard Herzog <[email protected]>
3750    
3751     * HOWTO-Release: Tweak item about running the tests.
3752    
3753 jan 1690 2003-08-29 Jan-Oliver Wagner <[email protected]>
3754    
3755     * /Doc/manual/thuban-manual.xml: updated to version 1.0pre2.
3756    
3757 bh 1688 2003-08-29 Bernhard Herzog <[email protected]>
3758    
3759     Add some missing parameters to projections. Proj complains about
3760     them on windows but for some reason not on Linux.
3761    
3762     * test/test_save.py (SaveSessionTest.testLayerProjection): Add
3763     missing required projection parameters
3764    
3765     * test/test_proj.py (TestProjFile.test): Add missing required
3766     projection parameters
3767    
3768     * test/test_load_0_8.py (TestLayerProjection.file_contents)
3769     (TestLayerProjection.test): Add missing required projection
3770     parameters and tests for them
3771    
3772     * test/test_load.py (TestLayerProjection.file_contents)
3773     (TestLayerProjection.test): Add missing required projection
3774     parameters and tests for them
3775    
3776     * test/test_layer.py (TestLayer.test_base_layer): Add missing
3777     required projection parameters
3778    
3779     2003-08-29 Bernhard Herzog <[email protected]>
3780    
3781     * libraries/pyprojection/Projection.i: Use pj_get_errno_ref to
3782     access the pj_errno because directly accessing pj_errno doesn't
3783     work on windows if the proj library is in a DLL
3784    
3785     * libraries/pyprojection/Projection_wrap.c: Update from Projection.i
3786    
3787 bh 1672 2003-08-28 Bernhard Herzog <[email protected]>
3788    
3789 bh 1685 * test/test_proj.py: Import things from Thuban after calling
3790     initthuban
3791    
3792     * test/test_load.py (LoadSessionTest.filenames): New class
3793     variable with the filename attributes to normalize
3794     (LoadSessionTest.check_format): Pass self.filenames to
3795     sax_eventlist to normalize the filename attributes
3796    
3797     * test/xmlsupport.py: Add cvs keywords
3798     (SaxEventLister.__init__): New parameter filenames which indicates
3799     attributes that contain filenames
3800     (SaxEventLister.startElementNS): Normalize the filename attributes
3801     with os.path.normpath
3802     (sax_eventlist): New parameter filenames to pass through to
3803     SaxEventLister
3804    
3805     * test/test_derivedshapestore.py: Make this file callable as a
3806     program to execute the tests
3807     (TestDerivedShapeStoreExceptions.test_table_with_wrong_size): Bind
3808     the session to self.session so that it gets destroyed properly
3809    
3810     * test/test_layer.py (TestLayer.tearDown): Call the session's
3811     Destroy method
3812    
3813     * test/test_map.py (TestMapBase.tearDown): Destroy self.session
3814     too if it exists
3815     (TestMapAddLayer.test_add_layer): Bind the session to self.session
3816     so that it gets destroyed properly
3817    
3818     * test/postgissupport.py (reason_for_not_running_tests): Add a
3819     test for the existence of popen2.Popen4.
3820    
3821     * test/test_save.py (SaveSessionTest.tearDown): New. Provide a
3822     reliable way to destroy the sessions created in the test cases
3823     (SaveSessionTest.test_dbf_table): Bind the session to self.session
3824     so that it gets destroyed properly
3825     (SaveSessionTest.testLayerProjection): Bind the session to
3826     self.session so that it gets destroyed properly
3827    
3828     * test/test_session.py (UnreferencedTablesTests.tearDown): Make
3829     sure that the session is destroyed properly
3830    
3831     * test/test_shapefilestore.py: Make this callable as a program to
3832     execute the tests
3833    
3834     * test/test_scalebar.py: Remove unnecessary import of _ from
3835     Thuban
3836    
3837     * test/support.py (print_garbage_information): Call initthuban
3838     here because it may be called indirectly from test cases that test
3839     test support modules which do not use anything from thuban itself
3840     (ThubanTestProgram.runTests): Remove unnecessary debug print
3841    
3842     2003-08-28 Bernhard Herzog <[email protected]>
3843    
3844 bh 1672 * Thuban/version.py (longversion): Update to 0.9
3845    
3846     * Thuban/UI/mainwindow.py: Remove some unused imports
3847    
3848     * README: Add section about required additional software. Add date
3849     and revision CVS keywords
3850    
3851     * HOWTO-Release: Add item about the translations. Add date and
3852     revision CVs keywords and change formatting to match README a bit
3853     better
3854    
3855     * po/de.po: Update for 0.9
3856    
3857     * test/README: Tweak the wording a little because many tests are
3858     not really unittest.
3859    
3860 bh 1663 2003-08-27 Bernhard Herzog <[email protected]>
3861    
3862 bh 1665 As preparation for the 0.9 release, switch thuban files to a
3863     non-dev namespace
3864    
3865     * Thuban/Model/save.py (SessionSaver.write_session): Write files
3866     with the http://thuban.intevation.org/dtds/thuban-0.9.dtd
3867     namespace
3868    
3869     * Thuban/Model/load.py (SessionLoader.__init__): Accept the
3870     http://thuban.intevation.org/dtds/thuban-0.9.dtd namespace too
3871    
3872     * test/test_save.py (SaveSessionTest.dtd)
3873     (SaveSessionTest.testEmptySession)
3874     (SaveSessionTest.testSingleLayer)
3875     (SaveSessionTest.testLayerProjection)
3876     (SaveSessionTest.testRasterLayer)
3877     (SaveSessionTest.testClassifiedLayer)
3878     (SaveSessionTest.test_dbf_table)
3879     (SaveSessionTest.test_joined_table)
3880     (SaveSessionTest.test_save_postgis): Update for new namespace
3881    
3882     * test/test_load.py (LoadSessionTest.dtd, TestSingleLayer)
3883     (TestLayerVisibility.file_contents, TestLabels.file_contents)
3884     (TestLayerProjection.file_contents)
3885     (TestRasterLayer.file_contents, TestJoinedTable.file_contents)
3886     (TestPostGISLayer.file_contents)
3887     (TestPostGISLayerPassword.file_contents)
3888     (TestLoadError.file_contents, TestLoadError.test): Update for new
3889     namespace
3890    
3891     2003-08-27 Bernhard Herzog <[email protected]>
3892    
3893 bh 1663 Make the table interface distinguish between row ids (an integer
3894     that uniquely identifies a row) and row ordinals (a simple row
3895     count from 0 to NumRows() - 1)
3896    
3897     * Thuban/Model/postgisdb.py (PostGISTable.RowIdToOrdinal)
3898     (PostGISTable.RowOrdinalToId): New methods to conver between row
3899     ids and row ordinals
3900     (PostGISTable.ReadRowAsDict, PostGISTable.ReadValue): New keyword
3901     parameter row_is_ordinal to indicate whether the row parameter is
3902     the row id or the ordinal
3903    
3904     * Thuban/Model/transientdb.py (TransientTableBase.RowIdToOrdinal)
3905     (TransientTableBase.RowOrdinalToId)
3906     (AutoTransientTable.RowIdToOrdinal)
3907     (AutoTransientTable.RowOrdinalToId): Same new methods as in
3908     PostGISTable.
3909     (TransientTableBase.ReadRowAsDict, TransientTableBase.ReadValue)
3910     (AutoTransientTable.ReadRowAsDict, AutoTransientTable.ReadValue):
3911     Same new parameter as in PostGISTable.
3912    
3913     * Thuban/Model/table.py (DBFTable.RowIdToOrdinal)
3914     (DBFTable.RowOrdinalToId, MemoryTable.RowIdToOrdinal)
3915     (MemoryTable.RowOrdinalToId): Same new methods as in PostGISTable.
3916     (DBFTable.ReadValue, DBFTable.ReadRowAsDict)
3917     (MemoryTable.ReadValue, MemoryTable.ReadRowAsDict): Same new
3918     parameter as in PostGISTable.
3919    
3920     * Thuban/UI/tableview.py (DataTable.RowIdToOrdinal)
3921     (DataTable.RowOrdinalToId): New methods to convert between row ids
3922     and row ordinals.
3923     (TableGrid.SelectRowById): New method to select a row based on its
3924     ID as opposed to its ordinal
3925     (DataTable.GetValue, TableGrid.OnRangeSelect)
3926     (TableGrid.OnSelectCell, LayerTableGrid.select_shapes)
3927     (QueryTableFrame.OnQuery, QueryTableFrame.get_selected)
3928     (LayerTableFrame.__init__): Convert between row ids and row
3929     ordinals as appropriate
3930    
3931     * test/postgissupport.py (PostGISDatabase.__init__): Add
3932     doc-string.
3933     (PostGISDatabase.initdb): The optional third item in a tuple in
3934     tables is now a (key, value) list with additional arguments to
3935     pass to upload_shapefile
3936     (upload_shapefile): New parameter gid_offset to allow gids that
3937     are not the same as the shapeids in the shapefile
3938     (PostgreSQLServer.get_default_static_data_db): Use the new
3939     gid_offset to make the gids in landmarks 1000 higher than the
3940     shapeids in the shapefile
3941    
3942     * test/test_viewport.py
3943     (TestViewportWithPostGIS.test_find_shape_at_point): Adapt to the
3944     new shapeids in the landmarks table
3945    
3946     * test/test_transientdb.py
3947     (TestTransientTable.run_iceland_political_tests)
3948     (TestTransientTable.test_transient_joined_table): Add tests for
3949     the new table methods and new keywords arguments.
3950    
3951     * test/test_postgis_db.py
3952     (TestPostGISTable.test_read_row_as_dict_row_count_mode)
3953     (TestPostGISTable.test_read_value_row_count_mode)
3954     (TestPostGISTable.test_row_id_to_ordinal)
3955     (TestPostGISTable.test_row_oridnal_to_id): New test for the new
3956     table methods and the new arguments
3957     (TestPostGISShapestorePoint.test_shapes_in_region)
3958     (TestPostGISShapestorePoint.test_shape_raw_data)
3959     (TestPostGISShapestorePoint.test_shape_points)
3960     (TestPostGISShapestorePoint.test_shape_shapeid)
3961     (TestPostGISShapestorePoint.test_all_shapes)
3962     (TestPostGISTable.test_simple_query)
3963     (TestPostGISTable.test_simple_query)
3964     (TestPostGISTable.test_simple_query)
3965     (TestPostGISTable.test_read_value)
3966     (TestPostGISTable.test_read_row_as_dict): Adapt to the new
3967     shapeids in the landmarks table
3968    
3969     * test/test_memory_table.py
3970     (TestMemoryTable.test_read_row_as_dict_row_count_mode)
3971     (TestMemoryTable.test_read_value_row_count_mode)
3972     (TestMemoryTable.test_row_id_to_ordinal)
3973     (TestMemoryTable.test_row_oridnal_to_id): New test for the new
3974     table methods and the new arguments
3975    
3976     * test/test_dbf_table.py
3977     (TestDBFTable.test_read_row_as_dict_row_count_mode)
3978     (TestDBFTable.test_read_value_row_count_mode)
3979     (TestDBFTable.test_row_id_to_ordinal)
3980     (TestDBFTable.test_row_oridnal_to_id): New test for the new table
3981     methods and the new arguments
3982    
3983 bh 1659 2003-08-26 Bernhard Herzog <[email protected]>
3984    
3985 bh 1661 * Thuban/Model/postgisdb.py (PostGISShapeStore.BoundingBox): Use a
3986     more postgis specific but much faster method to get the bounding
3987     box
3988    
3989     2003-08-26 Bernhard Herzog <[email protected]>
3990    
3991 bh 1659 * Thuban/Model/postgisdb.py (PostGISTable.Title)
3992     (PostGISShapeStore.AllShapes): Add these missing methods.
3993     (PostGISShapeStore.ShapesInRegion): No need to raise
3994     StopIteration. We can simply return
3995    
3996     * test/test_postgis_db.py (TestPostGISTable.test_title)
3997     (TestPostGISShapestorePoint.test_all_shapes): New tests for the
3998     new methods
3999    
4000 bh 1643 2003-08-25 Bernhard Herzog <[email protected]>
4001    
4002 bh 1657 * Thuban/Model/postgisdb.py (shapetype_map): Add MUTLIPOLYGON.
4003    
4004     * test/test_postgis_db.py (PolygonTests): New class containing
4005     those tests from TestPostGISShapestorePolygon that can also be
4006     used to test MUTLIPOLYGON tables
4007     (TestPostGISShapestorePolygon): Most tests are now in PolygonTests
4008     so derive from that
4009     (TestPostGISShapestoreMultiPolygon): New class with tests for
4010     MUTLIPOLYGON tables
4011    
4012     * test/postgissupport.py (PostGISDatabase.initdb): Allow the
4013     tables argument to have tuples with three items to override the
4014     WKT type used.
4015     (PostgreSQLServer.get_default_static_data_db): Use the above to
4016     create a polygon table with MUTLIPOLYGONs
4017     (point_to_wkt, coords_to_point, polygon_to_wkt, coords_to_polygon)
4018     (arc_to_wkt, coords_to_multilinestring): Rename from *_to_wkt to
4019     coords_to*
4020     (coords_to_multipolygon): New. Convert to MUTLIPOLYGON
4021     (wkt_converter): New. Map WKT types to converters
4022     (upload_shapefile): New parameter force_wkt_type to use a
4023     different WKT type than the default
4024    
4025     2003-08-25 Bernhard Herzog <[email protected]>
4026    
4027 bh 1655 * Thuban/UI/application.py
4028     (ThubanApplication.run_db_param_dialog): New. Suitable as a
4029     db_connection_callback. Main difference is that the dialog run
4030     from this method doesn't have a parent so it can be used even when
4031     there is no main window
4032     (ThubanApplication.OpenSession): Use self.run_db_param_dialog if
4033     no db_connection_callback was given. This way the dialog pops up
4034     even when the .thuban file was given as a command line parameter.
4035    
4036     2003-08-25 Bernhard Herzog <[email protected]>
4037    
4038 bh 1653 * Thuban/UI/view.py (MapCanvas.OnLeftUp): Release the the mouse
4039     before calling MouseLeftUp. MouseLeftUp may pop up modal dialogs
4040     which leads to an effectively frozen X session because the user
4041     can only interact with the dialog but the mouse is still grabbed
4042     by the canvas.
4043     Also, call the tool's Hide method before MouseLeftUp because
4044     MouseLeftUp may change the tool's coordinates.
4045    
4046     2003-08-25 Bernhard Herzog <[email protected]>
4047    
4048 bh 1651 * Thuban/UI/application.py (ThubanApplication.OpenSession): Catch
4049     LoadCancelled exceptions and handle them by returning immediately.
4050    
4051     2003-08-25 Bernhard Herzog <[email protected]>
4052    
4053 bh 1649 GUI part of loading sessions with postgis connections which may
4054     require user interaction to get passwords or updated parameters
4055    
4056     * Thuban/UI/dbdialog.py (DBDialog): Reimplement to make it look a
4057     bit nucer and be more generic.
4058     (DBFrame.OnAdd): Adapt to new DBDialog interface
4059    
4060     * Thuban/UI/application.py (ThubanApplication.OpenSession): New
4061     optional parameter db_connection_callback which is passed to
4062     load_session.
4063    
4064     * Thuban/UI/mainwindow.py (MainWindow.run_db_param_dialog): New.
4065     Suitable as a db_connection_callback
4066     (MainWindow.OpenSession): Use self.run_db_param_dialog as the
4067     db_connection_callback of the application's OpenSession method
4068    
4069    
4070     2003-08-25 Bernhard Herzog <[email protected]>
4071    
4072 bh 1647 Basic loading of sessions containing postgis connections:
4073    
4074     * Thuban/Model/load.py (LoadError): Add doc-string
4075     (LoadCancelled): New exception class to indicate a cancelled load
4076     (SessionLoader.__init__): Add the db_connection_callback parameter
4077     which will be used by the loader to get updated parameters and a
4078     password for a database connection
4079     (SessionLoader.__init__): Add the new XML elements to the
4080     dispatchers dictionary
4081     (SessionLoader.check_attrs): Two new conversions, ascii to convert
4082     to a byte-string object and idref as a generic id reference
4083     (SessionLoader.start_dbconnection)
4084     (SessionLoader.start_dbshapesource): New. Handlers for the new XML
4085     elements
4086     (load_session): Add the db_connection_callback to pass through the
4087     SessionLoader
4088    
4089     * test/test_load.py (TestPostGISLayer, TestPostGISLayerPassword):
4090     New classes to test loading of sessions with postgis database
4091     connections.
4092    
4093     2003-08-25 Bernhard Herzog <[email protected]>
4094    
4095 bh 1645 * Thuban/UI/mainwindow.py (__ThubanVersion__): Remove this and
4096     replace it and the comment with __BuildDate__ by the Source: and
4097     Id: cvs keywords as used in the other files.
4098    
4099     2003-08-25 Bernhard Herzog <[email protected]>
4100    
4101 bh 1643 * Thuban/Model/load.py (SessionLoader.check_attrs): Raise a
4102     LoadError when a required attribute is missing. The code used to
4103     be commented out for some reason, but probably should have been
4104     active.
4105    
4106     * test/test_load.py (TestLoadError.test): Test the message in the
4107     LoadError too to make sure it really is about the missing
4108     attribute
4109    
4110 bh 1632 2003-08-22 Bernhard Herzog <[email protected]>
4111 bh 1641
4112     * test/test_save.py (SaveSessionTest.test_dbf_table)
4113     (SaveSessionTest.test_joined_table): Add XML validation tests.
4114    
4115     2003-08-22 Bernhard Herzog <[email protected]>
4116    
4117 bh 1639 Implement saving a session with a postgis connection
4118 bh 1632
4119 bh 1639 * Resources/XML/thuban-0.9.dtd (dbconnection, dbshapesource) New
4120     elements for database connections and shapestores using db
4121     connections
4122     (session): Add the dbconnections to the content model
4123    
4124     * Thuban/Model/save.py (SessionSaver.write_db_connections): New.
4125     Write the db connections
4126     (SessionSaver.write_session): Call write_db_connections to write
4127     the connection before the data sources
4128     (SessionSaver.write_data_containers): Handle postgis shapestores
4129    
4130     * test/test_save.py (SaveSessionTest.thubanids)
4131     (SaveSessionTest.thubanidrefs): Update for new DTD
4132     (SaveSessionTest.test_save_postgis): New. Test saving a session
4133     with postgis connections
4134    
4135     * Thuban/Model/postgisdb.py (PostGISTable.DBConnection)
4136     (PostGISTable.TableName): New accessor methods for the connection
4137     and table name
4138    
4139     * test/test_postgis_db.py (TestPostGISTable.test_dbconn)
4140     (TestPostGISTable.test_dbname): New methods to test the new
4141     PostGISConnection methods
4142    
4143     2003-08-22 Bernhard Herzog <[email protected]>
4144    
4145 bh 1637 * Thuban/Model/postgisdb.py (ConnectionError): New exception class
4146     for exceptions occurring when establishing a Database connection
4147     (PostGISConnection.connect): Catch psycopg.OperationalError during
4148     connects and raise ConnectionError.
4149    
4150     * test/test_postgis_db.py (TestPostgisDBExceptions): New class for
4151     tests for database exceptions
4152    
4153     2003-08-22 Bernhard Herzog <[email protected]>
4154    
4155 bh 1635 Prepare the test suite for tests with required authentication
4156    
4157     * test/postgissupport.py (PostgreSQLServer.__init__): Add instance
4158     variables with two predefined users/passwords, one for the admin
4159     and one for a non-privileged user.
4160     (PostgreSQLServer.createdb): Pass the admin name to initdb and add
4161     the non-privileged user to the database and set the admin password
4162     (PostgreSQLServer.wait_for_postmaster): Use the admin user name.
4163     Better error reporting
4164     (PostgreSQLServer.connection_params)
4165     (PostgreSQLServer.connection_string): New methods to return
4166     information about how to connect to the server
4167     (PostgreSQLServer.execute_sql): New. Convenience method to execute
4168     SQL statements
4169     (PostgreSQLServer.require_authentication): Toggle whether the
4170     server requires authentication
4171     (PostgreSQLServer.create_user, PostgreSQLServer.alter_user): New.
4172     Add or alter users
4173     (PostGISDatabase.initdb): Pass the admin name one the
4174     subprocesses' command lines. Grant select rights on
4175     geometry_columns to everybody.
4176     (upload_shapefile): Use the admin name and password when
4177     connecting. Grant select rights on the new table to everybody.
4178    
4179     * test/test_viewport.py (TestViewportWithPostGIS.setUp): Use the
4180     server's new methods to get the connection parameters.
4181    
4182     * test/test_postgis_session.py (TestSessionWithPostGIS.setUp)
4183     (TestSessionWithPostGIS.test_remove_dbconn_exception): Use the
4184     server's new methods to get the connection parameters.
4185    
4186     * test/test_postgis_db.py
4187     (TestPostGISConnection.test_gis_tables_empty)
4188     (TestPostGISConnection.test_gis_tables_non_empty)
4189     (PostGISStaticTests.setUp): Use the server's new methods to get
4190     the connection parameters.
4191    
4192     2003-08-22 Bernhard Herzog <[email protected]>
4193    
4194 bh 1632 * Thuban/UI/about.py (About.__init__): Add the psycopg version.
4195    
4196     * Thuban/version.py: Add psycopg version
4197    
4198     * Thuban/Model/postgisdb.py (psycopg_version): New. Return the
4199     version of the psycopg module
4200    
4201     2003-08-22 Bernhard Herzog <[email protected]>
4202    
4203     * Thuban/UI/dbdialog.py (DBPwdDlg): Removed because it's not used.
4204     (DBFrame.OnEdit): Removed because it's not used and wouldn't work
4205     at the moment. The functionality should probably be implemented
4206     some time, though.
4207 bh 1633 (DBFrame.OnRemove): Display a message if the connection can't be
4208     removed because it's still in use.
4209 bh 1632
4210 jan 1629 2003-08-22 Jan-Oliver Wagner <[email protected]>
4211    
4212     * Thuban/UI/about.py (About.__init__): split up the huge about
4213     text into elements/lists for easier translation. This fixes bug
4214     https://intevation.de/rt/webrt?serial_num=2058
4215     Also, made some forgotten string available for the i18n.
4216    
4217 bh 1627 2003-08-21 Bernhard Herzog <[email protected]>
4218    
4219     Make postgis support really optional including insensitive menu
4220     items.
4221    
4222     * Thuban/Model/postgisdb.py (has_postgis_support): New. Return
4223     whether the postgis is supported.
4224    
4225     * Thuban/UI/dbdialog.py: Put the psycopg import into try..except
4226     to make postgis support optional
4227    
4228     * Thuban/UI/mainwindow.py (_has_postgis_support): New. Context
4229     version of Thuban.Model.postgisdb.has_postgis_support
4230     (database_management command): Make it only sensitive if postgis
4231     is supported.
4232    
4233 jan 1623 2003-08-21 Jan-Oliver Wagner <[email protected]>
4234    
4235 jan 1626 * Doc/manual/thuban-manual.xml: Added CVS revision for rev-history.
4236     (section Adding and Removing Layers): Added text and described
4237     multi-selection.
4238     (chapter Extensions): New.
4239    
4240     2003-08-21 Jan-Oliver Wagner <[email protected]>
4241    
4242 jan 1623 * Thuban/UI/mainwindow.py (MainWindow.AddLayer): Changed dialog
4243     settings to allow multiple files to load into the map.
4244     Also reduced selection to *.shp as a default.
4245    
4246 bh 1621 2003-08-20 Bernhard Herzog <[email protected]>
4247    
4248     Add dialogs and commands to open database connections and add
4249     database layers.
4250    
4251     * Thuban/UI/mainwindow.py (MainWindow.DatabaseManagement): New
4252     method to open the database connection management dialog
4253     (MainWindow.AddDBLayer): New method to add a layer from a database
4254     (_has_dbconnections): New helper function to use for sensitivity
4255     (database_management command, layer_add_db command): New commands
4256     that call the above new methods.
4257     (main_menu): Add the new commands to the menu.
4258    
4259     * Thuban/Model/postgisdb.py (PostGISConnection.__init__)
4260     (PostGISConnection.connect): Establish the actual connection in a
4261     separate method and call it in __init__. This makes it easier to
4262     override the behavior in test cases
4263     (PostGISConnection.BriefDescription): New method to return a brief
4264     description for use in dialogs.
4265    
4266     * test/test_postgis_db.py (NonConnection): DB connection that
4267     doesn't actually connect
4268     (TestBriefDescription): New class with tests for the new
4269     BriefDescription method
4270    
4271 jan 1619 2003-08-19 Jan-Oliver Wagner <[email protected]>
4272    
4273     Moved anything from extensions to libraries.
4274    
4275     * libraries: New.
4276    
4277     * libraries/ pyprojection, pyshapelib, shapelib, thuban: New.
4278    
4279     * libraries/pyprojection/ LICENSE, MANIFEST.in, Projection.i,
4280     Projection.py, Projection_wrap.c, setup.py, swighelp.txt: These files have
4281     been moved here from thuban/extensions/pyprojection/
4282     See there in the Attic for the older history.
4283    
4284     * libraries/pyshapelib/ COPYING, ChangeLog, NEWS, README, dbflib.i,
4285     dbflib.py, dbflib_wrap.c, pyshapelib_api.h, pytest.py, setup.py,
4286     shapelib.i, shapelib.py, shapelib_wrap.c, shptreemodule.c: These files
4287     have been moved here from thuban/extensions/pyshapelib/
4288     See there in the Attic for the older history.
4289    
4290     * libraries/shapelib/ dbfopen.c, shapefil.h, shpopen.c, shptree.c: These
4291     files have been moved here from thuban/extensions/shapelib/
4292     See there in the Attic for the older history.
4293    
4294     * libraries/thuban/ bmpdataset.cpp, cpl_mfile.cpp, cpl_mfile.h,
4295     gdalwarp.cpp, wxproj.cpp: These files have been moved here from
4296     thuban/extensions/thuban/
4297     See there in the Attic for the older history.
4298    
4299     * MANIFEST.in, setup.cfg, setup.py: renamed extensions to libraries.
4300    
4301     * extensions/thuban/ bmpdataset.cpp, cpl_mfile.cpp, cpl_mfile.h,
4302     gdalwarp.cpp, wxproj.cpp: Moved to libraries/thuban.
4303    
4304     * extensions/shapelib/ dbfopen.c, shapefil.h, shpopen.c, shptree.c:
4305     Moved to libraries/shapelib.
4306    
4307     * extensions/pyshapelib/ COPYING, NEWS, dbflib.py, pytest.py,
4308     shapelib.py, README, dbflib_wrap.c, setup.py, shapelib_wrap.c,
4309     ChangeLog, dbflib.i, pyshapelib_api.h, shapelib.i, shptreemodule.c:
4310     Moved to libraries/pyshapelib.
4311    
4312     * extensions/pyprojection/ MANIFEST.in, Projection.py, setup.py,
4313     LICENSE, Projection.i, Projection_wrap.c, swighelp.txt:
4314     Moved to libraries/pyprojection.
4315    
4316     * extensions/ pyprojection, pyshapelib, shapelib, thuban: Removed.
4317    
4318     * extensions: Removed.
4319    
4320 bh 1606 2003-08-19 Bernhard Herzog <[email protected]>
4321    
4322 bh 1609 * test/test_viewport.py (ViewPortTest): We don't use the
4323     facilities of FileTestMixin so don't derive from it.
4324     (TestViewportWithPostGIS): New class with tests for using a
4325     viewport on a map with postgis layers.
4326    
4327     2003-08-19 Bernhard Herzog <[email protected]>
4328    
4329     Add the db connection management to the session.
4330    
4331     * Thuban/Model/session.py (Session.__init__): New instance
4332     variable db_connections
4333     (Session.AddDBConnection, Session.DBConnections)
4334     (Session.HasDBConnections, Session.CanRemoveDBConnection)
4335     (Session.RemoveDBConnection): New methods to manage and query the
4336     db connections managed by the session
4337     (Session.OpenDBShapeStore): New method to open a shapestore from a
4338     db connection
4339    
4340     * Thuban/Model/messages.py (DBCONN_REMOVED, DBCONN_ADDED): New
4341     messages for the db connection handling in the session
4342    
4343     * test/test_postgis_session.py: New. test cases for the session's
4344     db connection handling with postgis connections
4345    
4346     2003-08-19 Bernhard Herzog <[email protected]>
4347    
4348 bh 1606 Add very basic postgis database support and the corresponding test
4349     cases. The test cases require a PostgreSQL + postgis installation
4350     but no existing database. The database will be created
4351     automatically by the test cases
4352    
4353     * test/README: Add note about skipped tests and the requirements
4354     of the postgis tests.
4355    
4356     * Thuban/Model/postgisdb.py: New. Basic postgis database support.
4357    
4358     * test/test_postgis_db.py: New. Test cases for the postgis
4359     support.
4360    
4361     * Thuban/Model/wellknowntext.py: New. Parser for well-known-text
4362     format
4363    
4364     * test/test_wellknowntext.py: New. Test cases for the
4365     wellknowntext parser
4366    
4367     * test/postgissupport.py: New. Support module for tests involving
4368     a postgis database.
4369    
4370     * test/support.py (execute_as_testsuite): Shut down the postmaster
4371     if it's still running after the tests
4372    
4373     * Thuban/Model/data.py (RAW_WKT): New constant for raw data in
4374     well known text format
4375    
4376 jan 1604 2003-08-19 Jan-Oliver Wagner <[email protected]>
4377    
4378     * Examples/simple_extensions/hello_world.py: New. Raises a Hello World
4379     message dialog.
4380    
4381 bh 1600 2003-08-18 Bernhard Herzog <[email protected]>
4382    
4383 bh 1602 * test/support.py (ThubanTestResult.printErrors): Indent the
4384     reason for the skips in the output to make it a bit more readable.
4385     (execute_as_testsuite): New helper function to run a test suite
4386     and print some more information.
4387     (run_tests): Use execute_as_testsuite to run the tests
4388    
4389     * test/runtests.py (main): Use execute_as_testsuite to run the
4390     tests
4391    
4392     2003-08-18 Bernhard Herzog <[email protected]>
4393    
4394 bh 1600 Fix some bugs in Thuban and the test suite that were uncovered by
4395     changes introduced in Python 2.3:
4396    
4397     * Thuban/Model/table.py (DBFTable.__init__): Make sure the
4398     filename is an absolute name
4399    
4400     * Thuban/Model/layer.py (RasterLayer.__init__): Make sure the
4401     filename is an absolute name
4402    
4403     * test/test_save.py (SaveSessionTest.testRasterLayer): Use a
4404     unique filename to save to and use the correct relative filename
4405     in the expected output.
4406     (SaveSessionTest.test_dbf_table): Use the correct relative
4407     filename in the expected output.
4408    
4409     * test/test_layer.py (TestLayer.test_raster_layer): Update the
4410     test to check whether the filename is absolute.
4411    
4412 jan 1596 2003-08-18 Jan-Oliver Wagner <[email protected]>
4413    
4414     * Thuban/UI/about.py (About.__init__): Added Silke Reimer.
4415    
4416 bh 1586 2003-08-15 Bernhard Herzog <[email protected]>
4417    
4418 bh 1594 Change the way shapes are returned by a shape store. The
4419     ShapesInRegion method returns an iterator over actual shape
4420     objects instead of a list of shape ids.
4421    
4422     * Thuban/Model/data.py (ShapefileShape.ShapeID): New. Return shape
4423     id.
4424     (ShapefileStore.ShapesInRegion): Return an iterator over the
4425     shapes which yields shape objects instead of returning a list of
4426     shape ids
4427     (ShapefileStore.AllShapes): New. Return an iterator over all
4428     shapes in the shape store
4429     (DerivedShapeStore.AllShapes): New. Like in ShapefileStore
4430    
4431     * Thuban/Model/layer.py (Layer.ShapesInRegion): Update
4432     doc-string.
4433    
4434     * Thuban/UI/baserenderer.py
4435     (BaseRenderer.layer_ids, BaseRenderer.layer_shapes): Rename to
4436     layer_shapes and make it return an iterator containg shapes
4437     instead of a list of ids.
4438     (BaseRenderer.draw_shape_layer): Update doc-string; Adapt to
4439     layer_shapes() change
4440    
4441     * Thuban/UI/renderer.py (ScreenRenderer.layer_ids)
4442     (ScreenRenderer.layer_shapes): Rename as in BaseRenderer
4443    
4444     * Thuban/UI/viewport.py (ViewPort._find_shape_in_layer): Adapt to
4445     changes in the ShapesInRegion return value.
4446     (ViewPort._get_hit_tester): Remove commented out code
4447    
4448     * test/mockgeo.py (SimpleShapeStore.ShapesInRegion): Adapt to the
4449     new return value.
4450     (SimpleShapeStore.AllShapes): New. Implement this method too.
4451    
4452     * test/test_layer.py (TestLayer.test_arc_layer)
4453     (TestLayer.test_polygon_layer, TestLayer.test_point_layer)
4454     (TestLayer.test_point_layer_with_projection)
4455     (TestLayer.test_derived_store): Adapt to changes in the
4456     ShapesInRegion return value.
4457    
4458     * test/test_shapefilestore.py
4459     (TestShapefileStoreArc.test_shapes_in_region)
4460     (TestShapefileStorePolygon.test_shapes_in_region)
4461     (TestShapefileStorePoint.test_shapes_in_region): Adapt to changes
4462     in the ShapesInRegion return value.
4463     (TestShapefileStorePoint.test_all_shapes)
4464     (TestShapefileStoreArc.test_shape_shapeid): New tests for the new
4465     methods
4466    
4467     * test/test_derivedshapestore.py
4468     (TestDerivedShapeStore.test_shapes_in_region): Adapt to changes in
4469     the ShapesInRegion return value.
4470     (TestDerivedShapeStore.test_all_shapes)
4471     (TestDerivedShapeStore.test_shape_shapeid): New tests for the new
4472     methods
4473    
4474     2003-08-15 Bernhard Herzog <[email protected]>
4475    
4476 bh 1592 Make the renderers deal correctly with raw vs. python level
4477     representation of shape geometries
4478    
4479     * Thuban/UI/baserenderer.py (BaseRenderer.low_level_renderer):
4480     Return a flag useraw in addition to the callable and the parameter
4481     to indicate whether the callable can deal with the raw shape data
4482     or uses the higher level python lists of coordinates. The callable
4483     now should accept either the raw data or the return value of the
4484     shape's Points() method.
4485     (BaseRenderer.draw_shape_layer): Adapt to the low_level_renderer
4486     change
4487     (BaseRenderer.projected_points): Instead of the shape id use the
4488     points list as parameter.
4489     (BaseRenderer.draw_polygon_shape, BaseRenderer.draw_arc_shape)
4490     (BaseRenderer.draw_point_shape): Adapt to projected_points()
4491     change and accept the points list as parameter instead of the
4492     shape id.
4493    
4494     * Thuban/UI/renderer.py (MapRenderer.low_level_renderer): Return
4495     the useraw flag as required by the BaseRenderer
4496     (ScreenRenderer.draw_shape_layer): Adapt to low-level renderer
4497     changes.
4498    
4499     * test/test_baserenderer.py
4500     (TestBaseRenderer.test_point_with_classification): New test for
4501     rendering a map with classifications.
4502    
4503     2003-08-15 Bernhard Herzog <[email protected]>
4504    
4505 bh 1590 * Thuban/UI/viewport.py (ViewPort.find_shape_at)
4506     (ViewPort._find_shape_in_layer, ViewPort._find_shape_in_layer)
4507     (ViewPort._get_hit_tester, ViewPort.projected_points)
4508     (ViewPort._hit_point, ViewPort._hit_arc, ViewPort._hit_polygon)
4509     (ViewPort._find_label_at): Split the find_shape_at method into
4510     several new methods and use the functions in the hit-test module.
4511    
4512     * Thuban/UI/hittest.py: New module with Python-level hit-testing
4513     functions
4514    
4515     * test/test_hittest.py: New. Test for the new hittest module
4516    
4517     2003-08-15 Bernhard Herzog <[email protected]>
4518    
4519 bh 1588 * Thuban/Model/layer.py (Layer.ShapesInRegion): Apply the layer
4520     projection to all corners of the bounding box to get a better
4521     approximation of the projected bounding box
4522    
4523     * test/test_layer.py (TestLayer.test_point_layer_with_projection):
4524     New. Test coordinate handling of a layer with a projection.
4525     Catches the bug fixed in Layer.ShapesInRegion
4526    
4527     2003-08-15 Bernhard Herzog <[email protected]>
4528    
4529 bh 1586 Move some of the mock objects in test_baserenderer into their own
4530     module so they can easily be used from other tests
4531    
4532     * test/mockgeo.py: New test helper module with some mock objects
4533     for geometry related things like shapes, shapestores and
4534     projections.
4535    
4536     * test/test_mockgeo.py: New. Tests for the new helper module
4537    
4538     * test/test_baserenderer.py: Some of the mock-objects are in
4539     mockgeo now.
4540    
4541 jan 1584 2003-08-12 Jan-Oliver Wagner <[email protected]>
4542    
4543     * Thuban/UI/about.py (About.__init__): Added Björn Broscheit.
4544    
4545 bh 1580 2003-08-12 Bernhard Herzog <[email protected]>
4546    
4547 bh 1582 * po/de.po: New. German translations by Bjoern Broscheit
4548    
4549     2003-08-12 Bernhard Herzog <[email protected]>
4550    
4551 bh 1580 * Thuban/UI/projdialog.py (UnknownProjPanel._DoLayout): Translated
4552     strings have to be one string literal.
4553    
4554 bh 1573 2003-08-11 Bernhard Herzog <[email protected]>
4555    
4556 bh 1578 * test/support.py (FloatComparisonMixin.assertPointListEquals):
4557     New. This method was used in various derived classes, but it's
4558     better to have it here.
4559    
4560     * test/test_shapefilestore.py
4561     (ShapefileStoreTests.assertPointListEquals): Removed. It's now in
4562     FloatComparisonMixin
4563    
4564     * test/test_layer.py (TestLayer.assertPointListEquals): Removed.
4565     It's now in FloatComparisonMixin
4566    
4567     * test/test_derivedshapestore.py
4568     (TestDerivedShapeStore.assertPointListEquals): Removed. It's now
4569     in FloatComparisonMixin
4570    
4571     2003-08-11 Bernhard Herzog <[email protected]>
4572    
4573 bh 1573 * Thuban/UI/join.py (JoinDialog.OnJoin): Add missing space to
4574     error message
4575    
4576 jan 1569 2003-08-08 Jan-Oliver Wagner <[email protected]>
4577    
4578 jan 1571 * Doc/manual/thuban-manual.xml: Now use authorgroup. Added revhistory
4579     with version number.
4580     Changed title to reflect version number of Thuban.
4581    
4582     2003-08-08 Jan-Oliver Wagner <[email protected]>
4583    
4584 jan 1569 * Thuban/UI/about.py (About.__init__): Reworked the hall of fame. Now
4585     the list corresponds to the "About" web page.
4586    
4587 bh 1567 2003-08-08 Bernhard Herzog <[email protected]>
4588    
4589     * Thuban/UI/projdialog.py (UTMProposeZoneDialog.dialogLayout):
4590     Make sure translated strings are recognized as one string literal.
4591    
4592     * Thuban/UI/proj4dialog.py (UTMProposeZoneDialog.dialogLayout):
4593     Make sure translated strings are recognized as one string literal.
4594    
4595     * Thuban/UI/classgen.py (ClassGenDialog.OnOK): Make sure
4596     translated strings are recognized as one string literal.
4597    
4598     * Thuban/UI/application.py (ThubanApplication.OpenSession): Make
4599     sure translated strings are recognized as one string literal.
4600    
4601 bh 1556 2003-08-07 Bernhard Herzog <[email protected]>
4602    
4603 bh 1565 * Thuban/Model/data.py (DerivedShapeStore.RawShapeFormat): New.
4604     Simply delegates to the original shapestore.
4605    
4606     * test/test_derivedshapestore.py
4607     (TestDerivedShapeStore.test_raw_format): New. Test case for
4608     DerivedShapeStore.RawShapeFormat
4609    
4610     2003-08-07 Bernhard Herzog <[email protected]>
4611    
4612 bh 1561 Add raw data interface to shape objects.
4613    
4614     * Thuban/Model/data.py (ShapefileShape, Shape): Rname the shape
4615     class to ShapefileShape which now holds shapefile specific
4616     information.
4617     (ShapefileShape.compute_bbox): Simplified to not cache any
4618     information. The way this method is used that shouldn't matter
4619     performance wise.
4620     (ShapefileShape.RawData): New. Return the shapeid which is the raw
4621     data format for shapes from shapefiles.
4622     (ShapefileStore.RawShapeFormat): New. Return the raw datatype used
4623     in the shape objects returned by a shapestore. For a
4624     ShapefileStore this is always RAW_SHAPEFILE.
4625     (RAW_PYTHON, RAW_SHAPEFILE): Constants for the RawShapeFormat
4626     method.
4627    
4628     * test/test_shapefilestore.py
4629     (TestShapefileStore.test_raw_format): New test to test the raw
4630     format feature of shapes.
4631    
4632 bh 1560 * Thuban/Model/layer.py: Remove the unused import of Shape from
4633     data. It was only there for interface compatibility but it's not
4634 bh 1561 used inside of Thuban and the generic Shape class has gone away.
4635 bh 1560
4636 bh 1563 * Thuban/UI/renderer.py (MapRenderer.low_level_renderer): Check
4637     the raw data format and only use an optimized version of its a
4638     shapefile.
4639    
4640 bh 1561 2003-08-07 Bernhard Herzog <[email protected]>
4641    
4642 bh 1559 * test/test_baserenderer.py (SimpleShape): Shape class for the
4643     tests.
4644     (SimpleShapeStore.Shape): Use SimpleShape instead of
4645     Thuban.Model.data.Shape to make the tests independed of the coming
4646     changes.
4647    
4648     2003-08-07 Bernhard Herzog <[email protected]>
4649    
4650 bh 1556 * test/support.py (SkipTest, ThubanTestResult, ThubanTestRunner)
4651     (ThubanTestProgram): New classes that extend the respective
4652     classes from unittest. These new version support skipping tests
4653     under certain expected conditions. In the Thuban test suite we
4654     uses this for tests that require the optional gdal support.
4655     (run_tests): Use ThubanTestProgram instead of the unittest.main()
4656    
4657     * test/runtests.py (main): Use the new ThubanTestRunner instead of
4658     the normal one from unittest
4659    
4660     * test/test_layer.py (TestLayer.test_raster_layer): If this test
4661     is not run because gdal support isn't available report this to the
4662     runner.
4663    
4664     * test/test_baserenderer.py
4665     (TestBaseRenderer.test_raster_no_projection): Do not run this test
4666     if gdal support isn't available and report this to the runner.
4667    
4668 bh 1553 2003-08-06 Bernhard Herzog <[email protected]>
4669    
4670     Rearrange the renderers a bit, partly in preparation for changes
4671     required for the postgis merge, partly to make it more testable.
4672     Also make the representation of coordinates in Shapes more
4673     consistent.
4674    
4675     * Thuban/UI/renderer.py (MapRenderer): Most of the code/methods in
4676     this class is now in BaseRenderer. This class is now practically
4677     only a specialization of BaseRenderer for rendering to an actual
4678     wx DC.
4679     (ScreenRenderer.draw_shape_layer): Use self.low_level_renderer()
4680     to get the shapetype specific rendering functions.
4681    
4682     * Thuban/UI/baserenderer.py: New file with the basic rendering
4683     logic. The code in this file is completely independend of wx.
4684     (BaseRenderer): Class with the basic rendering logic
4685    
4686     * test/test_baserenderer.py: New. Test cases for BaseRenderer
4687    
4688     * Thuban/UI/view.py (MapCanvas.__init__): New instance variable
4689     error_on_redraw to guard agains endless loops and stack overflows
4690     when there's a bug in the rendering code that raises exceptions.
4691     (MapCanvas.OnIdle, MapCanvas._do_redraw): Split the actual
4692     rendering into a separate method _do_redraw so that error handling
4693     is a bit easier. When an exception occurs, set error_on_redraw to
4694     true. When it's true on entry to OnIdle do nothing and return
4695     immediately.
4696    
4697     * Thuban/Model/data.py (ShapefileStore.Shape): For consistency, a
4698     Shape object will always have the coordinates as a list of list of
4699     coordinate pairs (tuples).
4700     (Shape.compute_bbox): Adapt to new representation.
4701    
4702     * Thuban/UI/viewport.py (ViewPort.find_shape_at)
4703     (ViewPort.LabelShapeAt): Adapt to new coordinate representation in
4704     Shape objects.
4705    
4706     * test/test_shapefilestore.py
4707     (ShapefileStoreTests.assertFloatTuplesEqual)
4708     (ShapefileStoreTests.assertPointListEquals): Rename to
4709     assertPointListEquals and change purpose to checking equality of
4710     the lists returned by Shape.Points().
4711     (TestShapefileStoreArc.test_shape)
4712     (TestShapefileStorePolygon.test_shape)
4713     (TestShapefileStorePoint.test_shape): Use the new
4714     assertPointListEquals instead of assertFloatTuplesEqual
4715    
4716     * test/test_layer.py (TestLayer.assertFloatTuplesEqual)
4717     (TestLayer.assertPointListEquals): Rename to assertPointListEquals
4718     and change purpose to checking equality of the lists returned by
4719     Shape.Points().
4720     (TestLayer.test_arc_layer, TestLayer.test_arc_layer)
4721     (TestLayer.test_polygon_layer, TestLayer.test_point_layer)
4722     (TestLayer.test_derived_store): Use the new assertPointListEquals
4723     instead of assertFloatTuplesEqual
4724    
4725     * test/test_derivedshapestore.py
4726     (TestDerivedShapeStore.assertFloatTuplesEqual)
4727     (TestDerivedShapeStore.assertPointListEquals): Rename to
4728     assertPointListEquals and change purpose to checking equality of
4729     the lists returned by Shape.Points().
4730     (TestDerivedShapeStore.test_shape): Use the new
4731     assertPointListEquals instead of assertFloatTuplesEqual
4732    
4733 jan 1550 2003-08-06 Jan-Oliver Wagner <[email protected]>
4734    
4735     * Thuban/UI/projdialog.py (UTMPanel._OnPropose): Added test for
4736     a bounding box. A dialog is raised in case, no bounding box
4737     is found. This fixes bug #2043:
4738     https://intevation.de/rt/webrt?serial_num=2043
4739    
4740 bh 1548 2003-08-05 Bernhard Herzog <[email protected]>
4741    
4742     * Thuban/Model/color.py (Color.__repr__): Make the repr of a color
4743     object look like a Color instantiation. Formerly it looked like a
4744     tuple.
4745    
4746     * test/test_color.py (TestColor.test_repr)
4747     (TestColor.test_equality, TestColor.test_inequality): New. test
4748     some more apects of the Color class
4749     (TestTransparent.test_repr, TestTransparent.test_hex)
4750     (TestTransparent.test_equality): New. Test cases for the
4751     Transparent object.
4752    
4753 jan 1545 2003-08-04 Jan-Oliver Wagner <[email protected]>
4754    
4755     * Doc/manual/thuban-manual.xml: a number of small improvements.
4756     The resulting file is the version submitted for GREAT-ER II.
4757    
4758 bh 1540 2003-08-01 Bernhard Herzog <[email protected]>
4759    
4760 bh 1543 * Thuban/UI/resource.py, Thuban/UI/projdialog.py,
4761     Thuban/UI/join.py, Thuban/UI/classgen.py, Thuban/UI/about.py,
4762     Thuban/Model/resource.py: Insert cvs keywords and doc-strings.
4763    
4764     * Thuban/UI/common.py: Insert cvs keywords and doc-strings.
4765     (Color2wxColour, wxColour2Color, ThubanBeginBusyCursor)
4766     (ThubanEndBusyCursor): Add doc-strings
4767    
4768     2003-08-01 Bernhard Herzog <[email protected]>
4769    
4770 bh 1540 First step towards PostGIS integration. More abstraction by movin
4771     more code from the layer to the shapestore. More methods of the
4772     layer are now simply delegated to the equivalent method of the
4773     shapestore. The SHAPETYPE_* constants are now in data not in
4774     layer.
4775    
4776     * Thuban/Model/data.py (SHAPETYPE_POLYGON, SHAPETYPE_ARC)
4777     (SHAPETYPE_POINT, Shape): Move these constants and classes from
4778     layer.py to data.py
4779     (ShapefileStore.__init__): More Initialization for the new methods
4780     and functionality.
4781     (ShapefileStore.ShapeType, ShapefileStore.NumShapes)
4782     (ShapefileStore.BoundingBox, ShapefileStore.ShapesInRegion)
4783     (ShapefileStore.Shape): New methods that were formerly implemented
4784     in the layer.
4785     (DerivedShapeStore.Shape, DerivedShapeStore.ShapesInRegion)
4786     (DerivedShapeStore.ShapeType, DerivedShapeStore.NumShapes)
4787     (DerivedShapeStore.BoundingBox): New. DerivedShapeStore
4788     equivalents of the new shape methods. These versions are simply
4789     delegated to the original shapstore.
4790    
4791     * Thuban/Model/layer.py (SHAPETYPE_POLYGON, SHAPETYPE_ARC)
4792     (SHAPETYPE_POINT, Shape): Removed. They're now in data.py
4793     (Layer.SetShapeStore): Removed the initializatin of instance
4794     variables that were needed for the stuff that's now in
4795     ShapefileStore
4796     (Layer.BoundingBox, Layer.NumShapes, Layer.ShapeType)
4797     (Layer.Shape, Layer.ShapesInRegion): Simply delegate to the
4798     shapestore.
4799    
4800     * Thuban/UI/classifier.py, Thuban/UI/renderer.py,
4801     Thuban/UI/viewport.py: Import the SHAPETYPE_* constants from data
4802     instead of layer.
4803    
4804     * test/test_shapefilestore.py: New. Tests for ShapefileStore.
4805    
4806     * test/test_derivedshapestore.py: New. Tests for DerivedShapeStore.
4807    
4808     * test/test_layer.py: Import the SHAPETYPE_* constants from data
4809     instead of layer.
4810     (TestLayer.test_derived_store): Remove the test for the exception
4811     when instantiating the DerivedShapeStore with an incompatible
4812     table which is now in test_derivedshapestore.py. Add some more
4813     tests of the layer methods to determine whether they work for a
4814     DerivedShapeStore as well.
4815    
4816 jonathan 1534 2003-07-31 Jonathan Coles <[email protected]>
4817    
4818     * Doc/manual/thuban-manual.xml: Fix the list of required packages
4819     by just listing the name and where they can be found.
4820    
4821 frank 1532 2003-07-31 Frank Koormann <[email protected]>
4822    
4823     * Doc/manual/thuban-manual.xml:
4824     Changed the screenshot elements to figure.
4825     Changed some variablelist elements to itemizedlist.
4826     Added section on GDAL formats.
4827    
4828 jonathan 1531 2003-07-31 Jonathan Coles <[email protected]>
4829    
4830     * Doc/manual/thuban-manual.xml: Added a few sentences about
4831     the Fix Border Color option when generating classes.
4832    
4833 jonathan 1529 2003-07-30 Jonathan Coles <[email protected]>
4834    
4835     * Thuban/Model/classgen.py: Add docstrings. Rename specific
4836     Ramp instances to use lower_case_style.
4837    
4838     * Thuban/UI/classgen.py: Use renamed Ramp instances.
4839    
4840     * Thuban/UI/classifier.py: Add docstrings.
4841    
4842     * Thuban/UI/dock.py: Add docstrings.
4843    
4844     * test/test_classgen.py: Use renamed Ramp instances.
4845    
4846 bh 1522 2003-07-30 Bernhard Herzog <[email protected]>
4847    
4848 bh 1524 * Thuban/Lib/connector.py (QueueingPublisher): Removed. This class
4849     was never used in Thuban.
4850    
4851     2003-07-30 Bernhard Herzog <[email protected]>
4852    
4853 bh 1522 * Thuban/UI/join.py (JoinDialog.__init__): Use the table's Title()
4854     method directly instead of going through the transient_table
4855     method. This faster because transient_table may force the copy of
4856     a DBF file into the transient database and setting a table's title
4857     doesnm't affect the title of the associated transient table, so
4858     this fixes RT #2042
4859    
4860     * Thuban/UI/main.py (__version__): Don't import the already
4861     removed show_exception_dialog.
4862    
4863 jonathan 1517 2003-07-29 Jonathan Coles <[email protected]>
4864    
4865 jonathan 1519 * Thuban/UI/application.py (ThubanApplication.ShowExceptionDialog):
4866     Put back this method and remove the equivalent function since we
4867     are setting the exception hook from within this class (OnInit).
4868    
4869     2003-07-29 Jonathan Coles <[email protected]>
4870    
4871 jonathan 1517 * Doc/manual/images/5_2_custom_ramp.png,
4872     Doc/manual/images/5_2_quantiles.png,
4873     Doc/manual/images/5_2_uniform_dist.png,
4874     Doc/manual/images/5_2_unique_values.png,
4875     Doc/manual/images/8_int_error.png: New screen shots.
4876    
4877     * Doc/manual/thuban-manual.xml: Fixed typos and wording, clarified
4878     some points, and added more screen shots.
4879    
4880 bh 1512 2003-07-29 Bernhard Herzog <[email protected]>
4881    
4882 bh 1516 * Thuban/Model/data.py: Remove the now unused import of warnings
4883    
4884     2003-07-29 Bernhard Herzog <[email protected]>
4885    
4886 bh 1514 * Thuban/Model/data.py (SimpleStore): Removed. This class has been
4887     deprecated since before the 0.8 release and isn't used in Thuban
4888     itself anymore.
4889    
4890 bh 1512 * Thuban/Model/transientdb.py: Remove some unnecessary imports
4891    
4892 jonathan 1503 2003-07-29 Jonathan Coles <[email protected]>
4893 jonathan 1506
4894     * Thuban/UI/application.py (ThubanApplication.OnInit): set the
4895     python exception hook here so that we are sure to catch any
4896     Thuban exception that happen during initialization.
4897    
4898     * Thuban/UI/main.py (main): Don't set the exception hook here,
4899     it will get set in ThubanApplication.OnInit.
4900    
4901     2003-07-29 Jonathan Coles <[email protected]>
4902 jonathan 1503
4903     * Thuban/UI/application.py (ThubanApplication.ShowExceptionDialog):
4904     Removed and called it show_exception_dialog() so that the exception
4905     handler can be set before the class is created.
4906    
4907     * Thuban/UI/main.py (main): Install the exception handler before
4908     a ThubanApplication is created.
4909    
4910 bh 1500 2003-07-29 Bernhard Herzog <[email protected]>
4911    
4912     * po/it.po: New. Italian translation by Maurizio Napolitano
4913    
4914     * po/ru.po: New. Russian translation by Alex Shevlakov
4915    
4916 frank 1497 2003-07-29 Frank Koormann <[email protected]>
4917    
4918 frank 1508 * Doc/manual/thuban-manual.xml: Extended section on supported
4919     projections.
4920    
4921     2003-07-29 Frank Koormann <[email protected]>
4922    
4923 frank 1497 * Doc/manual/thuban-manual.xml: gaspell-checked.
4924    
4925 jonathan 1493 2003-07-29 Jonathan Coles <[email protected]>
4926    
4927 jonathan 1495 * Doc/manual/images/3_5_legend.png: Added border to improve look
4928     on white background.
4929    
4930     2003-07-29 Jonathan Coles <[email protected]>
4931    
4932 jonathan 1493 * Doc/manual/thuban-manual.xml: Fixed grammar and typos. Added
4933     descriptions for the legend toolbar.
4934    
4935     * Doc/manual/images/4_2_raster_layer_properties.png: Removed
4936     cursor from dialog box.
4937    
4938     2003-07-28 Jonathan Coles <[email protected]>
4939    
4940     * Doc/manual/thuban-manual.xml: More screenshots and more chapters.
4941    
4942     * Doc/manual/images/2_4_session_tree.png,
4943     Doc/manual/images/3_5_legend.png, Doc/manual/images/3_rename_map.png,
4944     Doc/manual/images/4_2_layer_properties.png,
4945     Doc/manual/images/4_2_raster_layer_properties.png,
4946     Doc/manual/images/5_3_genclass.png,
4947     Doc/manual/images/5_classification.png,
4948     Doc/manual/images/6_projection.png,
4949     Doc/manual/images/7_1_table_view.png,
4950     Doc/manual/images/7_2_5_join.png: New screenshots.
4951    
4952     2003-07-24 Jonathan Coles <[email protected]>
4953    
4954     * Doc/manual/thuban-manual.xml: Chapter on Projection Management.
4955    
4956     2003-07-24 Jonathan Coles <[email protected]>
4957    
4958     * Doc/manual/thuban-manual.xml: Added EPS images and wrote
4959     chapter on Layer Management.
4960    
4961     * Doc/manual/Makefile: New. Makefile to generate all formats for the
4962     manual and images.
4963    
4964 bh 1483 2003-07-24 Bernhard Herzog <[email protected]>
4965    
4966     * Thuban/Model/range.py, Thuban/version.py: Remove the #! line as
4967     it annoys lintian which warns about these files not being
4968 jan 1767 executable. The #! isn't necessary here since if you absolutely
4969 bh 1483 must execute them you can always say "python <filename>".
4970    
4971     * Thuban/UI/renderer.py (ScreenRenderer.draw_shape_layer): Remove
4972     superfluous code to set brush and pen for point shapes
4973    
4974     * Thuban/UI/viewport.py: Remove commented out code that wouldn't
4975     belong in viewport anyway
4976    
4977 frank 1479 2003-07-24 Frank Koormann <[email protected]>
4978    
4979     * Doc/manual/thuban-manual.xml: Added section on table management.
4980    
4981 bh 1477 2003-07-24 Bernhard Herzog <[email protected]>
4982    
4983     * test/runtests.py (main): Recognize the long "verbose" option
4984     correctly.
4985    
4986 jonathan 1470 2003-07-22 Jonathan Coles <[email protected]>
4987    
4988     * Doc/manual/thuban-manual.xml: Continue to write first revision
4989     of the manual.
4990    
4991     * Thuban/UI/renderer.py (MapRenderer.render_map): Wrap method
4992     with Begin/EndDrawing() calls to ensure we aren't doing to
4993     many updates to the dc during rendering.
4994     (ScreenRenderer.draw_shape_layer): self.draw_point_shape takes
4995     a pen and brush argument so they need to be passed to the function.
4996    
4997     * Thuban/UI/viewport.py (ViewPort.calc_min_max_scales): New.
4998     Calculates the minimum and maximum scale values. Factored out
4999     of set_view_transform so that it could be used to zoom all the
5000     way into a single point.
5001     (ViewPort.set_view_transform): Call calc_min_max_scales().
5002     (ViewPort.FitSelectedToWindow): Zoom to the maximum scale
5003     if only a single point is selected.
5004    
5005     * Doc/manual/images/1_2_legend_close.png,
5006     Doc/manual/images/1_2_legend_dock.png,
5007     Doc/manual/images/1_2_mainwindow.png,
5008     Doc/manual/images/1_2_mainwindow.ps,
5009     Doc/manual/images/1_2_mainwindow.sk,
5010     Doc/manual/images/3_2_fullextent.png,
5011     Doc/manual/images/3_2_fulllayerextent.png,
5012     Doc/manual/images/3_2_fullshapeextent.png,
5013     Doc/manual/images/3_2_pan.png,
5014     Doc/manual/images/3_2_zoomin.png,
5015     Doc/manual/images/3_2_zoomout.png,
5016     Doc/manual/images/3_3_identify.png,
5017     Doc/manual/images/3_3_label.png,
5018     Doc/manual/images/3_5_invisible.png,
5019     Doc/manual/images/3_5_movedown.png,
5020     Doc/manual/images/3_5_moveup.png,
5021     Doc/manual/images/3_5_props.png,
5022     Doc/manual/images/3_5_tobottom.png,
5023     Doc/manual/images/3_5_totop.png,
5024     Doc/manual/images/3_5_visible.png: New. Images for the documentation.
5025    
5026 bh 1451 2003-07-18 Bernhard Herzog <[email protected]>
5027    
5028 bh 1465 * Thuban/UI/messages.py (MAP_REPLACED): New message.
5029    
5030     * Thuban/UI/viewport.py (ViewPort.SetMap): Issue MAP_REPLACED
5031     after the new map has been assigned
5032    
5033     * Thuban/UI/mainwindow.py (MainWindow.delegated_messages):
5034     Delegate MAP_REPLACED to the canvas too
5035     (MainWindow.prepare_new_session): Removed. Thanks to the new
5036     MAP_REPLACED message it's no longer needed
5037     (MainWindow.OpenSession, MainWindow.NewSession):
5038     prepare_new_session has been removed.
5039    
5040     * Thuban/UI/classifier.py (Classifier.__init__): Subscribe to
5041     MAP_REPLACED so that we can close the dialog if a new map is set.
5042     (Classifier.unsubscribe_messages): Unsubscribe from MAP_REPLACED
5043     (Classifier.map_replaced): Handle MAP_REPLACED by closing the
5044     dialog
5045    
5046     * test/test_viewport.py (SimpleViewPortTest)
5047     (SimpleViewPortTest.test_default_size): Add doc-strings
5048     (ViewPortTest.setUp): Bind map to self.map so we can use it in
5049     tests. Subscribe to MAP_REPLACED messages too.
5050     (ViewPortTest.tearDown): No need to explicitly unsubscribe
5051     (ViewPortTest.test_set_map): New test for the SetMap method.
5052    
5053     2003-07-18 Bernhard Herzog <[email protected]>
5054    
5055 bh 1463 * test/test_viewport.py (SimpleViewPortTest.test_default_size):
5056     Move this test from ViewPortTest.setUp to this new separate test
5057     case. setUp is not the place for the actual tests.
5058     (ViewPortTest.test_inital_settings, ViewPortTest.setUp): Move some
5059     more of the test from setUp to the new test test_inital_settings.
5060     (ViewPortTest.test_win_to_proj, ViewPortTest.test_proj_to_win)
5061     (ViewPortTest.test_proj_conv): Split test_proj_conv into
5062     test_win_to_proj and test_proj_to_win and make the tests easier to
5063     understand
5064     (ViewPortTest.testFitRectToWindow, ViewPortTest.testZoomFactor)
5065     (ViewPortTest.testZoomOutToRect, ViewPortTest.testTranslate)
5066     (ViewPortTest.test_unprojected_rect_around_point)
5067     (ViewPortTest.test_find_shape_at, ViewPortTest.testTools):
5068     Reformat to increase readability.
5069    
5070     2003-07-18 Bernhard Herzog <[email protected]>
5071    
5072 bh 1461 * Thuban/UI/view.py (MapCanvas.OnLeftDown): Capture the mouse.
5073    
5074     2003-07-18 Bernhard Herzog <[email protected]>
5075    
5076 bh 1459 * test/runtests.py: The test suite can now be run without an X
5077     connection. To make sure this remains true, remove the DISPLAY
5078     environment variable so that an error occurs if the wxGTK is
5079     imported accidentally
5080    
5081     2003-07-18 Bernhard Herzog <[email protected]>
5082    
5083 bh 1457 * Thuban/UI/viewport.py: Remove unused imports
5084    
5085     * Thuban/UI/view.py: Remove unused imports
5086    
5087     2003-07-18 Bernhard Herzog <[email protected]>
5088    
5089 bh 1455 * test/test_export.py Remove unused imports. The OutputTransform
5090     function is now in viewport.py and is called output_transform
5091     (TestScalebar.test_output_transform)
5092     (TestScalebar.test_OutputTransform): Renamed to
5093     test_output_transform and updated to use output_transform instead
5094     of OutputTransform
5095    
5096     * Thuban/UI/view.py (OutputTransform): Moved to viewport.py and
5097     renamed.
5098     (MapCanvas.Export, MapPrintout.draw_on_dc): OutputTransform was
5099     renamed to output_transform
5100    
5101     * Thuban/UI/viewport.py (OutputTransform, output_transform):
5102     Rename to output_transform
5103    
5104     2003-07-18 Bernhard Herzog <[email protected]>
5105    
5106 bh 1453 * Thuban/Model/layer.py (Layer.__init__): Rename
5107     classificationField to classificatin_column and init it here so
5108     that it can be used in SetClassificationColumn
5109     (Layer.GetClassificationColumn, Layer.GetClassificationField):
5110     Rename to GetClassificationColumn.
5111     (Layer.SetClassificationColumn, Layer.SetClassificationField):
5112     Rename to SetClassificationColumn and issue a LAYER_CHANGED
5113     message if the column changes.
5114     (Layer._classification_changed, Layer.ClassChanged): Rename to
5115     _classification_changed. Update the callers.
5116     (Layer.SetShapeStore): Further field->column renames.
5117    
5118     * Thuban/Model/load.py (SessionLoader.start_classification)
5119     (SessionLoader.start_clpoint): Updates because of
5120     field->column method name changes in the Layer class
5121    
5122     * Thuban/Model/save.py (SessionSaver.write_classification): Updates
5123     because of field->column method name changes in the Layer class
5124    
5125     * Thuban/UI/classifier.py (Classifier.__init__)
5126     (Classifier._OnTry, Classifier._OnRevert): Updates because of
5127     field->column method name changes in the Layer class
5128    
5129     * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Updates
5130     because of field->column method name changes in the Layer class
5131    
5132     * Thuban/UI/viewport.py (ViewPort.find_shape_at): Updates because
5133     of field->column method name changes in the Layer class
5134    
5135     * test/test_save.py (SaveSessionTest.testClassifiedLayer)
5136     (SaveSessionTest.testClassifiedLayer): Update because of
5137     field->column method name changes in the Layer class
5138    
5139     * test/test_layer.py (SetShapeStoreTests.setUp)
5140     (SetShapeStoreTests.test_sanity): Update because of field->column
5141     method name changes in the Layer class
5142     (TestLayerModification.setUp): Subscribe to LAYER_CHANGED as well
5143     (TestLayerModification.test_sanity)
5144     (TestLayerModification.test_initial_settings): remove unsued code
5145     and rename to test_sanity.
5146     (TestLayerModification.test_set_classification): New test for
5147     SetClassification and SetClassificationField.
5148    
5149     2003-07-18 Bernhard Herzog <[email protected]>
5150    
5151 bh 1451 * test/test_classgen.py (TestFixedRamp.test): Extend test to check
5152     the non-fixed values as well. The old test would have accepted a
5153     fixed ramp that only returnes the fixed properties
5154    
5155 jonathan 1449 2003-07-17 Jonathan Coles <[email protected]>
5156    
5157     * Doc/manual/mainwindow.png, Doc/manual/mainwindow.xcf: Screen
5158     shots for the manual. The XCF file is the source image and
5159     has additional layers to support changes.
5160    
5161     * Doc/manual/thuban-manual.xml: Wrote an initial Introduction.
5162    
5163     * Thuban/UI/classifier.py (Classifier.__BuildClassification):
5164     Return both the new class and the field name.
5165    
5166     * Thuban/UI/mainwindow.py (MainWindow.ToggleLegend): Don't
5167     fit the map to the window as this changes any zoom level that
5168     the user may have set.
5169    
5170 jonathan 1442 2003-07-16 Jonathan Coles <[email protected]>
5171    
5172     * Thuban/Model/classgen.py (generate_singletons,
5173     generate_uniform_distribution, generate_quantiles): Remove
5174     fixes parameter, but maintain the same functionality by having
5175     the calling function pass a FixedRamp object for the ramp.
5176     (FixedRamp): New. Adapts a ramp to have fixed property values.
5177    
5178     * Thuban/Model/classification.py: Use new CLASS_CHANGED message.
5179     (Classification): Inherit from Publisher.
5180     (Classification.__init__): Remove the layer parameter.
5181     Classifications no longer need to have a parent layer.
5182     (Classification.GetField, Classification.GetFieldType,
5183     Classification.SetFieldInfo): Removed. The field name is stored
5184     in the layer, and the type can be retreived by calling
5185     Layer.GetFieldType().
5186     (Classification._set_layer, Classification.GetLayer): Removed.
5187     Classifications no longer have a parent layer.
5188    
5189     * Thuban/Model/layer.py (Layer.Destroy): Unsubscribe from the
5190     classification.
5191     (Layer.SetShapeStore): Reset the classification first while
5192     we still have the old shape store to work with.
5193     (Layer.GetClassificationField, Layer.SetClassificationField):
5194     New. Method for getting/setting the field to classify on.
5195     (Layer.SetClassification): Simplified now that the layer
5196     simply has to hold a reference to the classification and not
5197     tell the classification who owns it.
5198     Fixes RTbug #2023.
5199    
5200     * Thuban/Model/load.py (SessionLoader.start_classification):
5201     Set the field name on the layer, not the classification.
5202    
5203     * Thuban/Model/messages.py: Add CLASS_CHANGED for when a
5204     classification is modified.
5205    
5206     * Thuban/Model/save.py (SessionSaver.write_classification):
5207     Get the field name and type from the layer.
5208    
5209     * Thuban/Model/table.py (table_to_dbf, table_to_csv): Renamed
5210     parameter records to rows and add docstring. Fixes RTbug #1997.
5211    
5212     * Thuban/UI/classgen.py (ClassGenDialog.OnOK): Use a fixed
5213     ramp when we need to fix certain values of a ramp rather than
5214     using the old fixes parameter. Fixes RTbug #2024.
5215    
5216     * Thuban/UI/classifier.py (ClassGrid.CreateTable): Add fieldType
5217     parameter.
5218     (ClassTable.Reset): Add fieldType parameter and use it, rather
5219     than asking the classification.
5220     (Classifier.__init__): Remember the original class's field
5221     and ask the layer for the field type, rather than the classification.
5222     (Classifier.__SetGridTable): Retrieve the field and field type
5223     for the table because they are not in the classification.
5224     (Classifier._OnTry, Classifier._OnRevert): Set the classification
5225     field on the layer in addition to the classification itself.
5226    
5227     * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Get the
5228     classification field from layer.
5229    
5230     * Thuban/UI/viewport.py (ViewPort.find_shape_at): Get the
5231     classification field from layer. Split up tests and remove
5232     *-imports. Fixes RTbug #1992.
5233    
5234     * test/test_classgen.py (TestFixedRamp): Test for the FixedRamp class.
5235    
5236     * test/test_classification.py
5237     (TestClassification.test_classification): Remove tests for methods
5238     that no longer exist.
5239    
5240     * test/test_layer.py (SetShapeStoreTests.setUp): Classification
5241     __init__ no longer has a field parameter, use SetClassificationField.
5242     (SetShapeStoreTests.test_sanity): Use layer object to get class
5243     field info.
5244    
5245     * test/test_save.py (SaveSessionTest.testClassifiedLayer): Use
5246     SetClassificationField on layer to set class field info.
5247    
5248     * test/test_viewport.py: Renamed from test/test_view.py.
5249    
5250 jan 1424 2003-07-16 Jan-Oliver Wagner <[email protected]>
5251    
5252     * Doc/manual/thuban-manual.xml: Added authors and an initial
5253     coarse structure.
5254    
5255 bh 1418 2003-07-15 Bernhard Herzog <[email protected]>
5256    
5257 bh 1422 * test/support.py (FloatComparisonMixin): This is a mix-in class
5258     and therefore should not be derived from any other class.
5259    
5260     * test/test_range.py (RangeTest): FloatComparisonMixin is a
5261     mix-in, so derive from TestCase as well.
5262    
5263     2003-07-15 Bernhard Herzog <[email protected]>
5264    
5265 bh 1420 * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Rework the
5266     draw_func handling a bit to remove one layer of indirection. This
5267     makes the renderer about 10% faster in the non-classifying case
5268     and the code a bit cleaner
5269     (MapRenderer.draw_point_shape): Add the pen and brush parameters
5270     and set them in the dc. Now the draw_point_shape method and
5271     wxproj's draw_polygon_shape function have basically the same
5272     signature so that both can be directly used as draw_func
5273    
5274     2003-07-15 Bernhard Herzog <[email protected]>
5275    
5276 bh 1418 * Thuban/Model/save.py (SessionSaver.write_classification): Encode
5277     string values (in addition to the labels) as UTF 8
5278    
5279     * Thuban/Model/load.py (SessionLoader.start_clpoint): Decode the
5280     values if the field type is string
5281    
5282     * test/test_save.py (SaveSessionTest.testClassifiedLayer): Test
5283     saving a session with non-ascii string classification values.
5284    
5285     * test/test_load.py (TestClassification.file_contents)
5286     (TestClassification.test): Check for non-ascii values in string
5287     classifications
5288    
5289 jonathan 1416 2003-07-14 Jonathan Coles <[email protected]>
5290    
5291     * test/test_view.py: New. Tests for ViewPort.
5292    
5293 frank 1409 2003-07-14 Frank Koormann <[email protected]>
5294    
5295     * Thuban/Model/load.py (SessionLoader.start_map): Encode map
5296     title to latin1. Fixes https://intevation.de/rt/webrt?serial_num=2013
5297    
5298 frank 1411 * test/test_load_0_8.py (TestUnicodeStrings): New, test load of
5299     unicode strings from session file: session title, map title and
5300     projection name.
5301    
5302 jonathan 1403 2003-07-10 Jonathan Coles <[email protected]>
5303    
5304 jonathan 1406 * Thuban/UI/viewport.py (Tool.MouseUp): Should have called
5305     drag_stop, not drag_move when the mouse is released.
5306    
5307     2003-07-10 Jonathan Coles <[email protected]>
5308    
5309 jonathan 1403 The most important part of this is the seperation of view.py into
5310     two pieces. viewport.py now has a class called ViewPort which
5311     contains all the non-wx parts of view.py and can therefore be
5312     tested. view.py contains only the wx-specific parts and is fairly
5313     simple.
5314    
5315     * Thuban/UI/view.py: Stripped out all non-wx functionality. Fixes
5316     RTTbug #1992.
5317     * Thuban/UI/viewport.py: New. Contains non-wx view functionality.
5318     RTTbug #1992.
5319    
5320     * Thuban/Model/classgen.py (generate_singletons,
5321     generate_uniform_distribution, generate_quantiles):
5322     Added 'fixes' parameter so that property attributes can
5323     be held constant over the generated classification groups.
5324     (CustomRamp.GetProperties): Remove unused variables.
5325    
5326     * Thuban/Model/map.py (Map.SetProjection): Send the old
5327     projection as an argument to listeners of the MAP_PROJECTION_CHANGED
5328     event.
5329    
5330     * Thuban/Model/table.py (table_to_dbf, table_to_csv): Added 'records'
5331     parameter which is a list of records that restricts which
5332     records are saved. Fixes RTbug #1997.
5333    
5334     * Thuban/UI/application.py (ThubanApplication.ShowExceptionDialog):
5335     Port exception dialog from GREAT-ER. Fixes RTbug #1993.
5336    
5337     * Thuban/UI/classgen.py (ClassGenDialog.__init__): Add controls
5338     to allow the user to fix line color/width on generated groups.
5339     (ClassGenDialog.OnOK): Use new 'fixes' parameter of the generate_*
5340     functions to optionally fix group properties.
5341    
5342     * Thuban/UI/main.py (main): Set exception hook to the
5343     ShowExceptionDialog. Fixes RTbug #1993.
5344    
5345     * Thuban/UI/mainwindow.py (MainWindow.ShowTableView): Raise
5346     the table window when it is selectd to be shown.
5347    
5348     * Thuban/UI/tableview.py (QueryTableFrame.__init__): Add an
5349     Export Selection button and move the export buttons underneath
5350     the table.
5351     (QueryTableFrame.UpdateStatusText): Added event argument so
5352     that it can respond to grid selection events. The status text
5353     is now updated even when the table is not associated with a
5354     layer as was previously assumed.
5355     (QueryTableFrame.OnGridSelectRange, OnGridSelectCell): Removed.
5356     UpdateStatusText responds to these events.
5357     (QueryTableFrame.OnSaveAs): Renamed to doExport.
5358     (QueryTableFrame.doExport): Helper function that saves the
5359     entire table, or selected rows, to a file.
5360     (QueryTableFrame.OnExport, QueryTableFrame.OnExportSel): New.
5361     Respond to export button events and call doExport.
5362    
5363     * extensions/thuban/gdalwarp.cpp (ProjectRasterFile): Make sure
5364     the function doesn't return NULL without first setting a Python
5365     Error.
5366    
5367     * test/runtests.py (main): Only print "Unknown option" for
5368     unsupported options.
5369    
5370     * test/support.py (FloatComparisonMixin.assertFloatEqual): Take
5371     optional epsilon argument to specify floating point accuracy.
5372     (FloatComparisonMixin.assertFloatSeqEqual): Call assertFloatEqual
5373     for each item test.
5374    
5375     * test/test_csv_table.py (TestCSVTable.test_table_to_cvs): Add
5376     tests for saving selected records.
5377    
5378     * test/test_dbf_table.py (TestTableToDBF.test_table_to_dbf): Add
5379     tests for saving selected records.
5380    
5381     * test/test_map.py (TestMapWithContents.test_set_projection):
5382     MAP_PROJECTION_CHANGED events send the old projection.
5383    
5384     * test/test_session.py
5385     (TestSessionWithContent.test_forward_map_projection):
5386     MAP_PROJECTION_CHANGED events send the old projection.
5387    
5388     * test/test_table.py (TableTest): Update tests to use non-deprecated
5389     functions.
5390    
5391 bh 1376 2003-07-08 Bernhard Herzog <[email protected]>
5392    
5393 bh 1382 * Thuban/Model/transientdb.py (TransientTableBase.Width): The type
5394     constants in the column objects are the standard ones defined in
5395     the table module.
5396    
5397     * test/test_transientdb.py
5398     (TestTransientTable.test_transienttable_to_dbf): New. Test whether
5399     exporting transient tables as DBF works. This should catch the bug
5400     just fixed in TransientTableBase.Width.
5401    
5402     2003-07-08 Bernhard Herzog <[email protected]>
5403    
5404 bh 1380 * Thuban/Model/classgen.py (CustomRamp.GetProperties): Compute the
5405     interpolated colors correctly.
5406    
5407     * test/test_classgen.py (TestCustomRamp.test_color_interpolation):
5408     New. Test case for the fix in classgen.py
5409    
5410     2003-07-08 Bernhard Herzog <[email protected]>
5411    
5412 bh 1378 * test/runtests.py (main): Make the default output less verbose
5413     and add a verbosity option (-v) to get the old output
5414    
5415     2003-07-08 Bernhard Herzog <[email protected]>
5416    
5417 bh 1376 * Resources/XML/thuban-0.9.dtd: New. This will become the DTD for
5418     0.9.
5419    
5420     * Thuban/Model/transientdb.py (TransientJoinedTable.JoinType):
5421     New. Return the join type
5422    
5423     * Thuban/Model/save.py (SessionSaver.write_session): Use new 0.9
5424     DTD
5425     (SessionSaver.write_data_containers): Save the join type for
5426     joined tables
5427    
5428     * Thuban/Model/load.py (SessionLoader.__init__): Add the new 0.9
5429     namespace
5430     (SessionLoader.start_jointable): Handle the jointype attribute
5431    
5432     * test/test_load_0_8.py: New. Effectively a copy of test_load.py
5433     as of Thuban 0.8. These are now tests to determine whether Thuban
5434     can still read files generated by Thuban 0.8
5435    
5436     * test/test_load.py (LoadSessionTest.dtd)
5437     (TestSingleLayer.file_contents)
5438     (TestLayerVisibility.file_contents, TestLabels.file_contents)
5439     (TestLayerProjection.file_contents)
5440     (TestRasterLayer.file_contents, TestJoinedTable.file_contents)
5441     (TestJoinedTable.file_contents)
5442     (TestLoadError.file_contents): Update for new DTD
5443     (TestJoinedTable.file_contents, TestJoinedTable.setUp): Add test
5444     for new join type attribute
5445    
5446     * test/test_save.py (SaveSessionTest.dtd)
5447     (SaveSessionTest.testEmptySession)
5448     (SaveSessionTest.testSingleLayer)
5449     (SaveSessionTest.testLayerProjection)
5450     (SaveSessionTest.testRasterLayer)
5451     (SaveSessionTest.testClassifiedLayer)
5452     (SaveSessionTest.test_dbf_table)
5453     (SaveSessionTest.test_joined_table): Update for new DTD
5454     (SaveSessionTest.test_joined_table): Add test for new join type
5455     attribute
5456    
5457 bh 1372 2003-07-04 Bernhard Herzog <[email protected]>
5458    
5459     * Thuban/Model/table.py (_find_dbf_column_names): New. Helper
5460     function for table_to_dbf
5461     (table_to_dbf): Deal with names longer than the 10 character limit
5462    
5463     * test/test_dbf_table.py (TestTableToDBF.test_table_to_dbf): Add
5464     doc-string
5465     (TestTableToDBF.test_table_to_dbf_long_col_names): New test for
5466     long column names
5467    
5468 bh 1365 2003-07-03 Bernhard Herzog <[email protected]>
5469    
5470 bh 1370 * Doc/manual/thuban-manual.xml: Fix the CVS Revision Tag syntax
5471    
5472     2003-07-03 Bernhard Herzog <[email protected]>
5473    
5474 bh 1368 * Doc/manual/thuban-manual.xml, Doc/manual/README: New. Skeleton
5475     for the Thuban manual and README with some basic information about
5476     the manual
5477    
5478     2003-07-03 Bernhard Herzog <[email protected]>
5479    
5480 bh 1365 * Thuban/Model/transientdb.py (TransientJoinedTable.__init__):
5481     Update doc-string
5482     (TransientJoinedTable.create): Do not modify the column objects of
5483     the input tables in place and copy all columns of the input tables
5484     into the joined table after all.
5485    
5486     * test/test_transientdb.py
5487     (TestTransientTable.test_transient_joined_table_same_column_name):
5488     Update to reflect the new behavior
5489     (TestTransientTable.test_transient_joined_table_with_equal_column_names):
5490     Update to reflect the new behavior
5491     (TestTransientTable.test_transient_joined_table_name_collisions_dont_modify_in_place):
5492     New test case for a bug which modified the column objects in place
5493    
5494 jonathan 1360 2003-07-02 Jonathan Coles <[email protected]>
5495 jonathan 1349
5496 jonathan 1360 * Thuban/Model/classgen.py (generate_singletons,
5497     generate_uniform_distribution, generate_quantiles,
5498 jonathan 1363 GenQuantiles0): Make sure maxValue isn't less than
5499     one, otherwise we could divide by zero.
5500    
5501     * test/test_classgen.py (ClassGenTest.doClassRangeTest,
5502     ClassGenTest.doClassSingleTest): Call doBoundsTest to
5503     check the end classification groups against the
5504     proper property values.
5505     (ClassGenTest.doBoundsTest): New. Checks the first and
5506     last classification groups to make sure their properties
5507     are the correct upper and lower bounds for a color ramp.
5508    
5509     2003-07-02 Jonathan Coles <[email protected]>
5510    
5511     * Thuban/Model/classgen.py (generate_singletons,
5512     generate_uniform_distribution, generate_quantiles,
5513 jonathan 1360 GenQuantiles0): The denominator was one to high when
5514     calculating the index for the ramp causing the index
5515     to never to reach one.
5516    
5517     2003-07-02 Jonathan Coles <[email protected]>
5518    
5519 jonathan 1358 Changed the singature of ClassGroupRange.__init__ and
5520     ClassGroupRange.SetRange() so that the min/max values are
5521     passed as a tuple. This makes a better calling scheme for
5522     when a Range object is passed instead.
5523    
5524     * Thuban/Model/classgen.py: Fixed parameters to
5525     ClassGroupRange constructor.
5526    
5527     * Thuban/Model/classification.py (ClassGroupRange.__init__):
5528     Consolidate the min/max parameters into a single _range which
5529     can either be a tuple or a Range object.
5530     (ClassGroupRange.SetRange): Consolidate the min/max parameters
5531     into a single _range which can either be a tuple or a Range object.
5532    
5533     * Thuban/Model/load.py (SessionLoader.start_clrange): Fix
5534     call to ClassGroupRange constructor to use a tuple.
5535    
5536     * Thuban/Model/layer.py (Layer.SetClassification): Switch
5537     the classification instance variable to the new class
5538     before calling _set_layer otherwise subscribers to a
5539     LAYER_CHANGED event will not see any difference.
5540    
5541     * test/test_classification.py: Fix tests of ClassGroupRange
5542     so that they use the new signature.
5543    
5544     * test/test_load.py: Fix use of ClassGroupRange so that it
5545     uses the new signature.
5546    
5547     * test/test_load_0_2.py: Fix use of ClassGroupRange so that it
5548     uses the new signature.
5549    
5550     * test/test_save.py: Fix use of ClassGroupRange so that it
5551     uses the new signature.
5552    
5553    
5554     2003-07-01 Jonathan Coles <[email protected]>
5555    
5556 jonathan 1349 * Thuban/Model/classgen.py: Fixes RTbug #1972, 1971.
5557     Import used objects/class from color.
5558     (generate_singletons): We don't
5559     need the numGroups parameter anymore because we are using
5560     the new ramps with GetProperties().
5561     (generate_uniform_distribution): Use new ramp method
5562     GetProperties().
5563     (generate_quantiles, GenQuantiles0): Use new ramp method
5564     GetProperties().
5565     (CustomRamp.SetNumGroups): Removed. The ramps now map
5566     a value from 0 to 1 to class properties so the number
5567     of groups is not needed ahead of time.
5568     (CustomRamp.next): Removed. CustomRamp does not support
5569     interation anymore.
5570     (CustomRamp.GetProperties): Returns a ClassGroupProperties
5571     object based on the index value from 0 to 1 that is
5572     passed to it.
5573     (GreyRamp, RedRamp, GreenRamp, BlueRamp, GreenToRedRamp):
5574     Made into instances of Monochromatic class instread of
5575     deriving from it.
5576     (HotToCold.SetNumGroups): Removed. See CustomRamp.
5577     (HotToCold.next): Removed. See CustomRamp.
5578    
5579     * Thuban/Model/classification.py: Fixes RTbug #1973, 1971.
5580     (Classification.SetField, Classification.SetFieldType):
5581     Replaced with SetFieldInfo.
5582     (Classification.SetFieldInfo): New. Does a better job of
5583     what SetField and SetFieldType used to do by combining
5584     their function since they should really always be done
5585     at the same time.
5586     (Classification.SetLayer): Renamed to _set_layer.
5587     (Classification._set_layer): Should only be called from
5588     Layer's SetClassification. This does not cause a recursive
5589     call as SetLayer did because we know that Layer knows about
5590     the classification.
5591    
5592     * Thuban/Model/color.py: Fixes RTbug #1971.
5593     (_Transparent): Renamed from Transparent so it doesn't
5594     conflict with the module variable.
5595     (Transparent, Black): Renamed from Color.Transparent,
5596     Color.Black so they are not class variables.
5597    
5598     * Thuban/Model/layer.py: Fixes RTbug #1971, 1973.
5599     (Layer.Destroy): We don't need to call SetClassification
5600     anymore to clear out the back reference in the classifcation
5601     to the layer. It's better to set it to None using _set_layer,
5602     and we won't be creating another clas object too.
5603     (Layer.SetClassification): Classification._set_layer is not
5604     recursive so remove all the locking variables. Also clean
5605     up the code so that it remains unchanged if something fails.
5606    
5607     * Thuban/Model/load.py: Fixes RTbug #1971.
5608     (SessionLoader.start_classification): Call
5609     Classification.SetFieldInfo().
5610    
5611     * Thuban/Model/save.py: Removed import of Color which wasn't
5612     being used.
5613    
5614     * Thuban/UI/classgen.py: Fixes RTbug #1972.
5615     (ClassGenDialog.__init__): Color ramps are now instances
5616     already so we don't need to create any new objects.
5617     (ClassGenDialog.OnOK): Check for numGroups is no longer
5618     necessary because we never use it.
5619    
5620     * Thuban/UI/classifier.py: Fixes RTbug #1971.
5621     (Classifier.__BuildClassification, Classifier.__SetGridTable):
5622     Call Classification.SetFieldInfo() instead of SetFieldType.
5623    
5624     * Thuban/UI/renderer.py: Fixes RTbug #1971.
5625    
5626     * Thuban/UI/view.py: Fixes RTbug #1974, 1971.
5627     (MapCanvas.__init__): Subscribe to the idle time event. Set
5628     background color to white.
5629     (MapCanvas.OnPaint): Set a flag indicating that we should
5630     render the map during idle time. If we already have a bitmap
5631     just draw it now.
5632     (MapCanvas.OnIdle): New. Render the map only during idle time.
5633     This also fixes a problem with the busy cursor under gtk.
5634    
5635     * test/test_classgen.py (ClassGenTest.test_generate_singletons):
5636     Fix calls to generate_singletons because the signature changed.
5637    
5638     * test/test_classification.py: Fix color references and
5639     change calls to Classification.[SetField|SetFieldType] to
5640     SetFieldInfo.
5641    
5642     * test/test_load.py: Fix color references.
5643    
5644     * test/test_load_0_2.py: Fix color references.
5645    
5646     * test/test_save.py (SaveSessionTest.testClassifiedLayer):
5647     Change calls to Classification.[SetField|SetFieldType] to
5648     SetFieldInfo.
5649    
5650 frank 1334 2003-07-01 Frank Koormann <[email protected]>
5651    
5652     MERGE from the greater-ms3 branch.
5653    
5654     * test/test_transientdb.py
5655     (TestTransientTable.test_transient_joined_table_with_equal_column_names):
5656     New. Test join of two tables with partly equal column names.
5657    
5658     * Thuban/Model/transientdb.py (TransientJoinedTable.create):
5659     If duplicates in left and right tables column names are found,
5660     append '_' (underscores) to the name until it is unique.
5661     Create always new internal names for the resulting table and reference
5662     columns in the join statement with <table>.<column>
5663    
5664 bh 1329 2003-07-01 Bernhard Herzog <[email protected]>
5665    
5666     * test/test_transientdb.py
5667     (TestTransientTable.test_transient_joined_table_same_column_name):
5668     New. Test whether joining on columns with the same names in both
5669     tables works.
5670 frank 1334
5671 bh 1329 * Thuban/Model/transientdb.py (TransientJoinedTable.create): Make
5672     sure to use the right internal names even when joining on field
5673     with the same names in both tables. Also, detect duplicate names
5674     in the joined table correctly.
5675    
5676 frank 1325 2003-07-01 Frank Koormann <[email protected]>
5677    
5678     * Thuban/UI/renderer.py (ExportRenderer.render_legend):
5679     Reverse List of layers to render in same order as in desktop legend.
5680    
5681 jonathan 1318 2003-06-30 Jonathan Coles <[email protected]>
5682    
5683 jonathan 1349 * Thuban/version.py (make_tuple): Takes a version string
5684     and splits it into a tuple of at most three integers.
5685     Used make_tuple() to make tuple versions of the version
5686     numbers.
5687    
5688     * Thuban/UI/about.py: Add Thuban email addresses.
5689    
5690     2003-06-30 Jonathan Coles <[email protected]>
5691    
5692 jonathan 1320 * Thuban/version.py: SQLite/PySQLite version dependencies
5693     were too high.
5694    
5695     2003-06-30 Jonathan Coles <[email protected]>
5696    
5697 jonathan 1318 * Thuban/version.py: Update version to 0.8.1
5698    
5699     * MANIFEST.in: Added Projections so that default.proj is
5700     included.
5701    
5702 jonathan 1312 2003-06-26 Jonathan Coles <[email protected]>
5703    
5704     New About box with lots more information including library
5705     versions and credits. More/better version checking before
5706     Thuban starts.
5707    
5708     * Thuban/UI/about.py: New. New About box that displays
5709     library version information and credits.
5710    
5711     * Thuban/version.py: Added new 'versions' dictionary which
5712     contains the verions of various libraries which are checked
5713     when the module loads.
5714     (verify_versions): Check all version numbers and returns
5715     a list of errors.
5716    
5717     * Thuban/UI/classifier.py (Classifier.__EnableButtons):
5718     Reset the status of the buttons as the situation warrants,
5719     but in a better more reliable way by not relying on the
5720     current status to determine what needs to change.
5721    
5722     * Thuban/UI/main.py (wxCHECK_VERSION): Removed. Not needed.
5723     (verify_versions): Remove most of the code since it is
5724     now in Thuban.version.verify_versions.o
5725    
5726     * Thuban/UI/mainwindow.py (MainWindow.About): Call new
5727     About box in Thuban.UI.about.
5728    
5729     * extensions/thuban/gdalwarp.cpp (get_gdal_version): New.
5730     Returns the version of gdal library being used as a string.
5731    
5732     * extensions/thuban/wxproj.cpp (check_version, check_version_gtk):
5733     Removed.
5734     (get_proj_version): Return the version of PROJ that the file
5735     was compiled with.
5736     (get_gtk_version): Return th version of GTK that the file
5737     was compiled with.
5738    
5739 jonathan 1304 2003-06-25 Jonathan Coles <[email protected]>
5740    
5741     * Thuban/UI/classifier.py (Classifier.EditSymbol): The parent
5742     of the SelectPropertiesDialog should be self so the window
5743     appears on top.
5744     (ClassGroupPropertiesCtrl.DoEdit): The parent
5745     of the SelectPropertiesDialog should be self so the window
5746     appears on top.
5747    
5748     * Thuban/UI/resource.py: Cleaned up how we determine file
5749     extensions.
5750     (GetImageResource): Return an wxImage from our Resources.
5751    
5752 jonathan 1299 2003-06-24 Jonathan Coles <[email protected]>
5753    
5754     * Thuban/UI/renderer.py (ExportRenderer.render_legend):
5755     Check that a layer has a classification before trying
5756     to get it. Raster layers don't have classifications.
5757    
5758 jonathan 1286 2003-06-23 Jonathan Coles <[email protected]>
5759 jonathan 1297
5760     * setup.py: Add Resources/XML to resource list.
5761    
5762     2003-06-23 Jonathan Coles <[email protected]>
5763 jonathan 1286
5764 jonathan 1297 * setup.cfg: Fix copyright dates
5765    
5766     2003-06-23 Jonathan Coles <[email protected]>
5767    
5768 jonathan 1294 * MANIFEST.in: Update with Resources/XML
5769    
5770     * setup.py: Don't include Locale resources yet as we don't
5771     have any and it causes problems building the distribution
5772     for Windows. Update version to 0.8.0.
5773    
5774     * Doc/thuban.dtd: Removed since it is now in Resources/XML.
5775    
5776     * Thuban/UI/mainwindow.py: Add blank line at the end because
5777     file was not being read correctly building the Windows
5778     distribution.
5779    
5780     2003-06-23 Jonathan Coles <[email protected]>
5781    
5782 jonathan 1289 * Thuban/UI/mainwindow.py (MainWindow.About): Fix text.
5783    
5784     * Thuban/version.py: Temporarily update longversion for
5785     the 0.8 release so that it doesn't have the cvs revision.
5786    
5787     2003-06-23 Jonathan Coles <[email protected]>
5788    
5789 jonathan 1286 * Thuban/UI/common.py (ThubanBeginBusyCursor): Call wxSafeYield
5790     to make sure that we don't create reentrant possibilities with
5791     wxYield.
5792    
5793     * Thuban/UI/view.py (MapCanvas.OnPaint): Call wxBeginBusyCursor()
5794     directly to avoid the wxSafeYield() call which generates an
5795     OnPaint event causing infinite recursion. Don't try to catch
5796     exception anymore. This was for before there were limits on map
5797     scaling.
5798    
5799 bh 1283 2003-06-23 Bernhard Herzog <[email protected]>
5800    
5801     Bug fix for RT #1961:
5802    
5803     * Thuban/Model/load.py (SessionLoader.start_derivedshapesource):
5804     Register DerivedShapestores with the session
5805    
5806     * Thuban/Model/session.py (Session.Tables): Make sure each table
5807     is only listed once.
5808    
5809     * test/test_load.py (TestJoinedTable.test): Add check_format call.
5810     Update file contents to match the one written out.
5811    
5812 bh 1281 2003-06-20 Bernhard Herzog <[email protected]>
5813    
5814     * test/xmlsupport.py (SaxEventLister.startElementNS)
5815     (SaxEventLister.endElementNS): Do not include the qname. Python
5816     2.2.1 and 2.2.2 and 2.2.3 differ in this regard. In 2.2.1 qname it
5817     is (presumably incorrectly) None, whereas it's a string with the
5818     element name in the later versions.
5819    
5820     * test/test_xmlsupport.py (TestEventList.test_even_list_simple)
5821     (TestEventList.test_even_list_namespace): Update tests to reflect
5822     the new behaviour
5823     (TestEventList.test_even_list_id_normalization): Fix doc-string
5824    
5825 jonathan 1272 2003-06-20 Jonathan Coles <[email protected]>
5826    
5827 jonathan 1279 * Thuban/Model/layer.py (BaseLayer.HasShapes): New. Overridden
5828     by deriving classes to determine if that layer supports shapes.
5829     (Layer): Override HasShapes and return true.
5830    
5831     * Thuban/UI/classgen.py: Use Thuban[Begin|End]BusyCursor()
5832     instead of a direct call to wx[Begin|End]CusyCursor().
5833     (GenUniquePanel._OnRetrieve): Set busy cursor while retrieving
5834     table data.
5835    
5836     * Thuban/UI/common.py (ThubanBeginBusyCursor, ThubanEndBusyCursor):
5837     New. Wrappers around the wxWindows functions that allow us to
5838     make additional calls such as wxYield which gives the native
5839     system a chance to update the cursor correctly.
5840    
5841     * Thuban/UI/tableview.py: Use Thuban[Begin|End]BusyCursor()
5842     instead of a direct call to wx[Begin|End]CusyCursor().
5843    
5844     * Thuban/UI/view.py: Use Thuban[Begin|End]BusyCursor()
5845     instead of a direct call to wx[Begin|End]CusyCursor().
5846     (MapCanvas.find_shape_at): Check if the current search layer
5847     support shapes, otherwise go on to the next layer.
5848    
5849     * test/test_layer.py: Add tests in each type of layer for
5850     HasClassification() and HasShapes()
5851    
5852     2003-06-20 Jonathan Coles <[email protected]>
5853    
5854 jonathan 1272 * Thuban/UI/view.py (MapCanvas.OnPaint): Call wxYield after
5855     turning on the busy cursor to allow the system to change the
5856     cursor before we begin painting. This fixes a problem that
5857     was occuring only under GTK. Fixes RTbug #1840.
5858    
5859 bh 1270 2003-06-20 Bernhard Herzog <[email protected]>
5860    
5861     * Resources/XML/thuban-0.8.dtd: New DTD for the new file format
5862     version.
5863    
5864     * Thuban/Model/save.py (sort_data_stores): New. Make topological
5865     sort of the data sources so they can be written with sources that
5866     data sources that depend on other data sources come after the
5867     sources they depend on.
5868     (SessionSaver.__init__): Add idmap instance variable to map from
5869     objects to the ids used in the file.
5870     (SessionSaver.get_id, SessionSaver.define_id)
5871     (SessionSaver.has_id): New. Methods to manage the idmap
5872     (SessionSaver.write): Use thuban-0.8.dtd
5873     (SessionSaver.write_session): Add a namespace on the session and
5874     write out the data sources before the maps.
5875     (SessionSaver.write_data_containers): New. Write the data
5876     containers.
5877     (SessionSaver.write_layer): Layer elements now refer to a
5878     shapestore and don't contain filenames anymore.
5879    
5880     * Thuban/Model/load.py (LoadError): Exception class to raise when
5881     errors in the files are discovered
5882     (SessionLoader.__init__): Define dispatchers for elements with a
5883     thuban-0.8 namespace too.
5884     (SessionLoader.check_attrs): New helper method to check and
5885     convert attributes
5886     (AttrDesc): New. Helper class for SessionLoader.check_attrs
5887     (SessionLoader.start_fileshapesource)
5888     (SessionLoader.start_derivedshapesource)
5889     (SessionLoader.start_filetable, SessionLoader.start_jointable):
5890     Handlers for the new elements in the new fileformat
5891     (SessionLoader.start_layer): Handle the shapestore attribute in
5892     addition to filename.
5893     (SessionLoader.start_table, SessionLoader.end_table): Removed.
5894     They were never used in the old formats and aren't needed for the
5895     new.
5896    
5897     * Thuban/Model/session.py (Session.DataContainers): New method to
5898     return all "data containers", i.e. shapestores and tables
5899    
5900     * test/xmlsupport.py (SaxEventLister.__init__)
5901     (SaxEventLister.startElementNS, sax_eventlist): Add support to
5902     normalize IDs.
5903    
5904     * test/test_xmlsupport.py
5905     (TestEventList.test_even_list_id_normalization): New test case for
5906     id normalization
5907    
5908     * test/test_load.py (LoadSessionTest.check_format): Use ID
5909     normalization
5910     (LoadSessionTest.thubanids, LoadSessionTest.thubanidrefs): New
5911     class atrributes used for ID normalization
5912     (TestSingleLayer, TestLayerVisibility, TestLabels.test)
5913     (TestLayerProjection.test, TestRasterLayer.test): Adapt to new
5914     file format
5915     (TestJoinedTable): New test for loading sessions with joined
5916     tables.
5917     (TestLoadError): New. Test whether missing required attributes
5918     cause a LoadError.
5919    
5920     * test/test_save.py (SaveSessionTest.thubanids)
5921     (SaveSessionTest.thubanidrefs): New class attributes for ID
5922     normalization in .thuban files.
5923     (SaveSessionTest.compare_xml): Use id-normalization.
5924     (SaveSessionTest.testEmptySession)
5925     (SaveSessionTest.testLayerProjection)
5926     (SaveSessionTest.testRasterLayer)
5927     (SaveSessionTest.testClassifiedLayer): Adapt to new file format.
5928     (SaveSessionTest.testLayerProjection): The filename used was the
5929     same as for testSingleLayer. Use a different one.
5930     (SaveSessionTest.test_dbf_table)
5931     (SaveSessionTest.test_joined_table): New test cases for saving the
5932     new data sources structures.
5933     (TestStoreSort, MockDataStore): Classes to test the sorting of the
5934     data stores for writing.
5935    
5936     * test/runtests.py: Add CVS keywords
5937    
5938 jonathan 1265 2003-06-20 Jonathan Coles <[email protected]>
5939    
5940 jonathan 1267 * test/test_session.py
5941     (UnreferencedTablesTests.test_unreferenced_tables_with_joins):
5942     Use the cultural_landmark-point.dbf file for the store so that
5943     the table rows and shape count match.
5944    
5945     2003-06-20 Jonathan Coles <[email protected]>
5946    
5947 jonathan 1265 * Thuban/Model/data.py (DerivedShapeStore.__init__): Raise
5948     an exception if the number of shapes is different from the
5949     number of rows in the table. Address RTbug #1933.
5950    
5951     * test/test_layer.py (TestLayer.test_derived_store): Add
5952     a test for the new exception in DerivedShapeStore.__init__.
5953    
5954     * test/support.py (FloatTestCase): Removed since there is
5955     already FloatComparisonMixin. Fixes RTbug #1954.
5956     (FloatComparisonMixin.assertFloatEqual): Include test for
5957     infinity that was part of FloatTestCase.
5958    
5959     * test/test_range.py (RangeTest): Inherit from
5960     support.FloatComparisonMixin now that we don't have
5961     support.FloatTestCase.
5962    
5963 bh 1256 2003-06-20 Bernhard Herzog <[email protected]>
5964    
5965 bh 1260 * test/test_save.py (SaxEventLister, sax_eventlist): Removed. Use
5966     the implementation in xmlsupport instead.
5967     (SaveSessionTest.compare_xml): sax_eventlist is now in xmlsupport
5968    
5969     * test/test_proj.py: Import sax_eventlist from xmlsupport instead
5970     of test_save
5971    
5972     2003-06-20 Bernhard Herzog <[email protected]>
5973    
5974 bh 1258 * test/test_load.py (LoadSessionTest.check_format): New helper
5975     method to make sure the test files we load might have been written
5976     by the current thuban version.
5977     (ClassificationTest.TestLayers, TestSingleLayer.test)
5978     (TestLayerVisibility.test, TestClassification.test)
5979     (TestLabels.test, TestLayerProjection.test, TestRasterLayer.test):
5980     Add check_format() calls and fix the thuban data to match the data
5981     that would be written by saving the session loaded from it.
5982    
5983     * test/xmlsupport.py (SaxEventLister, sax_eventlist): Copies of
5984     the same class and function in test_save.
5985    
5986     * test/test_xmlsupport.py (TestEventList): New. test cases for
5987     sax_eventlist
5988    
5989     2003-06-20 Bernhard Herzog <[email protected]>
5990    
5991 bh 1256 * Resources/XML/thuban.dtd: Add comment about which versions of
5992     Thuban are covered by this DTD
5993     (map): Fix content model for layers and raster layers. There can
5994     be any number or layers and raster layers in any order.
5995    
5996 jonathan 1254 2003-06-20 Jonathan Coles <[email protected]>
5997    
5998 jonathan 1265 This is mainly about fixing RTbug #1949.
5999    
6000 jonathan 1254 * Thuban/Model/classification.py: Remove "from __future__"
6001     import statement since python 2.2 is the earliest supported
6002     version.
6003    
6004     * Thuban/Model/proj.py (Projection.GetProjectedUnits): New.
6005     Currently returns PROJ_UNITS_METERS or PROJ_UNITS_DEGREES
6006     depending on the units this projection *forwards* into.
6007    
6008     * Thuban/Model/save.py (SessionSaver.write_classification):
6009     Remove unnecessary use of lambdas and nested functions.
6010    
6011     * Thuban/UI/legend.py (ScaleBarBitmap.__SetScale): Do scale
6012     adjustment here if the map projection uses degrees.
6013    
6014     * Thuban/UI/scalebar.py (ScaleBar.DrawScaleBar): Remove
6015     scale adjust code since it is now done before calling
6016     this method. Don't do anything if the map projection
6017     is None.
6018    
6019 bh 1244 2003-06-19 Bernhard Herzog <[email protected]>
6020    
6021 bh 1248 Move version specific load tests to their own file.
6022    
6023     * test/test_load.py: Expand the doc-string to explain a bit how to
6024     handle file format changes.
6025     (TestClassification.test): Update the docstring as this test is
6026     not about Thuban 0.2 anymore.
6027    
6028     * test/test_load_0_2.py: New file with the load tests for thuban
6029     files created with Thuban 0.2 and earlier.
6030    
6031     2003-06-19 Bernhard Herzog <[email protected]>
6032    
6033 bh 1246 Add XML validation to some of the tests. Validation will only be
6034     done if pyRXP is installed (http://reportlab.com/xml/pyrxp.html).
6035     To make the DTD available to the test cases it's moved into
6036     Resources/XML
6037    
6038     * Resources/XML/thuban.dtd: New. This is now the real Thuban DTD
6039     for versions up to and including 0.2. Two slight changes: added an
6040     encoding specification and fixed the comment which refered to
6041     GRASS, not Thuban
6042    
6043     * test/xmlsupport.py: New support module for tests involving XML.
6044     Currently there's a mix-in class for XML validation.
6045    
6046     * test/test_xmlsupport.py: New. Tests for the xmlsupport module
6047    
6048     * test/test_save.py (SaveSessionTest): Derive from ValidationTest
6049     so that we can validate the
6050     (SaveSessionTest.testEmptySession)
6051     (SaveSessionTest.testSingleLayer)
6052     (SaveSessionTest.testSingleLayer)
6053     (SaveSessionTest.testLayerProjection)
6054     (SaveSessionTest.testRasterLayer)
6055     (SaveSessionTest.testClassifiedLayer): Validate the generated XML
6056    
6057     * test/runtests.py (main): Call print_additional_summary instead
6058     of print_garbage_information
6059    
6060     * test/support.py (resource_dir): New function to return the
6061     "Resource" subdirectory
6062     (print_additional_summary): New function to combine several
6063     summary functions
6064     (run_tests): Use print_additional_summary instead of calling
6065     print_garbage_information directly
6066    
6067     2003-06-19 Bernhard Herzog <[email protected]>
6068    
6069 bh 1244 * Doc/thuban.dtd (classification): Correct the content model of
6070     the classification element.
6071     (projection): Add the "name" attribute
6072    
6073 frank 1242 2003-06-19 Frank Koormann <[email protected]>
6074    
6075     MERGE from the greater-ms3 branch.
6076    
6077     * Thuban/UI/scalebar.py (ScaleBar.DrawScaleBar): Apply conversion to
6078     scale if projection is latlong to get better estimate.
6079    
6080     Fix problem of hidden properties dialog under windows after double
6081     click on layer tree:
6082     The tree control always gets an Expanded / Collapsed event after
6083 joey 2162 the ItemActivated on double click, which raises the main window again.
6084     We add a second ItemActivated event to the queue, which simply
6085 frank 1242 raises the already displayed window.
6086    
6087     * Thuban/UI/legend.py (LegendTree.__init__): Instance variable
6088     raiseProperties initialized to prevent endless loops
6089     (LegendTree._OnItemActivated): Depending on self.raiseProperties
6090     simply raise the properties or open the dialog and issue a second
6091     event.
6092    
6093 jonathan 1235 2003-06-18 Jonathan Coles <[email protected]>
6094    
6095 jonathan 1239 * setup.py: Fix a few problems that occured under Windows.
6096    
6097     2003-06-18 Jonathan Coles <[email protected]>
6098    
6099 jonathan 1235 When Thuban loaded the map was redrawn twice because the
6100     legend was being opened after the mainwindow was created
6101     and not during its creation. This meant the map was drawn
6102     initially and then had to be redrawn when the legend
6103     caused the display to change. Now the legend is opened
6104     in the mainwindow constructor which resolves this issue.
6105    
6106     Also, although we were checking for the existence of
6107     gdal and gdalwarp modules, the gdalwarp extension was
6108     still being compiled (which may fail if the system doesn't
6109     have gdal installed). the build_ext command to setup.py
6110     now accepts the flags --with-gdal and --without-gdal.
6111     If --without-gdal is specified setup.py will try to
6112     use the gdal parameters specified by gdal-config. Under
6113     windows, those parameters have to be set in setup.py
6114     as with proj4 an wxWindows.
6115    
6116     * setup.py: Use a list instead of seperate variables for
6117     extension parameters so we can create a generic function
6118     that runs an appropriate *-config script.
6119     (run_cs_script): Renamed from run_wx_script and modified
6120     to accept a second argument which is a list of lists to
6121     be filled in by the values returned from running the command.
6122     (thuban_build_ext): New. Extends the build_ext command and
6123     provides the options --with-gdal/--without-gdal which then
6124     optionally includes the gdalwarp extension.
6125    
6126     * Thuban/Model/resource.py: First check if we can import
6127     the gdalwarp Thuban extension before checking for gdal.
6128     Also added some comments.
6129    
6130     * Thuban/UI/legend.py (ScaleBarBitmap.__SetScale): Check if
6131     the map is None which may be the case if none has been loaded
6132     yet.
6133    
6134     * Thuban/UI/main.py (main): Remove call to ShowLegend.
6135    
6136     * Thuban/UI/mainwindow.py (MainWindow.__init__): Call ShowLegend().
6137    
6138     * Thuban/UI/renderer.py: Check for gdal support before importing
6139     gdalwarp.
6140     (MapRenderer.render_map): Only try to optimize if we have gdal
6141     support otherwise nothing will get drawn.
6142    
6143 jonathan 1237 * Thuban/UI/view.py (MapCanvas.FitMapToWindow): This may be called
6144     during startup before a map has been created. Check if map is None
6145     before using it and do nothing if it is.
6146    
6147 jonathan 1224 2003-06-17 Jonathan Coles <[email protected]>
6148    
6149     Fix the problem with raster layers under Windows that caused
6150     Thuban to crash. The view should respond to layer projection
6151     changed events to update the display. Changes to a projection
6152     should not cause the map to be set to full extent.
6153    
6154     * Thuban/UI/view.py (MapCanvas.__init__): New instance variable
6155     current_map_proj to remember the current map projection so that
6156     when the projection changes we know what the previous projection
6157     was.
6158     (MapCanvas.SetMap): Unsubscribe and subscribe to
6159     LAYER_PROJECTION_CHANGED events.
6160     (MapCanvas.projection_changed): Split into two methods that respond
6161     to map and layer projection changes.
6162     (MapCanvas.map_projection_changed): New. Takes the current view and
6163     projects it using the new projection. This does not cause the
6164     map to be redrawn at full extent.
6165     (MapCanvas.layer_projection_changed): New. Cause a redraw which
6166     will draw each layer in its new projection.
6167    
6168     * extensions/thuban/bmpdataset.cpp (BMPDataset::Open): Call
6169     VSIFClose() not VSIFCloseL() to close the file. Fixes a crash
6170     under Windows.
6171    
6172     * extensions/thuban/gdalwarp.cpp (MFILENAME): Padding should be
6173     to twice sizeof(void*) because there are two digits for each
6174     hex byte.
6175    
6176 bh 1220 2003-06-16 Bernhard Herzog <[email protected]>
6177    
6178     Update to the layer interface: Direct access to the table,
6179     shapetable, shapefile and filename attributes is now actively
6180     deprecated by issuing deprecation warnings for all places where
6181     this happens.
6182    
6183     * Thuban/Model/layer.py (Layer.__getattr__): New. Implement access
6184     to the instance variables table, shapetable, shapefile and
6185     filename via __getattr__ so that we can issue a deprecation
6186     warning.
6187     (Layer.SetShapeStore): Don't set the deprecated instance variables
6188     any more
6189     (Layer.SetShapeStore): Don't use deprecated layer instance
6190     variables
6191     (Layer.Destroy): No need to explicitly remove the instance
6192     variables any more
6193     (Layer.GetFieldType, Layer.Shape): Don't use deprecated layer
6194     instance variables
6195    
6196     * Thuban/UI/classgen.py (ClassGenDialog.__init__)
6197     (GenUniformPanel._OnRetrieve, GenUniquePanel._OnRetrieve)
6198     (GenQuantilesPanel.GetList, GenQuantilesPanel.OnRetrieve): Don't
6199     use deprecated layer instance variables
6200    
6201     * Thuban/UI/classifier.py (Classifier.__init__): Don't use
6202     deprecated layer instance variables
6203    
6204     * Thuban/UI/identifyview.py (IdentifyListCtrl.selected_shape)
6205     (IdentifyGridCtrl.selected_shape): Don't set the deprecated layer
6206     instance variables
6207    
6208     * Thuban/UI/tableview.py (LayerTableGrid.select_shapes): Don't use
6209     deprecated layer instance variables
6210    
6211     * Thuban/UI/mainwindow.py (MainWindow.LayerShowTable): Don't use
6212     deprecated layer instance variables
6213    
6214     * Thuban/Model/save.py (SessionSaver.write_layer): Don't use
6215     deprecated layer instance variables
6216    
6217     * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer)
6218     (MapRenderer.polygon_render_param): Don't use deprecated layer instance
6219     variables
6220    
6221     * test/runtests.py (main): Turn Thuban's deprecation warnings into
6222     errors so that they're cought by the tests
6223    
6224     * test/test_load.py (TestSingleLayer.test): Don't use deprecated
6225     layer instance variables
6226    
6227 jonathan 1212 2003-06-16 Jonathan Coles <[email protected]>
6228    
6229     Fix a problem under Windows whereby if the user double-clicks on a
6230     layer in the legend that tree item will expand or collapse as well
6231     as open the layer properties dialog. The state of the tree item
6232     should not be affected.
6233    
6234     * Thuban/UI/legend.py (LegendTree.__init__): Add instance variable
6235     preventExpandCollapse and subscribe to expanding and collapsing
6236     events.
6237     (LegendTree.OnItemExpandCollapse): New. Responds to expanding and
6238     collapsing events and will veto the event if it has been triggered
6239     by the user double clicking on a layer.
6240     (LegendTree._OnItemActivated): Set preventExpandCollapse to indicate
6241     that an expanding/collapsing event should be vetoed.
6242    
6243 bh 1208 2003-06-13 Bernhard Herzog <[email protected]>
6244    
6245     * Thuban/UI/classifier.py (Classifier.OnClose)
6246     (Classifier.map_layers_removed)
6247     (Classifier.layer_shapestore_replaced): Unsubscribe the messages
6248     in OnClose and not in map_layers_removed or
6249     layer_shapestore_replaced to make sure it always happens when the
6250     dialog is closed
6251    
6252 jonathan 1201 2003-06-13 Jonathan Coles <[email protected]>
6253    
6254 jonathan 1203 This puts back a fix for Windows where a panel is needed so that
6255     the background of the table view appears correctly.
6256    
6257     * Thuban/UI/tableview.py (TableFrame.__init__): Add a panel
6258     object that can be used by derived classes to place any
6259     controls (including the grid) onto.
6260     (QueryTableFrame.__init__): Use the panel as the parent window
6261     for all the controls. Reparent the grid so that the panel is
6262     the parent. Call UpdateStatusText() to correctly initialize
6263     the status bar.
6264    
6265     2003-06-13 Jonathan Coles <[email protected]>
6266    
6267 jonathan 1201 * Thuban/UI/dialogs.py (ThubanFrame): New: a class that inherits
6268     from wxFrame (as opposed to wxDialog like the other classes)
6269     but otherwise behaves like the other classes. This is needed
6270     for the TableView which isn't really a dialog and needs to
6271     have a status bar and control buttons.
6272    
6273     * Thuban/UI/tableview.py (TableGrid.__init__): Create an
6274     instance variable to keep track of how many rows are selected.
6275     Subscribe once to the the events we are interested in.
6276     (ThubanGrid.OnRangeSelect): Only handle event if event handling
6277     hasn't been turned off.
6278     (ThubanGrid.OnSelectCell): Only handle event if event handling
6279     hasn't been turned off.
6280     (ThubanGrid.ToggleEventListeners): Rather than subscribe None
6281     as an event listener (which changes the event handler stack)
6282     simply set an instance variable to False. This is checked in
6283     the event handlers.
6284     (ThubanGrid.GetNumberSelected): Return the number of currently
6285     selected rows.
6286     (TableFrame): Inherit from ThubanFrame so we can have a
6287     status bar and control buttons.
6288     (QueryTableFrame.__init__): Create a status bar. Fixes RTbug #1942.
6289     Explicitly set which items are selected in the operator choice and
6290     action choice so there is always a valid selection. Fixes RTbug #1941.
6291     Subscribe to grid cell selection events so we can update the
6292     status bar.
6293     (QueryTableFrame.UpdateStatusText): Update the status bar with
6294     how many rows are in the grid, how many columns, and how many
6295     rows are selected.
6296     (QueryTableFrame.OnGridSelectRange, QueryTableFrame.OnGridSelectCell):
6297     Call UpdateStatusText when cells are (de)selected.
6298     (QueryTableFrame.OnQuery): Use the string value in the value
6299     combo if either the selected item index is 0 or if the string
6300     cannot be found in the predefined list (this happens if the
6301     user changes the text). Fixes RTbug #1940.
6302     Only turn off the grid event listeners if there a query comes
6303     back with a none empty list of ids. in the case that the list
6304     is empty this causes a grid.ClearSelection() call to actually
6305     clear the grid selection which causes the selected items in
6306     the map to be deselected. Fixes RTbug #1939.
6307    
6308     * test/test_save.py (XMLWriterTest.Encode): Check return values.
6309     Fixes RTbug #1851.
6310    
6311 bh 1195 2003-06-13 Bernhard Herzog <[email protected]>
6312    
6313     * Thuban/UI/identifyview.py (IdentifyView.__init__): Call
6314     self.selected_shape with the current selection to make sure the
6315     contents of the dialog are up to date when it's shown for the
6316     first time.
6317     The dialog used to work without this by luck. The recent fix to
6318     the connector module 'broke' a 'feature' the identify view was
6319     relying on, i.e that subscribing to a message in response to
6320     receiving a message of that type would mean that the new
6321     subscriber would also be called for the same message.
6322    
6323 jonathan 1169 2003-06-12 Jonathan Coles <[email protected]>
6324 jonathan 1175
6325 jonathan 1193 * extensions/thuban/gdalwarp.cpp: Removed debug printing as
6326     the image is rendered. Fixes RTbug #1937.
6327    
6328     2003-06-12 Jonathan Coles <[email protected]>
6329    
6330 jonathan 1191 * Thuban/Lib/fileutil.py: As is done under Windows, create the
6331 jonathan 1193 user directory if it doesn't exist on a posix system.
6332     Fixes RTbug #1815.
6333 jonathan 1191
6334     * Thuban/Model/resource.py (get_user_proj_files): Moved the
6335     called to get_application_dir here, so that the directory
6336     will only be called if this method is invoked.
6337    
6338     * Thuban/UI/projdialog.py (ProjFrame.__DoOnProjAvail): Clear
6339     the projfilepath if no projection is selected.
6340    
6341     2003-06-12 Jonathan Coles <[email protected]>
6342    
6343 jonathan 1182 * Thuban/UI/legend.py (ScaleBarBitmap.__SetScale): Don't draw
6344     the scalebar if the current map has no projection set.
6345    
6346     * Thuban/UI/projdialog.py (ProjFrame.__DoOnProjAvail): Set the
6347     projfilepath label to just the basename of the projection file
6348     rather than include the entire path.
6349    
6350     * Thuban/Model/resource.py: Fix missed proj functions that
6351     needed to be renamed.
6352    
6353     2003-06-12 Jonathan Coles <[email protected]>
6354    
6355 jonathan 1178 * Thuban/Model/classification.py: Removed assert statements that
6356     tested if the variable was an instance of Color.
6357    
6358     * Thuban/Model/color.py (Color): Remove commented code that isn't
6359     used.
6360     (Transparent): Renamed from NoColor. Doesn't inherit from Color.
6361     Fixes RTbug #1835.
6362     (Transparent.__eq__, Transparent.__ne, Transparent.__repr): New.
6363     Needed now that the class doesn't inherit from Color.
6364    
6365     2003-06-12 Jonathan Coles <[email protected]>
6366    
6367 jonathan 1175 * test/test_save.py (XMLWriterTest.testEncode): Explicitly
6368     check unicode strings.
6369    
6370     * test/test_layer.py: Check for existence of gdal.
6371    
6372     2003-06-12 Jonathan Coles <[email protected]>
6373 jonathan 1172
6374     * Thuban/Model/xmlreader.py: New. Contains the XMLReader class
6375     that was in load.py
6376 jonathan 1169
6377 jonathan 1172 * Thuban/Model/xmlwriter.py: New. Contains the XMLWriter class
6378     that was in save.py
6379    
6380     2003-06-12 Jonathan Coles <[email protected]>
6381    
6382 jonathan 1169 This is largely a collection of bug fixes. We also handle the
6383     case where gdal is not on the system. The XMLReader and XMLWriter
6384     classes were moved into there own files to resolve some circular
6385     import references and because they shouldn't really be in the
6386     file that is dediciated to reading/writing session files since
6387     they are also used elsewhere.
6388    
6389     * Thuban/Model/classgen.py: Renamed functions to follow the
6390     function_names_with_underscores style. Fixes RTbug #1903.
6391     (calculate_quantiles): Raise ValueError if 'percents' is invalid.
6392    
6393     * Thuban/Model/layer.py: Import gdal only if it available.
6394     (RasterLayer): Handle the case where the gdal library is unavailable.
6395     Addresses RTbug #1877.
6396    
6397     * Thuban/Model/load.py (XMLReader): Moved into seperate file
6398     xmlreader.py.
6399    
6400 jonathan 1172 2003-06-12 Jonathan Coles <[email protected]>
6401    
6402     This is largely a collection of bug fixes. We also handle the
6403     case where gdal is not on the system. The XMLReader and XMLWriter
6404     classes were moved into there own files to resolve some circular
6405     import references and because they shouldn't really be in the
6406     file that is dediciated to reading/writing session files since
6407     they are also used elsewhere.
6408    
6409     * Thuban/Model/classgen.py: Renamed functions to follow the
6410     function_names_with_underscores style. Fixes RTbug #1903.
6411     (calculate_quantiles): Raise ValueError if 'percents' is invalid.
6412    
6413     * Thuban/Model/layer.py: Import gdal only if it available.
6414     (RasterLayer): Handle the case where the gdal library is unavailable.
6415     Addresses RTbug #1877.
6416    
6417     * Thuban/Model/load.py (XMLReader): Moved into seperate file
6418     xmlreader.py.
6419    
6420 jonathan 1169 * Thuban/Model/save.py (escape, XMLWriter): Moved into seperate
6421     file xmlwriter.py.
6422    
6423     * Thuban/Model/resource.py: Renamed functions to following the
6424     function_names_with_underscores style.
6425     (has_gdal_support): New function that returns true if the gdal
6426     library is available. Addresses RTbug #1877.
6427    
6428     * Thuban/UI/application.py (ThubanApplication.OpenSession):
6429     Display a message box if the gdal library is not available, but
6430     only if there are any layers that would use it. Addresses RTbug #1877.
6431    
6432     * Thuban/UI/classgen.py: Use renamed projection resource functions.
6433     (GenUniformPanel.__CalcStepping): Fix a slight discrepency
6434     when using integers versus floats.
6435    
6436     * Thuban/UI/mainwindow.py (_has_gdal_support): New. Used to
6437     determine if the "Add Image Layer" menu option should be
6438     greyed out or not. Addresses RTbug #1877.
6439    
6440     * Thuban/UI/projdialog.py: Use renamed projection resource functions.
6441    
6442     * Thuban/UI/renderer.py (MapRenderer.render_map): Only try to
6443     optimize if a raster layer is visible. Fixes RTbug #1931.
6444     Only draw the raster layer if the gdal library is available.
6445     Addresses RTbug #1877.
6446    
6447     * test/test_classgen.py: Add tests for generate_singletons,
6448     generate_uniform_distribution, generate_quantiles. Fixes RTbug #1903.
6449     (test_calculate_quantiles): Fix some tests to catch the new
6450     ValueError that is raised.
6451    
6452     * test/test_proj.py: Use renamed projection resource functions.
6453    
6454     * test/test_save.py (SaveSessionTest.testClassifiedLayer): New
6455     test for saving classified layers. Fixes RTbug #1902.
6456     (XMLWriterTest): New. Tests the XMLWriter class. Fixes RTbug #1851.
6457    
6458 jan 1156 2003-06-12 Jan-Oliver Wagner <[email protected]>
6459    
6460     Fix for http://intevation.de/rt/webrt?serial_num=1900.
6461    
6462     * Thuban/UI/multiplechoicedialog.py: New. A multiple choice dialog.
6463    
6464     * Thuban/UI/mainwindow.py: import wxMultipleChoiceDialog from
6465     multiplechoicedialog.py rather than from the wxPython library.
6466    
6467 frank 1151 2003-06-11 Frank Koormann <[email protected]>
6468    
6469 frank 1152 * Thuban/Lib/fileutil.py (get_application_dir): Minor stability
6470     update.
6471    
6472     2003-06-11 Frank Koormann <[email protected]>
6473    
6474 frank 1151 * Thuban/Lib/fileutil.py (get_application_dir): New function to
6475     determine the absolute .thuban/thuban directory under
6476     "posix" (os.expanduser) and "nt" (read AppData registry key).
6477    
6478     * Thuban/Model/resource.py: Use get_application_dir
6479    
6480     * Thuban/UI/application.py (ThubanApplication.read_startup_files):
6481     Use get_application_dir.
6482    
6483 bh 1143 2003-06-10 Bernhard Herzog <[email protected]>
6484    
6485 bh 1147 * Thuban/UI/tableview.py (LayerTableFrame.__init__): Subscribe to
6486     the messages MAP_LAYERS_REMOVED messages
6487     (LayerTableFrame.OnClose): Unsubscribe from it.
6488     (LayerTableFrame.map_layers_removed): New. Receiver for
6489     MAP_LAYERS_REMOVED. Close the dialog when the layer whose the
6490     dialog is showing is removed.
6491    
6492     2003-06-10 Bernhard Herzog <[email protected]>
6493    
6494 bh 1145 * Thuban/Lib/connector.py (Connector.Issue): Iterate over a copy
6495     of the receivers list so that unsubscribing in a receiver doesn't
6496     modify it while iterating over it.
6497    
6498     * test/test_connector.py
6499     (ConnectorTest.test_disconnect_in_receiver): New. Test whether
6500     unsubscribing in a receiver works correctly. See docstring for
6501     details
6502    
6503     2003-06-10 Bernhard Herzog <[email protected]>
6504    
6505 bh 1143 * Thuban/Model/messages.py (LAYER_SHAPESTORE_REPLACED): New
6506     message.
6507    
6508     * Thuban/Model/layer.py (Layer.SetShapeStore): Send
6509     LAYER_SHAPESTORE_REPLACED when the shapestore changes. A
6510     LAYER_CHANGED will still be sent if the classification changes.
6511    
6512     * Thuban/UI/classifier.py (Classifier.__init__): Add the map as
6513     parameter so we can subscribe to some of its messages
6514     (Classifier.__init__): Subscribe to the map's MAP_LAYERS_REMOVED
6515     and the layer's LAYER_SHAPESTORE_REPLACED
6516     (Classifier.unsubscribe_messages): New. Unsubscribe from message
6517     subscribed to in __init__
6518     (Classifier.map_layers_removed)
6519     (Classifier.layer_shapestore_replaced): receivers for the messages
6520     subscribed to in __init__. Unsubscribe and close the dialog
6521    
6522     * Thuban/UI/mainwindow.py (MainWindow.OpenLayerProperties): Pass
6523     the map to the Classifier dialog
6524    
6525     * test/test_layer.py (SetShapeStoreTests): Derive from
6526     SubscriberMixin as well so we can test messages
6527     (SetShapeStoreTests.setUp): Subscribe to some of the layer's
6528     messages
6529     (SetShapeStoreTests.tearDown): Clear the messages again
6530     (SetShapeStoreTests.test_sanity): Expand the doc-string and check
6531     for the modified flag too
6532     (SetShapeStoreTests.test_set_shape_store_modified_flag): New test
6533     to check whether SetShapeStore sets the modified flag
6534     (SetShapeStoreTests.test_set_shape_store_different_field_name)
6535     (SetShapeStoreTests.test_set_shape_store_same_field)
6536     (SetShapeStoreTests.test_set_shape_store_same_field_different_type):
6537     Add tests for the messages. This checks both the new
6538     LAYER_SHAPESTORE_REPLACED and the older LAYER_CHANGED
6539    
6540 jan 1141 2003-06-06 Jan-Oliver Wagner <[email protected]>
6541    
6542     * Thuban/UI/mainwindow.py: Improved and partly added help texts for
6543     the menu items.
6544    
6545 frank 1134 2003-06-05 Frank Koormann <[email protected]>
6546    
6547 frank 1139 * Thuban/UI/identifyview.py (IdentifyView.__init__):
6548     Layout reimplemented without panel. Make life easier to fit the list
6549     in the dialog.
6550    
6551     2003-06-05 Frank Koormann <[email protected]>
6552    
6553 frank 1137 * Thuban/UI/projdialog.py (ProjFrame.__init__): Fill the projchoice
6554     once on initialisation (Former implementation resulted in multiple
6555     entries for each projection).
6556     (ProjFrame.__FillAvailList): selectProj as second optional parameter,
6557     if set, select the projection found under the specified name. This
6558     overwrites any other selection estimate.
6559     Removed projchoice filling from this method.
6560     (ProjFrame._OnSave, ProjFrame._OnAddToList):
6561     Updated call of ProjFrame.__FillAvailList
6562     (LCCPanel._DoLayout): Moved parameter controls in more common order.
6563    
6564     * Resources/Projections/defaults.proj: Extended defaults representing
6565     various common European projections.
6566    
6567     2003-06-05 Frank Koormann <[email protected]>
6568    
6569 frank 1134 * Thuban/UI/identifyview.py (IdentifyView.__init__):
6570     Use ListCtrl instead of GridCtrl
6571    
6572     * Thuban/Model/resource.py:
6573     Guess location of .thuban directory from tempdir parent directory.
6574    
6575     * Thuban/UI/application.py (ThubanApplication.read_startup_files):
6576     Guess location of .thuban directory from tempdir parent directory.
6577    
6578 bh 1130 2003-06-04 Bernhard Herzog <[email protected]>
6579    
6580     Do not cache the values returned by the tree widget's
6581     GetFirstChild and GetNextChild methods because it led to lots of
6582     segfaults. The new way requires more brute force but is more
6583     reliable.
6584    
6585     * Thuban/UI/legend.py (LegendTree.__init__): Remove instance
6586     variable layer2id
6587     (LegendTree.find_layer): New method to do with brute force what
6588     layer2id tried to accomplish
6589     (LegendTree._OnMsgLayerChanged)
6590     (LegendTree._OnMsgLayerTitleChanged, LegendTree.__ShowHideLayer):
6591     Use find_layer instead of layer2id
6592     (LegendTree.__RemoveLayer, LegendTree.__AddLayer): No need to
6593     update layer2id anymore
6594     (LegendTree._OnMsgMapLayersRemoved)
6595     (LegendTree._OnMsgMapLayersAdded): Get by without layer2id.
6596    
6597 tkoester 1128 2003-06-03 Thomas Koester <[email protected]>
6598    
6599     * Thuban/Model/classgen.py (GenQuantiles0): New function.
6600    
6601 bh 1120 2003-06-02 Bernhard Herzog <[email protected]>
6602    
6603 bh 1127 * Thuban/UI/mainwindow.py (layer_rename command, table_rename command):
6604     New commands.
6605     (main_menu): Add the new commands.
6606     (MainWindow.TableRename): New. Implementation of the table_rename
6607     command.
6608     (MainWindow.RenameLayer): New. Implementation of the layer_rename
6609     command.
6610    
6611     * Thuban/Model/session.py (Session.AddTable): call self.changed to
6612     set the modified flag
6613    
6614     * test/test_session.py (TestSessionSimple.test_add_table): Test
6615     whether the modified flag is set properly
6616    
6617     * Thuban/Model/base.py (TitledObject.SetTitle): Call changed
6618     instead of issue so that the modified flags get updated.
6619    
6620     * test/test_base.py (SomeTitledObject): Derive from Modifiable
6621     instead of Publisher to reflect reality better and to accomodate
6622     the fact that SetTitle now calls changed instead of issue
6623    
6624     2003-06-02 Bernhard Herzog <[email protected]>
6625    
6626     * Thuban/UI/classgen.py (GenQuantilesPanel.GetList): Resource
6627     acquisition has to happen before the try in a try-finally.
6628    
6629     2003-06-02 Bernhard Herzog <[email protected]>
6630    
6631 bh 1120 * Thuban/UI/legend.py (LegendTree._OnMsgMapLayersRemoved): It's
6632     possible that a layer is removed that is not currently selected in
6633     the legend so don't check for this.
6634    
6635 bh 1112 2003-05-30 Bernhard Herzog <[email protected]>
6636    
6637 bh 1118 * Thuban/Model/layer.py (Layer.Destroy): Set all instance
6638     variables to None that have direct or indirect references to
6639     shapefiles or dbf files to make sure that they do go away and the
6640     files are closed.
6641    
6642     2003-05-30 Bernhard Herzog <[email protected]>
6643    
6644 bh 1116 * Thuban/UI/legend.py (LegendTree.GetRootItem): Reset
6645     availImgListIndices when a new image list is created
6646    
6647     2003-05-30 Bernhard Herzog <[email protected]>
6648    
6649 bh 1114 * Thuban/UI/legend.py (LegendTree.__init__): New instance variable
6650     changing_selection to indicate whether the LegendTree code itself
6651     is currently changing the selection
6652     (LegendTree.normalize_selection): New method to normalize the
6653     selection by selecting the layer item even if the user clicked on
6654     the classification.
6655     (LegendTree._OnSelChanged): normalize the selection. This works
6656     around a bug in wx which doesn't keep track of the selection
6657     properly when subtrees are deleted.
6658    
6659     2003-05-30 Bernhard Herzog <[email protected]>
6660    
6661 bh 1112 * Thuban/UI/view.py (MapCanvas.set_view_transform): Limit the
6662     maximum and minimum scale factors.
6663    
6664     * test/test_classgen.py (ClassGenTest.test): Update to reflect the
6665     changes in classgen.py
6666    
6667 jonathan 1109 2003-05-30 Jonathan Coles <[email protected]>
6668    
6669     * Thuban/Model/classgen.py: Remove ClassGenerator class but make
6670     all the methods functions. Fixes RTBug #1903.
6671    
6672     * Thuban/Model/map.py (Map.TopLayer, Map.BottomLayer): Renamed
6673     to MoveLayerToTop and MoveLayerToBottom respectively. Fixes
6674     RTBug #1907.
6675    
6676     * Thuban/UI/classgen.py: Use classgen functions that were part
6677     of the ClassGenerator class. Put try/finally blocks around
6678     code that uses wxBeginBusyCursor()/wxEndBusyCursor(). Fixes
6679     RTBug #1904.
6680    
6681     * Thuban/UI/classifier.py: Remove unused import of ClassGenerator.
6682    
6683     * Thuban/UI/legend.py: The legend was cleared and repopulated any
6684     time something changed which caused some state to be lost such
6685     as which children were expanded or collapsed. Fixes RTBug #1901.
6686     (LegendTree._OnMsgMapLayersAdded): Add only new layers.
6687     (LegendTree.__OnMsgMapLayersRemoved): Remove layers that exist in
6688     the legend but not in the map.
6689     (LegendTree.__FillTree): Move main functionality out into smaller
6690     methods that can be used by other methods.
6691     (LegendTree.__FillTreeLayer): Reuse old slots in the image list
6692     if they are available.
6693     (LegendTree.DeleteAllItems): Renamed from __DeleteAllItems so
6694     that we override the wxTreeCtrl method. Iterate over children
6695     and call __RemoveLayer.
6696     (LegendTree.__AddLayer): New. Add a new layer to the legend.
6697     (LegendTree.__RemoveLayer): Remove a layer from the legend.
6698     (LegendTree.DeleteChildren): New, overrides wxTreeCtrl method.
6699     Should only be called with the id of a layer branch.
6700     (LegendTree.GetRootItem): New, overrides wxTreeCtrl method.
6701     Returns the root item or creates one if necessary.
6702    
6703     * Thuban/UI/renderer.py (MapRenderer.draw_raster_layer): Call
6704     ProjectRasterFile with tuple arguments instead of strings.
6705    
6706     * Thuban/UI/tableview.py (QueryTableFrame.OnQuery): Wrap code
6707     with try/finally. Fixes RTBug #1904.
6708    
6709     * Thuban/UI/view.py (MapCanvas.OnPaint): Wrap code
6710     with try/finally. Fixes RTBug #1904.
6711     (MapCanvas.FitSelectedToWindow): If a single point is selected
6712     simply center it on the display. Fixes RTBug #1849.
6713    
6714     * extensions/thuban/gdalwarp.cpp: Removed code that allowed gdalwarp
6715     to be compiled as a standalone app. Now the code can only be
6716     called from Python which simplifies the parameter passing.
6717     (ProjectRasterFile): Handle Python arguments. Remove code that
6718     checks for a destination dataset. Add more clean up code.
6719    
6720     * test/test_map.py (TestMapWithContents.test_raise_layer_top,
6721     TestMapWithContents.test_lower_layer_bottom):
6722     Test Map.MoveLayerToTop() and Map.MoveLayerToBottom() respectively.
6723     Fixes RTBug #1907.
6724    
6725     * Thuban/UI/mainwindow.py (MainWindow.ToggleLegend): Apply a full
6726     extent to the map when the legend is toggled. Fixes RTBug #1881.
6727    
6728 jan 1097 2003-05-29 Jan-Oliver Wagner <[email protected]>
6729    
6730     * Thuban/UI/tableview.py (LayerTableFrame.OnClose): Bug-fix: Now
6731     unsubscribes all that is subcribed in __init__.
6732    
6733 bh 1089 2003-05-28 Bernhard Herzog <[email protected]>
6734    
6735 bh 1095 * Thuban/UI/mainwindow.py (MainWindow.DuplicateLayer)
6736     (MainWindow.CanDuplicateLayer): New methods to implement the
6737     Layer/Duplicate command.
6738     (layer_duplicate command): New.
6739     (main_menu): Add layer_duplicate to the Layer menu.
6740    
6741     2003-05-28 Bernhard Herzog <[email protected]>
6742    
6743 bh 1093 * Thuban/UI/tableview.py (NullRenderer.Draw): New. Our own
6744     renderer so that NULL/None values get displayed differently (by a
6745     gray rectangle).
6746     (TableGrid.__init__): Override the default renderers
6747    
6748     2003-05-28 Bernhard Herzog <[email protected]>
6749    
6750 bh 1089 * Thuban/Model/layer.py (Layer.SetShapeStore): Set the
6751     classification to "None" if the type of the field has changed.
6752    
6753     * test/test_layer.py (SetShapeStoreTests): New. Class with a few
6754     test for the Layer.SetShapeStore method
6755    
6756 jan 1087 2003-05-28 Jan-Oliver Wagner <[email protected]>
6757 jan 1085
6758 jan 1087 * Thuban/Model/layer.py (Layer.TreeInfo): Fixed a bug (a layer
6759     does not necessarily have a filename).
6760    
6761     2003-05-28 Jan-Oliver Wagner <[email protected]>
6762    
6763 jan 1085 * Thuban/UI/mainwindow.py (MainWindow.TableClose, MainWindow.TableShow):
6764     sort the selection list for the dialog.
6765    
6766 frank 1083 2003-05-28 Frank Koormann <[email protected]>
6767    
6768     * extensions/thuban/wxproj.cpp
6769     (project_point): Removed cast to int for projected point coordinates.
6770     (shape_centroid): Return last point if all polygon vertices fall
6771     to one point.
6772    
6773 bh 1079 2003-05-28 Bernhard Herzog <[email protected]>
6774    
6775 bh 1081 * Thuban/UI/mainwindow.py (_can_unjoin): Add doc-string and cope
6776     with layers that don't have shapestores, i.e. raster layers.
6777    
6778     2003-05-28 Bernhard Herzog <[email protected]>
6779    
6780 bh 1079 * Thuban/Model/table.py (DBFTable.__init__): Omit the extension
6781     when determining the title from the filename.
6782    
6783     * test/test_dbf_table.py (TestDBFTable.test_title): Update to
6784     reflect changes in the way the title is derived from the filename
6785    
6786 frank 1077 2003-05-28 Frank Koormann <[email protected]>
6787    
6788     * Thuban/UI/mainwindow.py (MainWindow.TableShow):
6789     Added wxDEFAULT_DIALOG_STYLE to show table dialog styles.
6790    
6791 bh 1069 2003-05-27 Bernhard Herzog <[email protected]>
6792    
6793 bh 1075 * Thuban/UI/mainwindow.py (MainWindow.delegated_messages): Also
6794     delegate SelectedLayer.
6795     (MainWindow.LayerUnjoinTable): Implement.
6796     (_can_unjoin): New. Helper function for the sensitivity of the
6797     layer/unjoin command.
6798    
6799     * Thuban/Model/data.py (ShapefileStore.OrigShapeStore)
6800     (DerivedShapeStore.OrigShapeStore): New. Return the original
6801     shapestore. Used to figure out how to unjoin.
6802     (DerivedShapeStore.Shapefile): Fix a typo.
6803    
6804     2003-05-27 Bernhard Herzog <[email protected]>
6805    
6806 bh 1073 * Thuban/UI/join.py (JoinDialog): Extend to handle layer joins as
6807     well
6808     (JoinDialog.__init__): Use the layer parameter and only build the
6809     left choice when a layer is given
6810     (JoinDialog.OnJoin): Handle layer joins as well
6811     (JoinDialog.OnLeftTable, JoinDialog.OnRightTable): Handle the case
6812     that the user selects the "Select..." item. The sensitivitly
6813     updating is now in update_sensitivity
6814     (JoinDialog.y): New method to refactor the sensitivity update of
6815     the join button into its own method.
6816    
6817     * Thuban/UI/mainwindow.py (MainWindow.LayerJoinTable): Implement.
6818    
6819     2003-05-27 Bernhard Herzog <[email protected]>
6820    
6821 bh 1071 * Thuban/UI/mainwindow.py (table_close command): Make it sensitive
6822     iff there are unreferenced tables in the session
6823    
6824     2003-05-27 Bernhard Herzog <[email protected]>
6825    
6826 bh 1069 * Thuban/Model/messages.py (TABLE_REMOVED): New message.
6827    
6828     * Thuban/Model/session.py (Session.UnreferencedTables): New method
6829     to return tables that are not referenced by other tables or shape
6830     stores and can be removed.
6831     (Session.RemoveTable): Issue a TABLE_REMOVED message after
6832     removing the table
6833    
6834     * Thuban/UI/mainwindow.py: Remove unused imports
6835     (MainWindow.TableClose): Implement.
6836    
6837     * Thuban/UI/tableview.py (TableFrame.__init__): Subscribe to some
6838     messages so that the frame will be automatically closed when a new
6839     session is opened or the table is removed.
6840     (TableFrame.OnClose): Unsubscribe the Subscriptions made in
6841     __init__
6842     (TableFrame.close_on_session_replaced)
6843     (TableFrame.close_on_table_removed): New. Subscribers that close
6844     the window
6845    
6846     * test/test_session.py (TestSessionMessages.test_remove_table)
6847     (TestSessionSimple.test_remove_table): Move the test to
6848     TestSessionSimple and add test for the TABLE_REMOVED message
6849     (TestSessionBase.setUp): Also subscribe to TABLE_REMOVED
6850     (TestSessionSimple.test_unreferenced_tables) New. Test for the
6851     UnreferencedTables method.
6852     (UnreferencedTablesTests): New. Class with some more sophisticated
6853     tests for UnreferencedTables.
6854    
6855 frank 1065 2003-05-27 Frank Koormann <[email protected]>
6856    
6857 frank 1067 * Thuban/UI/tableview.py (QueryTableFrame.__init__): The "_S_election"
6858     display has some unwanted side effects. Removed again.
6859    
6860     2003-05-27 Frank Koormann <[email protected]>
6861    
6862 frank 1065 * Resources/Bitmaps/legend_icon_layer.xpm: New, icon for legend.
6863    
6864     * Thuban/UI/legend.py (LegendTree.__FillTree): Use "legend_icon_layer"
6865    
6866 jan 1062 2003-05-27 Jan-Oliver Wagner <[email protected]>
6867    
6868 bh 1069 * test/test_menu.py (MenuTest.test): Added test for
6869     Menu.RemoveItem().
6870 jan 1062
6871 bh 1069 * Thuban/UI/menu.py (Menu.RemoveItem): New. Remove an item from
6872     the menu.
6873 jan 1062
6874 frank 1059 2003-05-27 Frank Koormann <[email protected]>
6875    
6876     Nonmodal dialogs without parent (i.e. they can fall behind the main
6877     window)
6878    
6879     * Thuban/UI/mainwindow.py (MainWindow.OnClose): Explicitly destroy
6880     all dialogs in the dialogs dictionary and the canvas.
6881    
6882     * Thuban/UI/dialogs.py (NonModalNonParentDialog): New class, without
6883     parent, i.e. can fall behind other windows.
6884     (NonModalDialog.OnClose): Check is dialog is in mainwindow.dialog
6885     dictionary before removing it.
6886    
6887     * Thuban/UI/classifier.py: Dialog derived from NonModalNonParentDialog
6888    
6889     * Thuban/UI/projdialog.py: Dialog derived from NonModalNonParentDialog
6890     * Thuban/UI/tableview.py: Dialog derived from NonModalNonParentDialog
6891     * Thuban/UI/tree.py: Dialog derived from NonModalNonParentDialog
6892    
6893 bh 1053 2003-05-27 Bernhard Herzog <[email protected]>
6894    
6895 bh 1055 * Thuban/UI/mainwindow.py (MainWindow.ShowTableView): New. Open a
6896     tableview dialog
6897     (MainWindow.TableShow): Use ShowTableView to open the dialogs.
6898     Also, don't use the table's titles as the dialog names. The titles
6899     aren't guaranteed to be unique.
6900     (MainWindow.TableOpen): Open a table view dialog after opening the
6901     table
6902    
6903     2003-05-27 Bernhard Herzog <[email protected]>
6904    
6905 bh 1053 * Thuban/UI/mainwindow.py: Remove the Table/Hide menu item. Its
6906     effect can be achieved by simply closing the window showing the
6907     table.
6908     (MainWindow.TableHide): Removed.
6909     (main_menu): Removed "table_hide"
6910    
6911 frank 1051 2003-05-27 Frank Koormann <[email protected]>
6912    
6913     Fix legend tree display problems under Win32
6914    
6915     * Thuban/UI/legend.py: BMP_SIZE_W = 15
6916     (LegendTree.__FillTree): Display "legend_icon_map.xpm" with layer title.
6917     (LegendTree.__FillTreeLayer): Explicitely set SelectedImage.
6918    
6919     * Resources/Bitmaps/legend_icon_map.xpm: New icon for legend.
6920    
6921 jan 1048 2003-05-27 Jan-Oliver Wagner <[email protected]>
6922    
6923     * Thuban/UI/menu.py (Menu.InsertSeparator): Additional optional parameter
6924     'after' now allows to insert separators almost anywhere in the menu.
6925    
6926 frank 1046 2003-05-27 Frank Koormann <[email protected]>
6927    
6928     * Thuban/UI/tableview.py (QueryTableFrame.__init__): Underline the
6929     "S" of selection box label to hint on hot key (Alt-S). Works under
6930     Win32 but is ignored under GTK.
6931    
6932     2003-05-26 Frank Koormann <[email protected]>
6933    
6934     * Thuban/UI/projdialog.py (ProjFrame.__do_layout, ProjPanel._DoLayout):
6935     Center Choices.
6936    
6937 bh 1038 2003-05-26 Bernhard Herzog <[email protected]>
6938    
6939 bh 1044 Remove the Precision methods again. They're too DBF specific to be
6940     part of the table interface and they're only used in table_to_dbf
6941     anyway.
6942    
6943     * Thuban/Model/transientdb.py (TransientTableBase.Width):Use a
6944     fixed precision of 12 for doubles.
6945     (TransientTableBase.Precision): Removed
6946     (AutoTransientTable.Width): Delegate to self.table.
6947    
6948     * Thuban/Model/table.py (DBFTable.Precision)
6949     (MemoryTable.Precision): Removed.
6950     (MemoryTable.Width): Use a fixed precision of 12 for doubles.
6951     (table_to_dbf): Use a fixed precision of 12 for floats unless the
6952     column object specifies something else.
6953    
6954     * test/test_dbf_table.py (TestTableToDBF.test_table_to_dbf): New.
6955     test for table_to_dbf
6956    
6957     2003-05-26 Bernhard Herzog <[email protected]>
6958    
6959     * test/test_transientdb.py
6960     (TestTransientTable.run_iceland_political_tests): Fix a comment.
6961    
6962     2003-05-26 Bernhard Herzog <[email protected]>
6963    
6964 bh 1038 * Thuban/UI/mainwindow.py (MainWindow.TableOpen): Real
6965     implementation. Mark parts of the file format strings for
6966     localization.
6967    
6968     * Thuban/Model/session.py (Session.OpenTableFile): New. Open a dbf
6969     file and add the table to the tables managed by the session
6970    
6971 bh 1040 * test/test_session.py (TestSessionSimple.test_open_table_file):
6972     New. test case for OpenTableFile
6973    
6974 jan 1033 2003-05-26 Jan-Oliver Wagner <[email protected]>
6975    
6976 jan 1035 * Thuban/UI/controls.py, Thuban/UI/identifyview.py, Thuban/UI/join.py,
6977     Thuban/UI/labeldialog.py, Thuban/UI/mainwindow.py,
6978     Thuban/UI/proj4dialog.py, Thuban/UI/tableview.py, Thuban/UI/view.py:
6979     Replace the true/false of wxWindows by True/False of Python 2.2.1.
6980    
6981     2003-05-26 Jan-Oliver Wagner <[email protected]>
6982    
6983 bh 1038 * Thuban/UI/tableview.py (LayerTableFrame.__init__): If there is
6984     already a selection present, update the grid accordingly.
6985 jan 1033
6986     * Thuban/UI/mainwindow.py (MainWindow.TableShow): Make the dialog
6987     resizeable and increase its initial size.
6988    
6989 frank 1030 2003-05-26 Frank Koormann <[email protected]>
6990    
6991     Table export functionality
6992    
6993     * Thuban/Model/table.py (DBFTable.Width, MemoryTable.Width):
6994     Return width (in characters) for a column.
6995     (DBFTable.Precision, MemoryTable.Precision): Return decimal precision.
6996     (table_to_dbf): Write table to dbf file.
6997     (table_to_csv): Write table to csv file.
6998    
6999     * Thuban/Model/transientdb.py (TransientTableBase.Width,
7000     TransientTableBase.Precision): Return column width and precision.
7001    
7002     * Thuban/UI/tableview.py (QueryTableFrame.OnSaveAs): Call table_to_dbf
7003     or table_to_csv depending on file selection.
7004    
7005     * test/test_dbf_table.py:
7006     Test table_to_dbf (extension of former part of test).
7007    
7008     * test/test_csv_table.py:
7009     Test table_to_csv.
7010    
7011 jan 1021 2003-05-23 Jan-Oliver Wagner <[email protected]>
7012    
7013 jan 1024 * Thuban/UI/join.py (JoinDialog.OnJoin): Use _() for strings.
7014     Use QueryTableFrame instead of TableFrame.
7015 jan 1021
7016 jan 1024 * Thuban/UI/mainwindow.py (MainWindow.LayerShowTable): Prefix the
7017     table window with 'Layer Table:' instead of 'Table:'.
7018    
7019     2003-05-23 Jan-Oliver Wagner <[email protected]>
7020    
7021     Give all tables a title via mix-in TitledObject.LayerShowTable
7022    
7023 jan 1021 * Thuban/Model/base.py (TitledObject.SetTitle): Call method 'issue'
7024     only if it exists.
7025    
7026     * Thuban/Model/table.py (DBFTable, MemoryTable): mix-in TitledObject
7027     and call its init-method with a default title. Remove Title() method.
7028    
7029     * Thuban/Model/transientdb.py (TransientTable, TransientJoinedTable,
7030     AutoTransientTable): mix-in TitledObject and call its init-method with
7031     a default title. Remove Title() method.
7032    
7033 bh 1017 2003-05-23 Bernhard Herzog <[email protected]>
7034    
7035     * Thuban/Model/session.py (Session.AddShapeStore): Define
7036     AddShapeStore analogously to AddTable.
7037    
7038     * test/test_session.py (TestSessionSimple.test_add_shapestore):
7039     New. Test for AddShapeStore
7040    
7041 jan 1015 2003-05-23 Jan-Oliver Wagner <[email protected]>
7042    
7043     Introducing QueryTableFrame and a very coarse ShowTable implementation.
7044    
7045     * Thuban/UI/tableview.py (LayerTableFrame, QueryTableFrame): Split the
7046     class LayerTableFrame into two classes, LayerTableFrame and QueryTableFrame.
7047     The latter implements the selection GUI without dependency on a layer.
7048     LayerTableFrame now is derived from QueryTableFrame and connects
7049     to a layer.
7050    
7051     * Thuban/UI/mainwindow.py (MainWindow.TableShow): A very coarse
7052     implementation that still needs work.
7053    
7054     * Thuban/Model/layer.py (Layer.TreeInfo): Added filename.
7055    
7056 frank 1011 2003-05-22 Frank Koormann <[email protected]>
7057    
7058     * Thuban/Model/transientdb.py (TransientJoinedTable.__init__):
7059     Added "outer_join = False" as optional parameter.
7060     (TransientJoinedTable.create): If outer join is true, perform a
7061     "LEFT OUTER JOIN" instead of "JOIN", which preserves all records of
7062     the left table. Records not matching are filled with 0 / None.
7063    
7064     * Thuban/UI/join.py (JoinDialog.__init__): Checkbox for outer join.
7065     (JoinDialog.OnJoin): Consider outer join check box.
7066    
7067 bh 1006 2003-05-22 Bernhard Herzog <[email protected]>
7068    
7069 bh 1008 * Thuban/UI/join.py (JoinDialog.OnJoin): Use exc_info in a
7070     somewhat safer way. Storing the traceback in a local variable can
7071     lead to memory leaks
7072    
7073     2003-05-22 Bernhard Herzog <[email protected]>
7074    
7075 bh 1006 * Thuban/UI/join.py (JoinDialog.OnJoin): Make sure to really call
7076     the wxMessageDialog's Destroy() method.
7077    
7078 frank 1004 2003-05-22 Frank Koormann <[email protected]>
7079    
7080     * Thuban/UI/join.py (JoinDialog.__init__): Make use of
7081     TransientTable.Title()
7082    
7083     2003-05-22 Frank Koormann <[email protected]>
7084    
7085     Join Dialog, initial version.
7086    
7087     * Thuban/UI/mainwindow.py (MainWindow.TableJoin): Removed print.
7088    
7089     * Thuban/UI/join.py (JoinDialog): Functional implementation of
7090     former framework. Renamed Table1/Table2 to LeftTable/RightTable
7091     in all occurences.
7092    
7093     * Thuban/Model/transientdb.py (TransientJoinedTable.__doc__):
7094     Typo fixed.
7095    
7096 bh 995 2003-05-22 Bernhard Herzog <[email protected]>
7097    
7098 bh 999 Give the tables titles so that the GUI can display more meaningful
7099     names. For now the titles are fixed but depend on e.g. filenames
7100     or the titles of the joined tables.
7101    
7102     * Thuban/Model/transientdb.py (TransientTable.Title)
7103     (TransientJoinedTable.Title, AutoTransientTable.Title): New.
7104    
7105     * Thuban/Model/table.py (DBFTable.Title, MemoryTable.Title): New.
7106    
7107     * test/test_transientdb.py
7108     (TestTransientTable.test_auto_transient_table_title): New. Test
7109     for the Title method
7110     (TestTransientTable.test_transient_joined_table)
7111     (TestTransientTable.test_transient_table): Add test for the Title
7112     methods
7113    
7114     * test/test_memory_table.py (TestMemoryTable.test_title): New.
7115     Test for the Title method
7116    
7117     * test/test_dbf_table.py (TestDBFTable.test_title): New. Test for
7118     the Title method
7119    
7120     2003-05-22 Bernhard Herzog <[email protected]>
7121    
7122 bh 997 * test/test_layer.py (TestLayer.setUp, TestLayer.tearDown):
7123     Provide a better way to destroy the layers
7124     (TestLayer.test_base_layer, TestLayer.test_arc_layer)
7125     (TestLayer.test_point_layer, TestLayer.test_empty_layer)
7126     (TestLayer.test_polygon_layer, TestLayer.test_get_field_type): Use
7127     the new way to destroy the layers.
7128     (TestLayer.test_derived_store): New. Test for using a layer with a
7129     DerivedShapeStore
7130    
7131     * Thuban/Model/layer.py (Layer.SetShapeStore): Only set the
7132     filename if the shape store actually has one.
7133    
7134     2003-05-22 Bernhard Herzog <[email protected]>
7135    
7136 bh 995 * Thuban/Model/table.py (DBFTable.FileName): New. Accessor method
7137     for the filename
7138    
7139     * test/test_dbf_table.py (TestDBFTable.test_filename): New. Test
7140     for the FileName method
7141     (TestDBFTableWriting.test_write): Fix spelling of filename
7142    
7143 tkoester 993 2003-05-22 Thomas Koester <[email protected]>
7144    
7145     * Thuban/Model/range.py, test/test_range.py: Brought over new Range
7146     from SciParam that now really is immutable.
7147    
7148 frank 992 2003-05-22 Frank Koormann <[email protected]>
7149    
7150     Layer Top/Bottom placement added to legend.
7151    
7152     * Thuban/UI/legend.py
7153     (LegendPanel._OnMoveTop(), LayerPanel._OnMoveBottom): New, methods
7154     bound to tool events.
7155     (LegendTree.MoveCurrentItemTop(), LegendTree.MoveCurrentItemBottom):
7156     New, methods binding the event methods with the map methods.
7157    
7158     * Thuban/Model/map.py (Map.TopLayer(), Map.BottomLayer()): New, place
7159     layer at top/bottom of layer stack.
7160    
7161     * Resources/Bitmaps/top_layer.xpm: New button icon.
7162    
7163     * Resources/Bitmaps/bottom_layer.xpm: New button icon.
7164    
7165 bh 988 2003-05-22 Bernhard Herzog <[email protected]>
7166    
7167     * Thuban/Model/session.py (Session.RemoveTable): New method to
7168     remove tables
7169    
7170     * test/test_session.py (TestSessionSimple.test_remove_table): New.
7171     Test for RemoveTable
7172    
7173 tkoester 986 2003-05-22 Thomas Koester <[email protected]>
7174    
7175     * Thuban/Model/classgen.py: Added short module doc string and CVS id.
7176     (ClassGenerator.GenUniformDistribution): Use new Range __init__, too.
7177    
7178 bh 983 2003-05-22 Bernhard Herzog <[email protected]>
7179    
7180 bh 985 Implement a way to discover dependencies between tables and
7181     shapestores.
7182    
7183     * Thuban/Model/transientdb.py (TransientTableBase.Dependencies)
7184     (TransientJoinedTable.Dependencies)
7185     (AutoTransientTable.SimpleQuery): New. Implement the dependencies
7186     interface
7187     (TransientJoinedTable.__init__): Keep tack of the original table
7188     objects in addition to the corresponding transient tables.
7189    
7190     * Thuban/Model/table.py (DBFTable.Dependencies)
7191     (MemoryTable.Dependencies): New. Implement the dependencies
7192     interface
7193    
7194     * Thuban/Model/data.py (ShapeTable): New. Helper class for
7195     ShapefileStore
7196     (ShapefileStore.__init__): Use ShapeTable instead of
7197     AutoTransientTable
7198     (ShapefileStore.Table, ShapefileStore.Shapefile): Add doc-strings
7199     (ShapefileStore.FileName, ShapefileStore.FileType): New. Accessor
7200     methods for filename and type
7201     (ShapefileStore.Dependencies): New. Implement the dependencies
7202     interface
7203     (DerivedShapeStore): New class to replace SimpleStore. The main
7204     difference to SimpleStore is that it depends not on a shapefile
7205     but another shapestore which expresses the dependencies a bit
7206     better
7207     (SimpleStore.__init__): Add deprecation warning.
7208    
7209     * test/test_dbf_table.py (TestDBFTable.test_dependencies): New.
7210     Test for the Dependencies method.
7211    
7212     * test/test_memory_table.py (TestMemoryTable.test_dependencies):
7213     New. Test for the Dependencies method.
7214    
7215     * test/test_transientdb.py
7216     (TestTransientTable.test_auto_transient_table_dependencies): New.
7217     Test for the Dependencies method.
7218     (TestTransientTable.test_transient_joined_table): Add test for the
7219     Dependencies method.
7220    
7221     * test/test_session.py (TestSessionSimple.setUp)
7222     (TestSessionSimple.tearDown): New. Implement a better way to
7223     destroy the sessions.
7224     (TestSessionSimple.test_initial_state)
7225     (TestSessionSimple.test_add_table): Bind session to self.session
7226     so that it's destroyed by tearDown
7227     (TestSessionSimple.test_open_shapefile): New. Test for
7228     OpenShapefile and the object it returns
7229    
7230     2003-05-22 Bernhard Herzog <[email protected]>
7231    
7232 bh 983 * Thuban/Model/session.py (Session.AddTable): New method to
7233     register tables with the session.
7234     (Session.Tables): Return the tables registered with AddTable too.
7235    
7236     * test/test_session.py (TestSessionSimple.test_add_table): New.
7237     Test case for the AddTable method
7238    
7239 frank 981 2003-05-22 Frank Koormann <[email protected]>
7240    
7241     UI polishing updates: Place main buttons (OK, Cancel, etc) in the
7242     lower right corner, center labels for selections, initialize controls
7243     in reasonable order for keyboard navigation.
7244    
7245     * Thuban/UI/projdialog.py (ProjFrame.__init__, ProjFrame.__doLayout)
7246     (ProjFrame.__DoOnProjAvail): Determine position of current projection
7247     using the wxListBox.FindString() method. Still a problem (#1886)
7248    
7249     * Thuban/UI/classifier.py
7250     (Classifier.__init__, SelectPropertiesDialog.__init__)
7251    
7252     * Thuban/UI/classgen.py (ClassGenDialog.__init__,
7253     (ClassGenDialog.__DoOnGenTypeSelect): Moved initialization of the
7254     different classification types from here to __init__.
7255     (GenUniquePanel.__init__): Set the column width of the first field
7256     in the Field ListCtrl to the full width.
7257    
7258     * Thuban/UI/tableview.py (LayerTableFrame.__init__): Rename 'Save As'
7259     Button to 'Export'. Center Buttons in Selection Box, set Focus to
7260     Grid.
7261     (LayerTableFrame.OnKeyDown()): New, bound to the grid with EVT_KEY_DOWN,
7262     changes focus to the Selection when pressing "Alt-S".
7263    
7264     * Thuban/UI/legend.py (LegendTree.__SetVisibilityStyle): Only gray out
7265     the text if not visible. The italic font sometimes exceeds the
7266     rendering area.
7267    
7268 jonathan 972 2003-05-21 Jonathan Coles <[email protected]>
7269 jonathan 971
7270 jonathan 975 * Thuban/UI/dock.py (DockFrame): Rename references to _OnClose
7271     to OnClose so that Thuban closes correctly.
7272    
7273     * Thuban/UI/mainwindow.py (MainWindow.OnClose): Call
7274     DockFrame.OnClose, not DockFrame._OnClose.
7275    
7276     2003-05-21 Jonathan Coles <[email protected]>
7277    
7278 jonathan 971 * Thuban/Model/classgen.py (ClassGenerator.GenQuantiles): Remove
7279     references to 'inf' and use new Range __init__ to pass floats
7280     directly rather than converting them to strings first.
7281     Fixes RTBug #1876.
7282    
7283     * Thuban/Model/classification.py (ClassGroupRange.SetRange):
7284     Use new Range ___init__ to pass floats.
7285    
7286     * Thuban/Model/layer.py (RasterLayer.__init__): Test if the
7287     filename is a valid image file. Throw IOError otherwise.
7288    
7289     * Thuban/Model/range.py: Brought over new Range from SciParam that
7290     is immutable and has an __init__ which can accept floats.
7291    
7292     * Thuban/UI/mainwindow.py (MainWindow.AddLayer): Move OpenShapefile
7293     into try block. AddLayer doesn't throw any exceptions anymore.
7294     (MainWindow.AddRasterLayer): Move constructor of RasterLayer into
7295     try block.
7296    
7297     * Thuban/UI/projdialog.py (GeoPanel.__init__): Put Degrees as
7298     the first item in choices. Fixes RTBug #1882.
7299    
7300     * Thuban/UI/renderer.py (MapRenderer.render_map): Check if scale
7301     has gone to 0 which is a serious problem. abort.
7302     (MapRenderer.draw_raster_layer): Catch IOError seperately and
7303     print the error from GDAL.
7304    
7305     * Thuban/UI/tableview.py (TableGrid.__init__): Call
7306     ToggleEventListeners to turn on listening.
7307     (TableGrid.ToggleEventListeners): New. Turns event listening on
7308     and off so as to prevent excessive messages.
7309     (LayerTableFrame.OnQuery): Use TableGrid.ToggleEventListeners
7310     to suppress excessive messages when selecting many rows.
7311     Fixes RTBug #1880.
7312    
7313     * Thuban/UI/view.py: Added checks against if scale == 0. This
7314     is a serious problem that can occur when an image without
7315     geo data is loading and causes the map projection bounds to
7316     go to infinity. Right now, the solution is to simply try
7317     to recover.
7318    
7319     * extensions/thuban/cpl_mfile.cpp (MFILEClose): Make sure
7320     to set the MFILEReceiver attributes even if the data is NULL.
7321    
7322     * extensions/thuban/gdalwarp.cpp: Improved the error handling
7323     and passed GDAL messages back up to the Python layer. Also
7324     tried to fix some memory leaks that were present in the original
7325     utility but didn't matter because the program aborted.
7326    
7327     * test/test_range.py: Copied over tests from SciParam. Removed
7328     tests against importing. Fixes RTBug #1867.
7329    
7330 bh 958 2003-05-21 Bernhard Herzog <[email protected]>
7331    
7332     * test/test_load.py: Remove unused imports and restructure the
7333     test code
7334     (LoadSessionTest): Split into one class for each test and turn
7335     LoadSessionTest itself into the base class for all such session
7336     tests.
7337     (ClassificationTest): New base class for load tests that test
7338     classifications
7339     (TestSingleLayer, TestLayerVisibility, TestClassification)
7340     (TestLabels, TestLayerProjection, TestRasterLayer): New classes
7341     for the individual tests
7342    
7343     * test/support.py (FileLoadTestCase.filename): New base class for
7344     file loading tests
7345    
7346 jan 955 2003-05-21 Jan-Oliver Wagner <[email protected]>
7347    
7348     * Resources/Projections/defaults.proj: Renamed 'Universal Transverse
7349     Mercator' to 'UTM Zone 32' as a more convenient example.
7350     Added 'Gauss Krueger Zone 6'.
7351    
7352     * Data/iceland_sample_raster.thuban: political polygon now
7353     filled transparent to have the raster image visible at once.
7354    
7355 frank 952 2003-05-21 Frank Koormann <[email protected]>
7356    
7357     * Thuban/UI/mainwindow.py (MainWindow): Renamed _OnClose() back to
7358     OnClose() to keep in sync with extensions. Internally Thuban
7359     still uses "underscored" names.
7360    
7361 jonathan 949 2003-05-20 Jonathan Coles <[email protected]>
7362    
7363     This puts back Raster layer support. These layers support projections
7364     through the GDAL library. Currently, the CVS version is being used.
7365     There are no Debian packages available although this may change soon.
7366     A GDAL driver was extended to support writing to memory rather to
7367     files.
7368    
7369     There is still some work that needs to be done, such as some error
7370     handling when loading invalid images or when there is a problem
7371     projecting the image. This putback simply checks in the majority
7372     of the work.
7373    
7374     * setup.py: Add gdalwarp library extension.
7375    
7376     * Thuban/Model/layer.py (BaseLayer.HasClassification): New.
7377     Defaults to False, but can be overridden by subclasses if they
7378     support classification.
7379     (RasterLayer): New. Defines a new layer that represents an
7380     image.
7381    
7382     * Thuban/Model/load.py (SessionLoader.__init__): Add rasterlayer
7383     tag handler.
7384     (SessionLoader.start_layer): Encode the filename.
7385     (SessionLoader.start_rasterlayer, SessionLoader.end_rasterlayer):
7386     New. Supports reading a rasterlayer tag.
7387    
7388     * Thuban/Model/map.py (Map.BoundingBox): Fix typo in comment.
7389    
7390     * Thuban/Model/save.py (XMLWriter.encode): Don't assume that we
7391     get a string in Latin1. If we get such as string convert it to
7392     unicode first, otherwise leave if alone before encoding.
7393     (SessionSaver.write_layer): Add support for writing both Layers
7394     and RasterLayers.
7395    
7396     * Thuban/Model/transientdb.py (AutoTransientTable.SimpleQuery):
7397     The right argument may not be a string, it could also be a Column.
7398    
7399     * Thuban/UI/application.py (ThubanApplication.CreateMainWindow):
7400     Make initial window size 600x400. Fixes RTBug #1872.
7401    
7402     * Thuban/UI/classifier.py (Classifier.__init__): Rearrange how
7403     the dialog is constructed so that we can support layers that
7404     do not have classifications.
7405     (Classifier._OnTry): Only build a classification if the layer
7406     supports one.
7407    
7408     * Thuban/UI/legend.py: Change all checks that a layer is an
7409     instance of Layer into checks against BaseLayer.
7410     (LegendTree.__FillTreeLayer): Only add children to a branch if
7411     the layer supports classification.
7412    
7413     * Thuban/UI/mainwindow.py (MainWindow.NewSession,
7414     MainWindow.OpenSession): Don't proceed with an action if the
7415     user chooses Cancel when they are asked to save changes.
7416     (MainWindow.AddRasterLayer): New. Open a dialog to allow the
7417     user to select an image file. Create a new RasterLayer and add
7418     it to the map.
7419    
7420     * Thuban/UI/renderer.py (MapRenderer.render_map): Add support
7421     for rendering RasterLayer layers.
7422     (MapRenderer.draw_raster_layer): Actually method that calls
7423     the GDALWarp python wrapper and constructs an image from the
7424     data returned.
7425    
7426     * Thuban/UI/tableview.py (LayerTableFrame.__init__): Change the
7427     Choices symbols to match those used in the table query method.
7428     Replace deprecated method calls on table with new method names.
7429    
7430     * Thuban/UI/view.py (MapCanvas.set_view_transform): Try to limit
7431     how small the scale can get. This still needs more testing.
7432    
7433     * extensions/thuban/bmpdataset.cpp: New, but copied from GDAL.
7434     Provides a driver to output in .bmp format.
7435    
7436     * extensions/thuban/cpl_mfile.cpp, extensions/thuban/cpl_mfile.h:
7437     New. Provides IO routines which write to memory, rather than a file.
7438    
7439     * extensions/thuban/gdalwarp.cpp: New, but basically a direct copy
7440     of the gdalwarp utility provided in GDAL. Added function calls
7441     that can be accessed from python.
7442    
7443     * Data/iceland_sample_raster.thuban: New. Sample file that uses
7444     a raster layer.
7445    
7446     * Data/iceland/island.tfw, Data/iceland/island.tif: New. Raster
7447     layer image data.
7448    
7449     * Doc/thuban.dtd: Added rasterlayer attribute definition.
7450    
7451     * test/test_layer.py, test/test_load.py, test/test_save.py: Added
7452     tests associated with the raster layer code.
7453    
7454     * test/test_transientdb.py
7455     (TestTransientTable.test_auto_transient_table_query): Added a test
7456     for using a Column object as the "right" parameter to a query.
7457    
7458 frank 924 2003-05-19 Frank Koormann <[email protected]>
7459    
7460 frank 927 * Thuban/version.py (get_changelog_date):
7461     Catch exceptions if ChangeLog does not exist.
7462    
7463     * Thuban/UI/view.py (MapCanvas.Export): Bugfix
7464    
7465     2003-05-19 Frank Koormann <[email protected]>
7466    
7467 frank 924 Extended version information for Thuban
7468    
7469     * Thuban/version.py: New, version information for Thuban: Last
7470     modification date and last ChangeLog entry date.
7471    
7472     * Thuban/UI/mainwindow.py (MainWindow.About()): Extended version
7473     information: Display Thuban, wxPython and Python version.
7474    
7475 bh 919 2003-05-16 Bernhard Herzog <[email protected]>
7476    
7477 bh 921 * Thuban/Model/save.py: Remove some unused imports including the
7478     __future__ import for nested_scopes as Thuban relies on Python 2.2
7479     now.
7480     (XMLWriter.encode): Remove the special case for a None argument.
7481     In the saver encode is always called with a string argument.
7482    
7483     2003-05-16 Bernhard Herzog <[email protected]>
7484    
7485 bh 919 * Thuban/UI/__init__.py: Remove the work-around for the locale bug
7486     in wxPython (at least when usinvg wxGTK) prior to 2.4. The symptom
7487     of the bug was that e.g. float("1.2") would fail. Thuban now
7488     requires 2.4.x.
7489    
7490 frank 917 2003-05-16 Frank Koormann <[email protected]>
7491    
7492     Printing enhancement and WMF export (under Win32)
7493    
7494     * Thuban/UI/renderer.py (ExportRenderer): New, derived from
7495     ScreenRenderer. Renders Map, Legend and Scalebar for export.
7496     (PrinterRenderer): New, derived from ExportRenderer. Replaces the old
7497     PrintRender.
7498    
7499     * Thuban/UI/view.py (MapPrintout.__init__): Enhanced parameter set
7500     to fullfil information needed for PrinterRenderer.
7501     (MapCanvas.Export): New. Export Map (currently only to WMF on Win32).
7502     (MapCanvas.Print): Adapted to new MapPrintout.
7503     (OutputTransform): General calculations to transform from canvas
7504     coordinates to export/printing devices.
7505    
7506     * Thuban/UI/mainwindow.py (MainWindow.ExportMap()): New. Added also
7507     new method_command to call ExportMap, with platform dependency (only
7508     __WXMSW__)
7509    
7510     * Thuban/UI/scalebar.py (ScaleBar.DrawScaleBar): Position and Size
7511     of scalebar drawing area as new parameters.
7512    
7513     * Thuban/Model/scalebar.py (roundInterval): round long instead of int
7514    
7515     * Thuban/UI/legend.py (ScalebarBitmap.__SetScale):
7516     Update to extended scalebar.DrawScalebar header.
7517    
7518     * test/test_export.py: New, test Thuban.UI.view.OutputTransform()
7519    
7520     * test/test_scalebar.py: Made test executable as standalone.
7521    
7522 bh 908 2003-05-16 Bernhard Herzog <[email protected]>
7523    
7524     * Thuban/Model/table.py (Table): Remove this compatibility alias
7525     for DBFTable.
7526    
7527     * test/test_table.py: Import DBFTable as Table because that alias
7528     doesn't exist anymore.
7529    
7530     * Thuban/UI/classgen.py: Remove some unused imports
7531    
7532 jonathan 906 2003-05-14 Jonathan Coles <[email protected]>
7533    
7534     * Thuban/Model/classgen.py (ClassGenerator.GenSingletonsFromList):
7535     Fix docstring.
7536     (ClassGenerator.GenUniformDistribution): Fix spelling of method name.
7537     (ClassGenerator.GenQuantiles): Use the left/right brackets and min/max
7538     values of the supplied range to determine the beginning and end
7539     bounds of the generated classes.
7540    
7541     * Thuban/Model/range.py (Range.number_re): Now accepts floats that
7542     do not have a leading 0 (.5 is now accepted as well as 0.5).
7543    
7544     * Thuban/UI/classgen.py (ClassGenDialog.OnOK): Fix name of method
7545     call to ClassGenerator.GenUniformDistribution.
7546    
7547     * Thuban/UI/projdialog.py (ProjFrame.__do_layout): Fix Windows
7548     layout bug with the 'Projection' label.
7549    
7550     * test/support.py (FloatTestCase): New. Needed for the Range tests.
7551    
7552     * test/test_range.py: New. Imported from SciParam.
7553    
7554 jonathan 897 2003-05-12 Jonathan Coles <[email protected]>
7555    
7556 jonathan 899 * Thuban/UI/classgen.py (GenQuantilesPanel.GetList): Replace call
7557     to table.UniqueValues() with calls that retrieve all the values
7558     from the table. This will need to be replaced by a method on table
7559     which can simply return the list (perhaps more efficiently).
7560    
7561     2003-05-12 Jonathan Coles <[email protected]>
7562    
7563 jonathan 897 The return value of ClassGenerator.CalculateQuantiles has changed.
7564     Refer to the documentation for details.
7565    
7566     * test/test_classgen.py: Modified Quantile tests to use the
7567     new return values.
7568    
7569     * Thuban/Model/classgen.py
7570     (ClassGenerator.GenQuantiles): Add comments describing the parameters,
7571     use new return values from CalculateQuantiles to produce the correct
7572     range bounds in the Classification.
7573     (ClassGenerator.CalculateQuantiles): Add more comments describing
7574     the return values and parameters. Make minor adjustments to improve
7575     the legibility of the code. Fix problem with adjusted not being set
7576     in most cases.
7577    
7578 frank 893 2003-05-12 Frank Koormann <[email protected]>
7579    
7580     * Thuban/Model/save.py (XMLWriter.encode()): Explicite call to unicode
7581     and latin1. Fixes #1851 finally.
7582    
7583 jonathan 889 2003-05-09 Jonathan Coles <[email protected]>
7584    
7585 jonathan 897 * test/test_classgen.py: New. Tests the Quantile algorithm.
7586    
7587     * Thuban/Model/classgen.py (ClassGenerator.CalculateQuantiles):
7588     Clean up debugging statement, add comments, fix a small bug in the
7589     returned adjusted percentiles.
7590    
7591     2003-05-09 Jonathan Coles <[email protected]>
7592    
7593 jonathan 889 Introduces Range class from SciParam into the ClassGroupRange class,
7594     and such ranges can now be saved and loaded from disk.
7595    
7596     Quantiles are now available in the Classification Generator.
7597    
7598     Initial support for building Queries on a table. Doesn't do anything
7599     but run some tests.
7600    
7601     * Thuban/Model/classification.py: Explicit imports.
7602     (ClassGroupRange): Use the Range class to store the underlying
7603     range information. The interface remains the same, except for
7604     GetRange(), and you can also supply a Range object as the min
7605     parameter to SetRange or __init__.
7606    
7607     * Thuban/Model/load.py (XMLReader.encode): New. Encodes the given
7608     string appropriately for use in Thuban. Fixes RTbug #1851.
7609     (SessionLoader.end_projection): Handle the context of the
7610     projection tag a bit better by looking at what objects are not
7611     None. There was an assumption that a projection tag for a map
7612     could occur before any layers.
7613     (SessionLoader.start_clrange): Provide backward compatibility for
7614     reading min/max values as well as the new range parameter.
7615    
7616     * Thuban/Model/map.py: Explicit imports.
7617    
7618     * Thuban/Model/resource.py: Import _.
7619     (ProjFileSaver.write): write header using projfile.dtd.
7620    
7621     * Thuban/Model/save.py: Explicit imports.
7622     (XMLWriter.encode): New. Encode the given string from a format
7623     used by Thuban into UTF-8. Fixes RTbug #1851.
7624    
7625     * Thuban/UI/classgen.py: Explicit imports.
7626     (ClassGenDialog.__init__): Clean up the code and add support
7627     for Quantiles.
7628     (ClassGenDialog.OnOK): Add support for Quantiles.
7629     (GenQuantilesPanel): New. Input panel for Quantiles.
7630     (ClassGenerator, CustomRamp, MonochromaticRamp, GreyRamp, RedRamp,
7631     GreenRamp, BlueRamp, HotToColdRamp): Move to Thuban/Model/classgen.py
7632    
7633     * Thuban/Model/classgen.py: New. Contains all the classes named above.
7634    
7635     * Thuban/UI/classifier.py: Explicit imports.
7636     (ClassTable.GetValueAsCust, ClassTable.__ParseInput,
7637     ClassTable.SetValueAsCustom): Reworked to use new Range class.
7638    
7639     * Thuban/UI/legend.py: Explicit imports.
7640    
7641     * Thuban/UI/mainwindow.py: Add support for the Join Dialog. Added
7642     a Table menu and associated method calls.
7643     (MainWindow.choose_color): Removed. No longer needed.
7644    
7645     * Thuban/UI/projdialog.py (ProjFrame.__VerifyButtons): Save button
7646     should be disabled if no projection is selected in the available
7647     list.
7648    
7649     * Thuban/UI/renderer.py: Explicit imports.
7650    
7651     * Thuban/UI/tableview.py (TableGrid.OnRangeSelect): Fix some issues
7652     with correctly selecting the rows and issuing the right events.
7653     Be sure to call Skip() to allow the grid to do some of its own
7654     handling which allows the rows to actually be selected.
7655     (LayerTableGrid.select_shapes): Rename from select_shape. Supports
7656     selecting multiple shapes.
7657     (LayerTableFrame): Support for building Queries.
7658     (LayerTableFrame.select_shapes): Allow multiple shapes to be selected.
7659    
7660     * Thuban/UI/tree.py: Explicit imports.
7661    
7662     * Thuban/UI/view.py (MapCanvas): Delegate "SelectedShapes" so the
7663     table view can call it.
7664    
7665     * test/test_classification.py: Explicit imports.
7666     (TestClassification.test_ClassGroupRange): Fix test for new
7667     Range class.
7668    
7669     * Doc/thuban.dtd: Add range parameter for clrange.
7670    
7671     * Thuban/Model/range.py: Taken from SciParam. Used as the underlying
7672     object in ClassGroupRange, and also uesd for inputting ranges in
7673     the classifer table and elsewhere.
7674    
7675     * Thuban/UI/join.py: New. Initial Join dialog. No real functionality
7676     yet.
7677    
7678 frank 872 2003-05-09 Frank Koormann <[email protected]>
7679    
7680     * Thuban/UI/scalebar.py (DrawScaleBar): Draw only if interval > 0.0.
7681    
7682 frank 860 2003-05-08 Frank Koormann <[email protected]>
7683    
7684 frank 870 Coding style updates
7685    
7686     * test/test_scalebar.py: Replaced tab indentation by spaces.
7687    
7688     * Thuban/UI/scalebar.py: Explicit imports.
7689    
7690     2003-05-08 Frank Koormann <[email protected]>
7691    
7692 frank 867 * Thuban/UI/scalebar.py
7693     (ScaleBar.DrawScalebar): Format string bug fixed.
7694    
7695     2003-05-08 Frank Koormann <[email protected]>
7696    
7697 frank 865 Reorganization of scalebar component (no wx in Thuban/Model)
7698    
7699     * Thuban/Model/scalebar.py: Rendering moved to Thuban/UI/scalebar.py
7700     (deriveInterval):
7701     Calculate scalebar interval and unit which fits in width for scale.
7702     (roundInterval): Round float.
7703    
7704     * Thuban/UI/scalebar.py (ScaleBar): Scalebar rendering
7705    
7706     * test/test_scalebar.py: Test for Thuban/Model/scalebar.py methods.
7707    
7708     * Thuban/UI/legend.py: Import Thuban.UI.scalebar
7709    
7710     2003-05-08 Frank Koormann <[email protected]>
7711    
7712 frank 860 * Thuban/UI/legend.py (ScalebarBitmap.SetCanvas):
7713     Initialize ScaleBar with canvas.map
7714    
7715     * Thuban/Model/scalebar.py (ScaleBar.roundInterval()): New,
7716     round intervals to display smarter lengths
7717     (ScaleBar.DrawScalebar): Draw Scalebar only if the map contains a
7718     layer. If the maps has no projection applied grey the scalebar.
7719    
7720 frank 857 2003-05-07 Frank Koormann <[email protected]>
7721    
7722     Basic Scalebar features added.
7723    
7724     * Thuban/Model/scalebar.py (ScaleBar): New, scalebar rendering.
7725    
7726     * Thuban/UI/legend.py (LegendPanel): Added scalebar bitmap
7727     (ScaleBarBitmap): New, links the scalebar bitmap with view messages
7728     and the renderer.
7729    
7730     * Thuban/UI/view.py (MapCanvas.set_view_transform): Issue SCALE_CHANGED.
7731    
7732     * Thuban/UI/messages.py: SCALE_CHANGED added.
7733    
7734 bh 850 2003-05-07 Bernhard Herzog <[email protected]>
7735    
7736 bh 852 * Thuban/Model/session.py (Session.__init__): New instance
7737     variable shapestores to hold a list of all open shapestore objects
7738     (Session.ShapeStores): New. Accessor method for the shapestores
7739     list.
7740     (Session._add_shapestore, Session._clean_weak_store_refs): New.
7741     Internal methods to maintain the shapestores list.
7742     (Session.Tables): New. Return all tables open in the session.
7743     (Session.OpenShapefile): Insert the new ShapeStore into the
7744     shapestores list.
7745    
7746     * test/test_session.py (TestSessionSimple.test_initial_state): Add
7747     tests for ShapeStores and Tables
7748     (TestSessionWithContent.test_shape_stores)
7749     (TestSessionWithContent.test_tables): New. Test cases for
7750     ShapeStores and Tables
7751    
7752     2003-05-07 Bernhard Herzog <[email protected]>
7753    
7754 bh 850 * Thuban/Model/transientdb.py (TransientTableBase.ReadRowAsDict):
7755     Add comments about the optimizations used.
7756     (AutoTransientTable.ReadValue, TransientTableBase.ReadValue): New.
7757     Implement the ReadValue table interface method.
7758    
7759     * test/test_transientdb.py
7760     (TestTransientTable.run_iceland_political_tests)
7761     (TestTransientTable.test_transient_joined_table): Add tests for
7762     ReadValue
7763    
7764 frank 848 2003-05-07 Frank Koormann <[email protected]>
7765    
7766     * Resources/Bitmaps/fulllayerextent.xpm,
7767     Resources/Bitmaps/fullselextent.xpm: Replaced the place holders with
7768     new icons.
7769    
7770 bh 840 2003-05-06 Bernhard Herzog <[email protected]>
7771    
7772 bh 846 * Thuban/Model/transientdb.py (AutoTransientTable.SimpleQuery):
7773     New. Simply delegate to the transient table's version.
7774    
7775     * test/test_transientdb.py
7776     (TestTransientTable.test_auto_transient_table_query): New. Test
7777     case for AutoTransientTable's SimpleQuery
7778    
7779     2003-05-06 Bernhard Herzog <[email protected]>
7780    
7781 bh 843 * Thuban/Model/transientdb.py (TransientTableBase.SimpleQuery):
7782     Implement a simple query method for the query dialog
7783     (TransientTableBase.create): Add an INTEGER PRIMARY KEY that holds
7784     the row index or shapeid.
7785     (TransientTable.create): Insert the right value of the row index
7786     (TransientJoinedTable.create): Copy the row index of the left
7787     table to the joined result table
7788    
7789     * test/test_transientdb.py
7790     (TestTransientTable.test_transient_table_read_twice): Fix
7791     doc-string
7792     (TestTransientTable.test_transient_table_query): New. Test for the
7793     SimpleQuery method
7794    
7795     2003-05-06 Bernhard Herzog <[email protected]>
7796    
7797 bh 840 Convert all table users to use the new table interface. This only
7798     covers Thuban itself, not GREAT-ER or other applications built on
7799     Thuban yet, so the compatibility interface stays in place for the
7800     time being but it now issues DeprecationWarnings.
7801    
7802     Finally, the new Table interface has a new method, HasColumn.
7803    
7804     * Thuban/Model/table.py (OldTableInterfaceMixin): All methods
7805     issue deprecation warnings when they're. The warnings refer to the
7806     caller of the method.
7807     (OldTableInterfaceMixin.__deprecation_warning): New. Helper method
7808     for the deprecation warnings
7809    
7810     * test/test_table.py: Ignore the deprecation warnings for the old
7811     table in the tests in this module. The purpose of the tests is to
7812     test the old interface, after all.
7813    
7814     * test/test_transientdb.py
7815     (TestTransientTable.run_iceland_political_tests): Use the
7816     constants for the types. Add a test for HasColumn
7817     (TestTransientTable.test_transient_joined_table): Adapt to new
7818     table interface. Add a test for HasColumn
7819     (TestTransientTable.test_transient_table_read_twice): Adapt to new
7820     table interface
7821    
7822     * Thuban/UI/tableview.py (DataTable.SetTable, DataTable.GetValue):
7823     Adapt to new table interface
7824    
7825     * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Adapt to
7826     new table interface
7827    
7828     * Thuban/UI/controls.py (RecordListCtrl.fill_list)
7829     (RecordTable.SetTable): Adapt to new table interface
7830    
7831     * Thuban/UI/classifier.py (Classifier.__init__)
7832     (Classifier.__init__): Adapt to new table interface
7833    
7834     * Thuban/UI/classgen.py (ClassGenDialog.__init__)
7835     (GenUniformPanel._OnRetrieve, GenUniquePanel._OnRetrieve): Adapt
7836     to new table interface
7837    
7838     * Thuban/Model/transientdb.py (TransientTableBase.HasColumn)
7839     (AutoTransientTable.HasColumn): Implement the new table interface
7840     method
7841     (AutoTransientTable.ReadRowAsDict, AutoTransientTable.ValueRange)
7842     (AutoTransientTable.UniqueValues): Adapt to new table interface
7843    
7844     * Thuban/Model/layer.py (Layer.SetShapeStore, Layer.GetFieldType):
7845     Adapt to new table interface
7846    
7847     * test/test_layer.py (TestLayer.open_shapefile): Helper method to
7848     simplify opening shapefiles a bit easier.
7849     (TestLayer.test_arc_layer, TestLayer.test_polygon_layer)
7850     (TestLayer.test_point_layer): Use the new helper method
7851     (TestLayer.test_get_field_type): New. Test for the GetFieldType
7852     method
7853    
7854     * test/test_dbf_table.py (TestDBFTable.test_has_column): Test for
7855     the new table method
7856    
7857     * test/test_memory_table.py (TestMemoryTable.test_has_column):
7858     Test for the new table method HasColumn
7859    
7860 jonathan 833 2003-05-06 Jonathan Coles <[email protected]>
7861    
7862     Addresses the "Selection Extent" wish of RTbug #1787.
7863    
7864     * Resources/Bitmaps/fulllayerextent.xpm,
7865     Resources/Bitmaps/fullselextent.xpm: Bitmaps for layer and selection
7866     extent. These are just place holders for the real bitmaps.
7867    
7868     * Thuban/Model/layer.py (Shape): Since a Shape is immutable only
7869     calculate the bounding box once (the first time compute_bbox() is
7870     called).
7871     (Layer.ShapesBoundingBox): New. Given a list of shape ids, return
7872     the bounding box for the shapes in lat/long coordinates.
7873    
7874     * Thuban/UI/mainwindow.py: Added new "Full selection extent" menu
7875     option.
7876     (MainWindow.has_selected_shapes): New. Returns true if there are
7877     any selected shapes.
7878     (MainWindow.FullSelectionExtent): New. Calls
7879     MapCanvas.FitSelectedToWindow() when the user selects the menu option.
7880     (_has_selected_shapes): New. Returns true if there are any
7881     selected shapes.
7882    
7883     * Thuban/UI/selection.py (Selection.HasSelectedShapes): New. Returns
7884     true if there are any selected shapes.
7885    
7886     * Thuban/UI/view.py (MapCanvas): Added delegated method
7887     HasSelectedShapes.
7888     (MapCanvas.FitSelectedToWindow): New. Centers and scales any selected
7889     shapes on the canvas using the map projection (if any).
7890    
7891     * test/test_layer.py (TestLayer.test_arc_layer): Add some tests
7892     for Layer.ShapesBoundingBox().
7893    
7894 bh 826 2003-05-06 Bernhard Herzog <[email protected]>
7895    
7896     * Resources/Projections/defaults.proj: Fix spelling of Mercator
7897    
7898 jonathan 823 2003-05-05 Jonathan Coles <[email protected]>
7899    
7900     Addresses the "Full Layer Extent" wish of RTbug #1787.
7901    
7902     * Resources/Projections/defaults.proj: Added UK National Grid.
7903    
7904     * Thuban/UI/mainwindow.py: Added new "Full layer extent" menu option.
7905     (MainWindow.FullLayerExtent): New. Calls MapCanvas.FitLayerToWindow()
7906     when the user selects the menu option.
7907    
7908     * Thuban/UI/view.py (MapCanvas.FitLayerToWindow): New. Centers and
7909     scales the given layer on the canvas using the map projection.
7910    
7911 bh 819 2003-05-05 Bernhard Herzog <[email protected]>
7912    
7913     Convert the table implementations to a new table interface. All
7914     tables use a common mixin class to provide backwards compatibility
7915     until all table users have been updated.
7916    
7917     * Thuban/Model/table.py (OldTableInterfaceMixin): Mixin class to
7918     provide backwards compatibility for table classes implementing the
7919     new interface
7920     (DBFTable, MemoryTable): Implement the new table interface. Use
7921     OldTableInterfaceMixin as base for compatibility
7922     (DBFColumn, MemoryColumn): New. Column description for DBFTable
7923     and MemoryTable resp.
7924    
7925     * test/test_dbf_table.py: New. Test cases for the DBFTable with
7926     the new table interface.
7927    
7928     * test/test_memory_table.py: New. Test cases for the MemoryTable
7929     with the new table interface.
7930    
7931     * test/test_table.py: Document the all tests in this file as only
7932     for backwards compatibility. The equivalent tests for the new
7933     interface are in test_memory_table.py and test_dbf_table.py
7934     (MemoryTableTest.test_read): field_info should be returning tuples
7935     with four items
7936     (MemoryTableTest.test_write): Make doc-string a more precise.
7937    
7938     * Thuban/Model/transientdb.py (TransientTableBase): Convert to new
7939     table interface. Derive from from OldTableInterfaceMixin for
7940     compatibility.
7941     (TransientTableBase.create): New intance variable column_map to
7942     map from names and indices to column objects
7943     (TransientTable.create): Use the new table interface of the input
7944     table
7945     (AutoTransientTable): Convert to new table interface. Derive from
7946     from OldTableInterfaceMixin for compatibility.
7947     (AutoTransientTable.write_record): Removed. It's not implemented
7948     yet and we still have to decide how to handle writing with the new
7949     table and data framework.
7950    
7951     * test/test_transientdb.py
7952     (TestTransientTable.run_iceland_political_tests)
7953     (TestTransientTable.test_transient_joined_table): Use the new
7954     table interface
7955    
7956 jonathan 817 2003-05-05 Jonathan Coles <[email protected]>
7957    
7958     This is namely a collection of UI updates to improve user interactivity.
7959     Tabbing between controls now exists and you can use ESC to close dialog
7960     boxes; ENTER will active the default button.
7961    
7962     * Thuban/UI/classgen.py (ClassGenDialog.__init__): Rearrange the
7963     order that the controls are created so that tabbing works correctly.
7964     (ClassGenDialog.OnOK): Renamed from _OnGenerate() so that the
7965     wxDialog can handle the default button correctly.
7966     (ClassGenDialog.OnCancel): Renamed from _OnCloseBtn() for the
7967     same reasons as for OnOK.
7968     (GenUniformPanel._OnRetrieve): Call wxBeginBusyCursor/wxEndBusyCursor
7969     when we ask the table for the maximum/minimum values of a field
7970     which could take a very long time.
7971    
7972     * Thuban/UI/classifier.py (Classifier.__init__): Rearrange the
7973     order that the controls are created so that tabbing works correctly.
7974     (SelectPropertiesDialog.__init__): Rearrange the order that the
7975     controls are created so that tabbing works correctly.
7976    
7977     * Thuban/UI/dialogs.py: Copied NonModalDialog box and changed it
7978     to derive from a wxDialog but behave like the original implementation
7979     which was derived from a wxFrame. wxDialog provides useful key
7980     handling functionality like ESC calling OnCancel and ENTER calling
7981     OnOK which is lost with wxFrame.
7982    
7983     * Thuban/UI/mainwindow.py: Add "..." to menu items that will open
7984     new dialogs.
7985    
7986     * Thuban/UI/projdialog.py (ProjFrame.__init__): Rearrange the
7987     order that the controls are created so that tabbing works correctly.
7988     (ProjFrame.OnApply): Renamed from _OnTry() to use wxDialog behaviour.
7989     (ProjFrame.OnOK): Renamed from _OnOK() to use wxDialog behaviour.
7990     (ProjFrame.OnCancel): Renamed from _OnClose() to use wxDialog behaviour.
7991     (ProjPanel.__init__): Add "Airy" to the list of ellipsoids so we
7992     can provide the "UK National Grid" as a default projection.
7993     (UTMPanel.__init__): Rearrange the order that the controls are
7994     created so that tabbing works correctly.
7995    
7996 bh 809 2003-05-05 Bernhard Herzog <[email protected]>
7997    
7998 bh 811 * extensions/thuban/wxproj.cpp: Fix some of the comments.
7999     (project_point): If a map projection but no layer projection is
8000     given, convert degrees to radians before applying the map
8001     projection.
8002    
8003 bh 809 * Thuban/UI/tableview.py (TableGrid.disallow_messages)
8004     (TableGrid.allow_messages): New methods to make it possible to
8005     inhibit message sending.
8006     (TableGrid.issue): Only send the message if not inhibited.
8007     (LayerTableGrid.select_shape): Use the new methods to make sure
8008     that no ROW_SELECTED message is sent while we're updating the
8009     selected rows to match the selected shapes.
8010    
8011 jan 807 2003-05-02 Jan-Oliver Wagner <[email protected]>
8012    
8013     Implementation of MemoryTable.
8014    
8015     * Thuban/Model/table.py (MemoryTable): New. Quite simple table
8016     implementation that operates on a list of tuples. All of the data
8017     are kept in the memory.
8018    
8019     * test/test_table.py (MemoryTableTest): New.
8020    
8021     * test/test_transientdb.py (SimpleTable): Removed.
8022     (TestTransientTable.test_transient_joined_table,
8023     (TestTransientTable.test_transient_table_read_twice): Replaced
8024     SimpleTable by MemoryTable.
8025    
8026 jonathan 793 2003-04-30 Jonathan Coles <[email protected]>
8027    
8028 jonathan 803 * Data/iceland_sample.thuban: Now contains correct projections
8029     for each of the layers.
8030    
8031     * Resources/Projections/defaults.proj: Geographic projection
8032     contains unit conversion parameter.
8033    
8034     2003-04-30 Jonathan Coles <[email protected]>
8035    
8036 jonathan 793 The most important part of this putback is the projection changes.
8037     It should now be possible to specify the projection that a layer
8038     is in and then specify a different projection for the map. The
8039     projection dialog has an extra parameter for a geographic projection
8040     which lets the user select if the input is in degrees or radians.
8041    
8042     * Thuban/Model/layer.py (Layer.ShapesInRegion): Fix docstring
8043     to say that the parameter is a tuple of unprojected
8044     points (which is what the callers to this method were assuming).
8045     Also, since the points are unprojected we need to projected them.
8046    
8047     * Thuban/UI/legend.py (LegendTree.MoveCurrentItemUp,
8048     LegendTree.MoveCurrentItemDown): If the layer or any of the layer's
8049     groups are selected, move the layer up/down. Fixes RTbug #1833.
8050    
8051     * Thuban/UI/mainwindow.py: Move menu item map_rename up.
8052    
8053     * Thuban/UI/projdialog.py (ProjFrame._OnSave): Add missing
8054     parameter in call to SetClientData.
8055     (GeoPanel): Add support for selecting the units that the
8056     source data is in (Radians or Degrees).
8057    
8058     * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Optimize
8059     the rendering loop by reducing the number of if's, removing the
8060     unnecessary try/except block, and checking if the old group
8061     is the same as the new one (which happens a lot if there is
8062     no classification, or lots of shapes are in the same group).
8063    
8064     * Thuban/UI/view.py (MapCanvas.OnPaint): Add a try/except block
8065     around the redraw routine to try to catch problems that the user
8066     may create by selecting invalid projections for the data set and
8067     map. Clears the display if there are any problems and prints the
8068     error.
8069     (MapCanvas.do_redraw): Use DC.Clear() instead of drawing a filled
8070     rectangle.
8071    
8072     * extensions/thuban/wxproj.cpp (project_point): First invert the
8073     supplied point (which should be in projected coordinates) using
8074     the layer's projection and then project the point using the
8075     map's projection.
8076     (project_points): Use project_point() to project each point.
8077    
8078 jan 792 2003-04-30 Jan-Oliver Wagner <[email protected]>
8079    
8080     * Thuban/Model/layer.py (Layer.SetShapeStore): Fixed a bug:
8081     don't set the Classification to None if the classfication field
8082     is None (ie only a DEFAULT).
8083    
8084 bh 786 2003-04-30 Bernhard Herzog <[email protected]>
8085    
8086 bh 790 * Thuban/UI/view.py: Fix some typos.
8087    
8088 bh 788 * Thuban/UI/mainwindow.py (MainWindow.identify_view_on_demand): Do
8089     not pop up the dialog if the selection becomes empty (this could
8090     happen if e.g. a new selection is opened while the identify tool
8091     is active and dialog had been closed)
8092    
8093     2003-04-30 Bernhard Herzog <[email protected]>
8094    
8095 bh 786 * Thuban/Model/transientdb.py (TransientTableBase.__init__): New
8096     instance variable read_record_last_result
8097     (TransientTableBase.read_record): Make sure reading the same
8098     record twice works. The implementation uses the new instance
8099     variable read_record_last_result
8100    
8101     * test/test_transientdb.py
8102     (TestTransientTable.test_transient_table_read_twice): New test
8103     case for the above bug-fix.
8104    
8105 jonathan 793 2003-04-29 Jonathan Coles <[email protected]>
8106    
8107     * Thuban/common.py: Removed. No longer needed Str2Num. RTbug #1832.
8108    
8109     * Thuban/UI/classgen.py: Remove all uses of Str2Num.
8110    
8111     * Thuban/UI/classifier.py: Remove all uses of Str2Num.
8112     (ClassTable.SetValueAsCustom): Rename keyword argument in
8113     ClassGroup* constructors to match argument name.
8114    
8115 bh 779 2003-04-29 Bernhard Herzog <[email protected]>
8116    
8117     * Thuban/Model/session.py (Session.Destroy): Explicitly close the
8118     transient DB if it exists to make sure it doesn't leave a journal
8119     file in the temp directory.
8120    
8121     * Thuban/Model/transientdb.py (TransientDatabase.close): Set
8122     self.conn to None after closing the connection to make sure it's
8123     not closed twice
8124    
8125 jonathan 767 2003-04-29 Jonathan Coles <[email protected]>
8126    
8127 jonathan 769 Add a visible parameter in the layer XML tag. The default value is
8128     "true". If anything other than "false" is specified we also assume
8129 jonathan 776 "true". Addresses RTbug #1025.
8130 jonathan 769
8131     * Doc/thuban.dtd: Add visible parameter to a layer.
8132    
8133     * Thuban/Model/layer.py (BaseLayer.__init__): Change default value
8134     of visible from 1 to True.
8135     (Layer.__init__): Change default value of visible from 1 to True.
8136    
8137     * Thuban/Model/load.py (SessionLoader.start_layer): Read visible
8138     parameter.
8139    
8140     * Thuban/Model/save.py (SessionSaver.write_layer): Save visible
8141     parameter.
8142    
8143     * test/test_load.py: Add new test data contents_test_visible.
8144     (LoadSessionTest.setUp): save test data.
8145     (LoadSessionTest.testLayerVisibility): Test if the visible flag
8146     is loaded correctly.
8147    
8148     * test/test_save.py (SaveSessionTest.testSingleLayer): Add test
8149     for saving an invisible layer.
8150    
8151     2003-04-29 Jonathan Coles <[email protected]>
8152    
8153 jonathan 767 * Thuban/UI/mainwindow.py (MainWindow.SetMap): Look up the
8154     legend dialog box and tell it to change its map to the one
8155     supplied to SetMap(). Fixes RTbug #1770.
8156    
8157 bh 764 2003-04-29 Bernhard Herzog <[email protected]>
8158    
8159 bh 766 Next step of table implementation. Introduce a transient database
8160     using SQLite that some of the data is copied to on demand. This
8161     allows us to do joins and other operations that require an index
8162     for good performance with reasonable efficiency. Thuban now needs
8163     SQLite 2.8.0 and pysqlite 0.4.1. Older versions may work but I
8164     haven't tested that.
8165    
8166     * Thuban/Model/transientdb.py: New. Transient database
8167     implementation.
8168    
8169     * test/test_transientdb.py: New. Tests for the transient DB
8170     classes.
8171    
8172     * Thuban/Model/session.py (AutoRemoveFile, AutoRemoveDir): New
8173     classes to help automatically remove temporary files and
8174     directories.
8175     (Session.__init__): New instance variables temp_dir for the
8176     temporary directory and transient_db for the SQLite database
8177     (Session.temp_directory): New. Create a temporary directory if not
8178     yet done and return its name. Use AutoRemoveDir to have it
8179     automatically deleted
8180     (Session.TransientDB): Instantiate the transient database if not
8181     done yet and return it.
8182    
8183     * Thuban/Model/data.py (ShapefileStore.__init__): Use an
8184     AutoTransientTable so that data is copied to the transient DB on
8185     demand.
8186     (SimpleStore): New class that simply combines a table and a
8187     shapefile
8188    
8189     * Thuban/Model/table.py (Table, DBFTable): Rename Table into
8190     DBFTable and update its doc-string to reflect the fact that this
8191     is only the table interface to a DBF file. Table is now an alias
8192     for DBFTable for temporary backwards compatibility.
8193    
8194     * Thuban/UI/application.py (ThubanApplication.OnExit): Make sure
8195     the last reference to the session goes away so that the temporary
8196     files are removed properly.
8197    
8198     * test/test_load.py (LoadSessionTest.tearDown): Remove the
8199     reference to the session to make sure the temporary files are
8200     removed.
8201    
8202     2003-04-29 Bernhard Herzog <[email protected]>
8203    
8204 bh 764 * Thuban/Model/load.py (XMLReader.__init__, XMLReader.read): Turn
8205     the __parser instance variable into a normal local variable in
8206     read. It's only used there and read will never be called more than
8207     once. Plus it introduces a reference cycle that keeps can keep the
8208     session object alive for a long time.
8209    
8210 jonathan 767 2003-04-29 Jonathan Coles <[email protected]>
8211 jonathan 735
8212 jonathan 762 * Thuban/Model/proj.py (Projection): Removed Set*() methods to make
8213     Projection an immutable item. Fixes RTbug #1825.
8214     (Projection.__init__): Initialize instance variables here.
8215     (ProjFile.Replace): New. Replace the given projection object with
8216     the new projection object. This solves the problem of needing the
8217     mutator Projection.SetProjection() in the ProjFrame class and
8218     allows a projection to change parameters without changing its
8219     location in the file.
8220    
8221     * Thuban/UI/mainwindow.py (MainWindow.SaveSessionAs): Dialog should
8222     be of type wxSAVE and should verify overwriting a file.
8223    
8224     * Thuban/UI/projdialog.py (ProjFrame._OnSave): Use the new
8225     ProjFile.Replace() method instead of the mutator
8226     Projection.SetProjection(). Also requires that we reassign the
8227     client data to the new projection.
8228    
8229     * test/test_proj.py (TestProjection.test): Test GetName() and
8230     GetAllParameters()
8231     (TestProjFile.test): Remove tests for Set*() methods. Add tests
8232     for Replace().
8233    
8234     2003-04-25 Jonathan Coles <[email protected]>
8235    
8236 jonathan 756 * Thuban/Model/save.py (SessionSaver.write_projection): Make sure
8237     to save the name of the projection.
8238    
8239     * test/test_save.py (SaveSessionTest.testLayerProjection): New
8240     test to verify layer projections are saved correctly.
8241    
8242     2003-04-25 Jonathan Coles <[email protected]>
8243    
8244 jonathan 753 * Thuban/Model/proj.py (Projection.SetName): Set the name
8245     to "Unknown" if name is None.
8246     (Projection.SetAllParameters): New. Set the projection's
8247     parameter list to the one supplied.
8248     (Projection.SetProjection): New. Set the projection's
8249     properties to those of the supplied Projection.
8250    
8251     * Thuban/UI/mainwindow.py (MainWindow.MapProjection): Set
8252     the dialog title to include the map's title.
8253     (MainWindow.LayerProjection): Set the dialog title to include
8254     the layer's title.
8255    
8256     * Thuban/UI/projdialog.py (ProjFrame.__ShowError): Consolidate
8257     error dialogs into a single method call.
8258     (ProjFrame.__VerifyButtons): Add more states to check.
8259     (ProjFrame.__GetProjection): Return the current state of an
8260     edited projection or None.
8261     (ProjFrame.__FillAvailList): Remove checks for states that
8262     shouldn't exist.
8263     (ProjFrame._OnNew): Clear all selected items and supply
8264     a projection panel if necessary.
8265    
8266     * test/test_proj.py (TestProjFile.test): Add tests for
8267     ProjFile.SetAllParameters, ProjFile.SetProjection,
8268     ProjFile.SetName.
8269    
8270     2003-04-25 Jonathan Coles <[email protected]>
8271    
8272 jonathan 748 * Thuban/UI/projdialog.py (ProjFrame.__FillAvailList): Now
8273     takes an optional argument to select the current projection.
8274     This does not guarantee that the item is visible due to
8275     limited wxWindows functionality. Fixes RTBug #1821.
8276    
8277     2003-04-25 Jonathan Coles <[email protected]>
8278    
8279 jonathan 743 * Thuban/Model/load.py (SessionLoader.start_projection): Remember
8280     the projection name and use it when constructing the Projection
8281     object.
8282    
8283     * Thuban/Model/proj.py (Projection.__init__): Change the default
8284     value for 'name' to None and then test if name is equal to None
8285     in the body of the constructor. This way the caller doesn't have to
8286     know what the default value should be. Namely, useful in load.py
8287     where we have to pick a default value if the 'name' parameter
8288     doesn't exist in the XML file.
8289    
8290     * test/test_load.py (LoadSessionTest.testLayerProjection): New.
8291     Tests a file where a layer has a projection.
8292    
8293     2003-04-25 Jonathan Coles <[email protected]>
8294    
8295 jonathan 735 * Thuban/Model/layer.py (Layer.TreeInfo): Add an item to the
8296     tree for projection information.
8297    
8298     * Thuban/Model/load.py (XMLReader.GetFilename): Renamed from
8299     XMLReader.GetFileName.
8300     (SessionLoader): Added support for loading projection tags that
8301     appear inside a layer.
8302    
8303     * Thuban/Model/proj.py (ProjFile): Document the class. Move
8304     back to using a list because the order of the projections in
8305     the file is important to maintain. Fixes RTbug #1817.
8306    
8307     * Thuban/Model/resource.py: Rename calls to ProjFile.GetFileName
8308     to ProjFile.GetFilename.
8309    
8310     * Thuban/Model/save.py (SessionSaver.write_layer): Save projection
8311     information.
8312    
8313     * Thuban/UI/projdialog.py (ProjFrame._OnAddToList): Renamed from
8314     ProjFrame._OnSaveAs. Removed old dead code from previous
8315     implementation.
8316     (ProjFrame._OnExport): Add support for exporting more than one
8317     projection to a single file.
8318     (ProjFrame.__FillAvailList): use string formatting (% operator)
8319     to build strings that are (partly) translated. Fixes RTbug #1818.
8320    
8321     * test/test_proj.py (TestProjFile.test): New. Tests the base ProjFile
8322     class.
8323    
8324 bh 734 2003-04-24 Bernhard Herzog <[email protected]>
8325    
8326     * po/es.po: Updated Spanish translation by Daniel Calvelo Aros
8327    
8328     * po/fr.po: New. French translation by Daniel Calvelo Aros
8329    
8330     * Thuban/UI/projdialog.py (ProjFrame._OnSaveAs): Don't translate
8331     empty strings.
8332    
8333 jonathan 735 2003-04-24 Jonathan Coles <[email protected]>
8334 jonathan 724
8335     * Thuban/Model/layer.py (Layer.GetProjection): New. Needed to
8336     implement the interface that the ProjFrame dialog expects.
8337    
8338     * Thuban/Model/proj.py (Projection.SetName): New. Allows the
8339     name of the projection to be changed.
8340     (ProjFile): Use a dictionary instead of a list so that removing
8341     projections is easier and we are sure about uniqueness.
8342     (ProjFile.Remove): Remove the given projection object.
8343    
8344     * Thuban/Model/resource.py (GetSystemProjFiles, GetUserProjFiles):
8345     Return a list with only one projection file instead of searching for
8346     any projection file. This simplifies many things if the user can
8347     only have one system file and one user file.
8348    
8349     * Thuban/UI/classgen.py: Change all references to
8350     genCombo to genChoice.
8351    
8352     * Thuban/UI/mainwindow.py: Add a Projection option under the
8353     layer menu.
8354     (MainWindow.LayerProjection): New. Open up a projection window
8355     for a layer.
8356    
8357     * Thuban/UI/projdialog.py: Large changes to how the dialog is
8358     laid out. Use three panels instead of one. One for the list of
8359     projections, one for the edit controls, and one for the buttons.
8360     Fixed resizing problems so that the dialog resizes correctly
8361     when the projection panel changes. Added import/export, save, and
8362     new buttons/functionality.
8363    
8364 bh 723 2003-04-24 Bernhard Herzog <[email protected]>
8365    
8366     First step towards table management. Introduce a simple data
8367     abstraction so that we replace the data a layer uses more easily
8368     in the next step.
8369    
8370     * Thuban/Model/data.py: New file with a simple data abstraction
8371     that bundles shapefile and dbffile into one object.
8372    
8373     * Thuban/Model/session.py (Session.OpenShapefile): New method to
8374     open shapefiles and return a shape store object
8375    
8376     * Thuban/Model/layer.py (Layer.__init__): Pass the data as a store
8377     object instead of a shapefile filename. This introduces a new
8378     instance variable store holding the datastore. For intermediate
8379     backwards compatibility keep the old instance variables.
8380     (open_shapefile): Removed. No longer needed with the shape store.
8381     (Layer.SetShapeStore, Layer.ShapeStore): New methods to set and
8382     get the shape store used by a layer.
8383     (Layer.Destroy): No need to explicitly destroy the shapefile or
8384     table anymore.
8385    
8386     * Thuban/UI/mainwindow.py (MainWindow.AddLayer)
8387     (MainWindow.AddLayer): Use the session's OpenShapefile method to
8388     open shapefiles
8389    
8390     * Thuban/Model/load.py (ProcessSession.start_layer): Use the
8391     session's OpenShapefile method to open shapefiles
8392    
8393     * test/test_classification.py
8394     (TestClassification.test_classification): Use the session's
8395     OpenShapefile method to open shapefiles and build the filename in
8396     a more platform independed way
8397    
8398     * test/test_layer.py (TestLayer.setUp, TestLayer.tearDown):
8399     Implement to have a session to use in the tests
8400     (TestLayer.test_arc_layer, TestLayer.test_polygon_layer)
8401     (TestLayer.test_point_layer, TestLayer.test_empty_layer): Use the
8402     session's OpenShapefile method to open shapefiles
8403     (TestLayerLegend.setUp): Instantiate a session so that we can use
8404     it to open shapefiles.
8405     (TestLayerLegend.tearDown): Make sure that all references to
8406     layers and session are removed otherwise we may get a resource
8407     leak
8408    
8409     * test/test_map.py (TestMapAddLayer.test_add_layer)
8410     (TestMapWithContents.setUp): Instantiate a session so that we can
8411     use it to open shapefiles.
8412     (TestMapWithContents.tearDown): Make sure that all references to
8413     layers, maps and sessions are removed otherwise we may get a
8414     resource leak
8415     ("__main__"): use support.run_tests() so that more info about
8416     uncollected garbage is printed
8417    
8418     * test/test_save.py (SaveSessionTest.testSingleLayer): Use the
8419     session's OpenShapefile method to open shapefiles
8420     ("__main__"): use support.run_tests() so that more info about
8421     uncollected garbage is printed
8422    
8423     * test/test_selection.py (TestSelection.tearDown): Make sure that
8424     all references to the session and the selection are removed
8425     otherwise we may get a resource leak
8426     (TestSelection.get_layer): Instantiate a session so that we can
8427     use it to open shapefiles.
8428     ("__main__"): use support.run_tests() so that more info about
8429     uncollected garbage is printed
8430    
8431     * test/test_session.py (TestSessionBase.tearDown)
8432     (TestSessionWithContent.tearDown): Make sure that all references
8433     to the session and layers are removed otherwise we may get a
8434     resource leak
8435     (TestSessionWithContent.setUp): Use the session's OpenShapefile
8436     method to open shapefiles
8437    
8438 jonathan 721 2003-04-24 Jonathan Coles <[email protected]>
8439    
8440     * Thuban/Model/load.py (XMLReader.read): Should have been checking
8441     if the file_or_filename object had the 'read' attribute.
8442    
8443 jonathan 715 2003-04-23 Jonathan Coles <[email protected]>
8444    
8445 jonathan 720 * Thuban/Model/resource.py: Fixes RTbug #1813.
8446     (ReadProjFile): Add documentation about which exceptions are raised.
8447     Always pass the exceptions up to the caller.
8448     (GetProjFiles): If the directory can't be read return an empty list.
8449     If any of the proj files can't be read skip that file and go
8450     on to the next one.
8451    
8452     * test/test_proj.py: Added test cases to handle nonexistent files,
8453     unreadable files, and files that don't parse correctly.
8454    
8455     2003-04-23 Jonathan Coles <[email protected]>
8456    
8457 jonathan 716 Projection dialog. Allows the user to select from a list
8458     of projection templates and optionally edit them and save new ones.
8459    
8460     * Thuban/UI/projdialog.py (ProjFrame): New. Main dialog.
8461     (ProjPanel): Base class for projection specific panels.
8462     (TMPanel): Projection panel for Transverse Mercartor.
8463     (UTMPanel): Projection panel for Universal Transverse Mercartor.
8464     (LCCPanel): Projection panel for Lambert Conic Conformal.
8465     (GeoPanel): Projetion panel for Geographic Projection.
8466    
8467     2003-04-23 Jonathan Coles <[email protected]>
8468    
8469 jonathan 715 * Thuban/Model/load.py (XMLReader): Renamed from XMLProcessor to
8470     promote symmetry. There now exists XMLReader and XMLWriter.
8471     (XMLReader.read): New. Call to read the given file descriptor or
8472     filename.
8473     (XMLReader.close): New. Make sure the file is closed.
8474     (XMLReader.GetFileName): New. Return just the file name that is being
8475     read from.
8476     (XMLReader.GetDirectory): New. Return just the directory of the file
8477     that is being read.
8478     (XMLReader.AddDispatchers): New. Take a dictionary which contains
8479     the names of functions to call as the XML tree is parsed.
8480     (XMLReader.startElementNS): Updated to use new dispatcher dictionary.
8481     (XMLReader.endElementNS): Updated to use new dispatcher dictionary.
8482     (SessionLoader): Removed class variables start_dispatcher and
8483     end_dispatcher since this functionality is now part of a class
8484     instance. Fixes RTbug #1808.
8485     (SessionLoader.__init__): Add dispatcher functions.
8486     (load_xmlfile): Code was moved into the XMLReader.read().
8487     (load_session): Use modified SessionLoader.
8488    
8489     * Thuban/Model/map.py (Map.GetProjection): New. Returns the
8490     map's projection.
8491    
8492     * Thuban/Model/proj.py (Projection.GetParameters): Renamed to
8493     GetAllParameters.
8494     (Projection.GetParameter): Returns the value for the given parameter.
8495    
8496     * Thuban/Model/resource.py: Use XMLReader and XMLWriter.
8497     (GetProjFiles): Renamed from GetProjections. Now returns a list
8498     of ProjFile objects.
8499     (GetSystemProjFiles): Renamed from GetSuppliedProjections. Returns
8500     a list of ProjFile objects whose files are not user defined.
8501     (GetUserProjFiles): Renamed from GetUserProjections. Returns a
8502     list of ProjFile objects whose files are user defined.
8503     (ProjFileReader): Extend new XMLReader.
8504    
8505     * Thuban/Model/save.py (XMLWriter): Renamed from XMLSaver to
8506     promote symmetry.
8507    
8508     * Thuban/UI/classgen.py (ClassGenDialog.__init__): Use a wxChoice
8509     control instead of a wxComboBox. wxChoice controls do not generate
8510     events as the uses highlights possible choices which fixes problems
8511     with resizing the dialog when the use selects an option.
8512    
8513     * Thuban/UI/classifier.py (Classifier.__init__): Use a wxChoice
8514     control instead of a wxComboBox.
8515    
8516     * Thuban/UI/mainwindow.py (MainWindow.Projection): Use new projection
8517     dialog.
8518    
8519     * test/test_proj.py (TestProjection.test): New tests for GetParameter
8520     method.
8521    
8522 bh 703 2003-04-22 Bernhard Herzog <[email protected]>
8523    
8524 bh 705 * Thuban/UI/mainwindow.py: Remove some unused imports and global
8525     constants
8526    
8527 bh 703 * Thuban/UI/identifyview.py (IdentifyListCtrl.selected_shape)
8528     (IdentifyGridCtrl.selected_shape): Use table, not shapetable.
8529    
8530 bh 700 2003-04-17 Bernhard Herzog <[email protected]>
8531    
8532 bh 701 * Thuban/Model/layer.py: Don't import LAYER_LEGEND_CHANGED.
8533     (Layer): Update doc-string since LAYER_LEGEND_CHANGED is not used
8534     anymore.
8535     (Layer.BoundingBox, Layer.GetFieldType, Layer.NumShapes)
8536     (Layer.ShapeType, Layer.Shape): No need to call
8537     self.open_shapefile since it's always called in __init__
8538    
8539 bh 700 * Thuban/UI/application.py (ThubanApplication.MainLoop): Removed.
8540     In wxPython 2.4 there's no need to extend MainLoop anymore since
8541     wxPython itself makes sure OnExit is called.
8542    
8543 jonathan 688 2003-04-16 Jonathan Coles <[email protected]>
8544    
8545 jonathan 693 Initial putback of projection management code. Includes new
8546     classes to read and write projection files. The current load
8547     and save classes were abstracted a bit so they could be reused.
8548     The Projection class was extended to provide new methods and
8549     have a name.
8550    
8551     * Thuban/Model/load.py (XMLProcessor): New. Contains all the
8552     general XML reading methods that were part of ProcessSession.
8553    
8554     * Thuban/Model/proj.py (Projection.__init__): Accepts an optional
8555     name.
8556     (ProjFile): New. Represents a file that contains projection
8557     information.
8558    
8559     * Thuban/Model/resource.py: New. Contains general utilities
8560     for read and writing projection files.
8561    
8562     * Thuban/Model/save.py (XMLSaver): New. Contains all the
8563     general XML writing methods that were part of SessionSaver.
8564     (SessionSaver): Renamed from Saver.
8565    
8566     * test/test_proj.py: New test cases for the projection
8567     file read and write functions.
8568    
8569     2003-04-16 Jonathan Coles <[email protected]>
8570    
8571 jonathan 688 * Thuban/Model/classification.py: Use repr() around values
8572     in the ClassGroup*.__repr__() methods so it is clearer when
8573     a value is a string and when it is a number.
8574    
8575     * test/test_load.py: Rework the classification test to test
8576     that we can load old files.
8577     (testLabels): Test a file where the groups have labels.
8578    
8579 bh 687 2003-04-16 Bernhard Herzog <[email protected]>
8580    
8581     Safer implementation of the performance enhancements of the
8582     low-level renderer:
8583    
8584     * extensions/thuban/wxproj.cpp (extract_projection)
8585     (extract_pointer): Rename extract_projection to extract_pointer
8586     and redefine its purpose to return the pointer stored in a CObject
8587     returned by the object's cobject method. Update all callers.
8588     (s_draw_info, free_draw_info, draw_polygon_init): Implement the
8589     handling of these low-level parameters so that each s_draw_info
8590     instance is handled as a CObject at python level that also
8591     contains real references to the actual python objects which
8592     contain the values in the struct. Add free_draw_info as the
8593     destructor.
8594     (draw_polygon_shape): Add the py_draw_info parameter which must a
8595     cobject containing an s_draw_info pointer.
8596    
8597     * Thuban/UI/renderer.py (MapRenderer.polygon_render_param): New
8598     method to instantiat the low-level render parameter
8599     (MapRenderer.draw_shape_layer): Use the new method. Remove some
8600     commented out code.
8601     (MapRenderer.draw_polygon_shape): Make the first parameter not the
8602     layer but the low-level render parameter
8603     (ScreenRenderer.draw_shape_layer): Use the low-level render
8604     parameter.
8605    
8606 jonathan 673 2003-04-15 Jonathan Coles <[email protected]>
8607    
8608 jonathan 680 * Thuban/Model/classification.py: Implemented __repr__ for
8609     the ClassGroup* classes to make debugging a bit easier.
8610     (ClassGroup.SetLabel): Check that the string is an instance
8611     of StringTypes not StringType. Accounts for Unicode strings.
8612    
8613     * Thuban/Model/color.py: Implemented __repr__ to make
8614     debugging a bit easier.
8615    
8616     * Thuban/Model/save.py (Saver.write_classification): Need to
8617     save the group label.
8618    
8619     * test/test_load.py (testClassification): New. Loads the
8620     iceland_sample_test.thuban file and checks if it was loaded
8621     correctly.
8622    
8623     2003-04-15 Jonathan Coles <[email protected]>
8624    
8625 jonathan 673 * extensions/thuban/wxproj.cpp (draw_polygon_init): New. Used
8626     to improve rendering performance by initializing the variables
8627     that are not change each time draw_polygon_shape() is called.
8628     The values are stored in a global struct draw_info.
8629     (draw_polygon_shape): Removed initialization code that is
8630     now in draw_polygon_init().
8631    
8632     * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Make
8633 jonathan 674 drawing initialization call to draw_polygon_init()
8634     (MapRenderer.draw_polygon_shape): Use new signature of
8635     draw_polygon_shape.
8636 jonathan 673
8637 jonathan 674 * Thuban/UI/classgen.py (GenUniformPanel): Fix spin control
8638     weirdness by setting the range to (1, maxint).
8639 jonathan 673
8640 jonathan 674 * Thuban/Model/classification.py (ClassGroupProperties): Make
8641     instance variables private and optimize comparison operator
8642     by first checking if the color references are the same.
8643     (ClassGroupSingleton): Make instance variables private.
8644     (ClassGroupRange): Make instance variables private.
8645 jonathan 673
8646 jonathan 674 * HOWTO-Release: Filled in missing steps for releasing packages.
8647    
8648 bh 672 2003-04-15 Bernhard Herzog <[email protected]>
8649    
8650     First stab at internationalized messages:
8651    
8652     * Thuban/__init__.py (_): Implement the translation function for
8653     real using the python gettext module.
8654    
8655     * Thuban/UI/classifier.py (ClassTable.GetRowLabelValue): Don't
8656     translate empty strings.
8657    
8658     * Thuban/UI/application.py (ThubanApplication.read_startup_files):
8659     Add a missing space to a warning message
8660    
8661     * po/README: New. Notes about the management of the translation
8662     files.
8663    
8664     * po/Makefile: New. Makefile to help manage the translation files.
8665    
8666     * po/es.po: New. Spanish translation by Daniel Calvelo Aros
8667    
8668     * MANIFEST.in: Include the *.mo files in Resources/Locale and the
8669     translations and support files in po/
8670    
8671     * setup.py (data_files): Add the *.mo files to the data_files too
8672    
8673     * README: Add note about the translations when building from CVS
8674    
8675 jonathan 669 2003-04-14 Jonathan Coles <[email protected]>
8676    
8677     * Thuban/UI/dock.py: Fixes some window resizing problems most
8678     noticable under windows. Always assume the button bitmaps will
8679     be there. Code clean up.
8680     (DockabelWindow.Dock, DockableWindow.UnDock): Force all the
8681     images for the dock/undock button to the same images.
8682     Work around for RTbug #1801.
8683    
8684     * Thuban/UI/legend.py (LegendPanel.__init__): The toolbar should
8685     be allowed to grow within the sizer. Fixes a bug under Windows
8686     where the toolbar wasn't being drawn.
8687    
8688 frank 664 2003-04-14 Frank Koormann <[email protected]>
8689    
8690     * Resources/Bitmaps/dock_12.xpm, Resources/Bitmaps/undock_12.xpm:
8691     Updated design to try to make the button functionality more
8692     transparent.
8693    
8694 jonathan 662 2003-04-14 Jonathan Coles <[email protected]>
8695    
8696     * Thuban/UI/legend.py (LegendPanel.__init__): Call Create() to
8697     finalize the intialization of the panel.
8698    
8699     * Thuban/UI/dock.py (DockPanel.Create): New. Finalizes the
8700     creation of the panel. Should be the last thing called in the
8701     initializer of a subclass.
8702    
8703     * Thuban/UI/classgen.py (ClassGenDialog.__init__): Actively
8704     set the current selections in the combo boxes. This is needed
8705     under Windows.
8706    
8707     * Thuban/UI/classifier.py (Classifier.__init__): Add a top
8708     level panel to the dialog so that the background colors are
8709     consistent under Windows.
8710    
8711 jonathan 646 2003-04-11 Jonathan Coles <[email protected]>
8712    
8713 jonathan 662 * Thuban/UI/classgen.py: Change color ramps to start at white
8714     not black.
8715    
8716     * Thuban/UI/legend.py: Enable/disable the legend buttons when
8717     the legend changes. Fixes RTbug #1793.
8718    
8719     * test/test_classification.py: Added test for copying of
8720     classifications.
8721    
8722     2003-04-11 Jonathan Coles <[email protected]>
8723    
8724 jonathan 647 * Thuban/UI/resource.py: New. Centralize the loading of resources
8725     such as bitmaps.
8726    
8727     * Thuban/UI/classgen.py (GenUniquePanel.__init__): Reordered buttons,
8728     added images to the move buttons, added 'reverse' button.
8729     (CustomRampPanel.__init__): Added images to the move buttons.
8730     (GreyRamp): New. Generates a ramp from white to black.
8731     (HotToColdRamp): New. Generates a ramp from cold to hot colors.
8732    
8733     * Thuban/UI/classifier.py: Refactored ID's from ID_CLASSIFY_* to
8734     ID_PROPERTY_*.
8735     (Classifier.__init__): Minor changes to the layout.
8736     (Classifier._OnTitleChanged): Listen for when the user edits the
8737     title and update the dialog's title and the layer's title.
8738    
8739     * Thuban/UI/dock.py: Use new bitmaps for the control buttons.
8740    
8741     * Thuban/UI/legend.py: Use new bitmaps for the control buttons.
8742     (LegendTree._OnMsgLayerTitleChanged): Change the displayed title
8743     if the layer's title changes.
8744    
8745     * Thuban/UI/mainwindow.py: Added new menu item and associated code
8746     to open a dialog to rename the map.
8747     (MainWindow): Use new resource class to import bitmaps.
8748    
8749     2003-04-11 Jonathan Coles <[email protected]>
8750    
8751 jonathan 646 * Resources/Bitmaps/close_12.xpm, Resources/Bitmaps/dock_12.xpm,
8752 jonathan 647 Resources/Bitmaps/group_use.xpm, Resources/Bitmaps/group_use_all.xpm,
8753     Resources/Bitmaps/group_use_none.xpm,
8754     Resources/Bitmaps/group_use_not.xpm,
8755     Resources/Bitmaps/hide_layer.xpm,
8756     Resources/Bitmaps/layer_properties.xpm,
8757     Resources/Bitmaps/lower_layer.xpm, Resources/Bitmaps/raise_layer.xpm,
8758     Resources/Bitmaps/show_layer.xpm, Resources/Bitmaps/undock_12.xpm:
8759     New.
8760 jonathan 646
8761 jonathan 636 2003-04-10 Jonathan Coles <[email protected]>
8762    
8763 jonathan 644 * Thuban/Model/classification.py: (ClassGroupRange.__init__):
8764     Should pass group to ClassGroup constructor.
8765    
8766     2003-04-10 Jonathan Coles <[email protected]>
8767    
8768 jonathan 636 * Thuban/Model/classification.py: (ClassGroup): Move all the common
8769     methods of the derived classes ([Set|Get]Properties(), __eq__, __ne__)
8770     here. Implement SetVisible(), IsVisible().
8771     (ClassGroup.__init__): Add group parameter which acts as a copy
8772     constructor.
8773    
8774     * Thuban/UI/classifier.py (ClassTable): Add a new column for the
8775     "Visible" check boxes.
8776     (Classifier): Rename the buttons and refactor the code to match
8777     the new labels.
8778    
8779     * Thuban/UI/legend.py: Classify button is now called "Properties".
8780     Refactored the code to change variable names.
8781     (LegendTree.__FillTreeLayer): Only list a group if it is visible.
8782    
8783     * Thuban/UI/mainwindow.py: MainWindow.OpenClassifier renamed to
8784     MainWindow.OpenLayerProperties. MainWindow.LayerEditProperties
8785     renamed to MainWindow.LayerEditProperties.
8786     (MainWindow.ToggleLegend): Don't include map name in legend title.
8787     (MainWindow.SetMap): Added the map name to the window title.
8788     (MainWindow.LayerFillColor, MainWindow.LayerTransparentFill,
8789     MainWindow.LayerOutlineColor, MainWindow.LayerNoOutline): Removed.
8790     Functionality is found in the layer properties dialog.
8791    
8792     * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Only
8793     draw visible groups.
8794    
8795 jonathan 626 2003-04-09 Jonathan Coles <[email protected]>
8796    
8797 jonathan 634 * Thuban/UI/classgen.py: Modifications to allow simple
8798     addition and selection of new color schemes.
8799     (MonochromaticRamp): New. Generates a ramp between two colors.
8800     (RedRamp): New. Generates a ramp of all red.
8801     (GreenRamp): New. Generates a ramp of all green.
8802     (BlueRamp): New. Generates a ramp of all blue.
8803    
8804     2003-04-09 Jonathan Coles <[email protected]>
8805    
8806 jonathan 626 * Thuban/Model/classification.py (Classification.__deepcopy__):
8807     Need to copy over field and fieldType attributes.
8808    
8809     * Thuban/Model/table.py (Table.field_range): New. Retrive the
8810     maximum and minimum values over the entire table for a given
8811     field.
8812     (Table.GetUniqueValues): New. Retrieve all the unique values
8813     in the table for a given field.
8814    
8815     * Thuban/UI/classgen.py: Renamed GenRangePanel to GenUniformPanel.
8816     (GenUniquePanel): New. Controls to allow the user to select
8817     which unique field values they would like in the classification.
8818     (CustomRampPanel): Code that was in ClassGenDialog that allows
8819     the user to select the properties for a custom ramp.
8820     (ClassGenerator.GenUniformDistribution): Was called GenerateRanges.
8821    
8822     * Thuban/UI/classifier.py: Removed a lot of debugging code.
8823     (Classifier._SetClassification): Callback method so that the
8824     class generator can set the classification in the grid.
8825     (ClassGroupPropertiesCtrl): New. Encapsulates the drawing and
8826     editing of a group properties class into a wxWindows control.
8827    
8828     * Thuban/UI/dock.py: It was decided that if the user closes
8829     a dockable window the window should simply hide itself. That
8830     way if the user wants to show the dock again it appears in the
8831     same place as it was when it was closed.
8832     (DockableWindow.Destroy): Call renamed method OnDockDestroy().
8833     (DockableWindow._OnButtonClose): Hide the window instead of
8834     destroying it.
8835     (DockableWindow._OnClose): Hide the window instead of
8836     destroying it.
8837    
8838     * Thuban/UI/legend.py (LegendTree): Use a private method to
8839     consistently set the font and style of the text. Fixes RTbug #1786.
8840    
8841     * Thuban/UI/mainwindow.py: Import just the Classifier class.
8842    
8843 bh 623 2003-04-07 Bernhard Herzog <[email protected]>
8844    
8845 bh 625 * Thuban/UI/mainwindow.py (main_menu): Move the toggle_legend item
8846     to the map module
8847    
8848     2003-04-07 Bernhard Herzog <[email protected]>
8849    
8850 bh 623 * Thuban/UI/mainwindow.py (MainWindow.ShowSessionTree): Removed in
8851     favor of ToggleSessionTree
8852     (MainWindow.ToggleSessionTree): New method to toggle visibility of
8853     the session tree.
8854     (MainWindow.SessionTreeShown): New method to return whether the
8855     session tree is currently shown.
8856     (MainWindow.ToggleLegend): New method to toggle visibility of the
8857     legend
8858     (MainWindow.ShowLegend): Implement in terms of ToggleLegend and
8859     LegendShown
8860     (MainWindow.LegendShown): New method to return whether the legend
8861     is currently shown.
8862     (_method_command): Add checked parameter so we can define check
8863     menu items
8864     (_has_tree_window_shown, _has_legend_shown): Use the appropriate
8865     mainwindow methods.
8866     (show_session_tree, show_legend commands): Removed.
8867     (toggle_session_tree, toggle_legend commands): New commands to
8868     toggle the visibility of the dialogs
8869    
8870 jonathan 612 2003-04-07 Jonathan Coles <[email protected]>
8871    
8872 jonathan 619 * Thuban/UI/classgen.py: Fix Windows problem.
8873    
8874     * Thuban/UI/dock.py: Fix Windows problem.
8875    
8876     * Thuban/UI/mainwindow.py: Use False instead of false.
8877     (MainWindow.ShowLegend): Remove unnecessary switch parameter.
8878    
8879     2003-04-07 Jonathan Coles <[email protected]>
8880    
8881 jonathan 612 Since we now say that the order of the groups in a classification
8882     matters, it makes sense to be able to manipulate that order. Most
8883     of the changes to Thuban/Model/classification.py are to that end.
8884    
8885     * Thuban/Model/classification.py (Classification.AppendGroup,
8886     Classification.InsertGroup, Classification.ReplaceGroup,
8887     Classification.RemoveGroup, Classification.GetGroup): Do as the
8888     names imply.
8889     (Classification.FindGroup): This was called GetGroup, but GetGroup
8890     takes an index, while FindGroup takes a value.
8891     (Classification.__deepcopy__): Copy all the groups, BUT NOT THE LAYER
8892     REFERENCE. Currently there is a cyclic reference between the layer
8893     and its classification. If the classification doesn't need to know
8894     its owning layer we can change this, since it may make sense to be
8895     able to use the same classification with different layers.
8896    
8897     * Thuban/Model/load.py: Use Classification.AppendGroup(), not AddGroup()
8898    
8899     * Thuban/UI/classgen.py: Use Classification.AppendGroup(),
8900     not AddGroup()
8901    
8902     * Thuban/UI/classifier.py: Now that we can depend on the order in
8903     a Classification and have methods to manipulate that order we don't
8904     need to use our own data structures in the grid. We can simply make
8905     the grid/table access the information they need from a copy of
8906     the classification object.
8907     (Classifier._OnCloseBtn): Event handler for when the user clicks
8908     'Close'. This is needed so if the user applies changes and then
8909     continues to change the table the user has the option of discarding
8910     the most recent changes and keeping what they applied.
8911    
8912     * Thuban/UI/mainwindow.py: Put "Show Legend" and "Show Session Tree"
8913     into the same group.
8914    
8915     * extensions/thuban/wxproj.cpp (check_version): If Thuban is compiled
8916     with a really old version of proj, PJ_VERSION won't even be defined.
8917     If it isn't defined then just compile so that the function always
8918     returns Py_False.
8919    
8920     * test/test_classification.py: Fix tests to use the renamed methods.
8921     Still need to write tests for the new methods.
8922    
8923 jonathan 601 2003-04-04 Jonathan Coles <[email protected]>
8924 jonathan 608
8925 jonathan 612 * Thuban/UI/classifier.py (Classifier.__SelectField): Move the
8926     call to SetSelection out of the method and before the call
8927     to __SelectField in __init__. This prevents a recursion of events
8928     when _OnFieldSelect is triggered by the user.
8929    
8930     2003-04-04 Jonathan Coles <[email protected]>
8931    
8932 jonathan 608 * Thuban/Model/classification.py: Rename Color.None to
8933     Color.Transparent.
8934     (ClassGroupProperties.SetLineColori, ClassGroupProperties.SetFill):
8935     Don't bother copying the color, since Colors are immutable.
8936    
8937     * Thuban/Model/color.py, Thuban/Model/layer.py, Thuban/Model/load.py,
8938     Thuban/UI/classifier.py, Thuban/UI/mainwindow.py,
8939     Thuban/UI/renderer.py, Thuban/UI/view.py:
8940     Rename Color.None to Color.Transparent.
8941    
8942     * test/test_classification.py, test/test_load.py: Rename Color.None
8943     to Color.Transparent.
8944    
8945     2003-04-04 Jonathan Coles <[email protected]>
8946 jonathan 603
8947     * Thuban/Model/classification.py: Fix assert calls.
8948     (ClassGroupProperties.SetLineColor, ClassGroupProperties.SetFill):
8949     Copy the color parameter rather than hold onto a reference.
8950 jonathan 601
8951 jonathan 603 * Thuban/Model/color.py (Color.__copy__, Color.__deepcopy): Copy
8952     the color object.
8953     (NoColor.__copy__, NoColor.__deepcopy): Return 'self' so that we
8954     are sure there exists only one refernce to Color.None in the system.
8955     This allows us to use 'is' rather than the comparision functions.
8956    
8957     * Thuban/Model/save.py: Fix assert calls.
8958    
8959     * Thuban/UI/classifier.py: Fix assert calls.
8960     (ClassGrid._OnCellDClick): Call up to the classifier to open the
8961     dialog to edit the groups properties.
8962     (ClassGrid._OnCellResize): Make sure that the scollbars are drawn
8963     correctly if a cell is resized.
8964     (ClassTable.SetClassification): New. Changes the classification
8965     that is in the table.
8966     (ClassTable.__SetRow): Allow groups to be prepended.
8967     (Classifier): New code for opening the EditProperties and
8968     GenerateRanges dialogs.
8969     (SelectPropertiesDialog.__GetColor): Only set the color in the
8970     color dialog if the current color is not None.
8971    
8972     * Thuban/UI/dock.py: Fix assert calls.
8973    
8974     * Thuban/UI/legend.py: Fix assert calls.
8975    
8976     * Thuban/UI/renderer.py: Fix assert calls.
8977    
8978     * Thuban/UI/classgen.py (ClassGenDialog): Dialog for generating
8979     classifications.
8980     (GenRangePanel): Panel specific to range generation.
8981     (GenSingletonPanel): Panel specific to singleton generation.
8982     (ClassGenerator): Class responsible for actually generating
8983     the classification from the data gathered in the dialog box.
8984     (PropertyRamp): Generates properties whose values range from
8985     a starting property to an ending property.
8986 jonathan 601
8987 bh 600 2003-04-03 Bernhard Herzog <[email protected]>
8988    
8989     * test/support.py (print_garbage_information): New function that
8990     prints information about still connected messages and memory
8991     leaks.
8992     (run_suite): Removed.
8993     (run_tests): New function for use as a replacement of
8994     unittest.main in the test_* files. This one calls
8995     print_garbage_information at the end.
8996    
8997     * test/runtests.py (main): Use support.print_garbage_information
8998    
8999     * test/test_layer.py: Use support.run_tests instead of
9000     unittest.main so we get memory leak information
9001     (TestLayer.test_arc_layer, TestLayer.test_polygon_layer)
9002     (TestLayer.test_point_layer, TestLayer.test_empty_layer)
9003     (TestLayerLegend.test_visibility): Call the layer's Destroy method
9004     to fix a memory leak.
9005    
9006     * test/test_classification.py: Use support.run_tests instead of
9007     unittest.main so we get memory leak information
9008     (TestClassification.test_classification): Call the layer's Destroy
9009     method to fix a memory leak.
9010    
9011 bh 591 2003-04-02 Bernhard Herzog <[email protected]>
9012    
9013 bh 595 * extensions/thuban/wxproj.cpp (check_version, check_version_gtk):
9014     Handle the reference counts of the return value and errors in
9015     PyArg_ParseTuple correctly.
9016    
9017 bh 593 * Thuban/UI/application.py (ThubanApplication.OpenSession): Make
9018     sure the filename is absolute to avoid problems when saving the
9019     session again
9020    
9021 bh 591 * Thuban/Model/table.py: Remove unnecessary import. Fix a typo.
9022    
9023 jonathan 587 2003-04-01 Jonathan Coles <[email protected]>
9024    
9025 jonathan 589 * Thuban/UI/renderer.py (MapRenderer.draw_point_shape): Check
9026 jonathan 587 that there actually are points in the returned list of points
9027     before trying to index into the list. The list may be empty if
9028     the shape is a Null Shape.
9029    
9030 bh 586 2003-04-01 Bernhard Herzog <[email protected]>
9031    
9032     * test/test_map.py: Don't use from <module> import *
9033    
9034 jonathan 581 2003-04-01 Jonathan Coles <[email protected]>
9035    
9036     * Thuban/Model/session.py: Use LAYER_CHANGED instead of
9037     LAYER_LEGEND_CHANGED
9038    
9039     * Thuban/UI/dock.py (DockableWindow._OnButtonClose): Call
9040     self.Destroy() to close the window after yesterday's changes.
9041    
9042     * test/test_map.py, test/test_session.py: Fix messages that
9043     are sent from maps and layers.
9044    
9045 jonathan 575 2003-03-31 Jonathan Coles <[email protected]>
9046    
9047     * Thuban/UI/classifier.py: Commented out some debugging statements.
9048     (ClassDataPreviewer.Draw): Draw rectangles for polygon layers per
9049     RTbug #1769.
9050    
9051     * Thuban/UI/dock.py (DockableWindow.UnDock): Restore size and
9052     position (although position doesn't work yet under GTK).
9053     (DockableWindow.Destroy): New. Called when the window must be
9054     closed. Namely needed when the DockFrame closes and must close
9055     its children.
9056     (DockFrame): Listen for EVT_CLOSE and destroy all children.
9057    
9058     * Thuban/UI/legend.py (LegendPanel.Destroy): New. Cleans up
9059     when then window is told to close.
9060     (LegendTree._OnMsgLayerChanged): Fixes a seg fault bug. See
9061     comment in source for more info.
9062    
9063     * Thuban/UI/main.py: Show the legend by default when Thuban starts.
9064    
9065     * Thuban/UI/mainwindow.py: Renamed OnClose to _OnClose for
9066     symmetry with other such methods.
9067     (MainWindow.ShowLegend): Show the legend docked by default.
9068    
9069 jonathan 569 2003-03-28 Jonathan Coles <[email protected]>
9070    
9071     * Thuban/UI/classifier.py: Support for highlighting a specific
9072     group within the grid when the classification dialog is opened.
9073     Also contains a lot of debugging printouts which will later
9074     be removed.
9075    
9076     * Thuban/UI/dock.py: Complete rework on the dock code so that
9077     that it is fairly removed from the rest of the Thuban application.
9078     It is easy to add new docks which the rest of the program having
9079     to be aware of them.
9080    
9081     * Thuban/UI/legend.py: Modifications to support selecting a
9082     specific group in the classification dialog. Changed how layers
9083     are drawn when the layer is visible/invisible.
9084    
9085     * Thuban/UI/mainwindow.py: Removed legend specific code and
9086     replaced it with calls to the new dock code.
9087    
9088     * Thuban/UI/renderer.py (MapRenderer.__init__): Added assert
9089     to check if scale > 0. Trying to track down a divide by zero.
9090    
9091 jonathan 557 2003-03-26 Jonathan Coles <[email protected]>
9092    
9093 jonathan 567 * Thuban/UI/legend.py: Removed unnecessary LegendDialog class.
9094     (LegendPanel): Removed _OnDock()/_OnUnDock() methods which are
9095     now part of DockableWindow.
9096     (LegendPanel.DoOnSelChanged): Select the current layer in the
9097     map.
9098     (LegendTree._OnSelChanged): Call LegendPanel.DoOnSelChanged()
9099     with the selected layer and/or group.
9100    
9101     2003-03-26 Jonathan Coles <[email protected]>
9102    
9103 jonathan 557 This putback contains the code for dockable windows. There is
9104     no support in wxWindows as of this date for windows that can
9105     attach themselves to other windows.
9106    
9107     The current model contains a DockableWindow which has a parent
9108     window for when it is detached and a dock window that it puts
9109     its contents in when it is docked. The contents of a DockableWindow
9110     must be a DockPanel. DockPanel itself derives from wxPanel.
9111    
9112     * Thuban/Model/layer.py (Layer.ClassChanged): Send a LAYER_CHANGED
9113     message, not a LAYER_LEGEND_CHANGED message.
9114    
9115     * Thuban/Model/map.py (Map): Forward LAYER_CHANGED messages.
9116    
9117     * Thuban/UI/classifier.py (Classifier.__init__): Use wxADJUST_MINSIZE
9118     as one of the style properties for the fieldTypeText item to
9119     be sure that its size is correct when the text changes.
9120    
9121     * Thuban/UI/dock.py: New. Classes for the DockPanel and
9122     DockableWindow.
9123    
9124     * Thuban/UI/legend.py: Added some more buttons and made the
9125     LegendPanel a DockPanel.
9126    
9127     * Thuban/UI/mainwindow.py: Added sash windows to the main window
9128     and supporting functions for manipulating the sashes.
9129     (MainWindow.ShowLegend): Create a DockableWindow with the
9130     LegendPanel as the contents.
9131    
9132     * Thuban/UI/messages.py: Added DOCKABLE_* messages
9133    
9134     * Thuban/UI/view.py (MapCanves.SetMap): Listen for LAYER_CHANGED,
9135     not LAYER_LEGEND_CHANGED, messages.
9136    
9137 jonathan 554 2003-03-25 Jonathan Coles <[email protected]>
9138    
9139     * setup.py: Added custom script bdist_rpm_build_script so that
9140     when the rpm is built the path to wx-config is correct.
9141    
9142     * setup.cfg: Added line saying to use the custom build script
9143    
9144 jonathan 552 2003-03-20 Jonathan Coles <[email protected]>
9145    
9146     Initial implementation of the Legend.
9147    
9148     * Thuban/UI/legend.py: New. Creates a window that shows the map's
9149     Legend information and allows the user to add/modify classifications
9150     and how the layers are drawn on the map.
9151    
9152     * setup.py: New command 'build_docs' which currently uses
9153     happydoc to generate html documentation for Thuban.
9154    
9155     * Thuban/Model/classification.py (ClassGroup.GetDisplayText): New.
9156     Returns a string which is appropriately describes the group.
9157    
9158     * Thuban/Model/layer.py (Layer.SetClassification): Generate a
9159     LAYER_CHANGED event instead of a LAYER_LEGEND_CHANGED event.
9160    
9161     * Thuban/Model/map.py (Map): Rename messages and use new, more
9162     specific, messages.
9163    
9164     * Thuban/Model/messages.py: New message to indicate that a layer's
9165     data has changed (LAYER_CHANGED). New map messages to indicate
9166     when layers have been added/removed/changed or if the stacking order
9167     of the layers has changed.
9168    
9169     * Thuban/Model/session.py: Rename and use new messages.
9170    
9171     * Thuban/UI/classifier.py: Remember if any changes have actually
9172     been applied so that if the dialog is cancelled without an application
9173     of changes we don't have to set a new classification.
9174     (ClassDataPreviewer): Pulled out the window specific code and put it
9175     ClassDataPreviewWindow. ClassDataPreviewer can then be used to draw
9176     symbols on any DC.
9177    
9178     * Thuban/UI/mainwindow.py: New code to open the legend.
9179    
9180     * Thuban/UI/view.py: Use new message names.
9181    
9182 jonathan 541 2003-03-19 Jonathan Coles <[email protected]>
9183    
9184     * Thuban/UI/main.py (verify_versions): New. Checks the versions
9185     of Python, wxPython, and some other libraries.
9186    
9187     * extensions/thuban/wxproj.cpp (check_version): Checks the given
9188     version against what wxproj was compiled with.
9189     (check_version_gtk): If wxproj was compiled with gtk then check
9190     the given version against the version of the gtk library
9191     currently being used.
9192    
9193 bh 538 2003-03-14 Bernhard Herzog <[email protected]>
9194    
9195     * test/test_command.py: Run the tests when the module is run as a
9196     script
9197    
9198     2003-03-14 Bernhard Herzog <[email protected]>
9199    
9200     Implement selection of multiple selected shapes in the same layer:
9201    
9202     - Introduce a new class to hold the selection. This basically
9203     replaces the interactor which was nothing more than the
9204     selection anyway. A major difference is of course that the new
9205     selection class supports multiple selected shapes in one layer
9206    
9207     - Move the object that represents the selection from the
9208     application to the canvas. The canvas is a better place than the
9209     application because the selection represents which shapes and
9210     layer of the map displayed by the canvas are selected and
9211     affects how the map is drawn.
9212    
9213     - Make the selection and its messages publicly available through
9214     the mainwindow.
9215    
9216     - The non-modal dialogs do not get a reference to the interactor
9217     anymore as they can simply refer to their parent, the
9218     mainwindow, for the what the interactor had to offer.
9219    
9220     * Thuban/UI/selection.py: New module with a class to represent the
9221     selection.
9222    
9223     * Thuban/UI/messages.py (SELECTED_TABLE, SELECTED_MAP): Remove
9224     these unused messages
9225    
9226     * Thuban/UI/application.py (ThubanApplication.OnInit)
9227     (ThubanApplication.OnExit, ThubanApplication.SetSession): The
9228     interactor is gone now.
9229     (ThubanApplication.CreateMainWindow): There is no interactor
9230     anymore so we pass None as the interactor argument for now for
9231     compatibility.
9232    
9233     * Thuban/UI/view.py (MapCanvas.delegated_messages)
9234     (MapCanvas.Subscribe, MapCanvas.Unsubscribe): In Subscribe and
9235     Unsubscribe, delegate messages according to the delegated_messages
9236     class variable.
9237     (MapCanvas.__getattr__, MapCanvas.delegated_methods): Get some
9238     attributes from instance variables as described with the
9239     delegated_methods class variable.
9240     (MapCanvas.__init__): New instance variable selection holding the
9241     current selection
9242     (MapCanvas.do_redraw): Deal with multiple selected shapes. Simply
9243     pass them on to the renderer
9244     (MapCanvas.SetMap): Clear the selection when a different map is
9245     selected.
9246     (MapCanvas.shape_selected): Simple force a complete redraw. The
9247     selection class now takes care of only issueing SHAPES_SELECTED
9248     messages when the set of selected shapes actually does change.
9249     (MapCanvas.SelectShapeAt): The selection is now managed in
9250     self.selection
9251    
9252     * Thuban/UI/mainwindow.py (MainWindow.delegated_messages)
9253     (MainWindow.Subscribe, MainWindow.Unsubscribe): In Subscribe and
9254     Unsubscribe, delegate messages according to the delegated_messages
9255     class variable.
9256     (MainWindow.delegated_methods, MainWindow.__getattr__): Get some
9257     attributes from instance variables as described with the
9258     delegated_methods class variable.
9259     (MainWindow.__init__): The interactor as ivar is gone. The
9260     parameter is still there for compatibility. The selection messages
9261     now come from the canvas.
9262     (MainWindow.current_layer, MainWindow.has_selected_layer):
9263     Delegate to the the canvas.
9264     (MainWindow.LayerShowTable, MainWindow.Classify)
9265     (MainWindow.identify_view_on_demand): The dialogs don't need the
9266     interactor parameter anymore.
9267    
9268     * Thuban/UI/tableview.py (TableFrame.__init__)
9269     (LayerTableFrame.__init__, LayerTableFrame.OnClose)
9270     (LayerTableFrame.row_selected): The interactor is gone. It's job
9271     from the dialog's point of view is now done by the mainwindow,
9272     i.e. the parent. Subscribe to SHAPES_SELECTED instead
9273     of SELECTED_SHAPE
9274    
9275     * Thuban/UI/dialogs.py (NonModalDialog.__init__): The interactor
9276     is gone. It's job from the dialog's point of view is now done by
9277     the mainwindow, i.e. the parent.
9278    
9279     * Thuban/UI/classifier.py (Classifier.__init__): The interactor is
9280     gone. It's job from the dialog's point of view is now done by the
9281     mainwindow, i.e. the parent.
9282    
9283     * Thuban/UI/tree.py (SessionTreeView.__init__): The interactor is
9284     gone. It's job from the dialog's point of view is now done by the
9285     mainwindow, i.e. the parent.
9286     (SessionTreeCtrl.__init__): New parameter mainwindow which is
9287     stored as self.mainwindow. The mainwindow is need so that the tree
9288     can still subscribe to the selection messages.
9289     (SessionTreeCtrl.__init__, SessionTreeCtrl.unsubscribe_all)
9290     (SessionTreeCtrl.update_tree, SessionTreeCtrl.OnSelChanged): The
9291     selection is now accessible through the mainwindow. Subscribe to
9292     SHAPES_SELECTED instead of SELECTED_SHAPE
9293    
9294     * Thuban/UI/identifyview.py (IdentifyView.__init__): Use the
9295     SHAPES_SELECTED message now.
9296     (IdentifyView.selected_shape): Now subscribed to SHAPES_SELECTED,
9297     so deal with multiple shapes
9298     (IdentifyView.__init__, IdentifyView.OnClose): The interactor is
9299     gone. It's job from the dialog's point of view is now done by the
9300     mainwindow, i.e. the parent.
9301    
9302     * Thuban/UI/controls.py (RecordListCtrl.fill_list): The second
9303     parameter is now a list of shape ids.
9304     (RecordTable.SetTable): The second parameter is now a list of
9305     indices.
9306    
9307     * Thuban/UI/renderer.py (ScreenRenderer.RenderMap): Rename the
9308     selected_shape parameter and ivar to selected_shapes. It's now a
9309     list of shape ids.
9310     (MapRenderer.draw_label_layer): Deal with multiple selected
9311     shapes. Rearrange the code a bit so that the setup and shape type
9312     distinctions are only executed once.
9313    
9314     * test/test_selection.py: Test cases for the selection class
9315    
9316 jonathan 527 2003-03-11 Jonathan Coles <[email protected]>
9317    
9318     * Thuban/Model/load.py: Temporary fix so that the xml reader
9319     doesn't cause Thuban to crash.
9320    
9321     * Thuban/Model/layer.py: Handle the cyclic references between
9322     a layer and its classification better, and be sure to disconnect
9323     the classification from the layer when the layer is destroyed
9324     so that we don't maintain a cyclic reference that may not be
9325     garbage collected.
9326    
9327     * Thuban/Model/classification.py: See comment for layer.py.
9328    
9329 jan 523 2003-03-12 Jan-Oliver Wagner <[email protected]>
9330    
9331     * HOWTO-Release: New. Information on the steps for releasing
9332     a new version of Thuban.
9333    
9334 jonathan 514 2003-03-11 Jonathan Coles <[email protected]>
9335    
9336     * Thuban/UI/classifier.py: Add normal border to SelectPropertiesDialog.
9337     Use True instead of true.
9338     (Classifier): Should have a single panel in which all the controls lie.
9339    
9340     * Thuban/UI/proj4dialog.py: Add normal border.
9341    
9342     * Thuban/UI/tree.py: Fixed problem with bad item images under Windows.
9343    
9344     * Thuban/UI/mainwindow.py: Use True instead of true.
9345    
9346     * setup.py: Update some definitions to use wxWindows2.4 files
9347    
9348     * Data/iceland_sample_class.thuban: Fixed file so that the
9349     field_type information is present.
9350    
9351 jonathan 490 2003-03-10 Jonathan Coles <[email protected]>
9352    
9353 jonathan 505 * Thuban/UI/classifier.py (Classifier.__init__): Make the
9354     field type label grow so that when the text changes the
9355     size is updated correctly. This may be a wxWindows bug.
9356    
9357     2003-03-10 Jonathan Coles <[email protected]>
9358    
9359 jonathan 499 * Thuban/UI/application.py: Changed SESSION_CHANGED to
9360     SESSION_REPLACED.
9361    
9362     * Thuban/UI/classifier.py: Wrap text with _().
9363     (ClassGrid.CreateTable): Set dimensions and size hints here,
9364     instead of in Reset, so we only set the size once.
9365    
9366     * Thuban/UI/dialogs.py: Don't need Shutdown(); just use Close()!
9367    
9368     * Thuban/UI/mainwindow.py (MainWindow.prepare_new_session):
9369     Call Close() instead of Shutdown().
9370    
9371     * Thuban/UI/messages.py: Changed SESSION_CHANGED to SESSION_REPLACED.
9372    
9373     * Thuban/UI/tree.py: Changed SESSION_CHANGED to SESSION_REPLACED.
9374     Go back to using OnClose() instead of Shutdown().
9375    
9376     2003-03-10 Jonathan Coles <[email protected]>
9377    
9378 jonathan 497 * Thuban/UI/classifier.py (Classifier): SelectField() needed
9379     to know the old field index as well as the new one.
9380    
9381     2003-03-10 Jonathan Coles <[email protected]>
9382    
9383 jonathan 495 * Thuban/UI/classifier.py (Classifier): Use __SelectField()
9384     to correctly set the table information and call this from
9385     __init__ and from _OnFieldSelect so that all the information
9386     is up to date when the dialog opens and when a field is changed.
9387    
9388     2003-03-10 Jonathan Coles <[email protected]>
9389    
9390 jonathan 490 * Thuban/Model/classification.py (Classification): Don't use
9391     layer's message function directly, use the ClassChanged() method
9392     when then classification changes. SetField/SetFieldType/SetLayer
9393     must keep the information about field name and field type in
9394     sync when an owning layer is set or removed.
9395    
9396     * Thuban/Model/layer.py: Added ClassChanged() so that the
9397     classification can tell the layer when its data has changed.
9398     (Layer.SetClassification): Accepts None as an arguement to
9399     remove the current classification and correctly handles
9400     adding a new classification.
9401    
9402     * Thuban/Model/load.py: Comment out print statement
9403    
9404     * test/test_classification.py, test/test_save.py: New and
9405     improved tests.
9406    
9407 jonathan 483 2003-03-07 Jonathan Coles <[email protected]>
9408    
9409     * Thuban/Model/classification.py: Implemented __copy__ and
9410     __deepcopy__ for ClassGroup* and ClassGroupProperites so
9411     they can easily be copied by the classifier dialog.
9412     (ClassGroupProperites.__init__): The default line color should
9413     have been Color.Black.
9414    
9415     * Thuban/UI/classifier.py: Setting and Getting table values now
9416     uses a consistent set of functions.
9417     (Classifier): Now non-modal. Has field type label which changes
9418     as the field changes. Keep track of buttons in a list so that
9419     we can enable/disable the buttons when the None field is selected.
9420     (SelectPropertiesDialog): Add buttons to make the colors transparent.
9421    
9422     * Thuban/UI/dialogs.py (NonModalDialog.Shutdown): New method which
9423     does what OnClose did, but can be called by the application to
9424     close a window. Needed when a session changes, and we have to
9425     close the classifier windows.
9426    
9427     * Thuban/UI/mainwindow.py (MainWindow.prepare_new_session):
9428     Shuts down open dialogs. Used when a new session is created
9429     or a session is opened.
9430     (MainWindow.SaveSession): Should only call application.SaveSession()
9431     if we don't call SaveSessionAs first.
9432     (MainWindow.Classify): Allow different classifier dialogs for
9433     different layers.
9434    
9435     * Thuban/UI/tree.py (SessionTreeView): Remove OnClose and let
9436     the parent class handle it. Add Shutdown() to unsubscibe from
9437     event notification and call the parent Shutdown(). This was
9438     necessary so the application can close the tree window.
9439    
9440 jonathan 478 2003-03-06 Jonathan Coles <[email protected]>
9441    
9442     * Thuban/Model/classification.py: Minor documentation changes,
9443     Addition of __eq__ and __ne__ methods.
9444     (Classification.SetLayer): prevent recursion between this method
9445     and Layer.SetClassification().
9446    
9447     * Thuban/Model/color.py: Addition of __eq__ and __ne__ methods.
9448    
9449     * Thuban/Model/layer.py (SetClassification): prevent recursion
9450     between this method and Classification.SetLayer().
9451    
9452     * test/test_classification.py, test/test_load.py,
9453     test/test_session.py: Fixed and added tests for the classification
9454     classes.
9455    
9456 bh 477 2003-03-06 Bernhard Herzog <[email protected]>
9457    
9458     * Thuban/UI/classifier.py (ClassGrid.__init__)
9459     (ClassGrid.CreateTable): Move the SetSelectionMode call to
9460     CreateTable because otherwise it triggers an assertion in
9461     wxPython/wxGTK 2.4.
9462    
9463 jonathan 459 2003-03-05 Jonathan Coles <[email protected]>
9464    
9465 jonathan 475 * Thuban/common.py: Move FIELDTYPE constants back to table.py.
9466 jonathan 471
9467 jonathan 475 * Thuban/Model/load.py: import FIELDTYPE constants from table.
9468 jonathan 471
9469 jonathan 475 * Thuban/UI/classifier.py: import FIELDTYPE constants from table.
9470 jonathan 471
9471 jonathan 475 * Thuban/Model/table.py: Put FIELDTYPE constants back.
9472 jonathan 471
9473     2003-03-05 Jonathan Coles <[email protected]>
9474    
9475 jonathan 459 * Thuban/UI/classifier.py: Added class documentation.
9476     Fixed RTbug #1713, #1714. Added Move[Up|Down] buttons.
9477     Store just the groups in the table and generate the other
9478     column information when it is requested. Add "None" field
9479     to pull-down to select no classification.
9480    
9481     * Thuban/common.py: Moved FIELDTYPE constants from table.py
9482     (Str2Num): Only catch ValueError exceptions.
9483    
9484     * Thuban/Model/classification.py: Class documentation. Renaming
9485     of methods with Stroke to Line. Groups are stored in a single
9486     list with the default as the first element. Groups are searched
9487     in the order they appear in the list.
9488    
9489     * Thuban/Model/color.py: Documentation.
9490    
9491     * Thuban/Model/layer.py (Layer): Add GetFieldType to retreive
9492     the kind of data represented by a field.
9493    
9494     * Thuban/Model/load.py (ProcessSession): Use proper string
9495     conversion function; fixes RTbug #1713.
9496    
9497     * Thuban/Model/save.py (Saver): Store field type information.
9498    
9499     * Thuban/Model/table.py: Put FIELDTYPE constants in common.py.
9500     (Table): Add field_info_by_name() to retrieve field information
9501     by specifying the field name, not the number.
9502    
9503     * Thuban/UI/mainwindow.py: Function name changes.
9504    
9505     * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Only
9506     get the layer classification once. Don't try to classify
9507     values when the field is None: just use the default properties.
9508    
9509     * Thuban/UI/view.py: Function name changes.
9510    
9511     * Doc/thuban.dtd: Add field_type attribute to a classification.
9512    
9513 bh 456 2003-03-04 Bernhard Herzog <[email protected]>
9514    
9515 bh 458 * Doc/thuban.dtd: Use correct syntax for optional attributes. Make
9516     the fill and stroke layer attributes optional with suitable
9517     default values. Add the stroke_width layer attribute. Use correct
9518     syntax for empty elements. Make the attribute list for labels
9519     refer to the label element.
9520    
9521     2003-03-04 Bernhard Herzog <[email protected]>
9522    
9523 bh 456 * setup.py (thuban_build_py.build): Add a comment about distutils in
9524     Python 2.3 containing some of the functionality we implement in
9525     setup.py ourselves.
9526    
9527     * Thuban/UI/classifier.py (ClassGrid.__init__): Set the table
9528     before the selection mode. Doing it the other way round triggers
9529     an assertion in wxWindows.
9530    
9531     * Thuban/Model/save.py (escape): Fix typo in doc-string
9532    
9533     * Thuban/Model/classification.py: Remove unnecessary wxPython
9534     import
9535    
9536 jonathan 448 2003-03-04 Jonathan Coles <[email protected]>
9537    
9538     * Thuban/Model/classification.py (ClassGroupRange.GetProperties):
9539     Parameter 'value' should default to None.
9540    
9541     * Thuban/UI/mainwindow.py: Use Layer.GetClassification() since
9542     the class attribute __classification is now private.
9543    
9544     * Thuban/UI/classifier.py (ClassGrid): Moved OnCellDClick() from
9545     Classifier to ClassGrid. Added support for removing selected rows,
9546     which including code for keeping track of when cells are selected,
9547     and deselected.
9548     (ClassTable): Support for added/removing rows. Fixed a problem
9549     with __ParseInput whereby it would not allow strings (only numbers)
9550     to be entered.
9551     (Classifier): Added button and supporting code for removing
9552     selected rows.
9553    
9554 jonathan 445 2003-02-27 Jonathan Coles <[email protected]>
9555 jonathan 434
9556     * Thuban/common.py: Moved color conversion functions into
9557     Thuban/UI/common.py.
9558     (Str2Num): Now converts the float (not the string) to a long/int
9559     so that an exception isn't thrown.
9560    
9561     * Thuban/UI/common.py: Common functions used in several UI modules
9562    
9563     * Thuban/Model/classification.py: Changed the class hierarchy
9564     so that a Classification consists of Groups which return
9565     Properties when a value matches a Group.
9566    
9567     * Thuban/Model/layer.py: Fixed name resolution problem.
9568    
9569     * Thuban/Model/load.py: Use new Classification and Group functions.
9570    
9571     * Thuban/Model/save.py (Saver.write_attribs): Fixes a test case
9572     failure.
9573     (Saver.write_classification): Use new Classification and Group
9574     functions.
9575    
9576     * Thuban/UI/classifier.py: Changes to use new Classification and Group
9577 jonathan 445 functions. Fix to create a tuple with a single value instead of
9578     simply returning the value.
9579 jonathan 434
9580     * Thuban/UI/renderer.py: Use new Classification and Group functions.
9581     Use common.py functions.
9582    
9583 jonathan 445 * Thuban/UI/tree.py: Use common.py functions.
9584 jonathan 447
9585     * test/test_classification.py: Use new Classification and Group
9586     classes.
9587 jonathan 434
9588 jonathan 426 2003-02-24 Jonathan Coles <[email protected]>
9589    
9590     * Thuban/common.py (Color2wxColour, wxColour2Color): Conversion
9591     functions from Thuban color objects to wxWindow colour objects.
9592    
9593     * Thuban/Model/classification.py (Classification): Renamed
9594     GetProperties() to GetClassData(). Used the new iterator
9595     in TreeInfo().
9596     (ClassIterator): Iterator implementation to iterate over the
9597     ClassData objects in a classification object.
9598    
9599     * Thuban/Model/save.py (Saver.write_classificaton): Uses
9600     the new iterator to save the classification information.
9601    
9602     * Thuban/UI/classifier.py (SelectPropertiesDialog): Support
9603     for changing the stroke and fill colors and previewing the
9604     changes.
9605    
9606     * Thuban/UI/mainwindow.py (MainWindow.OpenSession,
9607     MainWindow.SaveSessionAs): Text string changes so the dialogs
9608     have more meaningful titles.
9609    
9610     * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Change
9611     Classification method name from GetProperties to GetClassData.
9612    
9613     * Thuban/UI/view.py (MapCanvas.find_shape_at): Use method calls
9614     instead of accessing now non-existent class variables.
9615    
9616 bh 425 2003-02-24 Bernhard Herzog <[email protected]>
9617    
9618     * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Remove
9619     unneeded Shape() call. Rendering is substantially faster without
9620     it and it avoids some problems with broken shape files.
9621    
9622 frank 423 2003-02-20 Frank Koormann <[email protected]>
9623    
9624     Force minimal size of identify and label dialogs. The autosizing
9625     looked too ugly.
9626    
9627     * Thuban/UI/controls.py (RecordListCtrl): Set minimal width for columns.
9628     * Thuban/UI/labeldialog.py (LabelDialog.dialog_layout):
9629     Set size of listctrl.
9630     * Thuban/UI/identifyview.py (IdentifyView.__init__):
9631     Set size of dialog.
9632    
9633 jonathan 408 2003-02-19 Jonathan Coles <[email protected]>
9634    
9635     * test/test_classification.py, test/test_layer.py,
9636     test/test_load.py, test/test_map.py, test/test_session.py:
9637     Updated the tests to use the new functions that are in the
9638     respective classes.
9639    
9640     * Thuban/Model/classification.py (Classification):
9641     Uses the new ClassData* classes. Modification messages are
9642     passed up to the parent layer (if it exists).
9643     (ClassData): New class to encapsulate the common data in each
9644     classification property.
9645     (ClassDataDefault): Represents the Default class. data.
9646     (ClassDataPoint): Represents a single class. data point
9647     (ClassDataRange): Represents a class. range
9648     (ClassDataMap): Represents a class. map (unused).
9649    
9650     * Thuban/Model/color.py: Added Color.None to represent something
9651     with no color. Color.Black represents the color black.
9652     (NoColor): Helper class derived from Color to represent something
9653     with no color.
9654    
9655     * Thuban/Model/layer.py (Layer): Removed references to fill, stroke,
9656     stroke_width attributes. Made the 'classification' attribute private.
9657     New methods for setting/getting the classification.
9658    
9659     * Thuban/Model/load.py (ProcessSession): Use new methods on Layer
9660     to get the classifcation and use the new ClassData* classes to
9661     hold the classification data. Use Str2Num to convert numbers
9662     properly.
9663    
9664     * Thuban/Model/save.py (Saver): Use new Color and Classification
9665     methods
9666    
9667     * Thuban/UI/classifier.py (ClassGrid): New class to represent a
9668     custom grid.
9669     (ClassTable): Support for editing Values and Labels and for
9670     changing what type (point or range) of data is stored in each
9671     property based on how the user enters the data.
9672     (Classifier): Support for saving the new classifications and
9673     launching the dialog to edit a property.
9674     (SelectPropertiesDialog): New class for editing the visual
9675     properties of a classification (stroke color, width, and fill color)
9676     (ClassPreviewer): Took the Draw method from ClassRenderer and
9677     made most of it into this new class. Intend to use this class in
9678     the SelectPropertiesDialog for previewing changes.
9679    
9680     * Thuban/UI/renderer.py: Use new Color and Classification methods.
9681    
9682     * Thuban/UI/tree.py: Formatting changes.
9683    
9684     * Doc/thuban.dtd: Add 'label' element
9685    
9686     * Thuban/common.py: New. Contains common routines used throughout
9687     the code.
9688     (Str2Num): Takes a string and converts it to the "best" type of
9689     number.
9690    
9691 bh 405 2003-02-14 Bernhard Herzog <[email protected]>
9692    
9693     * Thuban/UI/view.py (MapCanvas.OnLeftUp): Make sure that the
9694     dragging flag is always set to 0 even when the tool implementation
9695     raises an exception
9696    
9697 bh 402 2003-02-11 Bernhard Herzog <[email protected]>
9698    
9699     * Thuban/UI/application.py (ThubanApplication.splash_screen): New
9700     method to create a splash screen.
9701     (ThubanApplication.ShowMainWindow): New. Show the main window.
9702     Needed so the splash screen can display the mainwindow
9703     (ThubanApplication.OnInit): Call the
9704     new splash_screen method to determine whether the application
9705     should display a splash screen. If it displays a splash screen do
9706     not immediately show the main window.
9707    
9708 jonathan 399 2003-02-11 Jonathan Coles <[email protected]>
9709    
9710     * Thuban/Model/classification.py: Added import line to fix
9711     feature conflicts between running on python2.2 and python2.1.
9712    
9713     * Thuban/UI/classifier.py (ClassTable): Didn't need to hang
9714     onto the clinfo parameter, so removed the deepcopy().
9715    
9716 jonathan 396 2003-02-10 Jonathan Coles <[email protected]>
9717    
9718 tkoester 403 * Thuban/Model/save.py (Saver.open_element, Saver.close_element):
9719 jonathan 396 Added element_open variable to track opening and closing of tags
9720     so that tags that don't span more than one line are closed with
9721     /> instead of </tag_name>. Use the GetDefault*() methods of
9722     the Classification class.
9723    
9724     * Thuban/Model/classification.py (Classificaton): Added set and
9725     get methods for the default data. The class also takes a layer
9726     reference so that modification messages can be sent. Fixed the
9727     methods to use the new ClassData class.
9728     (ClassData): New class to encapsulate the classification data
9729    
9730     * Thuban/Model/layer.py (Layer): Remove the
9731 tkoester 403 Set[Fill|Stroke|StrokeWidth]() methods. Code should call the
9732 jonathan 396 SetDefault*() methods on the layer's classification object.
9733 tkoester 403 (Layer.__init__): Use the new SetDefault*() methods in the
9734 jonathan 396 Classification class.
9735    
9736     * Thuban/Model/load.py (ProcessSession): Use the new ClassData
9737     object instead of a dictionary.
9738    
9739 tkoester 403 * Thuban/UI/classifier.py (ClassRenderer): New class to
9740 jonathan 396 draw the classifications in the dialog box's table.
9741     (Classifier): Modified to use the ClassRenderer class.
9742    
9743 tkoester 403 * Thuban/UI/mainwindow.py (MainWindow): Use the SetDefault*()
9744     methods of the Classification class.
9745 jonathan 396
9746     * Thuban/UI/renderer.py (MapRenderer): Use the Get*() methods
9747     of the ClassData class.
9748    
9749     * test/test_classification.py, test/test_layer.py,
9750     test/test_map.py, test/test_session.py: Fix the tests to work
9751     with the above code changes.
9752    
9753 jonathan 387 2003-02-03 Jonathan Coles <[email protected]>
9754    
9755     * Thuban/Model/classification.py (Classification): Added getNull()
9756     to return the NullData reference
9757    
9758     * Thuban/Model/layer.py (Layer.SetFill, Layer.SetStroke,
9759     Layer.SetStrokeWidth): Modified these functions to change the
9760     null data in the classification rather than keep these values
9761     directly in the Layer class. Menu options to change these values
9762     work again.
9763    
9764 jonathan 380 2003-01-28 Jonathan Coles <[email protected]>
9765    
9766 jonathan 384 * Thuban/UI/classifier.py (Classifier): Resolved merging conflicts.
9767 tkoester 403 Fixed crashing problem on some systems. Dialog box shows
9768 jonathan 380 classification data.
9769    
9770 jonathan 384 * Thuban/UI/tree.py (SessionTreeCtrl.add_items): Handle drawing
9771     Colors in the tree view.
9772    
9773     * Thuban/Model/layer.py (Layer.TreeInfo): Added a call to build
9774     the tree info for classifications. Commented out unnecessary lines.
9775    
9776     * Thuban/Model/classification.py (Classification.TreeInfo): New
9777     function to add information about the classification into the
9778     tree view.
9779    
9780 tkoester 403 2003-01-27 Jan-Oliver Wagner <[email protected]>
9781 jan 375
9782 tkoester 403 * Thuban/__init__.py (_): New.
9783 jan 375
9784     * Thuban/Model/classification.py, Thuban/Model/extension.py,
9785     Thuban/Model/layer.py, Thuban/Model/load.py, Thuban/Model/map.py,
9786 tkoester 403 Thuban/Model/session.py, Thuban/UI/application.py,
9787     Thuban/UI/classifier.py, Thuban/UI/context.py, Thuban/UI/controls.py,
9788     Thuban/UI/identifyview.py, Thuban/UI/labeldialog.py,
9789     Thuban/UI/mainwindow.py, Thuban/UI/menu.py, Thuban/UI/proj4dialog.py,
9790     Thuban/UI/renderer.py, Thuban/UI/tree.py, Thuban/Lib/connector.py,
9791     Thuban/Lib/fileutil.py: Replace user string by _() for i18n.
9792 jan 375
9793 jonathan 370 2003-01-27 Jonathan Coles <[email protected]>
9794    
9795 tkoester 403 * Thuban/Model/layer.py: Classification initialization calls.
9796 jonathan 370
9797 tkoester 403 * Thuban/Model/classification.py: Created class to encapsulate
9798     a layer classification. Supports specific data points and
9799     ranges.
9800 jonathan 370
9801 tkoester 403 * Thuban/Model/load.py: Added support for loading classification
9802     information.
9803 jonathan 370
9804 tkoester 403 * Thuban/Model/save.py: Added support for saving classification
9805     information.
9806 jonathan 370
9807 tkoester 403 * Thuban/UI/classifier.py: Initial class for a dialog box for
9808     specifying classification information.
9809 jonathan 370
9810 tkoester 403 * Thuban/UI/mainwindows.py: Support for opening the classifier
9811     dialog.
9812 jonathan 370
9813 tkoester 403 * Thuban/UI/renderer.py: Support for drawing a layer with the
9814     classification information.
9815 jonathan 370
9816 tkoester 403 * Data/iceland_sample_class.thuban: iceland_sample with
9817     classification data.
9818 jonathan 370
9819 tkoester 403 * test/test_classification: Tests for the Classification class.
9820 jonathan 370
9821 bh 359 2002-12-09 Bernhard Herzog <[email protected]>
9822    
9823 bh 361 * test/test_command.py: New. Tests for the command classes.
9824    
9825 bh 359 * Thuban/UI/command.py (ToolCommand): New class for tool commands.
9826     (Command.IsTool): New method to distinguish between command
9827     switching tools and other commands.
9828    
9829     * Thuban/UI/view.py (MapCanvas.SelectTool): New method to select
9830     the tool to avoid direct assignments to instance variables
9831     (MapCanvas.ZoomInTool, MapCanvas.ZoomOutTool, MapCanvas.PanTool)
9832     (MapCanvas.IdentifyTool, MapCanvas.LabelTool): Use SelectTool to
9833     change the tool
9834    
9835     * Thuban/UI/mainwindow.py (MainWindow.update_command_ui): If an
9836     active tool's command turns insensitive, disable the tool.
9837     (_tool_command): Use the new ToolCommand class
9838    
9839     * Examples/simple_extensions/simple_tool.py (simple_tool): Use the
9840     SelectTool method to change the tool
9841     (iconfile): Use the ToolCommand class
9842    
9843 bh 354 2002-12-03 Bernhard Herzog <[email protected]>
9844    
9845     * Thuban/UI/tree.py (SessionTreeCtrl.normalize_selection): Handle
9846     the case of selected items that are not children of Layers or Maps
9847     properly. Previously this bug would trigger an assertion in
9848     wxWindows.
9849    
9850 frank 352 2002-11-06 Frank Koormann <[email protected]>
9851    
9852 bh 354 * Thuban/UI/mainwindow.py: Altered the order of tools in the
9853     toolbar: First now are all navigation tools (Zoom In/Out, Pan,
9854     Full Extent).
9855 tkoester 403
9856 bh 349 2002-10-23 Bernhard Herzog <[email protected]>
9857    
9858     * setup.py (setup call): version now 0.1.3
9859    
9860     * MANIFEST.in: Add the files in test/
9861    
9862     * test/README: Add note about tests requiring the iceland data
9863    
9864     * Thuban/UI/mainwindow.py (MainWindow.About): Add 2002 to
9865     copyright notice.
9866    
9867 bh 344 2002-10-18 Bernhard Herzog <[email protected]>
9868    
9869     * test/test_map.py
9870     (TestMapWithContents.test_projected_bounding_box): Use an explicit
9871     epsilon.
9872    
9873     * test/support.py (FloatComparisonMixin.assertFloatEqual)
9874     (FloatComparisonMixin.assertFloatSeqEqual): give a more useful
9875     message if the assertion fails and don't return the return value
9876     of self.assert_. In assertFloatSeqEqual the return meant that not
9877     all items of the sequence were compared.
9878    
9879 bh 326 2002-09-20 Bernhard Herzog <[email protected]>
9880    
9881 bh 341 * test/test_fileutil.py: New. Test cases for Thuban.Lib.fileutil
9882    
9883     * Thuban/Lib/fileutil.py: Fixup some whitespace and typos
9884    
9885 bh 338 * test/test_map.py (TestMapWithContents.test_tree_info): Create
9886     the string with the bounding box on the fly because of platform
9887     differences in the way %g is handled.
9888    
9889     * test/test_layer.py (TestLayer.test_empty_layer): Create an empty
9890     DBFfile too because Thuban layers can't yet cope missing DBF
9891     files.
9892    
9893     2002-09-20 Bernhard Herzog <[email protected]>
9894    
9895 bh 326 * test/test_menu.py: Use initthuban instead of
9896     add_thuban_dir_to_path to initialize Thuban.
9897    
9898     * test/support.py (FloatComparisonMixin.assertFloatEqual): New.
9899     Mixin class for float comparisons
9900     (SubscriberMixin): New. Mixin class to test messages sent through
9901     the Connector class
9902    
9903     * test/README: Fix a typo and add the -v flag to the command for
9904     individual tests
9905    
9906 bh 335 * test/test_session.py: New. Test cases for Thuban.Model.session
9907    
9908     * test/test_proj.py: New. Test cases for Thuban.Model.proj
9909    
9910     * test/test_map.py: New. Test cases for Thuban.Model.map
9911    
9912     * test/test_layer.py: New. Test cases for Thuban.Model.layer
9913    
9914     * test/test_label.py: New. Test cases for Thuban.Model.label
9915    
9916     * test/test_connector.py: New. Test cases for Thuban.Lib.connector
9917    
9918     * test/test_color.py: New. Test cases for Thuban.Model.color
9919    
9920     * test/test_base.py: New. Test cases for Thuban.Model.base
9921    
9922 bh 322 2002-09-13 Bernhard Herzog <[email protected]>
9923    
9924     * Thuban/Model/session.py (Session.forwarded_channels): Forward
9925     the CHANGED channel too.
9926    
9927     * Thuban/Model/map.py (Map.forwarded_channels): Forward the
9928     CHANGED channel too.
9929     (Map.__init__): Call the Modifiable constructor as well.
9930    
9931     * Thuban/Model/base.py (Modifiable.UnsetModified): Issue a CHANGED
9932     event if the modified flag changes.
9933     (Modifiable.changed): Tweak the doc-string.
9934    
9935     * Thuban/UI/mainwindow.py (MainWindow.view_position_changed)
9936     (MainWindow.set_position_text): Put the code that puts the text
9937     with the mouse position into the status bar into the new method
9938     set_position_text so that it can overwritten in derived classes.
9939    
9940 bh 317 2002-09-12 Bernhard Herzog <[email protected]>
9941    
9942     * Thuban/UI/mainwindow.py (MainWindow.RunMessageBox): Center the
9943     message box on the main window.
9944    
9945 bh 313 2002-09-11 Bernhard Herzog <[email protected]>
9946    
9947     * Thuban/UI/mainwindow.py: Underline the 'x' in "Exit" instead of
9948     the 'E' because it's less likely to interfere with other menu
9949     entries.
9950 bh 315 (MainWindow.build_menu): remove an incorrect comment.
9951 bh 313
9952 bh 311 2002-09-10 Bernhard Herzog <[email protected]>
9953    
9954     * Thuban/UI/mainwindow.py (MainWindow.Map): New.
9955     (_tool_command): Add sensitive parameter
9956     (_has_visible_map): Sensitivity callback to tools and other
9957     commands that require a visible map. Use it in map_zoom_in_tool,
9958     map_zoom_out_tool, map_pan_tool, map_identify_tool, map_label_tool
9959     and map_full_extent
9960    
9961 bh 308 2002-09-06 Bernhard Herzog <[email protected]>
9962    
9963     * Thuban/UI/mainwindow.py (MainWindow.OnClose): Unsubscribe
9964     VIEW_POSITION
9965    
9966 tkoester 403 2002-09-04 Frank Koormann <[email protected]>
9967 frank 306
9968     * Resources/Bitmaps/fullextent.xpm: Updated Icon (removed "potatoe")
9969    
9970 bh 302 2002-09-02 Bernhard Herzog <[email protected]>
9971    
9972 bh 304 * Thuban/UI/view.py: Get rid of the idle redraw. This is done by
9973     wxWindows already and our implementation doesn't work correctly
9974     with wxGTK 2.3:
9975     (MapCanvas.__init__): Remove the instance variable
9976     (MapCanvas.OnPaint): Always call do_redraw when there's a map to
9977     be drawin
9978     (MapCanvas.OnIdle): Removed.
9979    
9980 bh 302 * Thuban/UI/view.py (MapCanvas.unprojected_rect_around_point): Add
9981     a parameter to determine the size of the rectangle.
9982     (MapCanvas.find_shape_at): Create the box around the point on a
9983     layer by layer basis and make the size depend on the shape type.
9984     This solves a problem with the selection of point shapes at the
9985     border of the layer's bounding box
9986    
9987 bh 292 2002-08-30 Bernhard Herzog <[email protected]>
9988    
9989 bh 300 * Thuban/UI/mainwindow.py (MainWindow.CanRemoveLayer): New method
9990     for the sensitivity of remove layer.
9991     (_can_remove_layer): New. Sensitivity callback for remove layer
9992     (Command layer_remove): Use _can_remove_layer
9993    
9994     * Thuban/Model/map.py (Map.CanRemoveLayer): New method to
9995     determine whether a given layer can be deleted.
9996    
9997 bh 297 * Thuban/UI/view.py (MapCanvas.__init__, MapCanvas.OnPaint)
9998     (MapCanvas.do_redraw): Get rid of the unused update_region
9999     instance variable
10000    
10001 bh 294 * Thuban/UI/view.py: Add/update some doc-strings.
10002    
10003 bh 292 * test/: new subdirectory with a bunch of unit tests.
10004    
10005     * test/README, test/test_table.py, test/test_save.py,
10006     test/test_menu.py, test/test_load.py: Initial set of tests and
10007     brief instructions on how to run them
10008    
10009 bh 287 2002-08-29 Bernhard Herzog <[email protected]>
10010    
10011 bh 291 * Thuban/UI/renderer.py (ScreenRenderer.draw_shape_layer): Handle
10012     arcs with multiple parts.
10013    
10014 bh 289 * Thuban/UI/view.py (ZoomInTool.MouseUp, ZoomOutTool.MouseUp):
10015     Handle degenrate rectangles.
10016    
10017 bh 287 * Thuban/Model/table.py: Make writing records work correctly:
10018     (Table.__init__): Keep track of whether the DBF is open for
10019     writing
10020     (Table.write_record): Open the DBF file for writing when necessary
10021    
10022 bh 285 2002-08-27 Bernhard Herzog <[email protected]>
10023    
10024     * Thuban/Model/table.py (Table.write_record, Table.__init__): Open
10025     dbf files only for reading by default. Use a new writable dbf
10026     object for writing.
10027    
10028 bh 278 2002-08-26 Bernhard Herzog <[email protected]>
10029    
10030 bh 282 * Thuban/UI/mainwindow.py: Refactor the context creation:
10031     (MainWindow.Context): New method to return a context
10032     (MainWindow.invoke_command, MainWindow.update_command_ui): Use the
10033     new method
10034    
10035 bh 278 * Thuban/UI/tableview.py (TableGrid, LayerTableGrid): Split the
10036     layer table specific code from TableGrid into LayerTableGrid
10037     (TableFrame, LayerTableFrame): Split the layer table specific code
10038     from TableFrame into LayerTableFrame
10039 bh 280 (LayerTableGrid.select_shape): Remove a debug print
10040 bh 278
10041     * Thuban/UI/mainwindow.py (MainWindow.LayerShowTable): Use the
10042     LayerTableFrame
10043    
10044 bh 277 2002-08-23 Bernhard Herzog <[email protected]>
10045    
10046     * Thuban/Model/layer.py (Layer.__init__): Make sure we have an
10047     absolute filename.
10048    
10049 bh 269 2002-08-22 Bernhard Herzog <[email protected]>
10050    
10051 bh 275 * Thuban/Model/table.py (Table.write_record): New method to write
10052     records.
10053 tkoester 403 (Table.__init__): Open the DBF file for writing too.
10054 bh 275
10055     * Thuban/UI/controls.py (RecordTable.SetValue): Write the value
10056     into the underlying table.
10057    
10058     * extensions/shapelib/shapefil.h (DBFCommit),
10059     extensions/shapelib/dbfopen.c (DBFCommit): New API function to
10060     commit any changes made to the DBF file.
10061    
10062 bh 271 * Thuban/UI/mainwindow.py (make_check_current_tool)
10063     (_tool_command): Put the code that generates the "checked"
10064     callback into a separate function so that we can reuse it
10065     elsewhere
10066    
10067 bh 269 * Thuban/Model/save.py (Saver): New class to handle serializing a
10068     session into an XML file. The main reason to introduce a class is
10069     that applications built on Thuban can derive from it so that they
10070     can save additional information in a session file.
10071     (save_session): Delegate almost all the work to the Saver class.
10072     Rename the filename argument to file because it may be a file like
10073     object now.
10074    
10075     * Thuban/Model/load.py: Get rid of the Python 1.5.2 compatibility
10076     code. Remove the little test code which would be executed when the
10077     module is run as a script which didn't work anymore since it can't
10078     import the other Thuban modules.
10079     (ProcessSession, load_session): Refactor the ProcessSession to
10080     have one method for each element start and end tag so that derived
10081     classes can easily override the processing of individual tags.
10082     Also, always parse with namespaces enabled because applications
10083     built on top of Thuban will likely use namespaces if they extend
10084     the session file format.
10085    
10086 bh 266 2002-08-21 Bernhard Herzog <[email protected]>
10087    
10088     * setup.py (ThubanInstall.run): Don't repr install_lib_orig
10089     because thubaninit_contents will do it for us.
10090    
10091 tkoester 403 2002-08-16 Jan-Oliver Wagner <[email protected]>
10092 jan 265
10093     * Thuban/UI/mainwindow.py: menu item 'show session tree' now disable if
10094     tree window already open
10095    
10096 bh 259 2002-08-15 Bernhard Herzog <[email protected]>
10097    
10098 bh 263 * Thuban/Model/layer.py (Layer.Destroy): Call the unboundd method
10099     with self.
10100    
10101     * Thuban/UI/view.py (MapCanvas.OnLeftUp): Only release the mouse
10102     when we have actually captured it.
10103    
10104 bh 259 * Thuban/Model/layer.py (Layer.Destroy): New. Explicitly close the
10105     shapefile and destroy the table.
10106    
10107     * Thuban/Model/table.py (Table.Destroy): New. Close the DBF file.
10108    
10109 bh 254 2002-08-14 Bernhard Herzog <[email protected]>
10110    
10111 bh 256 * Thuban/UI/controls.py (RecordTable.__init__): Remove the unused
10112     instance variable columns
10113     (RecordTable.GetTypeName): row and col may be negative in some
10114     cases.
10115    
10116 bh 254 * setup.py (InstallLocal.initialize_options)
10117     (InstallLocal.finalize_options, InstallLocal.user_options): New
10118     option create-init-file to build a thubaninit.py when running
10119     install_local
10120     (InstallLocal.run): Create the thubaninit.py module when requested
10121     (thubaninit_contents): Split the template into several parts and
10122     create a new function thubaninit_contents that creates the
10123     contents of a thubaninit module.
10124     (ThubanInstall.run): Use the new function to create the thubaninit
10125     module.
10126    
10127 bh 252 2002-07-30 Bernhard Herzog <[email protected]>
10128    
10129     * Thuban/UI/application.py (ThubanApplication.OnExit): Do some
10130     cleanup.
10131     (ThubanApplication.MainLoop): Extend to automatically call OnExit.
10132    
10133     * Thuban/Model/session.py (Session.Destroy): Don't bypass the
10134     direct base class' Destroy method.
10135    
10136     * Thuban/Model/map.py (Map.ClearLayers): New method to delete all
10137     layers.
10138     (Map.Destroy): Destroy the label_layer as well and call the
10139     inherited Desatroymethod first so that no more messages are
10140     issued.
10141     (Map.RaiseLayer, Map.LowerLayer): Only issue LAYERS_CHANGED
10142     message if the stacking order actually has changed. Add
10143     doc-strings.
10144     (Map.BoundingBox): Correct the doc-string.
10145     (Map.AddLayer, Map.RemoveLayer, Map.Layers, Map.HasLayers)
10146     (Map.ProjectedBoundingBox, Map.SetProjection): Add doc-strings.
10147    
10148     * Thuban/Model/label.py (LabelLayer.ClearLabels): New to delete
10149     all labels.
10150    
10151 bh 247 2002-07-29 Bernhard Herzog <[email protected]>
10152    
10153     * Thuban/Model/map.py (Map.subscribe_layer_channels)
10154     (Map.unsubscribe_layer_channels): Put the code that (un)subscribes
10155     to a layer's channels into separate methods.
10156     (Map.RemoveLayer, Map.AddLayer): Call the new methods
10157     (Map.Destroy): Unsubscribe from a layer's channels before
10158     destroying it.
10159    
10160     * Thuban/UI/view.py (MapCanvas.find_shape_at): Change the
10161     selected_layer parameter to searched_layer which is the layer to
10162     search in.
10163     (MapCanvas.SelectShapeAt): New parameter layer to restrict the
10164     search to that layer. Return the selected layer and shape.
10165    
10166     * Examples/simple_extensions/simple_tool.py (simple_tool): Fix a
10167     typo
10168    
10169 bh 238 2002-07-24 Bernhard Herzog <[email protected]>
10170    
10171 bh 243 * Thuban/UI/application.py (ThubanApplication.create_session):
10172     Extend the doc string.
10173     (ThubanApplication.subscribe_session)
10174     (ThubanApplication.unsubscribe_session): New methods to
10175     subscribe/unsubscribe to/from session channels.
10176     (ThubanApplication.SetSession): Call the new methods here.
10177     (ThubanApplication.maps_changed, ThubanApplication.set_map):
10178     Renamed set_map to maps_changed. Its now a subscriber for
10179     MAPS_CHANGED.
10180    
10181     * Thuban/UI/view.py (ZoomOutTool.MouseUp): Use the correct
10182     x-coordinate in case of simple clicks
10183    
10184     * Thuban/Model/base.py (Modifiable.changed): Apply the args tuple,
10185     don't pass it as a parameter
10186    
10187     * Thuban/Model/session.py (Session.RemoveMap): New
10188    
10189 bh 238 * Thuban/UI/mainwindow.py (MainWindow.__init__): Turn the initial
10190     window size into a parameter.
10191    
10192 bh 235 2002-07-23 Bernhard Herzog <[email protected]>
10193    
10194 bh 237 * Thuban/UI/menu.py (Menu.item_index): Also search for menus not
10195     just commands.
10196    
10197 bh 235 * Thuban/UI/mainwindow.py (MainWindow.__init__): Change the
10198     parameter list a bit to allow setting the window title and the
10199     initial message in the status bar. Update the callers.
10200    
10201     * Thuban/UI/application.py (ThubanApplication.OnInit)
10202     (ThubanApplication.CreateMainWindow): Put the mainwindow
10203     instantiation into a separate method so that it can be overridden
10204     by a subclass.
10205    
10206 bh 230 2002-07-19 Bernhard Herzog <[email protected]>
10207    
10208 bh 234 * Thuban/Model/session.py: Issue a CHANGED message every time
10209     another changed message is issued to make it easier to get
10210     notified of changes.
10211     (Session): Update the doc string
10212     (Session.forward): Issue changed-events as CHANGED as well.
10213     (Session.changed): Overwrite the inherited version to issue
10214     CHANGED events as well.
10215    
10216     * Thuban/UI/tree.py: We can now simply subscribe to the session's
10217     CHANGED channel to be informed of changes.
10218     (SessionTreeCtrl.session_channels): Not needed any longer.
10219 tkoester 403 (SessionTreeCtrl.unsubscribe_all, SessionTreeCtrl.session_changed):
10220 bh 234 Only have to (un)subscribe CHANGED
10221    
10222     * Thuban/Model/map.py (Map.TreeInfo): Deal better with empty maps.
10223    
10224 bh 230 * Thuban/UI/main.py, Thuban/UI/__init__.py: Move the work-around
10225     for the wxPython locale bug to __init__.py so that it's
10226     automatically executed by anybody using UI code from Thuban.
10227    
10228 bh 225 2002-07-18 Bernhard Herzog <[email protected]>
10229    
10230 bh 228 * Thuban/UI/main.py (main): app no longer needs to be global
10231    
10232     * Thuban/UI/mainwindow.py (MainWindow.__init__): Add application
10233     as parameter and store it in an instance variable
10234     (MainWindow.invoke_command, MainWindow.update_command_ui)
10235     (MainWindow.save_modified_session, MainWindow.NewSession)
10236     (MainWindow.OpenSession, MainWindow.SaveSession)
10237     (MainWindow.SaveSessionAs, MainWindow.ShowSessionTree): Use self's
10238     application object.
10239    
10240     * Thuban/UI/application.py (ThubanApplication.OnInit): Instantiate
10241     the main window with self.
10242    
10243 bh 225 * Thuban/UI/context.py: New module with the context class
10244    
10245     * Thuban/UI/command.py (Command): Update doc string.
10246    
10247     * Thuban/UI/mainwindow.py (MainWindow.invoke_command,
10248     MainWindow.update_command_ui): Pass an instance of the context
10249     class to the command's methods
10250     (check_current_tool, call_method): Handle the new context
10251     implementation
10252    
10253     * Examples/simple_extensions/simple_tool.py (simple_tool,
10254     check_simple_tool): Handle the new context implementation
10255    
10256     * Examples/simple_extensions/simple_command.py (simple_command):
10257     Handle the new context implementation. Update the comments about
10258     the context.
10259    
10260     * Thuban/UI/application.py (ThubanApplication.SetSession): Add
10261     doc-string
10262     (ThubanApplication.Session): New method to return the session
10263     object
10264    
10265     * Thuban/UI/tree.py (SessionTreeCtrl.update_tree): The
10266     interactor's selected_layer may not be a layer of the current
10267     session when the tree is updated while a new session is being set.
10268    
10269 bh 217 2002-07-17 Bernhard Herzog <[email protected]>
10270    
10271     * Thuban/UI/tree.py (color_string): Removed. No longer used.
10272     (SessionTreeCtrl.update_tree, SessionTreeCtrl.add_items): Split
10273     update_tree into update_tree and add_items. The tree now uses a
10274     more generic way to display the contents of the tree.
10275     (SessionTreeCtrl): Add a doc string explaining the TreeInfo method
10276    
10277     * Thuban/Model/layer.py (Layer.TreeInfo),
10278     Thuban/Model/extension.py (Extension.TreeInfo),
10279     Thuban/Model/map.py (Map.TreeInfo),
10280 tkoester 403 Thuban/Model/session.py (Session.TreeInfo):
10281 bh 217 Add TreeInfo methods to implement the new tree view update scheme
10282    
10283 bh 216 2002-07-16 Bernhard Herzog <[email protected]>
10284    
10285     * Thuban/UI/application.py: Don't use "import from" for the
10286     MainWindow. It can't always be resolved.
10287     (ThubanApplication.OnInit): change reference to MainWindow
10288     accordingly.
10289    
10290     * Thuban/UI/menu.py (Menu.SetItems): New method to replace a menu
10291     completely
10292    
10293 bh 213 2002-07-10 Bernhard Herzog <[email protected]>
10294    
10295     * setup.py (create_init_module): New configurable variable whose
10296     default depends on the platform we're running on.
10297     (ThubanInstall.initialize_options): Initialize
10298     self.create_init_module from the global create_init_module
10299     (ThubanInstall.user_options): indictate that the options
10300     create-init-module and init-module-dir have arguments.
10301    
10302     * setup.py: In the setup call change the version number to include
10303     cvs.
10304    
10305     * MANIFEST.in: Add the files in Examples
10306    
10307 bh 205 2002-07-09 Bernhard Herzog <[email protected]>
10308    
10309 bh 210 * setup.py: In the setup call, use the thuban homepage as the
10310     value of the url parameter.
10311    
10312 bh 208 * Examples: New subdirectory for examples.
10313    
10314     * Examples/simple_extensions/simple_tool.xpm,
10315     Examples/simple_extensions/simple_tool.py,
10316     Examples/simple_extensions/simple_command.py,
10317     Examples/simple_extensions/README: Simple examples showing how to
10318     add new commands and tools.
10319    
10320 bh 207 * setup.cfg (bdist_rpm): Add the default value for prefix and tell
10321     bdist_rpm that we also have an install script.
10322     (bdist_inno): Add 2002 to the copyright notice.
10323    
10324 bh 205 * setup.py: Create a file in python's site-packages directory to
10325     make installation of Thuban as a library easier.
10326     (ThubanInstall.user_options): Add two new options,
10327     create-init-module and init-module-dir
10328     (ThubanInstall.expand_with_pure_python_dirs): New method to expand
10329     filenames for installation in the default directories.
10330     (ThubanInstall.select_scheme, ThubanInstall.convert_paths): Extend
10331     the inherited methods to capture some filenames before they're
10332     transformed too much by distutils.
10333     (ThubanInstall.run): Create the init module if requested.
10334     (ThubanInstall.thuban_init_filename): New method to return the
10335     full name of the init module.
10336     (ThubanInstall.get_outputs): Append the filename of the init
10337     module.
10338    
10339 bh 202 2002-07-08 Bernhard Herzog <[email protected]>
10340    
10341 bh 205 * setup.py (thuban_bdist_rpm): Extend this version of bdist_rpm to
10342     handle the prefix properly which means that the default for the
10343     installation prefix should be /usr for RPMs and /usr/local when
10344     doing a normal source install.
10345     (bdist_rpm_install_script): Script to override the default install
10346     commands in the specfile generated by the bdist_rpm command.
10347     (thuban_bdist_rpm.user_options): Add a prefix option
10348     (thuban_bdist_rpm.initialize_options): Init the prefix option.
10349     Create the script files for the spec files as empty files here
10350     (thuban_bdist_rpm._make_spec_file): Override the inherited method
10351     to fill the script files with content.
10352    
10353 bh 202 * Thuban/Model/save.py (relative_filename): Wrapper around
10354     Thuban.Lib.fileutil.relative_filename that accepts an empty dir
10355     argument. save_session now automatically uses this version,
10356     solving a problem when saving to a relative filename.
10357    
10358     * setup.py: In the setup call, make sure that the library
10359     directories are under $prefix/lib not directly under $prefix.
10360    
10361 tkoester 403 2002-06-20 Jan-Oliver Wagner <[email protected]>
10362 jan 199
10363     * Thuban/Model/extension.py: new module to handle extension objects.
10364     * Thuban/Model/messages.py: new messages for extensions.
10365     * Thuban/Model/session.py (Session.Extensions, Session.HasExtensions,
10366     Session.AddExtension): new for handling extensions.
10367     Also some other minor changes to round up extension handling.
10368     * Thuban/UI/tree.py (SessionTreeCrtl:update_tree): Added visualization
10369     of Extension titles and title and names of its objects.
10370    
10371 bh 194 2002-05-29 Bernhard Herzog <[email protected]>
10372    
10373     * Thuban/UI/mainwindow.py (MainWindow.bind_command_events): Bind
10374 bh 202 the events for a command.
10375 bh 194 (MainWindow.add_toolbar_command, MainWindow.add_menu_command):
10376     Call bind_command_events to bind the events. add_toolbar_command
10377     can now bind events too so that it's possible to have commands
10378     that are only available through the toolbar.
10379     (MainWindow.init_ids): New instance variable events_bound to keep
10380     track of for which commands events have been bound.
10381    
10382 bh 190 2002-05-28 Bernhard Herzog <[email protected]>
10383    
10384     * Thuban/UI/menu.py: New module to build and manage menus.
10385    
10386     * Thuban/UI/mainwindow.py: Remove some unused imports.
10387     (MainWindow.__init__, main_menu): move the definition of the main
10388     menu from __init__ to the Menu instance main_menu.
10389     (MainWindow.build_menu_bar, MainWindow.build_menu): New methods to
10390     build the menu bar and sub-menus from a menu description.
10391    
10392     * Thuban/UI/application.py (ThubanApplication.OnInit): Read the
10393     startup file
10394     (ThubanApplication.read_startup_files): New method to run
10395     ~/.thuban/thubanstart.py
10396    
10397 bh 192 * Thuban/UI/mainwindow.py (MainWindow.__init__, main_toolbar):
10398     Move the toolbar definition to the Menu instance main_toolbar.
10399     (MainWindow.build_toolbar): New method to build the toolbar
10400     similar to the build_menu methods
10401    
10402 bh 184 2002-05-23 Bernhard Herzog <[email protected]>
10403    
10404 bh 186 * Thuban/UI/mainwindow.py (MainWindow.__init__): Fix spelling of
10405     layer_outline_color. Fix it in the definition of the command too.
10406    
10407 bh 184 * Thuban/UI/command.py (Command): Fix typo in doc string
10408    
10409 bh 182 2002-05-22 Bernhard Herzog <[email protected]>
10410    
10411     * Thuban/UI/mainwindow.py (MainWindow.RunMessageBox): Fix a typo
10412     in the docstring
10413    
10414 bh 175 2002-05-15 Bernhard Herzog <[email protected]>
10415    
10416 bh 180 * Thuban/Model/layer.py (Layer.open_shapefile): Set bbox to None
10417     when the shapefile is empty.
10418     (Layer.BoundingBox, Layer.LatLongBoundingBox): Both methods may
10419     now return None for empty shapefiles. Update doc-strings.
10420    
10421     * Thuban/Model/map.py (Map.BoundingBox): Add doc-string. Deal with
10422     the layer's bbox being None.
10423    
10424     * Thuban/UI/tree.py (SessionTreeCtrl.update_tree): Deal with the
10425     layer's bbox being None.
10426    
10427 bh 175 * Thuban/UI/view.py (MapCanvas.shape_selected): Only redraw when
10428     necessary.
10429     (MapCanvas.__init__): New instance variables, last_selected_layer
10430     and last_selected_shape to determine how the selection has
10431     changed.
10432    
10433     * Thuban/UI/tableview.py (TableGrid.__init__): Do not call
10434     AutoSizeColumns because it will cause a traversal of the entire
10435     table which for large .dbf files will take a very long time.
10436    
10437 bh 172 2002-05-14 Bernhard Herzog <[email protected]>
10438    
10439     * Thuban/Model/layer.py (Layer.open_shapefile): Choose a better
10440     maximum depth for the tree than shapelib does by default.
10441    
10442 bh 165 2002-05-10 Bernhard Herzog <[email protected]>
10443    
10444     * setup.py (py_modules): The shptree modules doesn't have a
10445     wrapper, so don't include it in the py_modules
10446    
10447 bh 163 2002-05-08 Bernhard Herzog <[email protected]>
10448    
10449     * extensions/shapelib/shptree.c (compare_ints): Make arguments
10450     const void * as in the qsort prototype
10451     (SHPTreeFindLikelyShapes): Remove some unused variables.
10452    
10453     * Thuban/UI/view.py (PanTool.MouseMove): Use the bitmap the view
10454     maintains to redraw the window during a drag.
10455     (MapCanvas.unprojected_rect_around_point): New method to determine
10456     a small region around a point for hit-testing.
10457     (MapCanvas.find_shape_at): Only test the shapes in a small region
10458     around the point.
10459    
10460     * setup.py: Increment the version to 0.1.2
10461    
10462     * Thuban/UI/tree.py (SessionTreeCtrl.unsubscribe_all): Remove a
10463     debug print and set session to None after unsubscribing
10464    
10465 bh 146 2002-05-07 Bernhard Herzog <[email protected]>
10466    
10467 bh 154 * Data/iceland_sample.session, Data/iceland_sample.thuban: Rename
10468     the file to have a .thuban extension.
10469    
10470 bh 152 * Thuban/UI/tree.py (session_channels): New class constant with
10471     all the session channels to subscribe to to update the tree
10472     (SessionTreeCtrl.session_changed): Remember the session so that we
10473     can unsubscribe properly. Use the new class constant to
10474     unsubscribe from the old session and subscribe to the new one.
10475     (SessionTreeCtrl.unsubscribe_all): New method to unsubscribe all
10476     subscriptions of the SessionTreeCtrl.
10477     (SessionTreeView.OnClose): Call the tree's unsubscribe_all method.
10478    
10479     * Thuban/UI/mainwindow.py (MainWindow.__init__): Add the "Show
10480     Session Tree" command to the file menu.
10481    
10482     * Thuban/UI/view.py (MapCanvas.do_redraw): Pass the entire bitmap
10483     as update_region to the renderer.
10484    
10485     * Thuban/UI/renderer.py
10486     (ScreenRenderer.layer_ids, ScreenRenderer.draw_shape_layer): The
10487     update box is now directly a tuple, not a wxRect anymore.
10488    
10489     * Thuban/Model/layer.py (Layer.ShapesInRegion): Remove some debug
10490     prints.
10491    
10492     2002-05-07 Bernhard Herzog <[email protected]>
10493    
10494 bh 146 * setup.py: Add the shptree extension module. See
10495     extensions/pyshapelib/ChangeLog for more details.
10496    
10497     * extensions/shapelib/shpopen.c, extensions/shapelib/shapefil.h,
10498     extensions/shapelib/dbfopen.c: Really update to the versions of
10499     shapelib 1.2.9. For some reason it wasn't really done on
10500     2002-04-11.
10501    
10502     * extensions/shapelib/shptree.c: Modified version of shptree.c of
10503     shapelib 1.2.9. The only real difference is the use of qsort
10504     instead of a bubble sort implementation
10505    
10506     * Thuban/Model/layer.py (Layer.__init__): New instance variable
10507     shapetree to hold the shapelib quadtree for the shapefile
10508     (Layer.open_shapefile): Create the quad tree.
10509     (Layer.ShapesInRegion): New method to return the ids of shapes in
10510     a given region using the quad tree.
10511    
10512     * extensions/thuban/wxproj.cpp (project_points): Fix some typos in
10513     comment
10514     (draw_polygon_shape): Accept both arcs and polygons.
10515     (initwxproj): Use the new PYSHAPELIB_IMPORT_API macro to import
10516     the api.
10517    
10518     * Thuban/UI/renderer.py (MapRenderer.layer_ids): New method to
10519     return the shape ids to be rendered in a given layer.
10520     (MapRenderer.draw_shape_layer): Call layer_ids to get the list of
10521     ids. Use draw_polygon_shape to draw arc shapes as well.
10522     (ScreenRenderer.RenderMap): New parameter for the rectangle that
10523     has to be updated
10524     (ScreenRenderer.layer_ids): Make use of the layer's quadtree by
10525     calling it's ShapesInRegion method.
10526    
10527     * Thuban/UI/view.py (MapCanvas.__init__): New instance variable
10528     update_region for the update region.
10529     (MapCanvas.OnPaint): Maintain the update region
10530     (MapCanvas.do_redraw): Pass the bounding box of the update_region
10531     to the renderer when drawing the bitmap. Reset the update_region.
10532    
10533 bh 129 2002-05-03 Bernhard Herzog <[email protected]>
10534    
10535 bh 131 * Thuban/UI/mainwindow.py (MainWindow.SaveSessionAs,
10536     MainWindow.OpenSession): Change the file extension of the session
10537     files to .thuban
10538    
10539 bh 129 * Thuban/Model/session.py (Session.AddMap, forwarded_channels):
10540     Move the map channels to be forwarded by the session into the
10541 bh 146 class constant with forwarded_channels. Also add
10542     LAYER_PROJECTION_CHANGED and LAYER_VISIBILITY_CHANGED to
10543     forwarded_channels
10544 bh 129
10545     * Thuban/Model/base.py (Modifiable.changed): Fix doc-string (a
10546     typo and some rewording).
10547    
10548 bh 126 2002-05-02 Bernhard Herzog <[email protected]>
10549    
10550     * Thuban/UI/view.py: Keep the temporary bitmap used during drawing
10551     around to speed up most redraws:
10552     (MapCanvas.__init__): New instance variable bitmap which holds the
10553     bitmap
10554     (MapCanvas.do_redraw): Redraw self.bitmap if necessary. Use
10555     self.bitmap to draw.
10556     (MapCanvas.full_redraw): New method to force a full redraw
10557     including the bitmap
10558     (MapCanvas.SetMap): Subscribe full_redraw instead of redraw to
10559     make sure the bitmap is redrawn.
10560     (MapCanvas.projection_changed, MapCanvas.set_view_transform,
10561     MapCanvas.shape_selected): Call full_redraw instead of readraw to
10562     make sure the bitmap is redrawn.
10563     (MapCanvas.OnSize): New method to handle size events so that the
10564     bitmap can be redrawn.
10565    
10566 bh 124 2002-04-29 Bernhard Herzog <[email protected]>
10567    
10568     * Thuban/UI/mainwindow.py (MainWindow.__init__): Subscribe to the
10569     canvas' VIEW_POSITION event
10570     (MainWindow.view_position_changed): Handler for VIEW_POSITION.
10571     Update the text in the status-bar accordingly.
10572    
10573     * Thuban/UI/view.py (MapCanvas): Derive from Publisher as well
10574     (MapCanvas.__del__): Implement because Publisher.__del__ has to be
10575     called.
10576     (MapCanvas.__init__): Bind EVT_LEAVE_WINDOW too. Initialize
10577     current_position
10578     (MapCanvas.set_current_position): New method to set
10579     current_position. Issue a VIEW_POSITION event
10580     (MapCanvas.CurrentPosition): New public method to return the value
10581     of current_position. Should be called when the VIEW_POSITION event
10582     is processed.
10583     (MapCanvas.OnLeftDown, MapCanvas.OnLeftUp, MapCanvas.OnMotion):
10584     Update the position.
10585     (MapCanvas.OnLeaveWindow): Set the position to None.
10586    
10587     * Thuban/UI/messages.py (VIEW_POSITION): New message for the
10588     position in the statusbar
10589    
10590 tkoester 403 2002-04-26 Frank Koormann <[email protected]>
10591 frank 120
10592     * Thuban/UI/mainwindow.py: AddLayer, Dialog title s/session/data
10593    
10594 tkoester 403 2002-04-24 Frank Koormann <[email protected]>
10595    
10596 frank 118 * Resources/Bitmaps/identify.xpm: shadow added
10597    
10598     * Resources/Bitmaps/fullextent.xpm: new
10599 jan 116
10600 tkoester 403 2002-04-22 Jan-Oliver Wagner <[email protected]>
10601 jan 116
10602 tkoester 403 * Thuban/UI/tree.py (update_tree): added test for None on map bounding
10603     box
10604 jan 114
10605 tkoester 403 2002-04-21 Jan-Oliver Wagner <[email protected]>
10606    
10607 jan 114 * Thuban/UI/proj4dialog.py (UTMProposeZoneDialog): new
10608    
10609     * Thuban/UI/tree.py (update_tree): added added map extent
10610    
10611     * Thuban/UI/mainwindow.py (_method_command): extended by parameter
10612 tkoester 403 icon; added map_full_extend as tool
10613 jan 114
10614 tkoester 403 2002-04-19 Jan-Oliver Wagner <[email protected]>
10615 jan 107
10616     * Thuban/UI/mainwindow.py (SaveSession): launch save as dialog for
10617     saving _new_ sessions
10618    
10619     * Thuban/Model/session.py (create_empty_session): new session
10620     don't have a filename (set to None)
10621    
10622     * Thuban/UI/tree.py (update_tree): added filename and modified flag
10623    
10624     * Thuban/Model/load.py (ProcessSession): convert projection
10625     parameters from unicode to regular string
10626    
10627     * Data/iceland_sample.session: Added UTM Zone 26 projection.
10628    
10629 bh 100 2002-04-11 Bernhard Herzog <[email protected]>
10630    
10631     * extensions/shapelib/shapefil.h, extensions/shapelib/shpopen.c,
10632     extensions/shapelib/dbfopen.c: Update to the versions of shapelib
10633     1.2.9
10634    
10635     * setup.py (Lib.wxproj extension): Don't link shpopen.c and put
10636     the pyshapelib directoy into the list of include dirs, so that
10637     pyshapelib_api.h can be found.
10638    
10639     * extensions/thuban/wxproj.cpp (pyshapelib_api): New variable that
10640     holds the pyshapelib C-API
10641     (draw_polygon_shape, point_in_polygon_shape, shape_centroid): Use
10642     pyshapelib_api to access the shapelib functions.
10643     (initwxproj): Import the c_api from the shapelib module and
10644     initialize pyshapelib_api.
10645    
10646 bh 89 2002-04-04 Bernhard Herzog <[email protected]>
10647    
10648 bh 91 * setup.py (thuban_bdist_rpm.initialize_options): Use
10649     initialize_options to create the scripts for the rpm.
10650    
10651 bh 89 * extensions/pyprojection/setup.py (PROJ4_PREFIX): Just use /
10652    
10653 bh 85 2002-04-03 Bernhard Herzog <[email protected]>
10654    
10655 bh 87 * setup.py: Increment version to 0.1.1
10656    
10657 bh 85 * Thuban/UI/mainwindow.py (MainWindow.__init__): Move the "Add
10658     Layer" and "Remove Layer" commands from the layer menu to the map
10659     menu
10660    
10661 bh 83 2002-02-15 Bernhard Herzog <[email protected]>
10662    
10663     * Thuban/Model/layer.py (Layer.Shape): list append only takes one
10664     argument (python <= 1.5.2 erroneously accepted multiuple
10665     arguments)
10666    
10667 bh 81 2002-02-04 Bernhard Herzog <[email protected]>
10668    
10669     * Thuban/UI/identifyview.py (IdentifyGridCtrl): New class to use a
10670     RecordGrid in the identifyview.
10671     (IdentifyView.__init__): Use IdentifyGridCtrl instead of
10672     IdentifyListCtrl. The grid allows editing of the values.
10673    
10674     * Thuban/UI/controls.py (RecordTable, RecordGridCtrl): New classes
10675     implementing a grid for a single row of a thuban table.
10676    
10677     * Thuban/UI/view.py (MapCanvas.SelectShapeAt): Search through all
10678     layers by default. Easier to use than the previous default of only
10679     searching through the select layer which meant that if no layer
10680     was selected, you couldn't select a shape.
10681    
10682     * Thuban/UI/tableview.py (TableGrid.__init__): Fix typo
10683    
10684     * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Honour the
10685     stroke_width attribute
10686    
10687     * Thuban/Model/save.py (save_session): Write the new stroke_width
10688     attribute
10689    
10690     * Thuban/Model/load.py (ProcessSession.startElement): Read the
10691     stroke_width attribute
10692    
10693     * Thuban/Model/layer.py (Layer.__init__): New parameter and
10694     instance variable stroke_width
10695     (Layer.SetStrokeWidth): Set the stroke_width.
10696    
10697 bh 72 2002-02-01 Bernhard Herzog <[email protected]>
10698    
10699     * extensions/thuban/wxproj.cpp (project_points): Fix two
10700     off-by-one errors in the last loop that joins the various parts
10701     together.
10702    
10703 bh 71 2002-01-14 Bernhard Herzog <[email protected]>
10704    
10705     * setup.py (data_dist.make_distribution): Fix some typos
10706    
10707 bh 70 2001-09-18 Bernhard Herzog <[email protected]>
10708    
10709     * README: Slight tweaking in preparation for the 0.1 release
10710    
10711     * setup.cfg: Add section for sdist to create both tgz and zip
10712     archives
10713    
10714     * setup.py: increase version number to 0.1
10715     (data_dist): New command class for data distribution
10716    
10717 bh 64 2001-09-14 Bernhard Herzog <[email protected]>
10718    
10719 bh 70 * Thuban/UI/identifyview.py (IdentifyListCtrl.selected_shape):
10720     Handle the case of no layer (i.e. layer is None) properly.
10721    
10722 tkoester 403 * Thuban/UI/proj4dialog.py (UTMDialog.__init__, Proj4Dialog.__init__):
10723 bh 70 Set the initial selection of the combo boxes to reflect the
10724     projection we're starting with in a way that works on windows,
10725     too.
10726    
10727 bh 64 * Thuban/Lib/connector.py (Connector.print_connections): Print the
10728     puiblisher's ids in hex to make it easier to compare them to the
10729     standard repr of python methods
10730    
10731     * Thuban/Model/map.py (Map.Destroy): Unsubscribe the label_layer
10732     messages
10733    
10734 bh 59 2001-09-13 Bernhard Herzog <[email protected]>
10735    
10736 bh 64 * Thuban/UI/tree.py (SessionTreeCtrl.OnSelChanged): Make sure to
10737     deselect the layer if no layer is selected
10738    
10739 bh 59 * Thuban/UI/view.py (MapCanvas.OnPaint): Only delay drawing to
10740     idle time when there actually is something to draw. If there's
10741     nothing to draw simply clear the window
10742     (MapCanvas.do_redraw): Call dc.EndDrawing and add some comments.
10743     (MapCanvas.SetMap): force a redraw in all cases because
10744     FitMapToWindow doesn't always do it.
10745     (MapCanvas.ZoomFactor): Add an optional parameter, center, to
10746     specify the point to move into the center of the window
10747     (ZoomOutTool.MouseUp, ZoomInTool.MouseUp): If the mouse wasn't
10748     dragged, zoon in/out by a factor of 2
10749 bh 64 (MapCanvas.find_shape_at): Iterate backwards (i.e. with decreasing
10750     index, i.e. reversed drawing order) so that objects appearing to
10751     be in from of others are selected first. This is probably mostly
10752     relevant for point shapes where the symbols used may overlap
10753 bh 59
10754     * Thuban/Model/session.py (create_empty_session): Unset the
10755     modified bit before returning it
10756    
10757     * Thuban/UI/mainwindow.py (MainWindow.NewSession): Use
10758     create_empty_session session to create the new, empty session.
10759    
10760     * Thuban/UI/mainwindow.py (MainWindow.__init__): Set the size of
10761     the tool bitmaps.
10762     (MainWindow.OnClose, MainWindow.save_modified_session): Separate
10763     the code that asks whether the session should be saved into the
10764     new method save_modified_session.
10765     (MainWindow.OpenSession, MainWindow.NewSession): Use the new
10766     method to save modified session here too.
10767    
10768 bh 55 2001-09-11 Bernhard Herzog <[email protected]>
10769    
10770     * setup.py (InnoIconItem): fix typo
10771    
10772     (thuban_bdist_inno.run):
10773     (bdist_inno.run): Move the decision not to create symlinks on
10774     non-nt platforms to thuban_bdist_inno and do it unconditinally
10775     since we never want to create the symlinks here
10776    
10777 bh 48 2001-09-10 Bernhard Herzog <[email protected]>
10778    
10779 bh 53 * Thuban/UI/mainwindow.py (MainWindow.IdentifyTool): Popup the
10780     identify view immediately
10781    
10782     * Thuban/UI/controls.py: New file with two classes RecordListCtrl
10783     and SelectableRecordListCtrl that implement the code shared by the
10784     identify view and the label dialog
10785    
10786     * Thuban/UI/identifyview.py (IdentifyListCtrl): Derive from the
10787     new class RecordListCtrl
10788    
10789     * Thuban/UI/labeldialog.py (LabelDialog.OnOK): Check whether the
10790     return value of GetValue is None instead of using it as a boolean
10791     directly so that Zero numbers are handled properly.
10792     (LabelListCtrl): Derive from the new class
10793     SelectableRecordListCtrl
10794    
10795 bh 48 * Thuban/UI/proj4dialog.py (Proj4Dialog.__init__):
10796     (Proj4Dialog.dialogLayout): Make the window resizable and set the
10797     size of the text control explicitly to make the sizers work on
10798     both Windows and X.
10799    
10800 bh 44 2001-09-07 Bernhard Herzog <[email protected]>
10801    
10802     * Thuban/UI/view.py (MapCanvas.find_shape_at):Add a new parameter
10803     that can limit the search to the currently selected layer.
10804     (MapCanvas.SelectShapeAt): Make sure that the currently selected
10805     layer stays selected even when no shape is found
10806 bh 46 (MapCanvas.FitRectToWindow): If the rect has zero with or zero
10807     height do nothing (avoids zero division errors)
10808 bh 44
10809 bh 32 2001-09-06 Bernhard Herzog <[email protected]>
10810    
10811 bh 42 * Thuban/UI/tree.py (SessionTreeCtrl, SessionTreeView.__init__):
10812     Correct the spelling of SessionTreeCtrl. dabbrev is too damn
10813     convenient :-)
10814     (SessionTreeCtrl.__init__, SessionTreeCtrl.update_tree): Introduce
10815     a new instvar layer_to_item to map layers to tree items
10816     (SessionTreeCtrl.layer_selected): Select the appropriate tree item
10817     to match the current selection in the interactor
10818    
10819 bh 40 * Thuban/UI/interactor.py (Interactor.SelectedLayer):
10820     (Interactor.HasSelectedLayer): New methods to query the current
10821     selection
10822    
10823     * Thuban/UI/mainwindow.py (MainWindow.current_layer):
10824     (MainWindow.has_selected_layer): Simply call the appropriate
10825     interactor method
10826    
10827     * Thuban/UI/mainwindow.py (MainWindow.__init__):
10828     (MainWindow.LayerShowTable):
10829     (MainWindow.identify_view_on_demand): Store the interactor in an
10830     instvar and use that reference instead of going through main.app
10831    
10832 tkoester 403 * Thuban/UI/mainwindow.py (MainWindow.ShowSessionTree):
10833     * Thuban/UI/application.py (ThubanApplication.OnInit):
10834 bh 40 * Thuban/UI/main.py (main): Create the session tree view in main
10835     with the new mainwindow method ShowSessionTree and not directly
10836     the application's OnInit method
10837    
10838     * Thuban/UI/tree.py (myTreeCtrlPanel):
10839     (SessioinTreeCtrl): Rename to SessioinTreeCtrl and turn it into a
10840     TreeCtrl isntead of a panel. This affects most method since we now
10841     refer to self instead of self.tree
10842     (SessionTreeView): New class implementing a non-modal dialog
10843     showing the session tree.
10844    
10845 bh 35 * Thuban/UI/mainwindow.py (MainWindow.LayerShowTable): Pass the
10846     layer to the tableview dialog.
10847    
10848     * Thuban/UI/tableview.py: Add some doc-strings
10849 tkoester 403 (TableGrid):
10850 bh 35 (TableGrid.OnRangeSelect):
10851     (TableGrid.OnSelectCell):
10852     (TableFrame.__init__):
10853     (TableFrame.row_selected):
10854     Selecting rows in the grid view now updates the selected shapes
10855     through the TableFrame. To achieve this we derive TableGrid from
10856     Publisher and introduce the message type ROW_SELECTED which the
10857     TableFrame subscribes to and which is issued by OnRangeSelect and
10858     OnSelectCell
10859    
10860     (DataTable.SelectRow): Removed because it's no longer needed in
10861     the row/shape selection scheme
10862    
10863 bh 32 * Thuban/UI/dialogs.py: New file implementing common classes for
10864     dialogs
10865    
10866     * Thuban/UI/tableview.py (TableGrid.__init__): Don't subscribe to
10867     the SELECTED_SHAPE message anymore. This is now handled by the
10868     parent.
10869     (TableGrid.select_shape): Only update the selection if the shape
10870     is not None.
10871     (TableFrame): Inherit from the new NonModalDialog class.
10872     (TableFrame.__init__, TableFrame.select_shape): Handle the
10873     SELECT_SHAPE message.
10874     (TableFrame.OnClose): Extend the inherited method to unsubscribe
10875     SELECT_SHAPE
10876    
10877     * Thuban/UI/mainwindow.py (MainWindow.init_dialogs):
10878     (MainWindow.add_dialog):
10879     (MainWindow.dialog_open):
10880     (MainWindow.remove_dialog):
10881     (MainWindow.get_open_dialog): New methods to maintain a dictionary
10882     of opened non-modal dialogs.
10883    
10884     (MainWindow.__init__): Initialize the new non-modal dictionary
10885     management code
10886     (MainWindow.LayerShowTable): maintain separate dialogs for each
10887     table using the non-modal dialog management code to only open a
10888     view once for each table.
10889    
10890     (MainWindow.IdentifyTool):
10891     (MainWindow.__init__):
10892     (MainWindow.identify_view_on_demand): Don't open the identify view
10893     in IdentifyTool anymore. This will be done automatically by the
10894     new method identify_view_on_demand which handles the
10895     SELECTED_SHAPE message so that the identify view will be opened on
10896     demand
10897    
10898     * Thuban/UI/identifyview.py (IdentifyListCtrl.__init__): Remove
10899     the interactor argument. The SELECTED_SHAPE message is now handled
10900     by the parent.
10901     (IdentifyView.__init__): Add the interactor argument so that we
10902     can handle the SELECTED_SHAPE message here
10903     (IdentifyView.selected_shape): New method to handle the
10904     SELECTED_SHAPE messages
10905    
10906     * Thuban/UI/identifyview.py (IdentifyView): Derive from the new
10907     NonModalDialog class
10908     (IdentifyView.OnClose): Extend the inherited version to
10909     unsubscribe SELECT_SHAPE
10910    
10911     * Thuban/Model/session.py (Session.UnsetModified): Remove debug prints
10912    
10913 bh 26 2001-09-05 Bernhard Herzog <[email protected]>
10914    
10915     * Thuban/UI/view.py (MapCanvas.__init__): New argument, interactor.
10916 tkoester 403
10917 bh 26 * Thuban/UI/mainwindow.py (MainWindow.__init__): New argument
10918     interactor to pass through to the MapCanvas
10919 tkoester 403
10920 bh 26 * Thuban/UI/application.py (ThubanApplication.OnInit): Use the new
10921     argument to the MainWindow constructor to get rid of the ugly hack
10922     that made main.app available early just so that the mapcanvas
10923     could access the interactor object.
10924    
10925 bh 19 2001-09-04 Bernhard Herzog <[email protected]>
10926    
10927 bh 22 * Thuban/UI/mainwindow.py (MainWindow.RunMessageBox): New method
10928     that runs a modal message box
10929     (MainWindow.OnClose): Use the new method
10930     (MainWindow.RemoveLayer): Just do nothing in case no layer is
10931     selected. The command should be grayed out anyway, so there's no
10932     need to pop up a message box.
10933     (MainWindow.AddLayer): Pop up a message box with an error message
10934     if the shape file can't be opened
10935    
10936     * Thuban/Model/layer.py (Layer.__init__): Open the shapefile
10937     immediately. This will cause an exception in case the file can't
10938     be opened and we can display an appropriate message.
10939    
10940 bh 19 * MANIFEST.in: Add extensions/pyprojection/LICENSE
10941    
10942     * setup.py (thuban_bdist_rpm): New class implementing a Thuban
10943     specific bdist_rpm command.
10944    
10945     * Thuban/UI/main.py: Catch ImportError exceptions when importing
10946     the locale module because it may not be available on some
10947     installations.
10948    
10949     * extensions/pyprojection/LICENSE: Copy of the license text in
10950     Projection.i. Having it in a separate file makes it easier to
10951     refer to license text in e.g. RPMs
10952    
10953 bh 18 2001-09-03 Bernhard Herzog <[email protected]>
10954    
10955 bh 19 * setup.py: use wx-config instead of wxgtk-config because it's
10956     more generic
10957    
10958     * setup.py (ThubanInstall.get_outputs): Add the symlink in
10959     <prefix>/bin to the outputs
10960     (ThubanInstall.link_file): New method to link files. We need this
10961     because the standard copy_files refuses to link non-existing
10962     files.
10963     (ThubanInstall.run): Remove the leading install root from the
10964     script filename if an install root was specified and use the new
10965     link_file method
10966 tkoester 403
10967 bh 18 * Thuban/UI/mainwindow.py (MainWindow.AddLayer): Fit the map to
10968     the window when the first layer is added to the map.
10969    
10970     * setup.py (ThubanInstall.run): Honor the build root (self.root)
10971     when linking thuban.py to <prefix>/bin
10972    
10973 bh 16 2001-08-31 Bernhard Herzog <[email protected]>
10974    
10975     * setup.py: In the setup call, the install parameters shouldn't
10976     have trailing slashes because distutils on non-posix platforms
10977     doesn't like that. The same applies to other directories like
10978     "Resources/Bitmaps"
10979    
10980     In the configuration section for nt, move the wxWindows directory
10981     optins into the part clearly marked as editable.
10982    
10983     (InstallLocal.initialize_options):
10984     (InstallLocal.user_options): remove the currently unused debug
10985     flag
10986     (thuban_build_py.find_all_modules): Add this method so that it
10987     works for our case of having packages and modules in one
10988     distribution as well.
10989     (ThubanInstall.initialize_options):
10990     (ThubanInstall.finalize_options):
10991     (ThubanInstall.user_options):
10992     (ThubanInstall.boolean_options): Add new options, do-symlink and
10993     extra files. Since these are the first ThubanInstall specific
10994     options, override user_options and boolean_options
10995     (ThubanInstall.run): Honor the new do-symlink and extra-files
10996     options.
10997     (ThubanInstall.get_outputs): Add to override the base-class's
10998     version and add the extra-files to the outputs
10999     (bdist_inno): New class for windows distributions with Inno Setup
11000     (InnoIconItem): Helper class for bdist_inno
11001     (thuban_bdist_inno): Thuban specific version of bdist_inno. Added
11002     this together with the appropriate parameters, to the setup call.
11003 tkoester 403
11004 bh 16 * setup.cfg (bdist_inno): added new section for the inno setup
11005     installer
11006    
11007     * Thuban/UI/tree.py (myTreeCtrlPanel.__init__): New inst var
11008     changing_selection to avoid recursive selection events when
11009     modifying the selection in response to a selection event.
11010     (myTreeCtrlPanel.normalize_selection): Set the new inst var when
11011     changing the tree's selection.
11012     (myTreeCtrlPanel.OnSelChanged): Only normalize the selection when
11013     we're not being called indirectly from normalize_selection.
11014    
11015     * Thuban/UI/mainwindow.py (MainWindow.update_command_ui): Call
11016     event.Check only if the command is actuall checkable.
11017     (MainWindow.__init__): Call the toolbar's Realize method to make
11018     sure that the items are actually shown
11019    
11020 bh 7 2001-08-28 Bernhard Herzog <[email protected]>
11021    
11022 bh 9 * setup.py: Fix some doc strings
11023    
11024 bh 7 * ChangeLog: started
11025    

Properties

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

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26