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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 2532 - (hide annotations)
Thu Jan 20 20:29:20 2005 UTC (20 years, 1 month ago) by russell
Original Path: trunk/thuban/ChangeLog
File size: 429583 byte(s)
Resources/Projections/defaults.proj: Ruin the speling of the
Lambert-93 projection so it doesn't run into the unicode bug.
It's the wrong thing to do in the long run, but it's necessary
until that bug is fixed.  Otherwise the projection dialog
segfaults.

1 russell 2532 2005-01-20 Russell Nelson <[email protected]>
2    
3     * Resources/Projections/defaults.proj: Ruin the speling of the
4     Lambert-93 projection so it doesn't run into the unicode bug.
5     It's the wrong thing to do in the long run, but it's necessary
6     until that bug is fixed. Otherwise the projection dialog
7     segfaults.
8    
9 bernhard 2531 2005-01-20 Bernhard Reiter <[email protected]>
10    
11     * Thuban/UI/mainwindow.py(view_position_changed): Added docstring
12     and comment that the warning code here is a hack.
13    
14 russell 2529 2005-01-20 Russell Nelson <[email protected]>
15    
16 bernhard 2530 * Thuban/UI/mainwindow.py(view_position_changed): Warn user about
17     misprojected layers when their lat/lon bounding
18 russell 2529 box exceeds rational lat/lon values.
19    
20 bernhard 2525 2005-01-20 Bernhard Reiter <[email protected]>
21    
22 bernhard 2528 * Thuban/UI/about.py (unicodeToLocale()): Improved:
23     Use 'ascii' and then 'replace' for other characters
24     when getdefaultlocale returns None. Thanks to Bernhard H. .
25    
26     2005-01-20 Bernhard Reiter <[email protected]>
27    
28 bernhard 2527 * Thuban/UI/classgen.py (OnRetrieve()): Added a comment
29     that OnRangeText might be called twice and using None as argument.
30    
31     2005-01-20 Bernhard Reiter <[email protected]>
32    
33 bernhard 2526 * Thuban/UI/classgen.py (OnRetrieve()): Add a OnRangeText(0)
34     to work around a different in wx Behaviour noticed on MacOSX,
35     thanks to Lorenzo Moretti and Daniel Calvelo for the fix.
36    
37     2005-01-20 Bernhard Reiter <[email protected]>
38    
39     * Thuban/UI/about.py: take iso-8859-15 when getdefaultlocale returns
40 bernhard 2525 None. (Fixes rt#2910.)
41    
42 frank 2524 2005-01-18 Frank Koormann <[email protected]>
43    
44     New Extension: mouseposition
45     Tool to collect mouse click positions (map coordinates) in a dialog.
46    
47     * Extensions/mouseposition/__init__.py: New, extension registration
48    
49     * Extensions/mouseposition/mouseposition.py: New, implements the
50     dialog and adds a tool to Thuban mainwindow.
51    
52     * Extensions/mouseposition/position.xpm: New, icon for tool.
53    
54 jan 2522 2005-01-14 Jan-Oliver Wagner <[email protected]>
55    
56     * Doc/manual/thuban-manual-de.xml: More translations.
57    
58 frank 2520 2005-01-11 Frank Koormann <[email protected]>
59    
60     * Thuban/UI/mainwindow.py (MainWindow.DuplicateLayer):
61     Fix indention bug.
62    
63 frank 2517 2005-01-09 Frank Koormann <[email protected]>
64    
65     * Thuban/UI/mainwindow.py (MainWindow.DuplicateLayer):
66 frank 2520 BugFix 2901: Explicitly copy layers ClassificationColumn since it
67 frank 2517 is not part of the layers Classification.
68    
69 frank 2515 2005-01-03 Frank Koormann <[email protected]>
70    
71 frank 2517 * Thuban/UI/renderer.py (ScreenRendererdraw_selection_incrementally):
72     BugFix 2883: Former implementation only worked on classified point
73     layers: KeyError was raised, now use the default size if field is None.
74 frank 2515
75 bernhard 2513 2004-12-27 Bernhard Reiter <[email protected]>
76    
77     svgexport 1.0.0cvs: Fixed label export.
78    
79     * Extensions/svgexport/test/test_svgmapwriter.py:
80     class TestSVGRenderer(): New class; new test test_label_font().
81    
82     * Extensions/svgexport/svgmapwriter.py
83     (SVGRenderer.label_font()): initialised Font size with self.factor now,
84     makes test_label_font happy.
85    
86     * Extensions/svgexport/TODO: crossed out fixed label export item.
87     Added item for options.
88    
89     * Extensions/svgexport/__init__.py: Bumped version to 1.0.0cvs.
90    
91 russell 2511 2004-12-27 Russell Nelson <[email protected]>
92    
93 jan 2512 Middle mouse button pans.
94 russell 2511
95 jan 2512 * Thuban/UI/view.py (MapCanvas.__init__): Subscribe also
96     OnMiddleDown and OnMiddleUp events.
97     (MapCanvas.OnMiddleDown): New. Activate the pan tool and remember the
98     previously used tool.
99     (MapCanvas.OnMiddleUp): New. Reactivate the remebered tool used before
100     pressing the middle mouse button.
101    
102 jan 2509 2004-12-27 Jan-Oliver Wagner <[email protected]>
103    
104     * Doc/manual/thuban-manual-de.xml: More translations.
105    
106 jan 2506 2004-12-23 Jan-Oliver Wagner <[email protected]>
107    
108     * Thuban/UI/projdialog.py (ProjFrame.load_user_proj): Added a
109     \n to stderr after the warnings. Thanks to Russell Nelson.
110    
111 nhueffme 2493 2004-12-20 Nina Hueffmeyer <[email protected]>
112    
113     * Extensions/ogr/ogrshapes.py: Fixed some issues from
114     Bernhard (coding guidelines etc.). Additionally it is now possible to
115     display shapefiles containing feature collections (e.g.polygons
116     with holes). Works with gdal 1.2.1 now.
117    
118     * Extensions/ogr/test/test_OGRShapestore.py: Fixed some issues
119     from Bernhard (coding guidelines etc.). If ogr can't be imported,
120     tests are skipped now.
121    
122     * Extensions/ogr/ogrstart.py: Fixed some typings.
123    
124 bernhard 2490 2004-12-20 Bernhard Reiter <[email protected]>
125    
126     * Extensions/svgexport/TODO: updated to add support for
127     raster layers and labels for 1.0.1.
128    
129     * Extensions/svgexport/svgmapwriter.py (draw_raster_layer):
130     Issue a warning now.
131    
132 bernhard 2488 2004-12-19 Bernhard Reiter <[email protected]>
133    
134 bernhard 2489 * Extensions/svgexport/TODO: Added idea to support triggering
135     the application down the pipe.
136    
137     2004-12-19 Bernhard Reiter <[email protected]>
138    
139 bernhard 2488 svgexport: Improved code quality, mainly by better naming.
140    
141     * Extensions/svgexport/svgmapwriter.py:
142     DrawPath() renamed to DrawPolygonPath(),
143     added documentation, improved comments and variable names.
144    
145     * Extensions/svgexport/svgmapwriter.py,
146     Extensions/svgexport/test/test_svgmapwriter.py:
147     All using DrawPolygonPath() now, the default parameter closed=True
148     omitted.
149    
150     * Extensions/svgexport/test/test_svgmapwriter.py:
151     renamed test_polygon_opened() to test_polyline()
152     renamed test_transparent_polygon() to test_transparent_polyline()
153    
154 jan 2487 2004-12-18 Jan-Oliver Wagner <[email protected]>
155    
156     Some fixes of gns2shp extension.
157    
158     * Extensions/gns2shp/test/__init__.py: New. Make this directory a
159     package.
160    
161     * Extensions/gns2shp/test/test_gns2shp.py: Add some import paths
162     dynamically.
163    
164     * Extensions/gns2shp/test/README: Simplified description how to test.
165    
166     * Extensions/gns2shp/gns2shp.py (gns2shp): Fixed doc-string,
167     fixed some dimensions of fields according to the GNS documentation
168     which seems to change undocumented.
169     Now killing trailing \n and/or \r from MODIFY_DATE.
170     This fixes RT#2453.
171    
172 bernhard 2479 2004-12-18 Bernhard Reiter <[email protected]>
173 bernhard 2480
174 bernhard 2482 svgexport 1.0.0: Treats holes and islands nicely. Documentation added.
175    
176     * Extensions/svgexport/test/test_svgmapwriter.py:
177     Added new tests: test_export_polygon_with_hole()
178     and test_polygon_with_hole().
179    
180     * Extensions/svgexport/svgmapwriter.py
181     (draw_polygon_shape()): Uses DrawPath correctly now.
182    
183     * Doc/manual/thuban-manual.xml: Added documentation for stable
184     extention svgexport.
185     * Doc/manual/thuban-manual-de.xml: Copied English section about
186     svexport over.
187    
188 jan 2509 * Extensions/svgexport/__init__.py: Bumped version number to 1.0.0.
189 bernhard 2482
190     * Extensions/svgexport/svgsaver.py,maplegend.py:
191     Moved from experimental to stable extension menu.
192    
193     * Extensions/svgexport/TODO: updated.
194    
195    
196     2004-12-18 Bernhard Reiter <[email protected]>
197    
198 bernhard 2481 Added Extensions/svgexport/TODO
199    
200     2004-12-18 Bernhard Reiter <[email protected]>
201    
202 bernhard 2480 Refactored in svgexport:
203     DrawPath replaces DrawPolygon; added newline in front of "M" in paths.
204    
205     * Extensions/svgexport/svgmapwriter.py
206     Added verbosity level 3 to print out polygon points.
207     (class Point): added __repr__
208     (class Brush, __str__()): Added space after ,.
209     (DrawPolygon): Renamed to DrawPath()
210     (DrawPath): Takes list of polygons as input now, adds \n before "M"s.
211     (DrawLines): Using DrawPath now.
212    
213     * Extensions/svgexport/test/test_svgmapwriter.py:
214     Replaced DrawPolygon() calls with DrawPath() and put the first argument
215     inside another list. Adapted test data with a newline before "M".
216    
217     2004-12-18 Bernhard Reiter <[email protected]>
218 bernhard 2479
219     Refactored svgexport tests: 9 double tests runs eliminated;
220     code size reduced by 8 lines.
221    
222     * Extensions/svgexport/test/test_svgmapwriter.py:
223     (class TestWithDC): Renamed to BaseTestWithDC, moved to top.
224     (class BaseWithDCtools): New, subclass from BaseTestWithDC.
225     (class TestDrawSplines): now subclass from BaseTestWithDCtools,
226     this fixed the double running of the nine tests of TestVirtualDC.
227     (class TestVirtualDC): Using self.dc and self.file from setUp().
228    
229 bh 2478 2004-12-17 Bernhard Herzog <[email protected]>
230    
231     Two windows specific fixes ported from thuban-1­0-branch:
232    
233     * Thuban/UI/about.py (unicodeToLocale): Use getdefaultlocale
234     instead of getlocale because getlocale doesn't return a usable
235     encoding name on a german windows 2000
236    
237     * setup.py: windows build: Removed the absolute path names and
238     made all prfixes relative to the directory containing setup.py.
239     Makes it a little easier to adapt to a different system.
240    
241 bh 2470 2004-12-16 Bernhard Herzog <[email protected]>
242    
243 bernhard 2479 Add support for PostGIS tables with LINESTRING geometries.
244 bh 2472 Fixes RT#2299
245    
246     * Thuban/Model/postgisdb.py (shapetype_map): Add LINESTRING
247    
248     * test/postgissupport.py
249     (PostgreSQLServer.get_default_static_data_db): Rename the "roads"
250     table to "roads-multi" because it now uses MULTILINESTRING
251     geometries and introduce a new "roads" table that uses LINESTRING
252     (coords_to_multilinestring): Make the doc string more precise
253     (coords_to_linestring): New. Create a LINESTRING WKT
254     representatin
255     (wkt_converter): Add coords_to_linestring
256     (upload_shapefile): Rephrase the doc-string a bit.
257    
258     * test/test_postgis_db.py (TestPostGISShapestoreArc)
259     (LineStringTests)
260     (TestPostGISShapestoreLineString)
261     (TestPostGISShapestoreMultiLineString): Split
262     TestPostGISShapestoreArc into a base class LineStringTests and two
263     derived classes TestPostGISShapestoreLineString for LINESTRING
264     geometries and TestPostGISShapestoreMultiLineString for
265     MULTILINESTRING geometries. Most test methods are in the base
266     class with the exception of tests that explicitly check the raw
267     format.
268    
269     2004-12-16 Bernhard Herzog <[email protected]>
270    
271 bh 2471 Make the test suite work with PostGIS 0.8.2 and PostgreSQL 7.4
272    
273     * test/postgissupport.py (find_postgis_sql): Different postgis
274     versions put the postgis.sql file into slightly different places
275     so we have to look in both. The updated doc string describes this
276     is more detail.
277    
278     * test/test_postgis_db.py
279     (TestPostGISSpecialCases.test_column_name_quoting): The return
280     value of UniqueValues is unsorted, so it has to be sorted for
281     comparison.
282    
283     2004-12-16 Bernhard Herzog <[email protected]>
284    
285 bh 2470 Fix for RT#2237
286    
287     * Thuban/UI/projdialog.py (ProjFrame._show_proj_panel): If the
288     panel to be shown is the UnknownProjPanel disable the OK and Try
289     buttons. Otherwise enable them.
290     (ProjFrame.__GetProjection): The UnknownProjPanel returns None for
291     the parameters. In that case __GetProjection also returns None
292     now.
293    
294 bh 2459 2004-12-15 Bernhard Herzog <[email protected]>
295    
296 bh 2462 * Thuban/UI/classgen.py (GenQuantilesPanel.__init__): Set the
297     minimum number of classes to 2. The calculate_quantiles needs at
298     least two and raises an exception otherwise.
299     Fixes RT#2549
300    
301     2004-12-15 Bernhard Herzog <[email protected]>
302    
303 bh 2460 * test/postgissupport.py (PostgreSQLServer.execute_sql): Extend to
304     so that it returns a result for select statements.
305     (PostgreSQLServer.server_version): New. Return the version of the
306     server software.
307     (PostgreSQLServer.require_authentication): The format of
308     pg_hba.conf has changed between PostgrSQL 7.2 and 7.3. Check the
309     server version and generate the file in the correct format
310    
311     2004-12-15 Bernhard Herzog <[email protected]>
312    
313 bh 2459 * test/postgissupport.py (PostgreSQLServer.is_running): Fix typo
314     in the doc string and rephrase it a little.
315    
316 frank 2457 2004-12-15 Frank Koormann <[email protected]>
317    
318     * test/test_load.py (TestAltPath.checkSession): New, extended checks if
319     session has been loaded successfully. The check is called by the relevant
320     tests after executing load_session().
321    
322 bh 2450 2004-12-13 Bernhard Herzog <[email protected]>
323    
324 bh 2454 Make sure the region used to determine which shapes are visible
325     actually matches the region on the printed page. If this isn't
326     done properly some shapes might not be printed.
327     Fixes RT #2692
328    
329     * Thuban/UI/view.py (MapPrintout.draw_on_dc): The region for the
330     renderer has to be at the same position as the mapregion
331    
332     * Thuban/UI/renderer.py (ExportRenderer.RenderMap): self.region
333     has to be moved by (self.shiftx, self.shifty) too.
334    
335     2004-12-13 Bernhard Herzog <[email protected]>
336    
337 bh 2452 * libraries/pyprojection/Projection.i: Work around a bug in the
338     generated python code which leads to exception in the __del__
339     method when the constructor fails. See the comments in the code
340     for more details.
341    
342     * libraries/pyprojection/Projection.py: Updated from Projection.i
343     with SWIG.
344    
345     2004-12-13 Bernhard Herzog <[email protected]>
346    
347 bh 2451 * test/test_load.py (TestAltPath.test_01_single_path_error_fix)
348     (TestAltPath.test_02_path_error_fix_from_list)
349     (TestAltPath.test_05_path_error_fix_from_list_changed)
350     (TestAltPath.test_06_path_error_fix_from_list_fails): self.session
351     is destroyed in tearDown, so there's no need to do it in a test
352     case.
353    
354     * Thuban/Model/load.py (SessionLoader.open_shapefile): Remove a
355     debug print
356    
357     2004-12-13 Bernhard Herzog <[email protected]>
358    
359 bh 2450 * Extensions/svgexport/test/test_svgmapwriter.py
360     (TestDrawSplines.setUp): Do not use super with the unittest
361     classes because in Python 2.2 they're still old-style classes.
362    
363 frank 2448 2004-12-13 Frank Koormann <[email protected]>
364    
365     Alternative Path feature: When loading a (moved) session where
366     shapefiles cannot be found, ask the user. Use the specified path
367     if further shapefiles are missing. However, ask the usr for confirmation
368     in such cases.
369    
370     * test/test_load.py (TestAltPath): New, tests for alternative path feature
371     in load_session()
372     (Shapefile_CallBack): Helper, implements controllable callback.
373    
374     * Thuban/UI/application.py (ThubanApplication.OnInit):
375     Added "alt_path" to self.path
376     (ThubanApplication.OpenSession): Added shapefile_callback as second
377     callback similar to db_connection_callback.
378     (ThubanApplication.run_alt_path_dialog): New, implementaion of
379     shapefile_callback. In addition to raising the dialog the control of
380     self.path('alt_path') is implemented here.
381    
382     * Thuban/Model/load.py (SessionLoader.__init__): Added shapefile_callback.
383     (SessionLoader.open_shapefile): Open shapefile, eventually with
384     alternative path. This wrapps the "theSession.OpenShapefile(filename)"
385     formerly used in start_fileshapesource()/start_layer().
386     (SessionLoader.start_fileshapesource): Call open_shapefile().
387     (SessionLoader.start_layer): Call open_shapefile().
388     (load_session): Added shapefile_callback.
389    
390     * Thuban/UI/altpathdialog.py: New, implements dialogs for alternative path
391     feature (search / check).
392    
393     * Doc/manual/thuban-manual.xml: Added documentation of new feature.
394    
395 bernhard 2443 2004-12-11 Bernhard Reiter <[email protected]>
396    
397 bernhard 2445 svgexport 0.9.2: Point size supports for maps.
398    
399     * Extensions/svgexport/svgmapwriter.py: Added import of SHAPETYPE_POINT
400     (def draw_point_shape): new parameter size defaults to 2 as before.
401     (draw_shape_layer_incrementally): Moved draw_func log line higher.
402     Added draw_func call with size when dealing with a point layer.
403    
404     * Extensions/svgexport/__init__.py: bumped version to 0.9.2.
405    
406     2004-12-11 Bernhard Reiter <[email protected]>
407    
408 bernhard 2444 Made sure that newlines are inserted in the svg path d attributes
409     to raise the chance that the line length will be below 255 characters,
410     as recommended by REC SVG 1.1 in section 8.3.1.
411    
412     * Extensions/svgexport/svgmapwriter.py(DrawPolygon):
413     Adding \n before L's and changed whitespace handling.
414    
415     * Extensions/svgexport/test/test_svgmapwriter.py:
416     Adapted tests to new whitespace handling of DrawPolygon.
417    
418     2004-12-11 Bernhard Reiter <[email protected]>
419    
420 bernhard 2443 * Doc/technotes/coding_guidelines.txt: easy typo fixed.
421    
422     * Extensions/svgexport/test/test_svgmapwriter.py:
423     Removed test_drawbezier in favour of new test_drawspline3 and
424     test_drawspline4 within new class TestDrawSplines(TestVirtualDC).
425     All only to test DrawSpline.
426    
427     * Extensions/svgexport/svgmapwriter.py(DrawSpline):
428     New implementation now really using the strange algorithm of
429     xfig 3.1's approximated splines and its conversion to postscript
430     with one twist: SVG can do quadratic beziers, so skipped translation
431     to cubic beziers.
432     (TestWithDC): Typo in comment fixed.
433    
434 joey 2442 2004-12-09 Martin Schulze <[email protected]>
435    
436     * Thuban/Model/classgen.py: Added missing character encoding
437    
438     * Extensions/wms/properties.py (OpenWMSProperties): removed
439    
440     * Extensions/wms/parser.py (WMSCapabilitiesParser.error): Dropped
441     support for get_srs_discrepancies() since there are no
442     discrepancies anymore (was a thinko)
443    
444     * Extensions/wms/layer.py (WMSLayer.GetMapImg): Improved graphic
445     format priority now that more formats are supported globally by
446     the render engine.
447    
448 silke 2437 2004-12-08 Silke Reimer <[email protected]>
449     * Extensions/ogr/ogrshapes.py: Substituted ogr-method CloseRings
450     because it is not available in all versions of ogr
451    
452 bernhard 2436 2004-12-08 Bernhard Reiter <[email protected]>
453     * Extensions/ogr/__init__.py: Added empty __init__.py to heal
454     global tests until a real one is commited.
455    
456 nhueffme 2435 2004-12-07 Nina Hüffmeyer <[email protected]>
457    
458     * /Extensions/ogr/: Adding a new extension to read shapefiles with
459     ogr. It is planned to add other vector formats.
460    
461     * /test/runtests.py: Adding tests from /Extensions/ogr/test/.
462    
463 jan 2434 2004-12-07 Jan-Oliver Wagner <[email protected]>
464    
465     * /Extensions/svgexport/test/test_svgmapwriter.py: Reverting
466     part of a (non-)fix to renable that the tests are always
467     executed.
468    
469 bernhard 2432 2004-12-07 Bernhard Reiter <[email protected]>
470    
471     * Extensions/svgexport/test/test_svgmapwriter.py:
472     Added test_drawbezier() to test DrawSpline().
473    
474     * Extensions/svgexport/svgmapwriter.py(DrawSpline):
475     Really implemented bezier drawing.
476    
477     * Extensions/svgexport/__init__.py: Bumped version of svgexport
478     to 0.9.1 because now the legend examples lines styles
479     will be drawing with beziers.
480    
481 joey 2431 2004-12-05 Martin Schulze <[email protected]>
482    
483     * Thuban/UI/renderer.py (raster_format_map): Added PNG, TIFF and
484     GIF as supported bitmap image formats (helpful for the WMS extension)
485    
486 joey 2430 2004-11-30 Martin Schulze <[email protected]>
487    
488     * Extensions/wms/test/test_ogclib.py (TestOGCLib.test_compareURLs):
489     Improved the test for the internal compare method
490    
491 jan 2429 2004-11-27 Jan-Oliver Wagner <[email protected]>
492    
493     * Thuban/UI/about.py (About.__init__): Added
494     Norbert Solymosi for hungarian translation and Ole Rahn
495     as contrbutor. Moved Bernhard Reiter from Contributor
496     to Developer.
497    
498 bernhard 2425 2004-11-27 Bernhard Reiter <[email protected]>
499    
500     * Extensions/svgexport/test/test_svgmapwriter.py:
501     Removed Jan from author list as he did not change enough significant
502     lines yet.
503    
504     * Extensions/svgexport/__init__.py: Added Bernhard as author
505     of the Extension.
506    
507 jan 2422 2004-11-27 Jan-Oliver Wagner <[email protected]>
508    
509     * po/hu.po: New. Hungarian translation. Contributed
510     by Norbert Solymosi.
511    
512 bh 2419 2004-11-26 Bernhard Herzog <[email protected]>
513    
514     * Extensions/svgexport/test/test_svgmapwriter.py
515     (Testobjectexport.test_transparent_polygon): Commented out some
516     debug prints
517    
518 jan 2418 2004-11-24 Jan-Oliver Wagner <[email protected]>
519    
520     Fix broken tests for svg extension and added svg legend
521     to Experimental menu.
522    
523     * Extensions/svgexport/test/test_svgmapwriter.py: Fix to have
524     the test run correctly even if the extension is a package.
525     Also removed the "import Thuban" which makes no sense.
526    
527     * Extensions/svgexport/__init__.py: Fix to have the extensions'
528     test module also be executed from the global test routine.
529     This is done by looking for the absense of the DISPLAY variable.
530    
531     * Extensions/svgexport/maplegend.py: Moved the menu entry from Extensions
532     to Experimental menu since this module has yet not reached a stable
533     status (ie. 1.0).
534    
535 bernhard 2414 2004-11-22 Bernhard Reiter <[email protected]>
536    
537     * Extensions/svgexport/svgmapwriter.py:
538     Added verbose variable and some logging depending on it.
539     (class VirtualDC(XMLWriter)): Minor improvement in the polygon loop,
540     because counting i is not necessary.
541     (class Pen, class Brush): Added simple __str__ methods.
542     (SVGRenderer.draw_polygone_shape): Fix #2698 (transparent polygons are
543     not exported to svg file) Note: holes still unhandled.
544    
545     * Extensions/svgexport/test/test_svgmapwriter.py:
546     Made a baseclass TestWithDC for test needed a DC.
547     Added tests for bug #2698 (transparent polygons are not
548     exported to svg file):
549     Testobjectexport.test_transparent_polygon()
550    
551     * Thuban/Model/base.py (UnsetModified):
552     Fixed some typos in docstring.
553    
554     * Thuban/UI/baserenderer.py (BaseRenderer.draw_polygon_shape()):
555     Added hints on the used algorithm for handling holes.
556    
557 jan 2403 2004-11-20 Jan-Oliver Wagner <[email protected]>
558    
559 jan 2412 Some face lifting for the examples.
560    
561     * Examples/__init__.py: Make this directory a package.
562    
563     * Examples/simple_extensions/__init__.py: Make this directory a package.
564    
565     * Examples/simple_extensions/hello_world.py: Moved entry from Extensions
566     menu to Examples menu.
567    
568     * Examples/simple_extensions/simple_command.py: Some more comments,
569     minor changes.
570    
571     * Examples/simple_extensions/simple_tool.py: Minor changes.
572    
573     2004-11-20 Jan-Oliver Wagner <[email protected]>
574    
575 jan 2407 Changed way of extension registry for wms and added extension
576     registry for umn_mapserver extension.
577    
578     * Extensions/wms/__init__.py: Added registry entry and the importing
579     of the actual wms module. Included a test for the required PyOGCLib.
580    
581     * Extensions/wms/wms.py: Removed registry entry (moved to __init__.py).
582    
583     * Extensions/umn_mapserver/__init__.py: Added registry entry and the
584     importing of the actual umn mapserver management modules.
585     Included a test for the required Python MapScript.
586    
587     2004-11-20 Jan-Oliver Wagner <[email protected]>
588    
589 jan 2403 Changed way of extension registry for importAPR, bboxdump
590     and added extension registry for svgexport.extension registry for
591     svgexport.
592    
593     * Extensions/importAPR/__init__.py: Added registry entry and the importing
594     of the actual importAPR module.
595    
596     * Extensions/importAPR/importAPR.py: Removed registry entry (moved to
597     __init__.py).
598    
599     * Extensions/bboxdump/__init__.py: Added registry entry and the importing
600     »···of the actual bboxdump module.
601    
602     * Extensions/bboxdump/bboxdump.py: Removed registry entry (moved to
603     »···__init__.py).
604    
605     * Extensions/svgexport/__init__.py: Added registry entry and the importing
606     of the svgsaver module.
607    
608     * Extensions/svgexport/svgsaver.py: Moved the menu entry from Extensions
609     to Experimental menu since this module has yet not reached a stable
610     status (ie. 1.0).
611    
612 jan 2397 2004-11-18 Jan-Oliver Wagner <[email protected]>
613    
614     Now the hit test considers the size of point symbols.
615    
616     * Thuban/UI/viewport.py (ViewPort._hit_point): Added optional parameter
617     'size' defaulting to the previously fixed value 5.
618     Extended doc-string.
619     (Viewport._find_shape_in_layer): Resolved FIXME regarding flexibility
620     for symbols.
621     Now the size of the largest point symbol is determined to find out
622     about whether the point has been hit.
623     This fixes the problem that only clicks inside a fixed distance of
624     5 where found.
625    
626 jan 2395 2004-11-17 Jan-Oliver Wagner <[email protected]>
627    
628 jan 2397 Another open issue fixed regarding sizeable symbols: correct rendering of
629 jan 2395 selected symbols.
630    
631     * Thuban/UI/renderer.py (ScreenRenderer.draw_selection_incrementally):
632     Added consideration of the specific size of point symbols.
633     The property for each point symbol is retrieved and the size applied
634     for the rendering method.
635     Added doc-string.
636    
637 jan 2393 2004-11-16 Jan-Oliver Wagner <[email protected]>
638    
639     Changed way of Extension Registry for gns2shp and profiling.
640    
641     * Extensions/gns2shp/gns2shp.py: Removed registry entry (moved to
642     __init__.py).
643    
644     * Extensions/gns2shp/__init__.py: Added registry entry and the importing
645     of the actual gns2shp module.
646    
647     * Extensions/profiling/profiling.py: Removed registry entry (moved to
648     __init__.py).
649    
650     * Extensions/profiling/__init__.py: Added registry entry and the importing
651     of the actual profiling module.
652    
653 bernhard 2388 2004-10-28 Bernhard Reiter <[email protected]>
654    
655     * Extensions/svgexport/: Minor improvements to doc strings.
656    
657 jan 2387 2004-10-07 Jan-Oliver Wagner <[email protected]>
658    
659     Further elements for sizable point objects now
660     making this feature usable though not yet complete.
661    
662     * Thuban/Model/save.py (SessionSaver.write_classification): Write
663     attribute 'size' for cldata when the shape layer is of point type.
664     This also now make the test_load.py tests happy.
665    
666     * Thuban/Model/classgen.py (CustomRamp.GetProperties): Added size
667     gradient.
668    
669     * Thuban/UI/classifier.py (ID_SELPROP_SPINCTRL): Renamed to
670     ID_SELPROP_SPINCTRL_LINEWIDTH.
671     (ID_SELPROP_SPINCTRL_LINEWIDTH): New Id replaces ID_SELPROP_SPINCTRL.
672     (ID_SELPROP_SPINCTRL_SIZE): New Id.
673     (SelectPropertiesDialog.__init__): Added a second spin control
674     for the size in case the corresponding layer is of point type.
675     (SelectPropertiesDialog._OnSpin): Renamed to _OnSpinLineWidth.
676     (SelectPropertiesDialog._OnSpinLineWidth): New. Former _OnSpin.
677     (SelectPropertiesDialog._OnSpinSize): New. Set size of property
678     and refresh preview.
679    
680    
681    
682 joey 2381 2004-10-04 Martin Schulze <[email protected]>
683    
684     * Extensions/wms/test/test_parser.py
685     (TestWMSCapabilitiesParser.test_compareLists): Added missing
686     self-test for compareLists()
687     (TestWMSCapabilitiesParser.test_compareDicts): Added missing
688     self-test for compareDicts()
689 joey 2382 (TestWMSCapabilitiesParser.test_compareLists): Adding more tests
690     to verify the test routine fails with non-equal arguments
691     (TestWMSCapabilitiesParser.test_compareDicts): Adding more tests
692     to verify the test routine fails with non-equal arguments
693 joey 2381
694 jan 2370 2004-10-03 Jan-Oliver Wagner <[email protected]>
695    
696 jan 2380 First elements for sizeable point objects.
697    
698     * Resources/XML/thuban-1.1.dtd: Added size attribute to cldata.
699    
700     * Data/iceland_sample_size.thuban: New. Sample for sized point objects.
701    
702     * test/test_load.py (ClassificationTest.TestLayers): Added SetSize in case
703     of a corresponding argument is given.
704     (TestSymbolSize): New. Test the size attribute of cldata.
705    
706     * Thuban/Model/classification.py: Removed some trailing whitespaces.
707     (ClassGroupProperties.__init__): Set default size.
708     (ClassGroupProperties.SetProperties): Set the size.
709     (ClassGroupProperties.GetSize): New. Return the size.
710     (ClassGroupProperties.SetSize): New. Set the size.
711     (ClassGroupProperties__eq__): Compare also size.
712     (ClassGroupProperties__repr__): Print also size.
713    
714     * Thuban/Model/load.py (SessionLoader.start_cldata): Also parse
715     the size attribute.
716    
717     * Thuban/UI/classifier.py (ClassDataPreviewer.Draw): Added doc-string.
718     Also, now there is a return value that indicates whether the drawing
719     size exceeded the given rect extent and if so the new extent.
720     Finally, point objects are drawn depending on the size. If either
721     the width or height is exceeded, the new extent is returned.
722     (ClassRenderer.Draw): Now when calling the previewer drawing function,
723     evaluate the return value and, if not None, adapt the grid widget size
724     accordingly and redraw again.
725    
726     * Thuban/UI/baserenderer.py (BaseRenderer.draw_shape_layer_incrementally):
727     If the draw function is for points, call it with the size as additional
728     parameter.
729     (BaseRenderer.draw_point_shape): Added additional, optional parameter for
730     the size. Compute the radius using the size.
731    
732     * Extensions/importAPR/apr.py (APR_BMkSym.GetThubanProp): Now
733     that Thuban supports size, apply this correctly.
734    
735     * Extensions/importAPR/importAPR.py: Bumped version to 0.1.1.
736    
737     2004-10-03 Jan-Oliver Wagner <[email protected]>
738    
739 jan 2370 * Doc/manual/thuban-manual-de.xml: Started translation of
740     Map chapter.
741    
742 joey 2368 2004-10-01 Martin Schulze <[email protected]>
743    
744     * Extensions/wms/properties.py (wmsProperties.__init__): Extended
745     argument for general use through properties-dialog selector
746    
747     * Thuban/UI/classifier.py: Register properties dialog classes for
748     both provided layer classes/types.
749    
750     * Thuban/UI/mainwindow.py (MainWindow.OpenLayerProperties): The
751     map can be retrieved through the parent which is passed to the
752     constructor anyway and doesn't require an argument of its own,
753     required for the unification of arguments for general use through
754     properties-dialog selector.
755     (MainWindow.OpenOrRaiseDialog): Move the logic for checking
756     whether a dialog is already opened (and raising it to the users
757     attention) and creating a new dialog into a function of its own
758     (MainWindow.OpenLayerProperties): Use the new OpenOrRaiseDialog()
759     method
760     (MainWindow.OpenLayerProperties): Utilise the new ClassMapper for
761     global registration of properties dialog classes (which are indeed
762     layer-specific).
763    
764     * Thuban/UI/classifier.py (Classifier.__init__): Unify arguments
765     for general use through properties-dialog selector, the map can be
766     retrieved through the parent and doesn't require an argument of
767     its own.
768    
769     * Extensions/wms/wms.py: Register the properties dialog class for
770     the provided WMS layer
771    
772 jan 2358 2004-09-28 Jan-Oliver Wagner <[email protected]>
773    
774     New feature: Registry for Extensions.
775    
776     * Thuban/UI/extensionregistry.py: This module defines a registry for
777     Extensions.
778    
779     * Thuban/UI/about.py (About.__init__): Added description
780     of the registered extensions with all of the information.
781    
782     * Thuban/Model/extension.py (Extension): Improved doc-string.
783    
784     * Extensions/gns2shp/gns2shp.py, Extensions/importAPR/importAPR.py,
785     Extensions/bboxdump/bboxdump.py, Extensions/profiling/profiling.py,
786     Extensions/wms/wms.py: Added registration of the extension.
787    
788 bernhard 2352 2004-09-27 Bernhard Reiter <[email protected]>
789    
790     More fixes to svgexport to make used ids unique and
791     conforming to XML's Name production.
792    
793     * Extensions/svgexport/test/test_svgmapwriter.py: Added new tests
794     test_xml_id_constraints(), test_make_ide_nosetbaseid() and
795     test_make_id_nonintegersetid(). Switched SetID and SetBaseID.
796     Added Bernhard R. as author.
797     * Extensions/svgexport/svgmapwriter.py (make_id): Using "_" as
798     concatenation char now (makes test_make_ide_nosetbaseid() valid).
799     Also transform second id part with "%d" and catch the TypeError
800     to raise SVGMapWriterError (making test_make_id_nonintegersetid() ok).
801     Corrected typo inBernhard's author line.
802     (SetBaseID): Return the transformed base id. Transform characters
803     which are not alnum() or in ".-_" to binascii.b2a_hex(). Added
804     import binascii. If to be set string starts with "xml" or so, add "t".
805     (draw_shape_layer_incrementally): use the returned value of SetBaseID
806     for used_baseids checks.
807    
808 bh 2351 2004-09-25 Bernhard Herzog <[email protected]>
809    
810     * test/test_layer.py (TestLayer.test_arc_layer_with_projection):
811     Remove a debug print and some tab characters.
812    
813 bernhard 2350 2004-09-25 Bernhard Reiter <[email protected]>
814    
815     * Extensions/svgexport/svgmapwriter.py: Added Bernhard R. as Author.
816     (SetBaseID, SetID, make_id): Improved docstring comments to explain
817     the interaction of the three functions and the XML id contrains.
818    
819 bernhard 2352
820 jan 2346 2004-09-23 Jan-Oliver Wagner <[email protected]>
821    
822 jan 2349 * Doc/ThubanModel.xmi: New. UML file for Thuban Model
823     Module.
824    
825     * Doc/README: Added info on ThubanModel.xmi.
826    
827     2004-09-23 Jan-Oliver Wagner <[email protected]>
828    
829 jan 2346 * Doc/README: New. Some info about how to generate technical
830     documentation from the source code.
831     This text was send to the Thuban developer mailing list on
832     September 21st 2004 by Bernhard Reiter.
833    
834 bernhard 2344 2004-09-21 Bernhard Reiter <[email protected]>
835    
836     Improved the svgexport to only use unique ids. Will issues
837     an error message dialoge when two layer names are the same.
838     ShapeIDs are now added with a dash within the svg ids.
839    
840     * Extensions/svgexport/svgmapwriter.py (SVGMapWriterError): New.
841     * Extensions/svgexport/test/test_svgmapwriter.py: Added imports
842     (TestSVGRenderer): New test class with test_make_in() and
843     test_check_for_layer_name_clash()
844     * Extensions/svgexport/svgmapwriter.py (SVGRenderer): Fixed __init__()
845     and draw_shape_layer_incrementally() to not use a baseid twice,
846     satisfying test_check_for_layer_name_clash()
847     (VirtualDC.make_id): Use a dash between baseit and id, satisfies
848     test_make_in().
849     * Extensions/svexport/svgsaver.py: Import SVGMapWriterError, wxOK
850     and wxICON_HAND.
851     (write_to_svg): Put dc and rendering in a try statement and on
852     catching SVGmapWriterError notify the user and delete the target file.
853    
854 bernhard 2343 2004-09-20 Bernhard Reiter <[email protected]>
855    
856     * Model/base.by, Model/layer.py: Fixed typos in docstrings.
857    
858 jschuengel 2342 2004-09-03 Jan Schüngel <[email protected]>
859    
860     * Extensions/umn_mapserver/mapfile(MF_Class.add_thubanstyle): Fix a
861     small bug with the line color. Now the line color will now only set
862     if it is set in Thuban an not Transparent.
863    
864     * Extensions/umn_mapserver/mf_export(tblayer_to_map): Fixed a bug with
865     deleting the layers from mapfile. Now all layers will delete backwards
866     from the last.
867    
868 silke 2339 2004-08-20 Silke Reimer <[email protected]>
869 silke 2338
870 silke 2339 * Thuban/Model/layer.py:
871     Fixes bug in projection handling: Otherwise very large region might not
872     have valid values in the layer's projection.
873    
874     2004-08-20 Silke Reimer <[email protected]>
875    
876 silke 2338 * Thuban/UI/about.py:
877     small changes to be consistent with coding style.
878    
879 joey 2337 2004-08-13 Martin Schulze <[email protected]>
880    
881     * Extensions/wms/test/test_ogclib.py (TestOGCLib.compare_URLs):
882     Adjusted a comment
883    
884 silke 2335 2004-08-11 Silke Reimer <[email protected]>
885 silke 2334
886 silke 2335 * Thuban/UI/about.py: Small changes to encoding related stuff to avoid
887     too many and too enhanced imports of locale
888    
889 silke 2334 2004-08-10 Silke Reimer <[email protected]>
890    
891     * Thuban/UI/about.py: Fixed encoding problem of about dialog: Added
892 silke 2339 function unicodeToLocale() to convert special characters to users
893     locale encoding
894 silke 2334
895 jan 2333 2004-08-10 Jan-Oliver Wagner <[email protected]>
896    
897     * Doc/technotes/coding_guidelines.txt: Added rule 'Method names start with
898     lower case letter'
899    
900 jschuengel 2331 2004-08-09 Jan Schüngel <[email protected]>
901    
902     * ChangeLog: Rewrite the last ChangeLog entry to follow
903     the standard way.
904    
905     * Extensions/umn_mapserver/mapfile: Moved the import AnnotationLayer to
906     the function where it is needed, because it don't works if it stands
907     at the beginning.
908     (MF_Layer.__init__): Removed the extra numclassed variable. Now
909     numclasses from the mapscript will be used.
910     (MF_Layer.get_index): New. Return the index of the layer in mapfile.
911     (MF_Layer.set_classes): New. A Classlist will be set to the layer.
912     (MF_Layer.set_metadata): New. A Metadata mapscript object will set.
913     (MF_Layer.remove_allclasses): New. All class of the layer will remove.
914     (MF_Map.create_new_layer): New. A new Layer is created and associated
915     with the mapscript object.
916     (MF_Map.set_layerorder): New. The Layer order like in thuban is set in
917     the mapscript.
918     (MF_Map.add_thubanlayer): Now a new layerobj is created if no one is
919     linked to the layer in thuban, else the layerobject linked to the
920     thubanlayer will be used.
921     AnnotationLayer will now store the filename of the shapefile.
922     (MF_Map.remove_layer): If a layer is removed the associated object
923     must be set new.
924    
925     * Extensions/umn_mapserver/mf_export.py(tb_layer_to_map): Add all
926     layers which are exists in thuban to the mapobj. All removed Layers
927     will be removed from the mapobj.
928     Added comments to all functions.
929     (thuban_to_map): No layer will be removed here.
930    
931     * Extensions/umn_mapserver/mf_handle.py
932     (_has_umn_mapobj_and_selectedlayer): Activating the layer menu. Now
933     Layersettings for the mapserver kann be edited.
934    
935     * Extensions/umn_mapserver/mf_import.py: Now all layers which are
936     imported, will be linked with the associated MF_Layer.
937     (import_mapfile): All layers, which are not selected, will be removed.
938     Disable the "import layer from mapfile" menu option.
939    
940     * Extensions/umn_mapserver/sample/iceland.map: Set the status of the
941     Annotation Layer from DEFAULT to OFF. The DEFAULT setting turns the
942     layer on permanently.
943    
944 jschuengel 2323 2004-08-03 Jan Schüngel <[email protected]>
945    
946 jschuengel 2331 * Extensions/umn_mapserver/mapfile.py(MF_Metadata.remove_allmetadata):
947     New. This function removes all metadata
948     (MF_Layer.set_group): New. Set the group setting.
949     (MF_Layer.get_group): New. Get the group setting.
950     (MF_Map): Removed the extra numlayers variable, used the mapscript
951     parameter instead.
952     (MF_Map.get_numlayers): New. This get numlayers.
953     (MF_Map.remove_all_layers): New. Removes all layers from the mapobj.
954 jschuengel 2323 (MF_Map.add_thubanlayer): Replaced the exception handling by a check
955     if the object is an instance. Also added the annotation layer here to
956     export, but only the layer is created in the mapfile.
957    
958 jschuengel 2331 * Extensions/umn_mapserver/mf_export.py(export_mapfile): Removed
959     the check if a mapobj exist, because its not needed anymore. The
960     export function is only available if a mapobj exist.
961     Use the new function to remove all layers.
962 jschuengel 2323
963 jschuengel 2331 * Extensions/umn_mapserver/mf_handle.py(Layer_Dialog): Added a group
964     option and the metadata button. The layer dialog is temporary disabled.
965     (Metadata_CustomDataTable): Added some functions to show the grid
966 jschuengel 2323 correct.
967    
968 jschuengel 2331 * Extensions/umn_mapserver/mf_import.py: Moved the code for showing
969     the number of layer from import_mapfile to this function.
970     (AnnotationLayer): New. This Class shows the Annotation layer in
971     thuban. The layer don't do anything. It's only to show the layer
972     and to save the layer order.
973     (add_annotationlayer): New. Import an annotation layer to thuban.
974     (select_layer2import): New. Import only layers to thuban and not
975     the other settings like projection or scalebar.
976     (create_new_mapfile): Moved the _has_umn_mapobj function and the
977     create_new_mapfile functions from mf_handle.py to mf_import.py.
978 jschuengel 2323
979     * Extensions/umn_mapserver/sample/iceland.map: Added the group
980     parameter to the roads and cultural layers. Also added a new
981     Annotation Layer for the cultural points.
982    
983     * Extensions/umn_mapserver/sample/iceland.html: Added the select
984     option for the annotation layer.
985    
986     * Extensions/umn_mapserver/sample/index.html: Added the start
987     parameter for the annotation layer.
988    
989 jan 2315 2004-08-01 Jan-Oliver Wagner <[email protected]>
990    
991     * Doc/manual/thuban-manual-de.xml (Chapter Session Management):
992     translation completed.
993    
994     * Doc/manual/thuban-manual.xml (Chapter Session Management):
995     Fixed unprecise description for Save Session.
996    
997 jan 2312 2004-07-31 Jan-Oliver Wagner <[email protected]>
998    
999     Started translation of Users Manual into german.
1000    
1001     * Doc/manual/thuban-manual-de.xml: New. German Users Manual.
1002    
1003     * Doc/manual/Makefile: Added build instructions for german
1004     users manual.
1005    
1006     * Doc/manual/thuban-manual.xml: Minor corrections in Introduction.
1007    
1008 jschuengel 2308 2004-07-28 Jan Schüngel <[email protected]>
1009    
1010     * Extensions/umn_mapserver/mapfile.py(MF_Metadata): Changed all class
1011     functions. Now all metadata will handle by the function and its not
1012     needed to initialize it from outside. Therefor the associated mapobj
1013     will be stored in the Metadata Object. So we can use the special
1014     functions from the associated mapobj to get the Metadata.
1015     Therefor all initialization code for the metadata is removed from the
1016     other classes.
1017     (MF_Layer): Added a function to get the metadata object.
1018     (MF_Map): Added a function to set the mappath, the path where
1019     the mapfile ist stored.
1020    
1021     * Extensions/umn_mapserver/mf_export.py(thuban_to_map): Changed the code
1022     to set the extent in the mapfile. Now the code is set by the displayed
1023     data in the Thuban-view.
1024     (export_mapfile): The shapepath is now set empty, until relative
1025     pathnames are supported.
1026    
1027     * Extension/umn_mapserver/mf_handle.py: Added a dialog to handle
1028     metadata. Yet only mapfile metadata are supported. Layer and class
1029     supported are not implemented.
1030     Added a dialog to handle layer informations. The dialog only shows the
1031     selected layer at the moment.
1032    
1033     * Extensions/umn_mapserver/mf_import.py(import_mapfile): Changed the
1034     code for setting the extent in thuban. Now the extent is set to the
1035     given extent from the mapfile.
1036     Fixed a logical mistake. Now the extent is set when realy a layer is
1037     loaded, and not if one is selected to load.
1038    
1039     * Extensions/umn_mapserver/sample/iceland.html: Added code to zoom and
1040     move the shown map in the browser.
1041    
1042     * Extensions/umn_mapserver/sample/iceland.map: Added a new metadata
1043     line to the mapobj and added metadata to the political layer.
1044    
1045     * Extensions/umn_mapserver/test/test_mapserver.py: Changed the test
1046     for Metadata.
1047    
1048 joey 2300 2004-07-26 Martin Schulze <[email protected]>
1049    
1050     * Thuban/Lib/classmapper.py (ClassMapper.has): Added the new
1051     ClassMapper
1052    
1053     * test/test_classmapper.py (TestMapping.test_mapper): Added a Test
1054     case for the new ClassMapper
1055    
1056    
1057 bh 2296 2004-07-22 Bernhard Herzog <[email protected]>
1058    
1059 bh 2297 * Thuban/UI/viewport.py (ViewPort.VisibleExtent): New. Return the
1060     visible extent of the map in projected coordinates
1061    
1062     * test/test_viewport.py (SimpleViewPortTest.test_default_size)
1063     (SimpleViewPortTest.test_init_with_size): Add some VisibleExtent()
1064     tests.
1065     (SimpleViewPortTest.test_visible_extent): New. The real test for
1066     VisibleExtent()
1067    
1068     2004-07-22 Bernhard Herzog <[email protected]>
1069    
1070 bh 2296 * test/test_viewport.py: Use support.run_tests as the main
1071     function when running asa script.
1072    
1073 jschuengel 2295 2004-07-22 Jan Schüngel <[email protected]>
1074    
1075     * Extensions/umn_mapserver/mf_export.py: Added "import os"
1076     Removed the old "import Thuban.UI.mainwindow" code.
1077     (tbextent_to_map): Removed the extra function and at the code direct
1078     to "thuban_to_map" function.
1079     (write_creatorcomment): Added. Now a short comment is added to the
1080     beginning of an generated mapfile.
1081     (export_mapfile): Now the Path and filename are saved in to variables,
1082     and not together in one variable. This is needed for the new
1083     write_creatorcomment function.
1084    
1085     * Extensions/umn_mapserver/mf_import.py (import_mapfile): Added the
1086     import module "re". Also added Range and the ClassGroupRange import
1087     from Thuban. Both are needed for the new range expression import.
1088     (create_rangeexpression): Added. Creates a Range Expression in Thuban
1089     style from a given mapfile expression.
1090     (added_rasterlayer): Make some small code changes. The shapepath is
1091     now stored in an extra variable and the clazz_name is set empty if no
1092     class name set in the mapfile.
1093     Changed the Error message for Range Expressions, becaus the new
1094     function create a error string which will be shown in the dialog.
1095    
1096     * Extensions/umn_mapserver/test/test_mapserver.py: Added a test for the
1097     range expression import.
1098 jan 2312
1099 jan 2291 2004-07-21 Jan-Oliver Wagner <[email protected]>
1100    
1101     * Extensions/umn_mapserver/README: Added hint that
1102     installation as root can be avoided. Removed all tabs.
1103    
1104 bh 2289 2004-07-16 Bernhard Herzog <[email protected]>
1105    
1106     * test/test_viewport.py
1107     (ViewPortTest.test_changing_map_projection): Check that changing
1108     the projection of an empty map shown in a viewport doesn't lead to
1109     exceptions in the viewport's handler for the
1110     MAP_PROJECTION_CHANGED messages
1111    
1112     * Thuban/UI/viewport.py (ViewPort.map_projection_changed): Only
1113     try to keep the same region visible when the map actually contains
1114     something
1115    
1116 jschuengel 2288 2004-07-15 Jan Schüngel <[email protected]>
1117    
1118     * Extensions/umn_mapserver/mapfile.py: Added a function to get the
1119     mappath directly from the mapobj. Is needed because of the changes
1120     in mf_import.py.
1121     (MF_Layer.add_thubanclass): Added a new comment.
1122     (MF_Map.set_extent): Fixed a bug with exporting empty mapobj. If the
1123     mapobj is empty there is no extent get from thuban an so no one can
1124     set to th mapobj.
1125    
1126     * Extensions/umn_mapserver/mf_import.py (import_mapfile): Updated
1127     the discription.
1128     Split the funktion in to three smaller ones. The new functions are
1129     add_rasterlayer, add_polygonlayer and select_layer2import.
1130     Removed the mapfilepath and filepath initialisation, because its know
1131     include in the new functions.
1132     Now nothing will be imported if cancel is pressed in the
1133     layer choice dialog.
1134    
1135 jschuengel 2285 2004-07-14 Jan Schüngel <[email protected]>
1136    
1137     * Extensions/umn_mapserver/mapfile.py: Added ClassGroupDefault to
1138     import.
1139     (MF_Symbolset): Removed the extra variable for numsymbols.
1140     (MF_Class.__init__): Added a comment to the exception clause.
1141     Removed the extent init, because it was not needed anymore.
1142     (MF_Layer.add_thubanclass): Added the code to set the class name to
1143     the expression value from thuban if no label is defined.
1144     Added the code to export Range expressions from thuban to the mapfile.
1145     (MF_Map.set_extent): Removed the exception and replace it by some if
1146     code. If the size of a map is not defined the size will be set to 1,1.
1147     This is necessary because if the extent is set, mapscript checks if
1148     the size is greater than zero.
1149     (MF_Web): Added the get and set function for the template.
1150    
1151     * Extensions/umn_mapserver/mf_export.py: Added the function to check
1152     if a mapobject exists and used it to set the status of the menu items.
1153     If no mapfile exists the settings could not be edditied.
1154     Define after which menuitem the exportitem will include.
1155    
1156     * Extensions/umn_mapserver/mf_handle.py: Removed the import
1157     Thuban.UI.mainwindow clause, because it is not needed.
1158     Added the command Refresh() to all "OnChangeColor()" functions,
1159     because the color preview window was not updated on a color change.
1160     Added the function to check if a mapobject exists and used it to set the
1161     status of the menu items. If no mapobject exists the settings could not
1162     be edditied.
1163     (Map_Dialog): Moved the imagetype selector from the
1164     Outputformat_Dialog to Map_Dialog and removed Outputformat_Dialog.
1165     (Web_Dialog): Removed the name label and added the template textbox.
1166    
1167     * Extensions/umn_mapserver/mf_import.py (import_mapfile): Replace
1168     the exception handling on loading the layers by an if statement. It
1169     is not necessary to us the exception there.
1170     The Filepath creation now use os.path.join to build the path.
1171    
1172     * Extensions/umn_mapserver/test/test_mapserver.py: Moved the testMap
1173     definition from global to the setUp function. Now the testMap will
1174     initialize new on each test.
1175    
1176     * Extensions/umn_mapserver/sample/iceland.map: Include three new
1177     classes in the Line Layer, to test logical Expressions.
1178     Set the status of the class "Point9" in the Point Layer to off
1179    
1180 bh 2278 2004-07-13 Bernhard Herzog <[email protected]>
1181    
1182     * Thuban/UI/baserenderer.py
1183     (BaseRenderer.render_map_incrementally): Fix a logic bug in the
1184     optimization that tries not to draw layers under a raster layer.
1185     The bug was harmless. All it effectively did was to produce The a
1186     strange messages about not being able to draw Layer instances for
1187     all vector layers below a raster layer which would be invisible
1188     anyway because the raster layer currently always covers the entire
1189     window
1190    
1191 jschuengel 2277 2004-07-08 Jan Schüngel <[email protected]>
1192    
1193     * Extensions/umn_mapserver/mapfile.py: Added code to generade and get
1194     a list of supported outputformats. This formats are not alle supported
1195     because there is no possibility to get the outputformat without the
1196     name known. Make some formal changes to the code.
1197     (MF_Map.set_name()): Fixed a bug if the name is None.
1198    
1199     * Extensions/umn_mapserver/mf_handle.py: Removed the image_type import
1200     statement, because its not needed anymore. The Outputformat is now
1201     given as string from the object. Make some formal changes to the code.
1202    
1203     * Extensions/umn_mapserver/test/test_mapserver.py: Added new test for
1204     most of the new setting which were added during the last changes.
1205     Removed the MF_Size Test.
1206    
1207     * Extensions/umn_mapserver/test/test.map: Added a new class to the
1208     cultural Layer to test expressions and the the status of that layer
1209     from on to default.
1210     Changed the data path the the correct Thuban Data
1211     Added the Outputformat Object and Symbol Object
1212    
1213 jschuengel 2272 2004-07-07 Jan Schüngel <[email protected]>
1214    
1215     * Extensions/umn_mapserver/mapfile.py: Added some new
1216     settings to edit (outputformat, label, imagetype)
1217    
1218     * Extensions/umn_mapserver/mf_handle.py: Added some setting to
1219     the Label Dialog and add the OutputDialog.
1220     Make some changes to the code order.
1221    
1222 jschuengel 2269 2004-07-06 Jan Schüngel <[email protected]>
1223    
1224     * Extensions/umn_mapserver/mapfile.py: Added the symbolObj, pointObj
1225     and line Obj and add the scalebar_status_type, scalebar_style_type and
1226     scalebar_position_type.
1227     Added the symbol- and symbolsetObject (MF_Symbol,MF_Symbolset). The
1228     are only used to create a Symbol like the circle in Thuban.
1229     Added the scalebarObject (MF_Scalebar)
1230     (MF_Class): Added set_status and get_status.
1231     (MF_Layer.add_thubanclass): Added code to set the class status
1232     (MF_Map): Added code to handle the symbols and scalebar
1233     (MF_Label): Added the set_partials and get_partials functions
1234    
1235     * Extensions/umn_mapserver/mf_export.py: Added MF_Symbol to import
1236     from mapfile. Added a function to create a circle object like the one
1237     from thuban if no one exists.
1238    
1239     * Extensions/umn_mapserver/mf_handle.py: All colors are now set when
1240     press ok in the assosiated dialog and not at the end of the
1241     colordialog.
1242     Added the Dialog for the Scalebar.
1243     (Label_Dialog): Added the offset option
1244    
1245     * Extensions/umn_mapserver/mf_import.py: Added code to import the
1246     status of the Classes.
1247     Fixed a bug with the projection. Now the to_meter parameter will be
1248     added to the Projection only if it doesn't exists.
1249    
1250 jschuengel 2264 2004-07-01 Jan Schüngel <[email protected]>
1251    
1252     Added the functionality to handle the content thuban is not
1253     able to handle directly.
1254    
1255     * Extensions/umn_mapserver/mf_handle.py: New. This module extents
1256     Thuban with the possibility to edit the mapfile content.
1257    
1258     * Extensions/umn_mapserver/mf_import.py: Added the possibility
1259     to import mapfiles without any layer selected. So it is possible
1260     to edit the other settings in a mapfile.
1261     (import_mapfile): Added code to use the editing functions.
1262     Added the possibility to import the projection to a layer if one
1263     is defined.
1264     Status settings (On,Off) will now set in thuban (visible, invisible).
1265     fixed a bug with with classnames. If no classname is set in mapfile
1266     the value in Thuban will set to the expression.
1267    
1268     * Extensions/umn_mapserver/mf_export.py(export_mapfile): Added the
1269     possibility to save a new mapfile or use the old one which is
1270     imported or new created.
1271     Added code to use the editing functions.
1272     Remove some not needed import statements
1273    
1274     * Extensions/umn_mapserver/mapfile.py: Added new types which are
1275     need for the editing functions.
1276     Added needed set-functions for the editing functions.
1277     Added the possibility to export rasterimages.
1278     Added new classes (MF_Web, MF_Label, MF_Legend, MF_Symbol,
1279     MF_SymbolSet). MF_Symbol and MF_SymbolSet are not needed at the
1280     moment.
1281     (MF_Class.set_thubanstyle): Now point layers will set to a default
1282     symbol to show a circle in mapserver and not only a 1px dot.
1283     (MF_Style.__init__): Fixed a bug with the color. Color was not set
1284     correct before.
1285     (MF_Size): Removed, because it is not needed.
1286    
1287     * Extensions/umn_mapserver/README: Added the hints to use the
1288     export and editing functions, too.
1289    
1290     * Extensions/umn_mapserver/sample/iceland.map: Added the
1291     new parameter "UNITS METERS".
1292     Change the political layer to status OFF.
1293    
1294     * Extensions/umn_mapserver/sample/README: Added some
1295     more details to setup the sample in the MapServer.
1296    
1297 bernhard 2256 2004-06-26 Bernhard Reiter <[email protected]>
1298    
1299     * Extensions/svgexport/test/test_svgmapwriter.py:
1300     Removed class VFile and used standard StringIO instead.
1301    
1302 jschuengel 2255 2004-06-23 Jan Schüngel <[email protected]>
1303    
1304     Add the export function to the umn_mapserver extension.
1305    
1306     * Extension/umn_mapserver/mf_export.py: New. This module extents
1307     Thuban with the possibility to export the Thuban content.
1308    
1309     * Extensions/umn_mapserver/mapfile.py: Expand the classes to use
1310     with the export module. Especially added the possibility to
1311     add thuban objects directly to the map objects.
1312    
1313     * Extensions/umn_mapserver/mf_import.py: Removed the wxCHANGE_DIR,
1314     because of the hint from Bernhard Herzog.
1315     Corrected the handling of absolute pathnames.
1316     Changed the Text of the Menu-Item, now the beginning is upper case.
1317    
1318     * Extensions/umn_mapserver/README: Added the --with-tiff statement.
1319    
1320 jschuengel 2250 2004-06-16 Jan Schüngel <[email protected]>
1321 jschuengel 2242
1322 jschuengel 2250 Add a sample and make some changes.
1323    
1324     * Extension/umn_mapserver/mf_import.py: Changed the wxPython.wx
1325     import from * to explicit used statements. Changed the
1326     Thuban.UI.mainwindow import phrase, too.
1327     (import_mapfile):Corrected a clerical mistake.
1328     Added wxCHANGE_DIR in OpenFile Dialog.
1329     Added a MultipleChoiceDialog, to select the layers to load from
1330     mapfile into thuban. Thereby the projection is only set if one layer
1331     is selected.
1332     Added the possibility to handle relative pathnames which uses
1333     up-level references.
1334     Removed some doubled code.
1335     Corrected an error with integer values used as label in thuban
1336     ClassGroup.
1337    
1338     * Extensions/umn_mapserver/sample: New.
1339    
1340     * Extensions/umn_mapserver/sample/README: New. Describes the
1341     usage of the sample files.
1342    
1343     * Extensions/umn_mapserver/sample/iceland.map: New. This is
1344     a suitable .map-file for the iceland data.
1345    
1346     * Extensions/umn_mapserver/sample/index.html: New. The template
1347     for the mapfile.
1348    
1349     * Extensions/umn_mapserver/sample/iceland.html: New. Initialisation
1350     file for the Iceland Application on web.
1351    
1352     * Extensions/umn_mapserver/README: Corrected a inaccuracy and added
1353     some details.
1354    
1355     * Extensions/umn_mapserver/test/test_mapserver
1356     (mapserver_import_Test_generalClasses.test_MF_Color):
1357     Corrected the thubancolor test.
1358    
1359     2004-06-15 Jan Schüngel <[email protected]>
1360    
1361 jschuengel 2242 * Extensions/umn_mapserver/README: New. Install instruction.
1362    
1363 bernhard 2240 2004-06-14 Bernhard Reiter <[email protected]>
1364    
1365     * libraries/thuban/cpl_mfile.h: Added copyright header.
1366    
1367     * libraries/thuban/ cpl_mfile.cpp, cpl_mfile.h: Added non-protecting
1368     Free Software License so that it is most useful with gdalwarp
1369     and bmpdataset.
1370    
1371 bh 2239 2004-06-14 Bernhard Herzog <[email protected]>
1372    
1373     * Thuban/UI/multiplechoicedialog.py (__version__): Add missing
1374     import of wxPython.wx itself (as opposed to the contents of
1375     wxPython.wx). For some reason wxPython.wx is available as
1376     wxPython.wx.wx in at least some 2.4 releases. Fixes RT#2482
1377     wrt. wxPython 2.4.
1378    
1379 jschuengel 2238 2004-06-10 Jan Schüngel <[email protected]>
1380    
1381     Initial version of new extension "umn_mapserver". This extension aims
1382     to manage configuration for the UMN MapServer application. This
1383     inital version just imports the .map-files and displays all, Thuban is
1384     capable of.
1385    
1386     * Extensions/umn_mapserver, Extensions/umn_mapserver/test: New.
1387    
1388     * Extensions/umn_mapserver/test/README: New. Describes how to run the
1389     tests.
1390    
1391     * Extensions/umn_mapserver/test/test.map: New. This is a test
1392     .map-file for automated tests of the umn_mapserver extension of
1393     Thuban.
1394    
1395     * Extensions/umn_mapserver/test/test_mapserver.py: New. Tests for
1396     UMN Mapserver classes.
1397    
1398     * Extensions/umn_mapserver/__init__.py: New. Init to make this
1399     directory a package.
1400    
1401     * Extensions/umn_mapserver/mapfile.py: New. Classes to represent
1402     '.map'-file objects.
1403    
1404     * Extensions/umn_mapserver/mf_import.py: New. This module extends
1405     Thuban with the possibility to handle UMN MapServer mapfiles.
1406    
1407 bh 2230 2004-06-03 Bernhard Herzog <[email protected]>
1408    
1409     * Thuban/Model/layer.py (Layer.TreeInfo): Convert the bounding box
1410     to a tuple before using it as arguments to the % operator. This
1411     fixes the formatting issue filed in RT#2239 on 2004-01-13 and
1412     reported today on thuban-list by Jan Schüngel
1413    
1414     * test/test_layer.py (TestLayerModification.setUp): Save the
1415     filename as an instance variable so we can refer to it in tests
1416     (TestLayerModification.test_tree_info): Uncomment this method
1417     again and make it work. This tests for the formatting issue
1418     filed in RT#2239 on 2004-01-13
1419    
1420 bh 2224 2004-05-28 Bernhard Herzog <[email protected]>
1421    
1422     * Thuban/UI/baserenderer.py: Fix some typos.
1423    
1424 jan 2217 2004-05-18 Jan-Oliver Wagner <[email protected]>
1425    
1426     * Extensions/gns2shp/gns2shp.py (gns2shp): Fixed a bug
1427     by increasing a field size.
1428    
1429 bh 2213 2004-05-17 Bernhard Herzog <[email protected]>
1430    
1431     Update to newest shapelib and get rid of Thuban specific
1432     extensions, i.e. use the new DBFUpdateHeader instead of our
1433     DBFCommit kludge
1434    
1435     * libraries/shapelib/shpopen.c: Update to version from current
1436     shapelib CVS.
1437    
1438     * libraries/shapelib/shapefil.h: Update to version from current
1439     shapelib CVS.
1440    
1441     * libraries/shapelib/dbfopen.c: Update to version from current
1442     shapelib CVS.
1443     (DBFCommit): Effectively removed since shapelib itself has
1444     DBFUpdateHeader now which is better for what DBFCommit wanted to
1445     achieve.
1446     We're now using an unmodified version of dbfopen.
1447    
1448     * setup.py (extensions): Add the HAVE_UPDATE_HEADER macro with
1449     value '1' to the Lib.dbflibc extension. This simply reflects the
1450     shapelib and pyshapelib updates
1451    
1452 jan 2211 2004-05-16 Jan-Oliver Wagner <[email protected]>
1453    
1454     Finished introduction of Menu.FindOrInsertMenu.
1455    
1456     * Extensions/drawshape/drawshape.py: Add the command
1457     to the experimental menu additionally to the toolbar.
1458    
1459     * Extensions/svgexport/svgsaver.py: Use FindOrInsertMenu() instead of
1460     finding menu on its own.
1461    
1462     * Doc/manual/thuban-manual.xml: updated sample file
1463     to use FindOrInsertMenu().
1464    
1465     * Examples/simple_extensions/hello_world.py: Use FindOrInsertMenu()
1466     instead of finding menu on its own.
1467    
1468 jan 2206 2004-05-11 Jan-Oliver Wagner <[email protected]>
1469    
1470     * test/test_menu.py (MenuTest.test): Added testing
1471     of method Menu.FindOrInsertMenu.
1472    
1473 jan 2204 2004-05-10 Jan-Oliver Wagner <[email protected]>
1474    
1475     Introduce and use Menu.FindOrInsertMenu.
1476    
1477     * Thuban/UI/menu.py (Menu.FindOrInsertMenu): New. Find a
1478     given menu or, if not found, insert it.
1479    
1480     * Extensions/bboxdump/bboxdump.py, /Extensions/gns2shp/gns2shp.py,
1481     /Extensions/importAPR/importAPR.py, Extensions/profiling/profiling.py,
1482     /Extensions/wms/wms.py: Use FindOrInsertMenu() instead of finding
1483     menu on its own.
1484    
1485 jan 2201 2004-05-06 Jan-Oliver Wagner <[email protected]>
1486    
1487     Introduce a abstract ColorDialog class and remove
1488     and outdated file.
1489    
1490     * Thuban/UI/proj4dialog.py: Removed. It is has been
1491     replaced by projdialog for quite a while and is not used
1492     anymore.
1493    
1494     * Thuban/UI/colordialog.py: New. Abstraction for color selection
1495     dialog(s).
1496    
1497     * Thuban/UI/classifier.py (SelectPropertiesDialog.__GetColor):
1498     Now calls the abstract ColorDialog instead of wxColourDialog.
1499     This also removed the dependency to Color class conversion
1500     from this function.
1501    
1502 frank 2197 2004-05-04 Frank Koormann <[email protected]>
1503    
1504     * Extensions/bboxdump/__init__.py: Fixed string left over from
1505     copying.
1506    
1507     * Extensions/bboxdump/bboxdump.py (bboxdump):
1508     Use layer.ShapeStore().AllShapes() to loop over shapes instead of
1509     xrange(layer.NumShapes()). Compile the bboxmessage from a list
1510     of formatted outputs (string.join) instead of appending to the
1511     message. Two progress bar dialogs to report progress on the sometimes
1512     lenghty processing.
1513    
1514 frank 2196 2004-04-22 Frank Koormann <[email protected]>
1515    
1516     New Extension to dump bounding boxes of all shapes of the selected
1517     layer. An optional column can be specified to group the objects,
1518     in this case the bounding box is a union of the separate boxes.
1519     Dump can be displayed in a ScrolledMessageDialog or written to file.
1520     The Extension is simply a combination of available and well tested
1521     Thuban functionality.
1522    
1523     * Extensions/bboxdump/__init__.py: New: Init to make this
1524     directory a package.
1525    
1526     * Extensions/bboxdump/bboxdump.py: New: Dump bounding boxes of
1527     all shapes of the selected layer.
1528    
1529 jan 2192 2004-04-22 Jan-Oliver Wagner <[email protected]>
1530    
1531     * Thuban/UI/classgen.py (GenUniquePanel.__init__): Fixed two
1532     strings to be i18n now.
1533    
1534 jan 2188 2004-04-18 Jan-Oliver Wagner <[email protected]>
1535    
1536     Changing popup menu of legend from direct building
1537     to using the Menu construction as used for the mainwindow.
1538    
1539     * Thuban/UI/mainwindow.py: New method commands: layer_to_top,
1540     layer_to_bottom, layer_visibility
1541     (MainWindow.LayerToTop): New. Put current layer to the top.
1542     (MainWindow.LayerToBottom): New. Put current layer to bottom.
1543     (MainWindow.HideLayer, MainWindow.ShowLayer, _has_visible_map):
1544     Replace 1,0 by True, False.
1545     (MainWindow.ToggleLayerVisibility): New. Toggle visibility of
1546     current layer.
1547     (MainWindow.LayerShowTable): Removed raising of dialog.
1548     (_has_selected_layer_visible): New. Support function.
1549    
1550     * Thuban/UI/legend.py: ID_POP_xxx: removed.
1551     (LegendPanel.__init__): Removed EVT_MENU bindings.
1552     (LegendTree._OnRightClick): Replace direct creation of
1553     menu via wx Classes by applying the menu definition
1554     as of Menu class of menu.py.
1555    
1556 jan 2185 2004-04-16 Jan-Oliver Wagner <[email protected]>
1557    
1558     * Thuban/UI/exceptiondialog.py (ExceptionDialog.dialog_layout): Improved
1559     button string to stronger clearify that Thuban will be closed when hitting
1560     the button.
1561    
1562     * Thuban/UI/mainwindow.py (MainWindow.LayerShowTable): Added docstring.
1563     Now for layers without a ShapeStore a corresponding message is given
1564     to the user, that this layer has no table to show.
1565    
1566 joey 2182 2004-04-15 Martin Schulze <[email protected]>
1567    
1568     * Extensions/wms/layer.py (WMSLayer.setWMSFormat): Need to
1569     recalculate the format for the internal render engine as well.
1570    
1571     * Extensions/wms/properties.py (wmsProperties): First start for a
1572     properties dialog. It's functional for a first selection of
1573     layers, but still has some weired wxWidgets/GTK problems but
1574     beautification can be done later.
1575    
1576     * Extensions/wms/layer.py: Added more documentation
1577     (WMSLayer.getFormats): New: Return list of supported image formats
1578     by the WMS server
1579     (WMSLayer.getLayers): New: Return the list of layer names
1580     supported by the WMS server
1581     (WMSLayer.getLayerTitle): New: Return the title of the named layer
1582     (WMSLayer.getWMSFormat): New: Return the image format that is used
1583     for WMS GetMap requests
1584     (WMSLayer.setWMSFormat): New: Set the image format that is used
1585     for WMS GetMap requests
1586     (WMSLayer.__init__): Move away from using only one layer to using
1587     a list of layers (unsorted at the moment, though).
1588     (WMSLayer.getVisibleLayers): New: Return the list of names for all
1589     visible layers
1590     (WMSLayer.setVisibleLayers): New: Set the list of names for all
1591     visible layers
1592    
1593     * Extensions/wms/wms.py: Moved the WMS layer into layer.py in
1594     order to establish a clean structure.
1595    
1596     * Extensions/wms/layer.py: Moved the WMS layer into a file on its
1597     own in order to establish a clean structure.
1598    
1599 joey 2174 2004-04-13 Martin Schulze <[email protected]>
1600    
1601     * Extensions/wms/parser.py (WMSCapabilitiesParser.grok): Added
1602     support for oldstyle (WMS 1.0 apparently) image format
1603     specification.
1604    
1605     * Extensions/wms/wms.py (WMSLayer.calcFormat): Reduce the list of
1606     supported graphic formats back to JPEG and BMP, PNG and others are
1607     too *cough* experimental... Sorry, I meant to filter this out
1608     before I committed this part. This should make the WMS extension
1609     run from CVS again.
1610     (wms_dialog): Reset an empty URL to None so that the subsequent
1611     program can depend on this, since the dialog will indeed return an
1612     empty URL, causing another declaration of love by Python.
1613    
1614     * Extensions/wms/parser.py (WMSCapabilitiesParser.getLayerBBox):
1615     Whenever a native BoundingBox request cannot be fulfilled, check
1616     whether the requested SRS is EPSG:3426, in which case return the
1617     LatLonBoundingBox values.
1618    
1619     * Extensions/wms/test/test_parser.py
1620     (TestWMSCapabilitiesParser.test_LayerSRS): Added a test for
1621     ignoring AUTO:* SRS.
1622     (TestWMSCapabilitiesParser.test_LatLonBoundingBoxes_as_bboxes):
1623     Added another test method to test whether the LatLonBoundingBox
1624     values will be returned if BoundingBox values are requested with
1625     SRS set to EPSG:3426.
1626    
1627     * Extensions/wms/parser.py (WMSCapabilitiesParser.peekLayers):
1628     Added rudimentary support for non-EPSG SRS, i.e. ignore them for
1629     the moment by placing them into a variable which is currently
1630     unused. Also test whether the EPSG SRS is numerical as it should
1631     be and add an error message if it is not.
1632    
1633     * Extensions/wms/test/sample.xml: Added AUTO:* SRS since they
1634     appear in the real world as well. Since we cannot handle them yet
1635     (OGCLib can't either), we will ignore them for the moment.
1636    
1637     * Extensions/wms/parser.py: Use a variable for denoting the sample
1638     filename
1639     (WMSCapabilitiesParser.peekLayers): Added support for error
1640     messages during grok(). They will be aggregated in an array and
1641     may be displayed later. We may have to add a classification
1642     "Warning" and "Error" to this. That requires more experience,
1643     though, since not every error may be lethal.
1644    
1645     * Thuban/UI/mainwindow.py (MainWindow.LayerShowTable): Raise the
1646     ShowTable() dialog/frame when the user attempts to display it
1647     while it has been opened before already and not closed again.
1648    
1649 joey 2161 2004-04-11 Martin Schulze <[email protected]>
1650    
1651     * Extensions/wms/infodialog.py: Adjusted the class documentation
1652    
1653     * Extensions/wms/wms.py (WMSLayer.__init__, WMSLayer.GetMapImg):
1654     Switch to using Thuban{Begin,End}BusyCursor instead of the pure
1655     wxWidgets variants.
1656     (WMSLayer.__init__): The epsg_id variable is named top_srs now.
1657    
1658     * Extensions/wms/infodialog.py: Added an information dialog that
1659     will display various information about the WMS current resource,
1660     so that additional information such as the title, the abstract,
1661     fees and access constraints can be displayed for the user if they
1662     are documented in the WMS XML.
1663    
1664 joey 2156 2004-04-10 Martin Schulze <[email protected]>
1665    
1666     * Extensions/wms/parser.py (WMSCapabilitiesParser.grok): Adjusted
1667     string handling. It's "foo".lower() and not lower(foo) without
1668     lower imported from strings or something.
1669    
1670     * Extensions/wms/wms.py (WMSLayer): Incorporated WMSCapabilities
1671     from capabilities.py and parser.py. Implement priority list for
1672     supported graphics formats, take care of wbmp != bmp. PNG, TIFF
1673     and GIF are supported here, but not yet by main Thuban. Hence,
1674     support for them may be removed later. Special contribution to
1675     usability: get wxWidgets to change the cursor when we're waiting
1676     for data from the network so the user won't start to worry. This
1677     causes a redrawing error/warning, though.
1678    
1679     * Extensions/wms/parser.py (WMSCapabilitiesParser.grok): Unlink
1680     the DOM object.
1681    
1682     2004-04-01 Martin Schulze <[email protected]>
1683    
1684     * Extensions/wms/capabilities.py: Adjusted documentation
1685     (WMSCapabilities.__init__): Improved documentation, fixed syntax
1686     (WMSCapabilities.saveCapabilities): Only catch IOError when
1687     handling files
1688     (WMSCapabilities.loadCapabilities): Only catch IOError when
1689     handling files
1690     __main__: corrected variable naming
1691     (WMSCapabilities.fetchCapabilities,loadCapabilities): Make this
1692     class a specialisation of WMSCapabilitiesParser as well. Also
1693     execute grok() after loading or fetching capabilities, if that
1694     went well, so that subsequent calls can already access the data.
1695     (WMSCapabilities.getVersion): Export the used version of the
1696     GetCapabilities request, so we can use it for subsequent calls,
1697     i.e. for GetMap requests.
1698     (WMSCapabilities.fetchCapabilities): Added proper error handling
1699     when the GetCapabilities request failed, so that the surrounding
1700     program can act accordingly.
1701    
1702 joey 2146 2004-03-30 Martin Schulze <[email protected]>
1703    
1704     * Extensions/wms/parser.py (WMSCapabilitiesParser.getLayerSRS):
1705     Adjusted the getLayerSRS method to return the list of SRSes
1706     extracted from <SRS> elements instead of <BoundingBox> elements.
1707     Added a bit of documentation as well.
1708     (WMSCapabilitiesParser.checkLayerSRS): Removed integrity test
1709     since it was only implemented due to a misunderstanding.
1710    
1711     * Extensions/wms/test/test_parser.py
1712     (TestWMSCapabilitiesParser.test_LayerSRS): Adjust the tests to
1713     reflect the corrected interpretation of the standard: i.e. a layer
1714     does not have to define a BoundingBox for all SRSes it supports.
1715     Hence the <SRS></SRS> specification is authoritative, not the list
1716     of BoundingBoxes.
1717     (TestWMSCapabilitiesParser.test_BoundingBoxes): Added a new test
1718     to ensure None is returned for a non-existing SRS.
1719     (TestWMSCapabilitiesParser.test_grok): Removed test_grok method
1720     since it is not applicable anymore. Listing more SRSes in <SRS>
1721     elements is valid according to the specs.
1722    
1723 bernhard 2140 2004-03-26 Bernhard Reiter <[email protected]>
1724 joey 2146
1725 bernhard 2140 * README: Nicer formatting of text. Improved descriptions.
1726     Reflected wxWidgets name change.
1727    
1728     * Thuban/UI/about.py: Extended copyright to 2004 and added
1729     information about the thuban-devel mailinglist.
1730    
1731 joey 2138 2004-03-24 Martin Schulze <[email protected]>
1732 joey 2120
1733 joey 2138 * Extensions/wms/capabilities.py: Renamed the class to contain
1734     'WMS', also added a linebreak where required
1735    
1736     * Extensions/wms/parser.py: Finally added the XML parser for the
1737     GetCapabilities response.
1738    
1739     * Extensions/wms/test/sample.xml: Adjusted the sample file so that
1740     <SRS> elements match the <BoundingBox> elements, except for the
1741     layer 'beschriftung'.
1742    
1743     * Extensions/wms/test/test_parser.py: Encode non-ascii strings
1744     since Python uses unicode strings internally, otherwise
1745     comparisons will fail. Removed tests for getLayerBBoxSRS() since
1746     the SRS will be calculated anyway and this method is obsoleted by
1747     getLayerSRS(). Denote SRS as strings and not as cardinal numbers.
1748     Move loading the sample file into the setUp method. Added a test
1749     for finding the integrity problem in the sample response.
1750     Improved formatting.
1751    
1752     * Extensions/wms/domutils.py: Added convenience routines for
1753     handling of Document Object Model (DOM) nodes.
1754    
1755     * Extensions/wms/test/test_domutils.py: Added a test for the
1756     domutils module
1757    
1758     2004-03-19 Martin Schulze <[email protected]>
1759    
1760 joey 2120 * Extensions/wms/test/test_parser.py (TestWMSCapabilitiesParser):
1761     Moved path detection and adding into a module of its own,
1762     adjustpath, which exports thubandir as main Thuban directory.
1763    
1764     * Extensions/wms/test/test_ogclib.py (TestWMSLib): Moved path
1765     detection and adding into a module of its own, adjustpath, which
1766     exports thubandir as main Thuban directory. Reorganised the
1767     module in order to support the SkipTest feature for Thuban test
1768     cases.
1769    
1770     * Extensions/wms/test/adjustpath.py: Moved path detection and
1771     adding into a module of its own.
1772    
1773 joey 2115 2004-03-18 Martin Schulze <[email protected]>
1774    
1775     * Extensions/wms/test/test_parser.py: Added another test for
1776     checking whether the WMS XML parser (to be implemented) returns
1777     the information we expect. This requires a sample WMS WML file
1778     (sample.xml) which has been extracted from the frida server and
1779     "improved" manually.
1780    
1781     * Extensions/wms/test/test_ogclib.py: Added legacy code to add the
1782     main Thuban directory to the path in order to be able to import
1783     random modules. Adjusted the PyOGCLib detection to reuse the
1784     information gathered. Also added a note about the PYTHONPATH
1785     environment variable.
1786    
1787     * Extensions/wms/test/test_ogclib.py: The format specification is
1788     a mime-type, not a graphic format, hence image/jpeg wou ld be the
1789     proper format and not JPEG. We'll also have to take care of the
1790     encoding of / as %2F.
1791    
1792 joey 2111 2004-03-16 Martin Schulze <[email protected]>
1793    
1794     * Extensions/wms/test/test_ogclib.py: Added a (hopefully)
1795     comprehensive test for the getMapURL method, built compare URLs
1796     according to the documentation in OGC 01-068r3
1797    
1798     * Extensions/wms/capabilities.py (WMSCapabilities): Added the
1799     class WMSCapabilities to manage capabilites, will incorporate
1800     parsing the capabilities response and provide details for other
1801     classes.
1802    
1803 bh 2105 2004-03-12 Bernhard Herzog <[email protected]>
1804    
1805 bh 2107 Support views in addition to normal tables in the postgis
1806     shapestore
1807    
1808     * Thuban/Model/postgisdb.py
1809     (PostGISShapeStore._fetch_table_information): Add a fallback for
1810     the case where the table name is not in the geometry_columns
1811     table. This is usually the case for views. Also, set
1812     self.shapestore here.
1813     (PostGISShapeStore.ShapeType): No need to query the database all
1814     the time. The shape type is now determined in
1815     _fetch_table_information
1816    
1817     * test/postgissupport.py (PostgreSQLServer.new_postgis_db)
1818     (PostgreSQLServer.get_static_data_db, PostGISDatabase.__init__):
1819     New parameter to specify views.
1820     (PostGISDatabase.has_data): Also compare the views. New views
1821     parameter
1822     (PostGISDatabase.initdb): Create the views.
1823     (PostgreSQLServer.get_default_static_data_db): Add the v_landmarks
1824     view
1825    
1826     * test/test_postgis_db.py
1827     (TestPostGISShapestorePointFromViews): New. Test a
1828     PostGISShapeStore with a view
1829     (TestPostGISShapestorePointOIDAsGIDColumn.setUp): Pass the name of
1830     the geometry_column explicitly to test whether that works
1831    
1832     2004-03-12 Bernhard Herzog <[email protected]>
1833    
1834 bh 2105 Final step for explicit id/geometry columns: Loading and saving
1835    
1836     * Resources/XML/thuban-1.1.dtd: New. Derived from thuban-1.0.dtd
1837     with the following changes:
1838     (dbshapesource): Two new attributes id_column and geometry_column
1839    
1840     * Thuban/Model/save.py (SessionSaver.write): Use the new dtd
1841     (SessionSaver.write_session): Use the new namespace
1842     (SessionSaver.write_data_containers): Write the new dbshapesource
1843     parameters
1844    
1845     * Thuban/Model/load.py (SessionLoader.__init__): New namespace for
1846     the new file format version
1847     (SessionLoader.start_dbshapesource): Handle the new db parameters
1848    
1849     * test/test_save.py: Update to the new dtd and namespace
1850     (SaveSessionTest.test_save_postgis): Update the NonConnectionStore
1851     mock object to provide a working IDColumn method.
1852    
1853     * test/test_load_1_0.py: New. Copy of the test_load.py before
1854     today's changes but with the round-trip tests removed.
1855    
1856     * test/test_load_0_9.py: Update doc-string.
1857    
1858     * test/test_load.py: Update all .thuban files to the new dtd and
1859     namespace.
1860     (TestPostGISLayer.file_contents): Add the new dbshapesource
1861     paramters
1862    
1863 bh 2100 2004-03-11 Bernhard Herzog <[email protected]>
1864    
1865 bh 2103 Next step for explicit id/geometry columns: User interaction
1866    
1867     * Thuban/UI/dbdialog.py (ChooseDBTableDialog.__init__): Rework how
1868     the dialog is constructed. Add combo boxes to select id and
1869     geometry column. Rename some instance variables.
1870     (ChooseDBTableDialog.GetTable): Return id and geometry column
1871     names
1872     (ChooseDBTableDialog.OnTableSelect): New. Event handler for
1873     selections in the table list
1874    
1875     * Thuban/UI/mainwindow.py (MainWindow.AddDBLayer): Use id_column
1876     and geometry_column
1877    
1878     * Thuban/Model/session.py (Session.OpenDBShapeStore): Add the new
1879     parameters for id_column and geometry column of PostGISShapeStore
1880     here as well.
1881    
1882     * Thuban/Model/postgisdb.py (type_map): Add ROWID psycog type.
1883     (_raw_type_map): New. Map raw PostgreSQL type ints to thuban types
1884     (PostGISConnection.GeometryTables): Use a better query to
1885     determine which relations in the database might be usable for
1886     shapestores. Now supports views as well but is more PostgreSQL
1887     specific
1888     (PostGISConnection.table_columns): New. Somewhat experimental
1889     method to let the db dialogs provide lists of columns to users so
1890     that they can select id and geometry columns.
1891     (PostGISTable.__init__): The default value of the id_column
1892     parameter is now None it still means "gid" effectively, though.
1893     (PostGISTable.IDColumn): New introspection method to return a
1894     column object for the id column
1895     (PostGISShapeStore.GeometryColumn): New introspection method to
1896     return a column object for the geometry column
1897    
1898     * test/test_postgis_db.py
1899     (TestPostGISConnection.test_gis_tables_non_empty):
1900     Removed. Subsumed by the new:
1901     (TestPostGISConnection.test_gis_tables_with_views_and_tables):
1902     New. Tes the GeometryTables and table_columns methods with actual
1903     tables and views.
1904     (PointTests.test_id_column, PointTests.test_geometry_column):
1905     New. tests for the new methods.
1906     (TestPostGISShapestorePoint.setUp)
1907     (TestPostGISShapestorePointSRID.setUp)
1908     (TestPostGISShapestorePointExplicitGIDColumn.setUp): Fill the
1909     instance variables needed by the new tests
1910    
1911     2004-03-11 Bernhard Herzog <[email protected]>
1912    
1913 bh 2100 * Thuban/UI/classgen.py (GenQuantilesPanel.GetList): The row
1914     numbers given to ReadValue are ordinals.
1915    
1916     2004-03-11 Bernhard Herzog <[email protected]>
1917    
1918     Elimiate the requirement for PostGIS tables to have a column
1919     called "gid".
1920    
1921     * Thuban/Model/postgisdb.py (PostGISTable.__init__): New parameter
1922     id_column to specify which column to use to identify rows. Also
1923     new instance variables id_column and quoted_id_column
1924     (PostGISTable.RowIdToOrdinal, PostGISTable.RowOrdinalToId)
1925     (PostGISTable.ReadRowAsDict, PostGISTable.ReadValue)
1926     (PostGISTable.SimpleQuery): Use the id column name provided to the
1927     constructor instead of "gid"
1928     (PostGISShapeStore.__init__): New parameter id_column analogously
1929     to PostGISTable.__init__. This parameter is simply passed through
1930     to the base class constructor
1931     (PostGISShapeStore._create_col_from_description): Fix typo in
1932     doc-string
1933     (PostGISShapeStore.Shape, PostGISShapeStore.AllShapes)
1934     (PostGISShapeStore.ShapesInRegion): Use the id column name
1935     provided to the constructor instead of "gid"
1936    
1937     * test/postgissupport.py
1938     (PostgreSQLServer.get_default_static_data_db): New static table
1939     landmarks_point_id with an id column != "gid. Update the comments
1940     a bit.
1941     (skip_if_addgeometrycolumn_does_not_use_quote_ident): Fix typo in
1942     doc-
1943     (upload_shapefile): New parameter gid_column to use a name other
1944     than "gid" for the column to store the shape ids
1945    
1946     * test/test_postgis_db.py (TableTests): New. Mixin-class
1947     containing all tests previously in TestPostGISTable. The actual
1948     tests are the same but the code is a bit more configurable to
1949     allow for different id columns etc.
1950     (TestPostGISTable): Derive from TableTests now for the actual
1951     tests.
1952     (TestPostGISTableExplicitGIDColumn): New. Like TestPostGISTable
1953     except that it the landmarks_point_id table to test the id_column
1954     parameter
1955     (PointTests): Extend the doc-string
1956     (TestPostGISShapestorePointExplicitGIDColumn)
1957     (TestPostGISShapestorePointOIDAsGIDColumn): New classes derived
1958     from PointTests to test the explicit id_column parameter. One
1959     tests with the name of the column holding the shape ids, the other
1960     uses PostgreSQL's OID column. For the latter a number of methods
1961     have to be overwritten to make them independent of the actual id
1962     values.
1963    
1964 silke 2095 2004-03-08 Silke Reimer <[email protected]>
1965    
1966     Update debian directory:
1967    
1968     * debian/changelog: Added new version.
1969     * deiban/rules: Updated management of patches (with cbds)
1970     * debian/control: Added cbds to dependencies
1971     * debian/patches/*: New. Adds better support for patches of thuban in
1972     debian
1973     * debian/menu: Syntax of menu changed slightly
1974     * debian/setup.py.patch: removed because it has been moved to
1975     debian/patechs/setup.py.patch
1976    
1977    
1978 bh 2094 2004-02-26 Bernhard Herzog <[email protected]>
1979    
1980     Create the Doc/technotes directory for text files with information
1981     for developers
1982    
1983     * Doc/technotes/README: New. README for the technotes
1984    
1985     * Doc/technotes/coding_guidelines.txt: New. Coding guidelines for
1986     Thuban
1987    
1988     * Doc/technotes/release_process.txt: New. Used to be
1989     HOWTO-Release. Now slightly adapted to technote formatting style.
1990    
1991     * HOWTO-Release: Removed. It's contents are now in
1992     Doc/technotes/release_process.txt
1993    
1994 bh 2089 2004-02-25 Bernhard Herzog <[email protected]>
1995    
1996     * libraries/thuban/wxproj.cpp (get_wx_version): New. Return the
1997     version of wxWindows the module was compiled with so we can check
1998     that against the wxPython version.
1999    
2000     * Thuban/version.py (thuban_branch, thuban_release): New variables
2001     controlling which and how Thuban versions are shown. See the
2002     comments for details.
2003     (verify_versions): Also check that the wx version that wxproj is
2004     compiled against matches that of the wxPython we use at runtime
2005    
2006 bh 2080 2004-02-20 Bernhard Herzog <[email protected]>
2007    
2008 bh 2087 * Extensions/wms/wms.py (epsg_code_to_projection): Use
2009     get_system_proj_file to read the epsg projections. The old way
2010     depended on the current directory being the top Thuban directory.
2011    
2012     2004-02-20 Bernhard Herzog <[email protected]>
2013    
2014 bh 2085 * Extensions/svgexport/test/test_svgmapwriter.py
2015     (TestVirtualDC.test_clippath): Remove a debug print
2016    
2017     2004-02-20 Bernhard Herzog <[email protected]>
2018    
2019 bh 2083 * Extensions/svgexport/__init__.py: New. Turn
2020     Extensions/svgexport into a package.
2021    
2022     * Extensions/svgexport/svgmapwriter.py: Reorder the imports and
2023     doc-string a bit. The doc-string must come first, otherwise it's
2024     not a doc-string. The __future__ import must be the first thing
2025     after the doc-string. Use only double quotes in doc-strings.
2026     Single quotes trip up emacs syntax highlighting if the text
2027     contains apostrophes.
2028    
2029     2004-02-20 Bernhard Herzog <[email protected]>
2030    
2031 bh 2080 * Extensions/svgexport/test/__init__.py,
2032     Extensions/svgexport/test/test_svgmapwriter.py: New. Initial test
2033     suite for svgexport
2034    
2035     * test/runtests.py (find_test_modules): New. Function with the
2036     module finding code from main.
2037     (main): Use find_test_modules to figure out the default test
2038     modules and take modules from Extensions.svgexport.test too.
2039    
2040 bh 2075 2004-02-19 Bernhard Herzog <[email protected]>
2041    
2042 bh 2077 * Thuban/UI/application.py (ThubanApplication.OnInit): Make sure
2043     the mainwindow has a reference to the map of the initial session.
2044     This fixes a bug introduced with the fix for RT#2245
2045    
2046     2004-02-19 Bernhard Herzog <[email protected]>
2047    
2048 bh 2075 * Extensions/svgexport/svgsaver.py,
2049     Extensions/svgexport/svgmapwriter.py,
2050     Extensions/svgexport/maplegend.py: Added again. This time in the
2051     correct place.
2052    
2053 bh 2070 2004-02-17 Bernhard Herzog <[email protected]>
2054    
2055 bh 2073 Fix for RT#2245
2056    
2057     * Thuban/UI/application.py (ThubanApplication.OnInit): Initialize
2058     instance variables before trying to create any windows. Creating
2059     windows can start an event loop if e.g. message boxes are popped
2060     up for some reason, and event handlers, especially EVT_UPDATE_UI
2061     may want to access things from the application.
2062     (ThubanApplication.maps_changed): The mainwindow may not have been
2063     created yet, so check whether it has been created before calling
2064     its methods
2065    
2066     * Thuban/UI/view.py (MapCanvas.OnIdle): Only try to redraw if we
2067     have a map
2068    
2069     2004-02-17 Bernhard Herzog <[email protected]>
2070    
2071 bh 2070 * test/test_svgmapwriter.py, Extensions/svgsaver.py,
2072     Extensions/svgmapwriter.py, Extensions/maplegend.py,
2073     extensions/svgexport/svgsaver.py,
2074     extensions/svgexport/svgmapwriter.py,
2075     extensions/svgexport/maplegend.py: Removed. These files were in
2076     the wrong places or didn't work at all.
2077    
2078 bh 2067 2004-02-16 Bernhard Herzog <[email protected]>
2079    
2080 bh 2069 * Thuban/UI/view.py (MapCanvas.Export): Remove accidentally added
2081     line
2082    
2083     2004-02-16 Bernhard Herzog <[email protected]>
2084    
2085 bh 2067 * Thuban/UI/view.py (MapCanvas.Export): Avoid UnboundLocalError.
2086    
2087 mrechtie 2064 2004-02-15 Markus Rechtien <[email protected]>
2088    
2089     * Extensions/svgexport/svgmapwriter.py: New. Adds the capability
2090     to write a session to a file in SVG format.
2091     * Extensions/svgexport/svgsaver.py: New. Uses svgmapwriter.py
2092     to write a SVG map of a session.
2093     * Extensions/svgexport/maplegend: New. Writes a basic maplegend
2094     in SVG format for the current session.
2095    
2096 bh 2062 2004-02-13 Bernhard Herzog <[email protected]>
2097    
2098     * Thuban/UI/mainwindow.py (MainWindow.AddDBLayer): When the layer
2099     can't be created, return immediately after displaying the error
2100     message.
2101    
2102 bh 2060 2004-02-11 Bernhard Herzog <[email protected]>
2103    
2104     Handle postgis tables with more than one geometry column.
2105    
2106     * Thuban/Model/postgisdb.py
2107     (PostGISTable._fetch_table_information): Delegate the creation of
2108     column objects to a different method so that we can extend that in
2109     derived classes
2110     (PostGISTable._create_col_from_description): New. Column object
2111     creation part of _fetch_table_information
2112     (PostGISShapeStore._create_col_from_description): New. Extend
2113     inherited method to handle geometry columns
2114     (PostGISShapeStore.__init__): New parameter geometry_column to
2115     specify which geometry column to use. Optional but mandatory for
2116     tables with more than one geometry column
2117     (PostGISShapeStore._fetch_table_information): Also use the name of
2118     the geometry column when looking for the srid
2119     (PostGISShapeStore.ShapeType): Also use the name of the geometry
2120     column when looking for the shape type
2121    
2122     * test/test_save.py (SaveSessionTest.test_save_postgis): Adapt
2123     NonConnectionStore to changes in the PostGISShapeStore
2124    
2125     * test/test_postgis_db.py
2126     (TestPostGISSpecialCases.test_shapestore_two_geom_cols): Test
2127     PostGISShapeStore with tables having two geometry columns.
2128    
2129 bh 2058 2004-02-10 Bernhard Herzog <[email protected]>
2130    
2131     Fix some postgis problems. What remains to be done is real
2132     handling of SRIDs as they affect how reprojection is done
2133    
2134     * Thuban/Model/postgisdb.py (quote_identifier): Fix typo in
2135     doc-string
2136     (PostGISShapeStore._fetch_table_information): New. Extend
2137     inherited method to retrieve srid
2138     (PostGISShapeStore.BoundingBox): Handle tables without data.
2139     extent yields NULL for those
2140     (PostGISShapeStore.ShapesInRegion): Use the srid of the table.
2141    
2142     * test/test_postgis_db.py
2143     (TestPostGISSpecialCases.test_shapestore_empty_table): New test
2144     for the special case of a table without any data
2145     (TestPostGISShapestorePointSRID): New class with tests for a table
2146     that uses srids
2147     (PolygonTests): Fix a doc-string typo
2148    
2149     * test/postgissupport.py (PostGISDatabase.__init__): New parameter
2150     reference_systems with a specification of spacial reference
2151     systems to create in the new db.
2152     (PostgreSQLServer.new_postgis_db)
2153     (PostgreSQLServer.get_static_data_db): New parameter
2154     reference_systems to be passed through ultimately to
2155     PostGISDatabase. In new_postgis_db also check whether an existing
2156     db already has the right srids
2157     (PostgreSQLServer.get_default_static_data_db): Add srids and a
2158     table that uses srids
2159     (PostGISDatabase.initdb): Create the entries for the reference
2160     systems
2161     (PostGISDatabase.has_data): Add reference_systems parameter to
2162     check for those too
2163     (upload_shapefile): New parameter srid to create tables with a
2164     specific srid
2165    
2166 frank 2055 2004-02-06 Frank Koormann <[email protected]>
2167    
2168     * po/pt_BR.po: Fixed charset
2169    
2170 frank 2054 2004-02-05 Frank Koormann <[email protected]>
2171    
2172     * po/pt_BR.po: Fixed format string for error message, missing %s
2173     added (Thuban/UI/application.py:273)
2174    
2175 frank 2053 2004-02-03 Frank Koormann <[email protected]>
2176    
2177     First version of Portuguese (Brazilian) translation
2178    
2179     * po/pt_BR.po: New, translation of pot (2004-01-15 16:07+0300) for
2180     Brazilian Portuguese by Eduardo Patto Kanegae.
2181    
2182     * Thuban/UI/about.py (About.__init.py__): Added Eduardo to the list of
2183     translators.
2184    
2185    
2186 frank 2052 2004-01-22 Frank Koormann <[email protected]>
2187    
2188     * Doc/manual/thuban-manual.xml: Added section on installation of
2189     Thuban under Win32 systems. Fixed image path references in the postgis
2190     section. Some minor source formattings.
2191    
2192 frank 2051 2004-01-21 Frank Koormann <[email protected]>
2193    
2194     Make Thuban remember path selections (at least for one application run).
2195    
2196     * Thuban/UI/application.py (Application.OnInit): Initialize path as a
2197     attribute of application object. Path is a dictionary of
2198     strings, currently with the items "data" and "projection".
2199     (Application.SetPath): New, stores path for the specified item.
2200     (Application.Path): New, return path for the specified item.
2201    
2202     * Thuban/UI/mainwindow.py
2203     (MainWindow.OpenSession, MainWindow.SaveSessionAs,
2204     MainWindow.AddLayer, MainWindow.AddRasterLayer,
2205     MainWindow.TableOpen): Access "data" path information of the
2206     application.
2207    
2208     * Thuban/UI/projdialog.py (ProjFrame._OnImport, ProjFrame._OnExport):
2209     Access "projection" path information of the application.
2210    
2211 bh 2048 2004-01-05 Bernhard Herzog <[email protected]>
2212    
2213 bh 2050 * po/ru.po: Updated translations from Alex Shevlakov
2214    
2215     2004-01-05 Bernhard Herzog <[email protected]>
2216    
2217 bh 2048 * po/Makefile, po/README: Move the description of how to generate
2218     the translation statistics to the README.
2219    
2220 bh 2042 2003-12-23 Bernhard Herzog <[email protected]>
2221    
2222 bh 2045 * NEWS: Update for 1.0.0
2223    
2224     * po/it.po: Another update from Maurizio Napolitano
2225    
2226     2003-12-23 Bernhard Herzog <[email protected]>
2227    
2228 bh 2042 * po/it.po: Updated translation from Maurizio Napolitano
2229    
2230     2003-12-23 Bernhard Herzog <[email protected]>
2231    
2232     * Thuban/UI/join.py (JoinDialog.__init__): Mark one more string
2233     for translation
2234    
2235     * Thuban/UI/mainwindow.py (MainWindow.TableRename)
2236     (MainWindow.RenameMap, MainWindow.RenameLayer): Mark some more
2237     strings for translation
2238    
2239     * po/de.po: Update with the newly marked strings.
2240    
2241 bh 2033 2003-12-22 Bernhard Herzog <[email protected]>
2242    
2243 bh 2039 * HOWTO-Release: Fix the places where version numbers have to be
2244     updated
2245    
2246     2003-12-22 Bernhard Herzog <[email protected]>
2247    
2248 bh 2037 * setup.py (setup call): 1.0.0, yeah!
2249    
2250     * Thuban/version.py (longversion): 1.0.0, yeah!
2251    
2252     * Thuban/Model/load.py (SessionLoader.__init__): Accept the
2253     1.0.0 namespace too
2254    
2255     * Thuban/Model/save.py (SessionSaver.write_session): Save with
2256     1.0.0 namespace
2257    
2258     * test/test_load.py (LoadSessionTest.dtd)
2259     (TestSingleLayer.file_contents)
2260     (TestNonAsciiColumnName.file_contents)
2261     (TestLayerVisibility.file_contents)
2262     (TestClassification.file_contents, TestLabels.file_contents)
2263     (TestLayerProjection.file_contents)
2264     (TestRasterLayer.file_contents, TestJoinedTable.file_contents)
2265     (TestLabelLayer.file_contents, TestPostGISLayer.file_contents)
2266     (TestPostGISLayerPassword.file_contents)
2267     (TestLoadError.file_contents, TestLoadError.test): Update for
2268     1.0.0 namespace
2269    
2270     * test/test_save.py (SaveSessionTest.dtd)
2271     (SaveSessionTest.testEmptySession)
2272     (SaveSessionTest.testSingleLayer)
2273     (SaveSessionTest.testLayerProjection)
2274     (SaveSessionTest.testRasterLayer)
2275     (SaveSessionTest.testClassifiedLayer)
2276     (SaveSessionTest.test_dbf_table)
2277     (SaveSessionTest.test_joined_table)
2278     (SaveSessionTest.test_save_postgis): Update for 1.0.0 namespace
2279    
2280     2003-12-22 Bernhard Herzog <[email protected]>
2281    
2282 bh 2035 * Thuban/Model/load.py (SessionLoader.start_label): Make sure the
2283     alignment flags are byte strings not unicode and that they have
2284     valid values
2285    
2286     * test/test_load.py (TestLabelLayer): New. Test loading (and
2287     indirectly saving) of maps with labels.
2288    
2289     2003-12-22 Bernhard Herzog <[email protected]>
2290    
2291 bh 2033 * Thuban/UI/tableview.py (TableGrid.OnDestroy)
2292     (TableGrid.__init__): Handle EVT_WINDOW_DESTROY in the grid to
2293     unsubscribe all subscribers.
2294     (LayerTableFrame.OnDestroy): Do not unsubscribe any messages from
2295     self.grid since it may already have been destroyed.
2296     Fixes RT #2256
2297    
2298 bh 2031 2003-12-19 Bernhard Herzog <[email protected]>
2299    
2300     * po/fr.po, po/es.po: Updated translations from Daniel Calvelo
2301    
2302 bh 2028 2003-12-16 Bernhard Herzog <[email protected]>
2303 silke 2029
2304     * debian/bitmappath.patch, debian/setup.py.patch:
2305     added to ensure compliance with FHS for debian
2306     * debian/rules, debian/changelog:
2307     added patches in rules to ensure compliance with FHS for debian
2308 bh 2028
2309 silke 2029 2003-12-16 Bernhard Herzog <[email protected]>
2310    
2311 bh 2028 * po/Makefile (mo): Make the output a bit nicer so that it prints
2312     statistics about the translations. Add a comment how produce even
2313     nicer statistics with sed.
2314    
2315 frank 2026 2003-12-09 Frank Koormann <[email protected]>
2316    
2317     * Resources/Projections/defaults.proj:
2318     French projection sample with correct accents (UNICODE).
2319    
2320 bh 2025 2003-12-05 Bernhard Herzog <[email protected]>
2321    
2322     * MANIFEST.in: Add the devtools directory
2323    
2324     * setup.py (setup call): Use license instead of licence. This
2325     silences a deprecation warning on Python 2.3
2326    
2327 frank 2022 2003-12-05 Frank Koormann <[email protected]>
2328    
2329 frank 2023 Documentation synced with 1.0rc1
2330    
2331     * Doc/manual/thuban-manual.xml:
2332     Minor formatting changes and references to database layers .
2333     Introduction.Internationalization: New section on i18n.
2334     MapManagement.AddingandRemovingLayers: Added item on database layers.
2335     MapManagement.TheLegend: Added section and screenshot on popup menu.
2336     ProjectionManagement: Updated screenshot and sentence on EPSG.
2337     Appendix.SupportedDataSources: Added PostGIS.
2338     Appendix.WorkingwithPostGIS: New section.
2339    
2340     * Doc/manual/images/6_projection.png: Updated screenshot including
2341     EPSG checkboxes.
2342    
2343     * Doc/manual/images/3_5_popup_menu.png: New, popup menu screenshot.
2344    
2345     * Doc/manual/images/app_postgis_add_layer.png,
2346     Doc/manual/images/app_postgis_db_add.png,
2347     Doc/manual/images/app_postgis_db_management.png:
2348     New screenshots focussing on database layers
2349    
2350     2003-12-05 Frank Koormann <[email protected]>
2351    
2352 frank 2022 * Thuban/UI/projdialog.py (load_user_proj): If user.proj is missing
2353     write warning to stderr instead of rising a warning dialog
2354    
2355 bh 2016 2003-12-03 Bernhard Herzog <[email protected]>
2356    
2357 bh 2021 Fix for RT #2243
2358    
2359 bh 2020 * Thuban/UI/mainwindow.py (MainWindow.has_selected_shape_layer):
2360     New. Like has_selected_layer but for shape layers only
2361     (_has_selected_shape_layer): New. Like _has_selected_layer but for
2362     shape layers only
2363     (layer_show_table command, layer_jointable command): Use these
2364     commands should only be available for shape layers
2365    
2366     2003-12-03 Bernhard Herzog <[email protected]>
2367    
2368 bh 2018 * Thuban/UI/mainwindow.py (MainWindow.Unsubscribe): Deal with
2369     publishers that are wx objects and may have been destroyed by wx
2370     already. Fixes RT #2242.
2371    
2372     2003-12-03 Bernhard Herzog <[email protected]>
2373    
2374 bh 2016 * po/ru.po: Updates from Alex Shevlakov
2375    
2376 silke 2013 2003-12-03 Silke Reimer <silkeintevation.de>
2377    
2378     * debian/control, debian/changelog: Added gdal-support to
2379     debian package, updated to new thuban version
2380    
2381    
2382 bh 2012 2003-12-03 Bernhard Herzog <[email protected]>
2383    
2384     * Thuban/Lib/version.py: New. Module for version number
2385     manipulations. The version of make_tuple here also deals better
2386     with more unusual version number strings, such as e.g.
2387     "1.2+cvs20031111"
2388    
2389     * Thuban/version.py (make_tuple): Removed. It's now in
2390     Thuban.Lib.version. Use that implementation instead.
2391    
2392     * test/test_lib_version.py: New. Tests for Thuban/Lib/version.py
2393    
2394 bh 2005 2003-12-02 Bernhard Herzog <[email protected]>
2395    
2396 bh 2010 * MANIFEST.in: Add debian files
2397    
2398 bh 2008 * setup.py (setup call): Add packages for the Extensions so that
2399     they're installed too
2400     (data_files): Add READMEs and sample data from some Extensions
2401    
2402     * NEWS: Add note about the extensions in binary packages
2403    
2404     2003-12-02 Bernhard Herzog <[email protected]>
2405    
2406 bh 2005 * Thuban/Model/save.py (SessionSaver.write_session): Save files
2407     with the thuban-1.0rc1
2408    
2409     * Thuban/Model/load.py (SessionLoader.__init__): Recognize the
2410     thuban-1.0rc1 namespace too
2411    
2412     * test/test_save.py (SaveSessionTest.dtd)
2413     (SaveSessionTest.testEmptySession)
2414     (SaveSessionTest.testSingleLayer)
2415     (SaveSessionTest.testLayerProjection)
2416     (SaveSessionTest.testRasterLayer)
2417     (SaveSessionTest.testClassifiedLayer)
2418     (SaveSessionTest.test_dbf_table)
2419     (SaveSessionTest.test_joined_table)
2420     (SaveSessionTest.test_save_postgis): Update to thuban-1.0rc1
2421     namespace
2422    
2423     * test/test_load.py (LoadSessionTest.dtd): Update to thuban-1.0rc1
2424     namespace
2425     (TestSingleLayer.file_contents)
2426     (TestNonAsciiColumnName.file_contents)
2427     (TestLayerVisibility.file_contents)
2428     (TestClassification.file_contents, TestLabels.file_contents)
2429     (TestLayerProjection.file_contents)
2430     (TestRasterLayer.file_contents, TestJoinedTable.file_contents)
2431     (TestPostGISLayer.file_contents)
2432     (TestPostGISLayerPassword.file_contents)
2433     (TestLoadError.file_contents, TestLoadError.test): Update to
2434     thuban-1.0rc1 namespace
2435    
2436 bh 1996 2003-12-01 Bernhard Herzog <[email protected]>
2437    
2438 bh 2003 * setup.py (proj4_prefix, wx_prefix, gdal_prefix): Fix these for
2439     nt to better match Intevation's current w32 setup
2440    
2441 bh 2001 * HOWTO-Release: Add note about updating MANIFEST.in
2442    
2443     * MANIFEST.in: Add the Extensions
2444    
2445 bh 1998 * NEWS: Update for 1.0rc1
2446    
2447     2003-12-01 Bernhard Herzog <[email protected]>
2448    
2449 bh 1996 * Thuban/UI/mainwindow.py (MainWindow.AddLayer): Change the wild
2450     cards for the dialog so that shapefiles ending in all uppercase
2451     SHP are listed too
2452    
2453 bh 1988 2003-11-28 Bernhard Herzog <[email protected]>
2454    
2455 bh 1996 * Thuban/version.py (longversion): Update to 1.0rc1
2456    
2457     * setup.py (setup call): Update version to 1.0rc1. Use the
2458     [email protected] email address as author email instead of my
2459     personal one.
2460    
2461     2003-11-28 Bernhard Herzog <[email protected]>
2462    
2463 bh 1992 * po/de.po: Update german translation.
2464    
2465     2003-11-28 Bernhard Herzog <[email protected]>
2466    
2467 bh 1990 Unify the filenames stored in .thuban files so that the .thuban
2468     files are more platform independend
2469    
2470     * Thuban/Model/save.py (unify_filename): New. Unify filenames so
2471     that they can be used on both windows and unix
2472     (SessionSaver.prepare_filename): New. Handle all filename
2473     transformations for filenames stored in the thuban file
2474     (SessionSaver.write_data_containers, SessionSaver.write_layer):
2475     Use prepare_filename
2476    
2477     * test/test_save.py (SaveSessionTest.testSingleLayer)
2478     (SaveSessionTest.testLayerProjection)
2479     (SaveSessionTest.testRasterLayer)
2480     (SaveSessionTest.testClassifiedLayer)
2481     (SaveSessionTest.test_dbf_table)
2482     (SaveSessionTest.test_joined_table): Filenames are always stored
2483     with slashes on all currently supported platforms so adapt all
2484     tests to this
2485    
2486     * test/test_load.py (LoadSessionTest.filenames): With the new
2487     filename scheme the filenames in the tests should be
2488     understandable on all currently supported platforms so we turn
2489     this into an empty list because we don't have to normalize them
2490     anymore
2491    
2492     2003-11-28 Bernhard Herzog <[email protected]>
2493    
2494 bh 1988 * test/test_layer.py (TestLayer.test_arc_layer_with_projection):
2495     Add the ellipsoid to the projection since some Proj versions
2496     complain if it's missing.
2497    
2498 bh 1984 2003-11-27 Bernhard Herzog <[email protected]>
2499    
2500     Corect some bounding box projection problems
2501    
2502     * Thuban/Model/proj.py (Projection.InverseBBox): New. Inverse
2503     version of ForwardBBox
2504     (Projection._transform_bbox): New. common implementation of
2505     ForwardBBox and InverseBBox
2506     (Projection.ForwardBBox): Use _transform_bbox.
2507    
2508     * test/test_proj.py (TestProjection.test): Add test for
2509     InverseBBox
2510    
2511     * Thuban/Model/layer.py (Layer.LatLongBoundingBox)
2512     (Layer.ShapesBoundingBox, RasterLayer.LatLongBoundingBox): Use the
2513     new InverseBBox method to determine the unprojected bounding box
2514     (Layer.ShapesInRegion): Use the ForwardBBox method to project the
2515     bbox.
2516    
2517     * test/test_layer.py (TestLayer.test_point_layer_with_projection):
2518     Removed.
2519     (TestLayer.test_arc_layer_with_projection): New. This test is
2520     better able to test whether bounding boxes are projected correctly
2521     than test_point_layer_with_projection
2522    
2523 bh 1986 * Thuban/UI/viewport.py (ViewPort.map_projection_changed): Use
2524     InverseBBox to unproject bboxes
2525    
2526 bh 1975 2003-11-25 Bernhard Herzog <[email protected]>
2527    
2528 bh 1981 * Thuban/UI/about.py (About.__init__): Make sure we have ASCII
2529     source code.
2530    
2531     2003-11-25 Bernhard Herzog <[email protected]>
2532    
2533 bh 1979 * Thuban/Model/layer.py (Layer.__getattr__): Removed. It was only
2534     there for backwards compatibility and all code relying on that
2535     should have been updated by now.
2536    
2537     2003-11-25 Bernhard Herzog <[email protected]>
2538    
2539 bh 1977 * test/test_load.py (TestClassification.test): Add the missing
2540     round trip test.
2541     (TestClassification.file_contents): Update to the newest file
2542     format
2543    
2544     2003-11-25 Bernhard Herzog <[email protected]>
2545    
2546 bh 1975 Add very experimental (and possibly dangerous) extension to draw
2547     polygons:
2548    
2549     * Extensions/drawshape/README: New. Brief installation
2550     instructions
2551    
2552     * Extensions/drawshape/drawshape.py: New. Implementation of the
2553     drawshape extensions
2554    
2555     * Extensions/drawshape/patch.diff: Patch to apply before the
2556     extension can be used.
2557    
2558 bh 1971 2003-11-24 Bernhard Herzog <[email protected]>
2559    
2560 bh 1973 * Thuban/Model/data.py (ShapefileStore._open_shapefile)
2561     (ShapefileStore.__init__): Factor opening the shapefile into a
2562     separate method (the new _open_shapefile). This makes the code a
2563     bit more readable but the real reason is that it makes some evil
2564     hacks easier. :-)
2565    
2566     2003-11-24 Bernhard Herzog <[email protected]>
2567    
2568 bh 1971 * Thuban/Model/load.py (SessionLoader.check_attrs): If no
2569     converter is specified for an attribute assume it's a string
2570     containing only Latin1 characters. Update doc-string accordingly.
2571     This change should fix many places where unicode objects might
2572     accidentally enter Thuban.
2573    
2574     * test/test_load.py (TestNonAsciiColumnName): New test to check
2575     what happens with column names in DBF files that contain non-ascii
2576     characters
2577    
2578 bh 1969 2003-11-21 Bernhard Herzog <[email protected]>
2579    
2580     Enable the experimental attribute editing again and introduce a
2581     command line switch to actually activate it
2582    
2583     * Thuban/UI/main.py (options): New. Container for options set on
2584     the commmand line
2585     (main): Add the --enable-attribute-editing flag.
2586    
2587     * Thuban/UI/identifyview.py (IdentifyView.__init__): If attribute
2588     editing is enabled use the grid ctrl which allows editing of the
2589     values
2590    
2591     * Thuban/Model/transientdb.py (AutoTransientTable.write_record):
2592     New. Just delegate this to the underlying table.
2593    
2594 bh 1967 2003-11-20 Bernhard Herzog <[email protected]>
2595    
2596     * test/test_proj.py (ProjFileReadTests.test_read_unreadable_file):
2597     Skip this test if run under non-posix systems since it only works
2598     there
2599    
2600 bh 1960 2003-11-19 Bernhard Herzog <[email protected]>
2601    
2602 bh 1965 * Thuban/Model/resource.py: Rework the way gdal support is
2603     determined so that we can give a reason in the about why gdal is
2604     not supported.
2605     (gdal_support_status): New. Variable holding a string with the
2606     reason for no gdal support
2607    
2608     * Thuban/UI/about.py (About.__init__): Add the reason why gdal is
2609     not supported to the message
2610    
2611     2003-11-19 Bernhard Herzog <[email protected]>
2612    
2613 bh 1963 Remove the old table interface and its test cases
2614    
2615     * Thuban/Model/table.py (OldTableInterfaceMixin): Removed.
2616     (DBFTable, MemoryTable): Do not derive from OldTableInterfaceMixin
2617     anymore
2618    
2619     * Thuban/Model/transientdb.py (TransientTableBase)
2620     (AutoTransientTable): Do not derive from OldTableInterfaceMixin
2621     anymore
2622    
2623     * test/test_table.py: Removed since the old interface it tests is
2624     gone.
2625    
2626     * test/runtests.py (main): The old table interface is gone and
2627     with it the deprecation warnings so remove the code that turns
2628     these warnings into errors
2629    
2630     2003-11-19 Bernhard Herzog <[email protected]>
2631    
2632 bh 1960 * test/test_table.py: Revert to revision 1.5 again. Changing the
2633     tests to use the new table interface is completely wrong since the
2634     whole purpose of the tests in this module is to test the old
2635     interface.
2636    
2637 bh 1954 2003-11-18 Bernhard Herzog <[email protected]>
2638    
2639 bh 1958 * Thuban/Model/postgisdb.py (PostGISConnection.MatchesParameters):
2640     New. Test whether the connection matches a set of connection
2641     parameters
2642    
2643     * Thuban/UI/dbdialog.py (DBFrame.conns_changed): Fix doc-string
2644     (DBFrame.OnAdd): Use the new MatchesParameters method when looking
2645     for existing connections with the same parameters and break out of
2646     the loop correctly.
2647    
2648     * test/test_postgis_db.py (TestBriefDescription)
2649     (TestPostGISSimple.test_brief_description): Rename
2650     TestBriefDescription to TestPostGISSimple and the test method to
2651     test_brief_description so that we can add more test methods.
2652     (TestPostGISSimple.test_matches_parameters): New. Test the new
2653     MatchesParameters method
2654    
2655     2003-11-18 Bernhard Herzog <[email protected]>
2656    
2657 bh 1960 * Thuban/Lib/connector.py (Publisher): Introduce a new flag,
2658 bh 1954 _was_destroyed, to indicate whether an publisher instance has
2659     already been destroyed.
2660     (Publisher.Unsubscribe): Only disconnect if the publisher has not
2661     been destroyed yet.
2662     (Publisher.Destroy): Set the _was_destroyed flag to true.
2663    
2664     * test/test_connector.py
2665     (TestPublisher.test_unsubscribe_after_destroy): New. Test that
2666     calling Unsubscribe after Destroy doesn't raise an exception
2667    
2668 bh 1951 2003-11-14 Bernhard Herzog <[email protected]>
2669    
2670     * Thuban/UI/identifyview.py (IdentifyView.selected_shape): Fix
2671     typo in doc-string
2672    
2673 bh 1949 2003-11-13 Bernhard Herzog <[email protected]>
2674    
2675     Quote table and column names properly for postgis.
2676    
2677     * Thuban/Model/postgisdb.py (quote_identifier): New. Function to
2678     quote an identifier for use in an sql statement
2679     (PostGISColumn.__init__): Add the quoted_name attribute
2680     (PostGISTable.__init__): New instance variable quoted_tablename
2681     (PostGISTable._fetch_table_information): Use the quoted table
2682     name. New isntance variable quoted_geo_col with a quoted version
2683     of geometry_column
2684     (PostGISTable.NumRows, PostGISTable.RowIdToOrdinal)
2685     (PostGISTable.RowOrdinalToId): Use the quoted table name
2686     (PostGISTable.ReadValue, PostGISTable.ValueRange)
2687     (PostGISTable.UniqueValues, PostGISTable.SimpleQuery)
2688     (PostGISShapeStore.BoundingBox, PostGISShapeStore.Shape)
2689     (PostGISShapeStore.AllShapes, PostGISShapeStore.ShapesInRegion):
2690     Use quoted table and column names
2691    
2692     * test/test_postgis_db.py (TestPostGISSpecialCases)
2693     (TestPostGISIgnoredColumns): Rename the class to
2694     TestPostGISSpecialCases because that better describes the new
2695     cases
2696     (TestPostGISSpecialCases.test_unsupported_types)
2697     (TestPostGISSpecialCases.test): Rename the method to
2698     test_unsupported_types because we need a more descriptive name now
2699     that there are more methods
2700     (TestPostGISSpecialCases.test_table_name_quoting)
2701     (TestPostGISSpecialCases.test_column_name_quoting)
2702     (TestPostGISSpecialCases.test_shapestore_name_quoting): New test
2703     cases to test quoting of table and column names in PostGISTable
2704     and PostGISShapeStore
2705    
2706     * test/postgissupport.py
2707     (skip_if_addgeometrycolumn_does_not_use_quote_ident): New. Skip if
2708     AddGeometryColumn desn't support table or column names with sapces
2709     or double quotes
2710    
2711 jan 1945 2003-11-12 Jan-Oliver Wagner <[email protected]>
2712    
2713     * Extensions/wms/__init__.py: New: Init to make this
2714     directory a package.
2715    
2716     * Extensions/wms/wms.py: New: Provide layers via OGC WMS.
2717    
2718 bh 1932 2003-11-11 Bernhard Herzog <[email protected]>
2719    
2720 bh 1942 * Thuban/Model/resource.py (EPSG_DEPRECATED_PROJ_FILE): New.
2721     Constant for the file woth deprecated epsg projections
2722     (get_system_proj_file): Update doc-string
2723    
2724     * Thuban/UI/projdialog.py (ProjFrame.build_dialog): Add a space
2725     above the EPS widgets, introduce a check box for the deprecated
2726     eps projections and a label for the epsg widgets
2727     (ProjFrame._OnShowEPSG): Handle the deprecated EPSG projections
2728     too
2729    
2730     2003-11-11 Bernhard Herzog <[email protected]>
2731    
2732 bh 1939 Avoid warnings when run under Python 2.3
2733    
2734     * Thuban/UI/baserenderer.py (BaseRenderer.draw_point_shape)
2735     (BaseRenderer.draw_label_layer): Coordinates must be ints.
2736    
2737     * Thuban/UI/renderer.py (MapRenderer.make_point): Turn this into a
2738     real method so that we can convert to int.
2739     (MapRenderer.label_font): The font size mist be an int.
2740    
2741     * Thuban/UI/common.py (Color2wxColour): The color values must be
2742     ints. Also, remove the unnecessary asserts.
2743    
2744     * test/test_load_0_8.py (TestUnicodeStrings.file_contents)
2745     (TestUnicodeStrings.test): Python source code should not contain
2746     non-ascii characters unless an encoding is specified in the file.
2747     Therefore use \x escapes in the string literals for non-ascii
2748     characters.
2749    
2750     2003-11-11 Bernhard Herzog <[email protected]>
2751    
2752 bh 1934 * Thuban/Model/resource.py (get_system_proj_file): Add a filename
2753     parameter so that this function can be used for all proj files in
2754     Resource/Projections
2755     (DEFAULT_PROJ_FILE, EPSG_PROJ_FILE): New. Predefined filenames for
2756     get_system_proj_file
2757    
2758     * Thuban/UI/projdialog.py (ProjFrame.__init__): Instead of one
2759     ProjFile self.__sysProjFile use a dictionary of system ProjFile
2760     objects self._sys_proj_files
2761     (ProjFrame.build_dialog): Adapt to the new changes in the
2762     ProjectionList constructor. Add a check button to toggle whether
2763     EPSG projections are shown
2764     (ProjFrame._OnShowEPSG): New. Handler for the epsg check button
2765     events.
2766     (ProjFrame.load_user_proj, ProjFrame.load_system_proj): Only show
2767     the busy cursor if the files have not yet been loaded by the
2768     dialog.
2769     (ProjFrame.load_system_proj): Add a parameter for the name of the
2770     proj file. Maintain the dictionary of system projections
2771     self._sys_proj_files
2772    
2773     * Thuban/UI/projlist.py (ProjectionList): Merge the system_projs,
2774     user_projs parameters into one parameter proj_files which is a
2775     list of proj files.
2776     (ProjectionList._subscribe_proj_files)
2777     (ProjectionList._unsubscribe_proj_files): New. Move
2778     subscription/unsubscription of projfile messages to separate
2779     methods
2780     (ProjectionList.Destroy): The unsubscribe is now done in
2781     _unsubscribe_proj_files
2782     (ProjectionList.update_projections): We now have a list of proj
2783     file objects
2784     (ProjectionList.SetProjFiles): New method to set a new list of
2785     proj file objects
2786    
2787     * test/test_proj.py (ProjFileReadTests.test_get_system_proj_file):
2788     Specify explicitly which system proj file to load.
2789    
2790     2003-11-11 Bernhard Herzog <[email protected]>
2791    
2792 bh 1932 * Thuban/Model/load.py (SessionLoader.Destroy): New. Clear all
2793     instance variables to cut cyclic references. The GC would have
2794     collected the loader eventually but it can happen that it doesn't
2795     run at all until thuban is closed (2.3 but not 2.2 tries a bit
2796     harder and forces a collection when the interpreter terminates)
2797     (load_session): Call the handler's Destroy method to make sure
2798     that it gets garbage collected early. Otherwise it will be
2799     collected very late if at all and it holds some references to e.g.
2800     shapestores and the session which can lead to leaks (of e.g. the
2801     temporary files)
2802    
2803     * test/test_load.py (TestSingleLayer.test_leak): New. test for the
2804     resource leak in load_session
2805    
2806 bh 1929 2003-11-10 Bernhard Herzog <[email protected]>
2807    
2808     * Thuban/UI/baserenderer.py: Add a way to specify how layers in
2809     extensions are to be rendered.
2810     (_renderer_extensions): New. List with renderer for layers in
2811     extensions
2812     (add_renderer_extension): New. Add a renderer extension
2813     (init_renderer_extensions): New. Init the renderer extensions
2814     (BaseRenderer.render_map_incrementally): Search
2815     _renderer_extensions for how to draw unknown layer types
2816     (BaseRenderer.draw_raster_data): Add format parameter so that
2817     formats other than BMP can be drawn
2818     (BaseRenderer.draw_raster_layer): Pass an explicit format to
2819     draw_raster_data
2820    
2821     * Thuban/UI/renderer.py (raster_format_map): New. Mapping form the
2822     strings of the format parameter of draw_raster_data method to wx
2823     constants
2824     (MapRenderer.draw_raster_data): Add the format parameter and use
2825     raster_format_map to map it to the right wxwindows constant for
2826     wxImageFromStream
2827    
2828     * test/test_baserenderer.py (SimpleRenderer.draw_raster_data): Add
2829     the format parameter and record it
2830     (TestBaseRenderer.test_raster_no_projection): check the format
2831     paramter of the draw_raster_data method
2832     (TestBaseRenderer.test_renderer_extension): New. Test the renderer
2833     extension facility
2834    
2835 bh 1925 2003-11-07 Bernhard Herzog <[email protected]>
2836    
2837     Tweak the usage of the sqlite database to make common use cases
2838     more responsive. In most cases copying the data to the sqlite
2839     database takes so long that using sqlite doesn't have enough
2840     advantages.
2841    
2842     * Thuban/Model/transientdb.py (TransientTableBase.ValueRange): Add
2843     comments about performance and query the min and max in separate
2844     statements because only that way will indexes be used.
2845     (TransientTableBase.UniqueValues): Add some comments about
2846     performance.
2847     (AutoTransientTable.ValueRange, AutoTransientTable.UniqueValues):
2848     Do not copy the data to the transient DB but use the transient
2849     copy if it exists. See the new comments for the performance trade
2850     offs
2851    
2852     * test/test_transientdb.py
2853     (TestTransientTable.test_auto_transient_table): Make sure that the
2854     data is copied to the transient database at some point.
2855    
2856 bh 1913 2003-11-03 Bernhard Herzog <[email protected]>
2857    
2858 bh 1922 * Thuban/Model/data.py (ShapefileStore.ShapesInRegion): Bind some
2859     globals to locals so that it's a bit faster
2860    
2861     2003-11-03 Bernhard Herzog <[email protected]>
2862    
2863 bh 1920 * Thuban/UI/baserenderer.py
2864     (BaseRenderer.draw_shape_layer_incrementally): Use the ReadValue
2865     method. ReadValue is faster than ReadRowAsDict since it only reads
2866     one cell especially now that the dbf file objects actually
2867     implement it.
2868    
2869     * Thuban/Model/table.py (DBFTable.ReadValue): Use the new
2870     read_attribute method of the dbf objects
2871    
2872     2003-11-03 Bernhard Herzog <[email protected]>
2873    
2874 bh 1916 * Extensions/profiling/profiling.py (popup_dialog_box): New config
2875     variable to indicate whether the result should be shown in a
2876     dialog box
2877     (profile_screen_renderer, time_screen_renderer): Only show a
2878     dialog box if popup_dialog_box is true.
2879     (profile_screen_renderer): Flush stdout after the printing the
2880     first part of the "profiling..." message
2881    
2882     * Thuban/UI/baserenderer.py
2883     (BaseRenderer.draw_shape_layer_incrementally): Cache the pens and
2884     brushes for the groups so that they're not created over and over
2885     again
2886    
2887 bh 1913 * Thuban/Model/classification.py (Classification.__getattr__)
2888     (Classification._compile_classification)
2889     (Classification._clear_compiled_classification): New. Methods to
2890     manage a 'compiled' representation of the classification groups
2891     which is created on demand
2892     (Classification.InsertGroup, Classification.RemoveGroup)
2893     (Classification.ReplaceGroup): reset the compiled representation
2894     (Classification.FindGroup): Use the compiled representation to
2895     find the matching group
2896     (ClassGroupRange.GetRangeTuple): New. Return the range as a tuple
2897    
2898 bh 1904 2003-10-31 Bernhard Herzog <[email protected]>
2899    
2900 bh 1911 * Thuban/Model/classification.py (Classification.SetDefaultGroup):
2901     Send a CLASS_CHANGED message
2902     (Classification.RemoveGroup): Send a CLASS_CHANGED message and do
2903     not return the removed group since it wasn't used.
2904    
2905     * test/test_classification.py
2906     (TestClassification.test_set_default_group): New. Test the
2907     SetDefaultGroup method
2908     (TestClassification.test_insert_group): New. Test the InsertGroup
2909     method
2910     (TestClassification.test_remove_group): New. Test the RemoveGroup
2911     method
2912     (TestClassification.test_replace_group): New. Test the
2913     ReplaceGroup method
2914    
2915     2003-10-31 Bernhard Herzog <[email protected]>
2916    
2917 bh 1908 * test/test_classification.py (TestClassification.setUp):
2918     Subscribe to the CLASS_CHANGED messages
2919     (TestClassification.tearDown): New. Destroy the classification
2920     properly
2921     (TestClassification.test_defaults): Add tests for the default line
2922     width and whether no messages were sent yet
2923     (TestClassification.test_set_default_properties): Add tests for
2924     messages and setting the default line width
2925     (TestClassification.test_add_singleton)
2926     (TestClassification.test_add_range)
2927     (TestClassification.test_multiple_groups): Add tests for messages
2928    
2929     2003-10-31 Bernhard Herzog <[email protected]>
2930    
2931 bh 1906 Some more refactoring in preparation for new tests:
2932    
2933     * test/test_classification.py (TestClassification.setUp): New.
2934     Instantiate the classification here. Update the test methods
2935     accordingly.
2936     (TestClassification.test_multiple_groups): Make sure that the two
2937     singletons matching 1 are considered different.
2938    
2939     2003-10-31 Bernhard Herzog <[email protected]>
2940    
2941 bh 1904 * test/test_classification.py (red, green, blue): New. These
2942     constants were used in several cases. Update the relevant methods.
2943     (TestClassification.test_defaults)
2944     (TestClassification.test_set_default_properties)
2945     (TestClassification.test_add_singleton)
2946     (TestClassification.test_add_range)
2947     (TestClassification.test_multiple_groups)
2948     (TestClassification.test_deepcopy): New. These were formerly all
2949     part of the single method test.
2950     (TestClassification.test_deepcopy): Removed.
2951     (TestClassIterator): Removed. The test case is now a method of
2952     TestClassification since it tests part of the public interface of
2953     Classification
2954     (TestClassification.test_iterator): New. Used to be
2955     TestClassIterator effectively
2956    
2957 jan 1902 2003-10-31 Jan-Oliver Wagner <[email protected]>
2958    
2959     GUIfied the functions of the profiling extension.
2960    
2961     * /Extensions/profiling/__init__.py: New: Init to make this
2962     directory a package.
2963    
2964     * Extensions/profiling/profiling.py: Moved menu entries to
2965     the Extensions menu. Applied _() for strings.
2966     (profile_screen_renderer): Catch the detailed printout and present
2967     it in a dialog.
2968 bh 1904 (time_screen_renderer): Raise a dialog to present the result instead
2969 jan 1902 of printing it to stdout.
2970    
2971 bh 1897 2003-10-31 Bernhard Herzog <[email protected]>
2972    
2973 bh 1899 * test/test_classification.py (TestClassGroupProperties)
2974     (TestClassGroup, TestClassGroupDefault, TestClassGroupRange)
2975     (TestClassGroupSingleton, TestClassIterator, TestClassification):
2976     Split TestClassification into several classes, one for each class
2977     being tested. TestClassification itself now only tests
2978     Classification. This split makes changes to the tests a bit easier
2979    
2980     2003-10-31 Bernhard Herzog <[email protected]>
2981    
2982 bh 1897 * Extensions/profiling/profiling.py: New. Extension to measure
2983     Thuban performance
2984    
2985 frank 1895 2003-10-31 Frank Koormann <[email protected]>
2986    
2987     Added two items to legend popup menu: Remove Layer and Show Layer Table
2988    
2989     * Thuban/UI/legend.py (LegendPanel._OnRemoveLayer,
2990     LegendPanel._OnShowTable): New event handlers, call the corresponding
2991     mainwindow methods.
2992     (LegendTree._OnRightClick): Added items to popup menu.
2993    
2994 bh 1894 2003-10-30 Bernhard Herzog <[email protected]>
2995    
2996     * Thuban/UI/dialogs.py (ThubanFrame.__init__): Handle
2997     EVT_WINDOW_DESTROY
2998     (ThubanFrame.OnDestroy): New. Handler for EVT_WINDOW_DESTROY. Does
2999     nothing but is convenient for the derived classes.
3000    
3001     * Thuban/UI/tableview.py
3002     (TableFrame.OnDestroy, LayerTableFrame.OnDestroy): New.
3003     Unsubscribe the messages here not in OnClose because that might
3004     get called multiple times. Fixes RT #2196
3005     (TableFrame.OnClose, LayerTableFrame.OnClose): Removed. Not needed
3006     anymore.
3007    
3008     * README: Update the minimum requirement for wxPython. Since we
3009     now use the EVT_WINDOW_DESTROY event, we need at least 2.4.0.4,
3010     the version in which that was introduced for all platforms
3011    
3012 frank 1890 2003-10-30 Frank Koormann <[email protected]>
3013    
3014     * Thuban/UI/join.py (JoinDialog.OnJoin): Wrapped the major parts of
3015     the join process in a ThubanBeginBusyCursor, ThubanEndBusyCursor
3016     frame.
3017    
3018 jan 1889 2003-10-30 Jan-Oliver Wagner <[email protected]>
3019    
3020     Improved APR import extension, added further EPSG definitions
3021     and some cleanup regarding string class.
3022    
3023     * test/test_proj.py (TestProjection.test_get_projection_units_geo):
3024     Added test for alias 'longlat'.
3025    
3026     * Resources/Projections/epsg-deprecated.proj: New. Contains
3027     deprecated EPSG definitions.
3028    
3029     * Extensions/importAPR/odb.py (ODBBaseObject.TreeInfo): Added
3030     the variable names for objects.
3031    
3032     * Extensions/importAPR/apr.py (APR_BLnSym, APR_BMkSym, APR_BShSym): New.
3033     Copied from importAPR and provided with documentation.
3034    
3035     * Extensions/importAPR/importAPR.py (APR_BLnSym, APR_BMkSym, APR_BShSym):
3036     Moved to apr.py.
3037     (APR_View): Added object ref 'ITheme'.
3038    
3039     * Thuban/Lib/fileutil.py, Thuban/UI/proj4dialog.py: Replaced string
3040     split function by corresponding use of the string class method.
3041    
3042     * Thuban/Model/xmlwriter.py: Replaced string replace function by
3043     corresponding string method.
3044    
3045 bh 1880 2003-10-29 Bernhard Herzog <[email protected]>
3046    
3047     * Thuban/UI/baserenderer.py
3048     (BaseRenderer.draw_shape_layer_incrementally): Speed up the
3049     special case of a classification that only has the default group
3050    
3051 bh 1868 2003-10-27 Bernhard Herzog <[email protected]>
3052    
3053 bh 1878 * po/fr.po, po/es.po: Updated translations from Daniel Calvelo
3054    
3055 bh 1876 * po/de.po: Update.
3056    
3057     * Thuban/UI/application.py
3058     (ThubanApplication.ShowExceptionDialog): Handle translation of the
3059     dialog message properly
3060    
3061     2003-10-27 Bernhard Herzog <[email protected]>
3062    
3063 bh 1873 Rework how localization works so that we use wx's translation
3064     functions when running Thuban as a normal application but not when
3065     we don't need any UI, such as in the test suite. See the comment
3066     in Thuban/__init__.py for details
3067    
3068     * Thuban/__init__.py (_): Add one level of indirection to make the
3069     translation handling more flexible and to make it possible to use
3070     either wx's translation services or not.
3071     (gettext_identity, translation_function_installed)
3072     (install_translation_function): New function to help with this
3073    
3074     * Thuban/UI/__init__.py: Install the wx specific translation
3075     function if it's OK to do that
3076    
3077     * test/support.py (initthuban): Install a dummy translation
3078     function so that importing Thuban.UI doesn't install a wx specific
3079     one for which would need to import wxPython
3080    
3081     2003-10-27 Bernhard Herzog <[email protected]>
3082    
3083 bh 1870 * HOWTO-Release: Source archives should be created first and the
3084     binary packages should be created from the source archives.
3085     There's an official debian package now so there's no need to test
3086     the rpm on debian anymore
3087    
3088     2003-10-27 Bernhard Herzog <[email protected]>
3089    
3090 bh 1868 Several rendering changes:
3091    
3092     - Render the selection into a separate bitmap so that only that
3093     bitmap needs to be redrawn when the selection changes
3094    
3095     - Render incrementally showing previews and allowing interaction
3096     before rendering is complete
3097    
3098     - Update the renderer interface a bit. Most parameters of
3099     RenderMap are now parameters of the constructor
3100    
3101     * Thuban/UI/baserenderer.py (BaseRenderer.__init__): Add the map
3102     and the update region as parameters. Update the doc-string
3103     (BaseRenderer.render_map_incrementally): New. Generator function
3104     to renders the map incrementally
3105     (BaseRenderer.render_map): Remove the map argument (it's now in
3106     the constructor) and simply iterate over the
3107     render_map_incrementally generator to draw the map.
3108     (BaseRenderer.draw_shape_layer_incrementally)
3109     (BaseRenderer.draw_shape_layer): Renamed to
3110     draw_shape_layer_incrementally and changed into a generator that
3111     yields True every 500 shapes. Used by render_map_incrementally to
3112     render shape layers incrementally
3113    
3114     * Thuban/UI/renderer.py (ScreenRenderer.RenderMap): Removed the
3115     map and region parameters which are now in the constructor
3116     (ScreenRenderer.RenderMapIncrementally): New. Public frontend for
3117     the inherited render_map_incrementally.
3118     (BaseRenderer.draw_shape_layer): Removed.
3119     (ScreenRenderer.draw_selection_incrementally): New. The selection
3120     drawing part of the removed draw_shape_layer as a generator
3121     (ScreenRenderer.layer_shapes): Update because of the region
3122     parameter change
3123     (ExportRenderer.__init__): New. Extend the inherited constructor
3124     with the destination region for the drawing
3125     (ExportRenderer.RenderMap): Removed the map and region parameters
3126     which are now in the constructor
3127    
3128     * Thuban/UI/view.py (MapCanvas.PreviewBitmap): New. Return a
3129     bitmap suitable for a preview in a tool
3130     (CanvasPanTool.MouseMove): Use the PreviewBitmap method to get the
3131     bitmap
3132     (MapPrintout.draw_on_dc): Adapt to new renderer interface
3133     (MapCanvas.OnPaint): Handle drawing the selection bitmap if it
3134     exists
3135     (MapCanvas.OnIdle): Update the logic to deal with incremental
3136     rendering and the selection bitmap
3137     (MapCanvas._do_redraw): Handle the instantiation of the render
3138     iterator and the redraws during rendering
3139     (MapCanvas._render_iterator): New. Generator to incrementally
3140     redraw both bitmaps
3141     (MapCanvas.Export): Adapt to new renderer interface.
3142     (MapCanvas.full_redraw): Reset the selection bitmap and the
3143     renderer iterator too
3144     (MapCanvas.redraw_selection): New. Force a redraw of the selection
3145     bitmap
3146     (MapCanvas.shape_selected): Only redraw the selection bitmap
3147    
3148     * test/test_baserenderer.py
3149     (TestBaseRenderer.test_polygon_no_projection)
3150     (TestBaseRenderer.test_raster_no_projection)
3151     (TestBaseRenderer.test_point_map_projection)
3152     (TestBaseRenderer.test_point_layer_and_map_projection)
3153     (TestBaseRenderer.test_point_layer_projection)
3154     (TestBaseRenderer.test_point_with_classification): Adapt to new
3155     renderer interface
3156    
3157 bh 1865 2003-10-24 Bernhard Herzog <[email protected]>
3158    
3159     * libraries/thuban/wxproj.cpp (draw_polygon_shape)
3160     (point_in_polygon_shape, shape_centroid): Raise an exception if
3161     the shape can't be read. Previously invalid shape ids would lead
3162     to a segfault.
3163    
3164     * test/test_wxproj.py (TestShapeCentroid.test_invalid_shape_id):
3165     New. test whether an exception is raised for invalid shape ids
3166    
3167 jan 1857 2003-10-24 Jan-Oliver Wagner <[email protected]>
3168    
3169 jan 1862 * Thuban/Model/proj.py (Projection.GetProjectedUnits): Added 'longlat'
3170     as alias for 'latlong'.
3171    
3172     * Thuban/UI/projdialog.py (ProjFrame.__init__): Added 'longlat'
3173     as alias for 'latlong'.
3174    
3175     2003-10-24 Jan-Oliver Wagner <[email protected]>
3176    
3177 jan 1859 * Thuban/UI/projdialog.py (ProjFrame.proj_selection_changed): Set
3178     the projection even for the UnknownPanel.
3179     (UnknownProjPanel.__init__): Define the text and create the textctrl
3180     widget.
3181     (UnknownProjPanel._DoLayout): Replaced static text widget by the
3182     textctrl created in __init__.
3183     (UnknownProjPanel.SetProjection): Set the text for the text ctrl
3184     including the parameters of the projection.
3185    
3186     2003-10-24 Jan-Oliver Wagner <[email protected]>
3187    
3188 jan 1857 * Resources/Projections/epsg.proj: New. This is a list of
3189     EPSG codes with parameters for proj. The list has been
3190     generated using devtools/create_epsg.py based on the
3191     file nad/epsg of the proj 4.4.7 package. Four projection
3192     definitions have been deleted as they are not accepted by proj:
3193     "CH1903+ / LV95", "Bern 1898 (Bern) / LV03C", "CH1903 / LV03"
3194     and "HD72 / EOV".
3195    
3196 bh 1855 2003-10-22 Bernhard Herzog <[email protected]>
3197    
3198     Some more tweaks to the projection dialog which should fix RT
3199     #1886.
3200    
3201     * Thuban/UI/projlist.py (ProjectionList.Destroy): Unsubscribe from
3202     the ProjFile's messages and call the base class methods correctly
3203     (ProjectionList.SelectProjection): Set the wxLIST_STATE_FOCUSED
3204     flag on the newly selected item too. Otherwise some other item is
3205     focused and the first time the focus is moved with the keyboard
3206     the selection moves in unexpected ways.
3207    
3208     * Thuban/UI/projdialog.py (ProjFrame.__init__): Do not set the
3209     focus on the OK button, only on the projection list. That way the
3210     list really has the focus initially
3211     (ProjFrame.OnClose): Call the projection list's Destroy method to
3212     make it unsubscribe all messages
3213    
3214 bh 1840 2003-10-21 Bernhard Herzog <[email protected]>
3215    
3216 bh 1852 Rework the projection dialog to fix a few bugs, including RT 2166
3217     and most of 2168
3218    
3219     * Thuban/UI/projlist.py: New. The class ProjectionList is a
3220     special wxListCtrl to show a list of projections in a more MVC
3221     fashion
3222    
3223     * Thuban/UI/projdialog.py (ProjFrame): Substantial changes
3224     throughout the class. The main change is to use the ProjectionList
3225     class instead of a normal wxListBox. Also, add an explicit
3226     "Unknown" projection to the projection choice control.
3227     (ProjPanel.__init__): Add an "unknown" ellipsoid
3228     (TMPanel.__init__, LCCPanel.__init__): Tweak the order of
3229     instantiation of the panel's controls to make the tab-order more
3230     natural
3231    
3232     2003-10-21 Bernhard Herzog <[email protected]>
3233    
3234 bh 1849 * test/test_load.py (TestSingleLayer.file_contents)
3235     (TestSingleLayer.test): Add non-ascii characters to the titles of
3236     session, map and layer. This is effectively a port of the
3237     TestUnicodeStrings test in test_load_0_8.py which for some reason
3238     was only added there.
3239    
3240     * test/test_load_0_9.py (TestSingleLayer.file_contents)
3241     (TestSingleLayer.test): Same as in test_load.py: add non-ascii
3242     characters to the titles of session, map and layer,.
3243    
3244     2003-10-21 Bernhard Herzog <[email protected]>
3245    
3246 bh 1847 Add EPSG projection handling to .thuban files
3247    
3248     * test/test_save.py (SaveSessionTest.dtd)
3249     (SaveSessionTest.testEmptySession)
3250     (SaveSessionTest.testLayerProjection)
3251     (SaveSessionTest.testRasterLayer)
3252     (SaveSessionTest.testClassifiedLayer)
3253     (SaveSessionTest.test_dbf_table)
3254     (SaveSessionTest.test_joined_table)
3255     (SaveSessionTest.test_save_postgis): Update to 1.0-dev namespace
3256     (SaveSessionTest.testSingleLayer): Update to 1.0-dev namespace and
3257     use a and epsg projection to test saving them
3258    
3259     * test/test_load.py (LoadSessionTest.dtd): Update to 1.0-dev
3260     namespace
3261     (TestLayerVisibility.file_contents, TestLabels.file_contents)
3262     (TestLayerProjection.file_contents)
3263     (TestRasterLayer.file_contents, TestJoinedTable.file_contents)
3264     (TestPostGISLayer.file_contents)
3265     (TestPostGISLayerPassword.file_contents)
3266     (TestLoadError.file_contents, TestLoadError.test): Update to use
3267     1.0-dev namespace
3268     (TestSingleLayer.file_contents, TestSingleLayer.test): Update to
3269     use 1.0-dev namespace and use an EPSG projection to test whether
3270     loading it works
3271    
3272     * test/test_load_0_9.py: New. Effectively a copy of test_load.py
3273     as of Thuban 0.9. These are now tests to determine whether Thuban
3274     can still read files generated by Thuban 0.9
3275    
3276     * Thuban/Model/save.py (SessionSaver.write)
3277     (SessionSaver.write_session): Use the 1.0 dtd and 1.0-dev
3278     namespace
3279     (SessionSaver.write_projection): Write the projection's epsg
3280     attribute
3281    
3282     * Thuban/Model/load.py (SessionLoader.__init__): Also accept the
3283     thuban-1.0-dev.dtd namespace
3284     (SessionLoader.check_attrs): Allow a callable object as conversion
3285     too
3286     (SessionLoader.start_projection, SessionLoader.end_projection)
3287     (SessionLoader.start_parameter): Handle the epsg attribute and
3288     rename a few instance variables to lower case
3289    
3290     * Resources/XML/thuban-1.0.dtd: New. Only difference to
3291     thuban-0.9.dtd is the epsg attribute for projections.
3292    
3293     2003-10-21 Bernhard Herzog <[email protected]>
3294    
3295 bh 1840 * test/runtests.py (main): Let the user specify which tests to run
3296     on the command line
3297    
3298     * test/support.py (ThubanTestResult.getDescription): Override to
3299     give a better short description. The description can be used as a
3300     parameter to run_tests to run that particular test in isolation.
3301    
3302 frank 1837 2003-10-21 Frank Koormann <[email protected]>
3303    
3304     Popup menu for legend. Scheduled for the 1.2 release this was too
3305     simple to implement: The popup menu is bound to the legend tree, while
3306     the events are hanlded by its anchestor, the legend panel. This
3307     allows reuse of all the event handlers already implemented for the
3308     legend toolbar buttons.
3309    
3310     * Thuban/UI/legend.py (LegendPanel.__init__): EVT_MENU macros
3311     to add handlers for the events issued by the popup menu.
3312     (LegendPanel._OnToggleVisibility): Handler for toggling layer
3313     visibility event
3314     (LegendPanel._OnProjection): Handler for layer projection event.
3315     (LegendTree.__init__): Added EVT_TREE_ITEM_RIGHT_CLICK
3316     (LegendTree._OnRightClick): Event handler for right click, select item
3317     and pop up menu.
3318     (LegendTree.ToggleVisibility): Toggle layer visibility
3319     (LegendTree.LayerProjection): Raise layer projection dialog for
3320     current layer.
3321    
3322 bh 1836 2003-10-21 Bernhard Herzog <[email protected]>
3323    
3324     * Resources/Projections/defaults.proj: Use correct DOCTYPE
3325     declaration. The top-level element is projectionlist not projfile
3326    
3327 bh 1834 2003-10-20 Bernhard Herzog <[email protected]>
3328    
3329     * Thuban/UI/projdialog.py (ProjFrame.write_proj_file): New. helper
3330     method to write a projfile and display a busy cursor and error
3331     dialogs.
3332     (ProjFrame._OnSave, ProjFrame._OnAddToList, ProjFrame._OnImport)
3333     (ProjFrame._OnExport, ProjFrame._OnRemove): Use write_proj_file
3334     (ProjFrame.__FillAvailList): Translate "<None>" too and display a
3335     busy cursor while loading the user and system prj files.
3336    
3337 bh 1832 2003-10-16 Bernhard Herzog <[email protected]>
3338    
3339     * Thuban/Model/resource.py (projfile_cache): Introduce a cache for
3340     ProjFile objects
3341     (clear_proj_file_cache): New function to clear the cache. Mainly
3342     useful for use by the test suite
3343     (read_proj_file): Use the cache.
3344    
3345     * test/test_proj.py (TestProjFile): Clarify the doc-string
3346     (ProjFileReadTests): Update doc-string
3347     (ProjFileReadTests.test_get_system_proj_file): Check whether the
3348     system proj files is cached.
3349     (ProjFileLoadTestCase): New base class for the proj file tests
3350     derived from support.FileLoadTestCase to provide some common
3351     behavior.
3352     (TestLoadingProjFile)
3353     (TestLoadingProjFileWithEmptyProjectionlist.file_contents)
3354     (TestProjFileWithInvalidParameters.file_contents): Derive from
3355     ProjFileLoadTestCase
3356     (TestLoadingProjFile.test_caching): New. Test whether the cache
3357     works
3358    
3359 silke 1829 2003-10-16 Silke Reimer <[email protected]>
3360    
3361     * debian/*: New directory with configuration files for building a thuban
3362     deb-package.
3363    
3364 bh 1822 2003-10-14 Bernhard Herzog <[email protected]>
3365    
3366 bh 1828 * test/test_proj.py: Execute support.run_tests when run as
3367     __main__ so that missing unsubscribes are detected
3368     (TestProjFile.tearDown): Destroy the proj_file properly
3369    
3370     2003-10-14 Bernhard Herzog <[email protected]>
3371    
3372 bh 1826 * Thuban/Model/messages.py (PROJECTION_ADDED)
3373     (PROJECTION_REPLACED, PROJECTION_REMOVED): New message types for
3374     the ProjFile objects
3375    
3376     * Thuban/Model/proj.py (ProjFile): Derive from Publisher so we can
3377     easily send messages when the projections change
3378     (ProjFile.Add, ProjFile.Remove, ProjFile.Replace): Issue messages
3379     when the change was successful
3380    
3381     * test/test_proj.py (TestProjFile.setUp): Subscribe to some of the
3382     proj file messages
3383     (TestProjFile.test_add_remove)
3384     (TestProjFile.test_remove_non_existing)
3385     (TestProjFile.test_replace)
3386     (TestProjFile.test_replace_non_existing): Test whether the right
3387     messages are sent
3388    
3389     2003-10-14 Bernhard Herzog <[email protected]>
3390    
3391 bh 1822 * test/test_proj.py (TestProjFile.test): Refactor into several
3392     tests
3393     (TestProjFile.test_add_remove)
3394     (TestProjFile.test_remove_non_existing)
3395     (TestProjFile.test_replace)
3396     (TestProjFile.test_replace_non_existing): Some of the new
3397     individual test cases
3398     (TestProjFileSimple): New class for the rest of the test cases
3399     that came out of the refactoring
3400     (ProjFileTest): Derive from xmlsupport.ValidationTest so that the
3401     derived classes don't have to
3402    
3403 bh 1812 2003-10-13 Bernhard Herzog <[email protected]>
3404    
3405 bh 1820 Add an optional EPSG code to the projection objects and extend the
3406     .proj file format accordingly.
3407    
3408     * Resources/XML/projfile.dtd (element projection): Add epsg
3409     attribute
3410    
3411     * Thuban/Model/proj.py (Projection.__init__): New parameter and
3412     instance variable epsg. Update doc-string
3413     (Projection.EPSGCode, Projection.Label): New methods to provide
3414     access to EPSG code and a label for use in dialogs
3415    
3416     * Thuban/Model/resource.py (ProjFileReader.start_projection)
3417     (ProjFileReader.end_projection, ProjFileSaver.write_projfile):
3418     Handle the epsg code attribute when reading or writing proj files
3419    
3420     * Thuban/UI/projdialog.py (ProjFrame._OnSave)
3421     (ProjFrame._OnAddToList, ProjFrame.__DoOnProjAvail)
3422     (ProjFrame.__FillAvailList): Use the projection's Label method to
3423     get the string for the list box
3424    
3425     * test/test_proj.py (TestProjection.test_label)
3426     (TestProjection.test_label_epsg)
3427     (TestProjection.test_epsgcode_for_non_epsg_projection)
3428     (TestProjection.test_epsgcode_for_real_epsg_projection): New tests
3429     for the label and EPSGCode methods
3430     (WriteProjFileTests.doTestWrite, WriteProjFileTests.test_write)
3431     (WriteProjFileTests.test_write_empty_file): Create the ProjFile
3432     objects in the test cases and put the expected contents into the
3433     test case methods too. Update doTestWrite accordingly
3434     (TestLoadingProjFile)
3435     (TestLoadingProjFileWithEmptyProjectionlist): New classes with the
3436     read tests from TestProjFile.
3437     (TestProjFile.doTestRead, TestProjFile.testRead): Removed. These
3438     tests are now in the new classes.
3439     (sample_projfile, sample_projfile_data)
3440     (sample_projfile2, sample_projfile_data2): Removed. Not used
3441     anymore.
3442     (TestProjFile.test_read_unreadable_file): No need to reset the
3443     permissions at the end anymore since we use a unique filename
3444    
3445     2003-10-13 Bernhard Herzog <[email protected]>
3446    
3447 bh 1814 * test/test_proj.py: Some more refactoring of the test cases
3448     (ProjFileTest): New base class for the proj file tests.
3449     (TestProjFile): Derive from ProjFileTest
3450     (TestProjFile.test_read_unreadable_file)
3451     (TestProjFile.test_read_empty_file, TestProjFile.doTestRead): Use
3452     the new filename method to get a unique filename
3453     (TestProjFile.doTestWrite, TestProjFile.testWrite): Removed.
3454     (WriteProjFileTests): New class for proj file write tests.
3455     Contains the write test that were in TestProjFile originally.
3456    
3457     2003-10-13 Bernhard Herzog <[email protected]>
3458    
3459 bh 1812 * test/test_proj.py (TestProjFile.testRead)
3460     (TestProjFile.test_read_non_existing_file)
3461     (TestProjFile.test_read_unreadable_file)
3462     (TestProjFile.test_read_empty_file): Split into several methods.
3463    
3464 bh 1805 2003-10-10 Bernhard Herzog <[email protected]>
3465    
3466 bh 1810 * Thuban/UI/sizers.py: New file with custom sizers.
3467    
3468     * Thuban/UI/projdialog.py (ProjFrame.build_dialog): Instantiate
3469     all projection type specific panels and put them into a
3470     NotebookLikeSizer. This way the dialog doesn't change its size
3471     when a different projection is selected
3472     (ProjFrame.__init__): Rename projection_panels
3473     projection_panel_defs and reuse projection_panels for a list of
3474     the instantiated panels.
3475     (ProjFrame._show_proj_panel, ProjFrame.__DoOnProjAvail)
3476     (ProjFrame.__DoOnProjChoice): Changes due to the new handling of
3477     the panels
3478     (UnknownProjPanel._DoLayout): Place the newlines in the message
3479     differently to make the panel narrower.
3480     (TMPanel._DoLayout): Layout the parameters in one column.
3481    
3482     2003-10-10 Bernhard Herzog <[email protected]>
3483    
3484 bh 1807 * Thuban/UI/projdialog.py (ProjFrame.build_dialog): New method
3485     that contains all the setup for the dialog's widgets, layout and
3486     event handling.
3487     (__): Call build_dialog to build the dialog.
3488     (ProjFrame.__set_properties, ProjFrame.__do_layout): Removed.
3489     Their functionality is now in build_dialog
3490     (ProjFrame.__VerifyButtons, ProjFrame.__VerifyButtons)
3491     (ProjFrame.__DoOnProjAvail, ProjFrame.__DoOnProjAvail)
3492     (ProjFrame.__DoOnProjChoice): Small updates due to slightly
3493     different widget names and hierarchy introduced with build_dialog.
3494    
3495     2003-10-10 Bernhard Herzog <[email protected]>
3496    
3497 bh 1805 * README: Fix typo.
3498    
3499 bh 1803 2003-10-09 Bernhard Herzog <[email protected]>
3500    
3501     * Thuban/Model/proj.py (ProjFile.Add): Do not check whether the
3502     projection is already in the list. This is *a lot* faster when
3503     loading files with hundreds of projections since it saves a linear
3504     search. OTOH this will allow adding the same projection to the
3505     user.proj file multiple times in the projection dialog but we'll
3506     deal with that later
3507    
3508 jan 1801 2003-10-09 Jan-Oliver Wagner <[email protected]>
3509    
3510     * devtools: New. Directory for developer tools that are not intended
3511     for the regular user.
3512    
3513     * devtools/create_epsg.py: New. Convert the epsg file of proj into
3514     a python .proj file.
3515    
3516 bh 1799 2003-10-09 Bernhard Herzog <[email protected]>
3517    
3518     * test/test_proj.py
3519     (TestProjection.test_get_parameter_without_equals_sign): New. Test
3520     whether GetParameter handles parameters without "=" sign correctly
3521    
3522     * Thuban/Model/proj.py (Projection.GetParameter): Handle
3523     parameters that do not contain a "=". Update the doc-string
3524    
3525 bh 1794 2003-10-08 Bernhard Herzog <[email protected]>
3526    
3527 bh 1796 * Thuban/UI/projdialog.py (ProjFrame.__set_properties): Remove the
3528     length limit on the projname text control
3529    
3530     2003-10-08 Bernhard Herzog <[email protected]>
3531    
3532 bh 1794 * test/test_proj.py (TestProjection.test_get_projection_units_geo)
3533     (TestProjection.test_get_projection_units_normal): New. Tests for
3534     the Projection.GetProjectedUnits method
3535    
3536 jan 1792 2003-10-08 Jan-Oliver Wagner <[email protected]>
3537    
3538     * Thuban/Model/resource.py (get_user_proj_file): small bug-fix:
3539     Added missing 'val' parameter.
3540    
3541 bh 1788 2003-10-08 Bernhard Herzog <[email protected]>
3542    
3543 bh 1790 * Thuban/UI/projdialog.py (ProjFrame.__DoOnProjAvail): When the
3544     projection type of the currently selected projection is not known,
3545     i.e. there's no panel for it, use the UnknownProjPanel
3546     (ProjFrame.__DoOnProjChoice, ProjFrame._show_proj_panel): Split
3547     the actual replacing of the proj panel into the new method
3548     _show_proj_panel.
3549     (UnknownProjPanel): Add doc-string.
3550     (UnknownProjPanel._DoLayout): Insert a newline into the text so
3551     that the panel is not so wide.
3552    
3553     2003-10-08 Bernhard Herzog <[email protected]>
3554    
3555 bh 1788 * Thuban/Model/resource.py (read_proj_file): Return the warnings
3556     too. Update the doc-string
3557     (get_proj_files): Removed. It wasn't used anywhere
3558     (get_system_proj_files, get_system_proj_file): Rename to
3559     get_system_proj_file and return the ProjFile object and not a list
3560     of ProjFile objects. Update the callers.
3561     (get_user_proj_files, get_user_proj_file): Rename to
3562     get_user_proj_file return the ProjFile object and not a list of
3563     ProjFile objects. Update the callers.
3564     (ProjFileReader.__init__): New instance variable for the warnings.
3565     Rename the __pf ivar to projfile. Update the methods referring to
3566     __pf
3567     (ProjFileReader.end_projection): Catch any errors raised when
3568     instantiating the projection and record that as an error. The
3569     projection will not be in the final ProjFile object.
3570     (ProjFileReader.GetWarnings): New method to return the warnings.
3571    
3572     * Thuban/UI/projdialog.py (ProjFrame.show_warnings): New method to
3573     show the warnings from the projfile reader
3574     (ProjFrame._OnImport): Deal with any warnings returned by
3575     read_proj_file
3576     (ProjFrame.__FillAvailList): Deal with any warnings returned by
3577     get_system_proj_file or get_user_proj_file.
3578    
3579     * test/test_proj.py (TestProjFile.doTestRead): Check the warnings.
3580     (TestProjFileWithInvalidParameters.file_contents): New test cases
3581     to test whether read_proj_file handles invalid projection
3582     parameters correctly
3583     (TestProjFile.test_get_system_proj_file): New. Simple test for
3584     resource.get_system_proj_file
3585    
3586 bh 1785 2003-10-07 Bernhard Herzog <[email protected]>
3587    
3588     * test/test_derivedshapestore.py
3589     (TestDerivedShapeStoreExceptions.tearDown): Clear the session
3590     properly so that the temporary directories get deleted correctly
3591    
3592 bh 1773 2003-10-06 Bernhard Herzog <[email protected]>
3593    
3594 bh 1783 Handle the title changes in a proper MVC way.
3595    
3596     * Thuban/UI/mainwindow.py (MainWindow.__init__): Subscribe to the
3597     canvas' TITLE_CHANGED messages
3598     (MainWindow.update_title): New. Update the main window's title
3599     (MainWindow.__SetTitle): Removed. Use update_title instead.
3600     (MainWindow.SetMap): Use update_title instead of __SetTitle
3601     (MainWindow.RenameMap): Do change the window title explicitly
3602     here. That's handled in a proper MVC way now.
3603     (MainWindow.title_changed): New. Subscriber for the TITLE_CHANGED
3604     messages
3605    
3606     * Thuban/Lib/connector.py (Conduit): New class to help classes
3607     that forward messages
3608    
3609     * Thuban/UI/viewport.py: Forward the map's TITLE_CHANGED messages
3610     (ViewPort): Derive from Conduit instead of Publisher
3611     (ViewPort.Subscribe, ViewPort.Unsubscribe): Use the new base class
3612     when calling the inherited versions
3613     (ViewPort._subscribe_map, ViewPort._unsubscribe_map): New helper
3614     methods to subscribe and unsubscribe map messages
3615     (ViewPort.SetMap, ViewPort.Destroy): Use the new helper methods to
3616     handle the map subscriptions
3617     (ViewPort.Map, ViewPort.map_projection_changed)
3618     (ViewPort.layer_projection_changed): Add or update doc-strings
3619    
3620     * test/test_connector.py (TestPublisher.test_issue_simple): Fix
3621     typo
3622     (MyConduit): Helper class for the Conduit test.
3623     (TestConduit): Test cases for Conduit
3624    
3625     * test/test_connector.py: Use support.run_tests as main.
3626    
3627     * test/test_viewport.py (ViewPortTest.setUp): Also subscribe to
3628     the TITLE_CHANGED messages
3629     (ViewPortTest.test_forwarding_title_changed): New test to check
3630     whether the viewport forwards the map's TITLE_CHANGED messages
3631     (TestViewportWithPostGIS.tearDown): Call the map's Destroy method
3632     after the port's because the latter may require a still functional
3633     map.
3634    
3635     2003-10-06 Bernhard Herzog <[email protected]>
3636    
3637 bh 1777 * Thuban/UI/application.py (ThubanApplication.maps_changed): Add
3638     doc-string
3639    
3640     2003-10-06 Bernhard Herzog <[email protected]>
3641    
3642 bh 1775 * test/test_viewport.py (ViewPortTest.setUp)
3643     (SimpleViewPortTest.test_init_with_size): Move the test for the
3644     initial size as a constructor parameter from ViewPortTest.setUp
3645     method to a new separate test in SimpleViewPortTest.
3646    
3647     2003-10-06 Bernhard Herzog <[email protected]>
3648    
3649 bh 1773 * test/test_viewport.py (MockView): New class derived from
3650     ViewPort with a mock implementation of GetTextExtent to be used in
3651     the test cases
3652     (ViewPortTest.setUp): Use MockView instead of ViewPort
3653    
3654     * Thuban/UI/viewport.py (ViewPort.GetTextExtent): Turn this method
3655     into what would be a "pure virtual function" in C++: always raise
3656     NotImplementedError. Mock implementations for test cases don't
3657     belong into the real code
3658    
3659 bh 1770 2003-10-02 Bernhard Herzog <[email protected]>
3660    
3661     * test/test_layer.py (TestLayer.test_empty_layer): Explicitly
3662     close the dbf file we create so that it's contents have been
3663     written properly.
3664    
3665     * libraries/shapelib/shptree.c, libraries/shapelib/shpopen.c,
3666     libraries/shapelib/shapefil.h, libraries/shapelib/dbfopen.c:
3667     Update to shapelib 1.2.10
3668    
3669 jan 1767 2003-10-01 Jan-Oliver Wagner <[email protected]>
3670    
3671     * Thuban/UI/tree.py, Thuban/UI/main.py: Remove the #! line as
3672     it annoys lintian which warns about these files not being
3673     executable. The #! isn't necessary here since if you absolutely
3674     must execute them you can always say "python <filename>".
3675    
3676 bh 1757 2003-09-26 Bernhard Herzog <[email protected]>
3677    
3678 bh 1760 * Thuban/Model/classgen.py (GenQuantiles0): Removed since it's
3679     only used in GREAT-ER but not used in Thuban itself. When GREAT-ER
3680     is ported to a newer the import will fail, so it should be noticed
3681     immediately that this function is gone.
3682     Fixes RT#1919
3683    
3684     2003-09-26 Bernhard Herzog <[email protected]>
3685    
3686 bh 1757 Add a DTD for the projection files and make thuban write valid
3687     projection files
3688    
3689     * Resources/XML/projfile.dtd: New. DTD for thuban's projection
3690     files
3691    
3692     * Thuban/Model/resource.py (ProjFileSaver.write): Use
3693     'projectionlist' as the name in the document type declaration so
3694     that it matches the element type of the root element.
3695    
3696     * test/test_proj.py (sample_projfile, sample_projfile2): Use
3697     'projectionlist' as the name in the document type declaration just
3698     as it is done now in the files thuban would write
3699     (sample_projfile, sample_projfile_data): Fix spelling of
3700     "Mercator"
3701     (TestProjFile.doTestWrite): Validate the written and the expected
3702     XML data
3703     (TestProjFile): Derive from ValidationTest so that we can run xml
3704     validation tests
3705    
3706 bh 1751 2003-09-24 Bernhard Herzog <[email protected]>
3707    
3708     * Thuban/UI/renderer.py (ExportRenderer.render_legend): Do not
3709     modify the list returned by map.Layers() in place since it is the
3710     actual list of layers used by the map.
3711    
3712 jan 1745 2003-09-23 Jan-Oliver Wagner <[email protected]>
3713    
3714     * Doc/manual/thuban-manual.xml: Added subsection to chapter
3715     Extensions to describe the extensions coming with the Thuban
3716     standard package (gns2shp and importAPR).
3717    
3718 bh 1743 2003-09-23 Bernhard Herzog <[email protected]>
3719    
3720     * libraries/thuban/wxproj.cpp (project_point): if there's an
3721     inverse but no forward projection, convert to degrees after
3722     applying the inverse projection. Fixes RT#2096
3723    
3724     * test/test_wxproj.py: New. Test cases for wxproj.so. One test
3725     implicitly tests for the fix to RT#2096
3726    
3727     * test/support.py (FloatComparisonMixin.assertFloatSeqEqual):
3728     Check that the sequences have the same lengths
3729    
3730     * Resources/Projections/defaults.proj (Geographic projection): Use
3731     a much more precise value for the to_meter attribute.
3732    
3733 bh 1737 2003-09-22 Bernhard Herzog <[email protected]>
3734    
3735     * test/support.py (initthuban): Make sure to unset the LANG env.
3736     var. so that tests that compare translated strings work. Solves RT
3737     #2094
3738    
3739 jan 1730 2003-09-22 Jan-Oliver Wagner <[email protected]>
3740    
3741 jan 1735 Small improvement of APR import.
3742    
3743     * Extensions/importAPR/test/test_apr.py (aprTest.test_LClass):
3744     Added tests for text-ranges.
3745    
3746     * Extensions/importAPR/apr.py (APR_LClass.GetThubanRange): Now
3747     returns a string object if the range is based on text.
3748    
3749     * Extensions/importAPR/importAPR.py (import_apr_dialog): Unified
3750     range retrieval.
3751    
3752     2003-09-22 Jan-Oliver Wagner <[email protected]>
3753    
3754 jan 1730 Initial version of the importAPR extension which is in
3755     experimental state.
3756    
3757     * /Extensions/importAPR/, /Extensions/importAPR/samples/,
3758     /Extensions/importAPR/test/: New directories.
3759    
3760     * /Extensions/importAPR/samples/README: New: Howto load the samples.
3761    
3762     * /Extensions/importAPR/samples/iceland.apr: New: A sample APR
3763     file which refers to the Thuban Iceland demo data.
3764    
3765     * /Extensions/importAPR/test/README: New: Howto execute the tests.
3766    
3767     * /Extensions/importAPR/test/test_apr.py: New: Tests for APR classes.
3768    
3769     * /Extensions/importAPR/apr.py: New: Classes for ArcView Objects
3770     as in '.apr'-files.
3771    
3772     * /Extensions/importAPR/odb.py: New: Classes for generic ArcView
3773     ODB Objects as in '.apr', '.avl' and other files.
3774    
3775     * /Extensions/importAPR/__init__.py: New: Init to make this
3776     directory a package.
3777    
3778     * /Extensions/importAPR/importAPR.py: New: Import a ArcView
3779     project file (.apr) and convert it to Thuban.
3780    
3781     2003-09-22 Jan-Oliver Wagner <[email protected]>
3782    
3783     * Extensions/gns2shp.gns2shp.py: The main module of gns2shp.
3784    
3785 jan 1720 2003-09-19 Jan-Oliver Wagner <[email protected]>
3786    
3787     * Doc/manual/thuban-manual.xml: Extended section 'Installation'
3788     with description on RPM installation and RPM binary package
3789     creation.
3790    
3791 bh 1718 2003-09-18 Bernhard Herzog <[email protected]>
3792    
3793     * setup.py (data_files): Only add the mo files if the Locales
3794     directory actually exists, so that setup.py works with a fresh CVS
3795     checkout
3796    
3797 jan 1716 2003-09-12 Jan-Oliver Wagner <[email protected]>
3798    
3799     * Examples/simple_extensions/simple_tool.py: bugfix: Tool is now
3800     in viewport, not anymore in view
3801    
3802 jan 1714 2003-09-04 Jan-Oliver Wagner <[email protected]>
3803    
3804     Introducing first Extension (gns2shp).
3805    
3806     * Extensions, Extensions/gns2shp, Extensions/gns2shp/test: New.
3807    
3808     * Extensions/__init__.py: New. init to make this dir a package.
3809    
3810     * Extensions/gns2shp/__init__.py: New. init to make this dir a package.
3811    
3812     * Extensions/gns2shp/test/README: New. some info on this test directory.
3813    
3814     * Extensions/gns2shp/test/ls.txt: New. test data set (Liechtenstein).
3815    
3816     * Extensions/gns2shp/test/test_gns2shp.py: New. Test for correct creation
3817     of Shapefile from GNS text file format
3818    
3819 jan 1705 2003-09-03 Jan-Oliver Wagner <[email protected]>
3820    
3821 jan 1707 Fix/workaround for bug #2019:
3822     https://intevation.de/rt/webrt?serial_num=2019
3823    
3824     * Thuban/UI/identifyview.py (IdentifyView.ID_STOP): New.
3825     (IdentifyView.__init__): Added another button that allows to
3826     stop the identify mode.
3827     (IdentifyView.OnStop): New. Stops the identify mode.
3828    
3829     2003-09-03 Jan-Oliver Wagner <[email protected]>
3830    
3831 jan 1705 Introducing a new exception dialog that allows to exit the
3832     application immediately.
3833     This fixes bug #2060: https://intevation.de/rt/webrt?serial_num=2060
3834    
3835     * Thuban/UI/exceptiondialog.py: New. A special exception dialog.
3836    
3837     * Thuban/UI/application.py (ThubanApplication.ShowExceptionDialog):
3838     Made strings available to translations. Exchanged the simple
3839     ScrolledMessageDialog by the new ExceptionDialog.
3840    
3841 bh 1694 2003-09-01 Bernhard Herzog <[email protected]>
3842    
3843 bh 1701 * NEWS: New. Summary of changes and release notes.
3844    
3845     * MANIFEST.in: Add NEWS
3846    
3847     2003-09-01 Bernhard Herzog <[email protected]>
3848    
3849 bh 1699 * MANIFEST.in: Correct the include statement for the mo-files and
3850     include the documentation too.
3851    
3852     * setup.py (data_files): Add the .mo files
3853     (setup call): Up to version 0.9.0
3854    
3855     2003-09-01 Bernhard Herzog <[email protected]>
3856    
3857 bh 1696 * Thuban/UI/dbdialog.py (ChooseDBTableDialog.__init__): Change the
3858     parameter list to just parent and session
3859     (ChooseDBTableDialog.__set_properties): Removed. Setting the
3860     selection of empty list boxes is not allowed (and produces C++
3861     assertion errors) and the rest of the setup is better done in
3862     __init__ anyway.
3863     (ChooseDBTableDialog.OnCancel, ChooseDBTableDialog.OnOK)
3864     (ChooseDBTableDialog.OnLBDClick, DBDialog.OnOK): Use the Python
3865     builtins True/False for booleans to avoid warnings from wxPython
3866    
3867     * Thuban/UI/mainwindow.py (MainWindow.AddDBLayer): Adapt to new
3868     ChooseDBTableDialog constructor parameters.
3869    
3870     2003-09-01 Bernhard Herzog <[email protected]>
3871    
3872 bh 1694 * Thuban/Model/postgisdb.py
3873     (PostGISTable): Extend doc-string
3874     (PostGISTable._fetch_table_information): Set the column index
3875     correctly, pretending ignored columns don't exist.
3876    
3877     * test/test_postgis_db.py (TestPostGISIgnoredColumns): New tests
3878     for postgis tables with data types not yet supported by thuban.
3879    
3880 bh 1692 2003-08-29 Bernhard Herzog <[email protected]>
3881    
3882     * HOWTO-Release: Tweak item about running the tests.
3883    
3884 jan 1690 2003-08-29 Jan-Oliver Wagner <[email protected]>
3885    
3886     * /Doc/manual/thuban-manual.xml: updated to version 1.0pre2.
3887    
3888 bh 1688 2003-08-29 Bernhard Herzog <[email protected]>
3889    
3890     Add some missing parameters to projections. Proj complains about
3891     them on windows but for some reason not on Linux.
3892    
3893     * test/test_save.py (SaveSessionTest.testLayerProjection): Add
3894     missing required projection parameters
3895    
3896     * test/test_proj.py (TestProjFile.test): Add missing required
3897     projection parameters
3898    
3899     * test/test_load_0_8.py (TestLayerProjection.file_contents)
3900     (TestLayerProjection.test): Add missing required projection
3901     parameters and tests for them
3902    
3903     * test/test_load.py (TestLayerProjection.file_contents)
3904     (TestLayerProjection.test): Add missing required projection
3905     parameters and tests for them
3906    
3907     * test/test_layer.py (TestLayer.test_base_layer): Add missing
3908     required projection parameters
3909    
3910     2003-08-29 Bernhard Herzog <[email protected]>
3911    
3912     * libraries/pyprojection/Projection.i: Use pj_get_errno_ref to
3913     access the pj_errno because directly accessing pj_errno doesn't
3914     work on windows if the proj library is in a DLL
3915    
3916     * libraries/pyprojection/Projection_wrap.c: Update from Projection.i
3917    
3918 bh 1672 2003-08-28 Bernhard Herzog <[email protected]>
3919    
3920 bh 1685 * test/test_proj.py: Import things from Thuban after calling
3921     initthuban
3922    
3923     * test/test_load.py (LoadSessionTest.filenames): New class
3924     variable with the filename attributes to normalize
3925     (LoadSessionTest.check_format): Pass self.filenames to
3926     sax_eventlist to normalize the filename attributes
3927    
3928     * test/xmlsupport.py: Add cvs keywords
3929     (SaxEventLister.__init__): New parameter filenames which indicates
3930     attributes that contain filenames
3931     (SaxEventLister.startElementNS): Normalize the filename attributes
3932     with os.path.normpath
3933     (sax_eventlist): New parameter filenames to pass through to
3934     SaxEventLister
3935    
3936     * test/test_derivedshapestore.py: Make this file callable as a
3937     program to execute the tests
3938     (TestDerivedShapeStoreExceptions.test_table_with_wrong_size): Bind
3939     the session to self.session so that it gets destroyed properly
3940    
3941     * test/test_layer.py (TestLayer.tearDown): Call the session's
3942     Destroy method
3943    
3944     * test/test_map.py (TestMapBase.tearDown): Destroy self.session
3945     too if it exists
3946     (TestMapAddLayer.test_add_layer): Bind the session to self.session
3947     so that it gets destroyed properly
3948    
3949     * test/postgissupport.py (reason_for_not_running_tests): Add a
3950     test for the existence of popen2.Popen4.
3951    
3952     * test/test_save.py (SaveSessionTest.tearDown): New. Provide a
3953     reliable way to destroy the sessions created in the test cases
3954     (SaveSessionTest.test_dbf_table): Bind the session to self.session
3955     so that it gets destroyed properly
3956     (SaveSessionTest.testLayerProjection): Bind the session to
3957     self.session so that it gets destroyed properly
3958    
3959     * test/test_session.py (UnreferencedTablesTests.tearDown): Make
3960     sure that the session is destroyed properly
3961    
3962     * test/test_shapefilestore.py: Make this callable as a program to
3963     execute the tests
3964    
3965     * test/test_scalebar.py: Remove unnecessary import of _ from
3966     Thuban
3967    
3968     * test/support.py (print_garbage_information): Call initthuban
3969     here because it may be called indirectly from test cases that test
3970     test support modules which do not use anything from thuban itself
3971     (ThubanTestProgram.runTests): Remove unnecessary debug print
3972    
3973     2003-08-28 Bernhard Herzog <[email protected]>
3974    
3975 bh 1672 * Thuban/version.py (longversion): Update to 0.9
3976    
3977     * Thuban/UI/mainwindow.py: Remove some unused imports
3978    
3979     * README: Add section about required additional software. Add date
3980     and revision CVS keywords
3981    
3982     * HOWTO-Release: Add item about the translations. Add date and
3983     revision CVs keywords and change formatting to match README a bit
3984     better
3985    
3986     * po/de.po: Update for 0.9
3987    
3988     * test/README: Tweak the wording a little because many tests are
3989     not really unittest.
3990    
3991 bh 1663 2003-08-27 Bernhard Herzog <[email protected]>
3992    
3993 bh 1665 As preparation for the 0.9 release, switch thuban files to a
3994     non-dev namespace
3995    
3996     * Thuban/Model/save.py (SessionSaver.write_session): Write files
3997     with the http://thuban.intevation.org/dtds/thuban-0.9.dtd
3998     namespace
3999    
4000     * Thuban/Model/load.py (SessionLoader.__init__): Accept the
4001     http://thuban.intevation.org/dtds/thuban-0.9.dtd namespace too
4002    
4003     * test/test_save.py (SaveSessionTest.dtd)
4004     (SaveSessionTest.testEmptySession)
4005     (SaveSessionTest.testSingleLayer)
4006     (SaveSessionTest.testLayerProjection)
4007     (SaveSessionTest.testRasterLayer)
4008     (SaveSessionTest.testClassifiedLayer)
4009     (SaveSessionTest.test_dbf_table)
4010     (SaveSessionTest.test_joined_table)
4011     (SaveSessionTest.test_save_postgis): Update for new namespace
4012    
4013     * test/test_load.py (LoadSessionTest.dtd, TestSingleLayer)
4014     (TestLayerVisibility.file_contents, TestLabels.file_contents)
4015     (TestLayerProjection.file_contents)
4016     (TestRasterLayer.file_contents, TestJoinedTable.file_contents)
4017     (TestPostGISLayer.file_contents)
4018     (TestPostGISLayerPassword.file_contents)
4019     (TestLoadError.file_contents, TestLoadError.test): Update for new
4020     namespace
4021    
4022     2003-08-27 Bernhard Herzog <[email protected]>
4023    
4024 bh 1663 Make the table interface distinguish between row ids (an integer
4025     that uniquely identifies a row) and row ordinals (a simple row
4026     count from 0 to NumRows() - 1)
4027    
4028     * Thuban/Model/postgisdb.py (PostGISTable.RowIdToOrdinal)
4029     (PostGISTable.RowOrdinalToId): New methods to conver between row
4030     ids and row ordinals
4031     (PostGISTable.ReadRowAsDict, PostGISTable.ReadValue): New keyword
4032     parameter row_is_ordinal to indicate whether the row parameter is
4033     the row id or the ordinal
4034    
4035     * Thuban/Model/transientdb.py (TransientTableBase.RowIdToOrdinal)
4036     (TransientTableBase.RowOrdinalToId)
4037     (AutoTransientTable.RowIdToOrdinal)
4038     (AutoTransientTable.RowOrdinalToId): Same new methods as in
4039     PostGISTable.
4040     (TransientTableBase.ReadRowAsDict, TransientTableBase.ReadValue)
4041     (AutoTransientTable.ReadRowAsDict, AutoTransientTable.ReadValue):
4042     Same new parameter as in PostGISTable.
4043    
4044     * Thuban/Model/table.py (DBFTable.RowIdToOrdinal)
4045     (DBFTable.RowOrdinalToId, MemoryTable.RowIdToOrdinal)
4046     (MemoryTable.RowOrdinalToId): Same new methods as in PostGISTable.
4047     (DBFTable.ReadValue, DBFTable.ReadRowAsDict)
4048     (MemoryTable.ReadValue, MemoryTable.ReadRowAsDict): Same new
4049     parameter as in PostGISTable.
4050    
4051     * Thuban/UI/tableview.py (DataTable.RowIdToOrdinal)
4052     (DataTable.RowOrdinalToId): New methods to convert between row ids
4053     and row ordinals.
4054     (TableGrid.SelectRowById): New method to select a row based on its
4055     ID as opposed to its ordinal
4056     (DataTable.GetValue, TableGrid.OnRangeSelect)
4057     (TableGrid.OnSelectCell, LayerTableGrid.select_shapes)
4058     (QueryTableFrame.OnQuery, QueryTableFrame.get_selected)
4059     (LayerTableFrame.__init__): Convert between row ids and row
4060     ordinals as appropriate
4061    
4062     * test/postgissupport.py (PostGISDatabase.__init__): Add
4063     doc-string.
4064     (PostGISDatabase.initdb): The optional third item in a tuple in
4065     tables is now a (key, value) list with additional arguments to
4066     pass to upload_shapefile
4067     (upload_shapefile): New parameter gid_offset to allow gids that
4068     are not the same as the shapeids in the shapefile
4069     (PostgreSQLServer.get_default_static_data_db): Use the new
4070     gid_offset to make the gids in landmarks 1000 higher than the
4071     shapeids in the shapefile
4072    
4073     * test/test_viewport.py
4074     (TestViewportWithPostGIS.test_find_shape_at_point): Adapt to the
4075     new shapeids in the landmarks table
4076    
4077     * test/test_transientdb.py
4078     (TestTransientTable.run_iceland_political_tests)
4079     (TestTransientTable.test_transient_joined_table): Add tests for
4080     the new table methods and new keywords arguments.
4081    
4082     * test/test_postgis_db.py
4083     (TestPostGISTable.test_read_row_as_dict_row_count_mode)
4084     (TestPostGISTable.test_read_value_row_count_mode)
4085     (TestPostGISTable.test_row_id_to_ordinal)
4086     (TestPostGISTable.test_row_oridnal_to_id): New test for the new
4087     table methods and the new arguments
4088     (TestPostGISShapestorePoint.test_shapes_in_region)
4089     (TestPostGISShapestorePoint.test_shape_raw_data)
4090     (TestPostGISShapestorePoint.test_shape_points)
4091     (TestPostGISShapestorePoint.test_shape_shapeid)
4092     (TestPostGISShapestorePoint.test_all_shapes)
4093     (TestPostGISTable.test_simple_query)
4094     (TestPostGISTable.test_simple_query)
4095     (TestPostGISTable.test_simple_query)
4096     (TestPostGISTable.test_read_value)
4097     (TestPostGISTable.test_read_row_as_dict): Adapt to the new
4098     shapeids in the landmarks table
4099    
4100     * test/test_memory_table.py
4101     (TestMemoryTable.test_read_row_as_dict_row_count_mode)
4102     (TestMemoryTable.test_read_value_row_count_mode)
4103     (TestMemoryTable.test_row_id_to_ordinal)
4104     (TestMemoryTable.test_row_oridnal_to_id): New test for the new
4105     table methods and the new arguments
4106    
4107     * test/test_dbf_table.py
4108     (TestDBFTable.test_read_row_as_dict_row_count_mode)
4109     (TestDBFTable.test_read_value_row_count_mode)
4110     (TestDBFTable.test_row_id_to_ordinal)
4111     (TestDBFTable.test_row_oridnal_to_id): New test for the new table
4112     methods and the new arguments
4113    
4114 bh 1659 2003-08-26 Bernhard Herzog <[email protected]>
4115    
4116 bh 1661 * Thuban/Model/postgisdb.py (PostGISShapeStore.BoundingBox): Use a
4117     more postgis specific but much faster method to get the bounding
4118     box
4119    
4120     2003-08-26 Bernhard Herzog <[email protected]>
4121    
4122 bh 1659 * Thuban/Model/postgisdb.py (PostGISTable.Title)
4123     (PostGISShapeStore.AllShapes): Add these missing methods.
4124     (PostGISShapeStore.ShapesInRegion): No need to raise
4125     StopIteration. We can simply return
4126    
4127     * test/test_postgis_db.py (TestPostGISTable.test_title)
4128     (TestPostGISShapestorePoint.test_all_shapes): New tests for the
4129     new methods
4130    
4131 bh 1643 2003-08-25 Bernhard Herzog <[email protected]>
4132    
4133 bh 1657 * Thuban/Model/postgisdb.py (shapetype_map): Add MUTLIPOLYGON.
4134    
4135     * test/test_postgis_db.py (PolygonTests): New class containing
4136     those tests from TestPostGISShapestorePolygon that can also be
4137     used to test MUTLIPOLYGON tables
4138     (TestPostGISShapestorePolygon): Most tests are now in PolygonTests
4139     so derive from that
4140     (TestPostGISShapestoreMultiPolygon): New class with tests for
4141     MUTLIPOLYGON tables
4142    
4143     * test/postgissupport.py (PostGISDatabase.initdb): Allow the
4144     tables argument to have tuples with three items to override the
4145     WKT type used.
4146     (PostgreSQLServer.get_default_static_data_db): Use the above to
4147     create a polygon table with MUTLIPOLYGONs
4148     (point_to_wkt, coords_to_point, polygon_to_wkt, coords_to_polygon)
4149     (arc_to_wkt, coords_to_multilinestring): Rename from *_to_wkt to
4150     coords_to*
4151     (coords_to_multipolygon): New. Convert to MUTLIPOLYGON
4152     (wkt_converter): New. Map WKT types to converters
4153     (upload_shapefile): New parameter force_wkt_type to use a
4154     different WKT type than the default
4155    
4156     2003-08-25 Bernhard Herzog <[email protected]>
4157    
4158 bh 1655 * Thuban/UI/application.py
4159     (ThubanApplication.run_db_param_dialog): New. Suitable as a
4160     db_connection_callback. Main difference is that the dialog run
4161     from this method doesn't have a parent so it can be used even when
4162     there is no main window
4163     (ThubanApplication.OpenSession): Use self.run_db_param_dialog if
4164     no db_connection_callback was given. This way the dialog pops up
4165     even when the .thuban file was given as a command line parameter.
4166    
4167     2003-08-25 Bernhard Herzog <[email protected]>
4168    
4169 bh 1653 * Thuban/UI/view.py (MapCanvas.OnLeftUp): Release the the mouse
4170     before calling MouseLeftUp. MouseLeftUp may pop up modal dialogs
4171     which leads to an effectively frozen X session because the user
4172     can only interact with the dialog but the mouse is still grabbed
4173     by the canvas.
4174     Also, call the tool's Hide method before MouseLeftUp because
4175     MouseLeftUp may change the tool's coordinates.
4176    
4177     2003-08-25 Bernhard Herzog <[email protected]>
4178    
4179 bh 1651 * Thuban/UI/application.py (ThubanApplication.OpenSession): Catch
4180     LoadCancelled exceptions and handle them by returning immediately.
4181    
4182     2003-08-25 Bernhard Herzog <[email protected]>
4183    
4184 bh 1649 GUI part of loading sessions with postgis connections which may
4185     require user interaction to get passwords or updated parameters
4186    
4187     * Thuban/UI/dbdialog.py (DBDialog): Reimplement to make it look a
4188     bit nucer and be more generic.
4189     (DBFrame.OnAdd): Adapt to new DBDialog interface
4190    
4191     * Thuban/UI/application.py (ThubanApplication.OpenSession): New
4192     optional parameter db_connection_callback which is passed to
4193     load_session.
4194    
4195     * Thuban/UI/mainwindow.py (MainWindow.run_db_param_dialog): New.
4196     Suitable as a db_connection_callback
4197     (MainWindow.OpenSession): Use self.run_db_param_dialog as the
4198     db_connection_callback of the application's OpenSession method
4199    
4200    
4201     2003-08-25 Bernhard Herzog <[email protected]>
4202    
4203 bh 1647 Basic loading of sessions containing postgis connections:
4204    
4205     * Thuban/Model/load.py (LoadError): Add doc-string
4206     (LoadCancelled): New exception class to indicate a cancelled load
4207     (SessionLoader.__init__): Add the db_connection_callback parameter
4208     which will be used by the loader to get updated parameters and a
4209     password for a database connection
4210     (SessionLoader.__init__): Add the new XML elements to the
4211     dispatchers dictionary
4212     (SessionLoader.check_attrs): Two new conversions, ascii to convert
4213     to a byte-string object and idref as a generic id reference
4214     (SessionLoader.start_dbconnection)
4215     (SessionLoader.start_dbshapesource): New. Handlers for the new XML
4216     elements
4217     (load_session): Add the db_connection_callback to pass through the
4218     SessionLoader
4219    
4220     * test/test_load.py (TestPostGISLayer, TestPostGISLayerPassword):
4221     New classes to test loading of sessions with postgis database
4222     connections.
4223    
4224     2003-08-25 Bernhard Herzog <[email protected]>
4225    
4226 bh 1645 * Thuban/UI/mainwindow.py (__ThubanVersion__): Remove this and
4227     replace it and the comment with __BuildDate__ by the Source: and
4228     Id: cvs keywords as used in the other files.
4229    
4230     2003-08-25 Bernhard Herzog <[email protected]>
4231    
4232 bh 1643 * Thuban/Model/load.py (SessionLoader.check_attrs): Raise a
4233     LoadError when a required attribute is missing. The code used to
4234     be commented out for some reason, but probably should have been
4235     active.
4236    
4237     * test/test_load.py (TestLoadError.test): Test the message in the
4238     LoadError too to make sure it really is about the missing
4239     attribute
4240    
4241 bh 1632 2003-08-22 Bernhard Herzog <[email protected]>
4242 bh 1641
4243     * test/test_save.py (SaveSessionTest.test_dbf_table)
4244     (SaveSessionTest.test_joined_table): Add XML validation tests.
4245    
4246     2003-08-22 Bernhard Herzog <[email protected]>
4247    
4248 bh 1639 Implement saving a session with a postgis connection
4249 bh 1632
4250 bh 1639 * Resources/XML/thuban-0.9.dtd (dbconnection, dbshapesource) New
4251     elements for database connections and shapestores using db
4252     connections
4253     (session): Add the dbconnections to the content model
4254    
4255     * Thuban/Model/save.py (SessionSaver.write_db_connections): New.
4256     Write the db connections
4257     (SessionSaver.write_session): Call write_db_connections to write
4258     the connection before the data sources
4259     (SessionSaver.write_data_containers): Handle postgis shapestores
4260    
4261     * test/test_save.py (SaveSessionTest.thubanids)
4262     (SaveSessionTest.thubanidrefs): Update for new DTD
4263     (SaveSessionTest.test_save_postgis): New. Test saving a session
4264     with postgis connections
4265    
4266     * Thuban/Model/postgisdb.py (PostGISTable.DBConnection)
4267     (PostGISTable.TableName): New accessor methods for the connection
4268     and table name
4269    
4270     * test/test_postgis_db.py (TestPostGISTable.test_dbconn)
4271     (TestPostGISTable.test_dbname): New methods to test the new
4272     PostGISConnection methods
4273    
4274     2003-08-22 Bernhard Herzog <[email protected]>
4275    
4276 bh 1637 * Thuban/Model/postgisdb.py (ConnectionError): New exception class
4277     for exceptions occurring when establishing a Database connection
4278     (PostGISConnection.connect): Catch psycopg.OperationalError during
4279     connects and raise ConnectionError.
4280    
4281     * test/test_postgis_db.py (TestPostgisDBExceptions): New class for
4282     tests for database exceptions
4283    
4284     2003-08-22 Bernhard Herzog <[email protected]>
4285    
4286 bh 1635 Prepare the test suite for tests with required authentication
4287    
4288     * test/postgissupport.py (PostgreSQLServer.__init__): Add instance
4289     variables with two predefined users/passwords, one for the admin
4290     and one for a non-privileged user.
4291     (PostgreSQLServer.createdb): Pass the admin name to initdb and add
4292     the non-privileged user to the database and set the admin password
4293     (PostgreSQLServer.wait_for_postmaster): Use the admin user name.
4294     Better error reporting
4295     (PostgreSQLServer.connection_params)
4296     (PostgreSQLServer.connection_string): New methods to return
4297     information about how to connect to the server
4298     (PostgreSQLServer.execute_sql): New. Convenience method to execute
4299     SQL statements
4300     (PostgreSQLServer.require_authentication): Toggle whether the
4301     server requires authentication
4302     (PostgreSQLServer.create_user, PostgreSQLServer.alter_user): New.
4303     Add or alter users
4304     (PostGISDatabase.initdb): Pass the admin name one the
4305     subprocesses' command lines. Grant select rights on
4306     geometry_columns to everybody.
4307     (upload_shapefile): Use the admin name and password when
4308     connecting. Grant select rights on the new table to everybody.
4309    
4310     * test/test_viewport.py (TestViewportWithPostGIS.setUp): Use the
4311     server's new methods to get the connection parameters.
4312    
4313     * test/test_postgis_session.py (TestSessionWithPostGIS.setUp)
4314     (TestSessionWithPostGIS.test_remove_dbconn_exception): Use the
4315     server's new methods to get the connection parameters.
4316    
4317     * test/test_postgis_db.py
4318     (TestPostGISConnection.test_gis_tables_empty)
4319     (TestPostGISConnection.test_gis_tables_non_empty)
4320     (PostGISStaticTests.setUp): Use the server's new methods to get
4321     the connection parameters.
4322    
4323     2003-08-22 Bernhard Herzog <[email protected]>
4324    
4325 bh 1632 * Thuban/UI/about.py (About.__init__): Add the psycopg version.
4326    
4327     * Thuban/version.py: Add psycopg version
4328    
4329     * Thuban/Model/postgisdb.py (psycopg_version): New. Return the
4330     version of the psycopg module
4331    
4332     2003-08-22 Bernhard Herzog <[email protected]>
4333    
4334     * Thuban/UI/dbdialog.py (DBPwdDlg): Removed because it's not used.
4335     (DBFrame.OnEdit): Removed because it's not used and wouldn't work
4336     at the moment. The functionality should probably be implemented
4337     some time, though.
4338 bh 1633 (DBFrame.OnRemove): Display a message if the connection can't be
4339     removed because it's still in use.
4340 bh 1632
4341 jan 1629 2003-08-22 Jan-Oliver Wagner <[email protected]>
4342    
4343     * Thuban/UI/about.py (About.__init__): split up the huge about
4344     text into elements/lists for easier translation. This fixes bug
4345     https://intevation.de/rt/webrt?serial_num=2058
4346     Also, made some forgotten string available for the i18n.
4347    
4348 bh 1627 2003-08-21 Bernhard Herzog <[email protected]>
4349    
4350     Make postgis support really optional including insensitive menu
4351     items.
4352    
4353     * Thuban/Model/postgisdb.py (has_postgis_support): New. Return
4354     whether the postgis is supported.
4355    
4356     * Thuban/UI/dbdialog.py: Put the psycopg import into try..except
4357     to make postgis support optional
4358    
4359     * Thuban/UI/mainwindow.py (_has_postgis_support): New. Context
4360     version of Thuban.Model.postgisdb.has_postgis_support
4361     (database_management command): Make it only sensitive if postgis
4362     is supported.
4363    
4364 jan 1623 2003-08-21 Jan-Oliver Wagner <[email protected]>
4365    
4366 jan 1626 * Doc/manual/thuban-manual.xml: Added CVS revision for rev-history.
4367     (section Adding and Removing Layers): Added text and described
4368     multi-selection.
4369     (chapter Extensions): New.
4370    
4371     2003-08-21 Jan-Oliver Wagner <[email protected]>
4372    
4373 jan 1623 * Thuban/UI/mainwindow.py (MainWindow.AddLayer): Changed dialog
4374     settings to allow multiple files to load into the map.
4375     Also reduced selection to *.shp as a default.
4376    
4377 bh 1621 2003-08-20 Bernhard Herzog <[email protected]>
4378    
4379     Add dialogs and commands to open database connections and add
4380     database layers.
4381    
4382     * Thuban/UI/mainwindow.py (MainWindow.DatabaseManagement): New
4383     method to open the database connection management dialog
4384     (MainWindow.AddDBLayer): New method to add a layer from a database
4385     (_has_dbconnections): New helper function to use for sensitivity
4386     (database_management command, layer_add_db command): New commands
4387     that call the above new methods.
4388     (main_menu): Add the new commands to the menu.
4389    
4390     * Thuban/Model/postgisdb.py (PostGISConnection.__init__)
4391     (PostGISConnection.connect): Establish the actual connection in a
4392     separate method and call it in __init__. This makes it easier to
4393     override the behavior in test cases
4394     (PostGISConnection.BriefDescription): New method to return a brief
4395     description for use in dialogs.
4396    
4397     * test/test_postgis_db.py (NonConnection): DB connection that
4398     doesn't actually connect
4399     (TestBriefDescription): New class with tests for the new
4400     BriefDescription method
4401    
4402 jan 1619 2003-08-19 Jan-Oliver Wagner <[email protected]>
4403    
4404     Moved anything from extensions to libraries.
4405    
4406     * libraries: New.
4407    
4408     * libraries/ pyprojection, pyshapelib, shapelib, thuban: New.
4409    
4410     * libraries/pyprojection/ LICENSE, MANIFEST.in, Projection.i,
4411     Projection.py, Projection_wrap.c, setup.py, swighelp.txt: These files have
4412     been moved here from thuban/extensions/pyprojection/
4413     See there in the Attic for the older history.
4414    
4415     * libraries/pyshapelib/ COPYING, ChangeLog, NEWS, README, dbflib.i,
4416     dbflib.py, dbflib_wrap.c, pyshapelib_api.h, pytest.py, setup.py,
4417     shapelib.i, shapelib.py, shapelib_wrap.c, shptreemodule.c: These files
4418     have been moved here from thuban/extensions/pyshapelib/
4419     See there in the Attic for the older history.
4420    
4421     * libraries/shapelib/ dbfopen.c, shapefil.h, shpopen.c, shptree.c: These
4422     files have been moved here from thuban/extensions/shapelib/
4423     See there in the Attic for the older history.
4424    
4425     * libraries/thuban/ bmpdataset.cpp, cpl_mfile.cpp, cpl_mfile.h,
4426     gdalwarp.cpp, wxproj.cpp: These files have been moved here from
4427     thuban/extensions/thuban/
4428     See there in the Attic for the older history.
4429    
4430     * MANIFEST.in, setup.cfg, setup.py: renamed extensions to libraries.
4431    
4432     * extensions/thuban/ bmpdataset.cpp, cpl_mfile.cpp, cpl_mfile.h,
4433     gdalwarp.cpp, wxproj.cpp: Moved to libraries/thuban.
4434    
4435     * extensions/shapelib/ dbfopen.c, shapefil.h, shpopen.c, shptree.c:
4436     Moved to libraries/shapelib.
4437    
4438     * extensions/pyshapelib/ COPYING, NEWS, dbflib.py, pytest.py,
4439     shapelib.py, README, dbflib_wrap.c, setup.py, shapelib_wrap.c,
4440     ChangeLog, dbflib.i, pyshapelib_api.h, shapelib.i, shptreemodule.c:
4441     Moved to libraries/pyshapelib.
4442    
4443     * extensions/pyprojection/ MANIFEST.in, Projection.py, setup.py,
4444     LICENSE, Projection.i, Projection_wrap.c, swighelp.txt:
4445     Moved to libraries/pyprojection.
4446    
4447     * extensions/ pyprojection, pyshapelib, shapelib, thuban: Removed.
4448    
4449     * extensions: Removed.
4450    
4451 bh 1606 2003-08-19 Bernhard Herzog <[email protected]>
4452    
4453 bh 1609 * test/test_viewport.py (ViewPortTest): We don't use the
4454     facilities of FileTestMixin so don't derive from it.
4455     (TestViewportWithPostGIS): New class with tests for using a
4456     viewport on a map with postgis layers.
4457    
4458     2003-08-19 Bernhard Herzog <[email protected]>
4459    
4460     Add the db connection management to the session.
4461    
4462     * Thuban/Model/session.py (Session.__init__): New instance
4463     variable db_connections
4464     (Session.AddDBConnection, Session.DBConnections)
4465     (Session.HasDBConnections, Session.CanRemoveDBConnection)
4466     (Session.RemoveDBConnection): New methods to manage and query the
4467     db connections managed by the session
4468     (Session.OpenDBShapeStore): New method to open a shapestore from a
4469     db connection
4470    
4471     * Thuban/Model/messages.py (DBCONN_REMOVED, DBCONN_ADDED): New
4472     messages for the db connection handling in the session
4473    
4474     * test/test_postgis_session.py: New. test cases for the session's
4475     db connection handling with postgis connections
4476    
4477     2003-08-19 Bernhard Herzog <[email protected]>
4478    
4479 bh 1606 Add very basic postgis database support and the corresponding test
4480     cases. The test cases require a PostgreSQL + postgis installation
4481     but no existing database. The database will be created
4482     automatically by the test cases
4483    
4484     * test/README: Add note about skipped tests and the requirements
4485     of the postgis tests.
4486    
4487     * Thuban/Model/postgisdb.py: New. Basic postgis database support.
4488    
4489     * test/test_postgis_db.py: New. Test cases for the postgis
4490     support.
4491    
4492     * Thuban/Model/wellknowntext.py: New. Parser for well-known-text
4493     format
4494    
4495     * test/test_wellknowntext.py: New. Test cases for the
4496     wellknowntext parser
4497    
4498     * test/postgissupport.py: New. Support module for tests involving
4499     a postgis database.
4500    
4501     * test/support.py (execute_as_testsuite): Shut down the postmaster
4502     if it's still running after the tests
4503    
4504     * Thuban/Model/data.py (RAW_WKT): New constant for raw data in
4505     well known text format
4506    
4507 jan 1604 2003-08-19 Jan-Oliver Wagner <[email protected]>
4508    
4509     * Examples/simple_extensions/hello_world.py: New. Raises a Hello World
4510     message dialog.
4511    
4512 bh 1600 2003-08-18 Bernhard Herzog <[email protected]>
4513    
4514 bh 1602 * test/support.py (ThubanTestResult.printErrors): Indent the
4515     reason for the skips in the output to make it a bit more readable.
4516     (execute_as_testsuite): New helper function to run a test suite
4517     and print some more information.
4518     (run_tests): Use execute_as_testsuite to run the tests
4519    
4520     * test/runtests.py (main): Use execute_as_testsuite to run the
4521     tests
4522    
4523     2003-08-18 Bernhard Herzog <[email protected]>
4524    
4525 bh 1600 Fix some bugs in Thuban and the test suite that were uncovered by
4526     changes introduced in Python 2.3:
4527    
4528     * Thuban/Model/table.py (DBFTable.__init__): Make sure the
4529     filename is an absolute name
4530    
4531     * Thuban/Model/layer.py (RasterLayer.__init__): Make sure the
4532     filename is an absolute name
4533    
4534     * test/test_save.py (SaveSessionTest.testRasterLayer): Use a
4535     unique filename to save to and use the correct relative filename
4536     in the expected output.
4537     (SaveSessionTest.test_dbf_table): Use the correct relative
4538     filename in the expected output.
4539    
4540     * test/test_layer.py (TestLayer.test_raster_layer): Update the
4541     test to check whether the filename is absolute.
4542    
4543 jan 1596 2003-08-18 Jan-Oliver Wagner <[email protected]>
4544    
4545     * Thuban/UI/about.py (About.__init__): Added Silke Reimer.
4546    
4547 bh 1586 2003-08-15 Bernhard Herzog <[email protected]>
4548    
4549 bh 1594 Change the way shapes are returned by a shape store. The
4550     ShapesInRegion method returns an iterator over actual shape
4551     objects instead of a list of shape ids.
4552    
4553     * Thuban/Model/data.py (ShapefileShape.ShapeID): New. Return shape
4554     id.
4555     (ShapefileStore.ShapesInRegion): Return an iterator over the
4556     shapes which yields shape objects instead of returning a list of
4557     shape ids
4558     (ShapefileStore.AllShapes): New. Return an iterator over all
4559     shapes in the shape store
4560     (DerivedShapeStore.AllShapes): New. Like in ShapefileStore
4561    
4562     * Thuban/Model/layer.py (Layer.ShapesInRegion): Update
4563     doc-string.
4564    
4565     * Thuban/UI/baserenderer.py
4566     (BaseRenderer.layer_ids, BaseRenderer.layer_shapes): Rename to
4567     layer_shapes and make it return an iterator containg shapes
4568     instead of a list of ids.
4569     (BaseRenderer.draw_shape_layer): Update doc-string; Adapt to
4570     layer_shapes() change
4571    
4572     * Thuban/UI/renderer.py (ScreenRenderer.layer_ids)
4573     (ScreenRenderer.layer_shapes): Rename as in BaseRenderer
4574    
4575     * Thuban/UI/viewport.py (ViewPort._find_shape_in_layer): Adapt to
4576     changes in the ShapesInRegion return value.
4577     (ViewPort._get_hit_tester): Remove commented out code
4578    
4579     * test/mockgeo.py (SimpleShapeStore.ShapesInRegion): Adapt to the
4580     new return value.
4581     (SimpleShapeStore.AllShapes): New. Implement this method too.
4582    
4583     * test/test_layer.py (TestLayer.test_arc_layer)
4584     (TestLayer.test_polygon_layer, TestLayer.test_point_layer)
4585     (TestLayer.test_point_layer_with_projection)
4586     (TestLayer.test_derived_store): Adapt to changes in the
4587     ShapesInRegion return value.
4588    
4589     * test/test_shapefilestore.py
4590     (TestShapefileStoreArc.test_shapes_in_region)
4591     (TestShapefileStorePolygon.test_shapes_in_region)
4592     (TestShapefileStorePoint.test_shapes_in_region): Adapt to changes
4593     in the ShapesInRegion return value.
4594     (TestShapefileStorePoint.test_all_shapes)
4595     (TestShapefileStoreArc.test_shape_shapeid): New tests for the new
4596     methods
4597    
4598     * test/test_derivedshapestore.py
4599     (TestDerivedShapeStore.test_shapes_in_region): Adapt to changes in
4600     the ShapesInRegion return value.
4601     (TestDerivedShapeStore.test_all_shapes)
4602     (TestDerivedShapeStore.test_shape_shapeid): New tests for the new
4603     methods
4604    
4605     2003-08-15 Bernhard Herzog <[email protected]>
4606    
4607 bh 1592 Make the renderers deal correctly with raw vs. python level
4608     representation of shape geometries
4609    
4610     * Thuban/UI/baserenderer.py (BaseRenderer.low_level_renderer):
4611     Return a flag useraw in addition to the callable and the parameter
4612     to indicate whether the callable can deal with the raw shape data
4613     or uses the higher level python lists of coordinates. The callable
4614     now should accept either the raw data or the return value of the
4615     shape's Points() method.
4616     (BaseRenderer.draw_shape_layer): Adapt to the low_level_renderer
4617     change
4618     (BaseRenderer.projected_points): Instead of the shape id use the
4619     points list as parameter.
4620     (BaseRenderer.draw_polygon_shape, BaseRenderer.draw_arc_shape)
4621     (BaseRenderer.draw_point_shape): Adapt to projected_points()
4622     change and accept the points list as parameter instead of the
4623     shape id.
4624    
4625     * Thuban/UI/renderer.py (MapRenderer.low_level_renderer): Return
4626     the useraw flag as required by the BaseRenderer
4627     (ScreenRenderer.draw_shape_layer): Adapt to low-level renderer
4628     changes.
4629    
4630     * test/test_baserenderer.py
4631     (TestBaseRenderer.test_point_with_classification): New test for
4632     rendering a map with classifications.
4633    
4634     2003-08-15 Bernhard Herzog <[email protected]>
4635    
4636 bh 1590 * Thuban/UI/viewport.py (ViewPort.find_shape_at)
4637     (ViewPort._find_shape_in_layer, ViewPort._find_shape_in_layer)
4638     (ViewPort._get_hit_tester, ViewPort.projected_points)
4639     (ViewPort._hit_point, ViewPort._hit_arc, ViewPort._hit_polygon)
4640     (ViewPort._find_label_at): Split the find_shape_at method into
4641     several new methods and use the functions in the hit-test module.
4642    
4643     * Thuban/UI/hittest.py: New module with Python-level hit-testing
4644     functions
4645    
4646     * test/test_hittest.py: New. Test for the new hittest module
4647    
4648     2003-08-15 Bernhard Herzog <[email protected]>
4649    
4650 bh 1588 * Thuban/Model/layer.py (Layer.ShapesInRegion): Apply the layer
4651     projection to all corners of the bounding box to get a better
4652     approximation of the projected bounding box
4653    
4654     * test/test_layer.py (TestLayer.test_point_layer_with_projection):
4655     New. Test coordinate handling of a layer with a projection.
4656     Catches the bug fixed in Layer.ShapesInRegion
4657    
4658     2003-08-15 Bernhard Herzog <[email protected]>
4659    
4660 bh 1586 Move some of the mock objects in test_baserenderer into their own
4661     module so they can easily be used from other tests
4662    
4663     * test/mockgeo.py: New test helper module with some mock objects
4664     for geometry related things like shapes, shapestores and
4665     projections.
4666    
4667     * test/test_mockgeo.py: New. Tests for the new helper module
4668    
4669     * test/test_baserenderer.py: Some of the mock-objects are in
4670     mockgeo now.
4671    
4672 jan 1584 2003-08-12 Jan-Oliver Wagner <[email protected]>
4673    
4674     * Thuban/UI/about.py (About.__init__): Added Björn Broscheit.
4675    
4676 bh 1580 2003-08-12 Bernhard Herzog <[email protected]>
4677    
4678 bh 1582 * po/de.po: New. German translations by Bjoern Broscheit
4679    
4680     2003-08-12 Bernhard Herzog <[email protected]>
4681    
4682 bh 1580 * Thuban/UI/projdialog.py (UnknownProjPanel._DoLayout): Translated
4683     strings have to be one string literal.
4684    
4685 bh 1573 2003-08-11 Bernhard Herzog <[email protected]>
4686    
4687 bh 1578 * test/support.py (FloatComparisonMixin.assertPointListEquals):
4688     New. This method was used in various derived classes, but it's
4689     better to have it here.
4690    
4691     * test/test_shapefilestore.py
4692     (ShapefileStoreTests.assertPointListEquals): Removed. It's now in
4693     FloatComparisonMixin
4694    
4695     * test/test_layer.py (TestLayer.assertPointListEquals): Removed.
4696     It's now in FloatComparisonMixin
4697    
4698     * test/test_derivedshapestore.py
4699     (TestDerivedShapeStore.assertPointListEquals): Removed. It's now
4700     in FloatComparisonMixin
4701    
4702     2003-08-11 Bernhard Herzog <[email protected]>
4703    
4704 bh 1573 * Thuban/UI/join.py (JoinDialog.OnJoin): Add missing space to
4705     error message
4706    
4707 jan 1569 2003-08-08 Jan-Oliver Wagner <[email protected]>
4708    
4709 jan 1571 * Doc/manual/thuban-manual.xml: Now use authorgroup. Added revhistory
4710     with version number.
4711     Changed title to reflect version number of Thuban.
4712    
4713     2003-08-08 Jan-Oliver Wagner <[email protected]>
4714    
4715 jan 1569 * Thuban/UI/about.py (About.__init__): Reworked the hall of fame. Now
4716     the list corresponds to the "About" web page.
4717    
4718 bh 1567 2003-08-08 Bernhard Herzog <[email protected]>
4719    
4720     * Thuban/UI/projdialog.py (UTMProposeZoneDialog.dialogLayout):
4721     Make sure translated strings are recognized as one string literal.
4722    
4723     * Thuban/UI/proj4dialog.py (UTMProposeZoneDialog.dialogLayout):
4724     Make sure translated strings are recognized as one string literal.
4725    
4726     * Thuban/UI/classgen.py (ClassGenDialog.OnOK): Make sure
4727     translated strings are recognized as one string literal.
4728    
4729     * Thuban/UI/application.py (ThubanApplication.OpenSession): Make
4730     sure translated strings are recognized as one string literal.
4731    
4732 bh 1556 2003-08-07 Bernhard Herzog <[email protected]>
4733    
4734 bh 1565 * Thuban/Model/data.py (DerivedShapeStore.RawShapeFormat): New.
4735     Simply delegates to the original shapestore.
4736    
4737     * test/test_derivedshapestore.py
4738     (TestDerivedShapeStore.test_raw_format): New. Test case for
4739     DerivedShapeStore.RawShapeFormat
4740    
4741     2003-08-07 Bernhard Herzog <[email protected]>
4742    
4743 bh 1561 Add raw data interface to shape objects.
4744    
4745     * Thuban/Model/data.py (ShapefileShape, Shape): Rname the shape
4746     class to ShapefileShape which now holds shapefile specific
4747     information.
4748     (ShapefileShape.compute_bbox): Simplified to not cache any
4749     information. The way this method is used that shouldn't matter
4750     performance wise.
4751     (ShapefileShape.RawData): New. Return the shapeid which is the raw
4752     data format for shapes from shapefiles.
4753     (ShapefileStore.RawShapeFormat): New. Return the raw datatype used
4754     in the shape objects returned by a shapestore. For a
4755     ShapefileStore this is always RAW_SHAPEFILE.
4756     (RAW_PYTHON, RAW_SHAPEFILE): Constants for the RawShapeFormat
4757     method.
4758    
4759     * test/test_shapefilestore.py
4760     (TestShapefileStore.test_raw_format): New test to test the raw
4761     format feature of shapes.
4762    
4763 bh 1560 * Thuban/Model/layer.py: Remove the unused import of Shape from
4764     data. It was only there for interface compatibility but it's not
4765 bh 1561 used inside of Thuban and the generic Shape class has gone away.
4766 bh 1560
4767 bh 1563 * Thuban/UI/renderer.py (MapRenderer.low_level_renderer): Check
4768     the raw data format and only use an optimized version of its a
4769     shapefile.
4770    
4771 bh 1561 2003-08-07 Bernhard Herzog <[email protected]>
4772    
4773 bh 1559 * test/test_baserenderer.py (SimpleShape): Shape class for the
4774     tests.
4775     (SimpleShapeStore.Shape): Use SimpleShape instead of
4776     Thuban.Model.data.Shape to make the tests independed of the coming
4777     changes.
4778    
4779     2003-08-07 Bernhard Herzog <[email protected]>
4780    
4781 bh 1556 * test/support.py (SkipTest, ThubanTestResult, ThubanTestRunner)
4782     (ThubanTestProgram): New classes that extend the respective
4783     classes from unittest. These new version support skipping tests
4784     under certain expected conditions. In the Thuban test suite we
4785     uses this for tests that require the optional gdal support.
4786     (run_tests): Use ThubanTestProgram instead of the unittest.main()
4787    
4788     * test/runtests.py (main): Use the new ThubanTestRunner instead of
4789     the normal one from unittest
4790    
4791     * test/test_layer.py (TestLayer.test_raster_layer): If this test
4792     is not run because gdal support isn't available report this to the
4793     runner.
4794    
4795     * test/test_baserenderer.py
4796     (TestBaseRenderer.test_raster_no_projection): Do not run this test
4797     if gdal support isn't available and report this to the runner.
4798    
4799 bh 1553 2003-08-06 Bernhard Herzog <[email protected]>
4800    
4801     Rearrange the renderers a bit, partly in preparation for changes
4802     required for the postgis merge, partly to make it more testable.
4803     Also make the representation of coordinates in Shapes more
4804     consistent.
4805    
4806     * Thuban/UI/renderer.py (MapRenderer): Most of the code/methods in
4807     this class is now in BaseRenderer. This class is now practically
4808     only a specialization of BaseRenderer for rendering to an actual
4809     wx DC.
4810     (ScreenRenderer.draw_shape_layer): Use self.low_level_renderer()
4811     to get the shapetype specific rendering functions.
4812    
4813     * Thuban/UI/baserenderer.py: New file with the basic rendering
4814     logic. The code in this file is completely independend of wx.
4815     (BaseRenderer): Class with the basic rendering logic
4816    
4817     * test/test_baserenderer.py: New. Test cases for BaseRenderer
4818    
4819     * Thuban/UI/view.py (MapCanvas.__init__): New instance variable
4820     error_on_redraw to guard agains endless loops and stack overflows
4821     when there's a bug in the rendering code that raises exceptions.
4822     (MapCanvas.OnIdle, MapCanvas._do_redraw): Split the actual
4823     rendering into a separate method _do_redraw so that error handling
4824     is a bit easier. When an exception occurs, set error_on_redraw to
4825     true. When it's true on entry to OnIdle do nothing and return
4826     immediately.
4827    
4828     * Thuban/Model/data.py (ShapefileStore.Shape): For consistency, a
4829     Shape object will always have the coordinates as a list of list of
4830     coordinate pairs (tuples).
4831     (Shape.compute_bbox): Adapt to new representation.
4832    
4833     * Thuban/UI/viewport.py (ViewPort.find_shape_at)
4834     (ViewPort.LabelShapeAt): Adapt to new coordinate representation in
4835     Shape objects.
4836    
4837     * test/test_shapefilestore.py
4838     (ShapefileStoreTests.assertFloatTuplesEqual)
4839     (ShapefileStoreTests.assertPointListEquals): Rename to
4840     assertPointListEquals and change purpose to checking equality of
4841     the lists returned by Shape.Points().
4842     (TestShapefileStoreArc.test_shape)
4843     (TestShapefileStorePolygon.test_shape)
4844     (TestShapefileStorePoint.test_shape): Use the new
4845     assertPointListEquals instead of assertFloatTuplesEqual
4846    
4847     * test/test_layer.py (TestLayer.assertFloatTuplesEqual)
4848     (TestLayer.assertPointListEquals): Rename to assertPointListEquals
4849     and change purpose to checking equality of the lists returned by
4850     Shape.Points().
4851     (TestLayer.test_arc_layer, TestLayer.test_arc_layer)
4852     (TestLayer.test_polygon_layer, TestLayer.test_point_layer)
4853     (TestLayer.test_derived_store): Use the new assertPointListEquals
4854     instead of assertFloatTuplesEqual
4855    
4856     * test/test_derivedshapestore.py
4857     (TestDerivedShapeStore.assertFloatTuplesEqual)
4858     (TestDerivedShapeStore.assertPointListEquals): Rename to
4859     assertPointListEquals and change purpose to checking equality of
4860     the lists returned by Shape.Points().
4861     (TestDerivedShapeStore.test_shape): Use the new
4862     assertPointListEquals instead of assertFloatTuplesEqual
4863    
4864 jan 1550 2003-08-06 Jan-Oliver Wagner <[email protected]>
4865    
4866     * Thuban/UI/projdialog.py (UTMPanel._OnPropose): Added test for
4867     a bounding box. A dialog is raised in case, no bounding box
4868     is found. This fixes bug #2043:
4869     https://intevation.de/rt/webrt?serial_num=2043
4870    
4871 bh 1548 2003-08-05 Bernhard Herzog <[email protected]>
4872    
4873     * Thuban/Model/color.py (Color.__repr__): Make the repr of a color
4874     object look like a Color instantiation. Formerly it looked like a
4875     tuple.
4876    
4877     * test/test_color.py (TestColor.test_repr)
4878     (TestColor.test_equality, TestColor.test_inequality): New. test
4879     some more apects of the Color class
4880     (TestTransparent.test_repr, TestTransparent.test_hex)
4881     (TestTransparent.test_equality): New. Test cases for the
4882     Transparent object.
4883    
4884 jan 1545 2003-08-04 Jan-Oliver Wagner <[email protected]>
4885    
4886     * Doc/manual/thuban-manual.xml: a number of small improvements.
4887     The resulting file is the version submitted for GREAT-ER II.
4888    
4889 bh 1540 2003-08-01 Bernhard Herzog <[email protected]>
4890    
4891 bh 1543 * Thuban/UI/resource.py, Thuban/UI/projdialog.py,
4892     Thuban/UI/join.py, Thuban/UI/classgen.py, Thuban/UI/about.py,
4893     Thuban/Model/resource.py: Insert cvs keywords and doc-strings.
4894    
4895     * Thuban/UI/common.py: Insert cvs keywords and doc-strings.
4896     (Color2wxColour, wxColour2Color, ThubanBeginBusyCursor)
4897     (ThubanEndBusyCursor): Add doc-strings
4898    
4899     2003-08-01 Bernhard Herzog <[email protected]>
4900    
4901 bh 1540 First step towards PostGIS integration. More abstraction by movin
4902     more code from the layer to the shapestore. More methods of the
4903     layer are now simply delegated to the equivalent method of the
4904     shapestore. The SHAPETYPE_* constants are now in data not in
4905     layer.
4906    
4907     * Thuban/Model/data.py (SHAPETYPE_POLYGON, SHAPETYPE_ARC)
4908     (SHAPETYPE_POINT, Shape): Move these constants and classes from
4909     layer.py to data.py
4910     (ShapefileStore.__init__): More Initialization for the new methods
4911     and functionality.
4912     (ShapefileStore.ShapeType, ShapefileStore.NumShapes)
4913     (ShapefileStore.BoundingBox, ShapefileStore.ShapesInRegion)
4914     (ShapefileStore.Shape): New methods that were formerly implemented
4915     in the layer.
4916     (DerivedShapeStore.Shape, DerivedShapeStore.ShapesInRegion)
4917     (DerivedShapeStore.ShapeType, DerivedShapeStore.NumShapes)
4918     (DerivedShapeStore.BoundingBox): New. DerivedShapeStore
4919     equivalents of the new shape methods. These versions are simply
4920     delegated to the original shapstore.
4921    
4922     * Thuban/Model/layer.py (SHAPETYPE_POLYGON, SHAPETYPE_ARC)
4923     (SHAPETYPE_POINT, Shape): Removed. They're now in data.py
4924     (Layer.SetShapeStore): Removed the initializatin of instance
4925     variables that were needed for the stuff that's now in
4926     ShapefileStore
4927     (Layer.BoundingBox, Layer.NumShapes, Layer.ShapeType)
4928     (Layer.Shape, Layer.ShapesInRegion): Simply delegate to the
4929     shapestore.
4930    
4931     * Thuban/UI/classifier.py, Thuban/UI/renderer.py,
4932     Thuban/UI/viewport.py: Import the SHAPETYPE_* constants from data
4933     instead of layer.
4934    
4935     * test/test_shapefilestore.py: New. Tests for ShapefileStore.
4936    
4937     * test/test_derivedshapestore.py: New. Tests for DerivedShapeStore.
4938    
4939     * test/test_layer.py: Import the SHAPETYPE_* constants from data
4940     instead of layer.
4941     (TestLayer.test_derived_store): Remove the test for the exception
4942     when instantiating the DerivedShapeStore with an incompatible
4943     table which is now in test_derivedshapestore.py. Add some more
4944     tests of the layer methods to determine whether they work for a
4945     DerivedShapeStore as well.
4946    
4947 jonathan 1534 2003-07-31 Jonathan Coles <[email protected]>
4948    
4949     * Doc/manual/thuban-manual.xml: Fix the list of required packages
4950     by just listing the name and where they can be found.
4951    
4952 frank 1532 2003-07-31 Frank Koormann <[email protected]>
4953    
4954     * Doc/manual/thuban-manual.xml:
4955     Changed the screenshot elements to figure.
4956     Changed some variablelist elements to itemizedlist.
4957     Added section on GDAL formats.
4958    
4959 jonathan 1531 2003-07-31 Jonathan Coles <[email protected]>
4960    
4961     * Doc/manual/thuban-manual.xml: Added a few sentences about
4962     the Fix Border Color option when generating classes.
4963    
4964 jonathan 1529 2003-07-30 Jonathan Coles <[email protected]>
4965    
4966     * Thuban/Model/classgen.py: Add docstrings. Rename specific
4967     Ramp instances to use lower_case_style.
4968    
4969     * Thuban/UI/classgen.py: Use renamed Ramp instances.
4970    
4971     * Thuban/UI/classifier.py: Add docstrings.
4972    
4973     * Thuban/UI/dock.py: Add docstrings.
4974    
4975     * test/test_classgen.py: Use renamed Ramp instances.
4976    
4977 bh 1522 2003-07-30 Bernhard Herzog <[email protected]>
4978    
4979 bh 1524 * Thuban/Lib/connector.py (QueueingPublisher): Removed. This class
4980     was never used in Thuban.
4981    
4982     2003-07-30 Bernhard Herzog <[email protected]>
4983    
4984 bh 1522 * Thuban/UI/join.py (JoinDialog.__init__): Use the table's Title()
4985     method directly instead of going through the transient_table
4986     method. This faster because transient_table may force the copy of
4987     a DBF file into the transient database and setting a table's title
4988     doesnm't affect the title of the associated transient table, so
4989     this fixes RT #2042
4990    
4991     * Thuban/UI/main.py (__version__): Don't import the already
4992     removed show_exception_dialog.
4993    
4994 jonathan 1517 2003-07-29 Jonathan Coles <[email protected]>
4995    
4996 jonathan 1519 * Thuban/UI/application.py (ThubanApplication.ShowExceptionDialog):
4997     Put back this method and remove the equivalent function since we
4998     are setting the exception hook from within this class (OnInit).
4999    
5000     2003-07-29 Jonathan Coles <[email protected]>
5001    
5002 jonathan 1517 * Doc/manual/images/5_2_custom_ramp.png,
5003     Doc/manual/images/5_2_quantiles.png,
5004     Doc/manual/images/5_2_uniform_dist.png,
5005     Doc/manual/images/5_2_unique_values.png,
5006     Doc/manual/images/8_int_error.png: New screen shots.
5007    
5008     * Doc/manual/thuban-manual.xml: Fixed typos and wording, clarified
5009     some points, and added more screen shots.
5010    
5011 bh 1512 2003-07-29 Bernhard Herzog <[email protected]>
5012    
5013 bh 1516 * Thuban/Model/data.py: Remove the now unused import of warnings
5014    
5015     2003-07-29 Bernhard Herzog <[email protected]>
5016    
5017 bh 1514 * Thuban/Model/data.py (SimpleStore): Removed. This class has been
5018     deprecated since before the 0.8 release and isn't used in Thuban
5019     itself anymore.
5020    
5021 bh 1512 * Thuban/Model/transientdb.py: Remove some unnecessary imports
5022    
5023 jonathan 1503 2003-07-29 Jonathan Coles <[email protected]>
5024 jonathan 1506
5025     * Thuban/UI/application.py (ThubanApplication.OnInit): set the
5026     python exception hook here so that we are sure to catch any
5027     Thuban exception that happen during initialization.
5028    
5029     * Thuban/UI/main.py (main): Don't set the exception hook here,
5030     it will get set in ThubanApplication.OnInit.
5031    
5032     2003-07-29 Jonathan Coles <[email protected]>
5033 jonathan 1503
5034     * Thuban/UI/application.py (ThubanApplication.ShowExceptionDialog):
5035     Removed and called it show_exception_dialog() so that the exception
5036     handler can be set before the class is created.
5037    
5038     * Thuban/UI/main.py (main): Install the exception handler before
5039     a ThubanApplication is created.
5040    
5041 bh 1500 2003-07-29 Bernhard Herzog <[email protected]>
5042    
5043     * po/it.po: New. Italian translation by Maurizio Napolitano
5044    
5045     * po/ru.po: New. Russian translation by Alex Shevlakov
5046    
5047 frank 1497 2003-07-29 Frank Koormann <[email protected]>
5048    
5049 frank 1508 * Doc/manual/thuban-manual.xml: Extended section on supported
5050     projections.
5051    
5052     2003-07-29 Frank Koormann <[email protected]>
5053    
5054 frank 1497 * Doc/manual/thuban-manual.xml: gaspell-checked.
5055    
5056 jonathan 1493 2003-07-29 Jonathan Coles <[email protected]>
5057    
5058 jonathan 1495 * Doc/manual/images/3_5_legend.png: Added border to improve look
5059     on white background.
5060    
5061     2003-07-29 Jonathan Coles <[email protected]>
5062    
5063 jonathan 1493 * Doc/manual/thuban-manual.xml: Fixed grammar and typos. Added
5064     descriptions for the legend toolbar.
5065    
5066     * Doc/manual/images/4_2_raster_layer_properties.png: Removed
5067     cursor from dialog box.
5068    
5069     2003-07-28 Jonathan Coles <[email protected]>
5070    
5071     * Doc/manual/thuban-manual.xml: More screenshots and more chapters.
5072    
5073     * Doc/manual/images/2_4_session_tree.png,
5074     Doc/manual/images/3_5_legend.png, Doc/manual/images/3_rename_map.png,
5075     Doc/manual/images/4_2_layer_properties.png,
5076     Doc/manual/images/4_2_raster_layer_properties.png,
5077     Doc/manual/images/5_3_genclass.png,
5078     Doc/manual/images/5_classification.png,
5079     Doc/manual/images/6_projection.png,
5080     Doc/manual/images/7_1_table_view.png,
5081     Doc/manual/images/7_2_5_join.png: New screenshots.
5082    
5083     2003-07-24 Jonathan Coles <[email protected]>
5084    
5085     * Doc/manual/thuban-manual.xml: Chapter on Projection Management.
5086    
5087     2003-07-24 Jonathan Coles <[email protected]>
5088    
5089     * Doc/manual/thuban-manual.xml: Added EPS images and wrote
5090     chapter on Layer Management.
5091    
5092     * Doc/manual/Makefile: New. Makefile to generate all formats for the
5093     manual and images.
5094    
5095 bh 1483 2003-07-24 Bernhard Herzog <[email protected]>
5096    
5097     * Thuban/Model/range.py, Thuban/version.py: Remove the #! line as
5098     it annoys lintian which warns about these files not being
5099 jan 1767 executable. The #! isn't necessary here since if you absolutely
5100 bh 1483 must execute them you can always say "python <filename>".
5101    
5102     * Thuban/UI/renderer.py (ScreenRenderer.draw_shape_layer): Remove
5103     superfluous code to set brush and pen for point shapes
5104    
5105     * Thuban/UI/viewport.py: Remove commented out code that wouldn't
5106     belong in viewport anyway
5107    
5108 frank 1479 2003-07-24 Frank Koormann <[email protected]>
5109    
5110     * Doc/manual/thuban-manual.xml: Added section on table management.
5111    
5112 bh 1477 2003-07-24 Bernhard Herzog <[email protected]>
5113    
5114     * test/runtests.py (main): Recognize the long "verbose" option
5115     correctly.
5116    
5117 jonathan 1470 2003-07-22 Jonathan Coles <[email protected]>
5118    
5119     * Doc/manual/thuban-manual.xml: Continue to write first revision
5120     of the manual.
5121    
5122     * Thuban/UI/renderer.py (MapRenderer.render_map): Wrap method
5123     with Begin/EndDrawing() calls to ensure we aren't doing to
5124     many updates to the dc during rendering.
5125     (ScreenRenderer.draw_shape_layer): self.draw_point_shape takes
5126     a pen and brush argument so they need to be passed to the function.
5127    
5128     * Thuban/UI/viewport.py (ViewPort.calc_min_max_scales): New.
5129     Calculates the minimum and maximum scale values. Factored out
5130     of set_view_transform so that it could be used to zoom all the
5131     way into a single point.
5132     (ViewPort.set_view_transform): Call calc_min_max_scales().
5133     (ViewPort.FitSelectedToWindow): Zoom to the maximum scale
5134     if only a single point is selected.
5135    
5136     * Doc/manual/images/1_2_legend_close.png,
5137     Doc/manual/images/1_2_legend_dock.png,
5138     Doc/manual/images/1_2_mainwindow.png,
5139     Doc/manual/images/1_2_mainwindow.ps,
5140     Doc/manual/images/1_2_mainwindow.sk,
5141     Doc/manual/images/3_2_fullextent.png,
5142     Doc/manual/images/3_2_fulllayerextent.png,
5143     Doc/manual/images/3_2_fullshapeextent.png,
5144     Doc/manual/images/3_2_pan.png,
5145     Doc/manual/images/3_2_zoomin.png,
5146     Doc/manual/images/3_2_zoomout.png,
5147     Doc/manual/images/3_3_identify.png,
5148     Doc/manual/images/3_3_label.png,
5149     Doc/manual/images/3_5_invisible.png,
5150     Doc/manual/images/3_5_movedown.png,
5151     Doc/manual/images/3_5_moveup.png,
5152     Doc/manual/images/3_5_props.png,
5153     Doc/manual/images/3_5_tobottom.png,
5154     Doc/manual/images/3_5_totop.png,
5155     Doc/manual/images/3_5_visible.png: New. Images for the documentation.
5156    
5157 bh 1451 2003-07-18 Bernhard Herzog <[email protected]>
5158    
5159 bh 1465 * Thuban/UI/messages.py (MAP_REPLACED): New message.
5160    
5161     * Thuban/UI/viewport.py (ViewPort.SetMap): Issue MAP_REPLACED
5162     after the new map has been assigned
5163    
5164     * Thuban/UI/mainwindow.py (MainWindow.delegated_messages):
5165     Delegate MAP_REPLACED to the canvas too
5166     (MainWindow.prepare_new_session): Removed. Thanks to the new
5167     MAP_REPLACED message it's no longer needed
5168     (MainWindow.OpenSession, MainWindow.NewSession):
5169     prepare_new_session has been removed.
5170    
5171     * Thuban/UI/classifier.py (Classifier.__init__): Subscribe to
5172     MAP_REPLACED so that we can close the dialog if a new map is set.
5173     (Classifier.unsubscribe_messages): Unsubscribe from MAP_REPLACED
5174     (Classifier.map_replaced): Handle MAP_REPLACED by closing the
5175     dialog
5176    
5177     * test/test_viewport.py (SimpleViewPortTest)
5178     (SimpleViewPortTest.test_default_size): Add doc-strings
5179     (ViewPortTest.setUp): Bind map to self.map so we can use it in
5180     tests. Subscribe to MAP_REPLACED messages too.
5181     (ViewPortTest.tearDown): No need to explicitly unsubscribe
5182     (ViewPortTest.test_set_map): New test for the SetMap method.
5183    
5184     2003-07-18 Bernhard Herzog <[email protected]>
5185    
5186 bh 1463 * test/test_viewport.py (SimpleViewPortTest.test_default_size):
5187     Move this test from ViewPortTest.setUp to this new separate test
5188     case. setUp is not the place for the actual tests.
5189     (ViewPortTest.test_inital_settings, ViewPortTest.setUp): Move some
5190     more of the test from setUp to the new test test_inital_settings.
5191     (ViewPortTest.test_win_to_proj, ViewPortTest.test_proj_to_win)
5192     (ViewPortTest.test_proj_conv): Split test_proj_conv into
5193     test_win_to_proj and test_proj_to_win and make the tests easier to
5194     understand
5195     (ViewPortTest.testFitRectToWindow, ViewPortTest.testZoomFactor)
5196     (ViewPortTest.testZoomOutToRect, ViewPortTest.testTranslate)
5197     (ViewPortTest.test_unprojected_rect_around_point)
5198     (ViewPortTest.test_find_shape_at, ViewPortTest.testTools):
5199     Reformat to increase readability.
5200    
5201     2003-07-18 Bernhard Herzog <[email protected]>
5202    
5203 bh 1461 * Thuban/UI/view.py (MapCanvas.OnLeftDown): Capture the mouse.
5204    
5205     2003-07-18 Bernhard Herzog <[email protected]>
5206    
5207 bh 1459 * test/runtests.py: The test suite can now be run without an X
5208     connection. To make sure this remains true, remove the DISPLAY
5209     environment variable so that an error occurs if the wxGTK is
5210     imported accidentally
5211    
5212     2003-07-18 Bernhard Herzog <[email protected]>
5213    
5214 bh 1457 * Thuban/UI/viewport.py: Remove unused imports
5215    
5216     * Thuban/UI/view.py: Remove unused imports
5217    
5218     2003-07-18 Bernhard Herzog <[email protected]>
5219    
5220 bh 1455 * test/test_export.py Remove unused imports. The OutputTransform
5221     function is now in viewport.py and is called output_transform
5222     (TestScalebar.test_output_transform)
5223     (TestScalebar.test_OutputTransform): Renamed to
5224     test_output_transform and updated to use output_transform instead
5225     of OutputTransform
5226    
5227     * Thuban/UI/view.py (OutputTransform): Moved to viewport.py and
5228     renamed.
5229     (MapCanvas.Export, MapPrintout.draw_on_dc): OutputTransform was
5230     renamed to output_transform
5231    
5232     * Thuban/UI/viewport.py (OutputTransform, output_transform):
5233     Rename to output_transform
5234    
5235     2003-07-18 Bernhard Herzog <[email protected]>
5236    
5237 bh 1453 * Thuban/Model/layer.py (Layer.__init__): Rename
5238     classificationField to classificatin_column and init it here so
5239     that it can be used in SetClassificationColumn
5240     (Layer.GetClassificationColumn, Layer.GetClassificationField):
5241     Rename to GetClassificationColumn.
5242     (Layer.SetClassificationColumn, Layer.SetClassificationField):
5243     Rename to SetClassificationColumn and issue a LAYER_CHANGED
5244     message if the column changes.
5245     (Layer._classification_changed, Layer.ClassChanged): Rename to
5246     _classification_changed. Update the callers.
5247     (Layer.SetShapeStore): Further field->column renames.
5248    
5249     * Thuban/Model/load.py (SessionLoader.start_classification)
5250     (SessionLoader.start_clpoint): Updates because of
5251     field->column method name changes in the Layer class
5252    
5253     * Thuban/Model/save.py (SessionSaver.write_classification): Updates
5254     because of field->column method name changes in the Layer class
5255    
5256     * Thuban/UI/classifier.py (Classifier.__init__)
5257     (Classifier._OnTry, Classifier._OnRevert): Updates because of
5258     field->column method name changes in the Layer class
5259    
5260     * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Updates
5261     because of field->column method name changes in the Layer class
5262    
5263     * Thuban/UI/viewport.py (ViewPort.find_shape_at): Updates because
5264     of field->column method name changes in the Layer class
5265    
5266     * test/test_save.py (SaveSessionTest.testClassifiedLayer)
5267     (SaveSessionTest.testClassifiedLayer): Update because of
5268     field->column method name changes in the Layer class
5269    
5270     * test/test_layer.py (SetShapeStoreTests.setUp)
5271     (SetShapeStoreTests.test_sanity): Update because of field->column
5272     method name changes in the Layer class
5273     (TestLayerModification.setUp): Subscribe to LAYER_CHANGED as well
5274     (TestLayerModification.test_sanity)
5275     (TestLayerModification.test_initial_settings): remove unsued code
5276     and rename to test_sanity.
5277     (TestLayerModification.test_set_classification): New test for
5278     SetClassification and SetClassificationField.
5279    
5280     2003-07-18 Bernhard Herzog <[email protected]>
5281    
5282 bh 1451 * test/test_classgen.py (TestFixedRamp.test): Extend test to check
5283     the non-fixed values as well. The old test would have accepted a
5284     fixed ramp that only returnes the fixed properties
5285    
5286 jonathan 1449 2003-07-17 Jonathan Coles <[email protected]>
5287    
5288     * Doc/manual/mainwindow.png, Doc/manual/mainwindow.xcf: Screen
5289     shots for the manual. The XCF file is the source image and
5290     has additional layers to support changes.
5291    
5292     * Doc/manual/thuban-manual.xml: Wrote an initial Introduction.
5293    
5294     * Thuban/UI/classifier.py (Classifier.__BuildClassification):
5295     Return both the new class and the field name.
5296    
5297     * Thuban/UI/mainwindow.py (MainWindow.ToggleLegend): Don't
5298     fit the map to the window as this changes any zoom level that
5299     the user may have set.
5300    
5301 jonathan 1442 2003-07-16 Jonathan Coles <[email protected]>
5302    
5303     * Thuban/Model/classgen.py (generate_singletons,
5304     generate_uniform_distribution, generate_quantiles): Remove
5305     fixes parameter, but maintain the same functionality by having
5306     the calling function pass a FixedRamp object for the ramp.
5307     (FixedRamp): New. Adapts a ramp to have fixed property values.
5308    
5309     * Thuban/Model/classification.py: Use new CLASS_CHANGED message.
5310     (Classification): Inherit from Publisher.
5311     (Classification.__init__): Remove the layer parameter.
5312     Classifications no longer need to have a parent layer.
5313     (Classification.GetField, Classification.GetFieldType,
5314     Classification.SetFieldInfo): Removed. The field name is stored
5315     in the layer, and the type can be retreived by calling
5316     Layer.GetFieldType().
5317     (Classification._set_layer, Classification.GetLayer): Removed.
5318     Classifications no longer have a parent layer.
5319    
5320     * Thuban/Model/layer.py (Layer.Destroy): Unsubscribe from the
5321     classification.
5322     (Layer.SetShapeStore): Reset the classification first while
5323     we still have the old shape store to work with.
5324     (Layer.GetClassificationField, Layer.SetClassificationField):
5325     New. Method for getting/setting the field to classify on.
5326     (Layer.SetClassification): Simplified now that the layer
5327     simply has to hold a reference to the classification and not
5328     tell the classification who owns it.
5329     Fixes RTbug #2023.
5330    
5331     * Thuban/Model/load.py (SessionLoader.start_classification):
5332     Set the field name on the layer, not the classification.
5333    
5334     * Thuban/Model/messages.py: Add CLASS_CHANGED for when a
5335     classification is modified.
5336    
5337     * Thuban/Model/save.py (SessionSaver.write_classification):
5338     Get the field name and type from the layer.
5339    
5340     * Thuban/Model/table.py (table_to_dbf, table_to_csv): Renamed
5341     parameter records to rows and add docstring. Fixes RTbug #1997.
5342    
5343     * Thuban/UI/classgen.py (ClassGenDialog.OnOK): Use a fixed
5344     ramp when we need to fix certain values of a ramp rather than
5345     using the old fixes parameter. Fixes RTbug #2024.
5346    
5347     * Thuban/UI/classifier.py (ClassGrid.CreateTable): Add fieldType
5348     parameter.
5349     (ClassTable.Reset): Add fieldType parameter and use it, rather
5350     than asking the classification.
5351     (Classifier.__init__): Remember the original class's field
5352     and ask the layer for the field type, rather than the classification.
5353     (Classifier.__SetGridTable): Retrieve the field and field type
5354     for the table because they are not in the classification.
5355     (Classifier._OnTry, Classifier._OnRevert): Set the classification
5356     field on the layer in addition to the classification itself.
5357    
5358     * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Get the
5359     classification field from layer.
5360    
5361     * Thuban/UI/viewport.py (ViewPort.find_shape_at): Get the
5362     classification field from layer. Split up tests and remove
5363     *-imports. Fixes RTbug #1992.
5364    
5365     * test/test_classgen.py (TestFixedRamp): Test for the FixedRamp class.
5366    
5367     * test/test_classification.py
5368     (TestClassification.test_classification): Remove tests for methods
5369     that no longer exist.
5370    
5371     * test/test_layer.py (SetShapeStoreTests.setUp): Classification
5372     __init__ no longer has a field parameter, use SetClassificationField.
5373     (SetShapeStoreTests.test_sanity): Use layer object to get class
5374     field info.
5375    
5376     * test/test_save.py (SaveSessionTest.testClassifiedLayer): Use
5377     SetClassificationField on layer to set class field info.
5378    
5379     * test/test_viewport.py: Renamed from test/test_view.py.
5380    
5381 jan 1424 2003-07-16 Jan-Oliver Wagner <[email protected]>
5382    
5383     * Doc/manual/thuban-manual.xml: Added authors and an initial
5384     coarse structure.
5385    
5386 bh 1418 2003-07-15 Bernhard Herzog <[email protected]>
5387    
5388 bh 1422 * test/support.py (FloatComparisonMixin): This is a mix-in class
5389     and therefore should not be derived from any other class.
5390    
5391     * test/test_range.py (RangeTest): FloatComparisonMixin is a
5392     mix-in, so derive from TestCase as well.
5393    
5394     2003-07-15 Bernhard Herzog <[email protected]>
5395    
5396 bh 1420 * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Rework the
5397     draw_func handling a bit to remove one layer of indirection. This
5398     makes the renderer about 10% faster in the non-classifying case
5399     and the code a bit cleaner
5400     (MapRenderer.draw_point_shape): Add the pen and brush parameters
5401     and set them in the dc. Now the draw_point_shape method and
5402     wxproj's draw_polygon_shape function have basically the same
5403     signature so that both can be directly used as draw_func
5404    
5405     2003-07-15 Bernhard Herzog <[email protected]>
5406    
5407 bh 1418 * Thuban/Model/save.py (SessionSaver.write_classification): Encode
5408     string values (in addition to the labels) as UTF 8
5409    
5410     * Thuban/Model/load.py (SessionLoader.start_clpoint): Decode the
5411     values if the field type is string
5412    
5413     * test/test_save.py (SaveSessionTest.testClassifiedLayer): Test
5414     saving a session with non-ascii string classification values.
5415    
5416     * test/test_load.py (TestClassification.file_contents)
5417     (TestClassification.test): Check for non-ascii values in string
5418     classifications
5419    
5420 jonathan 1416 2003-07-14 Jonathan Coles <[email protected]>
5421    
5422     * test/test_view.py: New. Tests for ViewPort.
5423    
5424 frank 1409 2003-07-14 Frank Koormann <[email protected]>
5425    
5426     * Thuban/Model/load.py (SessionLoader.start_map): Encode map
5427     title to latin1. Fixes https://intevation.de/rt/webrt?serial_num=2013
5428    
5429 frank 1411 * test/test_load_0_8.py (TestUnicodeStrings): New, test load of
5430     unicode strings from session file: session title, map title and
5431     projection name.
5432    
5433 jonathan 1403 2003-07-10 Jonathan Coles <[email protected]>
5434    
5435 jonathan 1406 * Thuban/UI/viewport.py (Tool.MouseUp): Should have called
5436     drag_stop, not drag_move when the mouse is released.
5437    
5438     2003-07-10 Jonathan Coles <[email protected]>
5439    
5440 jonathan 1403 The most important part of this is the seperation of view.py into
5441     two pieces. viewport.py now has a class called ViewPort which
5442     contains all the non-wx parts of view.py and can therefore be
5443     tested. view.py contains only the wx-specific parts and is fairly
5444     simple.
5445    
5446     * Thuban/UI/view.py: Stripped out all non-wx functionality. Fixes
5447     RTTbug #1992.
5448     * Thuban/UI/viewport.py: New. Contains non-wx view functionality.
5449     RTTbug #1992.
5450    
5451     * Thuban/Model/classgen.py (generate_singletons,
5452     generate_uniform_distribution, generate_quantiles):
5453     Added 'fixes' parameter so that property attributes can
5454     be held constant over the generated classification groups.
5455     (CustomRamp.GetProperties): Remove unused variables.
5456    
5457     * Thuban/Model/map.py (Map.SetProjection): Send the old
5458     projection as an argument to listeners of the MAP_PROJECTION_CHANGED
5459     event.
5460    
5461     * Thuban/Model/table.py (table_to_dbf, table_to_csv): Added 'records'
5462     parameter which is a list of records that restricts which
5463     records are saved. Fixes RTbug #1997.
5464    
5465     * Thuban/UI/application.py (ThubanApplication.ShowExceptionDialog):
5466     Port exception dialog from GREAT-ER. Fixes RTbug #1993.
5467    
5468     * Thuban/UI/classgen.py (ClassGenDialog.__init__): Add controls
5469     to allow the user to fix line color/width on generated groups.
5470     (ClassGenDialog.OnOK): Use new 'fixes' parameter of the generate_*
5471     functions to optionally fix group properties.
5472    
5473     * Thuban/UI/main.py (main): Set exception hook to the
5474     ShowExceptionDialog. Fixes RTbug #1993.
5475    
5476     * Thuban/UI/mainwindow.py (MainWindow.ShowTableView): Raise
5477     the table window when it is selectd to be shown.
5478    
5479     * Thuban/UI/tableview.py (QueryTableFrame.__init__): Add an
5480     Export Selection button and move the export buttons underneath
5481     the table.
5482     (QueryTableFrame.UpdateStatusText): Added event argument so
5483     that it can respond to grid selection events. The status text
5484     is now updated even when the table is not associated with a
5485     layer as was previously assumed.
5486     (QueryTableFrame.OnGridSelectRange, OnGridSelectCell): Removed.
5487     UpdateStatusText responds to these events.
5488     (QueryTableFrame.OnSaveAs): Renamed to doExport.
5489     (QueryTableFrame.doExport): Helper function that saves the
5490     entire table, or selected rows, to a file.
5491     (QueryTableFrame.OnExport, QueryTableFrame.OnExportSel): New.
5492     Respond to export button events and call doExport.
5493    
5494     * extensions/thuban/gdalwarp.cpp (ProjectRasterFile): Make sure
5495     the function doesn't return NULL without first setting a Python
5496     Error.
5497    
5498     * test/runtests.py (main): Only print "Unknown option" for
5499     unsupported options.
5500    
5501     * test/support.py (FloatComparisonMixin.assertFloatEqual): Take
5502     optional epsilon argument to specify floating point accuracy.
5503     (FloatComparisonMixin.assertFloatSeqEqual): Call assertFloatEqual
5504     for each item test.
5505    
5506     * test/test_csv_table.py (TestCSVTable.test_table_to_cvs): Add
5507     tests for saving selected records.
5508    
5509     * test/test_dbf_table.py (TestTableToDBF.test_table_to_dbf): Add
5510     tests for saving selected records.
5511    
5512     * test/test_map.py (TestMapWithContents.test_set_projection):
5513     MAP_PROJECTION_CHANGED events send the old projection.
5514    
5515     * test/test_session.py
5516     (TestSessionWithContent.test_forward_map_projection):
5517     MAP_PROJECTION_CHANGED events send the old projection.
5518    
5519     * test/test_table.py (TableTest): Update tests to use non-deprecated
5520     functions.
5521    
5522 bh 1376 2003-07-08 Bernhard Herzog <[email protected]>
5523    
5524 bh 1382 * Thuban/Model/transientdb.py (TransientTableBase.Width): The type
5525     constants in the column objects are the standard ones defined in
5526     the table module.
5527    
5528     * test/test_transientdb.py
5529     (TestTransientTable.test_transienttable_to_dbf): New. Test whether
5530     exporting transient tables as DBF works. This should catch the bug
5531     just fixed in TransientTableBase.Width.
5532    
5533     2003-07-08 Bernhard Herzog <[email protected]>
5534    
5535 bh 1380 * Thuban/Model/classgen.py (CustomRamp.GetProperties): Compute the
5536     interpolated colors correctly.
5537    
5538     * test/test_classgen.py (TestCustomRamp.test_color_interpolation):
5539     New. Test case for the fix in classgen.py
5540    
5541     2003-07-08 Bernhard Herzog <[email protected]>
5542    
5543 bh 1378 * test/runtests.py (main): Make the default output less verbose
5544     and add a verbosity option (-v) to get the old output
5545    
5546     2003-07-08 Bernhard Herzog <[email protected]>
5547    
5548 bh 1376 * Resources/XML/thuban-0.9.dtd: New. This will become the DTD for
5549     0.9.
5550    
5551     * Thuban/Model/transientdb.py (TransientJoinedTable.JoinType):
5552     New. Return the join type
5553    
5554     * Thuban/Model/save.py (SessionSaver.write_session): Use new 0.9
5555     DTD
5556     (SessionSaver.write_data_containers): Save the join type for
5557     joined tables
5558    
5559     * Thuban/Model/load.py (SessionLoader.__init__): Add the new 0.9
5560     namespace
5561     (SessionLoader.start_jointable): Handle the jointype attribute
5562    
5563     * test/test_load_0_8.py: New. Effectively a copy of test_load.py
5564     as of Thuban 0.8. These are now tests to determine whether Thuban
5565     can still read files generated by Thuban 0.8
5566    
5567     * test/test_load.py (LoadSessionTest.dtd)
5568     (TestSingleLayer.file_contents)
5569     (TestLayerVisibility.file_contents, TestLabels.file_contents)
5570     (TestLayerProjection.file_contents)
5571     (TestRasterLayer.file_contents, TestJoinedTable.file_contents)
5572     (TestJoinedTable.file_contents)
5573     (TestLoadError.file_contents): Update for new DTD
5574     (TestJoinedTable.file_contents, TestJoinedTable.setUp): Add test
5575     for new join type attribute
5576    
5577     * test/test_save.py (SaveSessionTest.dtd)
5578     (SaveSessionTest.testEmptySession)
5579     (SaveSessionTest.testSingleLayer)
5580     (SaveSessionTest.testLayerProjection)
5581     (SaveSessionTest.testRasterLayer)
5582     (SaveSessionTest.testClassifiedLayer)
5583     (SaveSessionTest.test_dbf_table)
5584     (SaveSessionTest.test_joined_table): Update for new DTD
5585     (SaveSessionTest.test_joined_table): Add test for new join type
5586     attribute
5587    
5588 bh 1372 2003-07-04 Bernhard Herzog <[email protected]>
5589    
5590     * Thuban/Model/table.py (_find_dbf_column_names): New. Helper
5591     function for table_to_dbf
5592     (table_to_dbf): Deal with names longer than the 10 character limit
5593    
5594     * test/test_dbf_table.py (TestTableToDBF.test_table_to_dbf): Add
5595     doc-string
5596     (TestTableToDBF.test_table_to_dbf_long_col_names): New test for
5597     long column names
5598    
5599 bh 1365 2003-07-03 Bernhard Herzog <[email protected]>
5600    
5601 bh 1370 * Doc/manual/thuban-manual.xml: Fix the CVS Revision Tag syntax
5602    
5603     2003-07-03 Bernhard Herzog <[email protected]>
5604    
5605 bh 1368 * Doc/manual/thuban-manual.xml, Doc/manual/README: New. Skeleton
5606     for the Thuban manual and README with some basic information about
5607     the manual
5608    
5609     2003-07-03 Bernhard Herzog <[email protected]>
5610    
5611 bh 1365 * Thuban/Model/transientdb.py (TransientJoinedTable.__init__):
5612     Update doc-string
5613     (TransientJoinedTable.create): Do not modify the column objects of
5614     the input tables in place and copy all columns of the input tables
5615     into the joined table after all.
5616    
5617     * test/test_transientdb.py
5618     (TestTransientTable.test_transient_joined_table_same_column_name):
5619     Update to reflect the new behavior
5620     (TestTransientTable.test_transient_joined_table_with_equal_column_names):
5621     Update to reflect the new behavior
5622     (TestTransientTable.test_transient_joined_table_name_collisions_dont_modify_in_place):
5623     New test case for a bug which modified the column objects in place
5624    
5625 jonathan 1360 2003-07-02 Jonathan Coles <[email protected]>
5626 jonathan 1349
5627 jonathan 1360 * Thuban/Model/classgen.py (generate_singletons,
5628     generate_uniform_distribution, generate_quantiles,
5629 jonathan 1363 GenQuantiles0): Make sure maxValue isn't less than
5630     one, otherwise we could divide by zero.
5631    
5632     * test/test_classgen.py (ClassGenTest.doClassRangeTest,
5633     ClassGenTest.doClassSingleTest): Call doBoundsTest to
5634     check the end classification groups against the
5635     proper property values.
5636     (ClassGenTest.doBoundsTest): New. Checks the first and
5637     last classification groups to make sure their properties
5638     are the correct upper and lower bounds for a color ramp.
5639    
5640     2003-07-02 Jonathan Coles <[email protected]>
5641    
5642     * Thuban/Model/classgen.py (generate_singletons,
5643     generate_uniform_distribution, generate_quantiles,
5644 jonathan 1360 GenQuantiles0): The denominator was one to high when
5645     calculating the index for the ramp causing the index
5646     to never to reach one.
5647    
5648     2003-07-02 Jonathan Coles <[email protected]>
5649    
5650 jonathan 1358 Changed the singature of ClassGroupRange.__init__ and
5651     ClassGroupRange.SetRange() so that the min/max values are
5652     passed as a tuple. This makes a better calling scheme for
5653     when a Range object is passed instead.
5654    
5655     * Thuban/Model/classgen.py: Fixed parameters to
5656     ClassGroupRange constructor.
5657    
5658     * Thuban/Model/classification.py (ClassGroupRange.__init__):
5659     Consolidate the min/max parameters into a single _range which
5660     can either be a tuple or a Range object.
5661     (ClassGroupRange.SetRange): Consolidate the min/max parameters
5662     into a single _range which can either be a tuple or a Range object.
5663    
5664     * Thuban/Model/load.py (SessionLoader.start_clrange): Fix
5665     call to ClassGroupRange constructor to use a tuple.
5666    
5667     * Thuban/Model/layer.py (Layer.SetClassification): Switch
5668     the classification instance variable to the new class
5669     before calling _set_layer otherwise subscribers to a
5670     LAYER_CHANGED event will not see any difference.
5671    
5672     * test/test_classification.py: Fix tests of ClassGroupRange
5673     so that they use the new signature.
5674    
5675     * test/test_load.py: Fix use of ClassGroupRange so that it
5676     uses the new signature.
5677    
5678     * test/test_load_0_2.py: Fix use of ClassGroupRange so that it
5679     uses the new signature.
5680    
5681     * test/test_save.py: Fix use of ClassGroupRange so that it
5682     uses the new signature.
5683    
5684    
5685     2003-07-01 Jonathan Coles <[email protected]>
5686    
5687 jonathan 1349 * Thuban/Model/classgen.py: Fixes RTbug #1972, 1971.
5688     Import used objects/class from color.
5689     (generate_singletons): We don't
5690     need the numGroups parameter anymore because we are using
5691     the new ramps with GetProperties().
5692     (generate_uniform_distribution): Use new ramp method
5693     GetProperties().
5694     (generate_quantiles, GenQuantiles0): Use new ramp method
5695     GetProperties().
5696     (CustomRamp.SetNumGroups): Removed. The ramps now map
5697     a value from 0 to 1 to class properties so the number
5698     of groups is not needed ahead of time.
5699     (CustomRamp.next): Removed. CustomRamp does not support
5700     interation anymore.
5701     (CustomRamp.GetProperties): Returns a ClassGroupProperties
5702     object based on the index value from 0 to 1 that is
5703     passed to it.
5704     (GreyRamp, RedRamp, GreenRamp, BlueRamp, GreenToRedRamp):
5705     Made into instances of Monochromatic class instread of
5706     deriving from it.
5707     (HotToCold.SetNumGroups): Removed. See CustomRamp.
5708     (HotToCold.next): Removed. See CustomRamp.
5709    
5710     * Thuban/Model/classification.py: Fixes RTbug #1973, 1971.
5711     (Classification.SetField, Classification.SetFieldType):
5712     Replaced with SetFieldInfo.
5713     (Classification.SetFieldInfo): New. Does a better job of
5714     what SetField and SetFieldType used to do by combining
5715     their function since they should really always be done
5716     at the same time.
5717     (Classification.SetLayer): Renamed to _set_layer.
5718     (Classification._set_layer): Should only be called from
5719     Layer's SetClassification. This does not cause a recursive
5720     call as SetLayer did because we know that Layer knows about
5721     the classification.
5722    
5723     * Thuban/Model/color.py: Fixes RTbug #1971.
5724     (_Transparent): Renamed from Transparent so it doesn't
5725     conflict with the module variable.
5726     (Transparent, Black): Renamed from Color.Transparent,
5727     Color.Black so they are not class variables.
5728    
5729     * Thuban/Model/layer.py: Fixes RTbug #1971, 1973.
5730     (Layer.Destroy): We don't need to call SetClassification
5731     anymore to clear out the back reference in the classifcation
5732     to the layer. It's better to set it to None using _set_layer,
5733     and we won't be creating another clas object too.
5734     (Layer.SetClassification): Classification._set_layer is not
5735     recursive so remove all the locking variables. Also clean
5736     up the code so that it remains unchanged if something fails.
5737    
5738     * Thuban/Model/load.py: Fixes RTbug #1971.
5739     (SessionLoader.start_classification): Call
5740     Classification.SetFieldInfo().
5741    
5742     * Thuban/Model/save.py: Removed import of Color which wasn't
5743     being used.
5744    
5745     * Thuban/UI/classgen.py: Fixes RTbug #1972.
5746     (ClassGenDialog.__init__): Color ramps are now instances
5747     already so we don't need to create any new objects.
5748     (ClassGenDialog.OnOK): Check for numGroups is no longer
5749     necessary because we never use it.
5750    
5751     * Thuban/UI/classifier.py: Fixes RTbug #1971.
5752     (Classifier.__BuildClassification, Classifier.__SetGridTable):
5753     Call Classification.SetFieldInfo() instead of SetFieldType.
5754    
5755     * Thuban/UI/renderer.py: Fixes RTbug #1971.
5756    
5757     * Thuban/UI/view.py: Fixes RTbug #1974, 1971.
5758     (MapCanvas.__init__): Subscribe to the idle time event. Set
5759     background color to white.
5760     (MapCanvas.OnPaint): Set a flag indicating that we should
5761     render the map during idle time. If we already have a bitmap
5762     just draw it now.
5763     (MapCanvas.OnIdle): New. Render the map only during idle time.
5764     This also fixes a problem with the busy cursor under gtk.
5765    
5766     * test/test_classgen.py (ClassGenTest.test_generate_singletons):
5767     Fix calls to generate_singletons because the signature changed.
5768    
5769     * test/test_classification.py: Fix color references and
5770     change calls to Classification.[SetField|SetFieldType] to
5771     SetFieldInfo.
5772    
5773     * test/test_load.py: Fix color references.
5774    
5775     * test/test_load_0_2.py: Fix color references.
5776    
5777     * test/test_save.py (SaveSessionTest.testClassifiedLayer):
5778     Change calls to Classification.[SetField|SetFieldType] to
5779     SetFieldInfo.
5780    
5781 frank 1334 2003-07-01 Frank Koormann <[email protected]>
5782    
5783     MERGE from the greater-ms3 branch.
5784    
5785     * test/test_transientdb.py
5786     (TestTransientTable.test_transient_joined_table_with_equal_column_names):
5787     New. Test join of two tables with partly equal column names.
5788    
5789     * Thuban/Model/transientdb.py (TransientJoinedTable.create):
5790     If duplicates in left and right tables column names are found,
5791     append '_' (underscores) to the name until it is unique.
5792     Create always new internal names for the resulting table and reference
5793     columns in the join statement with <table>.<column>
5794    
5795 bh 1329 2003-07-01 Bernhard Herzog <[email protected]>
5796    
5797     * test/test_transientdb.py
5798     (TestTransientTable.test_transient_joined_table_same_column_name):
5799     New. Test whether joining on columns with the same names in both
5800     tables works.
5801 frank 1334
5802 bh 1329 * Thuban/Model/transientdb.py (TransientJoinedTable.create): Make
5803     sure to use the right internal names even when joining on field
5804     with the same names in both tables. Also, detect duplicate names
5805     in the joined table correctly.
5806    
5807 frank 1325 2003-07-01 Frank Koormann <[email protected]>
5808    
5809     * Thuban/UI/renderer.py (ExportRenderer.render_legend):
5810     Reverse List of layers to render in same order as in desktop legend.
5811    
5812 jonathan 1318 2003-06-30 Jonathan Coles <[email protected]>
5813    
5814 jonathan 1349 * Thuban/version.py (make_tuple): Takes a version string
5815     and splits it into a tuple of at most three integers.
5816     Used make_tuple() to make tuple versions of the version
5817     numbers.
5818    
5819     * Thuban/UI/about.py: Add Thuban email addresses.
5820    
5821     2003-06-30 Jonathan Coles <[email protected]>
5822    
5823 jonathan 1320 * Thuban/version.py: SQLite/PySQLite version dependencies
5824     were too high.
5825    
5826     2003-06-30 Jonathan Coles <[email protected]>
5827    
5828 jonathan 1318 * Thuban/version.py: Update version to 0.8.1
5829    
5830     * MANIFEST.in: Added Projections so that default.proj is
5831     included.
5832    
5833 jonathan 1312 2003-06-26 Jonathan Coles <[email protected]>
5834    
5835     New About box with lots more information including library
5836     versions and credits. More/better version checking before
5837     Thuban starts.
5838    
5839     * Thuban/UI/about.py: New. New About box that displays
5840     library version information and credits.
5841    
5842     * Thuban/version.py: Added new 'versions' dictionary which
5843     contains the verions of various libraries which are checked
5844     when the module loads.
5845     (verify_versions): Check all version numbers and returns
5846     a list of errors.
5847    
5848     * Thuban/UI/classifier.py (Classifier.__EnableButtons):
5849     Reset the status of the buttons as the situation warrants,
5850     but in a better more reliable way by not relying on the
5851     current status to determine what needs to change.
5852    
5853     * Thuban/UI/main.py (wxCHECK_VERSION): Removed. Not needed.
5854     (verify_versions): Remove most of the code since it is
5855     now in Thuban.version.verify_versions.o
5856    
5857     * Thuban/UI/mainwindow.py (MainWindow.About): Call new
5858     About box in Thuban.UI.about.
5859    
5860     * extensions/thuban/gdalwarp.cpp (get_gdal_version): New.
5861     Returns the version of gdal library being used as a string.
5862    
5863     * extensions/thuban/wxproj.cpp (check_version, check_version_gtk):
5864     Removed.
5865     (get_proj_version): Return the version of PROJ that the file
5866     was compiled with.
5867     (get_gtk_version): Return th version of GTK that the file
5868     was compiled with.
5869    
5870 jonathan 1304 2003-06-25 Jonathan Coles <[email protected]>
5871    
5872     * Thuban/UI/classifier.py (Classifier.EditSymbol): The parent
5873     of the SelectPropertiesDialog should be self so the window
5874     appears on top.
5875     (ClassGroupPropertiesCtrl.DoEdit): The parent
5876     of the SelectPropertiesDialog should be self so the window
5877     appears on top.
5878    
5879     * Thuban/UI/resource.py: Cleaned up how we determine file
5880     extensions.
5881     (GetImageResource): Return an wxImage from our Resources.
5882    
5883 jonathan 1299 2003-06-24 Jonathan Coles <[email protected]>
5884    
5885     * Thuban/UI/renderer.py (ExportRenderer.render_legend):
5886     Check that a layer has a classification before trying
5887     to get it. Raster layers don't have classifications.
5888    
5889 jonathan 1286 2003-06-23 Jonathan Coles <[email protected]>
5890 jonathan 1297
5891     * setup.py: Add Resources/XML to resource list.
5892    
5893     2003-06-23 Jonathan Coles <[email protected]>
5894 jonathan 1286
5895 jonathan 1297 * setup.cfg: Fix copyright dates
5896    
5897     2003-06-23 Jonathan Coles <[email protected]>
5898    
5899 jonathan 1294 * MANIFEST.in: Update with Resources/XML
5900    
5901     * setup.py: Don't include Locale resources yet as we don't
5902     have any and it causes problems building the distribution
5903     for Windows. Update version to 0.8.0.
5904    
5905     * Doc/thuban.dtd: Removed since it is now in Resources/XML.
5906    
5907     * Thuban/UI/mainwindow.py: Add blank line at the end because
5908     file was not being read correctly building the Windows
5909     distribution.
5910    
5911     2003-06-23 Jonathan Coles <[email protected]>
5912    
5913 jonathan 1289 * Thuban/UI/mainwindow.py (MainWindow.About): Fix text.
5914    
5915     * Thuban/version.py: Temporarily update longversion for
5916     the 0.8 release so that it doesn't have the cvs revision.
5917    
5918     2003-06-23 Jonathan Coles <[email protected]>
5919    
5920 jonathan 1286 * Thuban/UI/common.py (ThubanBeginBusyCursor): Call wxSafeYield
5921     to make sure that we don't create reentrant possibilities with
5922     wxYield.
5923    
5924     * Thuban/UI/view.py (MapCanvas.OnPaint): Call wxBeginBusyCursor()
5925     directly to avoid the wxSafeYield() call which generates an
5926     OnPaint event causing infinite recursion. Don't try to catch
5927     exception anymore. This was for before there were limits on map
5928     scaling.
5929    
5930 bh 1283 2003-06-23 Bernhard Herzog <[email protected]>
5931    
5932     Bug fix for RT #1961:
5933    
5934     * Thuban/Model/load.py (SessionLoader.start_derivedshapesource):
5935     Register DerivedShapestores with the session
5936    
5937     * Thuban/Model/session.py (Session.Tables): Make sure each table
5938     is only listed once.
5939    
5940     * test/test_load.py (TestJoinedTable.test): Add check_format call.
5941     Update file contents to match the one written out.
5942    
5943 bh 1281 2003-06-20 Bernhard Herzog <[email protected]>
5944    
5945     * test/xmlsupport.py (SaxEventLister.startElementNS)
5946     (SaxEventLister.endElementNS): Do not include the qname. Python
5947     2.2.1 and 2.2.2 and 2.2.3 differ in this regard. In 2.2.1 qname it
5948     is (presumably incorrectly) None, whereas it's a string with the
5949     element name in the later versions.
5950    
5951     * test/test_xmlsupport.py (TestEventList.test_even_list_simple)
5952     (TestEventList.test_even_list_namespace): Update tests to reflect
5953     the new behaviour
5954     (TestEventList.test_even_list_id_normalization): Fix doc-string
5955    
5956 jonathan 1272 2003-06-20 Jonathan Coles <[email protected]>
5957    
5958 jonathan 1279 * Thuban/Model/layer.py (BaseLayer.HasShapes): New. Overridden
5959     by deriving classes to determine if that layer supports shapes.
5960     (Layer): Override HasShapes and return true.
5961    
5962     * Thuban/UI/classgen.py: Use Thuban[Begin|End]BusyCursor()
5963     instead of a direct call to wx[Begin|End]CusyCursor().
5964     (GenUniquePanel._OnRetrieve): Set busy cursor while retrieving
5965     table data.
5966    
5967     * Thuban/UI/common.py (ThubanBeginBusyCursor, ThubanEndBusyCursor):
5968     New. Wrappers around the wxWindows functions that allow us to
5969     make additional calls such as wxYield which gives the native
5970     system a chance to update the cursor correctly.
5971    
5972     * Thuban/UI/tableview.py: Use Thuban[Begin|End]BusyCursor()
5973     instead of a direct call to wx[Begin|End]CusyCursor().
5974    
5975     * Thuban/UI/view.py: Use Thuban[Begin|End]BusyCursor()
5976     instead of a direct call to wx[Begin|End]CusyCursor().
5977     (MapCanvas.find_shape_at): Check if the current search layer
5978     support shapes, otherwise go on to the next layer.
5979    
5980     * test/test_layer.py: Add tests in each type of layer for
5981     HasClassification() and HasShapes()
5982    
5983     2003-06-20 Jonathan Coles <[email protected]>
5984    
5985 jonathan 1272 * Thuban/UI/view.py (MapCanvas.OnPaint): Call wxYield after
5986     turning on the busy cursor to allow the system to change the
5987     cursor before we begin painting. This fixes a problem that
5988     was occuring only under GTK. Fixes RTbug #1840.
5989    
5990 bh 1270 2003-06-20 Bernhard Herzog <[email protected]>
5991    
5992     * Resources/XML/thuban-0.8.dtd: New DTD for the new file format
5993     version.
5994    
5995     * Thuban/Model/save.py (sort_data_stores): New. Make topological
5996     sort of the data sources so they can be written with sources that
5997     data sources that depend on other data sources come after the
5998     sources they depend on.
5999     (SessionSaver.__init__): Add idmap instance variable to map from
6000     objects to the ids used in the file.
6001     (SessionSaver.get_id, SessionSaver.define_id)
6002     (SessionSaver.has_id): New. Methods to manage the idmap
6003     (SessionSaver.write): Use thuban-0.8.dtd
6004     (SessionSaver.write_session): Add a namespace on the session and
6005     write out the data sources before the maps.
6006     (SessionSaver.write_data_containers): New. Write the data
6007     containers.
6008     (SessionSaver.write_layer): Layer elements now refer to a
6009     shapestore and don't contain filenames anymore.
6010    
6011     * Thuban/Model/load.py (LoadError): Exception class to raise when
6012     errors in the files are discovered
6013     (SessionLoader.__init__): Define dispatchers for elements with a
6014     thuban-0.8 namespace too.
6015     (SessionLoader.check_attrs): New helper method to check and
6016     convert attributes
6017     (AttrDesc): New. Helper class for SessionLoader.check_attrs
6018     (SessionLoader.start_fileshapesource)
6019     (SessionLoader.start_derivedshapesource)
6020     (SessionLoader.start_filetable, SessionLoader.start_jointable):
6021     Handlers for the new elements in the new fileformat
6022     (SessionLoader.start_layer): Handle the shapestore attribute in
6023     addition to filename.
6024     (SessionLoader.start_table, SessionLoader.end_table): Removed.
6025     They were never used in the old formats and aren't needed for the
6026     new.
6027    
6028     * Thuban/Model/session.py (Session.DataContainers): New method to
6029     return all "data containers", i.e. shapestores and tables
6030    
6031     * test/xmlsupport.py (SaxEventLister.__init__)
6032     (SaxEventLister.startElementNS, sax_eventlist): Add support to
6033     normalize IDs.
6034    
6035     * test/test_xmlsupport.py
6036     (TestEventList.test_even_list_id_normalization): New test case for
6037     id normalization
6038    
6039     * test/test_load.py (LoadSessionTest.check_format): Use ID
6040     normalization
6041     (LoadSessionTest.thubanids, LoadSessionTest.thubanidrefs): New
6042     class atrributes used for ID normalization
6043     (TestSingleLayer, TestLayerVisibility, TestLabels.test)
6044     (TestLayerProjection.test, TestRasterLayer.test): Adapt to new
6045     file format
6046     (TestJoinedTable): New test for loading sessions with joined
6047     tables.
6048     (TestLoadError): New. Test whether missing required attributes
6049     cause a LoadError.
6050    
6051     * test/test_save.py (SaveSessionTest.thubanids)
6052     (SaveSessionTest.thubanidrefs): New class attributes for ID
6053     normalization in .thuban files.
6054     (SaveSessionTest.compare_xml): Use id-normalization.
6055     (SaveSessionTest.testEmptySession)
6056     (SaveSessionTest.testLayerProjection)
6057     (SaveSessionTest.testRasterLayer)
6058     (SaveSessionTest.testClassifiedLayer): Adapt to new file format.
6059     (SaveSessionTest.testLayerProjection): The filename used was the
6060     same as for testSingleLayer. Use a different one.
6061     (SaveSessionTest.test_dbf_table)
6062     (SaveSessionTest.test_joined_table): New test cases for saving the
6063     new data sources structures.
6064     (TestStoreSort, MockDataStore): Classes to test the sorting of the
6065     data stores for writing.
6066    
6067     * test/runtests.py: Add CVS keywords
6068    
6069 jonathan 1265 2003-06-20 Jonathan Coles <[email protected]>
6070    
6071 jonathan 1267 * test/test_session.py
6072     (UnreferencedTablesTests.test_unreferenced_tables_with_joins):
6073     Use the cultural_landmark-point.dbf file for the store so that
6074     the table rows and shape count match.
6075    
6076     2003-06-20 Jonathan Coles <[email protected]>
6077    
6078 jonathan 1265 * Thuban/Model/data.py (DerivedShapeStore.__init__): Raise
6079     an exception if the number of shapes is different from the
6080     number of rows in the table. Address RTbug #1933.
6081    
6082     * test/test_layer.py (TestLayer.test_derived_store): Add
6083     a test for the new exception in DerivedShapeStore.__init__.
6084    
6085     * test/support.py (FloatTestCase): Removed since there is
6086     already FloatComparisonMixin. Fixes RTbug #1954.
6087     (FloatComparisonMixin.assertFloatEqual): Include test for
6088     infinity that was part of FloatTestCase.
6089    
6090     * test/test_range.py (RangeTest): Inherit from
6091     support.FloatComparisonMixin now that we don't have
6092     support.FloatTestCase.
6093    
6094 bh 1256 2003-06-20 Bernhard Herzog <[email protected]>
6095    
6096 bh 1260 * test/test_save.py (SaxEventLister, sax_eventlist): Removed. Use
6097     the implementation in xmlsupport instead.
6098     (SaveSessionTest.compare_xml): sax_eventlist is now in xmlsupport
6099    
6100     * test/test_proj.py: Import sax_eventlist from xmlsupport instead
6101     of test_save
6102    
6103     2003-06-20 Bernhard Herzog <[email protected]>
6104    
6105 bh 1258 * test/test_load.py (LoadSessionTest.check_format): New helper
6106     method to make sure the test files we load might have been written
6107     by the current thuban version.
6108     (ClassificationTest.TestLayers, TestSingleLayer.test)
6109     (TestLayerVisibility.test, TestClassification.test)
6110     (TestLabels.test, TestLayerProjection.test, TestRasterLayer.test):
6111     Add check_format() calls and fix the thuban data to match the data
6112     that would be written by saving the session loaded from it.
6113    
6114     * test/xmlsupport.py (SaxEventLister, sax_eventlist): Copies of
6115     the same class and function in test_save.
6116    
6117     * test/test_xmlsupport.py (TestEventList): New. test cases for
6118     sax_eventlist
6119    
6120     2003-06-20 Bernhard Herzog <[email protected]>
6121    
6122 bh 1256 * Resources/XML/thuban.dtd: Add comment about which versions of
6123     Thuban are covered by this DTD
6124     (map): Fix content model for layers and raster layers. There can
6125     be any number or layers and raster layers in any order.
6126    
6127 jonathan 1254 2003-06-20 Jonathan Coles <[email protected]>
6128    
6129 jonathan 1265 This is mainly about fixing RTbug #1949.
6130    
6131 jonathan 1254 * Thuban/Model/classification.py: Remove "from __future__"
6132     import statement since python 2.2 is the earliest supported
6133     version.
6134    
6135     * Thuban/Model/proj.py (Projection.GetProjectedUnits): New.
6136     Currently returns PROJ_UNITS_METERS or PROJ_UNITS_DEGREES
6137     depending on the units this projection *forwards* into.
6138    
6139     * Thuban/Model/save.py (SessionSaver.write_classification):
6140     Remove unnecessary use of lambdas and nested functions.
6141    
6142     * Thuban/UI/legend.py (ScaleBarBitmap.__SetScale): Do scale
6143     adjustment here if the map projection uses degrees.
6144    
6145     * Thuban/UI/scalebar.py (ScaleBar.DrawScaleBar): Remove
6146     scale adjust code since it is now done before calling
6147     this method. Don't do anything if the map projection
6148     is None.
6149    
6150 bh 1244 2003-06-19 Bernhard Herzog <[email protected]>
6151    
6152 bh 1248 Move version specific load tests to their own file.
6153    
6154     * test/test_load.py: Expand the doc-string to explain a bit how to
6155     handle file format changes.
6156     (TestClassification.test): Update the docstring as this test is
6157     not about Thuban 0.2 anymore.
6158    
6159     * test/test_load_0_2.py: New file with the load tests for thuban
6160     files created with Thuban 0.2 and earlier.
6161    
6162     2003-06-19 Bernhard Herzog <[email protected]>
6163    
6164 bh 1246 Add XML validation to some of the tests. Validation will only be
6165     done if pyRXP is installed (http://reportlab.com/xml/pyrxp.html).
6166     To make the DTD available to the test cases it's moved into
6167     Resources/XML
6168    
6169     * Resources/XML/thuban.dtd: New. This is now the real Thuban DTD
6170     for versions up to and including 0.2. Two slight changes: added an
6171     encoding specification and fixed the comment which refered to
6172     GRASS, not Thuban
6173    
6174     * test/xmlsupport.py: New support module for tests involving XML.
6175     Currently there's a mix-in class for XML validation.
6176    
6177     * test/test_xmlsupport.py: New. Tests for the xmlsupport module
6178    
6179     * test/test_save.py (SaveSessionTest): Derive from ValidationTest
6180     so that we can validate the
6181     (SaveSessionTest.testEmptySession)
6182     (SaveSessionTest.testSingleLayer)
6183     (SaveSessionTest.testSingleLayer)
6184     (SaveSessionTest.testLayerProjection)
6185     (SaveSessionTest.testRasterLayer)
6186     (SaveSessionTest.testClassifiedLayer): Validate the generated XML
6187    
6188     * test/runtests.py (main): Call print_additional_summary instead
6189     of print_garbage_information
6190    
6191     * test/support.py (resource_dir): New function to return the
6192     "Resource" subdirectory
6193     (print_additional_summary): New function to combine several
6194     summary functions
6195     (run_tests): Use print_additional_summary instead of calling
6196     print_garbage_information directly
6197    
6198     2003-06-19 Bernhard Herzog <[email protected]>
6199    
6200 bh 1244 * Doc/thuban.dtd (classification): Correct the content model of
6201     the classification element.
6202     (projection): Add the "name" attribute
6203    
6204 frank 1242 2003-06-19 Frank Koormann <[email protected]>
6205    
6206     MERGE from the greater-ms3 branch.
6207    
6208     * Thuban/UI/scalebar.py (ScaleBar.DrawScaleBar): Apply conversion to
6209     scale if projection is latlong to get better estimate.
6210    
6211     Fix problem of hidden properties dialog under windows after double
6212     click on layer tree:
6213     The tree control always gets an Expanded / Collapsed event after
6214 joey 2162 the ItemActivated on double click, which raises the main window again.
6215     We add a second ItemActivated event to the queue, which simply
6216 frank 1242 raises the already displayed window.
6217    
6218     * Thuban/UI/legend.py (LegendTree.__init__): Instance variable
6219     raiseProperties initialized to prevent endless loops
6220     (LegendTree._OnItemActivated): Depending on self.raiseProperties
6221     simply raise the properties or open the dialog and issue a second
6222     event.
6223    
6224 jonathan 1235 2003-06-18 Jonathan Coles <[email protected]>
6225    
6226 jonathan 1239 * setup.py: Fix a few problems that occured under Windows.
6227    
6228     2003-06-18 Jonathan Coles <[email protected]>
6229    
6230 jonathan 1235 When Thuban loaded the map was redrawn twice because the
6231     legend was being opened after the mainwindow was created
6232     and not during its creation. This meant the map was drawn
6233     initially and then had to be redrawn when the legend
6234     caused the display to change. Now the legend is opened
6235     in the mainwindow constructor which resolves this issue.
6236    
6237     Also, although we were checking for the existence of
6238     gdal and gdalwarp modules, the gdalwarp extension was
6239     still being compiled (which may fail if the system doesn't
6240     have gdal installed). the build_ext command to setup.py
6241     now accepts the flags --with-gdal and --without-gdal.
6242     If --without-gdal is specified setup.py will try to
6243     use the gdal parameters specified by gdal-config. Under
6244     windows, those parameters have to be set in setup.py
6245     as with proj4 an wxWindows.
6246    
6247     * setup.py: Use a list instead of seperate variables for
6248     extension parameters so we can create a generic function
6249     that runs an appropriate *-config script.
6250     (run_cs_script): Renamed from run_wx_script and modified
6251     to accept a second argument which is a list of lists to
6252     be filled in by the values returned from running the command.
6253     (thuban_build_ext): New. Extends the build_ext command and
6254     provides the options --with-gdal/--without-gdal which then
6255     optionally includes the gdalwarp extension.
6256    
6257     * Thuban/Model/resource.py: First check if we can import
6258     the gdalwarp Thuban extension before checking for gdal.
6259     Also added some comments.
6260    
6261     * Thuban/UI/legend.py (ScaleBarBitmap.__SetScale): Check if
6262     the map is None which may be the case if none has been loaded
6263     yet.
6264    
6265     * Thuban/UI/main.py (main): Remove call to ShowLegend.
6266    
6267     * Thuban/UI/mainwindow.py (MainWindow.__init__): Call ShowLegend().
6268    
6269     * Thuban/UI/renderer.py: Check for gdal support before importing
6270     gdalwarp.
6271     (MapRenderer.render_map): Only try to optimize if we have gdal
6272     support otherwise nothing will get drawn.
6273    
6274 jonathan 1237 * Thuban/UI/view.py (MapCanvas.FitMapToWindow): This may be called
6275     during startup before a map has been created. Check if map is None
6276     before using it and do nothing if it is.
6277    
6278 jonathan 1224 2003-06-17 Jonathan Coles <[email protected]>
6279    
6280     Fix the problem with raster layers under Windows that caused
6281     Thuban to crash. The view should respond to layer projection
6282     changed events to update the display. Changes to a projection
6283     should not cause the map to be set to full extent.
6284    
6285     * Thuban/UI/view.py (MapCanvas.__init__): New instance variable
6286     current_map_proj to remember the current map projection so that
6287     when the projection changes we know what the previous projection
6288     was.
6289     (MapCanvas.SetMap): Unsubscribe and subscribe to
6290     LAYER_PROJECTION_CHANGED events.
6291     (MapCanvas.projection_changed): Split into two methods that respond
6292     to map and layer projection changes.
6293     (MapCanvas.map_projection_changed): New. Takes the current view and
6294     projects it using the new projection. This does not cause the
6295     map to be redrawn at full extent.
6296     (MapCanvas.layer_projection_changed): New. Cause a redraw which
6297     will draw each layer in its new projection.
6298    
6299     * extensions/thuban/bmpdataset.cpp (BMPDataset::Open): Call
6300     VSIFClose() not VSIFCloseL() to close the file. Fixes a crash
6301     under Windows.
6302    
6303     * extensions/thuban/gdalwarp.cpp (MFILENAME): Padding should be
6304     to twice sizeof(void*) because there are two digits for each
6305     hex byte.
6306    
6307 bh 1220 2003-06-16 Bernhard Herzog <[email protected]>
6308    
6309     Update to the layer interface: Direct access to the table,
6310     shapetable, shapefile and filename attributes is now actively
6311     deprecated by issuing deprecation warnings for all places where
6312     this happens.
6313    
6314     * Thuban/Model/layer.py (Layer.__getattr__): New. Implement access
6315     to the instance variables table, shapetable, shapefile and
6316     filename via __getattr__ so that we can issue a deprecation
6317     warning.
6318     (Layer.SetShapeStore): Don't set the deprecated instance variables
6319     any more
6320     (Layer.SetShapeStore): Don't use deprecated layer instance
6321     variables
6322     (Layer.Destroy): No need to explicitly remove the instance
6323     variables any more
6324     (Layer.GetFieldType, Layer.Shape): Don't use deprecated layer
6325     instance variables
6326    
6327     * Thuban/UI/classgen.py (ClassGenDialog.__init__)
6328     (GenUniformPanel._OnRetrieve, GenUniquePanel._OnRetrieve)
6329     (GenQuantilesPanel.GetList, GenQuantilesPanel.OnRetrieve): Don't
6330     use deprecated layer instance variables
6331    
6332     * Thuban/UI/classifier.py (Classifier.__init__): Don't use
6333     deprecated layer instance variables
6334    
6335     * Thuban/UI/identifyview.py (IdentifyListCtrl.selected_shape)
6336     (IdentifyGridCtrl.selected_shape): Don't set the deprecated layer
6337     instance variables
6338    
6339     * Thuban/UI/tableview.py (LayerTableGrid.select_shapes): Don't use
6340     deprecated layer instance variables
6341    
6342     * Thuban/UI/mainwindow.py (MainWindow.LayerShowTable): Don't use
6343     deprecated layer instance variables
6344    
6345     * Thuban/Model/save.py (SessionSaver.write_layer): Don't use
6346     deprecated layer instance variables
6347    
6348     * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer)
6349     (MapRenderer.polygon_render_param): Don't use deprecated layer instance
6350     variables
6351    
6352     * test/runtests.py (main): Turn Thuban's deprecation warnings into
6353     errors so that they're cought by the tests
6354    
6355     * test/test_load.py (TestSingleLayer.test): Don't use deprecated
6356     layer instance variables
6357    
6358 jonathan 1212 2003-06-16 Jonathan Coles <[email protected]>
6359    
6360     Fix a problem under Windows whereby if the user double-clicks on a
6361     layer in the legend that tree item will expand or collapse as well
6362     as open the layer properties dialog. The state of the tree item
6363     should not be affected.
6364    
6365     * Thuban/UI/legend.py (LegendTree.__init__): Add instance variable
6366     preventExpandCollapse and subscribe to expanding and collapsing
6367     events.
6368     (LegendTree.OnItemExpandCollapse): New. Responds to expanding and
6369     collapsing events and will veto the event if it has been triggered
6370     by the user double clicking on a layer.
6371     (LegendTree._OnItemActivated): Set preventExpandCollapse to indicate
6372     that an expanding/collapsing event should be vetoed.
6373    
6374 bh 1208 2003-06-13 Bernhard Herzog <[email protected]>
6375    
6376     * Thuban/UI/classifier.py (Classifier.OnClose)
6377     (Classifier.map_layers_removed)
6378     (Classifier.layer_shapestore_replaced): Unsubscribe the messages
6379     in OnClose and not in map_layers_removed or
6380     layer_shapestore_replaced to make sure it always happens when the
6381     dialog is closed
6382    
6383 jonathan 1201 2003-06-13 Jonathan Coles <[email protected]>
6384    
6385 jonathan 1203 This puts back a fix for Windows where a panel is needed so that
6386     the background of the table view appears correctly.
6387    
6388     * Thuban/UI/tableview.py (TableFrame.__init__): Add a panel
6389     object that can be used by derived classes to place any
6390     controls (including the grid) onto.
6391     (QueryTableFrame.__init__): Use the panel as the parent window
6392     for all the controls. Reparent the grid so that the panel is
6393     the parent. Call UpdateStatusText() to correctly initialize
6394     the status bar.
6395    
6396     2003-06-13 Jonathan Coles <[email protected]>
6397    
6398 jonathan 1201 * Thuban/UI/dialogs.py (ThubanFrame): New: a class that inherits
6399     from wxFrame (as opposed to wxDialog like the other classes)
6400     but otherwise behaves like the other classes. This is needed
6401     for the TableView which isn't really a dialog and needs to
6402     have a status bar and control buttons.
6403    
6404     * Thuban/UI/tableview.py (TableGrid.__init__): Create an
6405     instance variable to keep track of how many rows are selected.
6406     Subscribe once to the the events we are interested in.
6407     (ThubanGrid.OnRangeSelect): Only handle event if event handling
6408     hasn't been turned off.
6409     (ThubanGrid.OnSelectCell): Only handle event if event handling
6410     hasn't been turned off.
6411     (ThubanGrid.ToggleEventListeners): Rather than subscribe None
6412     as an event listener (which changes the event handler stack)
6413     simply set an instance variable to False. This is checked in
6414     the event handlers.
6415     (ThubanGrid.GetNumberSelected): Return the number of currently
6416     selected rows.
6417     (TableFrame): Inherit from ThubanFrame so we can have a
6418     status bar and control buttons.
6419     (QueryTableFrame.__init__): Create a status bar. Fixes RTbug #1942.
6420     Explicitly set which items are selected in the operator choice and
6421     action choice so there is always a valid selection. Fixes RTbug #1941.
6422     Subscribe to grid cell selection events so we can update the
6423     status bar.
6424     (QueryTableFrame.UpdateStatusText): Update the status bar with
6425     how many rows are in the grid, how many columns, and how many
6426     rows are selected.
6427     (QueryTableFrame.OnGridSelectRange, QueryTableFrame.OnGridSelectCell):
6428     Call UpdateStatusText when cells are (de)selected.
6429     (QueryTableFrame.OnQuery): Use the string value in the value
6430     combo if either the selected item index is 0 or if the string
6431     cannot be found in the predefined list (this happens if the
6432     user changes the text). Fixes RTbug #1940.
6433     Only turn off the grid event listeners if there a query comes
6434     back with a none empty list of ids. in the case that the list
6435     is empty this causes a grid.ClearSelection() call to actually
6436     clear the grid selection which causes the selected items in
6437     the map to be deselected. Fixes RTbug #1939.
6438    
6439     * test/test_save.py (XMLWriterTest.Encode): Check return values.
6440     Fixes RTbug #1851.
6441    
6442 bh 1195 2003-06-13 Bernhard Herzog <[email protected]>
6443    
6444     * Thuban/UI/identifyview.py (IdentifyView.__init__): Call
6445     self.selected_shape with the current selection to make sure the
6446     contents of the dialog are up to date when it's shown for the
6447     first time.
6448     The dialog used to work without this by luck. The recent fix to
6449     the connector module 'broke' a 'feature' the identify view was
6450     relying on, i.e that subscribing to a message in response to
6451     receiving a message of that type would mean that the new
6452     subscriber would also be called for the same message.
6453    
6454 jonathan 1169 2003-06-12 Jonathan Coles <[email protected]>
6455 jonathan 1175
6456 jonathan 1193 * extensions/thuban/gdalwarp.cpp: Removed debug printing as
6457     the image is rendered. Fixes RTbug #1937.
6458    
6459     2003-06-12 Jonathan Coles <[email protected]>
6460    
6461 jonathan 1191 * Thuban/Lib/fileutil.py: As is done under Windows, create the
6462 jonathan 1193 user directory if it doesn't exist on a posix system.
6463     Fixes RTbug #1815.
6464 jonathan 1191
6465     * Thuban/Model/resource.py (get_user_proj_files): Moved the
6466     called to get_application_dir here, so that the directory
6467     will only be called if this method is invoked.
6468    
6469     * Thuban/UI/projdialog.py (ProjFrame.__DoOnProjAvail): Clear
6470     the projfilepath if no projection is selected.
6471    
6472     2003-06-12 Jonathan Coles <[email protected]>
6473    
6474 jonathan 1182 * Thuban/UI/legend.py (ScaleBarBitmap.__SetScale): Don't draw
6475     the scalebar if the current map has no projection set.
6476    
6477     * Thuban/UI/projdialog.py (ProjFrame.__DoOnProjAvail): Set the
6478     projfilepath label to just the basename of the projection file
6479     rather than include the entire path.
6480    
6481     * Thuban/Model/resource.py: Fix missed proj functions that
6482     needed to be renamed.
6483    
6484     2003-06-12 Jonathan Coles <[email protected]>
6485    
6486 jonathan 1178 * Thuban/Model/classification.py: Removed assert statements that
6487     tested if the variable was an instance of Color.
6488    
6489     * Thuban/Model/color.py (Color): Remove commented code that isn't
6490     used.
6491     (Transparent): Renamed from NoColor. Doesn't inherit from Color.
6492     Fixes RTbug #1835.
6493     (Transparent.__eq__, Transparent.__ne, Transparent.__repr): New.
6494     Needed now that the class doesn't inherit from Color.
6495    
6496     2003-06-12 Jonathan Coles <[email protected]>
6497    
6498 jonathan 1175 * test/test_save.py (XMLWriterTest.testEncode): Explicitly
6499     check unicode strings.
6500    
6501     * test/test_layer.py: Check for existence of gdal.
6502    
6503     2003-06-12 Jonathan Coles <[email protected]>
6504 jonathan 1172
6505     * Thuban/Model/xmlreader.py: New. Contains the XMLReader class
6506     that was in load.py
6507 jonathan 1169
6508 jonathan 1172 * Thuban/Model/xmlwriter.py: New. Contains the XMLWriter class
6509     that was in save.py
6510    
6511     2003-06-12 Jonathan Coles <[email protected]>
6512    
6513 jonathan 1169 This is largely a collection of bug fixes. We also handle the
6514     case where gdal is not on the system. The XMLReader and XMLWriter
6515     classes were moved into there own files to resolve some circular
6516     import references and because they shouldn't really be in the
6517     file that is dediciated to reading/writing session files since
6518     they are also used elsewhere.
6519    
6520     * Thuban/Model/classgen.py: Renamed functions to follow the
6521     function_names_with_underscores style. Fixes RTbug #1903.
6522     (calculate_quantiles): Raise ValueError if 'percents' is invalid.
6523    
6524     * Thuban/Model/layer.py: Import gdal only if it available.
6525     (RasterLayer): Handle the case where the gdal library is unavailable.
6526     Addresses RTbug #1877.
6527    
6528     * Thuban/Model/load.py (XMLReader): Moved into seperate file
6529     xmlreader.py.
6530    
6531 jonathan 1172 2003-06-12 Jonathan Coles <[email protected]>
6532    
6533     This is largely a collection of bug fixes. We also handle the
6534     case where gdal is not on the system. The XMLReader and XMLWriter
6535     classes were moved into there own files to resolve some circular
6536     import references and because they shouldn't really be in the
6537     file that is dediciated to reading/writing session files since
6538     they are also used elsewhere.
6539    
6540     * Thuban/Model/classgen.py: Renamed functions to follow the
6541     function_names_with_underscores style. Fixes RTbug #1903.
6542     (calculate_quantiles): Raise ValueError if 'percents' is invalid.
6543    
6544     * Thuban/Model/layer.py: Import gdal only if it available.
6545     (RasterLayer): Handle the case where the gdal library is unavailable.
6546     Addresses RTbug #1877.
6547    
6548     * Thuban/Model/load.py (XMLReader): Moved into seperate file
6549     xmlreader.py.
6550    
6551 jonathan 1169 * Thuban/Model/save.py (escape, XMLWriter): Moved into seperate
6552     file xmlwriter.py.
6553    
6554     * Thuban/Model/resource.py: Renamed functions to following the
6555     function_names_with_underscores style.
6556     (has_gdal_support): New function that returns true if the gdal
6557     library is available. Addresses RTbug #1877.
6558    
6559     * Thuban/UI/application.py (ThubanApplication.OpenSession):
6560     Display a message box if the gdal library is not available, but
6561     only if there are any layers that would use it. Addresses RTbug #1877.
6562    
6563     * Thuban/UI/classgen.py: Use renamed projection resource functions.
6564     (GenUniformPanel.__CalcStepping): Fix a slight discrepency
6565     when using integers versus floats.
6566    
6567     * Thuban/UI/mainwindow.py (_has_gdal_support): New. Used to
6568     determine if the "Add Image Layer" menu option should be
6569     greyed out or not. Addresses RTbug #1877.
6570    
6571     * Thuban/UI/projdialog.py: Use renamed projection resource functions.
6572    
6573     * Thuban/UI/renderer.py (MapRenderer.render_map): Only try to
6574     optimize if a raster layer is visible. Fixes RTbug #1931.
6575     Only draw the raster layer if the gdal library is available.
6576     Addresses RTbug #1877.
6577    
6578     * test/test_classgen.py: Add tests for generate_singletons,
6579     generate_uniform_distribution, generate_quantiles. Fixes RTbug #1903.
6580     (test_calculate_quantiles): Fix some tests to catch the new
6581     ValueError that is raised.
6582    
6583     * test/test_proj.py: Use renamed projection resource functions.
6584    
6585     * test/test_save.py (SaveSessionTest.testClassifiedLayer): New
6586     test for saving classified layers. Fixes RTbug #1902.
6587     (XMLWriterTest): New. Tests the XMLWriter class. Fixes RTbug #1851.
6588    
6589 jan 1156 2003-06-12 Jan-Oliver Wagner <[email protected]>
6590    
6591     Fix for http://intevation.de/rt/webrt?serial_num=1900.
6592    
6593     * Thuban/UI/multiplechoicedialog.py: New. A multiple choice dialog.
6594    
6595     * Thuban/UI/mainwindow.py: import wxMultipleChoiceDialog from
6596     multiplechoicedialog.py rather than from the wxPython library.
6597    
6598 frank 1151 2003-06-11 Frank Koormann <[email protected]>
6599    
6600 frank 1152 * Thuban/Lib/fileutil.py (get_application_dir): Minor stability
6601     update.
6602    
6603     2003-06-11 Frank Koormann <[email protected]>
6604    
6605 frank 1151 * Thuban/Lib/fileutil.py (get_application_dir): New function to
6606     determine the absolute .thuban/thuban directory under
6607     "posix" (os.expanduser) and "nt" (read AppData registry key).
6608    
6609     * Thuban/Model/resource.py: Use get_application_dir
6610    
6611     * Thuban/UI/application.py (ThubanApplication.read_startup_files):
6612     Use get_application_dir.
6613    
6614 bh 1143 2003-06-10 Bernhard Herzog <[email protected]>
6615    
6616 bh 1147 * Thuban/UI/tableview.py (LayerTableFrame.__init__): Subscribe to
6617     the messages MAP_LAYERS_REMOVED messages
6618     (LayerTableFrame.OnClose): Unsubscribe from it.
6619     (LayerTableFrame.map_layers_removed): New. Receiver for
6620     MAP_LAYERS_REMOVED. Close the dialog when the layer whose the
6621     dialog is showing is removed.
6622    
6623     2003-06-10 Bernhard Herzog <[email protected]>
6624    
6625 bh 1145 * Thuban/Lib/connector.py (Connector.Issue): Iterate over a copy
6626     of the receivers list so that unsubscribing in a receiver doesn't
6627     modify it while iterating over it.
6628    
6629     * test/test_connector.py
6630     (ConnectorTest.test_disconnect_in_receiver): New. Test whether
6631     unsubscribing in a receiver works correctly. See docstring for
6632     details
6633    
6634     2003-06-10 Bernhard Herzog <[email protected]>
6635    
6636 bh 1143 * Thuban/Model/messages.py (LAYER_SHAPESTORE_REPLACED): New
6637     message.
6638    
6639     * Thuban/Model/layer.py (Layer.SetShapeStore): Send
6640     LAYER_SHAPESTORE_REPLACED when the shapestore changes. A
6641     LAYER_CHANGED will still be sent if the classification changes.
6642    
6643     * Thuban/UI/classifier.py (Classifier.__init__): Add the map as
6644     parameter so we can subscribe to some of its messages
6645     (Classifier.__init__): Subscribe to the map's MAP_LAYERS_REMOVED
6646     and the layer's LAYER_SHAPESTORE_REPLACED
6647     (Classifier.unsubscribe_messages): New. Unsubscribe from message
6648     subscribed to in __init__
6649     (Classifier.map_layers_removed)
6650     (Classifier.layer_shapestore_replaced): receivers for the messages
6651     subscribed to in __init__. Unsubscribe and close the dialog
6652    
6653     * Thuban/UI/mainwindow.py (MainWindow.OpenLayerProperties): Pass
6654     the map to the Classifier dialog
6655    
6656     * test/test_layer.py (SetShapeStoreTests): Derive from
6657     SubscriberMixin as well so we can test messages
6658     (SetShapeStoreTests.setUp): Subscribe to some of the layer's
6659     messages
6660     (SetShapeStoreTests.tearDown): Clear the messages again
6661     (SetShapeStoreTests.test_sanity): Expand the doc-string and check
6662     for the modified flag too
6663     (SetShapeStoreTests.test_set_shape_store_modified_flag): New test
6664     to check whether SetShapeStore sets the modified flag
6665     (SetShapeStoreTests.test_set_shape_store_different_field_name)
6666     (SetShapeStoreTests.test_set_shape_store_same_field)
6667     (SetShapeStoreTests.test_set_shape_store_same_field_different_type):
6668     Add tests for the messages. This checks both the new
6669     LAYER_SHAPESTORE_REPLACED and the older LAYER_CHANGED
6670    
6671 jan 1141 2003-06-06 Jan-Oliver Wagner <[email protected]>
6672    
6673     * Thuban/UI/mainwindow.py: Improved and partly added help texts for
6674     the menu items.
6675    
6676 frank 1134 2003-06-05 Frank Koormann <[email protected]>
6677    
6678 frank 1139 * Thuban/UI/identifyview.py (IdentifyView.__init__):
6679     Layout reimplemented without panel. Make life easier to fit the list
6680     in the dialog.
6681    
6682     2003-06-05 Frank Koormann <[email protected]>
6683    
6684 frank 1137 * Thuban/UI/projdialog.py (ProjFrame.__init__): Fill the projchoice
6685     once on initialisation (Former implementation resulted in multiple
6686     entries for each projection).
6687     (ProjFrame.__FillAvailList): selectProj as second optional parameter,
6688     if set, select the projection found under the specified name. This
6689     overwrites any other selection estimate.
6690     Removed projchoice filling from this method.
6691     (ProjFrame._OnSave, ProjFrame._OnAddToList):
6692     Updated call of ProjFrame.__FillAvailList
6693     (LCCPanel._DoLayout): Moved parameter controls in more common order.
6694    
6695     * Resources/Projections/defaults.proj: Extended defaults representing
6696     various common European projections.
6697    
6698     2003-06-05 Frank Koormann <[email protected]>
6699    
6700 frank 1134 * Thuban/UI/identifyview.py (IdentifyView.__init__):
6701     Use ListCtrl instead of GridCtrl
6702    
6703     * Thuban/Model/resource.py:
6704     Guess location of .thuban directory from tempdir parent directory.
6705    
6706     * Thuban/UI/application.py (ThubanApplication.read_startup_files):
6707     Guess location of .thuban directory from tempdir parent directory.
6708    
6709 bh 1130 2003-06-04 Bernhard Herzog <[email protected]>
6710    
6711     Do not cache the values returned by the tree widget's
6712     GetFirstChild and GetNextChild methods because it led to lots of
6713     segfaults. The new way requires more brute force but is more
6714     reliable.
6715    
6716     * Thuban/UI/legend.py (LegendTree.__init__): Remove instance
6717     variable layer2id
6718     (LegendTree.find_layer): New method to do with brute force what
6719     layer2id tried to accomplish
6720     (LegendTree._OnMsgLayerChanged)
6721     (LegendTree._OnMsgLayerTitleChanged, LegendTree.__ShowHideLayer):
6722     Use find_layer instead of layer2id
6723     (LegendTree.__RemoveLayer, LegendTree.__AddLayer): No need to
6724     update layer2id anymore
6725     (LegendTree._OnMsgMapLayersRemoved)
6726     (LegendTree._OnMsgMapLayersAdded): Get by without layer2id.
6727    
6728 tkoester 1128 2003-06-03 Thomas Koester <[email protected]>
6729    
6730     * Thuban/Model/classgen.py (GenQuantiles0): New function.
6731    
6732 bh 1120 2003-06-02 Bernhard Herzog <[email protected]>
6733    
6734 bh 1127 * Thuban/UI/mainwindow.py (layer_rename command, table_rename command):
6735     New commands.
6736     (main_menu): Add the new commands.
6737     (MainWindow.TableRename): New. Implementation of the table_rename
6738     command.
6739     (MainWindow.RenameLayer): New. Implementation of the layer_rename
6740     command.
6741    
6742     * Thuban/Model/session.py (Session.AddTable): call self.changed to
6743     set the modified flag
6744    
6745     * test/test_session.py (TestSessionSimple.test_add_table): Test
6746     whether the modified flag is set properly
6747    
6748     * Thuban/Model/base.py (TitledObject.SetTitle): Call changed
6749     instead of issue so that the modified flags get updated.
6750    
6751     * test/test_base.py (SomeTitledObject): Derive from Modifiable
6752     instead of Publisher to reflect reality better and to accomodate
6753     the fact that SetTitle now calls changed instead of issue
6754    
6755     2003-06-02 Bernhard Herzog <[email protected]>
6756    
6757     * Thuban/UI/classgen.py (GenQuantilesPanel.GetList): Resource
6758     acquisition has to happen before the try in a try-finally.
6759    
6760     2003-06-02 Bernhard Herzog <[email protected]>
6761    
6762 bh 1120 * Thuban/UI/legend.py (LegendTree._OnMsgMapLayersRemoved): It's
6763     possible that a layer is removed that is not currently selected in
6764     the legend so don't check for this.
6765    
6766 bh 1112 2003-05-30 Bernhard Herzog <[email protected]>
6767    
6768 bh 1118 * Thuban/Model/layer.py (Layer.Destroy): Set all instance
6769     variables to None that have direct or indirect references to
6770     shapefiles or dbf files to make sure that they do go away and the
6771     files are closed.
6772    
6773     2003-05-30 Bernhard Herzog <[email protected]>
6774    
6775 bh 1116 * Thuban/UI/legend.py (LegendTree.GetRootItem): Reset
6776     availImgListIndices when a new image list is created
6777    
6778     2003-05-30 Bernhard Herzog <[email protected]>
6779    
6780 bh 1114 * Thuban/UI/legend.py (LegendTree.__init__): New instance variable
6781     changing_selection to indicate whether the LegendTree code itself
6782     is currently changing the selection
6783     (LegendTree.normalize_selection): New method to normalize the
6784     selection by selecting the layer item even if the user clicked on
6785     the classification.
6786     (LegendTree._OnSelChanged): normalize the selection. This works
6787     around a bug in wx which doesn't keep track of the selection
6788     properly when subtrees are deleted.
6789    
6790     2003-05-30 Bernhard Herzog <[email protected]>
6791    
6792 bh 1112 * Thuban/UI/view.py (MapCanvas.set_view_transform): Limit the
6793     maximum and minimum scale factors.
6794    
6795     * test/test_classgen.py (ClassGenTest.test): Update to reflect the
6796     changes in classgen.py
6797    
6798 jonathan 1109 2003-05-30 Jonathan Coles <[email protected]>
6799    
6800     * Thuban/Model/classgen.py: Remove ClassGenerator class but make
6801     all the methods functions. Fixes RTBug #1903.
6802    
6803     * Thuban/Model/map.py (Map.TopLayer, Map.BottomLayer): Renamed
6804     to MoveLayerToTop and MoveLayerToBottom respectively. Fixes
6805     RTBug #1907.
6806    
6807     * Thuban/UI/classgen.py: Use classgen functions that were part
6808     of the ClassGenerator class. Put try/finally blocks around
6809     code that uses wxBeginBusyCursor()/wxEndBusyCursor(). Fixes
6810     RTBug #1904.
6811    
6812     * Thuban/UI/classifier.py: Remove unused import of ClassGenerator.
6813    
6814     * Thuban/UI/legend.py: The legend was cleared and repopulated any
6815     time something changed which caused some state to be lost such
6816     as which children were expanded or collapsed. Fixes RTBug #1901.
6817     (LegendTree._OnMsgMapLayersAdded): Add only new layers.
6818     (LegendTree.__OnMsgMapLayersRemoved): Remove layers that exist in
6819     the legend but not in the map.
6820     (LegendTree.__FillTree): Move main functionality out into smaller
6821     methods that can be used by other methods.
6822     (LegendTree.__FillTreeLayer): Reuse old slots in the image list
6823     if they are available.
6824     (LegendTree.DeleteAllItems): Renamed from __DeleteAllItems so
6825     that we override the wxTreeCtrl method. Iterate over children
6826     and call __RemoveLayer.
6827     (LegendTree.__AddLayer): New. Add a new layer to the legend.
6828     (LegendTree.__RemoveLayer): Remove a layer from the legend.
6829     (LegendTree.DeleteChildren): New, overrides wxTreeCtrl method.
6830     Should only be called with the id of a layer branch.
6831     (LegendTree.GetRootItem): New, overrides wxTreeCtrl method.
6832     Returns the root item or creates one if necessary.
6833    
6834     * Thuban/UI/renderer.py (MapRenderer.draw_raster_layer): Call
6835     ProjectRasterFile with tuple arguments instead of strings.
6836    
6837     * Thuban/UI/tableview.py (QueryTableFrame.OnQuery): Wrap code
6838     with try/finally. Fixes RTBug #1904.
6839    
6840     * Thuban/UI/view.py (MapCanvas.OnPaint): Wrap code
6841     with try/finally. Fixes RTBug #1904.
6842     (MapCanvas.FitSelectedToWindow): If a single point is selected
6843     simply center it on the display. Fixes RTBug #1849.
6844    
6845     * extensions/thuban/gdalwarp.cpp: Removed code that allowed gdalwarp
6846     to be compiled as a standalone app. Now the code can only be
6847     called from Python which simplifies the parameter passing.
6848     (ProjectRasterFile): Handle Python arguments. Remove code that
6849     checks for a destination dataset. Add more clean up code.
6850    
6851     * test/test_map.py (TestMapWithContents.test_raise_layer_top,
6852     TestMapWithContents.test_lower_layer_bottom):
6853     Test Map.MoveLayerToTop() and Map.MoveLayerToBottom() respectively.
6854     Fixes RTBug #1907.
6855    
6856     * Thuban/UI/mainwindow.py (MainWindow.ToggleLegend): Apply a full
6857     extent to the map when the legend is toggled. Fixes RTBug #1881.
6858    
6859 jan 1097 2003-05-29 Jan-Oliver Wagner <[email protected]>
6860    
6861     * Thuban/UI/tableview.py (LayerTableFrame.OnClose): Bug-fix: Now
6862     unsubscribes all that is subcribed in __init__.
6863    
6864 bh 1089 2003-05-28 Bernhard Herzog <[email protected]>
6865    
6866 bh 1095 * Thuban/UI/mainwindow.py (MainWindow.DuplicateLayer)
6867     (MainWindow.CanDuplicateLayer): New methods to implement the
6868     Layer/Duplicate command.
6869     (layer_duplicate command): New.
6870     (main_menu): Add layer_duplicate to the Layer menu.
6871    
6872     2003-05-28 Bernhard Herzog <[email protected]>
6873    
6874 bh 1093 * Thuban/UI/tableview.py (NullRenderer.Draw): New. Our own
6875     renderer so that NULL/None values get displayed differently (by a
6876     gray rectangle).
6877     (TableGrid.__init__): Override the default renderers
6878    
6879     2003-05-28 Bernhard Herzog <[email protected]>
6880    
6881 bh 1089 * Thuban/Model/layer.py (Layer.SetShapeStore): Set the
6882     classification to "None" if the type of the field has changed.
6883    
6884     * test/test_layer.py (SetShapeStoreTests): New. Class with a few
6885     test for the Layer.SetShapeStore method
6886    
6887 jan 1087 2003-05-28 Jan-Oliver Wagner <[email protected]>
6888 jan 1085
6889 jan 1087 * Thuban/Model/layer.py (Layer.TreeInfo): Fixed a bug (a layer
6890     does not necessarily have a filename).
6891    
6892     2003-05-28 Jan-Oliver Wagner <[email protected]>
6893    
6894 jan 1085 * Thuban/UI/mainwindow.py (MainWindow.TableClose, MainWindow.TableShow):
6895     sort the selection list for the dialog.
6896    
6897 frank 1083 2003-05-28 Frank Koormann <[email protected]>
6898    
6899     * extensions/thuban/wxproj.cpp
6900     (project_point): Removed cast to int for projected point coordinates.
6901     (shape_centroid): Return last point if all polygon vertices fall
6902     to one point.
6903    
6904 bh 1079 2003-05-28 Bernhard Herzog <[email protected]>
6905    
6906 bh 1081 * Thuban/UI/mainwindow.py (_can_unjoin): Add doc-string and cope
6907     with layers that don't have shapestores, i.e. raster layers.
6908    
6909     2003-05-28 Bernhard Herzog <[email protected]>
6910    
6911 bh 1079 * Thuban/Model/table.py (DBFTable.__init__): Omit the extension
6912     when determining the title from the filename.
6913    
6914     * test/test_dbf_table.py (TestDBFTable.test_title): Update to
6915     reflect changes in the way the title is derived from the filename
6916    
6917 frank 1077 2003-05-28 Frank Koormann <[email protected]>
6918    
6919     * Thuban/UI/mainwindow.py (MainWindow.TableShow):
6920     Added wxDEFAULT_DIALOG_STYLE to show table dialog styles.
6921    
6922 bh 1069 2003-05-27 Bernhard Herzog <[email protected]>
6923    
6924 bh 1075 * Thuban/UI/mainwindow.py (MainWindow.delegated_messages): Also
6925     delegate SelectedLayer.
6926     (MainWindow.LayerUnjoinTable): Implement.
6927     (_can_unjoin): New. Helper function for the sensitivity of the
6928     layer/unjoin command.
6929    
6930     * Thuban/Model/data.py (ShapefileStore.OrigShapeStore)
6931     (DerivedShapeStore.OrigShapeStore): New. Return the original
6932     shapestore. Used to figure out how to unjoin.
6933     (DerivedShapeStore.Shapefile): Fix a typo.
6934    
6935     2003-05-27 Bernhard Herzog <[email protected]>
6936    
6937 bh 1073 * Thuban/UI/join.py (JoinDialog): Extend to handle layer joins as
6938     well
6939     (JoinDialog.__init__): Use the layer parameter and only build the
6940     left choice when a layer is given
6941     (JoinDialog.OnJoin): Handle layer joins as well
6942     (JoinDialog.OnLeftTable, JoinDialog.OnRightTable): Handle the case
6943     that the user selects the "Select..." item. The sensitivitly
6944     updating is now in update_sensitivity
6945     (JoinDialog.y): New method to refactor the sensitivity update of
6946     the join button into its own method.
6947    
6948     * Thuban/UI/mainwindow.py (MainWindow.LayerJoinTable): Implement.
6949    
6950     2003-05-27 Bernhard Herzog <[email protected]>
6951    
6952 bh 1071 * Thuban/UI/mainwindow.py (table_close command): Make it sensitive
6953     iff there are unreferenced tables in the session
6954    
6955     2003-05-27 Bernhard Herzog <[email protected]>
6956    
6957 bh 1069 * Thuban/Model/messages.py (TABLE_REMOVED): New message.
6958    
6959     * Thuban/Model/session.py (Session.UnreferencedTables): New method
6960     to return tables that are not referenced by other tables or shape
6961     stores and can be removed.
6962     (Session.RemoveTable): Issue a TABLE_REMOVED message after
6963     removing the table
6964    
6965     * Thuban/UI/mainwindow.py: Remove unused imports
6966     (MainWindow.TableClose): Implement.
6967    
6968     * Thuban/UI/tableview.py (TableFrame.__init__): Subscribe to some
6969     messages so that the frame will be automatically closed when a new
6970     session is opened or the table is removed.
6971     (TableFrame.OnClose): Unsubscribe the Subscriptions made in
6972     __init__
6973     (TableFrame.close_on_session_replaced)
6974     (TableFrame.close_on_table_removed): New. Subscribers that close
6975     the window
6976    
6977     * test/test_session.py (TestSessionMessages.test_remove_table)
6978     (TestSessionSimple.test_remove_table): Move the test to
6979     TestSessionSimple and add test for the TABLE_REMOVED message
6980     (TestSessionBase.setUp): Also subscribe to TABLE_REMOVED
6981     (TestSessionSimple.test_unreferenced_tables) New. Test for the
6982     UnreferencedTables method.
6983     (UnreferencedTablesTests): New. Class with some more sophisticated
6984     tests for UnreferencedTables.
6985    
6986 frank 1065 2003-05-27 Frank Koormann <[email protected]>
6987    
6988 frank 1067 * Thuban/UI/tableview.py (QueryTableFrame.__init__): The "_S_election"
6989     display has some unwanted side effects. Removed again.
6990    
6991     2003-05-27 Frank Koormann <[email protected]>
6992    
6993 frank 1065 * Resources/Bitmaps/legend_icon_layer.xpm: New, icon for legend.
6994    
6995     * Thuban/UI/legend.py (LegendTree.__FillTree): Use "legend_icon_layer"
6996    
6997 jan 1062 2003-05-27 Jan-Oliver Wagner <[email protected]>
6998    
6999 bh 1069 * test/test_menu.py (MenuTest.test): Added test for
7000     Menu.RemoveItem().
7001 jan 1062
7002 bh 1069 * Thuban/UI/menu.py (Menu.RemoveItem): New. Remove an item from
7003     the menu.
7004 jan 1062
7005 frank 1059 2003-05-27 Frank Koormann <[email protected]>
7006    
7007     Nonmodal dialogs without parent (i.e. they can fall behind the main
7008     window)
7009    
7010     * Thuban/UI/mainwindow.py (MainWindow.OnClose): Explicitly destroy
7011     all dialogs in the dialogs dictionary and the canvas.
7012    
7013     * Thuban/UI/dialogs.py (NonModalNonParentDialog): New class, without
7014     parent, i.e. can fall behind other windows.
7015     (NonModalDialog.OnClose): Check is dialog is in mainwindow.dialog
7016     dictionary before removing it.
7017    
7018     * Thuban/UI/classifier.py: Dialog derived from NonModalNonParentDialog
7019    
7020     * Thuban/UI/projdialog.py: Dialog derived from NonModalNonParentDialog
7021     * Thuban/UI/tableview.py: Dialog derived from NonModalNonParentDialog
7022     * Thuban/UI/tree.py: Dialog derived from NonModalNonParentDialog
7023    
7024 bh 1053 2003-05-27 Bernhard Herzog <[email protected]>
7025    
7026 bh 1055 * Thuban/UI/mainwindow.py (MainWindow.ShowTableView): New. Open a
7027     tableview dialog
7028     (MainWindow.TableShow): Use ShowTableView to open the dialogs.
7029     Also, don't use the table's titles as the dialog names. The titles
7030     aren't guaranteed to be unique.
7031     (MainWindow.TableOpen): Open a table view dialog after opening the
7032     table
7033    
7034     2003-05-27 Bernhard Herzog <[email protected]>
7035    
7036 bh 1053 * Thuban/UI/mainwindow.py: Remove the Table/Hide menu item. Its
7037     effect can be achieved by simply closing the window showing the
7038     table.
7039     (MainWindow.TableHide): Removed.
7040     (main_menu): Removed "table_hide"
7041    
7042 frank 1051 2003-05-27 Frank Koormann <[email protected]>
7043    
7044     Fix legend tree display problems under Win32
7045    
7046     * Thuban/UI/legend.py: BMP_SIZE_W = 15
7047     (LegendTree.__FillTree): Display "legend_icon_map.xpm" with layer title.
7048     (LegendTree.__FillTreeLayer): Explicitely set SelectedImage.
7049    
7050     * Resources/Bitmaps/legend_icon_map.xpm: New icon for legend.
7051    
7052 jan 1048 2003-05-27 Jan-Oliver Wagner <[email protected]>
7053    
7054     * Thuban/UI/menu.py (Menu.InsertSeparator): Additional optional parameter
7055     'after' now allows to insert separators almost anywhere in the menu.
7056    
7057 frank 1046 2003-05-27 Frank Koormann <[email protected]>
7058    
7059     * Thuban/UI/tableview.py (QueryTableFrame.__init__): Underline the
7060     "S" of selection box label to hint on hot key (Alt-S). Works under
7061     Win32 but is ignored under GTK.
7062    
7063     2003-05-26 Frank Koormann <[email protected]>
7064    
7065     * Thuban/UI/projdialog.py (ProjFrame.__do_layout, ProjPanel._DoLayout):
7066     Center Choices.
7067    
7068 bh 1038 2003-05-26 Bernhard Herzog <[email protected]>
7069    
7070 bh 1044 Remove the Precision methods again. They're too DBF specific to be
7071     part of the table interface and they're only used in table_to_dbf
7072     anyway.
7073    
7074     * Thuban/Model/transientdb.py (TransientTableBase.Width):Use a
7075     fixed precision of 12 for doubles.
7076     (TransientTableBase.Precision): Removed
7077     (AutoTransientTable.Width): Delegate to self.table.
7078    
7079     * Thuban/Model/table.py (DBFTable.Precision)
7080     (MemoryTable.Precision): Removed.
7081     (MemoryTable.Width): Use a fixed precision of 12 for doubles.
7082     (table_to_dbf): Use a fixed precision of 12 for floats unless the
7083     column object specifies something else.
7084    
7085     * test/test_dbf_table.py (TestTableToDBF.test_table_to_dbf): New.
7086     test for table_to_dbf
7087    
7088     2003-05-26 Bernhard Herzog <[email protected]>
7089    
7090     * test/test_transientdb.py
7091     (TestTransientTable.run_iceland_political_tests): Fix a comment.
7092    
7093     2003-05-26 Bernhard Herzog <[email protected]>
7094    
7095 bh 1038 * Thuban/UI/mainwindow.py (MainWindow.TableOpen): Real
7096     implementation. Mark parts of the file format strings for
7097     localization.
7098    
7099     * Thuban/Model/session.py (Session.OpenTableFile): New. Open a dbf
7100     file and add the table to the tables managed by the session
7101    
7102 bh 1040 * test/test_session.py (TestSessionSimple.test_open_table_file):
7103     New. test case for OpenTableFile
7104    
7105 jan 1033 2003-05-26 Jan-Oliver Wagner <[email protected]>
7106    
7107 jan 1035 * Thuban/UI/controls.py, Thuban/UI/identifyview.py, Thuban/UI/join.py,
7108     Thuban/UI/labeldialog.py, Thuban/UI/mainwindow.py,
7109     Thuban/UI/proj4dialog.py, Thuban/UI/tableview.py, Thuban/UI/view.py:
7110     Replace the true/false of wxWindows by True/False of Python 2.2.1.
7111    
7112     2003-05-26 Jan-Oliver Wagner <[email protected]>
7113    
7114 bh 1038 * Thuban/UI/tableview.py (LayerTableFrame.__init__): If there is
7115     already a selection present, update the grid accordingly.
7116 jan 1033
7117     * Thuban/UI/mainwindow.py (MainWindow.TableShow): Make the dialog
7118     resizeable and increase its initial size.
7119    
7120 frank 1030 2003-05-26 Frank Koormann <[email protected]>
7121    
7122     Table export functionality
7123    
7124     * Thuban/Model/table.py (DBFTable.Width, MemoryTable.Width):
7125     Return width (in characters) for a column.
7126     (DBFTable.Precision, MemoryTable.Precision): Return decimal precision.
7127     (table_to_dbf): Write table to dbf file.
7128     (table_to_csv): Write table to csv file.
7129    
7130     * Thuban/Model/transientdb.py (TransientTableBase.Width,
7131     TransientTableBase.Precision): Return column width and precision.
7132    
7133     * Thuban/UI/tableview.py (QueryTableFrame.OnSaveAs): Call table_to_dbf
7134     or table_to_csv depending on file selection.
7135    
7136     * test/test_dbf_table.py:
7137     Test table_to_dbf (extension of former part of test).
7138    
7139     * test/test_csv_table.py:
7140     Test table_to_csv.
7141    
7142 jan 1021 2003-05-23 Jan-Oliver Wagner <[email protected]>
7143    
7144 jan 1024 * Thuban/UI/join.py (JoinDialog.OnJoin): Use _() for strings.
7145     Use QueryTableFrame instead of TableFrame.
7146 jan 1021
7147 jan 1024 * Thuban/UI/mainwindow.py (MainWindow.LayerShowTable): Prefix the
7148     table window with 'Layer Table:' instead of 'Table:'.
7149    
7150     2003-05-23 Jan-Oliver Wagner <[email protected]>
7151    
7152     Give all tables a title via mix-in TitledObject.LayerShowTable
7153    
7154 jan 1021 * Thuban/Model/base.py (TitledObject.SetTitle): Call method 'issue'
7155     only if it exists.
7156    
7157     * Thuban/Model/table.py (DBFTable, MemoryTable): mix-in TitledObject
7158     and call its init-method with a default title. Remove Title() method.
7159    
7160     * Thuban/Model/transientdb.py (TransientTable, TransientJoinedTable,
7161     AutoTransientTable): mix-in TitledObject and call its init-method with
7162     a default title. Remove Title() method.
7163    
7164 bh 1017 2003-05-23 Bernhard Herzog <[email protected]>
7165    
7166     * Thuban/Model/session.py (Session.AddShapeStore): Define
7167     AddShapeStore analogously to AddTable.
7168    
7169     * test/test_session.py (TestSessionSimple.test_add_shapestore):
7170     New. Test for AddShapeStore
7171    
7172 jan 1015 2003-05-23 Jan-Oliver Wagner <[email protected]>
7173    
7174     Introducing QueryTableFrame and a very coarse ShowTable implementation.
7175    
7176     * Thuban/UI/tableview.py (LayerTableFrame, QueryTableFrame): Split the
7177     class LayerTableFrame into two classes, LayerTableFrame and QueryTableFrame.
7178     The latter implements the selection GUI without dependency on a layer.
7179     LayerTableFrame now is derived from QueryTableFrame and connects
7180     to a layer.
7181    
7182     * Thuban/UI/mainwindow.py (MainWindow.TableShow): A very coarse
7183     implementation that still needs work.
7184    
7185     * Thuban/Model/layer.py (Layer.TreeInfo): Added filename.
7186    
7187 frank 1011 2003-05-22 Frank Koormann <[email protected]>
7188    
7189     * Thuban/Model/transientdb.py (TransientJoinedTable.__init__):
7190     Added "outer_join = False" as optional parameter.
7191     (TransientJoinedTable.create): If outer join is true, perform a
7192     "LEFT OUTER JOIN" instead of "JOIN", which preserves all records of
7193     the left table. Records not matching are filled with 0 / None.
7194    
7195     * Thuban/UI/join.py (JoinDialog.__init__): Checkbox for outer join.
7196     (JoinDialog.OnJoin): Consider outer join check box.
7197    
7198 bh 1006 2003-05-22 Bernhard Herzog <[email protected]>
7199    
7200 bh 1008 * Thuban/UI/join.py (JoinDialog.OnJoin): Use exc_info in a
7201     somewhat safer way. Storing the traceback in a local variable can
7202     lead to memory leaks
7203    
7204     2003-05-22 Bernhard Herzog <[email protected]>
7205    
7206 bh 1006 * Thuban/UI/join.py (JoinDialog.OnJoin): Make sure to really call
7207     the wxMessageDialog's Destroy() method.
7208    
7209 frank 1004 2003-05-22 Frank Koormann <[email protected]>
7210    
7211     * Thuban/UI/join.py (JoinDialog.__init__): Make use of
7212     TransientTable.Title()
7213    
7214     2003-05-22 Frank Koormann <[email protected]>
7215    
7216     Join Dialog, initial version.
7217    
7218     * Thuban/UI/mainwindow.py (MainWindow.TableJoin): Removed print.
7219    
7220     * Thuban/UI/join.py (JoinDialog): Functional implementation of
7221     former framework. Renamed Table1/Table2 to LeftTable/RightTable
7222     in all occurences.
7223    
7224     * Thuban/Model/transientdb.py (TransientJoinedTable.__doc__):
7225     Typo fixed.
7226    
7227 bh 995 2003-05-22 Bernhard Herzog <[email protected]>
7228    
7229 bh 999 Give the tables titles so that the GUI can display more meaningful
7230     names. For now the titles are fixed but depend on e.g. filenames
7231     or the titles of the joined tables.
7232    
7233     * Thuban/Model/transientdb.py (TransientTable.Title)
7234     (TransientJoinedTable.Title, AutoTransientTable.Title): New.
7235    
7236     * Thuban/Model/table.py (DBFTable.Title, MemoryTable.Title): New.
7237    
7238     * test/test_transientdb.py
7239     (TestTransientTable.test_auto_transient_table_title): New. Test
7240     for the Title method
7241     (TestTransientTable.test_transient_joined_table)
7242     (TestTransientTable.test_transient_table): Add test for the Title
7243     methods
7244    
7245     * test/test_memory_table.py (TestMemoryTable.test_title): New.
7246     Test for the Title method
7247    
7248     * test/test_dbf_table.py (TestDBFTable.test_title): New. Test for
7249     the Title method
7250    
7251     2003-05-22 Bernhard Herzog <[email protected]>
7252    
7253 bh 997 * test/test_layer.py (TestLayer.setUp, TestLayer.tearDown):
7254     Provide a better way to destroy the layers
7255     (TestLayer.test_base_layer, TestLayer.test_arc_layer)
7256     (TestLayer.test_point_layer, TestLayer.test_empty_layer)
7257     (TestLayer.test_polygon_layer, TestLayer.test_get_field_type): Use
7258     the new way to destroy the layers.
7259     (TestLayer.test_derived_store): New. Test for using a layer with a
7260     DerivedShapeStore
7261    
7262     * Thuban/Model/layer.py (Layer.SetShapeStore): Only set the
7263     filename if the shape store actually has one.
7264    
7265     2003-05-22 Bernhard Herzog <[email protected]>
7266    
7267 bh 995 * Thuban/Model/table.py (DBFTable.FileName): New. Accessor method
7268     for the filename
7269    
7270     * test/test_dbf_table.py (TestDBFTable.test_filename): New. Test
7271     for the FileName method
7272     (TestDBFTableWriting.test_write): Fix spelling of filename
7273    
7274 tkoester 993 2003-05-22 Thomas Koester <[email protected]>
7275    
7276     * Thuban/Model/range.py, test/test_range.py: Brought over new Range
7277     from SciParam that now really is immutable.
7278    
7279 frank 992 2003-05-22 Frank Koormann <[email protected]>
7280    
7281     Layer Top/Bottom placement added to legend.
7282    
7283     * Thuban/UI/legend.py
7284     (LegendPanel._OnMoveTop(), LayerPanel._OnMoveBottom): New, methods
7285     bound to tool events.
7286     (LegendTree.MoveCurrentItemTop(), LegendTree.MoveCurrentItemBottom):
7287     New, methods binding the event methods with the map methods.
7288    
7289     * Thuban/Model/map.py (Map.TopLayer(), Map.BottomLayer()): New, place
7290     layer at top/bottom of layer stack.
7291    
7292     * Resources/Bitmaps/top_layer.xpm: New button icon.
7293    
7294     * Resources/Bitmaps/bottom_layer.xpm: New button icon.
7295    
7296 bh 988 2003-05-22 Bernhard Herzog <[email protected]>
7297    
7298     * Thuban/Model/session.py (Session.RemoveTable): New method to
7299     remove tables
7300    
7301     * test/test_session.py (TestSessionSimple.test_remove_table): New.
7302     Test for RemoveTable
7303    
7304 tkoester 986 2003-05-22 Thomas Koester <[email protected]>
7305    
7306     * Thuban/Model/classgen.py: Added short module doc string and CVS id.
7307     (ClassGenerator.GenUniformDistribution): Use new Range __init__, too.
7308    
7309 bh 983 2003-05-22 Bernhard Herzog <[email protected]>
7310    
7311 bh 985 Implement a way to discover dependencies between tables and
7312     shapestores.
7313    
7314     * Thuban/Model/transientdb.py (TransientTableBase.Dependencies)
7315     (TransientJoinedTable.Dependencies)
7316     (AutoTransientTable.SimpleQuery): New. Implement the dependencies
7317     interface
7318     (TransientJoinedTable.__init__): Keep tack of the original table
7319     objects in addition to the corresponding transient tables.
7320    
7321     * Thuban/Model/table.py (DBFTable.Dependencies)
7322     (MemoryTable.Dependencies): New. Implement the dependencies
7323     interface
7324    
7325     * Thuban/Model/data.py (ShapeTable): New. Helper class for
7326     ShapefileStore
7327     (ShapefileStore.__init__): Use ShapeTable instead of
7328     AutoTransientTable
7329     (ShapefileStore.Table, ShapefileStore.Shapefile): Add doc-strings
7330     (ShapefileStore.FileName, ShapefileStore.FileType): New. Accessor
7331     methods for filename and type
7332     (ShapefileStore.Dependencies): New. Implement the dependencies
7333     interface
7334     (DerivedShapeStore): New class to replace SimpleStore. The main
7335     difference to SimpleStore is that it depends not on a shapefile
7336     but another shapestore which expresses the dependencies a bit
7337     better
7338     (SimpleStore.__init__): Add deprecation warning.
7339    
7340     * test/test_dbf_table.py (TestDBFTable.test_dependencies): New.
7341     Test for the Dependencies method.
7342    
7343     * test/test_memory_table.py (TestMemoryTable.test_dependencies):
7344     New. Test for the Dependencies method.
7345    
7346     * test/test_transientdb.py
7347     (TestTransientTable.test_auto_transient_table_dependencies): New.
7348     Test for the Dependencies method.
7349     (TestTransientTable.test_transient_joined_table): Add test for the
7350     Dependencies method.
7351    
7352     * test/test_session.py (TestSessionSimple.setUp)
7353     (TestSessionSimple.tearDown): New. Implement a better way to
7354     destroy the sessions.
7355     (TestSessionSimple.test_initial_state)
7356     (TestSessionSimple.test_add_table): Bind session to self.session
7357     so that it's destroyed by tearDown
7358     (TestSessionSimple.test_open_shapefile): New. Test for
7359     OpenShapefile and the object it returns
7360    
7361     2003-05-22 Bernhard Herzog <[email protected]>
7362    
7363 bh 983 * Thuban/Model/session.py (Session.AddTable): New method to
7364     register tables with the session.
7365     (Session.Tables): Return the tables registered with AddTable too.
7366    
7367     * test/test_session.py (TestSessionSimple.test_add_table): New.
7368     Test case for the AddTable method
7369    
7370 frank 981 2003-05-22 Frank Koormann <[email protected]>
7371    
7372     UI polishing updates: Place main buttons (OK, Cancel, etc) in the
7373     lower right corner, center labels for selections, initialize controls
7374     in reasonable order for keyboard navigation.
7375    
7376     * Thuban/UI/projdialog.py (ProjFrame.__init__, ProjFrame.__doLayout)
7377     (ProjFrame.__DoOnProjAvail): Determine position of current projection
7378     using the wxListBox.FindString() method. Still a problem (#1886)
7379    
7380     * Thuban/UI/classifier.py
7381     (Classifier.__init__, SelectPropertiesDialog.__init__)
7382    
7383     * Thuban/UI/classgen.py (ClassGenDialog.__init__,
7384     (ClassGenDialog.__DoOnGenTypeSelect): Moved initialization of the
7385     different classification types from here to __init__.
7386     (GenUniquePanel.__init__): Set the column width of the first field
7387     in the Field ListCtrl to the full width.
7388    
7389     * Thuban/UI/tableview.py (LayerTableFrame.__init__): Rename 'Save As'
7390     Button to 'Export'. Center Buttons in Selection Box, set Focus to
7391     Grid.
7392     (LayerTableFrame.OnKeyDown()): New, bound to the grid with EVT_KEY_DOWN,
7393     changes focus to the Selection when pressing "Alt-S".
7394    
7395     * Thuban/UI/legend.py (LegendTree.__SetVisibilityStyle): Only gray out
7396     the text if not visible. The italic font sometimes exceeds the
7397     rendering area.
7398    
7399 jonathan 972 2003-05-21 Jonathan Coles <[email protected]>
7400 jonathan 971
7401 jonathan 975 * Thuban/UI/dock.py (DockFrame): Rename references to _OnClose
7402     to OnClose so that Thuban closes correctly.
7403    
7404     * Thuban/UI/mainwindow.py (MainWindow.OnClose): Call
7405     DockFrame.OnClose, not DockFrame._OnClose.
7406    
7407     2003-05-21 Jonathan Coles <[email protected]>
7408    
7409 jonathan 971 * Thuban/Model/classgen.py (ClassGenerator.GenQuantiles): Remove
7410     references to 'inf' and use new Range __init__ to pass floats
7411     directly rather than converting them to strings first.
7412     Fixes RTBug #1876.
7413    
7414     * Thuban/Model/classification.py (ClassGroupRange.SetRange):
7415     Use new Range ___init__ to pass floats.
7416    
7417     * Thuban/Model/layer.py (RasterLayer.__init__): Test if the
7418     filename is a valid image file. Throw IOError otherwise.
7419    
7420     * Thuban/Model/range.py: Brought over new Range from SciParam that
7421     is immutable and has an __init__ which can accept floats.
7422    
7423     * Thuban/UI/mainwindow.py (MainWindow.AddLayer): Move OpenShapefile
7424     into try block. AddLayer doesn't throw any exceptions anymore.
7425     (MainWindow.AddRasterLayer): Move constructor of RasterLayer into
7426     try block.
7427    
7428     * Thuban/UI/projdialog.py (GeoPanel.__init__): Put Degrees as
7429     the first item in choices. Fixes RTBug #1882.
7430    
7431     * Thuban/UI/renderer.py (MapRenderer.render_map): Check if scale
7432     has gone to 0 which is a serious problem. abort.
7433     (MapRenderer.draw_raster_layer): Catch IOError seperately and
7434     print the error from GDAL.
7435    
7436     * Thuban/UI/tableview.py (TableGrid.__init__): Call
7437     ToggleEventListeners to turn on listening.
7438     (TableGrid.ToggleEventListeners): New. Turns event listening on
7439     and off so as to prevent excessive messages.
7440     (LayerTableFrame.OnQuery): Use TableGrid.ToggleEventListeners
7441     to suppress excessive messages when selecting many rows.
7442     Fixes RTBug #1880.
7443    
7444     * Thuban/UI/view.py: Added checks against if scale == 0. This
7445     is a serious problem that can occur when an image without
7446     geo data is loading and causes the map projection bounds to
7447     go to infinity. Right now, the solution is to simply try
7448     to recover.
7449    
7450     * extensions/thuban/cpl_mfile.cpp (MFILEClose): Make sure
7451     to set the MFILEReceiver attributes even if the data is NULL.
7452    
7453     * extensions/thuban/gdalwarp.cpp: Improved the error handling
7454     and passed GDAL messages back up to the Python layer. Also
7455     tried to fix some memory leaks that were present in the original
7456     utility but didn't matter because the program aborted.
7457    
7458     * test/test_range.py: Copied over tests from SciParam. Removed
7459     tests against importing. Fixes RTBug #1867.
7460    
7461 bh 958 2003-05-21 Bernhard Herzog <[email protected]>
7462    
7463     * test/test_load.py: Remove unused imports and restructure the
7464     test code
7465     (LoadSessionTest): Split into one class for each test and turn
7466     LoadSessionTest itself into the base class for all such session
7467     tests.
7468     (ClassificationTest): New base class for load tests that test
7469     classifications
7470     (TestSingleLayer, TestLayerVisibility, TestClassification)
7471     (TestLabels, TestLayerProjection, TestRasterLayer): New classes
7472     for the individual tests
7473    
7474     * test/support.py (FileLoadTestCase.filename): New base class for
7475     file loading tests
7476    
7477 jan 955 2003-05-21 Jan-Oliver Wagner <[email protected]>
7478    
7479     * Resources/Projections/defaults.proj: Renamed 'Universal Transverse
7480     Mercator' to 'UTM Zone 32' as a more convenient example.
7481     Added 'Gauss Krueger Zone 6'.
7482    
7483     * Data/iceland_sample_raster.thuban: political polygon now
7484     filled transparent to have the raster image visible at once.
7485    
7486 frank 952 2003-05-21 Frank Koormann <[email protected]>
7487    
7488     * Thuban/UI/mainwindow.py (MainWindow): Renamed _OnClose() back to
7489     OnClose() to keep in sync with extensions. Internally Thuban
7490     still uses "underscored" names.
7491    
7492 jonathan 949 2003-05-20 Jonathan Coles <[email protected]>
7493    
7494     This puts back Raster layer support. These layers support projections
7495     through the GDAL library. Currently, the CVS version is being used.
7496     There are no Debian packages available although this may change soon.
7497     A GDAL driver was extended to support writing to memory rather to
7498     files.
7499    
7500     There is still some work that needs to be done, such as some error
7501     handling when loading invalid images or when there is a problem
7502     projecting the image. This putback simply checks in the majority
7503     of the work.
7504    
7505     * setup.py: Add gdalwarp library extension.
7506    
7507     * Thuban/Model/layer.py (BaseLayer.HasClassification): New.
7508     Defaults to False, but can be overridden by subclasses if they
7509     support classification.
7510     (RasterLayer): New. Defines a new layer that represents an
7511     image.
7512    
7513     * Thuban/Model/load.py (SessionLoader.__init__): Add rasterlayer
7514     tag handler.
7515     (SessionLoader.start_layer): Encode the filename.
7516     (SessionLoader.start_rasterlayer, SessionLoader.end_rasterlayer):
7517     New. Supports reading a rasterlayer tag.
7518    
7519     * Thuban/Model/map.py (Map.BoundingBox): Fix typo in comment.
7520    
7521     * Thuban/Model/save.py (XMLWriter.encode): Don't assume that we
7522     get a string in Latin1. If we get such as string convert it to
7523     unicode first, otherwise leave if alone before encoding.
7524     (SessionSaver.write_layer): Add support for writing both Layers
7525     and RasterLayers.
7526    
7527     * Thuban/Model/transientdb.py (AutoTransientTable.SimpleQuery):
7528     The right argument may not be a string, it could also be a Column.
7529    
7530     * Thuban/UI/application.py (ThubanApplication.CreateMainWindow):
7531     Make initial window size 600x400. Fixes RTBug #1872.
7532    
7533     * Thuban/UI/classifier.py (Classifier.__init__): Rearrange how
7534     the dialog is constructed so that we can support layers that
7535     do not have classifications.
7536     (Classifier._OnTry): Only build a classification if the layer
7537     supports one.
7538    
7539     * Thuban/UI/legend.py: Change all checks that a layer is an
7540     instance of Layer into checks against BaseLayer.
7541     (LegendTree.__FillTreeLayer): Only add children to a branch if
7542     the layer supports classification.
7543    
7544     * Thuban/UI/mainwindow.py (MainWindow.NewSession,
7545     MainWindow.OpenSession): Don't proceed with an action if the
7546     user chooses Cancel when they are asked to save changes.
7547     (MainWindow.AddRasterLayer): New. Open a dialog to allow the
7548     user to select an image file. Create a new RasterLayer and add
7549     it to the map.
7550    
7551     * Thuban/UI/renderer.py (MapRenderer.render_map): Add support
7552     for rendering RasterLayer layers.
7553     (MapRenderer.draw_raster_layer): Actually method that calls
7554     the GDALWarp python wrapper and constructs an image from the
7555     data returned.
7556    
7557     * Thuban/UI/tableview.py (LayerTableFrame.__init__): Change the
7558     Choices symbols to match those used in the table query method.
7559     Replace deprecated method calls on table with new method names.
7560    
7561     * Thuban/UI/view.py (MapCanvas.set_view_transform): Try to limit
7562     how small the scale can get. This still needs more testing.
7563    
7564     * extensions/thuban/bmpdataset.cpp: New, but copied from GDAL.
7565     Provides a driver to output in .bmp format.
7566    
7567     * extensions/thuban/cpl_mfile.cpp, extensions/thuban/cpl_mfile.h:
7568     New. Provides IO routines which write to memory, rather than a file.
7569    
7570     * extensions/thuban/gdalwarp.cpp: New, but basically a direct copy
7571     of the gdalwarp utility provided in GDAL. Added function calls
7572     that can be accessed from python.
7573    
7574     * Data/iceland_sample_raster.thuban: New. Sample file that uses
7575     a raster layer.
7576    
7577     * Data/iceland/island.tfw, Data/iceland/island.tif: New. Raster
7578     layer image data.
7579    
7580     * Doc/thuban.dtd: Added rasterlayer attribute definition.
7581    
7582     * test/test_layer.py, test/test_load.py, test/test_save.py: Added
7583     tests associated with the raster layer code.
7584    
7585     * test/test_transientdb.py
7586     (TestTransientTable.test_auto_transient_table_query): Added a test
7587     for using a Column object as the "right" parameter to a query.
7588    
7589 frank 924 2003-05-19 Frank Koormann <[email protected]>
7590    
7591 frank 927 * Thuban/version.py (get_changelog_date):
7592     Catch exceptions if ChangeLog does not exist.
7593    
7594     * Thuban/UI/view.py (MapCanvas.Export): Bugfix
7595    
7596     2003-05-19 Frank Koormann <[email protected]>
7597    
7598 frank 924 Extended version information for Thuban
7599    
7600     * Thuban/version.py: New, version information for Thuban: Last
7601     modification date and last ChangeLog entry date.
7602    
7603     * Thuban/UI/mainwindow.py (MainWindow.About()): Extended version
7604     information: Display Thuban, wxPython and Python version.
7605    
7606 bh 919 2003-05-16 Bernhard Herzog <[email protected]>
7607    
7608 bh 921 * Thuban/Model/save.py: Remove some unused imports including the
7609     __future__ import for nested_scopes as Thuban relies on Python 2.2
7610     now.
7611     (XMLWriter.encode): Remove the special case for a None argument.
7612     In the saver encode is always called with a string argument.
7613    
7614     2003-05-16 Bernhard Herzog <[email protected]>
7615    
7616 bh 919 * Thuban/UI/__init__.py: Remove the work-around for the locale bug
7617     in wxPython (at least when usinvg wxGTK) prior to 2.4. The symptom
7618     of the bug was that e.g. float("1.2") would fail. Thuban now
7619     requires 2.4.x.
7620    
7621 frank 917 2003-05-16 Frank Koormann <[email protected]>
7622    
7623     Printing enhancement and WMF export (under Win32)
7624    
7625     * Thuban/UI/renderer.py (ExportRenderer): New, derived from
7626     ScreenRenderer. Renders Map, Legend and Scalebar for export.
7627     (PrinterRenderer): New, derived from ExportRenderer. Replaces the old
7628     PrintRender.
7629    
7630     * Thuban/UI/view.py (MapPrintout.__init__): Enhanced parameter set
7631     to fullfil information needed for PrinterRenderer.
7632     (MapCanvas.Export): New. Export Map (currently only to WMF on Win32).
7633     (MapCanvas.Print): Adapted to new MapPrintout.
7634     (OutputTransform): General calculations to transform from canvas
7635     coordinates to export/printing devices.
7636    
7637     * Thuban/UI/mainwindow.py (MainWindow.ExportMap()): New. Added also
7638     new method_command to call ExportMap, with platform dependency (only
7639     __WXMSW__)
7640    
7641     * Thuban/UI/scalebar.py (ScaleBar.DrawScaleBar): Position and Size
7642     of scalebar drawing area as new parameters.
7643    
7644     * Thuban/Model/scalebar.py (roundInterval): round long instead of int
7645    
7646     * Thuban/UI/legend.py (ScalebarBitmap.__SetScale):
7647     Update to extended scalebar.DrawScalebar header.
7648    
7649     * test/test_export.py: New, test Thuban.UI.view.OutputTransform()
7650    
7651     * test/test_scalebar.py: Made test executable as standalone.
7652    
7653 bh 908 2003-05-16 Bernhard Herzog <[email protected]>
7654    
7655     * Thuban/Model/table.py (Table): Remove this compatibility alias
7656     for DBFTable.
7657    
7658     * test/test_table.py: Import DBFTable as Table because that alias
7659     doesn't exist anymore.
7660    
7661     * Thuban/UI/classgen.py: Remove some unused imports
7662    
7663 jonathan 906 2003-05-14 Jonathan Coles <[email protected]>
7664    
7665     * Thuban/Model/classgen.py (ClassGenerator.GenSingletonsFromList):
7666     Fix docstring.
7667     (ClassGenerator.GenUniformDistribution): Fix spelling of method name.
7668     (ClassGenerator.GenQuantiles): Use the left/right brackets and min/max
7669     values of the supplied range to determine the beginning and end
7670     bounds of the generated classes.
7671    
7672     * Thuban/Model/range.py (Range.number_re): Now accepts floats that
7673     do not have a leading 0 (.5 is now accepted as well as 0.5).
7674    
7675     * Thuban/UI/classgen.py (ClassGenDialog.OnOK): Fix name of method
7676     call to ClassGenerator.GenUniformDistribution.
7677    
7678     * Thuban/UI/projdialog.py (ProjFrame.__do_layout): Fix Windows
7679     layout bug with the 'Projection' label.
7680    
7681     * test/support.py (FloatTestCase): New. Needed for the Range tests.
7682    
7683     * test/test_range.py: New. Imported from SciParam.
7684    
7685 jonathan 897 2003-05-12 Jonathan Coles <[email protected]>
7686    
7687 jonathan 899 * Thuban/UI/classgen.py (GenQuantilesPanel.GetList): Replace call
7688     to table.UniqueValues() with calls that retrieve all the values
7689     from the table. This will need to be replaced by a method on table
7690     which can simply return the list (perhaps more efficiently).
7691    
7692     2003-05-12 Jonathan Coles <[email protected]>
7693    
7694 jonathan 897 The return value of ClassGenerator.CalculateQuantiles has changed.
7695     Refer to the documentation for details.
7696    
7697     * test/test_classgen.py: Modified Quantile tests to use the
7698     new return values.
7699    
7700     * Thuban/Model/classgen.py
7701     (ClassGenerator.GenQuantiles): Add comments describing the parameters,
7702     use new return values from CalculateQuantiles to produce the correct
7703     range bounds in the Classification.
7704     (ClassGenerator.CalculateQuantiles): Add more comments describing
7705     the return values and parameters. Make minor adjustments to improve
7706     the legibility of the code. Fix problem with adjusted not being set
7707     in most cases.
7708    
7709 frank 893 2003-05-12 Frank Koormann <[email protected]>
7710    
7711     * Thuban/Model/save.py (XMLWriter.encode()): Explicite call to unicode
7712     and latin1. Fixes #1851 finally.
7713    
7714 jonathan 889 2003-05-09 Jonathan Coles <[email protected]>
7715    
7716 jonathan 897 * test/test_classgen.py: New. Tests the Quantile algorithm.
7717    
7718     * Thuban/Model/classgen.py (ClassGenerator.CalculateQuantiles):
7719     Clean up debugging statement, add comments, fix a small bug in the
7720     returned adjusted percentiles.
7721    
7722     2003-05-09 Jonathan Coles <[email protected]>
7723    
7724 jonathan 889 Introduces Range class from SciParam into the ClassGroupRange class,
7725     and such ranges can now be saved and loaded from disk.
7726    
7727     Quantiles are now available in the Classification Generator.
7728    
7729     Initial support for building Queries on a table. Doesn't do anything
7730     but run some tests.
7731    
7732     * Thuban/Model/classification.py: Explicit imports.
7733     (ClassGroupRange): Use the Range class to store the underlying
7734     range information. The interface remains the same, except for
7735     GetRange(), and you can also supply a Range object as the min
7736     parameter to SetRange or __init__.
7737    
7738     * Thuban/Model/load.py (XMLReader.encode): New. Encodes the given
7739     string appropriately for use in Thuban. Fixes RTbug #1851.
7740     (SessionLoader.end_projection): Handle the context of the
7741     projection tag a bit better by looking at what objects are not
7742     None. There was an assumption that a projection tag for a map
7743     could occur before any layers.
7744     (SessionLoader.start_clrange): Provide backward compatibility for
7745     reading min/max values as well as the new range parameter.
7746    
7747     * Thuban/Model/map.py: Explicit imports.
7748    
7749     * Thuban/Model/resource.py: Import _.
7750     (ProjFileSaver.write): write header using projfile.dtd.
7751    
7752     * Thuban/Model/save.py: Explicit imports.
7753     (XMLWriter.encode): New. Encode the given string from a format
7754     used by Thuban into UTF-8. Fixes RTbug #1851.
7755    
7756     * Thuban/UI/classgen.py: Explicit imports.
7757     (ClassGenDialog.__init__): Clean up the code and add support
7758     for Quantiles.
7759     (ClassGenDialog.OnOK): Add support for Quantiles.
7760     (GenQuantilesPanel): New. Input panel for Quantiles.
7761     (ClassGenerator, CustomRamp, MonochromaticRamp, GreyRamp, RedRamp,
7762     GreenRamp, BlueRamp, HotToColdRamp): Move to Thuban/Model/classgen.py
7763    
7764     * Thuban/Model/classgen.py: New. Contains all the classes named above.
7765    
7766     * Thuban/UI/classifier.py: Explicit imports.
7767     (ClassTable.GetValueAsCust, ClassTable.__ParseInput,
7768     ClassTable.SetValueAsCustom): Reworked to use new Range class.
7769    
7770     * Thuban/UI/legend.py: Explicit imports.
7771    
7772     * Thuban/UI/mainwindow.py: Add support for the Join Dialog. Added
7773     a Table menu and associated method calls.
7774     (MainWindow.choose_color): Removed. No longer needed.
7775    
7776     * Thuban/UI/projdialog.py (ProjFrame.__VerifyButtons): Save button
7777     should be disabled if no projection is selected in the available
7778     list.
7779    
7780     * Thuban/UI/renderer.py: Explicit imports.
7781    
7782     * Thuban/UI/tableview.py (TableGrid.OnRangeSelect): Fix some issues
7783     with correctly selecting the rows and issuing the right events.
7784     Be sure to call Skip() to allow the grid to do some of its own
7785     handling which allows the rows to actually be selected.
7786     (LayerTableGrid.select_shapes): Rename from select_shape. Supports
7787     selecting multiple shapes.
7788     (LayerTableFrame): Support for building Queries.
7789     (LayerTableFrame.select_shapes): Allow multiple shapes to be selected.
7790    
7791     * Thuban/UI/tree.py: Explicit imports.
7792    
7793     * Thuban/UI/view.py (MapCanvas): Delegate "SelectedShapes" so the
7794     table view can call it.
7795    
7796     * test/test_classification.py: Explicit imports.
7797     (TestClassification.test_ClassGroupRange): Fix test for new
7798     Range class.
7799    
7800     * Doc/thuban.dtd: Add range parameter for clrange.
7801    
7802     * Thuban/Model/range.py: Taken from SciParam. Used as the underlying
7803     object in ClassGroupRange, and also uesd for inputting ranges in
7804     the classifer table and elsewhere.
7805    
7806     * Thuban/UI/join.py: New. Initial Join dialog. No real functionality
7807     yet.
7808    
7809 frank 872 2003-05-09 Frank Koormann <[email protected]>
7810    
7811     * Thuban/UI/scalebar.py (DrawScaleBar): Draw only if interval > 0.0.
7812    
7813 frank 860 2003-05-08 Frank Koormann <[email protected]>
7814    
7815 frank 870 Coding style updates
7816    
7817     * test/test_scalebar.py: Replaced tab indentation by spaces.
7818    
7819     * Thuban/UI/scalebar.py: Explicit imports.
7820    
7821     2003-05-08 Frank Koormann <[email protected]>
7822    
7823 frank 867 * Thuban/UI/scalebar.py
7824     (ScaleBar.DrawScalebar): Format string bug fixed.
7825    
7826     2003-05-08 Frank Koormann <[email protected]>
7827    
7828 frank 865 Reorganization of scalebar component (no wx in Thuban/Model)
7829    
7830     * Thuban/Model/scalebar.py: Rendering moved to Thuban/UI/scalebar.py
7831     (deriveInterval):
7832     Calculate scalebar interval and unit which fits in width for scale.
7833     (roundInterval): Round float.
7834    
7835     * Thuban/UI/scalebar.py (ScaleBar): Scalebar rendering
7836    
7837     * test/test_scalebar.py: Test for Thuban/Model/scalebar.py methods.
7838    
7839     * Thuban/UI/legend.py: Import Thuban.UI.scalebar
7840    
7841     2003-05-08 Frank Koormann <[email protected]>
7842    
7843 frank 860 * Thuban/UI/legend.py (ScalebarBitmap.SetCanvas):
7844     Initialize ScaleBar with canvas.map
7845    
7846     * Thuban/Model/scalebar.py (ScaleBar.roundInterval()): New,
7847     round intervals to display smarter lengths
7848     (ScaleBar.DrawScalebar): Draw Scalebar only if the map contains a
7849     layer. If the maps has no projection applied grey the scalebar.
7850    
7851 frank 857 2003-05-07 Frank Koormann <[email protected]>
7852    
7853     Basic Scalebar features added.
7854    
7855     * Thuban/Model/scalebar.py (ScaleBar): New, scalebar rendering.
7856    
7857     * Thuban/UI/legend.py (LegendPanel): Added scalebar bitmap
7858     (ScaleBarBitmap): New, links the scalebar bitmap with view messages
7859     and the renderer.
7860    
7861     * Thuban/UI/view.py (MapCanvas.set_view_transform): Issue SCALE_CHANGED.
7862    
7863     * Thuban/UI/messages.py: SCALE_CHANGED added.
7864    
7865 bh 850 2003-05-07 Bernhard Herzog <[email protected]>
7866    
7867 bh 852 * Thuban/Model/session.py (Session.__init__): New instance
7868     variable shapestores to hold a list of all open shapestore objects
7869     (Session.ShapeStores): New. Accessor method for the shapestores
7870     list.
7871     (Session._add_shapestore, Session._clean_weak_store_refs): New.
7872     Internal methods to maintain the shapestores list.
7873     (Session.Tables): New. Return all tables open in the session.
7874     (Session.OpenShapefile): Insert the new ShapeStore into the
7875     shapestores list.
7876    
7877     * test/test_session.py (TestSessionSimple.test_initial_state): Add
7878     tests for ShapeStores and Tables
7879     (TestSessionWithContent.test_shape_stores)
7880     (TestSessionWithContent.test_tables): New. Test cases for
7881     ShapeStores and Tables
7882    
7883     2003-05-07 Bernhard Herzog <[email protected]>
7884    
7885 bh 850 * Thuban/Model/transientdb.py (TransientTableBase.ReadRowAsDict):
7886     Add comments about the optimizations used.
7887     (AutoTransientTable.ReadValue, TransientTableBase.ReadValue): New.
7888     Implement the ReadValue table interface method.
7889    
7890     * test/test_transientdb.py
7891     (TestTransientTable.run_iceland_political_tests)
7892     (TestTransientTable.test_transient_joined_table): Add tests for
7893     ReadValue
7894    
7895 frank 848 2003-05-07 Frank Koormann <[email protected]>
7896    
7897     * Resources/Bitmaps/fulllayerextent.xpm,
7898     Resources/Bitmaps/fullselextent.xpm: Replaced the place holders with
7899     new icons.
7900    
7901 bh 840 2003-05-06 Bernhard Herzog <[email protected]>
7902    
7903 bh 846 * Thuban/Model/transientdb.py (AutoTransientTable.SimpleQuery):
7904     New. Simply delegate to the transient table's version.
7905    
7906     * test/test_transientdb.py
7907     (TestTransientTable.test_auto_transient_table_query): New. Test
7908     case for AutoTransientTable's SimpleQuery
7909    
7910     2003-05-06 Bernhard Herzog <[email protected]>
7911    
7912 bh 843 * Thuban/Model/transientdb.py (TransientTableBase.SimpleQuery):
7913     Implement a simple query method for the query dialog
7914     (TransientTableBase.create): Add an INTEGER PRIMARY KEY that holds
7915     the row index or shapeid.
7916     (TransientTable.create): Insert the right value of the row index
7917     (TransientJoinedTable.create): Copy the row index of the left
7918     table to the joined result table
7919    
7920     * test/test_transientdb.py
7921     (TestTransientTable.test_transient_table_read_twice): Fix
7922     doc-string
7923     (TestTransientTable.test_transient_table_query): New. Test for the
7924     SimpleQuery method
7925    
7926     2003-05-06 Bernhard Herzog <[email protected]>
7927    
7928 bh 840 Convert all table users to use the new table interface. This only
7929     covers Thuban itself, not GREAT-ER or other applications built on
7930     Thuban yet, so the compatibility interface stays in place for the
7931     time being but it now issues DeprecationWarnings.
7932    
7933     Finally, the new Table interface has a new method, HasColumn.
7934    
7935     * Thuban/Model/table.py (OldTableInterfaceMixin): All methods
7936     issue deprecation warnings when they're. The warnings refer to the
7937     caller of the method.
7938     (OldTableInterfaceMixin.__deprecation_warning): New. Helper method
7939     for the deprecation warnings
7940    
7941     * test/test_table.py: Ignore the deprecation warnings for the old
7942     table in the tests in this module. The purpose of the tests is to
7943     test the old interface, after all.
7944    
7945     * test/test_transientdb.py
7946     (TestTransientTable.run_iceland_political_tests): Use the
7947     constants for the types. Add a test for HasColumn
7948     (TestTransientTable.test_transient_joined_table): Adapt to new
7949     table interface. Add a test for HasColumn
7950     (TestTransientTable.test_transient_table_read_twice): Adapt to new
7951     table interface
7952    
7953     * Thuban/UI/tableview.py (DataTable.SetTable, DataTable.GetValue):
7954     Adapt to new table interface
7955    
7956     * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Adapt to
7957     new table interface
7958    
7959     * Thuban/UI/controls.py (RecordListCtrl.fill_list)
7960     (RecordTable.SetTable): Adapt to new table interface
7961    
7962     * Thuban/UI/classifier.py (Classifier.__init__)
7963     (Classifier.__init__): Adapt to new table interface
7964    
7965     * Thuban/UI/classgen.py (ClassGenDialog.__init__)
7966     (GenUniformPanel._OnRetrieve, GenUniquePanel._OnRetrieve): Adapt
7967     to new table interface
7968    
7969     * Thuban/Model/transientdb.py (TransientTableBase.HasColumn)
7970     (AutoTransientTable.HasColumn): Implement the new table interface
7971     method
7972     (AutoTransientTable.ReadRowAsDict, AutoTransientTable.ValueRange)
7973     (AutoTransientTable.UniqueValues): Adapt to new table interface
7974    
7975     * Thuban/Model/layer.py (Layer.SetShapeStore, Layer.GetFieldType):
7976     Adapt to new table interface
7977    
7978     * test/test_layer.py (TestLayer.open_shapefile): Helper method to
7979     simplify opening shapefiles a bit easier.
7980     (TestLayer.test_arc_layer, TestLayer.test_polygon_layer)
7981     (TestLayer.test_point_layer): Use the new helper method
7982     (TestLayer.test_get_field_type): New. Test for the GetFieldType
7983     method
7984    
7985     * test/test_dbf_table.py (TestDBFTable.test_has_column): Test for
7986     the new table method
7987    
7988     * test/test_memory_table.py (TestMemoryTable.test_has_column):
7989     Test for the new table method HasColumn
7990    
7991 jonathan 833 2003-05-06 Jonathan Coles <[email protected]>
7992    
7993     Addresses the "Selection Extent" wish of RTbug #1787.
7994    
7995     * Resources/Bitmaps/fulllayerextent.xpm,
7996     Resources/Bitmaps/fullselextent.xpm: Bitmaps for layer and selection
7997     extent. These are just place holders for the real bitmaps.
7998    
7999     * Thuban/Model/layer.py (Shape): Since a Shape is immutable only
8000     calculate the bounding box once (the first time compute_bbox() is
8001     called).
8002     (Layer.ShapesBoundingBox): New. Given a list of shape ids, return
8003     the bounding box for the shapes in lat/long coordinates.
8004    
8005     * Thuban/UI/mainwindow.py: Added new "Full selection extent" menu
8006     option.
8007     (MainWindow.has_selected_shapes): New. Returns true if there are
8008     any selected shapes.
8009     (MainWindow.FullSelectionExtent): New. Calls
8010     MapCanvas.FitSelectedToWindow() when the user selects the menu option.
8011     (_has_selected_shapes): New. Returns true if there are any
8012     selected shapes.
8013    
8014     * Thuban/UI/selection.py (Selection.HasSelectedShapes): New. Returns
8015     true if there are any selected shapes.
8016    
8017     * Thuban/UI/view.py (MapCanvas): Added delegated method
8018     HasSelectedShapes.
8019     (MapCanvas.FitSelectedToWindow): New. Centers and scales any selected
8020     shapes on the canvas using the map projection (if any).
8021    
8022     * test/test_layer.py (TestLayer.test_arc_layer): Add some tests
8023     for Layer.ShapesBoundingBox().
8024    
8025 bh 826 2003-05-06 Bernhard Herzog <[email protected]>
8026    
8027     * Resources/Projections/defaults.proj: Fix spelling of Mercator
8028    
8029 jonathan 823 2003-05-05 Jonathan Coles <[email protected]>
8030    
8031     Addresses the "Full Layer Extent" wish of RTbug #1787.
8032    
8033     * Resources/Projections/defaults.proj: Added UK National Grid.
8034    
8035     * Thuban/UI/mainwindow.py: Added new "Full layer extent" menu option.
8036     (MainWindow.FullLayerExtent): New. Calls MapCanvas.FitLayerToWindow()
8037     when the user selects the menu option.
8038    
8039     * Thuban/UI/view.py (MapCanvas.FitLayerToWindow): New. Centers and
8040     scales the given layer on the canvas using the map projection.
8041    
8042 bh 819 2003-05-05 Bernhard Herzog <[email protected]>
8043    
8044     Convert the table implementations to a new table interface. All
8045     tables use a common mixin class to provide backwards compatibility
8046     until all table users have been updated.
8047    
8048     * Thuban/Model/table.py (OldTableInterfaceMixin): Mixin class to
8049     provide backwards compatibility for table classes implementing the
8050     new interface
8051     (DBFTable, MemoryTable): Implement the new table interface. Use
8052     OldTableInterfaceMixin as base for compatibility
8053     (DBFColumn, MemoryColumn): New. Column description for DBFTable
8054     and MemoryTable resp.
8055    
8056     * test/test_dbf_table.py: New. Test cases for the DBFTable with
8057     the new table interface.
8058    
8059     * test/test_memory_table.py: New. Test cases for the MemoryTable
8060     with the new table interface.
8061    
8062     * test/test_table.py: Document the all tests in this file as only
8063     for backwards compatibility. The equivalent tests for the new
8064     interface are in test_memory_table.py and test_dbf_table.py
8065     (MemoryTableTest.test_read): field_info should be returning tuples
8066     with four items
8067     (MemoryTableTest.test_write): Make doc-string a more precise.
8068    
8069     * Thuban/Model/transientdb.py (TransientTableBase): Convert to new
8070     table interface. Derive from from OldTableInterfaceMixin for
8071     compatibility.
8072     (TransientTableBase.create): New intance variable column_map to
8073     map from names and indices to column objects
8074     (TransientTable.create): Use the new table interface of the input
8075     table
8076     (AutoTransientTable): Convert to new table interface. Derive from
8077     from OldTableInterfaceMixin for compatibility.
8078     (AutoTransientTable.write_record): Removed. It's not implemented
8079     yet and we still have to decide how to handle writing with the new
8080     table and data framework.
8081    
8082     * test/test_transientdb.py
8083     (TestTransientTable.run_iceland_political_tests)
8084     (TestTransientTable.test_transient_joined_table): Use the new
8085     table interface
8086    
8087 jonathan 817 2003-05-05 Jonathan Coles <[email protected]>
8088    
8089     This is namely a collection of UI updates to improve user interactivity.
8090     Tabbing between controls now exists and you can use ESC to close dialog
8091     boxes; ENTER will active the default button.
8092    
8093     * Thuban/UI/classgen.py (ClassGenDialog.__init__): Rearrange the
8094     order that the controls are created so that tabbing works correctly.
8095     (ClassGenDialog.OnOK): Renamed from _OnGenerate() so that the
8096     wxDialog can handle the default button correctly.
8097     (ClassGenDialog.OnCancel): Renamed from _OnCloseBtn() for the
8098     same reasons as for OnOK.
8099     (GenUniformPanel._OnRetrieve): Call wxBeginBusyCursor/wxEndBusyCursor
8100     when we ask the table for the maximum/minimum values of a field
8101     which could take a very long time.
8102    
8103     * Thuban/UI/classifier.py (Classifier.__init__): Rearrange the
8104     order that the controls are created so that tabbing works correctly.
8105     (SelectPropertiesDialog.__init__): Rearrange the order that the
8106     controls are created so that tabbing works correctly.
8107    
8108     * Thuban/UI/dialogs.py: Copied NonModalDialog box and changed it
8109     to derive from a wxDialog but behave like the original implementation
8110     which was derived from a wxFrame. wxDialog provides useful key
8111     handling functionality like ESC calling OnCancel and ENTER calling
8112     OnOK which is lost with wxFrame.
8113    
8114     * Thuban/UI/mainwindow.py: Add "..." to menu items that will open
8115     new dialogs.
8116    
8117     * Thuban/UI/projdialog.py (ProjFrame.__init__): Rearrange the
8118     order that the controls are created so that tabbing works correctly.
8119     (ProjFrame.OnApply): Renamed from _OnTry() to use wxDialog behaviour.
8120     (ProjFrame.OnOK): Renamed from _OnOK() to use wxDialog behaviour.
8121     (ProjFrame.OnCancel): Renamed from _OnClose() to use wxDialog behaviour.
8122     (ProjPanel.__init__): Add "Airy" to the list of ellipsoids so we
8123     can provide the "UK National Grid" as a default projection.
8124     (UTMPanel.__init__): Rearrange the order that the controls are
8125     created so that tabbing works correctly.
8126    
8127 bh 809 2003-05-05 Bernhard Herzog <[email protected]>
8128    
8129 bh 811 * extensions/thuban/wxproj.cpp: Fix some of the comments.
8130     (project_point): If a map projection but no layer projection is
8131     given, convert degrees to radians before applying the map
8132     projection.
8133    
8134 bh 809 * Thuban/UI/tableview.py (TableGrid.disallow_messages)
8135     (TableGrid.allow_messages): New methods to make it possible to
8136     inhibit message sending.
8137     (TableGrid.issue): Only send the message if not inhibited.
8138     (LayerTableGrid.select_shape): Use the new methods to make sure
8139     that no ROW_SELECTED message is sent while we're updating the
8140     selected rows to match the selected shapes.
8141    
8142 jan 807 2003-05-02 Jan-Oliver Wagner <[email protected]>
8143    
8144     Implementation of MemoryTable.
8145    
8146     * Thuban/Model/table.py (MemoryTable): New. Quite simple table
8147     implementation that operates on a list of tuples. All of the data
8148     are kept in the memory.
8149    
8150     * test/test_table.py (MemoryTableTest): New.
8151    
8152     * test/test_transientdb.py (SimpleTable): Removed.
8153     (TestTransientTable.test_transient_joined_table,
8154     (TestTransientTable.test_transient_table_read_twice): Replaced
8155     SimpleTable by MemoryTable.
8156    
8157 jonathan 793 2003-04-30 Jonathan Coles <[email protected]>
8158    
8159 jonathan 803 * Data/iceland_sample.thuban: Now contains correct projections
8160     for each of the layers.
8161    
8162     * Resources/Projections/defaults.proj: Geographic projection
8163     contains unit conversion parameter.
8164    
8165     2003-04-30 Jonathan Coles <[email protected]>
8166    
8167 jonathan 793 The most important part of this putback is the projection changes.
8168     It should now be possible to specify the projection that a layer
8169     is in and then specify a different projection for the map. The
8170     projection dialog has an extra parameter for a geographic projection
8171     which lets the user select if the input is in degrees or radians.
8172    
8173     * Thuban/Model/layer.py (Layer.ShapesInRegion): Fix docstring
8174     to say that the parameter is a tuple of unprojected
8175     points (which is what the callers to this method were assuming).
8176     Also, since the points are unprojected we need to projected them.
8177    
8178     * Thuban/UI/legend.py (LegendTree.MoveCurrentItemUp,
8179     LegendTree.MoveCurrentItemDown): If the layer or any of the layer's
8180     groups are selected, move the layer up/down. Fixes RTbug #1833.
8181    
8182     * Thuban/UI/mainwindow.py: Move menu item map_rename up.
8183    
8184     * Thuban/UI/projdialog.py (ProjFrame._OnSave): Add missing
8185     parameter in call to SetClientData.
8186     (GeoPanel): Add support for selecting the units that the
8187     source data is in (Radians or Degrees).
8188    
8189     * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Optimize
8190     the rendering loop by reducing the number of if's, removing the
8191     unnecessary try/except block, and checking if the old group
8192     is the same as the new one (which happens a lot if there is
8193     no classification, or lots of shapes are in the same group).
8194    
8195     * Thuban/UI/view.py (MapCanvas.OnPaint): Add a try/except block
8196     around the redraw routine to try to catch problems that the user
8197     may create by selecting invalid projections for the data set and
8198     map. Clears the display if there are any problems and prints the
8199     error.
8200     (MapCanvas.do_redraw): Use DC.Clear() instead of drawing a filled
8201     rectangle.
8202    
8203     * extensions/thuban/wxproj.cpp (project_point): First invert the
8204     supplied point (which should be in projected coordinates) using
8205     the layer's projection and then project the point using the
8206     map's projection.
8207     (project_points): Use project_point() to project each point.
8208    
8209 jan 792 2003-04-30 Jan-Oliver Wagner <[email protected]>
8210    
8211     * Thuban/Model/layer.py (Layer.SetShapeStore): Fixed a bug:
8212     don't set the Classification to None if the classfication field
8213     is None (ie only a DEFAULT).
8214    
8215 bh 786 2003-04-30 Bernhard Herzog <[email protected]>
8216    
8217 bh 790 * Thuban/UI/view.py: Fix some typos.
8218    
8219 bh 788 * Thuban/UI/mainwindow.py (MainWindow.identify_view_on_demand): Do
8220     not pop up the dialog if the selection becomes empty (this could
8221     happen if e.g. a new selection is opened while the identify tool
8222     is active and dialog had been closed)
8223    
8224     2003-04-30 Bernhard Herzog <[email protected]>
8225    
8226 bh 786 * Thuban/Model/transientdb.py (TransientTableBase.__init__): New
8227     instance variable read_record_last_result
8228     (TransientTableBase.read_record): Make sure reading the same
8229     record twice works. The implementation uses the new instance
8230     variable read_record_last_result
8231    
8232     * test/test_transientdb.py
8233     (TestTransientTable.test_transient_table_read_twice): New test
8234     case for the above bug-fix.
8235    
8236 jonathan 793 2003-04-29 Jonathan Coles <[email protected]>
8237    
8238     * Thuban/common.py: Removed. No longer needed Str2Num. RTbug #1832.
8239    
8240     * Thuban/UI/classgen.py: Remove all uses of Str2Num.
8241    
8242     * Thuban/UI/classifier.py: Remove all uses of Str2Num.
8243     (ClassTable.SetValueAsCustom): Rename keyword argument in
8244     ClassGroup* constructors to match argument name.
8245    
8246 bh 779 2003-04-29 Bernhard Herzog <[email protected]>
8247    
8248     * Thuban/Model/session.py (Session.Destroy): Explicitly close the
8249     transient DB if it exists to make sure it doesn't leave a journal
8250     file in the temp directory.
8251    
8252     * Thuban/Model/transientdb.py (TransientDatabase.close): Set
8253     self.conn to None after closing the connection to make sure it's
8254     not closed twice
8255    
8256 jonathan 767 2003-04-29 Jonathan Coles <[email protected]>
8257    
8258 jonathan 769 Add a visible parameter in the layer XML tag. The default value is
8259     "true". If anything other than "false" is specified we also assume
8260 jonathan 776 "true". Addresses RTbug #1025.
8261 jonathan 769
8262     * Doc/thuban.dtd: Add visible parameter to a layer.
8263    
8264     * Thuban/Model/layer.py (BaseLayer.__init__): Change default value
8265     of visible from 1 to True.
8266     (Layer.__init__): Change default value of visible from 1 to True.
8267    
8268     * Thuban/Model/load.py (SessionLoader.start_layer): Read visible
8269     parameter.
8270    
8271     * Thuban/Model/save.py (SessionSaver.write_layer): Save visible
8272     parameter.
8273    
8274     * test/test_load.py: Add new test data contents_test_visible.
8275     (LoadSessionTest.setUp): save test data.
8276     (LoadSessionTest.testLayerVisibility): Test if the visible flag
8277     is loaded correctly.
8278    
8279     * test/test_save.py (SaveSessionTest.testSingleLayer): Add test
8280     for saving an invisible layer.
8281    
8282     2003-04-29 Jonathan Coles <[email protected]>
8283    
8284 jonathan 767 * Thuban/UI/mainwindow.py (MainWindow.SetMap): Look up the
8285     legend dialog box and tell it to change its map to the one
8286     supplied to SetMap(). Fixes RTbug #1770.
8287    
8288 bh 764 2003-04-29 Bernhard Herzog <[email protected]>
8289    
8290 bh 766 Next step of table implementation. Introduce a transient database
8291     using SQLite that some of the data is copied to on demand. This
8292     allows us to do joins and other operations that require an index
8293     for good performance with reasonable efficiency. Thuban now needs
8294     SQLite 2.8.0 and pysqlite 0.4.1. Older versions may work but I
8295     haven't tested that.
8296    
8297     * Thuban/Model/transientdb.py: New. Transient database
8298     implementation.
8299    
8300     * test/test_transientdb.py: New. Tests for the transient DB
8301     classes.
8302    
8303     * Thuban/Model/session.py (AutoRemoveFile, AutoRemoveDir): New
8304     classes to help automatically remove temporary files and
8305     directories.
8306     (Session.__init__): New instance variables temp_dir for the
8307     temporary directory and transient_db for the SQLite database
8308     (Session.temp_directory): New. Create a temporary directory if not
8309     yet done and return its name. Use AutoRemoveDir to have it
8310     automatically deleted
8311     (Session.TransientDB): Instantiate the transient database if not
8312     done yet and return it.
8313    
8314     * Thuban/Model/data.py (ShapefileStore.__init__): Use an
8315     AutoTransientTable so that data is copied to the transient DB on
8316     demand.
8317     (SimpleStore): New class that simply combines a table and a
8318     shapefile
8319    
8320     * Thuban/Model/table.py (Table, DBFTable): Rename Table into
8321     DBFTable and update its doc-string to reflect the fact that this
8322     is only the table interface to a DBF file. Table is now an alias
8323     for DBFTable for temporary backwards compatibility.
8324    
8325     * Thuban/UI/application.py (ThubanApplication.OnExit): Make sure
8326     the last reference to the session goes away so that the temporary
8327     files are removed properly.
8328    
8329     * test/test_load.py (LoadSessionTest.tearDown): Remove the
8330     reference to the session to make sure the temporary files are
8331     removed.
8332    
8333     2003-04-29 Bernhard Herzog <[email protected]>
8334    
8335 bh 764 * Thuban/Model/load.py (XMLReader.__init__, XMLReader.read): Turn
8336     the __parser instance variable into a normal local variable in
8337     read. It's only used there and read will never be called more than
8338     once. Plus it introduces a reference cycle that keeps can keep the
8339     session object alive for a long time.
8340    
8341 jonathan 767 2003-04-29 Jonathan Coles <[email protected]>
8342 jonathan 735
8343 jonathan 762 * Thuban/Model/proj.py (Projection): Removed Set*() methods to make
8344     Projection an immutable item. Fixes RTbug #1825.
8345     (Projection.__init__): Initialize instance variables here.
8346     (ProjFile.Replace): New. Replace the given projection object with
8347     the new projection object. This solves the problem of needing the
8348     mutator Projection.SetProjection() in the ProjFrame class and
8349     allows a projection to change parameters without changing its
8350     location in the file.
8351    
8352     * Thuban/UI/mainwindow.py (MainWindow.SaveSessionAs): Dialog should
8353     be of type wxSAVE and should verify overwriting a file.
8354    
8355     * Thuban/UI/projdialog.py (ProjFrame._OnSave): Use the new
8356     ProjFile.Replace() method instead of the mutator
8357     Projection.SetProjection(). Also requires that we reassign the
8358     client data to the new projection.
8359    
8360     * test/test_proj.py (TestProjection.test): Test GetName() and
8361     GetAllParameters()
8362     (TestProjFile.test): Remove tests for Set*() methods. Add tests
8363     for Replace().
8364    
8365     2003-04-25 Jonathan Coles <[email protected]>
8366    
8367 jonathan 756 * Thuban/Model/save.py (SessionSaver.write_projection): Make sure
8368     to save the name of the projection.
8369    
8370     * test/test_save.py (SaveSessionTest.testLayerProjection): New
8371     test to verify layer projections are saved correctly.
8372    
8373     2003-04-25 Jonathan Coles <[email protected]>
8374    
8375 jonathan 753 * Thuban/Model/proj.py (Projection.SetName): Set the name
8376     to "Unknown" if name is None.
8377     (Projection.SetAllParameters): New. Set the projection's
8378     parameter list to the one supplied.
8379     (Projection.SetProjection): New. Set the projection's
8380     properties to those of the supplied Projection.
8381    
8382     * Thuban/UI/mainwindow.py (MainWindow.MapProjection): Set
8383     the dialog title to include the map's title.
8384     (MainWindow.LayerProjection): Set the dialog title to include
8385     the layer's title.
8386    
8387     * Thuban/UI/projdialog.py (ProjFrame.__ShowError): Consolidate
8388     error dialogs into a single method call.
8389     (ProjFrame.__VerifyButtons): Add more states to check.
8390     (ProjFrame.__GetProjection): Return the current state of an
8391     edited projection or None.
8392     (ProjFrame.__FillAvailList): Remove checks for states that
8393     shouldn't exist.
8394     (ProjFrame._OnNew): Clear all selected items and supply
8395     a projection panel if necessary.
8396    
8397     * test/test_proj.py (TestProjFile.test): Add tests for
8398     ProjFile.SetAllParameters, ProjFile.SetProjection,
8399     ProjFile.SetName.
8400    
8401     2003-04-25 Jonathan Coles <[email protected]>
8402    
8403 jonathan 748 * Thuban/UI/projdialog.py (ProjFrame.__FillAvailList): Now
8404     takes an optional argument to select the current projection.
8405     This does not guarantee that the item is visible due to
8406     limited wxWindows functionality. Fixes RTBug #1821.
8407    
8408     2003-04-25 Jonathan Coles <[email protected]>
8409    
8410 jonathan 743 * Thuban/Model/load.py (SessionLoader.start_projection): Remember
8411     the projection name and use it when constructing the Projection
8412     object.
8413    
8414     * Thuban/Model/proj.py (Projection.__init__): Change the default
8415     value for 'name' to None and then test if name is equal to None
8416     in the body of the constructor. This way the caller doesn't have to
8417     know what the default value should be. Namely, useful in load.py
8418     where we have to pick a default value if the 'name' parameter
8419     doesn't exist in the XML file.
8420    
8421     * test/test_load.py (LoadSessionTest.testLayerProjection): New.
8422     Tests a file where a layer has a projection.
8423    
8424     2003-04-25 Jonathan Coles <[email protected]>
8425    
8426 jonathan 735 * Thuban/Model/layer.py (Layer.TreeInfo): Add an item to the
8427     tree for projection information.
8428    
8429     * Thuban/Model/load.py (XMLReader.GetFilename): Renamed from
8430     XMLReader.GetFileName.
8431     (SessionLoader): Added support for loading projection tags that
8432     appear inside a layer.
8433    
8434     * Thuban/Model/proj.py (ProjFile): Document the class. Move
8435     back to using a list because the order of the projections in
8436     the file is important to maintain. Fixes RTbug #1817.
8437    
8438     * Thuban/Model/resource.py: Rename calls to ProjFile.GetFileName
8439     to ProjFile.GetFilename.
8440    
8441     * Thuban/Model/save.py (SessionSaver.write_layer): Save projection
8442     information.
8443    
8444     * Thuban/UI/projdialog.py (ProjFrame._OnAddToList): Renamed from
8445     ProjFrame._OnSaveAs. Removed old dead code from previous
8446     implementation.
8447     (ProjFrame._OnExport): Add support for exporting more than one
8448     projection to a single file.
8449     (ProjFrame.__FillAvailList): use string formatting (% operator)
8450     to build strings that are (partly) translated. Fixes RTbug #1818.
8451    
8452     * test/test_proj.py (TestProjFile.test): New. Tests the base ProjFile
8453     class.
8454    
8455 bh 734 2003-04-24 Bernhard Herzog <[email protected]>
8456    
8457     * po/es.po: Updated Spanish translation by Daniel Calvelo Aros
8458    
8459     * po/fr.po: New. French translation by Daniel Calvelo Aros
8460    
8461     * Thuban/UI/projdialog.py (ProjFrame._OnSaveAs): Don't translate
8462     empty strings.
8463    
8464 jonathan 735 2003-04-24 Jonathan Coles <[email protected]>
8465 jonathan 724
8466     * Thuban/Model/layer.py (Layer.GetProjection): New. Needed to
8467     implement the interface that the ProjFrame dialog expects.
8468    
8469     * Thuban/Model/proj.py (Projection.SetName): New. Allows the
8470     name of the projection to be changed.
8471     (ProjFile): Use a dictionary instead of a list so that removing
8472     projections is easier and we are sure about uniqueness.
8473     (ProjFile.Remove): Remove the given projection object.
8474    
8475     * Thuban/Model/resource.py (GetSystemProjFiles, GetUserProjFiles):
8476     Return a list with only one projection file instead of searching for
8477     any projection file. This simplifies many things if the user can
8478     only have one system file and one user file.
8479    
8480     * Thuban/UI/classgen.py: Change all references to
8481     genCombo to genChoice.
8482    
8483     * Thuban/UI/mainwindow.py: Add a Projection option under the
8484     layer menu.
8485     (MainWindow.LayerProjection): New. Open up a projection window
8486     for a layer.
8487    
8488     * Thuban/UI/projdialog.py: Large changes to how the dialog is
8489     laid out. Use three panels instead of one. One for the list of
8490     projections, one for the edit controls, and one for the buttons.
8491     Fixed resizing problems so that the dialog resizes correctly
8492     when the projection panel changes. Added import/export, save, and
8493     new buttons/functionality.
8494    
8495 bh 723 2003-04-24 Bernhard Herzog <[email protected]>
8496    
8497     First step towards table management. Introduce a simple data
8498     abstraction so that we replace the data a layer uses more easily
8499     in the next step.
8500    
8501     * Thuban/Model/data.py: New file with a simple data abstraction
8502     that bundles shapefile and dbffile into one object.
8503    
8504     * Thuban/Model/session.py (Session.OpenShapefile): New method to
8505     open shapefiles and return a shape store object
8506    
8507     * Thuban/Model/layer.py (Layer.__init__): Pass the data as a store
8508     object instead of a shapefile filename. This introduces a new
8509     instance variable store holding the datastore. For intermediate
8510     backwards compatibility keep the old instance variables.
8511     (open_shapefile): Removed. No longer needed with the shape store.
8512     (Layer.SetShapeStore, Layer.ShapeStore): New methods to set and
8513     get the shape store used by a layer.
8514     (Layer.Destroy): No need to explicitly destroy the shapefile or
8515     table anymore.
8516    
8517     * Thuban/UI/mainwindow.py (MainWindow.AddLayer)
8518     (MainWindow.AddLayer): Use the session's OpenShapefile method to
8519     open shapefiles
8520    
8521     * Thuban/Model/load.py (ProcessSession.start_layer): Use the
8522     session's OpenShapefile method to open shapefiles
8523    
8524     * test/test_classification.py
8525     (TestClassification.test_classification): Use the session's
8526     OpenShapefile method to open shapefiles and build the filename in
8527     a more platform independed way
8528    
8529     * test/test_layer.py (TestLayer.setUp, TestLayer.tearDown):
8530     Implement to have a session to use in the tests
8531     (TestLayer.test_arc_layer, TestLayer.test_polygon_layer)
8532     (TestLayer.test_point_layer, TestLayer.test_empty_layer): Use the
8533     session's OpenShapefile method to open shapefiles
8534     (TestLayerLegend.setUp): Instantiate a session so that we can use
8535     it to open shapefiles.
8536     (TestLayerLegend.tearDown): Make sure that all references to
8537     layers and session are removed otherwise we may get a resource
8538     leak
8539    
8540     * test/test_map.py (TestMapAddLayer.test_add_layer)
8541     (TestMapWithContents.setUp): Instantiate a session so that we can
8542     use it to open shapefiles.
8543     (TestMapWithContents.tearDown): Make sure that all references to
8544     layers, maps and sessions are removed otherwise we may get a
8545     resource leak
8546     ("__main__"): use support.run_tests() so that more info about
8547     uncollected garbage is printed
8548    
8549     * test/test_save.py (SaveSessionTest.testSingleLayer): Use the
8550     session's OpenShapefile method to open shapefiles
8551     ("__main__"): use support.run_tests() so that more info about
8552     uncollected garbage is printed
8553    
8554     * test/test_selection.py (TestSelection.tearDown): Make sure that
8555     all references to the session and the selection are removed
8556     otherwise we may get a resource leak
8557     (TestSelection.get_layer): Instantiate a session so that we can
8558     use it to open shapefiles.
8559     ("__main__"): use support.run_tests() so that more info about
8560     uncollected garbage is printed
8561    
8562     * test/test_session.py (TestSessionBase.tearDown)
8563     (TestSessionWithContent.tearDown): Make sure that all references
8564     to the session and layers are removed otherwise we may get a
8565     resource leak
8566     (TestSessionWithContent.setUp): Use the session's OpenShapefile
8567     method to open shapefiles
8568    
8569 jonathan 721 2003-04-24 Jonathan Coles <[email protected]>
8570    
8571     * Thuban/Model/load.py (XMLReader.read): Should have been checking
8572     if the file_or_filename object had the 'read' attribute.
8573    
8574 jonathan 715 2003-04-23 Jonathan Coles <[email protected]>
8575    
8576 jonathan 720 * Thuban/Model/resource.py: Fixes RTbug #1813.
8577     (ReadProjFile): Add documentation about which exceptions are raised.
8578     Always pass the exceptions up to the caller.
8579     (GetProjFiles): If the directory can't be read return an empty list.
8580     If any of the proj files can't be read skip that file and go
8581     on to the next one.
8582    
8583     * test/test_proj.py: Added test cases to handle nonexistent files,
8584     unreadable files, and files that don't parse correctly.
8585    
8586     2003-04-23 Jonathan Coles <[email protected]>
8587    
8588 jonathan 716 Projection dialog. Allows the user to select from a list
8589     of projection templates and optionally edit them and save new ones.
8590    
8591     * Thuban/UI/projdialog.py (ProjFrame): New. Main dialog.
8592     (ProjPanel): Base class for projection specific panels.
8593     (TMPanel): Projection panel for Transverse Mercartor.
8594     (UTMPanel): Projection panel for Universal Transverse Mercartor.
8595     (LCCPanel): Projection panel for Lambert Conic Conformal.
8596     (GeoPanel): Projetion panel for Geographic Projection.
8597    
8598     2003-04-23 Jonathan Coles <[email protected]>
8599    
8600 jonathan 715 * Thuban/Model/load.py (XMLReader): Renamed from XMLProcessor to
8601     promote symmetry. There now exists XMLReader and XMLWriter.
8602     (XMLReader.read): New. Call to read the given file descriptor or
8603     filename.
8604     (XMLReader.close): New. Make sure the file is closed.
8605     (XMLReader.GetFileName): New. Return just the file name that is being
8606     read from.
8607     (XMLReader.GetDirectory): New. Return just the directory of the file
8608     that is being read.
8609     (XMLReader.AddDispatchers): New. Take a dictionary which contains
8610     the names of functions to call as the XML tree is parsed.
8611     (XMLReader.startElementNS): Updated to use new dispatcher dictionary.
8612     (XMLReader.endElementNS): Updated to use new dispatcher dictionary.
8613     (SessionLoader): Removed class variables start_dispatcher and
8614     end_dispatcher since this functionality is now part of a class
8615     instance. Fixes RTbug #1808.
8616     (SessionLoader.__init__): Add dispatcher functions.
8617     (load_xmlfile): Code was moved into the XMLReader.read().
8618     (load_session): Use modified SessionLoader.
8619    
8620     * Thuban/Model/map.py (Map.GetProjection): New. Returns the
8621     map's projection.
8622    
8623     * Thuban/Model/proj.py (Projection.GetParameters): Renamed to
8624     GetAllParameters.
8625     (Projection.GetParameter): Returns the value for the given parameter.
8626    
8627     * Thuban/Model/resource.py: Use XMLReader and XMLWriter.
8628     (GetProjFiles): Renamed from GetProjections. Now returns a list
8629     of ProjFile objects.
8630     (GetSystemProjFiles): Renamed from GetSuppliedProjections. Returns
8631     a list of ProjFile objects whose files are not user defined.
8632     (GetUserProjFiles): Renamed from GetUserProjections. Returns a
8633     list of ProjFile objects whose files are user defined.
8634     (ProjFileReader): Extend new XMLReader.
8635    
8636     * Thuban/Model/save.py (XMLWriter): Renamed from XMLSaver to
8637     promote symmetry.
8638    
8639     * Thuban/UI/classgen.py (ClassGenDialog.__init__): Use a wxChoice
8640     control instead of a wxComboBox. wxChoice controls do not generate
8641     events as the uses highlights possible choices which fixes problems
8642     with resizing the dialog when the use selects an option.
8643    
8644     * Thuban/UI/classifier.py (Classifier.__init__): Use a wxChoice
8645     control instead of a wxComboBox.
8646    
8647     * Thuban/UI/mainwindow.py (MainWindow.Projection): Use new projection
8648     dialog.
8649    
8650     * test/test_proj.py (TestProjection.test): New tests for GetParameter
8651     method.
8652    
8653 bh 703 2003-04-22 Bernhard Herzog <[email protected]>
8654    
8655 bh 705 * Thuban/UI/mainwindow.py: Remove some unused imports and global
8656     constants
8657    
8658 bh 703 * Thuban/UI/identifyview.py (IdentifyListCtrl.selected_shape)
8659     (IdentifyGridCtrl.selected_shape): Use table, not shapetable.
8660    
8661 bh 700 2003-04-17 Bernhard Herzog <[email protected]>
8662    
8663 bh 701 * Thuban/Model/layer.py: Don't import LAYER_LEGEND_CHANGED.
8664     (Layer): Update doc-string since LAYER_LEGEND_CHANGED is not used
8665     anymore.
8666     (Layer.BoundingBox, Layer.GetFieldType, Layer.NumShapes)
8667     (Layer.ShapeType, Layer.Shape): No need to call
8668     self.open_shapefile since it's always called in __init__
8669    
8670 bh 700 * Thuban/UI/application.py (ThubanApplication.MainLoop): Removed.
8671     In wxPython 2.4 there's no need to extend MainLoop anymore since
8672     wxPython itself makes sure OnExit is called.
8673    
8674 jonathan 688 2003-04-16 Jonathan Coles <[email protected]>
8675    
8676 jonathan 693 Initial putback of projection management code. Includes new
8677     classes to read and write projection files. The current load
8678     and save classes were abstracted a bit so they could be reused.
8679     The Projection class was extended to provide new methods and
8680     have a name.
8681    
8682     * Thuban/Model/load.py (XMLProcessor): New. Contains all the
8683     general XML reading methods that were part of ProcessSession.
8684    
8685     * Thuban/Model/proj.py (Projection.__init__): Accepts an optional
8686     name.
8687     (ProjFile): New. Represents a file that contains projection
8688     information.
8689    
8690     * Thuban/Model/resource.py: New. Contains general utilities
8691     for read and writing projection files.
8692    
8693     * Thuban/Model/save.py (XMLSaver): New. Contains all the
8694     general XML writing methods that were part of SessionSaver.
8695     (SessionSaver): Renamed from Saver.
8696    
8697     * test/test_proj.py: New test cases for the projection
8698     file read and write functions.
8699    
8700     2003-04-16 Jonathan Coles <[email protected]>
8701    
8702 jonathan 688 * Thuban/Model/classification.py: Use repr() around values
8703     in the ClassGroup*.__repr__() methods so it is clearer when
8704     a value is a string and when it is a number.
8705    
8706     * test/test_load.py: Rework the classification test to test
8707     that we can load old files.
8708     (testLabels): Test a file where the groups have labels.
8709    
8710 bh 687 2003-04-16 Bernhard Herzog <[email protected]>
8711    
8712     Safer implementation of the performance enhancements of the
8713     low-level renderer:
8714    
8715     * extensions/thuban/wxproj.cpp (extract_projection)
8716     (extract_pointer): Rename extract_projection to extract_pointer
8717     and redefine its purpose to return the pointer stored in a CObject
8718     returned by the object's cobject method. Update all callers.
8719     (s_draw_info, free_draw_info, draw_polygon_init): Implement the
8720     handling of these low-level parameters so that each s_draw_info
8721     instance is handled as a CObject at python level that also
8722     contains real references to the actual python objects which
8723     contain the values in the struct. Add free_draw_info as the
8724     destructor.
8725     (draw_polygon_shape): Add the py_draw_info parameter which must a
8726     cobject containing an s_draw_info pointer.
8727    
8728     * Thuban/UI/renderer.py (MapRenderer.polygon_render_param): New
8729     method to instantiat the low-level render parameter
8730     (MapRenderer.draw_shape_layer): Use the new method. Remove some
8731     commented out code.
8732     (MapRenderer.draw_polygon_shape): Make the first parameter not the
8733     layer but the low-level render parameter
8734     (ScreenRenderer.draw_shape_layer): Use the low-level render
8735     parameter.
8736    
8737 jonathan 673 2003-04-15 Jonathan Coles <[email protected]>
8738    
8739 jonathan 680 * Thuban/Model/classification.py: Implemented __repr__ for
8740     the ClassGroup* classes to make debugging a bit easier.
8741     (ClassGroup.SetLabel): Check that the string is an instance
8742     of StringTypes not StringType. Accounts for Unicode strings.
8743    
8744     * Thuban/Model/color.py: Implemented __repr__ to make
8745     debugging a bit easier.
8746    
8747     * Thuban/Model/save.py (Saver.write_classification): Need to
8748     save the group label.
8749    
8750     * test/test_load.py (testClassification): New. Loads the
8751     iceland_sample_test.thuban file and checks if it was loaded
8752     correctly.
8753    
8754     2003-04-15 Jonathan Coles <[email protected]>
8755    
8756 jonathan 673 * extensions/thuban/wxproj.cpp (draw_polygon_init): New. Used
8757     to improve rendering performance by initializing the variables
8758     that are not change each time draw_polygon_shape() is called.
8759     The values are stored in a global struct draw_info.
8760     (draw_polygon_shape): Removed initialization code that is
8761     now in draw_polygon_init().
8762    
8763     * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Make
8764 jonathan 674 drawing initialization call to draw_polygon_init()
8765     (MapRenderer.draw_polygon_shape): Use new signature of
8766     draw_polygon_shape.
8767 jonathan 673
8768 jonathan 674 * Thuban/UI/classgen.py (GenUniformPanel): Fix spin control
8769     weirdness by setting the range to (1, maxint).
8770 jonathan 673
8771 jonathan 674 * Thuban/Model/classification.py (ClassGroupProperties): Make
8772     instance variables private and optimize comparison operator
8773     by first checking if the color references are the same.
8774     (ClassGroupSingleton): Make instance variables private.
8775     (ClassGroupRange): Make instance variables private.
8776 jonathan 673
8777 jonathan 674 * HOWTO-Release: Filled in missing steps for releasing packages.
8778    
8779 bh 672 2003-04-15 Bernhard Herzog <[email protected]>
8780    
8781     First stab at internationalized messages:
8782    
8783     * Thuban/__init__.py (_): Implement the translation function for
8784     real using the python gettext module.
8785    
8786     * Thuban/UI/classifier.py (ClassTable.GetRowLabelValue): Don't
8787     translate empty strings.
8788    
8789     * Thuban/UI/application.py (ThubanApplication.read_startup_files):
8790     Add a missing space to a warning message
8791    
8792     * po/README: New. Notes about the management of the translation
8793     files.
8794    
8795     * po/Makefile: New. Makefile to help manage the translation files.
8796    
8797     * po/es.po: New. Spanish translation by Daniel Calvelo Aros
8798    
8799     * MANIFEST.in: Include the *.mo files in Resources/Locale and the
8800     translations and support files in po/
8801    
8802     * setup.py (data_files): Add the *.mo files to the data_files too
8803    
8804     * README: Add note about the translations when building from CVS
8805    
8806 jonathan 669 2003-04-14 Jonathan Coles <[email protected]>
8807    
8808     * Thuban/UI/dock.py: Fixes some window resizing problems most
8809     noticable under windows. Always assume the button bitmaps will
8810     be there. Code clean up.
8811     (DockabelWindow.Dock, DockableWindow.UnDock): Force all the
8812     images for the dock/undock button to the same images.
8813     Work around for RTbug #1801.
8814    
8815     * Thuban/UI/legend.py (LegendPanel.__init__): The toolbar should
8816     be allowed to grow within the sizer. Fixes a bug under Windows
8817     where the toolbar wasn't being drawn.
8818    
8819 frank 664 2003-04-14 Frank Koormann <[email protected]>
8820    
8821     * Resources/Bitmaps/dock_12.xpm, Resources/Bitmaps/undock_12.xpm:
8822     Updated design to try to make the button functionality more
8823     transparent.
8824    
8825 jonathan 662 2003-04-14 Jonathan Coles <[email protected]>
8826    
8827     * Thuban/UI/legend.py (LegendPanel.__init__): Call Create() to
8828     finalize the intialization of the panel.
8829    
8830     * Thuban/UI/dock.py (DockPanel.Create): New. Finalizes the
8831     creation of the panel. Should be the last thing called in the
8832     initializer of a subclass.
8833    
8834     * Thuban/UI/classgen.py (ClassGenDialog.__init__): Actively
8835     set the current selections in the combo boxes. This is needed
8836     under Windows.
8837    
8838     * Thuban/UI/classifier.py (Classifier.__init__): Add a top
8839     level panel to the dialog so that the background colors are
8840     consistent under Windows.
8841    
8842 jonathan 646 2003-04-11 Jonathan Coles <[email protected]>
8843    
8844 jonathan 662 * Thuban/UI/classgen.py: Change color ramps to start at white
8845     not black.
8846    
8847     * Thuban/UI/legend.py: Enable/disable the legend buttons when
8848     the legend changes. Fixes RTbug #1793.
8849    
8850     * test/test_classification.py: Added test for copying of
8851     classifications.
8852    
8853     2003-04-11 Jonathan Coles <[email protected]>
8854    
8855 jonathan 647 * Thuban/UI/resource.py: New. Centralize the loading of resources
8856     such as bitmaps.
8857    
8858     * Thuban/UI/classgen.py (GenUniquePanel.__init__): Reordered buttons,
8859     added images to the move buttons, added 'reverse' button.
8860     (CustomRampPanel.__init__): Added images to the move buttons.
8861     (GreyRamp): New. Generates a ramp from white to black.
8862     (HotToColdRamp): New. Generates a ramp from cold to hot colors.
8863    
8864     * Thuban/UI/classifier.py: Refactored ID's from ID_CLASSIFY_* to
8865     ID_PROPERTY_*.
8866     (Classifier.__init__): Minor changes to the layout.
8867     (Classifier._OnTitleChanged): Listen for when the user edits the
8868     title and update the dialog's title and the layer's title.
8869    
8870     * Thuban/UI/dock.py: Use new bitmaps for the control buttons.
8871    
8872     * Thuban/UI/legend.py: Use new bitmaps for the control buttons.
8873     (LegendTree._OnMsgLayerTitleChanged): Change the displayed title
8874     if the layer's title changes.
8875    
8876     * Thuban/UI/mainwindow.py: Added new menu item and associated code
8877     to open a dialog to rename the map.
8878     (MainWindow): Use new resource class to import bitmaps.
8879    
8880     2003-04-11 Jonathan Coles <[email protected]>
8881    
8882 jonathan 646 * Resources/Bitmaps/close_12.xpm, Resources/Bitmaps/dock_12.xpm,
8883 jonathan 647 Resources/Bitmaps/group_use.xpm, Resources/Bitmaps/group_use_all.xpm,
8884     Resources/Bitmaps/group_use_none.xpm,
8885     Resources/Bitmaps/group_use_not.xpm,
8886     Resources/Bitmaps/hide_layer.xpm,
8887     Resources/Bitmaps/layer_properties.xpm,
8888     Resources/Bitmaps/lower_layer.xpm, Resources/Bitmaps/raise_layer.xpm,
8889     Resources/Bitmaps/show_layer.xpm, Resources/Bitmaps/undock_12.xpm:
8890     New.
8891 jonathan 646
8892 jonathan 636 2003-04-10 Jonathan Coles <[email protected]>
8893    
8894 jonathan 644 * Thuban/Model/classification.py: (ClassGroupRange.__init__):
8895     Should pass group to ClassGroup constructor.
8896    
8897     2003-04-10 Jonathan Coles <[email protected]>
8898    
8899 jonathan 636 * Thuban/Model/classification.py: (ClassGroup): Move all the common
8900     methods of the derived classes ([Set|Get]Properties(), __eq__, __ne__)
8901     here. Implement SetVisible(), IsVisible().
8902     (ClassGroup.__init__): Add group parameter which acts as a copy
8903     constructor.
8904    
8905     * Thuban/UI/classifier.py (ClassTable): Add a new column for the
8906     "Visible" check boxes.
8907     (Classifier): Rename the buttons and refactor the code to match
8908     the new labels.
8909    
8910     * Thuban/UI/legend.py: Classify button is now called "Properties".
8911     Refactored the code to change variable names.
8912     (LegendTree.__FillTreeLayer): Only list a group if it is visible.
8913    
8914     * Thuban/UI/mainwindow.py: MainWindow.OpenClassifier renamed to
8915     MainWindow.OpenLayerProperties. MainWindow.LayerEditProperties
8916     renamed to MainWindow.LayerEditProperties.
8917     (MainWindow.ToggleLegend): Don't include map name in legend title.
8918     (MainWindow.SetMap): Added the map name to the window title.
8919     (MainWindow.LayerFillColor, MainWindow.LayerTransparentFill,
8920     MainWindow.LayerOutlineColor, MainWindow.LayerNoOutline): Removed.
8921     Functionality is found in the layer properties dialog.
8922    
8923     * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Only
8924     draw visible groups.
8925    
8926 jonathan 626 2003-04-09 Jonathan Coles <[email protected]>
8927    
8928 jonathan 634 * Thuban/UI/classgen.py: Modifications to allow simple
8929     addition and selection of new color schemes.
8930     (MonochromaticRamp): New. Generates a ramp between two colors.
8931     (RedRamp): New. Generates a ramp of all red.
8932     (GreenRamp): New. Generates a ramp of all green.
8933     (BlueRamp): New. Generates a ramp of all blue.
8934    
8935     2003-04-09 Jonathan Coles <[email protected]>
8936    
8937 jonathan 626 * Thuban/Model/classification.py (Classification.__deepcopy__):
8938     Need to copy over field and fieldType attributes.
8939    
8940     * Thuban/Model/table.py (Table.field_range): New. Retrive the
8941     maximum and minimum values over the entire table for a given
8942     field.
8943     (Table.GetUniqueValues): New. Retrieve all the unique values
8944     in the table for a given field.
8945    
8946     * Thuban/UI/classgen.py: Renamed GenRangePanel to GenUniformPanel.
8947     (GenUniquePanel): New. Controls to allow the user to select
8948     which unique field values they would like in the classification.
8949     (CustomRampPanel): Code that was in ClassGenDialog that allows
8950     the user to select the properties for a custom ramp.
8951     (ClassGenerator.GenUniformDistribution): Was called GenerateRanges.
8952    
8953     * Thuban/UI/classifier.py: Removed a lot of debugging code.
8954     (Classifier._SetClassification): Callback method so that the
8955     class generator can set the classification in the grid.
8956     (ClassGroupPropertiesCtrl): New. Encapsulates the drawing and
8957     editing of a group properties class into a wxWindows control.
8958    
8959     * Thuban/UI/dock.py: It was decided that if the user closes
8960     a dockable window the window should simply hide itself. That
8961     way if the user wants to show the dock again it appears in the
8962     same place as it was when it was closed.
8963     (DockableWindow.Destroy): Call renamed method OnDockDestroy().
8964     (DockableWindow._OnButtonClose): Hide the window instead of
8965     destroying it.
8966     (DockableWindow._OnClose): Hide the window instead of
8967     destroying it.
8968    
8969     * Thuban/UI/legend.py (LegendTree): Use a private method to
8970     consistently set the font and style of the text. Fixes RTbug #1786.
8971    
8972     * Thuban/UI/mainwindow.py: Import just the Classifier class.
8973    
8974 bh 623 2003-04-07 Bernhard Herzog <[email protected]>
8975    
8976 bh 625 * Thuban/UI/mainwindow.py (main_menu): Move the toggle_legend item
8977     to the map module
8978    
8979     2003-04-07 Bernhard Herzog <[email protected]>
8980    
8981 bh 623 * Thuban/UI/mainwindow.py (MainWindow.ShowSessionTree): Removed in
8982     favor of ToggleSessionTree
8983     (MainWindow.ToggleSessionTree): New method to toggle visibility of
8984     the session tree.
8985     (MainWindow.SessionTreeShown): New method to return whether the
8986     session tree is currently shown.
8987     (MainWindow.ToggleLegend): New method to toggle visibility of the
8988     legend
8989     (MainWindow.ShowLegend): Implement in terms of ToggleLegend and
8990     LegendShown
8991     (MainWindow.LegendShown): New method to return whether the legend
8992     is currently shown.
8993     (_method_command): Add checked parameter so we can define check
8994     menu items
8995     (_has_tree_window_shown, _has_legend_shown): Use the appropriate
8996     mainwindow methods.
8997     (show_session_tree, show_legend commands): Removed.
8998     (toggle_session_tree, toggle_legend commands): New commands to
8999     toggle the visibility of the dialogs
9000    
9001 jonathan 612 2003-04-07 Jonathan Coles <[email protected]>
9002    
9003 jonathan 619 * Thuban/UI/classgen.py: Fix Windows problem.
9004    
9005     * Thuban/UI/dock.py: Fix Windows problem.
9006    
9007     * Thuban/UI/mainwindow.py: Use False instead of false.
9008     (MainWindow.ShowLegend): Remove unnecessary switch parameter.
9009    
9010     2003-04-07 Jonathan Coles <[email protected]>
9011    
9012 jonathan 612 Since we now say that the order of the groups in a classification
9013     matters, it makes sense to be able to manipulate that order. Most
9014     of the changes to Thuban/Model/classification.py are to that end.
9015    
9016     * Thuban/Model/classification.py (Classification.AppendGroup,
9017     Classification.InsertGroup, Classification.ReplaceGroup,
9018     Classification.RemoveGroup, Classification.GetGroup): Do as the
9019     names imply.
9020     (Classification.FindGroup): This was called GetGroup, but GetGroup
9021     takes an index, while FindGroup takes a value.
9022     (Classification.__deepcopy__): Copy all the groups, BUT NOT THE LAYER
9023     REFERENCE. Currently there is a cyclic reference between the layer
9024     and its classification. If the classification doesn't need to know
9025     its owning layer we can change this, since it may make sense to be
9026     able to use the same classification with different layers.
9027    
9028     * Thuban/Model/load.py: Use Classification.AppendGroup(), not AddGroup()
9029    
9030     * Thuban/UI/classgen.py: Use Classification.AppendGroup(),
9031     not AddGroup()
9032    
9033     * Thuban/UI/classifier.py: Now that we can depend on the order in
9034     a Classification and have methods to manipulate that order we don't
9035     need to use our own data structures in the grid. We can simply make
9036     the grid/table access the information they need from a copy of
9037     the classification object.
9038     (Classifier._OnCloseBtn): Event handler for when the user clicks
9039     'Close'. This is needed so if the user applies changes and then
9040     continues to change the table the user has the option of discarding
9041     the most recent changes and keeping what they applied.
9042    
9043     * Thuban/UI/mainwindow.py: Put "Show Legend" and "Show Session Tree"
9044     into the same group.
9045    
9046     * extensions/thuban/wxproj.cpp (check_version): If Thuban is compiled
9047     with a really old version of proj, PJ_VERSION won't even be defined.
9048     If it isn't defined then just compile so that the function always
9049     returns Py_False.
9050    
9051     * test/test_classification.py: Fix tests to use the renamed methods.
9052     Still need to write tests for the new methods.
9053    
9054 jonathan 601 2003-04-04 Jonathan Coles <[email protected]>
9055 jonathan 608
9056 jonathan 612 * Thuban/UI/classifier.py (Classifier.__SelectField): Move the
9057     call to SetSelection out of the method and before the call
9058     to __SelectField in __init__. This prevents a recursion of events
9059     when _OnFieldSelect is triggered by the user.
9060    
9061     2003-04-04 Jonathan Coles <[email protected]>
9062    
9063 jonathan 608 * Thuban/Model/classification.py: Rename Color.None to
9064     Color.Transparent.
9065     (ClassGroupProperties.SetLineColori, ClassGroupProperties.SetFill):
9066     Don't bother copying the color, since Colors are immutable.
9067    
9068     * Thuban/Model/color.py, Thuban/Model/layer.py, Thuban/Model/load.py,
9069     Thuban/UI/classifier.py, Thuban/UI/mainwindow.py,
9070     Thuban/UI/renderer.py, Thuban/UI/view.py:
9071     Rename Color.None to Color.Transparent.
9072    
9073     * test/test_classification.py, test/test_load.py: Rename Color.None
9074     to Color.Transparent.
9075    
9076     2003-04-04 Jonathan Coles <[email protected]>
9077 jonathan 603
9078     * Thuban/Model/classification.py: Fix assert calls.
9079     (ClassGroupProperties.SetLineColor, ClassGroupProperties.SetFill):
9080     Copy the color parameter rather than hold onto a reference.
9081 jonathan 601
9082 jonathan 603 * Thuban/Model/color.py (Color.__copy__, Color.__deepcopy): Copy
9083     the color object.
9084     (NoColor.__copy__, NoColor.__deepcopy): Return 'self' so that we
9085     are sure there exists only one refernce to Color.None in the system.
9086     This allows us to use 'is' rather than the comparision functions.
9087    
9088     * Thuban/Model/save.py: Fix assert calls.
9089    
9090     * Thuban/UI/classifier.py: Fix assert calls.
9091     (ClassGrid._OnCellDClick): Call up to the classifier to open the
9092     dialog to edit the groups properties.
9093     (ClassGrid._OnCellResize): Make sure that the scollbars are drawn
9094     correctly if a cell is resized.
9095     (ClassTable.SetClassification): New. Changes the classification
9096     that is in the table.
9097     (ClassTable.__SetRow): Allow groups to be prepended.
9098     (Classifier): New code for opening the EditProperties and
9099     GenerateRanges dialogs.
9100     (SelectPropertiesDialog.__GetColor): Only set the color in the
9101     color dialog if the current color is not None.
9102    
9103     * Thuban/UI/dock.py: Fix assert calls.
9104    
9105     * Thuban/UI/legend.py: Fix assert calls.
9106    
9107     * Thuban/UI/renderer.py: Fix assert calls.
9108    
9109     * Thuban/UI/classgen.py (ClassGenDialog): Dialog for generating
9110     classifications.
9111     (GenRangePanel): Panel specific to range generation.
9112     (GenSingletonPanel): Panel specific to singleton generation.
9113     (ClassGenerator): Class responsible for actually generating
9114     the classification from the data gathered in the dialog box.
9115     (PropertyRamp): Generates properties whose values range from
9116     a starting property to an ending property.
9117 jonathan 601
9118 bh 600 2003-04-03 Bernhard Herzog <[email protected]>
9119    
9120     * test/support.py (print_garbage_information): New function that
9121     prints information about still connected messages and memory
9122     leaks.
9123     (run_suite): Removed.
9124     (run_tests): New function for use as a replacement of
9125     unittest.main in the test_* files. This one calls
9126     print_garbage_information at the end.
9127    
9128     * test/runtests.py (main): Use support.print_garbage_information
9129    
9130     * test/test_layer.py: Use support.run_tests instead of
9131     unittest.main so we get memory leak information
9132     (TestLayer.test_arc_layer, TestLayer.test_polygon_layer)
9133     (TestLayer.test_point_layer, TestLayer.test_empty_layer)
9134     (TestLayerLegend.test_visibility): Call the layer's Destroy method
9135     to fix a memory leak.
9136    
9137     * test/test_classification.py: Use support.run_tests instead of
9138     unittest.main so we get memory leak information
9139     (TestClassification.test_classification): Call the layer's Destroy
9140     method to fix a memory leak.
9141    
9142 bh 591 2003-04-02 Bernhard Herzog <[email protected]>
9143    
9144 bh 595 * extensions/thuban/wxproj.cpp (check_version, check_version_gtk):
9145     Handle the reference counts of the return value and errors in
9146     PyArg_ParseTuple correctly.
9147    
9148 bh 593 * Thuban/UI/application.py (ThubanApplication.OpenSession): Make
9149     sure the filename is absolute to avoid problems when saving the
9150     session again
9151    
9152 bh 591 * Thuban/Model/table.py: Remove unnecessary import. Fix a typo.
9153    
9154 jonathan 587 2003-04-01 Jonathan Coles <[email protected]>
9155    
9156 jonathan 589 * Thuban/UI/renderer.py (MapRenderer.draw_point_shape): Check
9157 jonathan 587 that there actually are points in the returned list of points
9158     before trying to index into the list. The list may be empty if
9159     the shape is a Null Shape.
9160    
9161 bh 586 2003-04-01 Bernhard Herzog <[email protected]>
9162    
9163     * test/test_map.py: Don't use from <module> import *
9164    
9165 jonathan 581 2003-04-01 Jonathan Coles <[email protected]>
9166    
9167     * Thuban/Model/session.py: Use LAYER_CHANGED instead of
9168     LAYER_LEGEND_CHANGED
9169    
9170     * Thuban/UI/dock.py (DockableWindow._OnButtonClose): Call
9171     self.Destroy() to close the window after yesterday's changes.
9172    
9173     * test/test_map.py, test/test_session.py: Fix messages that
9174     are sent from maps and layers.
9175    
9176 jonathan 575 2003-03-31 Jonathan Coles <[email protected]>
9177    
9178     * Thuban/UI/classifier.py: Commented out some debugging statements.
9179     (ClassDataPreviewer.Draw): Draw rectangles for polygon layers per
9180     RTbug #1769.
9181    
9182     * Thuban/UI/dock.py (DockableWindow.UnDock): Restore size and
9183     position (although position doesn't work yet under GTK).
9184     (DockableWindow.Destroy): New. Called when the window must be
9185     closed. Namely needed when the DockFrame closes and must close
9186     its children.
9187     (DockFrame): Listen for EVT_CLOSE and destroy all children.
9188    
9189     * Thuban/UI/legend.py (LegendPanel.Destroy): New. Cleans up
9190     when then window is told to close.
9191     (LegendTree._OnMsgLayerChanged): Fixes a seg fault bug. See
9192     comment in source for more info.
9193    
9194     * Thuban/UI/main.py: Show the legend by default when Thuban starts.
9195    
9196     * Thuban/UI/mainwindow.py: Renamed OnClose to _OnClose for
9197     symmetry with other such methods.
9198     (MainWindow.ShowLegend): Show the legend docked by default.
9199    
9200 jonathan 569 2003-03-28 Jonathan Coles <[email protected]>
9201    
9202     * Thuban/UI/classifier.py: Support for highlighting a specific
9203     group within the grid when the classification dialog is opened.
9204     Also contains a lot of debugging printouts which will later
9205     be removed.
9206    
9207     * Thuban/UI/dock.py: Complete rework on the dock code so that
9208     that it is fairly removed from the rest of the Thuban application.
9209     It is easy to add new docks which the rest of the program having
9210     to be aware of them.
9211    
9212     * Thuban/UI/legend.py: Modifications to support selecting a
9213     specific group in the classification dialog. Changed how layers
9214     are drawn when the layer is visible/invisible.
9215    
9216     * Thuban/UI/mainwindow.py: Removed legend specific code and
9217     replaced it with calls to the new dock code.
9218    
9219     * Thuban/UI/renderer.py (MapRenderer.__init__): Added assert
9220     to check if scale > 0. Trying to track down a divide by zero.
9221    
9222 jonathan 557 2003-03-26 Jonathan Coles <[email protected]>
9223    
9224 jonathan 567 * Thuban/UI/legend.py: Removed unnecessary LegendDialog class.
9225     (LegendPanel): Removed _OnDock()/_OnUnDock() methods which are
9226     now part of DockableWindow.
9227     (LegendPanel.DoOnSelChanged): Select the current layer in the
9228     map.
9229     (LegendTree._OnSelChanged): Call LegendPanel.DoOnSelChanged()
9230     with the selected layer and/or group.
9231    
9232     2003-03-26 Jonathan Coles <[email protected]>
9233    
9234 jonathan 557 This putback contains the code for dockable windows. There is
9235     no support in wxWindows as of this date for windows that can
9236     attach themselves to other windows.
9237    
9238     The current model contains a DockableWindow which has a parent
9239     window for when it is detached and a dock window that it puts
9240     its contents in when it is docked. The contents of a DockableWindow
9241     must be a DockPanel. DockPanel itself derives from wxPanel.
9242    
9243     * Thuban/Model/layer.py (Layer.ClassChanged): Send a LAYER_CHANGED
9244     message, not a LAYER_LEGEND_CHANGED message.
9245    
9246     * Thuban/Model/map.py (Map): Forward LAYER_CHANGED messages.
9247    
9248     * Thuban/UI/classifier.py (Classifier.__init__): Use wxADJUST_MINSIZE
9249     as one of the style properties for the fieldTypeText item to
9250     be sure that its size is correct when the text changes.
9251    
9252     * Thuban/UI/dock.py: New. Classes for the DockPanel and
9253     DockableWindow.
9254    
9255     * Thuban/UI/legend.py: Added some more buttons and made the
9256     LegendPanel a DockPanel.
9257    
9258     * Thuban/UI/mainwindow.py: Added sash windows to the main window
9259     and supporting functions for manipulating the sashes.
9260     (MainWindow.ShowLegend): Create a DockableWindow with the
9261     LegendPanel as the contents.
9262    
9263     * Thuban/UI/messages.py: Added DOCKABLE_* messages
9264    
9265     * Thuban/UI/view.py (MapCanves.SetMap): Listen for LAYER_CHANGED,
9266     not LAYER_LEGEND_CHANGED, messages.
9267    
9268 jonathan 554 2003-03-25 Jonathan Coles <[email protected]>
9269    
9270     * setup.py: Added custom script bdist_rpm_build_script so that
9271     when the rpm is built the path to wx-config is correct.
9272    
9273     * setup.cfg: Added line saying to use the custom build script
9274    
9275 jonathan 552 2003-03-20 Jonathan Coles <[email protected]>
9276    
9277     Initial implementation of the Legend.
9278    
9279     * Thuban/UI/legend.py: New. Creates a window that shows the map's
9280     Legend information and allows the user to add/modify classifications
9281     and how the layers are drawn on the map.
9282    
9283     * setup.py: New command 'build_docs' which currently uses
9284     happydoc to generate html documentation for Thuban.
9285    
9286     * Thuban/Model/classification.py (ClassGroup.GetDisplayText): New.
9287     Returns a string which is appropriately describes the group.
9288    
9289     * Thuban/Model/layer.py (Layer.SetClassification): Generate a
9290     LAYER_CHANGED event instead of a LAYER_LEGEND_CHANGED event.
9291    
9292     * Thuban/Model/map.py (Map): Rename messages and use new, more
9293     specific, messages.
9294    
9295     * Thuban/Model/messages.py: New message to indicate that a layer's
9296     data has changed (LAYER_CHANGED). New map messages to indicate
9297     when layers have been added/removed/changed or if the stacking order
9298     of the layers has changed.
9299    
9300     * Thuban/Model/session.py: Rename and use new messages.
9301    
9302     * Thuban/UI/classifier.py: Remember if any changes have actually
9303     been applied so that if the dialog is cancelled without an application
9304     of changes we don't have to set a new classification.
9305     (ClassDataPreviewer): Pulled out the window specific code and put it
9306     ClassDataPreviewWindow. ClassDataPreviewer can then be used to draw
9307     symbols on any DC.
9308    
9309     * Thuban/UI/mainwindow.py: New code to open the legend.
9310    
9311     * Thuban/UI/view.py: Use new message names.
9312    
9313 jonathan 541 2003-03-19 Jonathan Coles <[email protected]>
9314    
9315     * Thuban/UI/main.py (verify_versions): New. Checks the versions
9316     of Python, wxPython, and some other libraries.
9317    
9318     * extensions/thuban/wxproj.cpp (check_version): Checks the given
9319     version against what wxproj was compiled with.
9320     (check_version_gtk): If wxproj was compiled with gtk then check
9321     the given version against the version of the gtk library
9322     currently being used.
9323    
9324 bh 538 2003-03-14 Bernhard Herzog <[email protected]>
9325    
9326     * test/test_command.py: Run the tests when the module is run as a
9327     script
9328    
9329     2003-03-14 Bernhard Herzog <[email protected]>
9330    
9331     Implement selection of multiple selected shapes in the same layer:
9332    
9333     - Introduce a new class to hold the selection. This basically
9334     replaces the interactor which was nothing more than the
9335     selection anyway. A major difference is of course that the new
9336     selection class supports multiple selected shapes in one layer
9337    
9338     - Move the object that represents the selection from the
9339     application to the canvas. The canvas is a better place than the
9340     application because the selection represents which shapes and
9341     layer of the map displayed by the canvas are selected and
9342     affects how the map is drawn.
9343    
9344     - Make the selection and its messages publicly available through
9345     the mainwindow.
9346    
9347     - The non-modal dialogs do not get a reference to the interactor
9348     anymore as they can simply refer to their parent, the
9349     mainwindow, for the what the interactor had to offer.
9350    
9351     * Thuban/UI/selection.py: New module with a class to represent the
9352     selection.
9353    
9354     * Thuban/UI/messages.py (SELECTED_TABLE, SELECTED_MAP): Remove
9355     these unused messages
9356    
9357     * Thuban/UI/application.py (ThubanApplication.OnInit)
9358     (ThubanApplication.OnExit, ThubanApplication.SetSession): The
9359     interactor is gone now.
9360     (ThubanApplication.CreateMainWindow): There is no interactor
9361     anymore so we pass None as the interactor argument for now for
9362     compatibility.
9363    
9364     * Thuban/UI/view.py (MapCanvas.delegated_messages)
9365     (MapCanvas.Subscribe, MapCanvas.Unsubscribe): In Subscribe and
9366     Unsubscribe, delegate messages according to the delegated_messages
9367     class variable.
9368     (MapCanvas.__getattr__, MapCanvas.delegated_methods): Get some
9369     attributes from instance variables as described with the
9370     delegated_methods class variable.
9371     (MapCanvas.__init__): New instance variable selection holding the
9372     current selection
9373     (MapCanvas.do_redraw): Deal with multiple selected shapes. Simply
9374     pass them on to the renderer
9375     (MapCanvas.SetMap): Clear the selection when a different map is
9376     selected.
9377     (MapCanvas.shape_selected): Simple force a complete redraw. The
9378     selection class now takes care of only issueing SHAPES_SELECTED
9379     messages when the set of selected shapes actually does change.
9380     (MapCanvas.SelectShapeAt): The selection is now managed in
9381     self.selection
9382    
9383     * Thuban/UI/mainwindow.py (MainWindow.delegated_messages)
9384     (MainWindow.Subscribe, MainWindow.Unsubscribe): In Subscribe and
9385     Unsubscribe, delegate messages according to the delegated_messages
9386     class variable.
9387     (MainWindow.delegated_methods, MainWindow.__getattr__): Get some
9388     attributes from instance variables as described with the
9389     delegated_methods class variable.
9390     (MainWindow.__init__): The interactor as ivar is gone. The
9391     parameter is still there for compatibility. The selection messages
9392     now come from the canvas.
9393     (MainWindow.current_layer, MainWindow.has_selected_layer):
9394     Delegate to the the canvas.
9395     (MainWindow.LayerShowTable, MainWindow.Classify)
9396     (MainWindow.identify_view_on_demand): The dialogs don't need the
9397     interactor parameter anymore.
9398    
9399     * Thuban/UI/tableview.py (TableFrame.__init__)
9400     (LayerTableFrame.__init__, LayerTableFrame.OnClose)
9401     (LayerTableFrame.row_selected): The interactor is gone. It's job
9402     from the dialog's point of view is now done by the mainwindow,
9403     i.e. the parent. Subscribe to SHAPES_SELECTED instead
9404     of SELECTED_SHAPE
9405    
9406     * Thuban/UI/dialogs.py (NonModalDialog.__init__): The interactor
9407     is gone. It's job from the dialog's point of view is now done by
9408     the mainwindow, i.e. the parent.
9409    
9410     * Thuban/UI/classifier.py (Classifier.__init__): The interactor is
9411     gone. It's job from the dialog's point of view is now done by the
9412     mainwindow, i.e. the parent.
9413    
9414     * Thuban/UI/tree.py (SessionTreeView.__init__): The interactor is
9415     gone. It's job from the dialog's point of view is now done by the
9416     mainwindow, i.e. the parent.
9417     (SessionTreeCtrl.__init__): New parameter mainwindow which is
9418     stored as self.mainwindow. The mainwindow is need so that the tree
9419     can still subscribe to the selection messages.
9420     (SessionTreeCtrl.__init__, SessionTreeCtrl.unsubscribe_all)
9421     (SessionTreeCtrl.update_tree, SessionTreeCtrl.OnSelChanged): The
9422     selection is now accessible through the mainwindow. Subscribe to
9423     SHAPES_SELECTED instead of SELECTED_SHAPE
9424    
9425     * Thuban/UI/identifyview.py (IdentifyView.__init__): Use the
9426     SHAPES_SELECTED message now.
9427     (IdentifyView.selected_shape): Now subscribed to SHAPES_SELECTED,
9428     so deal with multiple shapes
9429     (IdentifyView.__init__, IdentifyView.OnClose): The interactor is
9430     gone. It's job from the dialog's point of view is now done by the
9431     mainwindow, i.e. the parent.
9432    
9433     * Thuban/UI/controls.py (RecordListCtrl.fill_list): The second
9434     parameter is now a list of shape ids.
9435     (RecordTable.SetTable): The second parameter is now a list of
9436     indices.
9437    
9438     * Thuban/UI/renderer.py (ScreenRenderer.RenderMap): Rename the
9439     selected_shape parameter and ivar to selected_shapes. It's now a
9440     list of shape ids.
9441     (MapRenderer.draw_label_layer): Deal with multiple selected
9442     shapes. Rearrange the code a bit so that the setup and shape type
9443     distinctions are only executed once.
9444    
9445     * test/test_selection.py: Test cases for the selection class
9446    
9447 jonathan 527 2003-03-11 Jonathan Coles <[email protected]>
9448    
9449     * Thuban/Model/load.py: Temporary fix so that the xml reader
9450     doesn't cause Thuban to crash.
9451    
9452     * Thuban/Model/layer.py: Handle the cyclic references between
9453     a layer and its classification better, and be sure to disconnect
9454     the classification from the layer when the layer is destroyed
9455     so that we don't maintain a cyclic reference that may not be
9456     garbage collected.
9457    
9458     * Thuban/Model/classification.py: See comment for layer.py.
9459    
9460 jan 523 2003-03-12 Jan-Oliver Wagner <[email protected]>
9461    
9462     * HOWTO-Release: New. Information on the steps for releasing
9463     a new version of Thuban.
9464    
9465 jonathan 514 2003-03-11 Jonathan Coles <[email protected]>
9466    
9467     * Thuban/UI/classifier.py: Add normal border to SelectPropertiesDialog.
9468     Use True instead of true.
9469     (Classifier): Should have a single panel in which all the controls lie.
9470    
9471     * Thuban/UI/proj4dialog.py: Add normal border.
9472    
9473     * Thuban/UI/tree.py: Fixed problem with bad item images under Windows.
9474    
9475     * Thuban/UI/mainwindow.py: Use True instead of true.
9476    
9477     * setup.py: Update some definitions to use wxWindows2.4 files
9478    
9479     * Data/iceland_sample_class.thuban: Fixed file so that the
9480     field_type information is present.
9481    
9482 jonathan 490 2003-03-10 Jonathan Coles <[email protected]>
9483    
9484 jonathan 505 * Thuban/UI/classifier.py (Classifier.__init__): Make the
9485     field type label grow so that when the text changes the
9486     size is updated correctly. This may be a wxWindows bug.
9487    
9488     2003-03-10 Jonathan Coles <[email protected]>
9489    
9490 jonathan 499 * Thuban/UI/application.py: Changed SESSION_CHANGED to
9491     SESSION_REPLACED.
9492    
9493     * Thuban/UI/classifier.py: Wrap text with _().
9494     (ClassGrid.CreateTable): Set dimensions and size hints here,
9495     instead of in Reset, so we only set the size once.
9496    
9497     * Thuban/UI/dialogs.py: Don't need Shutdown(); just use Close()!
9498    
9499     * Thuban/UI/mainwindow.py (MainWindow.prepare_new_session):
9500     Call Close() instead of Shutdown().
9501    
9502     * Thuban/UI/messages.py: Changed SESSION_CHANGED to SESSION_REPLACED.
9503    
9504     * Thuban/UI/tree.py: Changed SESSION_CHANGED to SESSION_REPLACED.
9505     Go back to using OnClose() instead of Shutdown().
9506    
9507     2003-03-10 Jonathan Coles <[email protected]>
9508    
9509 jonathan 497 * Thuban/UI/classifier.py (Classifier): SelectField() needed
9510     to know the old field index as well as the new one.
9511    
9512     2003-03-10 Jonathan Coles <[email protected]>
9513    
9514 jonathan 495 * Thuban/UI/classifier.py (Classifier): Use __SelectField()
9515     to correctly set the table information and call this from
9516     __init__ and from _OnFieldSelect so that all the information
9517     is up to date when the dialog opens and when a field is changed.
9518    
9519     2003-03-10 Jonathan Coles <[email protected]>
9520    
9521 jonathan 490 * Thuban/Model/classification.py (Classification): Don't use
9522     layer's message function directly, use the ClassChanged() method
9523     when then classification changes. SetField/SetFieldType/SetLayer
9524     must keep the information about field name and field type in
9525     sync when an owning layer is set or removed.
9526    
9527     * Thuban/Model/layer.py: Added ClassChanged() so that the
9528     classification can tell the layer when its data has changed.
9529     (Layer.SetClassification): Accepts None as an arguement to
9530     remove the current classification and correctly handles
9531     adding a new classification.
9532    
9533     * Thuban/Model/load.py: Comment out print statement
9534    
9535     * test/test_classification.py, test/test_save.py: New and
9536     improved tests.
9537    
9538 jonathan 483 2003-03-07 Jonathan Coles <[email protected]>
9539    
9540     * Thuban/Model/classification.py: Implemented __copy__ and
9541     __deepcopy__ for ClassGroup* and ClassGroupProperites so
9542     they can easily be copied by the classifier dialog.
9543     (ClassGroupProperites.__init__): The default line color should
9544     have been Color.Black.
9545    
9546     * Thuban/UI/classifier.py: Setting and Getting table values now
9547     uses a consistent set of functions.
9548     (Classifier): Now non-modal. Has field type label which changes
9549     as the field changes. Keep track of buttons in a list so that
9550     we can enable/disable the buttons when the None field is selected.
9551     (SelectPropertiesDialog): Add buttons to make the colors transparent.
9552    
9553     * Thuban/UI/dialogs.py (NonModalDialog.Shutdown): New method which
9554     does what OnClose did, but can be called by the application to
9555     close a window. Needed when a session changes, and we have to
9556     close the classifier windows.
9557    
9558     * Thuban/UI/mainwindow.py (MainWindow.prepare_new_session):
9559     Shuts down open dialogs. Used when a new session is created
9560     or a session is opened.
9561     (MainWindow.SaveSession): Should only call application.SaveSession()
9562     if we don't call SaveSessionAs first.
9563     (MainWindow.Classify): Allow different classifier dialogs for
9564     different layers.
9565    
9566     * Thuban/UI/tree.py (SessionTreeView): Remove OnClose and let
9567     the parent class handle it. Add Shutdown() to unsubscibe from
9568     event notification and call the parent Shutdown(). This was
9569     necessary so the application can close the tree window.
9570    
9571 jonathan 478 2003-03-06 Jonathan Coles <[email protected]>
9572    
9573     * Thuban/Model/classification.py: Minor documentation changes,
9574     Addition of __eq__ and __ne__ methods.
9575     (Classification.SetLayer): prevent recursion between this method
9576     and Layer.SetClassification().
9577    
9578     * Thuban/Model/color.py: Addition of __eq__ and __ne__ methods.
9579    
9580     * Thuban/Model/layer.py (SetClassification): prevent recursion
9581     between this method and Classification.SetLayer().
9582    
9583     * test/test_classification.py, test/test_load.py,
9584     test/test_session.py: Fixed and added tests for the classification
9585     classes.
9586    
9587 bh 477 2003-03-06 Bernhard Herzog <[email protected]>
9588    
9589     * Thuban/UI/classifier.py (ClassGrid.__init__)
9590     (ClassGrid.CreateTable): Move the SetSelectionMode call to
9591     CreateTable because otherwise it triggers an assertion in
9592     wxPython/wxGTK 2.4.
9593    
9594 jonathan 459 2003-03-05 Jonathan Coles <[email protected]>
9595    
9596 jonathan 475 * Thuban/common.py: Move FIELDTYPE constants back to table.py.
9597 jonathan 471
9598 jonathan 475 * Thuban/Model/load.py: import FIELDTYPE constants from table.
9599 jonathan 471
9600 jonathan 475 * Thuban/UI/classifier.py: import FIELDTYPE constants from table.
9601 jonathan 471
9602 jonathan 475 * Thuban/Model/table.py: Put FIELDTYPE constants back.
9603 jonathan 471
9604     2003-03-05 Jonathan Coles <[email protected]>
9605    
9606 jonathan 459 * Thuban/UI/classifier.py: Added class documentation.
9607     Fixed RTbug #1713, #1714. Added Move[Up|Down] buttons.
9608     Store just the groups in the table and generate the other
9609     column information when it is requested. Add "None" field
9610     to pull-down to select no classification.
9611    
9612     * Thuban/common.py: Moved FIELDTYPE constants from table.py
9613     (Str2Num): Only catch ValueError exceptions.
9614    
9615     * Thuban/Model/classification.py: Class documentation. Renaming
9616     of methods with Stroke to Line. Groups are stored in a single
9617     list with the default as the first element. Groups are searched
9618     in the order they appear in the list.
9619    
9620     * Thuban/Model/color.py: Documentation.
9621    
9622     * Thuban/Model/layer.py (Layer): Add GetFieldType to retreive
9623     the kind of data represented by a field.
9624    
9625     * Thuban/Model/load.py (ProcessSession): Use proper string
9626     conversion function; fixes RTbug #1713.
9627    
9628     * Thuban/Model/save.py (Saver): Store field type information.
9629    
9630     * Thuban/Model/table.py: Put FIELDTYPE constants in common.py.
9631     (Table): Add field_info_by_name() to retrieve field information
9632     by specifying the field name, not the number.
9633    
9634     * Thuban/UI/mainwindow.py: Function name changes.
9635    
9636     * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Only
9637     get the layer classification once. Don't try to classify
9638     values when the field is None: just use the default properties.
9639    
9640     * Thuban/UI/view.py: Function name changes.
9641    
9642     * Doc/thuban.dtd: Add field_type attribute to a classification.
9643    
9644 bh 456 2003-03-04 Bernhard Herzog <[email protected]>
9645    
9646 bh 458 * Doc/thuban.dtd: Use correct syntax for optional attributes. Make
9647     the fill and stroke layer attributes optional with suitable
9648     default values. Add the stroke_width layer attribute. Use correct
9649     syntax for empty elements. Make the attribute list for labels
9650     refer to the label element.
9651    
9652     2003-03-04 Bernhard Herzog <[email protected]>
9653    
9654 bh 456 * setup.py (thuban_build_py.build): Add a comment about distutils in
9655     Python 2.3 containing some of the functionality we implement in
9656     setup.py ourselves.
9657    
9658     * Thuban/UI/classifier.py (ClassGrid.__init__): Set the table
9659     before the selection mode. Doing it the other way round triggers
9660     an assertion in wxWindows.
9661    
9662     * Thuban/Model/save.py (escape): Fix typo in doc-string
9663    
9664     * Thuban/Model/classification.py: Remove unnecessary wxPython
9665     import
9666    
9667 jonathan 448 2003-03-04 Jonathan Coles <[email protected]>
9668    
9669     * Thuban/Model/classification.py (ClassGroupRange.GetProperties):
9670     Parameter 'value' should default to None.
9671    
9672     * Thuban/UI/mainwindow.py: Use Layer.GetClassification() since
9673     the class attribute __classification is now private.
9674    
9675     * Thuban/UI/classifier.py (ClassGrid): Moved OnCellDClick() from
9676     Classifier to ClassGrid. Added support for removing selected rows,
9677     which including code for keeping track of when cells are selected,
9678     and deselected.
9679     (ClassTable): Support for added/removing rows. Fixed a problem
9680     with __ParseInput whereby it would not allow strings (only numbers)
9681     to be entered.
9682     (Classifier): Added button and supporting code for removing
9683     selected rows.
9684    
9685 jonathan 445 2003-02-27 Jonathan Coles <[email protected]>
9686 jonathan 434
9687     * Thuban/common.py: Moved color conversion functions into
9688     Thuban/UI/common.py.
9689     (Str2Num): Now converts the float (not the string) to a long/int
9690     so that an exception isn't thrown.
9691    
9692     * Thuban/UI/common.py: Common functions used in several UI modules
9693    
9694     * Thuban/Model/classification.py: Changed the class hierarchy
9695     so that a Classification consists of Groups which return
9696     Properties when a value matches a Group.
9697    
9698     * Thuban/Model/layer.py: Fixed name resolution problem.
9699    
9700     * Thuban/Model/load.py: Use new Classification and Group functions.
9701    
9702     * Thuban/Model/save.py (Saver.write_attribs): Fixes a test case
9703     failure.
9704     (Saver.write_classification): Use new Classification and Group
9705     functions.
9706    
9707     * Thuban/UI/classifier.py: Changes to use new Classification and Group
9708 jonathan 445 functions. Fix to create a tuple with a single value instead of
9709     simply returning the value.
9710 jonathan 434
9711     * Thuban/UI/renderer.py: Use new Classification and Group functions.
9712     Use common.py functions.
9713    
9714 jonathan 445 * Thuban/UI/tree.py: Use common.py functions.
9715 jonathan 447
9716     * test/test_classification.py: Use new Classification and Group
9717     classes.
9718 jonathan 434
9719 jonathan 426 2003-02-24 Jonathan Coles <[email protected]>
9720    
9721     * Thuban/common.py (Color2wxColour, wxColour2Color): Conversion
9722     functions from Thuban color objects to wxWindow colour objects.
9723    
9724     * Thuban/Model/classification.py (Classification): Renamed
9725     GetProperties() to GetClassData(). Used the new iterator
9726     in TreeInfo().
9727     (ClassIterator): Iterator implementation to iterate over the
9728     ClassData objects in a classification object.
9729    
9730     * Thuban/Model/save.py (Saver.write_classificaton): Uses
9731     the new iterator to save the classification information.
9732    
9733     * Thuban/UI/classifier.py (SelectPropertiesDialog): Support
9734     for changing the stroke and fill colors and previewing the
9735     changes.
9736    
9737     * Thuban/UI/mainwindow.py (MainWindow.OpenSession,
9738     MainWindow.SaveSessionAs): Text string changes so the dialogs
9739     have more meaningful titles.
9740    
9741     * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Change
9742     Classification method name from GetProperties to GetClassData.
9743    
9744     * Thuban/UI/view.py (MapCanvas.find_shape_at): Use method calls
9745     instead of accessing now non-existent class variables.
9746    
9747 bh 425 2003-02-24 Bernhard Herzog <[email protected]>
9748    
9749     * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Remove
9750     unneeded Shape() call. Rendering is substantially faster without
9751     it and it avoids some problems with broken shape files.
9752    
9753 frank 423 2003-02-20 Frank Koormann <[email protected]>
9754    
9755     Force minimal size of identify and label dialogs. The autosizing
9756     looked too ugly.
9757    
9758     * Thuban/UI/controls.py (RecordListCtrl): Set minimal width for columns.
9759     * Thuban/UI/labeldialog.py (LabelDialog.dialog_layout):
9760     Set size of listctrl.
9761     * Thuban/UI/identifyview.py (IdentifyView.__init__):
9762     Set size of dialog.
9763    
9764 jonathan 408 2003-02-19 Jonathan Coles <[email protected]>
9765    
9766     * test/test_classification.py, test/test_layer.py,
9767     test/test_load.py, test/test_map.py, test/test_session.py:
9768     Updated the tests to use the new functions that are in the
9769     respective classes.
9770    
9771     * Thuban/Model/classification.py (Classification):
9772     Uses the new ClassData* classes. Modification messages are
9773     passed up to the parent layer (if it exists).
9774     (ClassData): New class to encapsulate the common data in each
9775     classification property.
9776     (ClassDataDefault): Represents the Default class. data.
9777     (ClassDataPoint): Represents a single class. data point
9778     (ClassDataRange): Represents a class. range
9779     (ClassDataMap): Represents a class. map (unused).
9780    
9781     * Thuban/Model/color.py: Added Color.None to represent something
9782     with no color. Color.Black represents the color black.
9783     (NoColor): Helper class derived from Color to represent something
9784     with no color.
9785    
9786     * Thuban/Model/layer.py (Layer): Removed references to fill, stroke,
9787     stroke_width attributes. Made the 'classification' attribute private.
9788     New methods for setting/getting the classification.
9789    
9790     * Thuban/Model/load.py (ProcessSession): Use new methods on Layer
9791     to get the classifcation and use the new ClassData* classes to
9792     hold the classification data. Use Str2Num to convert numbers
9793     properly.
9794    
9795     * Thuban/Model/save.py (Saver): Use new Color and Classification
9796     methods
9797    
9798     * Thuban/UI/classifier.py (ClassGrid): New class to represent a
9799     custom grid.
9800     (ClassTable): Support for editing Values and Labels and for
9801     changing what type (point or range) of data is stored in each
9802     property based on how the user enters the data.
9803     (Classifier): Support for saving the new classifications and
9804     launching the dialog to edit a property.
9805     (SelectPropertiesDialog): New class for editing the visual
9806     properties of a classification (stroke color, width, and fill color)
9807     (ClassPreviewer): Took the Draw method from ClassRenderer and
9808     made most of it into this new class. Intend to use this class in
9809     the SelectPropertiesDialog for previewing changes.
9810    
9811     * Thuban/UI/renderer.py: Use new Color and Classification methods.
9812    
9813     * Thuban/UI/tree.py: Formatting changes.
9814    
9815     * Doc/thuban.dtd: Add 'label' element
9816    
9817     * Thuban/common.py: New. Contains common routines used throughout
9818     the code.
9819     (Str2Num): Takes a string and converts it to the "best" type of
9820     number.
9821    
9822 bh 405 2003-02-14 Bernhard Herzog <[email protected]>
9823    
9824     * Thuban/UI/view.py (MapCanvas.OnLeftUp): Make sure that the
9825     dragging flag is always set to 0 even when the tool implementation
9826     raises an exception
9827    
9828 bh 402 2003-02-11 Bernhard Herzog <[email protected]>
9829    
9830     * Thuban/UI/application.py (ThubanApplication.splash_screen): New
9831     method to create a splash screen.
9832     (ThubanApplication.ShowMainWindow): New. Show the main window.
9833     Needed so the splash screen can display the mainwindow
9834     (ThubanApplication.OnInit): Call the
9835     new splash_screen method to determine whether the application
9836     should display a splash screen. If it displays a splash screen do
9837     not immediately show the main window.
9838    
9839 jonathan 399 2003-02-11 Jonathan Coles <[email protected]>
9840    
9841     * Thuban/Model/classification.py: Added import line to fix
9842     feature conflicts between running on python2.2 and python2.1.
9843    
9844     * Thuban/UI/classifier.py (ClassTable): Didn't need to hang
9845     onto the clinfo parameter, so removed the deepcopy().
9846    
9847 jonathan 396 2003-02-10 Jonathan Coles <[email protected]>
9848    
9849 tkoester 403 * Thuban/Model/save.py (Saver.open_element, Saver.close_element):
9850 jonathan 396 Added element_open variable to track opening and closing of tags
9851     so that tags that don't span more than one line are closed with
9852     /> instead of </tag_name>. Use the GetDefault*() methods of
9853     the Classification class.
9854    
9855     * Thuban/Model/classification.py (Classificaton): Added set and
9856     get methods for the default data. The class also takes a layer
9857     reference so that modification messages can be sent. Fixed the
9858     methods to use the new ClassData class.
9859     (ClassData): New class to encapsulate the classification data
9860    
9861     * Thuban/Model/layer.py (Layer): Remove the
9862 tkoester 403 Set[Fill|Stroke|StrokeWidth]() methods. Code should call the
9863 jonathan 396 SetDefault*() methods on the layer's classification object.
9864 tkoester 403 (Layer.__init__): Use the new SetDefault*() methods in the
9865 jonathan 396 Classification class.
9866    
9867     * Thuban/Model/load.py (ProcessSession): Use the new ClassData
9868     object instead of a dictionary.
9869    
9870 tkoester 403 * Thuban/UI/classifier.py (ClassRenderer): New class to
9871 jonathan 396 draw the classifications in the dialog box's table.
9872     (Classifier): Modified to use the ClassRenderer class.
9873    
9874 tkoester 403 * Thuban/UI/mainwindow.py (MainWindow): Use the SetDefault*()
9875     methods of the Classification class.
9876 jonathan 396
9877     * Thuban/UI/renderer.py (MapRenderer): Use the Get*() methods
9878     of the ClassData class.
9879    
9880     * test/test_classification.py, test/test_layer.py,
9881     test/test_map.py, test/test_session.py: Fix the tests to work
9882     with the above code changes.
9883    
9884 jonathan 387 2003-02-03 Jonathan Coles <[email protected]>
9885    
9886     * Thuban/Model/classification.py (Classification): Added getNull()
9887     to return the NullData reference
9888    
9889     * Thuban/Model/layer.py (Layer.SetFill, Layer.SetStroke,
9890     Layer.SetStrokeWidth): Modified these functions to change the
9891     null data in the classification rather than keep these values
9892     directly in the Layer class. Menu options to change these values
9893     work again.
9894    
9895 jonathan 380 2003-01-28 Jonathan Coles <[email protected]>
9896    
9897 jonathan 384 * Thuban/UI/classifier.py (Classifier): Resolved merging conflicts.
9898 tkoester 403 Fixed crashing problem on some systems. Dialog box shows
9899 jonathan 380 classification data.
9900    
9901 jonathan 384 * Thuban/UI/tree.py (SessionTreeCtrl.add_items): Handle drawing
9902     Colors in the tree view.
9903    
9904     * Thuban/Model/layer.py (Layer.TreeInfo): Added a call to build
9905     the tree info for classifications. Commented out unnecessary lines.
9906    
9907     * Thuban/Model/classification.py (Classification.TreeInfo): New
9908     function to add information about the classification into the
9909     tree view.
9910    
9911 tkoester 403 2003-01-27 Jan-Oliver Wagner <[email protected]>
9912 jan 375
9913 tkoester 403 * Thuban/__init__.py (_): New.
9914 jan 375
9915     * Thuban/Model/classification.py, Thuban/Model/extension.py,
9916     Thuban/Model/layer.py, Thuban/Model/load.py, Thuban/Model/map.py,
9917 tkoester 403 Thuban/Model/session.py, Thuban/UI/application.py,
9918     Thuban/UI/classifier.py, Thuban/UI/context.py, Thuban/UI/controls.py,
9919     Thuban/UI/identifyview.py, Thuban/UI/labeldialog.py,
9920     Thuban/UI/mainwindow.py, Thuban/UI/menu.py, Thuban/UI/proj4dialog.py,
9921     Thuban/UI/renderer.py, Thuban/UI/tree.py, Thuban/Lib/connector.py,
9922     Thuban/Lib/fileutil.py: Replace user string by _() for i18n.
9923 jan 375
9924 jonathan 370 2003-01-27 Jonathan Coles <[email protected]>
9925    
9926 tkoester 403 * Thuban/Model/layer.py: Classification initialization calls.
9927 jonathan 370
9928 tkoester 403 * Thuban/Model/classification.py: Created class to encapsulate
9929     a layer classification. Supports specific data points and
9930     ranges.
9931 jonathan 370
9932 tkoester 403 * Thuban/Model/load.py: Added support for loading classification
9933     information.
9934 jonathan 370
9935 tkoester 403 * Thuban/Model/save.py: Added support for saving classification
9936     information.
9937 jonathan 370
9938 tkoester 403 * Thuban/UI/classifier.py: Initial class for a dialog box for
9939     specifying classification information.
9940 jonathan 370
9941 tkoester 403 * Thuban/UI/mainwindows.py: Support for opening the classifier
9942     dialog.
9943 jonathan 370
9944 tkoester 403 * Thuban/UI/renderer.py: Support for drawing a layer with the
9945     classification information.
9946 jonathan 370
9947 tkoester 403 * Data/iceland_sample_class.thuban: iceland_sample with
9948     classification data.
9949 jonathan 370
9950 tkoester 403 * test/test_classification: Tests for the Classification class.
9951 jonathan 370
9952 bh 359 2002-12-09 Bernhard Herzog <[email protected]>
9953    
9954 bh 361 * test/test_command.py: New. Tests for the command classes.
9955    
9956 bh 359 * Thuban/UI/command.py (ToolCommand): New class for tool commands.
9957     (Command.IsTool): New method to distinguish between command
9958     switching tools and other commands.
9959    
9960     * Thuban/UI/view.py (MapCanvas.SelectTool): New method to select
9961     the tool to avoid direct assignments to instance variables
9962     (MapCanvas.ZoomInTool, MapCanvas.ZoomOutTool, MapCanvas.PanTool)
9963     (MapCanvas.IdentifyTool, MapCanvas.LabelTool): Use SelectTool to
9964     change the tool
9965    
9966     * Thuban/UI/mainwindow.py (MainWindow.update_command_ui): If an
9967     active tool's command turns insensitive, disable the tool.
9968     (_tool_command): Use the new ToolCommand class
9969    
9970     * Examples/simple_extensions/simple_tool.py (simple_tool): Use the
9971     SelectTool method to change the tool
9972     (iconfile): Use the ToolCommand class
9973    
9974 bh 354 2002-12-03 Bernhard Herzog <[email protected]>
9975    
9976     * Thuban/UI/tree.py (SessionTreeCtrl.normalize_selection): Handle
9977     the case of selected items that are not children of Layers or Maps
9978     properly. Previously this bug would trigger an assertion in
9979     wxWindows.
9980    
9981 frank 352 2002-11-06 Frank Koormann <[email protected]>
9982    
9983 bh 354 * Thuban/UI/mainwindow.py: Altered the order of tools in the
9984     toolbar: First now are all navigation tools (Zoom In/Out, Pan,
9985     Full Extent).
9986 tkoester 403
9987 bh 349 2002-10-23 Bernhard Herzog <[email protected]>
9988    
9989     * setup.py (setup call): version now 0.1.3
9990    
9991     * MANIFEST.in: Add the files in test/
9992    
9993     * test/README: Add note about tests requiring the iceland data
9994    
9995     * Thuban/UI/mainwindow.py (MainWindow.About): Add 2002 to
9996     copyright notice.
9997    
9998 bh 344 2002-10-18 Bernhard Herzog <[email protected]>
9999    
10000     * test/test_map.py
10001     (TestMapWithContents.test_projected_bounding_box): Use an explicit
10002     epsilon.
10003    
10004     * test/support.py (FloatComparisonMixin.assertFloatEqual)
10005     (FloatComparisonMixin.assertFloatSeqEqual): give a more useful
10006     message if the assertion fails and don't return the return value
10007     of self.assert_. In assertFloatSeqEqual the return meant that not
10008     all items of the sequence were compared.
10009    
10010 bh 326 2002-09-20 Bernhard Herzog <[email protected]>
10011    
10012 bh 341 * test/test_fileutil.py: New. Test cases for Thuban.Lib.fileutil
10013    
10014     * Thuban/Lib/fileutil.py: Fixup some whitespace and typos
10015    
10016 bh 338 * test/test_map.py (TestMapWithContents.test_tree_info): Create
10017     the string with the bounding box on the fly because of platform
10018     differences in the way %g is handled.
10019    
10020     * test/test_layer.py (TestLayer.test_empty_layer): Create an empty
10021     DBFfile too because Thuban layers can't yet cope missing DBF
10022     files.
10023    
10024     2002-09-20 Bernhard Herzog <[email protected]>
10025    
10026 bh 326 * test/test_menu.py: Use initthuban instead of
10027     add_thuban_dir_to_path to initialize Thuban.
10028    
10029     * test/support.py (FloatComparisonMixin.assertFloatEqual): New.
10030     Mixin class for float comparisons
10031     (SubscriberMixin): New. Mixin class to test messages sent through
10032     the Connector class
10033    
10034     * test/README: Fix a typo and add the -v flag to the command for
10035     individual tests
10036    
10037 bh 335 * test/test_session.py: New. Test cases for Thuban.Model.session
10038    
10039     * test/test_proj.py: New. Test cases for Thuban.Model.proj
10040    
10041     * test/test_map.py: New. Test cases for Thuban.Model.map
10042    
10043     * test/test_layer.py: New. Test cases for Thuban.Model.layer
10044    
10045     * test/test_label.py: New. Test cases for Thuban.Model.label
10046    
10047     * test/test_connector.py: New. Test cases for Thuban.Lib.connector
10048    
10049     * test/test_color.py: New. Test cases for Thuban.Model.color
10050    
10051     * test/test_base.py: New. Test cases for Thuban.Model.base
10052    
10053 bh 322 2002-09-13 Bernhard Herzog <[email protected]>
10054    
10055     * Thuban/Model/session.py (Session.forwarded_channels): Forward
10056     the CHANGED channel too.
10057    
10058     * Thuban/Model/map.py (Map.forwarded_channels): Forward the
10059     CHANGED channel too.
10060     (Map.__init__): Call the Modifiable constructor as well.
10061    
10062     * Thuban/Model/base.py (Modifiable.UnsetModified): Issue a CHANGED
10063     event if the modified flag changes.
10064     (Modifiable.changed): Tweak the doc-string.
10065    
10066     * Thuban/UI/mainwindow.py (MainWindow.view_position_changed)
10067     (MainWindow.set_position_text): Put the code that puts the text
10068     with the mouse position into the status bar into the new method
10069     set_position_text so that it can overwritten in derived classes.
10070    
10071 bh 317 2002-09-12 Bernhard Herzog <[email protected]>
10072    
10073     * Thuban/UI/mainwindow.py (MainWindow.RunMessageBox): Center the
10074     message box on the main window.
10075    
10076 bh 313 2002-09-11 Bernhard Herzog <[email protected]>
10077    
10078     * Thuban/UI/mainwindow.py: Underline the 'x' in "Exit" instead of
10079     the 'E' because it's less likely to interfere with other menu
10080     entries.
10081 bh 315 (MainWindow.build_menu): remove an incorrect comment.
10082 bh 313
10083 bh 311 2002-09-10 Bernhard Herzog <[email protected]>
10084    
10085     * Thuban/UI/mainwindow.py (MainWindow.Map): New.
10086     (_tool_command): Add sensitive parameter
10087     (_has_visible_map): Sensitivity callback to tools and other
10088     commands that require a visible map. Use it in map_zoom_in_tool,
10089     map_zoom_out_tool, map_pan_tool, map_identify_tool, map_label_tool
10090     and map_full_extent
10091    
10092 bh 308 2002-09-06 Bernhard Herzog <[email protected]>
10093    
10094     * Thuban/UI/mainwindow.py (MainWindow.OnClose): Unsubscribe
10095     VIEW_POSITION
10096    
10097 tkoester 403 2002-09-04 Frank Koormann <[email protected]>
10098 frank 306
10099     * Resources/Bitmaps/fullextent.xpm: Updated Icon (removed "potatoe")
10100    
10101 bh 302 2002-09-02 Bernhard Herzog <[email protected]>
10102    
10103 bh 304 * Thuban/UI/view.py: Get rid of the idle redraw. This is done by
10104     wxWindows already and our implementation doesn't work correctly
10105     with wxGTK 2.3:
10106     (MapCanvas.__init__): Remove the instance variable
10107     (MapCanvas.OnPaint): Always call do_redraw when there's a map to
10108     be drawin
10109     (MapCanvas.OnIdle): Removed.
10110    
10111 bh 302 * Thuban/UI/view.py (MapCanvas.unprojected_rect_around_point): Add
10112     a parameter to determine the size of the rectangle.
10113     (MapCanvas.find_shape_at): Create the box around the point on a
10114     layer by layer basis and make the size depend on the shape type.
10115     This solves a problem with the selection of point shapes at the
10116     border of the layer's bounding box
10117    
10118 bh 292 2002-08-30 Bernhard Herzog <[email protected]>
10119    
10120 bh 300 * Thuban/UI/mainwindow.py (MainWindow.CanRemoveLayer): New method
10121     for the sensitivity of remove layer.
10122     (_can_remove_layer): New. Sensitivity callback for remove layer
10123     (Command layer_remove): Use _can_remove_layer
10124    
10125     * Thuban/Model/map.py (Map.CanRemoveLayer): New method to
10126     determine whether a given layer can be deleted.
10127    
10128 bh 297 * Thuban/UI/view.py (MapCanvas.__init__, MapCanvas.OnPaint)
10129     (MapCanvas.do_redraw): Get rid of the unused update_region
10130     instance variable
10131    
10132 bh 294 * Thuban/UI/view.py: Add/update some doc-strings.
10133    
10134 bh 292 * test/: new subdirectory with a bunch of unit tests.
10135    
10136     * test/README, test/test_table.py, test/test_save.py,
10137     test/test_menu.py, test/test_load.py: Initial set of tests and
10138     brief instructions on how to run them
10139    
10140 bh 287 2002-08-29 Bernhard Herzog <[email protected]>
10141    
10142 bh 291 * Thuban/UI/renderer.py (ScreenRenderer.draw_shape_layer): Handle
10143     arcs with multiple parts.
10144    
10145 bh 289 * Thuban/UI/view.py (ZoomInTool.MouseUp, ZoomOutTool.MouseUp):
10146     Handle degenrate rectangles.
10147    
10148 bh 287 * Thuban/Model/table.py: Make writing records work correctly:
10149     (Table.__init__): Keep track of whether the DBF is open for
10150     writing
10151     (Table.write_record): Open the DBF file for writing when necessary
10152    
10153 bh 285 2002-08-27 Bernhard Herzog <[email protected]>
10154    
10155     * Thuban/Model/table.py (Table.write_record, Table.__init__): Open
10156     dbf files only for reading by default. Use a new writable dbf
10157     object for writing.
10158    
10159 bh 278 2002-08-26 Bernhard Herzog <[email protected]>
10160    
10161 bh 282 * Thuban/UI/mainwindow.py: Refactor the context creation:
10162     (MainWindow.Context): New method to return a context
10163     (MainWindow.invoke_command, MainWindow.update_command_ui): Use the
10164     new method
10165    
10166 bh 278 * Thuban/UI/tableview.py (TableGrid, LayerTableGrid): Split the
10167     layer table specific code from TableGrid into LayerTableGrid
10168     (TableFrame, LayerTableFrame): Split the layer table specific code
10169     from TableFrame into LayerTableFrame
10170 bh 280 (LayerTableGrid.select_shape): Remove a debug print
10171 bh 278
10172     * Thuban/UI/mainwindow.py (MainWindow.LayerShowTable): Use the
10173     LayerTableFrame
10174    
10175 bh 277 2002-08-23 Bernhard Herzog <[email protected]>
10176    
10177     * Thuban/Model/layer.py (Layer.__init__): Make sure we have an
10178     absolute filename.
10179    
10180 bh 269 2002-08-22 Bernhard Herzog <[email protected]>
10181    
10182 bh 275 * Thuban/Model/table.py (Table.write_record): New method to write
10183     records.
10184 tkoester 403 (Table.__init__): Open the DBF file for writing too.
10185 bh 275
10186     * Thuban/UI/controls.py (RecordTable.SetValue): Write the value
10187     into the underlying table.
10188    
10189     * extensions/shapelib/shapefil.h (DBFCommit),
10190     extensions/shapelib/dbfopen.c (DBFCommit): New API function to
10191     commit any changes made to the DBF file.
10192    
10193 bh 271 * Thuban/UI/mainwindow.py (make_check_current_tool)
10194     (_tool_command): Put the code that generates the "checked"
10195     callback into a separate function so that we can reuse it
10196     elsewhere
10197    
10198 bh 269 * Thuban/Model/save.py (Saver): New class to handle serializing a
10199     session into an XML file. The main reason to introduce a class is
10200     that applications built on Thuban can derive from it so that they
10201     can save additional information in a session file.
10202     (save_session): Delegate almost all the work to the Saver class.
10203     Rename the filename argument to file because it may be a file like
10204     object now.
10205    
10206     * Thuban/Model/load.py: Get rid of the Python 1.5.2 compatibility
10207     code. Remove the little test code which would be executed when the
10208     module is run as a script which didn't work anymore since it can't
10209     import the other Thuban modules.
10210     (ProcessSession, load_session): Refactor the ProcessSession to
10211     have one method for each element start and end tag so that derived
10212     classes can easily override the processing of individual tags.
10213     Also, always parse with namespaces enabled because applications
10214     built on top of Thuban will likely use namespaces if they extend
10215     the session file format.
10216    
10217 bh 266 2002-08-21 Bernhard Herzog <[email protected]>
10218    
10219     * setup.py (ThubanInstall.run): Don't repr install_lib_orig
10220     because thubaninit_contents will do it for us.
10221    
10222 tkoester 403 2002-08-16 Jan-Oliver Wagner <[email protected]>
10223 jan 265
10224     * Thuban/UI/mainwindow.py: menu item 'show session tree' now disable if
10225     tree window already open
10226    
10227 bh 259 2002-08-15 Bernhard Herzog <[email protected]>
10228    
10229 bh 263 * Thuban/Model/layer.py (Layer.Destroy): Call the unboundd method
10230     with self.
10231    
10232     * Thuban/UI/view.py (MapCanvas.OnLeftUp): Only release the mouse
10233     when we have actually captured it.
10234    
10235 bh 259 * Thuban/Model/layer.py (Layer.Destroy): New. Explicitly close the
10236     shapefile and destroy the table.
10237    
10238     * Thuban/Model/table.py (Table.Destroy): New. Close the DBF file.
10239    
10240 bh 254 2002-08-14 Bernhard Herzog <[email protected]>
10241    
10242 bh 256 * Thuban/UI/controls.py (RecordTable.__init__): Remove the unused
10243     instance variable columns
10244     (RecordTable.GetTypeName): row and col may be negative in some
10245     cases.
10246    
10247 bh 254 * setup.py (InstallLocal.initialize_options)
10248     (InstallLocal.finalize_options, InstallLocal.user_options): New
10249     option create-init-file to build a thubaninit.py when running
10250     install_local
10251     (InstallLocal.run): Create the thubaninit.py module when requested
10252     (thubaninit_contents): Split the template into several parts and
10253     create a new function thubaninit_contents that creates the
10254     contents of a thubaninit module.
10255     (ThubanInstall.run): Use the new function to create the thubaninit
10256     module.
10257    
10258 bh 252 2002-07-30 Bernhard Herzog <[email protected]>
10259    
10260     * Thuban/UI/application.py (ThubanApplication.OnExit): Do some
10261     cleanup.
10262     (ThubanApplication.MainLoop): Extend to automatically call OnExit.
10263    
10264     * Thuban/Model/session.py (Session.Destroy): Don't bypass the
10265     direct base class' Destroy method.
10266    
10267     * Thuban/Model/map.py (Map.ClearLayers): New method to delete all
10268     layers.
10269     (Map.Destroy): Destroy the label_layer as well and call the
10270     inherited Desatroymethod first so that no more messages are
10271     issued.
10272     (Map.RaiseLayer, Map.LowerLayer): Only issue LAYERS_CHANGED
10273     message if the stacking order actually has changed. Add
10274     doc-strings.
10275     (Map.BoundingBox): Correct the doc-string.
10276     (Map.AddLayer, Map.RemoveLayer, Map.Layers, Map.HasLayers)
10277     (Map.ProjectedBoundingBox, Map.SetProjection): Add doc-strings.
10278    
10279     * Thuban/Model/label.py (LabelLayer.ClearLabels): New to delete
10280     all labels.
10281    
10282 bh 247 2002-07-29 Bernhard Herzog <[email protected]>
10283    
10284     * Thuban/Model/map.py (Map.subscribe_layer_channels)
10285     (Map.unsubscribe_layer_channels): Put the code that (un)subscribes
10286     to a layer's channels into separate methods.
10287     (Map.RemoveLayer, Map.AddLayer): Call the new methods
10288     (Map.Destroy): Unsubscribe from a layer's channels before
10289     destroying it.
10290    
10291     * Thuban/UI/view.py (MapCanvas.find_shape_at): Change the
10292     selected_layer parameter to searched_layer which is the layer to
10293     search in.
10294     (MapCanvas.SelectShapeAt): New parameter layer to restrict the
10295     search to that layer. Return the selected layer and shape.
10296    
10297     * Examples/simple_extensions/simple_tool.py (simple_tool): Fix a
10298     typo
10299    
10300 bh 238 2002-07-24 Bernhard Herzog <[email protected]>
10301    
10302 bh 243 * Thuban/UI/application.py (ThubanApplication.create_session):
10303     Extend the doc string.
10304     (ThubanApplication.subscribe_session)
10305     (ThubanApplication.unsubscribe_session): New methods to
10306     subscribe/unsubscribe to/from session channels.
10307     (ThubanApplication.SetSession): Call the new methods here.
10308     (ThubanApplication.maps_changed, ThubanApplication.set_map):
10309     Renamed set_map to maps_changed. Its now a subscriber for
10310     MAPS_CHANGED.
10311    
10312     * Thuban/UI/view.py (ZoomOutTool.MouseUp): Use the correct
10313     x-coordinate in case of simple clicks
10314    
10315     * Thuban/Model/base.py (Modifiable.changed): Apply the args tuple,
10316     don't pass it as a parameter
10317    
10318     * Thuban/Model/session.py (Session.RemoveMap): New
10319    
10320 bh 238 * Thuban/UI/mainwindow.py (MainWindow.__init__): Turn the initial
10321     window size into a parameter.
10322    
10323 bh 235 2002-07-23 Bernhard Herzog <[email protected]>
10324    
10325 bh 237 * Thuban/UI/menu.py (Menu.item_index): Also search for menus not
10326     just commands.
10327    
10328 bh 235 * Thuban/UI/mainwindow.py (MainWindow.__init__): Change the
10329     parameter list a bit to allow setting the window title and the
10330     initial message in the status bar. Update the callers.
10331    
10332     * Thuban/UI/application.py (ThubanApplication.OnInit)
10333     (ThubanApplication.CreateMainWindow): Put the mainwindow
10334     instantiation into a separate method so that it can be overridden
10335     by a subclass.
10336    
10337 bh 230 2002-07-19 Bernhard Herzog <[email protected]>
10338    
10339 bh 234 * Thuban/Model/session.py: Issue a CHANGED message every time
10340     another changed message is issued to make it easier to get
10341     notified of changes.
10342     (Session): Update the doc string
10343     (Session.forward): Issue changed-events as CHANGED as well.
10344     (Session.changed): Overwrite the inherited version to issue
10345     CHANGED events as well.
10346    
10347     * Thuban/UI/tree.py: We can now simply subscribe to the session's
10348     CHANGED channel to be informed of changes.
10349     (SessionTreeCtrl.session_channels): Not needed any longer.
10350 tkoester 403 (SessionTreeCtrl.unsubscribe_all, SessionTreeCtrl.session_changed):
10351 bh 234 Only have to (un)subscribe CHANGED
10352    
10353     * Thuban/Model/map.py (Map.TreeInfo): Deal better with empty maps.
10354    
10355 bh 230 * Thuban/UI/main.py, Thuban/UI/__init__.py: Move the work-around
10356     for the wxPython locale bug to __init__.py so that it's
10357     automatically executed by anybody using UI code from Thuban.
10358    
10359 bh 225 2002-07-18 Bernhard Herzog <[email protected]>
10360    
10361 bh 228 * Thuban/UI/main.py (main): app no longer needs to be global
10362    
10363     * Thuban/UI/mainwindow.py (MainWindow.__init__): Add application
10364     as parameter and store it in an instance variable
10365     (MainWindow.invoke_command, MainWindow.update_command_ui)
10366     (MainWindow.save_modified_session, MainWindow.NewSession)
10367     (MainWindow.OpenSession, MainWindow.SaveSession)
10368     (MainWindow.SaveSessionAs, MainWindow.ShowSessionTree): Use self's
10369     application object.
10370    
10371     * Thuban/UI/application.py (ThubanApplication.OnInit): Instantiate
10372     the main window with self.
10373    
10374 bh 225 * Thuban/UI/context.py: New module with the context class
10375    
10376     * Thuban/UI/command.py (Command): Update doc string.
10377    
10378     * Thuban/UI/mainwindow.py (MainWindow.invoke_command,
10379     MainWindow.update_command_ui): Pass an instance of the context
10380     class to the command's methods
10381     (check_current_tool, call_method): Handle the new context
10382     implementation
10383    
10384     * Examples/simple_extensions/simple_tool.py (simple_tool,
10385     check_simple_tool): Handle the new context implementation
10386    
10387     * Examples/simple_extensions/simple_command.py (simple_command):
10388     Handle the new context implementation. Update the comments about
10389     the context.
10390    
10391     * Thuban/UI/application.py (ThubanApplication.SetSession): Add
10392     doc-string
10393     (ThubanApplication.Session): New method to return the session
10394     object
10395    
10396     * Thuban/UI/tree.py (SessionTreeCtrl.update_tree): The
10397     interactor's selected_layer may not be a layer of the current
10398     session when the tree is updated while a new session is being set.
10399    
10400 bh 217 2002-07-17 Bernhard Herzog <[email protected]>
10401    
10402     * Thuban/UI/tree.py (color_string): Removed. No longer used.
10403     (SessionTreeCtrl.update_tree, SessionTreeCtrl.add_items): Split
10404     update_tree into update_tree and add_items. The tree now uses a
10405     more generic way to display the contents of the tree.
10406     (SessionTreeCtrl): Add a doc string explaining the TreeInfo method
10407    
10408     * Thuban/Model/layer.py (Layer.TreeInfo),
10409     Thuban/Model/extension.py (Extension.TreeInfo),
10410     Thuban/Model/map.py (Map.TreeInfo),
10411 tkoester 403 Thuban/Model/session.py (Session.TreeInfo):
10412 bh 217 Add TreeInfo methods to implement the new tree view update scheme
10413    
10414 bh 216 2002-07-16 Bernhard Herzog <[email protected]>
10415    
10416     * Thuban/UI/application.py: Don't use "import from" for the
10417     MainWindow. It can't always be resolved.
10418     (ThubanApplication.OnInit): change reference to MainWindow
10419     accordingly.
10420    
10421     * Thuban/UI/menu.py (Menu.SetItems): New method to replace a menu
10422     completely
10423    
10424 bh 213 2002-07-10 Bernhard Herzog <[email protected]>
10425    
10426     * setup.py (create_init_module): New configurable variable whose
10427     default depends on the platform we're running on.
10428     (ThubanInstall.initialize_options): Initialize
10429     self.create_init_module from the global create_init_module
10430     (ThubanInstall.user_options): indictate that the options
10431     create-init-module and init-module-dir have arguments.
10432    
10433     * setup.py: In the setup call change the version number to include
10434     cvs.
10435    
10436     * MANIFEST.in: Add the files in Examples
10437    
10438 bh 205 2002-07-09 Bernhard Herzog <[email protected]>
10439    
10440 bh 210 * setup.py: In the setup call, use the thuban homepage as the
10441     value of the url parameter.
10442    
10443 bh 208 * Examples: New subdirectory for examples.
10444    
10445     * Examples/simple_extensions/simple_tool.xpm,
10446     Examples/simple_extensions/simple_tool.py,
10447     Examples/simple_extensions/simple_command.py,
10448     Examples/simple_extensions/README: Simple examples showing how to
10449     add new commands and tools.
10450    
10451 bh 207 * setup.cfg (bdist_rpm): Add the default value for prefix and tell
10452     bdist_rpm that we also have an install script.
10453     (bdist_inno): Add 2002 to the copyright notice.
10454    
10455 bh 205 * setup.py: Create a file in python's site-packages directory to
10456     make installation of Thuban as a library easier.
10457     (ThubanInstall.user_options): Add two new options,
10458     create-init-module and init-module-dir
10459     (ThubanInstall.expand_with_pure_python_dirs): New method to expand
10460     filenames for installation in the default directories.
10461     (ThubanInstall.select_scheme, ThubanInstall.convert_paths): Extend
10462     the inherited methods to capture some filenames before they're
10463     transformed too much by distutils.
10464     (ThubanInstall.run): Create the init module if requested.
10465     (ThubanInstall.thuban_init_filename): New method to return the
10466     full name of the init module.
10467     (ThubanInstall.get_outputs): Append the filename of the init
10468     module.
10469    
10470 bh 202 2002-07-08 Bernhard Herzog <[email protected]>
10471    
10472 bh 205 * setup.py (thuban_bdist_rpm): Extend this version of bdist_rpm to
10473     handle the prefix properly which means that the default for the
10474     installation prefix should be /usr for RPMs and /usr/local when
10475     doing a normal source install.
10476     (bdist_rpm_install_script): Script to override the default install
10477     commands in the specfile generated by the bdist_rpm command.
10478     (thuban_bdist_rpm.user_options): Add a prefix option
10479     (thuban_bdist_rpm.initialize_options): Init the prefix option.
10480     Create the script files for the spec files as empty files here
10481     (thuban_bdist_rpm._make_spec_file): Override the inherited method
10482     to fill the script files with content.
10483    
10484 bh 202 * Thuban/Model/save.py (relative_filename): Wrapper around
10485     Thuban.Lib.fileutil.relative_filename that accepts an empty dir
10486     argument. save_session now automatically uses this version,
10487     solving a problem when saving to a relative filename.
10488    
10489     * setup.py: In the setup call, make sure that the library
10490     directories are under $prefix/lib not directly under $prefix.
10491    
10492 tkoester 403 2002-06-20 Jan-Oliver Wagner <[email protected]>
10493 jan 199
10494     * Thuban/Model/extension.py: new module to handle extension objects.
10495     * Thuban/Model/messages.py: new messages for extensions.
10496     * Thuban/Model/session.py (Session.Extensions, Session.HasExtensions,
10497     Session.AddExtension): new for handling extensions.
10498     Also some other minor changes to round up extension handling.
10499     * Thuban/UI/tree.py (SessionTreeCrtl:update_tree): Added visualization
10500     of Extension titles and title and names of its objects.
10501    
10502 bh 194 2002-05-29 Bernhard Herzog <[email protected]>
10503    
10504     * Thuban/UI/mainwindow.py (MainWindow.bind_command_events): Bind
10505 bh 202 the events for a command.
10506 bh 194 (MainWindow.add_toolbar_command, MainWindow.add_menu_command):
10507     Call bind_command_events to bind the events. add_toolbar_command
10508     can now bind events too so that it's possible to have commands
10509     that are only available through the toolbar.
10510     (MainWindow.init_ids): New instance variable events_bound to keep
10511     track of for which commands events have been bound.
10512    
10513 bh 190 2002-05-28 Bernhard Herzog <[email protected]>
10514    
10515     * Thuban/UI/menu.py: New module to build and manage menus.
10516    
10517     * Thuban/UI/mainwindow.py: Remove some unused imports.
10518     (MainWindow.__init__, main_menu): move the definition of the main
10519     menu from __init__ to the Menu instance main_menu.
10520     (MainWindow.build_menu_bar, MainWindow.build_menu): New methods to
10521     build the menu bar and sub-menus from a menu description.
10522    
10523     * Thuban/UI/application.py (ThubanApplication.OnInit): Read the
10524     startup file
10525     (ThubanApplication.read_startup_files): New method to run
10526     ~/.thuban/thubanstart.py
10527    
10528 bh 192 * Thuban/UI/mainwindow.py (MainWindow.__init__, main_toolbar):
10529     Move the toolbar definition to the Menu instance main_toolbar.
10530     (MainWindow.build_toolbar): New method to build the toolbar
10531     similar to the build_menu methods
10532    
10533 bh 184 2002-05-23 Bernhard Herzog <[email protected]>
10534    
10535 bh 186 * Thuban/UI/mainwindow.py (MainWindow.__init__): Fix spelling of
10536     layer_outline_color. Fix it in the definition of the command too.
10537    
10538 bh 184 * Thuban/UI/command.py (Command): Fix typo in doc string
10539    
10540 bh 182 2002-05-22 Bernhard Herzog <[email protected]>
10541    
10542     * Thuban/UI/mainwindow.py (MainWindow.RunMessageBox): Fix a typo
10543     in the docstring
10544    
10545 bh 175 2002-05-15 Bernhard Herzog <[email protected]>
10546    
10547 bh 180 * Thuban/Model/layer.py (Layer.open_shapefile): Set bbox to None
10548     when the shapefile is empty.
10549     (Layer.BoundingBox, Layer.LatLongBoundingBox): Both methods may
10550     now return None for empty shapefiles. Update doc-strings.
10551    
10552     * Thuban/Model/map.py (Map.BoundingBox): Add doc-string. Deal with
10553     the layer's bbox being None.
10554    
10555     * Thuban/UI/tree.py (SessionTreeCtrl.update_tree): Deal with the
10556     layer's bbox being None.
10557    
10558 bh 175 * Thuban/UI/view.py (MapCanvas.shape_selected): Only redraw when
10559     necessary.
10560     (MapCanvas.__init__): New instance variables, last_selected_layer
10561     and last_selected_shape to determine how the selection has
10562     changed.
10563    
10564     * Thuban/UI/tableview.py (TableGrid.__init__): Do not call
10565     AutoSizeColumns because it will cause a traversal of the entire
10566     table which for large .dbf files will take a very long time.
10567    
10568 bh 172 2002-05-14 Bernhard Herzog <[email protected]>
10569    
10570     * Thuban/Model/layer.py (Layer.open_shapefile): Choose a better
10571     maximum depth for the tree than shapelib does by default.
10572    
10573 bh 165 2002-05-10 Bernhard Herzog <[email protected]>
10574    
10575     * setup.py (py_modules): The shptree modules doesn't have a
10576     wrapper, so don't include it in the py_modules
10577    
10578 bh 163 2002-05-08 Bernhard Herzog <[email protected]>
10579    
10580     * extensions/shapelib/shptree.c (compare_ints): Make arguments
10581     const void * as in the qsort prototype
10582     (SHPTreeFindLikelyShapes): Remove some unused variables.
10583    
10584     * Thuban/UI/view.py (PanTool.MouseMove): Use the bitmap the view
10585     maintains to redraw the window during a drag.
10586     (MapCanvas.unprojected_rect_around_point): New method to determine
10587     a small region around a point for hit-testing.
10588     (MapCanvas.find_shape_at): Only test the shapes in a small region
10589     around the point.
10590    
10591     * setup.py: Increment the version to 0.1.2
10592    
10593     * Thuban/UI/tree.py (SessionTreeCtrl.unsubscribe_all): Remove a
10594     debug print and set session to None after unsubscribing
10595    
10596 bh 146 2002-05-07 Bernhard Herzog <[email protected]>
10597    
10598 bh 154 * Data/iceland_sample.session, Data/iceland_sample.thuban: Rename
10599     the file to have a .thuban extension.
10600    
10601 bh 152 * Thuban/UI/tree.py (session_channels): New class constant with
10602     all the session channels to subscribe to to update the tree
10603     (SessionTreeCtrl.session_changed): Remember the session so that we
10604     can unsubscribe properly. Use the new class constant to
10605     unsubscribe from the old session and subscribe to the new one.
10606     (SessionTreeCtrl.unsubscribe_all): New method to unsubscribe all
10607     subscriptions of the SessionTreeCtrl.
10608     (SessionTreeView.OnClose): Call the tree's unsubscribe_all method.
10609    
10610     * Thuban/UI/mainwindow.py (MainWindow.__init__): Add the "Show
10611     Session Tree" command to the file menu.
10612    
10613     * Thuban/UI/view.py (MapCanvas.do_redraw): Pass the entire bitmap
10614     as update_region to the renderer.
10615    
10616     * Thuban/UI/renderer.py
10617     (ScreenRenderer.layer_ids, ScreenRenderer.draw_shape_layer): The
10618     update box is now directly a tuple, not a wxRect anymore.
10619    
10620     * Thuban/Model/layer.py (Layer.ShapesInRegion): Remove some debug
10621     prints.
10622    
10623     2002-05-07 Bernhard Herzog <[email protected]>
10624    
10625 bh 146 * setup.py: Add the shptree extension module. See
10626     extensions/pyshapelib/ChangeLog for more details.
10627    
10628     * extensions/shapelib/shpopen.c, extensions/shapelib/shapefil.h,
10629     extensions/shapelib/dbfopen.c: Really update to the versions of
10630     shapelib 1.2.9. For some reason it wasn't really done on
10631     2002-04-11.
10632    
10633     * extensions/shapelib/shptree.c: Modified version of shptree.c of
10634     shapelib 1.2.9. The only real difference is the use of qsort
10635     instead of a bubble sort implementation
10636    
10637     * Thuban/Model/layer.py (Layer.__init__): New instance variable
10638     shapetree to hold the shapelib quadtree for the shapefile
10639     (Layer.open_shapefile): Create the quad tree.
10640     (Layer.ShapesInRegion): New method to return the ids of shapes in
10641     a given region using the quad tree.
10642    
10643     * extensions/thuban/wxproj.cpp (project_points): Fix some typos in
10644     comment
10645     (draw_polygon_shape): Accept both arcs and polygons.
10646     (initwxproj): Use the new PYSHAPELIB_IMPORT_API macro to import
10647     the api.
10648    
10649     * Thuban/UI/renderer.py (MapRenderer.layer_ids): New method to
10650     return the shape ids to be rendered in a given layer.
10651     (MapRenderer.draw_shape_layer): Call layer_ids to get the list of
10652     ids. Use draw_polygon_shape to draw arc shapes as well.
10653     (ScreenRenderer.RenderMap): New parameter for the rectangle that
10654     has to be updated
10655     (ScreenRenderer.layer_ids): Make use of the layer's quadtree by
10656     calling it's ShapesInRegion method.
10657    
10658     * Thuban/UI/view.py (MapCanvas.__init__): New instance variable
10659     update_region for the update region.
10660     (MapCanvas.OnPaint): Maintain the update region
10661     (MapCanvas.do_redraw): Pass the bounding box of the update_region
10662     to the renderer when drawing the bitmap. Reset the update_region.
10663    
10664 bh 129 2002-05-03 Bernhard Herzog <[email protected]>
10665    
10666 bh 131 * Thuban/UI/mainwindow.py (MainWindow.SaveSessionAs,
10667     MainWindow.OpenSession): Change the file extension of the session
10668     files to .thuban
10669    
10670 bh 129 * Thuban/Model/session.py (Session.AddMap, forwarded_channels):
10671     Move the map channels to be forwarded by the session into the
10672 bh 146 class constant with forwarded_channels. Also add
10673     LAYER_PROJECTION_CHANGED and LAYER_VISIBILITY_CHANGED to
10674     forwarded_channels
10675 bh 129
10676     * Thuban/Model/base.py (Modifiable.changed): Fix doc-string (a
10677     typo and some rewording).
10678    
10679 bh 126 2002-05-02 Bernhard Herzog <[email protected]>
10680    
10681     * Thuban/UI/view.py: Keep the temporary bitmap used during drawing
10682     around to speed up most redraws:
10683     (MapCanvas.__init__): New instance variable bitmap which holds the
10684     bitmap
10685     (MapCanvas.do_redraw): Redraw self.bitmap if necessary. Use
10686     self.bitmap to draw.
10687     (MapCanvas.full_redraw): New method to force a full redraw
10688     including the bitmap
10689     (MapCanvas.SetMap): Subscribe full_redraw instead of redraw to
10690     make sure the bitmap is redrawn.
10691     (MapCanvas.projection_changed, MapCanvas.set_view_transform,
10692     MapCanvas.shape_selected): Call full_redraw instead of readraw to
10693     make sure the bitmap is redrawn.
10694     (MapCanvas.OnSize): New method to handle size events so that the
10695     bitmap can be redrawn.
10696    
10697 bh 124 2002-04-29 Bernhard Herzog <[email protected]>
10698    
10699     * Thuban/UI/mainwindow.py (MainWindow.__init__): Subscribe to the
10700     canvas' VIEW_POSITION event
10701     (MainWindow.view_position_changed): Handler for VIEW_POSITION.
10702     Update the text in the status-bar accordingly.
10703    
10704     * Thuban/UI/view.py (MapCanvas): Derive from Publisher as well
10705     (MapCanvas.__del__): Implement because Publisher.__del__ has to be
10706     called.
10707     (MapCanvas.__init__): Bind EVT_LEAVE_WINDOW too. Initialize
10708     current_position
10709     (MapCanvas.set_current_position): New method to set
10710     current_position. Issue a VIEW_POSITION event
10711     (MapCanvas.CurrentPosition): New public method to return the value
10712     of current_position. Should be called when the VIEW_POSITION event
10713     is processed.
10714     (MapCanvas.OnLeftDown, MapCanvas.OnLeftUp, MapCanvas.OnMotion):
10715     Update the position.
10716     (MapCanvas.OnLeaveWindow): Set the position to None.
10717    
10718     * Thuban/UI/messages.py (VIEW_POSITION): New message for the
10719     position in the statusbar
10720    
10721 tkoester 403 2002-04-26 Frank Koormann <[email protected]>
10722 frank 120
10723     * Thuban/UI/mainwindow.py: AddLayer, Dialog title s/session/data
10724    
10725 tkoester 403 2002-04-24 Frank Koormann <[email protected]>
10726    
10727 frank 118 * Resources/Bitmaps/identify.xpm: shadow added
10728    
10729     * Resources/Bitmaps/fullextent.xpm: new
10730 jan 116
10731 tkoester 403 2002-04-22 Jan-Oliver Wagner <[email protected]>
10732 jan 116
10733 tkoester 403 * Thuban/UI/tree.py (update_tree): added test for None on map bounding
10734     box
10735 jan 114
10736 tkoester 403 2002-04-21 Jan-Oliver Wagner <[email protected]>
10737    
10738 jan 114 * Thuban/UI/proj4dialog.py (UTMProposeZoneDialog): new
10739    
10740     * Thuban/UI/tree.py (update_tree): added added map extent
10741    
10742     * Thuban/UI/mainwindow.py (_method_command): extended by parameter
10743 tkoester 403 icon; added map_full_extend as tool
10744 jan 114
10745 tkoester 403 2002-04-19 Jan-Oliver Wagner <[email protected]>
10746 jan 107
10747     * Thuban/UI/mainwindow.py (SaveSession): launch save as dialog for
10748     saving _new_ sessions
10749    
10750     * Thuban/Model/session.py (create_empty_session): new session
10751     don't have a filename (set to None)
10752    
10753     * Thuban/UI/tree.py (update_tree): added filename and modified flag
10754    
10755     * Thuban/Model/load.py (ProcessSession): convert projection
10756     parameters from unicode to regular string
10757    
10758     * Data/iceland_sample.session: Added UTM Zone 26 projection.
10759    
10760 bh 100 2002-04-11 Bernhard Herzog <[email protected]>
10761    
10762     * extensions/shapelib/shapefil.h, extensions/shapelib/shpopen.c,
10763     extensions/shapelib/dbfopen.c: Update to the versions of shapelib
10764     1.2.9
10765    
10766     * setup.py (Lib.wxproj extension): Don't link shpopen.c and put
10767     the pyshapelib directoy into the list of include dirs, so that
10768     pyshapelib_api.h can be found.
10769    
10770     * extensions/thuban/wxproj.cpp (pyshapelib_api): New variable that
10771     holds the pyshapelib C-API
10772     (draw_polygon_shape, point_in_polygon_shape, shape_centroid): Use
10773     pyshapelib_api to access the shapelib functions.
10774     (initwxproj): Import the c_api from the shapelib module and
10775     initialize pyshapelib_api.
10776    
10777 bh 89 2002-04-04 Bernhard Herzog <[email protected]>
10778    
10779 bh 91 * setup.py (thuban_bdist_rpm.initialize_options): Use
10780     initialize_options to create the scripts for the rpm.
10781    
10782 bh 89 * extensions/pyprojection/setup.py (PROJ4_PREFIX): Just use /
10783    
10784 bh 85 2002-04-03 Bernhard Herzog <[email protected]>
10785    
10786 bh 87 * setup.py: Increment version to 0.1.1
10787    
10788 bh 85 * Thuban/UI/mainwindow.py (MainWindow.__init__): Move the "Add
10789     Layer" and "Remove Layer" commands from the layer menu to the map
10790     menu
10791    
10792 bh 83 2002-02-15 Bernhard Herzog <[email protected]>
10793    
10794     * Thuban/Model/layer.py (Layer.Shape): list append only takes one
10795     argument (python <= 1.5.2 erroneously accepted multiuple
10796     arguments)
10797    
10798 bh 81 2002-02-04 Bernhard Herzog <[email protected]>
10799    
10800     * Thuban/UI/identifyview.py (IdentifyGridCtrl): New class to use a
10801     RecordGrid in the identifyview.
10802     (IdentifyView.__init__): Use IdentifyGridCtrl instead of
10803     IdentifyListCtrl. The grid allows editing of the values.
10804    
10805     * Thuban/UI/controls.py (RecordTable, RecordGridCtrl): New classes
10806     implementing a grid for a single row of a thuban table.
10807    
10808     * Thuban/UI/view.py (MapCanvas.SelectShapeAt): Search through all
10809     layers by default. Easier to use than the previous default of only
10810     searching through the select layer which meant that if no layer
10811     was selected, you couldn't select a shape.
10812    
10813     * Thuban/UI/tableview.py (TableGrid.__init__): Fix typo
10814    
10815     * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Honour the
10816     stroke_width attribute
10817    
10818     * Thuban/Model/save.py (save_session): Write the new stroke_width
10819     attribute
10820    
10821     * Thuban/Model/load.py (ProcessSession.startElement): Read the
10822     stroke_width attribute
10823    
10824     * Thuban/Model/layer.py (Layer.__init__): New parameter and
10825     instance variable stroke_width
10826     (Layer.SetStrokeWidth): Set the stroke_width.
10827    
10828 bh 72 2002-02-01 Bernhard Herzog <[email protected]>
10829    
10830     * extensions/thuban/wxproj.cpp (project_points): Fix two
10831     off-by-one errors in the last loop that joins the various parts
10832     together.
10833    
10834 bh 71 2002-01-14 Bernhard Herzog <[email protected]>
10835    
10836     * setup.py (data_dist.make_distribution): Fix some typos
10837    
10838 bh 70 2001-09-18 Bernhard Herzog <[email protected]>
10839    
10840     * README: Slight tweaking in preparation for the 0.1 release
10841    
10842     * setup.cfg: Add section for sdist to create both tgz and zip
10843     archives
10844    
10845     * setup.py: increase version number to 0.1
10846     (data_dist): New command class for data distribution
10847    
10848 bh 64 2001-09-14 Bernhard Herzog <[email protected]>
10849    
10850 bh 70 * Thuban/UI/identifyview.py (IdentifyListCtrl.selected_shape):
10851     Handle the case of no layer (i.e. layer is None) properly.
10852    
10853 tkoester 403 * Thuban/UI/proj4dialog.py (UTMDialog.__init__, Proj4Dialog.__init__):
10854 bh 70 Set the initial selection of the combo boxes to reflect the
10855     projection we're starting with in a way that works on windows,
10856     too.
10857    
10858 bh 64 * Thuban/Lib/connector.py (Connector.print_connections): Print the
10859     puiblisher's ids in hex to make it easier to compare them to the
10860     standard repr of python methods
10861    
10862     * Thuban/Model/map.py (Map.Destroy): Unsubscribe the label_layer
10863     messages
10864    
10865 bh 59 2001-09-13 Bernhard Herzog <[email protected]>
10866    
10867 bh 64 * Thuban/UI/tree.py (SessionTreeCtrl.OnSelChanged): Make sure to
10868     deselect the layer if no layer is selected
10869    
10870 bh 59 * Thuban/UI/view.py (MapCanvas.OnPaint): Only delay drawing to
10871     idle time when there actually is something to draw. If there's
10872     nothing to draw simply clear the window
10873     (MapCanvas.do_redraw): Call dc.EndDrawing and add some comments.
10874     (MapCanvas.SetMap): force a redraw in all cases because
10875     FitMapToWindow doesn't always do it.
10876     (MapCanvas.ZoomFactor): Add an optional parameter, center, to
10877     specify the point to move into the center of the window
10878     (ZoomOutTool.MouseUp, ZoomInTool.MouseUp): If the mouse wasn't
10879     dragged, zoon in/out by a factor of 2
10880 bh 64 (MapCanvas.find_shape_at): Iterate backwards (i.e. with decreasing
10881     index, i.e. reversed drawing order) so that objects appearing to
10882     be in from of others are selected first. This is probably mostly
10883     relevant for point shapes where the symbols used may overlap
10884 bh 59
10885     * Thuban/Model/session.py (create_empty_session): Unset the
10886     modified bit before returning it
10887    
10888     * Thuban/UI/mainwindow.py (MainWindow.NewSession): Use
10889     create_empty_session session to create the new, empty session.
10890    
10891     * Thuban/UI/mainwindow.py (MainWindow.__init__): Set the size of
10892     the tool bitmaps.
10893     (MainWindow.OnClose, MainWindow.save_modified_session): Separate
10894     the code that asks whether the session should be saved into the
10895     new method save_modified_session.
10896     (MainWindow.OpenSession, MainWindow.NewSession): Use the new
10897     method to save modified session here too.
10898    
10899 bh 55 2001-09-11 Bernhard Herzog <[email protected]>
10900    
10901     * setup.py (InnoIconItem): fix typo
10902    
10903     (thuban_bdist_inno.run):
10904     (bdist_inno.run): Move the decision not to create symlinks on
10905     non-nt platforms to thuban_bdist_inno and do it unconditinally
10906     since we never want to create the symlinks here
10907    
10908 bh 48 2001-09-10 Bernhard Herzog <[email protected]>
10909    
10910 bh 53 * Thuban/UI/mainwindow.py (MainWindow.IdentifyTool): Popup the
10911     identify view immediately
10912    
10913     * Thuban/UI/controls.py: New file with two classes RecordListCtrl
10914     and SelectableRecordListCtrl that implement the code shared by the
10915     identify view and the label dialog
10916    
10917     * Thuban/UI/identifyview.py (IdentifyListCtrl): Derive from the
10918     new class RecordListCtrl
10919    
10920     * Thuban/UI/labeldialog.py (LabelDialog.OnOK): Check whether the
10921     return value of GetValue is None instead of using it as a boolean
10922     directly so that Zero numbers are handled properly.
10923     (LabelListCtrl): Derive from the new class
10924     SelectableRecordListCtrl
10925    
10926 bh 48 * Thuban/UI/proj4dialog.py (Proj4Dialog.__init__):
10927     (Proj4Dialog.dialogLayout): Make the window resizable and set the
10928     size of the text control explicitly to make the sizers work on
10929     both Windows and X.
10930    
10931 bh 44 2001-09-07 Bernhard Herzog <[email protected]>
10932    
10933     * Thuban/UI/view.py (MapCanvas.find_shape_at):Add a new parameter
10934     that can limit the search to the currently selected layer.
10935     (MapCanvas.SelectShapeAt): Make sure that the currently selected
10936     layer stays selected even when no shape is found
10937 bh 46 (MapCanvas.FitRectToWindow): If the rect has zero with or zero
10938     height do nothing (avoids zero division errors)
10939 bh 44
10940 bh 32 2001-09-06 Bernhard Herzog <[email protected]>
10941    
10942 bh 42 * Thuban/UI/tree.py (SessionTreeCtrl, SessionTreeView.__init__):
10943     Correct the spelling of SessionTreeCtrl. dabbrev is too damn
10944     convenient :-)
10945     (SessionTreeCtrl.__init__, SessionTreeCtrl.update_tree): Introduce
10946     a new instvar layer_to_item to map layers to tree items
10947     (SessionTreeCtrl.layer_selected): Select the appropriate tree item
10948     to match the current selection in the interactor
10949    
10950 bh 40 * Thuban/UI/interactor.py (Interactor.SelectedLayer):
10951     (Interactor.HasSelectedLayer): New methods to query the current
10952     selection
10953    
10954     * Thuban/UI/mainwindow.py (MainWindow.current_layer):
10955     (MainWindow.has_selected_layer): Simply call the appropriate
10956     interactor method
10957    
10958     * Thuban/UI/mainwindow.py (MainWindow.__init__):
10959     (MainWindow.LayerShowTable):
10960     (MainWindow.identify_view_on_demand): Store the interactor in an
10961     instvar and use that reference instead of going through main.app
10962    
10963 tkoester 403 * Thuban/UI/mainwindow.py (MainWindow.ShowSessionTree):
10964     * Thuban/UI/application.py (ThubanApplication.OnInit):
10965 bh 40 * Thuban/UI/main.py (main): Create the session tree view in main
10966     with the new mainwindow method ShowSessionTree and not directly
10967     the application's OnInit method
10968    
10969     * Thuban/UI/tree.py (myTreeCtrlPanel):
10970     (SessioinTreeCtrl): Rename to SessioinTreeCtrl and turn it into a
10971     TreeCtrl isntead of a panel. This affects most method since we now
10972     refer to self instead of self.tree
10973     (SessionTreeView): New class implementing a non-modal dialog
10974     showing the session tree.
10975    
10976 bh 35 * Thuban/UI/mainwindow.py (MainWindow.LayerShowTable): Pass the
10977     layer to the tableview dialog.
10978    
10979     * Thuban/UI/tableview.py: Add some doc-strings
10980 tkoester 403 (TableGrid):
10981 bh 35 (TableGrid.OnRangeSelect):
10982     (TableGrid.OnSelectCell):
10983     (TableFrame.__init__):
10984     (TableFrame.row_selected):
10985     Selecting rows in the grid view now updates the selected shapes
10986     through the TableFrame. To achieve this we derive TableGrid from
10987     Publisher and introduce the message type ROW_SELECTED which the
10988     TableFrame subscribes to and which is issued by OnRangeSelect and
10989     OnSelectCell
10990    
10991     (DataTable.SelectRow): Removed because it's no longer needed in
10992     the row/shape selection scheme
10993    
10994 bh 32 * Thuban/UI/dialogs.py: New file implementing common classes for
10995     dialogs
10996    
10997     * Thuban/UI/tableview.py (TableGrid.__init__): Don't subscribe to
10998     the SELECTED_SHAPE message anymore. This is now handled by the
10999     parent.
11000     (TableGrid.select_shape): Only update the selection if the shape
11001     is not None.
11002     (TableFrame): Inherit from the new NonModalDialog class.
11003     (TableFrame.__init__, TableFrame.select_shape): Handle the
11004     SELECT_SHAPE message.
11005     (TableFrame.OnClose): Extend the inherited method to unsubscribe
11006     SELECT_SHAPE
11007    
11008     * Thuban/UI/mainwindow.py (MainWindow.init_dialogs):
11009     (MainWindow.add_dialog):
11010     (MainWindow.dialog_open):
11011     (MainWindow.remove_dialog):
11012     (MainWindow.get_open_dialog): New methods to maintain a dictionary
11013     of opened non-modal dialogs.
11014    
11015     (MainWindow.__init__): Initialize the new non-modal dictionary
11016     management code
11017     (MainWindow.LayerShowTable): maintain separate dialogs for each
11018     table using the non-modal dialog management code to only open a
11019     view once for each table.
11020    
11021     (MainWindow.IdentifyTool):
11022     (MainWindow.__init__):
11023     (MainWindow.identify_view_on_demand): Don't open the identify view
11024     in IdentifyTool anymore. This will be done automatically by the
11025     new method identify_view_on_demand which handles the
11026     SELECTED_SHAPE message so that the identify view will be opened on
11027     demand
11028    
11029     * Thuban/UI/identifyview.py (IdentifyListCtrl.__init__): Remove
11030     the interactor argument. The SELECTED_SHAPE message is now handled
11031     by the parent.
11032     (IdentifyView.__init__): Add the interactor argument so that we
11033     can handle the SELECTED_SHAPE message here
11034     (IdentifyView.selected_shape): New method to handle the
11035     SELECTED_SHAPE messages
11036    
11037     * Thuban/UI/identifyview.py (IdentifyView): Derive from the new
11038     NonModalDialog class
11039     (IdentifyView.OnClose): Extend the inherited version to
11040     unsubscribe SELECT_SHAPE
11041    
11042     * Thuban/Model/session.py (Session.UnsetModified): Remove debug prints
11043    
11044 bh 26 2001-09-05 Bernhard Herzog <[email protected]>
11045    
11046     * Thuban/UI/view.py (MapCanvas.__init__): New argument, interactor.
11047 tkoester 403
11048 bh 26 * Thuban/UI/mainwindow.py (MainWindow.__init__): New argument
11049     interactor to pass through to the MapCanvas
11050 tkoester 403
11051 bh 26 * Thuban/UI/application.py (ThubanApplication.OnInit): Use the new
11052     argument to the MainWindow constructor to get rid of the ugly hack
11053     that made main.app available early just so that the mapcanvas
11054     could access the interactor object.
11055    
11056 bh 19 2001-09-04 Bernhard Herzog <[email protected]>
11057    
11058 bh 22 * Thuban/UI/mainwindow.py (MainWindow.RunMessageBox): New method
11059     that runs a modal message box
11060     (MainWindow.OnClose): Use the new method
11061     (MainWindow.RemoveLayer): Just do nothing in case no layer is
11062     selected. The command should be grayed out anyway, so there's no
11063     need to pop up a message box.
11064     (MainWindow.AddLayer): Pop up a message box with an error message
11065     if the shape file can't be opened
11066    
11067     * Thuban/Model/layer.py (Layer.__init__): Open the shapefile
11068     immediately. This will cause an exception in case the file can't
11069     be opened and we can display an appropriate message.
11070    
11071 bh 19 * MANIFEST.in: Add extensions/pyprojection/LICENSE
11072    
11073     * setup.py (thuban_bdist_rpm): New class implementing a Thuban
11074     specific bdist_rpm command.
11075    
11076     * Thuban/UI/main.py: Catch ImportError exceptions when importing
11077     the locale module because it may not be available on some
11078     installations.
11079    
11080     * extensions/pyprojection/LICENSE: Copy of the license text in
11081     Projection.i. Having it in a separate file makes it easier to
11082     refer to license text in e.g. RPMs
11083    
11084 bh 18 2001-09-03 Bernhard Herzog <[email protected]>
11085    
11086 bh 19 * setup.py: use wx-config instead of wxgtk-config because it's
11087     more generic
11088    
11089     * setup.py (ThubanInstall.get_outputs): Add the symlink in
11090     <prefix>/bin to the outputs
11091     (ThubanInstall.link_file): New method to link files. We need this
11092     because the standard copy_files refuses to link non-existing
11093     files.
11094     (ThubanInstall.run): Remove the leading install root from the
11095     script filename if an install root was specified and use the new
11096     link_file method
11097 tkoester 403
11098 bh 18 * Thuban/UI/mainwindow.py (MainWindow.AddLayer): Fit the map to
11099     the window when the first layer is added to the map.
11100    
11101     * setup.py (ThubanInstall.run): Honor the build root (self.root)
11102     when linking thuban.py to <prefix>/bin
11103    
11104 bh 16 2001-08-31 Bernhard Herzog <[email protected]>
11105    
11106     * setup.py: In the setup call, the install parameters shouldn't
11107     have trailing slashes because distutils on non-posix platforms
11108     doesn't like that. The same applies to other directories like
11109     "Resources/Bitmaps"
11110    
11111     In the configuration section for nt, move the wxWindows directory
11112     optins into the part clearly marked as editable.
11113    
11114     (InstallLocal.initialize_options):
11115     (InstallLocal.user_options): remove the currently unused debug
11116     flag
11117     (thuban_build_py.find_all_modules): Add this method so that it
11118     works for our case of having packages and modules in one
11119     distribution as well.
11120     (ThubanInstall.initialize_options):
11121     (ThubanInstall.finalize_options):
11122     (ThubanInstall.user_options):
11123     (ThubanInstall.boolean_options): Add new options, do-symlink and
11124     extra files. Since these are the first ThubanInstall specific
11125     options, override user_options and boolean_options
11126     (ThubanInstall.run): Honor the new do-symlink and extra-files
11127     options.
11128     (ThubanInstall.get_outputs): Add to override the base-class's
11129     version and add the extra-files to the outputs
11130     (bdist_inno): New class for windows distributions with Inno Setup
11131     (InnoIconItem): Helper class for bdist_inno
11132     (thuban_bdist_inno): Thuban specific version of bdist_inno. Added
11133     this together with the appropriate parameters, to the setup call.
11134 tkoester 403
11135 bh 16 * setup.cfg (bdist_inno): added new section for the inno setup
11136     installer
11137    
11138     * Thuban/UI/tree.py (myTreeCtrlPanel.__init__): New inst var
11139     changing_selection to avoid recursive selection events when
11140     modifying the selection in response to a selection event.
11141     (myTreeCtrlPanel.normalize_selection): Set the new inst var when
11142     changing the tree's selection.
11143     (myTreeCtrlPanel.OnSelChanged): Only normalize the selection when
11144     we're not being called indirectly from normalize_selection.
11145    
11146     * Thuban/UI/mainwindow.py (MainWindow.update_command_ui): Call
11147     event.Check only if the command is actuall checkable.
11148     (MainWindow.__init__): Call the toolbar's Realize method to make
11149     sure that the items are actually shown
11150    
11151 bh 7 2001-08-28 Bernhard Herzog <[email protected]>
11152    
11153 bh 9 * setup.py: Fix some doc strings
11154    
11155 bh 7 * ChangeLog: started
11156    

Properties

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

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26