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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 2480 - (hide annotations)
Sat Dec 18 00:29:04 2004 UTC (20 years, 2 months ago) by bernhard
Original Path: trunk/thuban/ChangeLog
File size: 422941 byte(s)
	Refactored in svgexport:
	DrawPath replaces DrawPolygon; added newline in front of "M" in paths.

	* Extensions/svgexport/svgmapwriter.py
	Added verbosity level 3 to print out polygon points.
	(class Point): added __repr__
	(class Brush, __str__()): Added space after ,.
	(DrawPolygon): Renamed to DrawPath()
	(DrawPath): Takes list of polygons as input now, adds \n before "M"s.
	(DrawLines): Using DrawPath now.

	* Extensions/svgexport/test/test_svgmapwriter.py:
	Replaced DrawPolygon() calls with DrawPath() and put the first argument
	inside another list. Adapted test data with a newline before "M".

1 bernhard 2479 2004-12-18 Bernhard Reiter <[email protected]>
2 bernhard 2480
3     Refactored in svgexport:
4     DrawPath replaces DrawPolygon; added newline in front of "M" in paths.
5    
6     * Extensions/svgexport/svgmapwriter.py
7     Added verbosity level 3 to print out polygon points.
8     (class Point): added __repr__
9     (class Brush, __str__()): Added space after ,.
10     (DrawPolygon): Renamed to DrawPath()
11     (DrawPath): Takes list of polygons as input now, adds \n before "M"s.
12     (DrawLines): Using DrawPath now.
13    
14     * Extensions/svgexport/test/test_svgmapwriter.py:
15     Replaced DrawPolygon() calls with DrawPath() and put the first argument
16     inside another list. Adapted test data with a newline before "M".
17    
18     2004-12-18 Bernhard Reiter <[email protected]>
19 bernhard 2479
20     Refactored svgexport tests: 9 double tests runs eliminated;
21     code size reduced by 8 lines.
22    
23     * Extensions/svgexport/test/test_svgmapwriter.py:
24     (class TestWithDC): Renamed to BaseTestWithDC, moved to top.
25     (class BaseWithDCtools): New, subclass from BaseTestWithDC.
26     (class TestDrawSplines): now subclass from BaseTestWithDCtools,
27     this fixed the double running of the nine tests of TestVirtualDC.
28     (class TestVirtualDC): Using self.dc and self.file from setUp().
29    
30 bh 2478 2004-12-17 Bernhard Herzog <[email protected]>
31    
32     Two windows specific fixes ported from thuban-1­0-branch:
33    
34     * Thuban/UI/about.py (unicodeToLocale): Use getdefaultlocale
35     instead of getlocale because getlocale doesn't return a usable
36     encoding name on a german windows 2000
37    
38     * setup.py: windows build: Removed the absolute path names and
39     made all prfixes relative to the directory containing setup.py.
40     Makes it a little easier to adapt to a different system.
41    
42 bh 2470 2004-12-16 Bernhard Herzog <[email protected]>
43    
44 bernhard 2479 Add support for PostGIS tables with LINESTRING geometries.
45 bh 2472 Fixes RT#2299
46    
47     * Thuban/Model/postgisdb.py (shapetype_map): Add LINESTRING
48    
49     * test/postgissupport.py
50     (PostgreSQLServer.get_default_static_data_db): Rename the "roads"
51     table to "roads-multi" because it now uses MULTILINESTRING
52     geometries and introduce a new "roads" table that uses LINESTRING
53     (coords_to_multilinestring): Make the doc string more precise
54     (coords_to_linestring): New. Create a LINESTRING WKT
55     representatin
56     (wkt_converter): Add coords_to_linestring
57     (upload_shapefile): Rephrase the doc-string a bit.
58    
59     * test/test_postgis_db.py (TestPostGISShapestoreArc)
60     (LineStringTests)
61     (TestPostGISShapestoreLineString)
62     (TestPostGISShapestoreMultiLineString): Split
63     TestPostGISShapestoreArc into a base class LineStringTests and two
64     derived classes TestPostGISShapestoreLineString for LINESTRING
65     geometries and TestPostGISShapestoreMultiLineString for
66     MULTILINESTRING geometries. Most test methods are in the base
67     class with the exception of tests that explicitly check the raw
68     format.
69    
70     2004-12-16 Bernhard Herzog <[email protected]>
71    
72 bh 2471 Make the test suite work with PostGIS 0.8.2 and PostgreSQL 7.4
73    
74     * test/postgissupport.py (find_postgis_sql): Different postgis
75     versions put the postgis.sql file into slightly different places
76     so we have to look in both. The updated doc string describes this
77     is more detail.
78    
79     * test/test_postgis_db.py
80     (TestPostGISSpecialCases.test_column_name_quoting): The return
81     value of UniqueValues is unsorted, so it has to be sorted for
82     comparison.
83    
84     2004-12-16 Bernhard Herzog <[email protected]>
85    
86 bh 2470 Fix for RT#2237
87    
88     * Thuban/UI/projdialog.py (ProjFrame._show_proj_panel): If the
89     panel to be shown is the UnknownProjPanel disable the OK and Try
90     buttons. Otherwise enable them.
91     (ProjFrame.__GetProjection): The UnknownProjPanel returns None for
92     the parameters. In that case __GetProjection also returns None
93     now.
94    
95 bh 2459 2004-12-15 Bernhard Herzog <[email protected]>
96    
97 bh 2462 * Thuban/UI/classgen.py (GenQuantilesPanel.__init__): Set the
98     minimum number of classes to 2. The calculate_quantiles needs at
99     least two and raises an exception otherwise.
100     Fixes RT#2549
101    
102     2004-12-15 Bernhard Herzog <[email protected]>
103    
104 bh 2460 * test/postgissupport.py (PostgreSQLServer.execute_sql): Extend to
105     so that it returns a result for select statements.
106     (PostgreSQLServer.server_version): New. Return the version of the
107     server software.
108     (PostgreSQLServer.require_authentication): The format of
109     pg_hba.conf has changed between PostgrSQL 7.2 and 7.3. Check the
110     server version and generate the file in the correct format
111    
112     2004-12-15 Bernhard Herzog <[email protected]>
113    
114 bh 2459 * test/postgissupport.py (PostgreSQLServer.is_running): Fix typo
115     in the doc string and rephrase it a little.
116    
117 frank 2457 2004-12-15 Frank Koormann <[email protected]>
118    
119     * test/test_load.py (TestAltPath.checkSession): New, extended checks if
120     session has been loaded successfully. The check is called by the relevant
121     tests after executing load_session().
122    
123 bh 2450 2004-12-13 Bernhard Herzog <[email protected]>
124    
125 bh 2454 Make sure the region used to determine which shapes are visible
126     actually matches the region on the printed page. If this isn't
127     done properly some shapes might not be printed.
128     Fixes RT #2692
129    
130     * Thuban/UI/view.py (MapPrintout.draw_on_dc): The region for the
131     renderer has to be at the same position as the mapregion
132    
133     * Thuban/UI/renderer.py (ExportRenderer.RenderMap): self.region
134     has to be moved by (self.shiftx, self.shifty) too.
135    
136     2004-12-13 Bernhard Herzog <[email protected]>
137    
138 bh 2452 * libraries/pyprojection/Projection.i: Work around a bug in the
139     generated python code which leads to exception in the __del__
140     method when the constructor fails. See the comments in the code
141     for more details.
142    
143     * libraries/pyprojection/Projection.py: Updated from Projection.i
144     with SWIG.
145    
146     2004-12-13 Bernhard Herzog <[email protected]>
147    
148 bh 2451 * test/test_load.py (TestAltPath.test_01_single_path_error_fix)
149     (TestAltPath.test_02_path_error_fix_from_list)
150     (TestAltPath.test_05_path_error_fix_from_list_changed)
151     (TestAltPath.test_06_path_error_fix_from_list_fails): self.session
152     is destroyed in tearDown, so there's no need to do it in a test
153     case.
154    
155     * Thuban/Model/load.py (SessionLoader.open_shapefile): Remove a
156     debug print
157    
158     2004-12-13 Bernhard Herzog <[email protected]>
159    
160 bh 2450 * Extensions/svgexport/test/test_svgmapwriter.py
161     (TestDrawSplines.setUp): Do not use super with the unittest
162     classes because in Python 2.2 they're still old-style classes.
163    
164 frank 2448 2004-12-13 Frank Koormann <[email protected]>
165    
166     Alternative Path feature: When loading a (moved) session where
167     shapefiles cannot be found, ask the user. Use the specified path
168     if further shapefiles are missing. However, ask the usr for confirmation
169     in such cases.
170    
171     * test/test_load.py (TestAltPath): New, tests for alternative path feature
172     in load_session()
173     (Shapefile_CallBack): Helper, implements controllable callback.
174    
175     * Thuban/UI/application.py (ThubanApplication.OnInit):
176     Added "alt_path" to self.path
177     (ThubanApplication.OpenSession): Added shapefile_callback as second
178     callback similar to db_connection_callback.
179     (ThubanApplication.run_alt_path_dialog): New, implementaion of
180     shapefile_callback. In addition to raising the dialog the control of
181     self.path('alt_path') is implemented here.
182    
183     * Thuban/Model/load.py (SessionLoader.__init__): Added shapefile_callback.
184     (SessionLoader.open_shapefile): Open shapefile, eventually with
185     alternative path. This wrapps the "theSession.OpenShapefile(filename)"
186     formerly used in start_fileshapesource()/start_layer().
187     (SessionLoader.start_fileshapesource): Call open_shapefile().
188     (SessionLoader.start_layer): Call open_shapefile().
189     (load_session): Added shapefile_callback.
190    
191     * Thuban/UI/altpathdialog.py: New, implements dialogs for alternative path
192     feature (search / check).
193    
194     * Doc/manual/thuban-manual.xml: Added documentation of new feature.
195    
196 bernhard 2443 2004-12-11 Bernhard Reiter <[email protected]>
197    
198 bernhard 2445 svgexport 0.9.2: Point size supports for maps.
199    
200     * Extensions/svgexport/svgmapwriter.py: Added import of SHAPETYPE_POINT
201     (def draw_point_shape): new parameter size defaults to 2 as before.
202     (draw_shape_layer_incrementally): Moved draw_func log line higher.
203     Added draw_func call with size when dealing with a point layer.
204    
205     * Extensions/svgexport/__init__.py: bumped version to 0.9.2.
206    
207     2004-12-11 Bernhard Reiter <[email protected]>
208    
209 bernhard 2444 Made sure that newlines are inserted in the svg path d attributes
210     to raise the chance that the line length will be below 255 characters,
211     as recommended by REC SVG 1.1 in section 8.3.1.
212    
213     * Extensions/svgexport/svgmapwriter.py(DrawPolygon):
214     Adding \n before L's and changed whitespace handling.
215    
216     * Extensions/svgexport/test/test_svgmapwriter.py:
217     Adapted tests to new whitespace handling of DrawPolygon.
218    
219     2004-12-11 Bernhard Reiter <[email protected]>
220    
221 bernhard 2443 * Doc/technotes/coding_guidelines.txt: easy typo fixed.
222    
223     * Extensions/svgexport/test/test_svgmapwriter.py:
224     Removed test_drawbezier in favour of new test_drawspline3 and
225     test_drawspline4 within new class TestDrawSplines(TestVirtualDC).
226     All only to test DrawSpline.
227    
228     * Extensions/svgexport/svgmapwriter.py(DrawSpline):
229     New implementation now really using the strange algorithm of
230     xfig 3.1's approximated splines and its conversion to postscript
231     with one twist: SVG can do quadratic beziers, so skipped translation
232     to cubic beziers.
233     (TestWithDC): Typo in comment fixed.
234    
235 joey 2442 2004-12-09 Martin Schulze <[email protected]>
236    
237     * Thuban/Model/classgen.py: Added missing character encoding
238    
239     * Extensions/wms/properties.py (OpenWMSProperties): removed
240    
241     * Extensions/wms/parser.py (WMSCapabilitiesParser.error): Dropped
242     support for get_srs_discrepancies() since there are no
243     discrepancies anymore (was a thinko)
244    
245     * Extensions/wms/layer.py (WMSLayer.GetMapImg): Improved graphic
246     format priority now that more formats are supported globally by
247     the render engine.
248    
249 silke 2437 2004-12-08 Silke Reimer <[email protected]>
250     * Extensions/ogr/ogrshapes.py: Substituted ogr-method CloseRings
251     because it is not available in all versions of ogr
252    
253 bernhard 2436 2004-12-08 Bernhard Reiter <[email protected]>
254     * Extensions/ogr/__init__.py: Added empty __init__.py to heal
255     global tests until a real one is commited.
256    
257 nhueffme 2435 2004-12-07 Nina Hüffmeyer <[email protected]>
258    
259     * /Extensions/ogr/: Adding a new extension to read shapefiles with
260     ogr. It is planned to add other vector formats.
261    
262     * /test/runtests.py: Adding tests from /Extensions/ogr/test/.
263    
264 jan 2434 2004-12-07 Jan-Oliver Wagner <[email protected]>
265    
266     * /Extensions/svgexport/test/test_svgmapwriter.py: Reverting
267     part of a (non-)fix to renable that the tests are always
268     executed.
269    
270 bernhard 2432 2004-12-07 Bernhard Reiter <[email protected]>
271    
272     * Extensions/svgexport/test/test_svgmapwriter.py:
273     Added test_drawbezier() to test DrawSpline().
274    
275     * Extensions/svgexport/svgmapwriter.py(DrawSpline):
276     Really implemented bezier drawing.
277    
278     * Extensions/svgexport/__init__.py: Bumped version of svgexport
279     to 0.9.1 because now the legend examples lines styles
280     will be drawing with beziers.
281    
282 joey 2431 2004-12-05 Martin Schulze <[email protected]>
283    
284     * Thuban/UI/renderer.py (raster_format_map): Added PNG, TIFF and
285     GIF as supported bitmap image formats (helpful for the WMS extension)
286    
287 joey 2430 2004-11-30 Martin Schulze <[email protected]>
288    
289     * Extensions/wms/test/test_ogclib.py (TestOGCLib.test_compareURLs):
290     Improved the test for the internal compare method
291    
292 jan 2429 2004-11-27 Jan-Oliver Wagner <[email protected]>
293    
294     * Thuban/UI/about.py (About.__init__): Added
295     Norbert Solymosi for hungarian translation and Ole Rahn
296     as contrbutor. Moved Bernhard Reiter from Contributor
297     to Developer.
298    
299 bernhard 2425 2004-11-27 Bernhard Reiter <[email protected]>
300    
301     * Extensions/svgexport/test/test_svgmapwriter.py:
302     Removed Jan from author list as he did not change enough significant
303     lines yet.
304    
305     * Extensions/svgexport/__init__.py: Added Bernhard as author
306     of the Extension.
307    
308 jan 2422 2004-11-27 Jan-Oliver Wagner <[email protected]>
309    
310     * po/hu.po: New. Hungarian translation. Contributed
311     by Norbert Solymosi.
312    
313 bh 2419 2004-11-26 Bernhard Herzog <[email protected]>
314    
315     * Extensions/svgexport/test/test_svgmapwriter.py
316     (Testobjectexport.test_transparent_polygon): Commented out some
317     debug prints
318    
319 jan 2418 2004-11-24 Jan-Oliver Wagner <[email protected]>
320    
321     Fix broken tests for svg extension and added svg legend
322     to Experimental menu.
323    
324     * Extensions/svgexport/test/test_svgmapwriter.py: Fix to have
325     the test run correctly even if the extension is a package.
326     Also removed the "import Thuban" which makes no sense.
327    
328     * Extensions/svgexport/__init__.py: Fix to have the extensions'
329     test module also be executed from the global test routine.
330     This is done by looking for the absense of the DISPLAY variable.
331    
332     * Extensions/svgexport/maplegend.py: Moved the menu entry from Extensions
333     to Experimental menu since this module has yet not reached a stable
334     status (ie. 1.0).
335    
336 bernhard 2414 2004-11-22 Bernhard Reiter <[email protected]>
337    
338     * Extensions/svgexport/svgmapwriter.py:
339     Added verbose variable and some logging depending on it.
340     (class VirtualDC(XMLWriter)): Minor improvement in the polygon loop,
341     because counting i is not necessary.
342     (class Pen, class Brush): Added simple __str__ methods.
343     (SVGRenderer.draw_polygone_shape): Fix #2698 (transparent polygons are
344     not exported to svg file) Note: holes still unhandled.
345    
346     * Extensions/svgexport/test/test_svgmapwriter.py:
347     Made a baseclass TestWithDC for test needed a DC.
348     Added tests for bug #2698 (transparent polygons are not
349     exported to svg file):
350     Testobjectexport.test_transparent_polygon()
351    
352     * Thuban/Model/base.py (UnsetModified):
353     Fixed some typos in docstring.
354    
355     * Thuban/UI/baserenderer.py (BaseRenderer.draw_polygon_shape()):
356     Added hints on the used algorithm for handling holes.
357    
358 jan 2403 2004-11-20 Jan-Oliver Wagner <[email protected]>
359    
360 jan 2412 Some face lifting for the examples.
361    
362     * Examples/__init__.py: Make this directory a package.
363    
364     * Examples/simple_extensions/__init__.py: Make this directory a package.
365    
366     * Examples/simple_extensions/hello_world.py: Moved entry from Extensions
367     menu to Examples menu.
368    
369     * Examples/simple_extensions/simple_command.py: Some more comments,
370     minor changes.
371    
372     * Examples/simple_extensions/simple_tool.py: Minor changes.
373    
374     2004-11-20 Jan-Oliver Wagner <[email protected]>
375    
376 jan 2407 Changed way of extension registry for wms and added extension
377     registry for umn_mapserver extension.
378    
379     * Extensions/wms/__init__.py: Added registry entry and the importing
380     of the actual wms module. Included a test for the required PyOGCLib.
381    
382     * Extensions/wms/wms.py: Removed registry entry (moved to __init__.py).
383    
384     * Extensions/umn_mapserver/__init__.py: Added registry entry and the
385     importing of the actual umn mapserver management modules.
386     Included a test for the required Python MapScript.
387    
388     2004-11-20 Jan-Oliver Wagner <[email protected]>
389    
390 jan 2403 Changed way of extension registry for importAPR, bboxdump
391     and added extension registry for svgexport.extension registry for
392     svgexport.
393    
394     * Extensions/importAPR/__init__.py: Added registry entry and the importing
395     of the actual importAPR module.
396    
397     * Extensions/importAPR/importAPR.py: Removed registry entry (moved to
398     __init__.py).
399    
400     * Extensions/bboxdump/__init__.py: Added registry entry and the importing
401     »···of the actual bboxdump module.
402    
403     * Extensions/bboxdump/bboxdump.py: Removed registry entry (moved to
404     »···__init__.py).
405    
406     * Extensions/svgexport/__init__.py: Added registry entry and the importing
407     of the svgsaver module.
408    
409     * Extensions/svgexport/svgsaver.py: Moved the menu entry from Extensions
410     to Experimental menu since this module has yet not reached a stable
411     status (ie. 1.0).
412    
413 jan 2397 2004-11-18 Jan-Oliver Wagner <[email protected]>
414    
415     Now the hit test considers the size of point symbols.
416    
417     * Thuban/UI/viewport.py (ViewPort._hit_point): Added optional parameter
418     'size' defaulting to the previously fixed value 5.
419     Extended doc-string.
420     (Viewport._find_shape_in_layer): Resolved FIXME regarding flexibility
421     for symbols.
422     Now the size of the largest point symbol is determined to find out
423     about whether the point has been hit.
424     This fixes the problem that only clicks inside a fixed distance of
425     5 where found.
426    
427 jan 2395 2004-11-17 Jan-Oliver Wagner <[email protected]>
428    
429 jan 2397 Another open issue fixed regarding sizeable symbols: correct rendering of
430 jan 2395 selected symbols.
431    
432     * Thuban/UI/renderer.py (ScreenRenderer.draw_selection_incrementally):
433     Added consideration of the specific size of point symbols.
434     The property for each point symbol is retrieved and the size applied
435     for the rendering method.
436     Added doc-string.
437    
438 jan 2393 2004-11-16 Jan-Oliver Wagner <[email protected]>
439    
440     Changed way of Extension Registry for gns2shp and profiling.
441    
442     * Extensions/gns2shp/gns2shp.py: Removed registry entry (moved to
443     __init__.py).
444    
445     * Extensions/gns2shp/__init__.py: Added registry entry and the importing
446     of the actual gns2shp module.
447    
448     * Extensions/profiling/profiling.py: Removed registry entry (moved to
449     __init__.py).
450    
451     * Extensions/profiling/__init__.py: Added registry entry and the importing
452     of the actual profiling module.
453    
454 bernhard 2388 2004-10-28 Bernhard Reiter <[email protected]>
455    
456     * Extensions/svgexport/: Minor improvements to doc strings.
457    
458 jan 2387 2004-10-07 Jan-Oliver Wagner <[email protected]>
459    
460     Further elements for sizable point objects now
461     making this feature usable though not yet complete.
462    
463     * Thuban/Model/save.py (SessionSaver.write_classification): Write
464     attribute 'size' for cldata when the shape layer is of point type.
465     This also now make the test_load.py tests happy.
466    
467     * Thuban/Model/classgen.py (CustomRamp.GetProperties): Added size
468     gradient.
469    
470     * Thuban/UI/classifier.py (ID_SELPROP_SPINCTRL): Renamed to
471     ID_SELPROP_SPINCTRL_LINEWIDTH.
472     (ID_SELPROP_SPINCTRL_LINEWIDTH): New Id replaces ID_SELPROP_SPINCTRL.
473     (ID_SELPROP_SPINCTRL_SIZE): New Id.
474     (SelectPropertiesDialog.__init__): Added a second spin control
475     for the size in case the corresponding layer is of point type.
476     (SelectPropertiesDialog._OnSpin): Renamed to _OnSpinLineWidth.
477     (SelectPropertiesDialog._OnSpinLineWidth): New. Former _OnSpin.
478     (SelectPropertiesDialog._OnSpinSize): New. Set size of property
479     and refresh preview.
480    
481    
482    
483 joey 2381 2004-10-04 Martin Schulze <[email protected]>
484    
485     * Extensions/wms/test/test_parser.py
486     (TestWMSCapabilitiesParser.test_compareLists): Added missing
487     self-test for compareLists()
488     (TestWMSCapabilitiesParser.test_compareDicts): Added missing
489     self-test for compareDicts()
490 joey 2382 (TestWMSCapabilitiesParser.test_compareLists): Adding more tests
491     to verify the test routine fails with non-equal arguments
492     (TestWMSCapabilitiesParser.test_compareDicts): Adding more tests
493     to verify the test routine fails with non-equal arguments
494 joey 2381
495 jan 2370 2004-10-03 Jan-Oliver Wagner <[email protected]>
496    
497 jan 2380 First elements for sizeable point objects.
498    
499     * Resources/XML/thuban-1.1.dtd: Added size attribute to cldata.
500    
501     * Data/iceland_sample_size.thuban: New. Sample for sized point objects.
502    
503     * test/test_load.py (ClassificationTest.TestLayers): Added SetSize in case
504     of a corresponding argument is given.
505     (TestSymbolSize): New. Test the size attribute of cldata.
506    
507     * Thuban/Model/classification.py: Removed some trailing whitespaces.
508     (ClassGroupProperties.__init__): Set default size.
509     (ClassGroupProperties.SetProperties): Set the size.
510     (ClassGroupProperties.GetSize): New. Return the size.
511     (ClassGroupProperties.SetSize): New. Set the size.
512     (ClassGroupProperties__eq__): Compare also size.
513     (ClassGroupProperties__repr__): Print also size.
514    
515     * Thuban/Model/load.py (SessionLoader.start_cldata): Also parse
516     the size attribute.
517    
518     * Thuban/UI/classifier.py (ClassDataPreviewer.Draw): Added doc-string.
519     Also, now there is a return value that indicates whether the drawing
520     size exceeded the given rect extent and if so the new extent.
521     Finally, point objects are drawn depending on the size. If either
522     the width or height is exceeded, the new extent is returned.
523     (ClassRenderer.Draw): Now when calling the previewer drawing function,
524     evaluate the return value and, if not None, adapt the grid widget size
525     accordingly and redraw again.
526    
527     * Thuban/UI/baserenderer.py (BaseRenderer.draw_shape_layer_incrementally):
528     If the draw function is for points, call it with the size as additional
529     parameter.
530     (BaseRenderer.draw_point_shape): Added additional, optional parameter for
531     the size. Compute the radius using the size.
532    
533     * Extensions/importAPR/apr.py (APR_BMkSym.GetThubanProp): Now
534     that Thuban supports size, apply this correctly.
535    
536     * Extensions/importAPR/importAPR.py: Bumped version to 0.1.1.
537    
538     2004-10-03 Jan-Oliver Wagner <[email protected]>
539    
540 jan 2370 * Doc/manual/thuban-manual-de.xml: Started translation of
541     Map chapter.
542    
543 joey 2368 2004-10-01 Martin Schulze <[email protected]>
544    
545     * Extensions/wms/properties.py (wmsProperties.__init__): Extended
546     argument for general use through properties-dialog selector
547    
548     * Thuban/UI/classifier.py: Register properties dialog classes for
549     both provided layer classes/types.
550    
551     * Thuban/UI/mainwindow.py (MainWindow.OpenLayerProperties): The
552     map can be retrieved through the parent which is passed to the
553     constructor anyway and doesn't require an argument of its own,
554     required for the unification of arguments for general use through
555     properties-dialog selector.
556     (MainWindow.OpenOrRaiseDialog): Move the logic for checking
557     whether a dialog is already opened (and raising it to the users
558     attention) and creating a new dialog into a function of its own
559     (MainWindow.OpenLayerProperties): Use the new OpenOrRaiseDialog()
560     method
561     (MainWindow.OpenLayerProperties): Utilise the new ClassMapper for
562     global registration of properties dialog classes (which are indeed
563     layer-specific).
564    
565     * Thuban/UI/classifier.py (Classifier.__init__): Unify arguments
566     for general use through properties-dialog selector, the map can be
567     retrieved through the parent and doesn't require an argument of
568     its own.
569    
570     * Extensions/wms/wms.py: Register the properties dialog class for
571     the provided WMS layer
572    
573 jan 2358 2004-09-28 Jan-Oliver Wagner <[email protected]>
574    
575     New feature: Registry for Extensions.
576    
577     * Thuban/UI/extensionregistry.py: This module defines a registry for
578     Extensions.
579    
580     * Thuban/UI/about.py (About.__init__): Added description
581     of the registered extensions with all of the information.
582    
583     * Thuban/Model/extension.py (Extension): Improved doc-string.
584    
585     * Extensions/gns2shp/gns2shp.py, Extensions/importAPR/importAPR.py,
586     Extensions/bboxdump/bboxdump.py, Extensions/profiling/profiling.py,
587     Extensions/wms/wms.py: Added registration of the extension.
588    
589 bernhard 2352 2004-09-27 Bernhard Reiter <[email protected]>
590    
591     More fixes to svgexport to make used ids unique and
592     conforming to XML's Name production.
593    
594     * Extensions/svgexport/test/test_svgmapwriter.py: Added new tests
595     test_xml_id_constraints(), test_make_ide_nosetbaseid() and
596     test_make_id_nonintegersetid(). Switched SetID and SetBaseID.
597     Added Bernhard R. as author.
598     * Extensions/svgexport/svgmapwriter.py (make_id): Using "_" as
599     concatenation char now (makes test_make_ide_nosetbaseid() valid).
600     Also transform second id part with "%d" and catch the TypeError
601     to raise SVGMapWriterError (making test_make_id_nonintegersetid() ok).
602     Corrected typo inBernhard's author line.
603     (SetBaseID): Return the transformed base id. Transform characters
604     which are not alnum() or in ".-_" to binascii.b2a_hex(). Added
605     import binascii. If to be set string starts with "xml" or so, add "t".
606     (draw_shape_layer_incrementally): use the returned value of SetBaseID
607     for used_baseids checks.
608    
609 bh 2351 2004-09-25 Bernhard Herzog <[email protected]>
610    
611     * test/test_layer.py (TestLayer.test_arc_layer_with_projection):
612     Remove a debug print and some tab characters.
613    
614 bernhard 2350 2004-09-25 Bernhard Reiter <[email protected]>
615    
616     * Extensions/svgexport/svgmapwriter.py: Added Bernhard R. as Author.
617     (SetBaseID, SetID, make_id): Improved docstring comments to explain
618     the interaction of the three functions and the XML id contrains.
619    
620 bernhard 2352
621 jan 2346 2004-09-23 Jan-Oliver Wagner <[email protected]>
622    
623 jan 2349 * Doc/ThubanModel.xmi: New. UML file for Thuban Model
624     Module.
625    
626     * Doc/README: Added info on ThubanModel.xmi.
627    
628     2004-09-23 Jan-Oliver Wagner <[email protected]>
629    
630 jan 2346 * Doc/README: New. Some info about how to generate technical
631     documentation from the source code.
632     This text was send to the Thuban developer mailing list on
633     September 21st 2004 by Bernhard Reiter.
634    
635 bernhard 2344 2004-09-21 Bernhard Reiter <[email protected]>
636    
637     Improved the svgexport to only use unique ids. Will issues
638     an error message dialoge when two layer names are the same.
639     ShapeIDs are now added with a dash within the svg ids.
640    
641     * Extensions/svgexport/svgmapwriter.py (SVGMapWriterError): New.
642     * Extensions/svgexport/test/test_svgmapwriter.py: Added imports
643     (TestSVGRenderer): New test class with test_make_in() and
644     test_check_for_layer_name_clash()
645     * Extensions/svgexport/svgmapwriter.py (SVGRenderer): Fixed __init__()
646     and draw_shape_layer_incrementally() to not use a baseid twice,
647     satisfying test_check_for_layer_name_clash()
648     (VirtualDC.make_id): Use a dash between baseit and id, satisfies
649     test_make_in().
650     * Extensions/svexport/svgsaver.py: Import SVGMapWriterError, wxOK
651     and wxICON_HAND.
652     (write_to_svg): Put dc and rendering in a try statement and on
653     catching SVGmapWriterError notify the user and delete the target file.
654    
655 bernhard 2343 2004-09-20 Bernhard Reiter <[email protected]>
656    
657     * Model/base.by, Model/layer.py: Fixed typos in docstrings.
658    
659 jschuengel 2342 2004-09-03 Jan Schüngel <[email protected]>
660    
661     * Extensions/umn_mapserver/mapfile(MF_Class.add_thubanstyle): Fix a
662     small bug with the line color. Now the line color will now only set
663     if it is set in Thuban an not Transparent.
664    
665     * Extensions/umn_mapserver/mf_export(tblayer_to_map): Fixed a bug with
666     deleting the layers from mapfile. Now all layers will delete backwards
667     from the last.
668    
669 silke 2339 2004-08-20 Silke Reimer <[email protected]>
670 silke 2338
671 silke 2339 * Thuban/Model/layer.py:
672     Fixes bug in projection handling: Otherwise very large region might not
673     have valid values in the layer's projection.
674    
675     2004-08-20 Silke Reimer <[email protected]>
676    
677 silke 2338 * Thuban/UI/about.py:
678     small changes to be consistent with coding style.
679    
680 joey 2337 2004-08-13 Martin Schulze <[email protected]>
681    
682     * Extensions/wms/test/test_ogclib.py (TestOGCLib.compare_URLs):
683     Adjusted a comment
684    
685 silke 2335 2004-08-11 Silke Reimer <[email protected]>
686 silke 2334
687 silke 2335 * Thuban/UI/about.py: Small changes to encoding related stuff to avoid
688     too many and too enhanced imports of locale
689    
690 silke 2334 2004-08-10 Silke Reimer <[email protected]>
691    
692     * Thuban/UI/about.py: Fixed encoding problem of about dialog: Added
693 silke 2339 function unicodeToLocale() to convert special characters to users
694     locale encoding
695 silke 2334
696 jan 2333 2004-08-10 Jan-Oliver Wagner <[email protected]>
697    
698     * Doc/technotes/coding_guidelines.txt: Added rule 'Method names start with
699     lower case letter'
700    
701 jschuengel 2331 2004-08-09 Jan Schüngel <[email protected]>
702    
703     * ChangeLog: Rewrite the last ChangeLog entry to follow
704     the standard way.
705    
706     * Extensions/umn_mapserver/mapfile: Moved the import AnnotationLayer to
707     the function where it is needed, because it don't works if it stands
708     at the beginning.
709     (MF_Layer.__init__): Removed the extra numclassed variable. Now
710     numclasses from the mapscript will be used.
711     (MF_Layer.get_index): New. Return the index of the layer in mapfile.
712     (MF_Layer.set_classes): New. A Classlist will be set to the layer.
713     (MF_Layer.set_metadata): New. A Metadata mapscript object will set.
714     (MF_Layer.remove_allclasses): New. All class of the layer will remove.
715     (MF_Map.create_new_layer): New. A new Layer is created and associated
716     with the mapscript object.
717     (MF_Map.set_layerorder): New. The Layer order like in thuban is set in
718     the mapscript.
719     (MF_Map.add_thubanlayer): Now a new layerobj is created if no one is
720     linked to the layer in thuban, else the layerobject linked to the
721     thubanlayer will be used.
722     AnnotationLayer will now store the filename of the shapefile.
723     (MF_Map.remove_layer): If a layer is removed the associated object
724     must be set new.
725    
726     * Extensions/umn_mapserver/mf_export.py(tb_layer_to_map): Add all
727     layers which are exists in thuban to the mapobj. All removed Layers
728     will be removed from the mapobj.
729     Added comments to all functions.
730     (thuban_to_map): No layer will be removed here.
731    
732     * Extensions/umn_mapserver/mf_handle.py
733     (_has_umn_mapobj_and_selectedlayer): Activating the layer menu. Now
734     Layersettings for the mapserver kann be edited.
735    
736     * Extensions/umn_mapserver/mf_import.py: Now all layers which are
737     imported, will be linked with the associated MF_Layer.
738     (import_mapfile): All layers, which are not selected, will be removed.
739     Disable the "import layer from mapfile" menu option.
740    
741     * Extensions/umn_mapserver/sample/iceland.map: Set the status of the
742     Annotation Layer from DEFAULT to OFF. The DEFAULT setting turns the
743     layer on permanently.
744    
745 jschuengel 2323 2004-08-03 Jan Schüngel <[email protected]>
746    
747 jschuengel 2331 * Extensions/umn_mapserver/mapfile.py(MF_Metadata.remove_allmetadata):
748     New. This function removes all metadata
749     (MF_Layer.set_group): New. Set the group setting.
750     (MF_Layer.get_group): New. Get the group setting.
751     (MF_Map): Removed the extra numlayers variable, used the mapscript
752     parameter instead.
753     (MF_Map.get_numlayers): New. This get numlayers.
754     (MF_Map.remove_all_layers): New. Removes all layers from the mapobj.
755 jschuengel 2323 (MF_Map.add_thubanlayer): Replaced the exception handling by a check
756     if the object is an instance. Also added the annotation layer here to
757     export, but only the layer is created in the mapfile.
758    
759 jschuengel 2331 * Extensions/umn_mapserver/mf_export.py(export_mapfile): Removed
760     the check if a mapobj exist, because its not needed anymore. The
761     export function is only available if a mapobj exist.
762     Use the new function to remove all layers.
763 jschuengel 2323
764 jschuengel 2331 * Extensions/umn_mapserver/mf_handle.py(Layer_Dialog): Added a group
765     option and the metadata button. The layer dialog is temporary disabled.
766     (Metadata_CustomDataTable): Added some functions to show the grid
767 jschuengel 2323 correct.
768    
769 jschuengel 2331 * Extensions/umn_mapserver/mf_import.py: Moved the code for showing
770     the number of layer from import_mapfile to this function.
771     (AnnotationLayer): New. This Class shows the Annotation layer in
772     thuban. The layer don't do anything. It's only to show the layer
773     and to save the layer order.
774     (add_annotationlayer): New. Import an annotation layer to thuban.
775     (select_layer2import): New. Import only layers to thuban and not
776     the other settings like projection or scalebar.
777     (create_new_mapfile): Moved the _has_umn_mapobj function and the
778     create_new_mapfile functions from mf_handle.py to mf_import.py.
779 jschuengel 2323
780     * Extensions/umn_mapserver/sample/iceland.map: Added the group
781     parameter to the roads and cultural layers. Also added a new
782     Annotation Layer for the cultural points.
783    
784     * Extensions/umn_mapserver/sample/iceland.html: Added the select
785     option for the annotation layer.
786    
787     * Extensions/umn_mapserver/sample/index.html: Added the start
788     parameter for the annotation layer.
789    
790 jan 2315 2004-08-01 Jan-Oliver Wagner <[email protected]>
791    
792     * Doc/manual/thuban-manual-de.xml (Chapter Session Management):
793     translation completed.
794    
795     * Doc/manual/thuban-manual.xml (Chapter Session Management):
796     Fixed unprecise description for Save Session.
797    
798 jan 2312 2004-07-31 Jan-Oliver Wagner <[email protected]>
799    
800     Started translation of Users Manual into german.
801    
802     * Doc/manual/thuban-manual-de.xml: New. German Users Manual.
803    
804     * Doc/manual/Makefile: Added build instructions for german
805     users manual.
806    
807     * Doc/manual/thuban-manual.xml: Minor corrections in Introduction.
808    
809 jschuengel 2308 2004-07-28 Jan Schüngel <[email protected]>
810    
811     * Extensions/umn_mapserver/mapfile.py(MF_Metadata): Changed all class
812     functions. Now all metadata will handle by the function and its not
813     needed to initialize it from outside. Therefor the associated mapobj
814     will be stored in the Metadata Object. So we can use the special
815     functions from the associated mapobj to get the Metadata.
816     Therefor all initialization code for the metadata is removed from the
817     other classes.
818     (MF_Layer): Added a function to get the metadata object.
819     (MF_Map): Added a function to set the mappath, the path where
820     the mapfile ist stored.
821    
822     * Extensions/umn_mapserver/mf_export.py(thuban_to_map): Changed the code
823     to set the extent in the mapfile. Now the code is set by the displayed
824     data in the Thuban-view.
825     (export_mapfile): The shapepath is now set empty, until relative
826     pathnames are supported.
827    
828     * Extension/umn_mapserver/mf_handle.py: Added a dialog to handle
829     metadata. Yet only mapfile metadata are supported. Layer and class
830     supported are not implemented.
831     Added a dialog to handle layer informations. The dialog only shows the
832     selected layer at the moment.
833    
834     * Extensions/umn_mapserver/mf_import.py(import_mapfile): Changed the
835     code for setting the extent in thuban. Now the extent is set to the
836     given extent from the mapfile.
837     Fixed a logical mistake. Now the extent is set when realy a layer is
838     loaded, and not if one is selected to load.
839    
840     * Extensions/umn_mapserver/sample/iceland.html: Added code to zoom and
841     move the shown map in the browser.
842    
843     * Extensions/umn_mapserver/sample/iceland.map: Added a new metadata
844     line to the mapobj and added metadata to the political layer.
845    
846     * Extensions/umn_mapserver/test/test_mapserver.py: Changed the test
847     for Metadata.
848    
849 joey 2300 2004-07-26 Martin Schulze <[email protected]>
850    
851     * Thuban/Lib/classmapper.py (ClassMapper.has): Added the new
852     ClassMapper
853    
854     * test/test_classmapper.py (TestMapping.test_mapper): Added a Test
855     case for the new ClassMapper
856    
857    
858 bh 2296 2004-07-22 Bernhard Herzog <[email protected]>
859    
860 bh 2297 * Thuban/UI/viewport.py (ViewPort.VisibleExtent): New. Return the
861     visible extent of the map in projected coordinates
862    
863     * test/test_viewport.py (SimpleViewPortTest.test_default_size)
864     (SimpleViewPortTest.test_init_with_size): Add some VisibleExtent()
865     tests.
866     (SimpleViewPortTest.test_visible_extent): New. The real test for
867     VisibleExtent()
868    
869     2004-07-22 Bernhard Herzog <[email protected]>
870    
871 bh 2296 * test/test_viewport.py: Use support.run_tests as the main
872     function when running asa script.
873    
874 jschuengel 2295 2004-07-22 Jan Schüngel <[email protected]>
875    
876     * Extensions/umn_mapserver/mf_export.py: Added "import os"
877     Removed the old "import Thuban.UI.mainwindow" code.
878     (tbextent_to_map): Removed the extra function and at the code direct
879     to "thuban_to_map" function.
880     (write_creatorcomment): Added. Now a short comment is added to the
881     beginning of an generated mapfile.
882     (export_mapfile): Now the Path and filename are saved in to variables,
883     and not together in one variable. This is needed for the new
884     write_creatorcomment function.
885    
886     * Extensions/umn_mapserver/mf_import.py (import_mapfile): Added the
887     import module "re". Also added Range and the ClassGroupRange import
888     from Thuban. Both are needed for the new range expression import.
889     (create_rangeexpression): Added. Creates a Range Expression in Thuban
890     style from a given mapfile expression.
891     (added_rasterlayer): Make some small code changes. The shapepath is
892     now stored in an extra variable and the clazz_name is set empty if no
893     class name set in the mapfile.
894     Changed the Error message for Range Expressions, becaus the new
895     function create a error string which will be shown in the dialog.
896    
897     * Extensions/umn_mapserver/test/test_mapserver.py: Added a test for the
898     range expression import.
899 jan 2312
900 jan 2291 2004-07-21 Jan-Oliver Wagner <[email protected]>
901    
902     * Extensions/umn_mapserver/README: Added hint that
903     installation as root can be avoided. Removed all tabs.
904    
905 bh 2289 2004-07-16 Bernhard Herzog <[email protected]>
906    
907     * test/test_viewport.py
908     (ViewPortTest.test_changing_map_projection): Check that changing
909     the projection of an empty map shown in a viewport doesn't lead to
910     exceptions in the viewport's handler for the
911     MAP_PROJECTION_CHANGED messages
912    
913     * Thuban/UI/viewport.py (ViewPort.map_projection_changed): Only
914     try to keep the same region visible when the map actually contains
915     something
916    
917 jschuengel 2288 2004-07-15 Jan Schüngel <[email protected]>
918    
919     * Extensions/umn_mapserver/mapfile.py: Added a function to get the
920     mappath directly from the mapobj. Is needed because of the changes
921     in mf_import.py.
922     (MF_Layer.add_thubanclass): Added a new comment.
923     (MF_Map.set_extent): Fixed a bug with exporting empty mapobj. If the
924     mapobj is empty there is no extent get from thuban an so no one can
925     set to th mapobj.
926    
927     * Extensions/umn_mapserver/mf_import.py (import_mapfile): Updated
928     the discription.
929     Split the funktion in to three smaller ones. The new functions are
930     add_rasterlayer, add_polygonlayer and select_layer2import.
931     Removed the mapfilepath and filepath initialisation, because its know
932     include in the new functions.
933     Now nothing will be imported if cancel is pressed in the
934     layer choice dialog.
935    
936 jschuengel 2285 2004-07-14 Jan Schüngel <[email protected]>
937    
938     * Extensions/umn_mapserver/mapfile.py: Added ClassGroupDefault to
939     import.
940     (MF_Symbolset): Removed the extra variable for numsymbols.
941     (MF_Class.__init__): Added a comment to the exception clause.
942     Removed the extent init, because it was not needed anymore.
943     (MF_Layer.add_thubanclass): Added the code to set the class name to
944     the expression value from thuban if no label is defined.
945     Added the code to export Range expressions from thuban to the mapfile.
946     (MF_Map.set_extent): Removed the exception and replace it by some if
947     code. If the size of a map is not defined the size will be set to 1,1.
948     This is necessary because if the extent is set, mapscript checks if
949     the size is greater than zero.
950     (MF_Web): Added the get and set function for the template.
951    
952     * Extensions/umn_mapserver/mf_export.py: Added the function to check
953     if a mapobject exists and used it to set the status of the menu items.
954     If no mapfile exists the settings could not be edditied.
955     Define after which menuitem the exportitem will include.
956    
957     * Extensions/umn_mapserver/mf_handle.py: Removed the import
958     Thuban.UI.mainwindow clause, because it is not needed.
959     Added the command Refresh() to all "OnChangeColor()" functions,
960     because the color preview window was not updated on a color change.
961     Added the function to check if a mapobject exists and used it to set the
962     status of the menu items. If no mapobject exists the settings could not
963     be edditied.
964     (Map_Dialog): Moved the imagetype selector from the
965     Outputformat_Dialog to Map_Dialog and removed Outputformat_Dialog.
966     (Web_Dialog): Removed the name label and added the template textbox.
967    
968     * Extensions/umn_mapserver/mf_import.py (import_mapfile): Replace
969     the exception handling on loading the layers by an if statement. It
970     is not necessary to us the exception there.
971     The Filepath creation now use os.path.join to build the path.
972    
973     * Extensions/umn_mapserver/test/test_mapserver.py: Moved the testMap
974     definition from global to the setUp function. Now the testMap will
975     initialize new on each test.
976    
977     * Extensions/umn_mapserver/sample/iceland.map: Include three new
978     classes in the Line Layer, to test logical Expressions.
979     Set the status of the class "Point9" in the Point Layer to off
980    
981 bh 2278 2004-07-13 Bernhard Herzog <[email protected]>
982    
983     * Thuban/UI/baserenderer.py
984     (BaseRenderer.render_map_incrementally): Fix a logic bug in the
985     optimization that tries not to draw layers under a raster layer.
986     The bug was harmless. All it effectively did was to produce The a
987     strange messages about not being able to draw Layer instances for
988     all vector layers below a raster layer which would be invisible
989     anyway because the raster layer currently always covers the entire
990     window
991    
992 jschuengel 2277 2004-07-08 Jan Schüngel <[email protected]>
993    
994     * Extensions/umn_mapserver/mapfile.py: Added code to generade and get
995     a list of supported outputformats. This formats are not alle supported
996     because there is no possibility to get the outputformat without the
997     name known. Make some formal changes to the code.
998     (MF_Map.set_name()): Fixed a bug if the name is None.
999    
1000     * Extensions/umn_mapserver/mf_handle.py: Removed the image_type import
1001     statement, because its not needed anymore. The Outputformat is now
1002     given as string from the object. Make some formal changes to the code.
1003    
1004     * Extensions/umn_mapserver/test/test_mapserver.py: Added new test for
1005     most of the new setting which were added during the last changes.
1006     Removed the MF_Size Test.
1007    
1008     * Extensions/umn_mapserver/test/test.map: Added a new class to the
1009     cultural Layer to test expressions and the the status of that layer
1010     from on to default.
1011     Changed the data path the the correct Thuban Data
1012     Added the Outputformat Object and Symbol Object
1013    
1014 jschuengel 2272 2004-07-07 Jan Schüngel <[email protected]>
1015    
1016     * Extensions/umn_mapserver/mapfile.py: Added some new
1017     settings to edit (outputformat, label, imagetype)
1018    
1019     * Extensions/umn_mapserver/mf_handle.py: Added some setting to
1020     the Label Dialog and add the OutputDialog.
1021     Make some changes to the code order.
1022    
1023 jschuengel 2269 2004-07-06 Jan Schüngel <[email protected]>
1024    
1025     * Extensions/umn_mapserver/mapfile.py: Added the symbolObj, pointObj
1026     and line Obj and add the scalebar_status_type, scalebar_style_type and
1027     scalebar_position_type.
1028     Added the symbol- and symbolsetObject (MF_Symbol,MF_Symbolset). The
1029     are only used to create a Symbol like the circle in Thuban.
1030     Added the scalebarObject (MF_Scalebar)
1031     (MF_Class): Added set_status and get_status.
1032     (MF_Layer.add_thubanclass): Added code to set the class status
1033     (MF_Map): Added code to handle the symbols and scalebar
1034     (MF_Label): Added the set_partials and get_partials functions
1035    
1036     * Extensions/umn_mapserver/mf_export.py: Added MF_Symbol to import
1037     from mapfile. Added a function to create a circle object like the one
1038     from thuban if no one exists.
1039    
1040     * Extensions/umn_mapserver/mf_handle.py: All colors are now set when
1041     press ok in the assosiated dialog and not at the end of the
1042     colordialog.
1043     Added the Dialog for the Scalebar.
1044     (Label_Dialog): Added the offset option
1045    
1046     * Extensions/umn_mapserver/mf_import.py: Added code to import the
1047     status of the Classes.
1048     Fixed a bug with the projection. Now the to_meter parameter will be
1049     added to the Projection only if it doesn't exists.
1050    
1051 jschuengel 2264 2004-07-01 Jan Schüngel <[email protected]>
1052    
1053     Added the functionality to handle the content thuban is not
1054     able to handle directly.
1055    
1056     * Extensions/umn_mapserver/mf_handle.py: New. This module extents
1057     Thuban with the possibility to edit the mapfile content.
1058    
1059     * Extensions/umn_mapserver/mf_import.py: Added the possibility
1060     to import mapfiles without any layer selected. So it is possible
1061     to edit the other settings in a mapfile.
1062     (import_mapfile): Added code to use the editing functions.
1063     Added the possibility to import the projection to a layer if one
1064     is defined.
1065     Status settings (On,Off) will now set in thuban (visible, invisible).
1066     fixed a bug with with classnames. If no classname is set in mapfile
1067     the value in Thuban will set to the expression.
1068    
1069     * Extensions/umn_mapserver/mf_export.py(export_mapfile): Added the
1070     possibility to save a new mapfile or use the old one which is
1071     imported or new created.
1072     Added code to use the editing functions.
1073     Remove some not needed import statements
1074    
1075     * Extensions/umn_mapserver/mapfile.py: Added new types which are
1076     need for the editing functions.
1077     Added needed set-functions for the editing functions.
1078     Added the possibility to export rasterimages.
1079     Added new classes (MF_Web, MF_Label, MF_Legend, MF_Symbol,
1080     MF_SymbolSet). MF_Symbol and MF_SymbolSet are not needed at the
1081     moment.
1082     (MF_Class.set_thubanstyle): Now point layers will set to a default
1083     symbol to show a circle in mapserver and not only a 1px dot.
1084     (MF_Style.__init__): Fixed a bug with the color. Color was not set
1085     correct before.
1086     (MF_Size): Removed, because it is not needed.
1087    
1088     * Extensions/umn_mapserver/README: Added the hints to use the
1089     export and editing functions, too.
1090    
1091     * Extensions/umn_mapserver/sample/iceland.map: Added the
1092     new parameter "UNITS METERS".
1093     Change the political layer to status OFF.
1094    
1095     * Extensions/umn_mapserver/sample/README: Added some
1096     more details to setup the sample in the MapServer.
1097    
1098 bernhard 2256 2004-06-26 Bernhard Reiter <[email protected]>
1099    
1100     * Extensions/svgexport/test/test_svgmapwriter.py:
1101     Removed class VFile and used standard StringIO instead.
1102    
1103 jschuengel 2255 2004-06-23 Jan Schüngel <[email protected]>
1104    
1105     Add the export function to the umn_mapserver extension.
1106    
1107     * Extension/umn_mapserver/mf_export.py: New. This module extents
1108     Thuban with the possibility to export the Thuban content.
1109    
1110     * Extensions/umn_mapserver/mapfile.py: Expand the classes to use
1111     with the export module. Especially added the possibility to
1112     add thuban objects directly to the map objects.
1113    
1114     * Extensions/umn_mapserver/mf_import.py: Removed the wxCHANGE_DIR,
1115     because of the hint from Bernhard Herzog.
1116     Corrected the handling of absolute pathnames.
1117     Changed the Text of the Menu-Item, now the beginning is upper case.
1118    
1119     * Extensions/umn_mapserver/README: Added the --with-tiff statement.
1120    
1121 jschuengel 2250 2004-06-16 Jan Schüngel <[email protected]>
1122 jschuengel 2242
1123 jschuengel 2250 Add a sample and make some changes.
1124    
1125     * Extension/umn_mapserver/mf_import.py: Changed the wxPython.wx
1126     import from * to explicit used statements. Changed the
1127     Thuban.UI.mainwindow import phrase, too.
1128     (import_mapfile):Corrected a clerical mistake.
1129     Added wxCHANGE_DIR in OpenFile Dialog.
1130     Added a MultipleChoiceDialog, to select the layers to load from
1131     mapfile into thuban. Thereby the projection is only set if one layer
1132     is selected.
1133     Added the possibility to handle relative pathnames which uses
1134     up-level references.
1135     Removed some doubled code.
1136     Corrected an error with integer values used as label in thuban
1137     ClassGroup.
1138    
1139     * Extensions/umn_mapserver/sample: New.
1140    
1141     * Extensions/umn_mapserver/sample/README: New. Describes the
1142     usage of the sample files.
1143    
1144     * Extensions/umn_mapserver/sample/iceland.map: New. This is
1145     a suitable .map-file for the iceland data.
1146    
1147     * Extensions/umn_mapserver/sample/index.html: New. The template
1148     for the mapfile.
1149    
1150     * Extensions/umn_mapserver/sample/iceland.html: New. Initialisation
1151     file for the Iceland Application on web.
1152    
1153     * Extensions/umn_mapserver/README: Corrected a inaccuracy and added
1154     some details.
1155    
1156     * Extensions/umn_mapserver/test/test_mapserver
1157     (mapserver_import_Test_generalClasses.test_MF_Color):
1158     Corrected the thubancolor test.
1159    
1160     2004-06-15 Jan Schüngel <[email protected]>
1161    
1162 jschuengel 2242 * Extensions/umn_mapserver/README: New. Install instruction.
1163    
1164 bernhard 2240 2004-06-14 Bernhard Reiter <[email protected]>
1165    
1166     * libraries/thuban/cpl_mfile.h: Added copyright header.
1167    
1168     * libraries/thuban/ cpl_mfile.cpp, cpl_mfile.h: Added non-protecting
1169     Free Software License so that it is most useful with gdalwarp
1170     and bmpdataset.
1171    
1172 bh 2239 2004-06-14 Bernhard Herzog <[email protected]>
1173    
1174     * Thuban/UI/multiplechoicedialog.py (__version__): Add missing
1175     import of wxPython.wx itself (as opposed to the contents of
1176     wxPython.wx). For some reason wxPython.wx is available as
1177     wxPython.wx.wx in at least some 2.4 releases. Fixes RT#2482
1178     wrt. wxPython 2.4.
1179    
1180 jschuengel 2238 2004-06-10 Jan Schüngel <[email protected]>
1181    
1182     Initial version of new extension "umn_mapserver". This extension aims
1183     to manage configuration for the UMN MapServer application. This
1184     inital version just imports the .map-files and displays all, Thuban is
1185     capable of.
1186    
1187     * Extensions/umn_mapserver, Extensions/umn_mapserver/test: New.
1188    
1189     * Extensions/umn_mapserver/test/README: New. Describes how to run the
1190     tests.
1191    
1192     * Extensions/umn_mapserver/test/test.map: New. This is a test
1193     .map-file for automated tests of the umn_mapserver extension of
1194     Thuban.
1195    
1196     * Extensions/umn_mapserver/test/test_mapserver.py: New. Tests for
1197     UMN Mapserver classes.
1198    
1199     * Extensions/umn_mapserver/__init__.py: New. Init to make this
1200     directory a package.
1201    
1202     * Extensions/umn_mapserver/mapfile.py: New. Classes to represent
1203     '.map'-file objects.
1204    
1205     * Extensions/umn_mapserver/mf_import.py: New. This module extends
1206     Thuban with the possibility to handle UMN MapServer mapfiles.
1207    
1208 bh 2230 2004-06-03 Bernhard Herzog <[email protected]>
1209    
1210     * Thuban/Model/layer.py (Layer.TreeInfo): Convert the bounding box
1211     to a tuple before using it as arguments to the % operator. This
1212     fixes the formatting issue filed in RT#2239 on 2004-01-13 and
1213     reported today on thuban-list by Jan Schüngel
1214    
1215     * test/test_layer.py (TestLayerModification.setUp): Save the
1216     filename as an instance variable so we can refer to it in tests
1217     (TestLayerModification.test_tree_info): Uncomment this method
1218     again and make it work. This tests for the formatting issue
1219     filed in RT#2239 on 2004-01-13
1220    
1221 bh 2224 2004-05-28 Bernhard Herzog <[email protected]>
1222    
1223     * Thuban/UI/baserenderer.py: Fix some typos.
1224    
1225 jan 2217 2004-05-18 Jan-Oliver Wagner <[email protected]>
1226    
1227     * Extensions/gns2shp/gns2shp.py (gns2shp): Fixed a bug
1228     by increasing a field size.
1229    
1230 bh 2213 2004-05-17 Bernhard Herzog <[email protected]>
1231    
1232     Update to newest shapelib and get rid of Thuban specific
1233     extensions, i.e. use the new DBFUpdateHeader instead of our
1234     DBFCommit kludge
1235    
1236     * libraries/shapelib/shpopen.c: Update to version from current
1237     shapelib CVS.
1238    
1239     * libraries/shapelib/shapefil.h: Update to version from current
1240     shapelib CVS.
1241    
1242     * libraries/shapelib/dbfopen.c: Update to version from current
1243     shapelib CVS.
1244     (DBFCommit): Effectively removed since shapelib itself has
1245     DBFUpdateHeader now which is better for what DBFCommit wanted to
1246     achieve.
1247     We're now using an unmodified version of dbfopen.
1248    
1249     * setup.py (extensions): Add the HAVE_UPDATE_HEADER macro with
1250     value '1' to the Lib.dbflibc extension. This simply reflects the
1251     shapelib and pyshapelib updates
1252    
1253 jan 2211 2004-05-16 Jan-Oliver Wagner <[email protected]>
1254    
1255     Finished introduction of Menu.FindOrInsertMenu.
1256    
1257     * Extensions/drawshape/drawshape.py: Add the command
1258     to the experimental menu additionally to the toolbar.
1259    
1260     * Extensions/svgexport/svgsaver.py: Use FindOrInsertMenu() instead of
1261     finding menu on its own.
1262    
1263     * Doc/manual/thuban-manual.xml: updated sample file
1264     to use FindOrInsertMenu().
1265    
1266     * Examples/simple_extensions/hello_world.py: Use FindOrInsertMenu()
1267     instead of finding menu on its own.
1268    
1269 jan 2206 2004-05-11 Jan-Oliver Wagner <[email protected]>
1270    
1271     * test/test_menu.py (MenuTest.test): Added testing
1272     of method Menu.FindOrInsertMenu.
1273    
1274 jan 2204 2004-05-10 Jan-Oliver Wagner <[email protected]>
1275    
1276     Introduce and use Menu.FindOrInsertMenu.
1277    
1278     * Thuban/UI/menu.py (Menu.FindOrInsertMenu): New. Find a
1279     given menu or, if not found, insert it.
1280    
1281     * Extensions/bboxdump/bboxdump.py, /Extensions/gns2shp/gns2shp.py,
1282     /Extensions/importAPR/importAPR.py, Extensions/profiling/profiling.py,
1283     /Extensions/wms/wms.py: Use FindOrInsertMenu() instead of finding
1284     menu on its own.
1285    
1286 jan 2201 2004-05-06 Jan-Oliver Wagner <[email protected]>
1287    
1288     Introduce a abstract ColorDialog class and remove
1289     and outdated file.
1290    
1291     * Thuban/UI/proj4dialog.py: Removed. It is has been
1292     replaced by projdialog for quite a while and is not used
1293     anymore.
1294    
1295     * Thuban/UI/colordialog.py: New. Abstraction for color selection
1296     dialog(s).
1297    
1298     * Thuban/UI/classifier.py (SelectPropertiesDialog.__GetColor):
1299     Now calls the abstract ColorDialog instead of wxColourDialog.
1300     This also removed the dependency to Color class conversion
1301     from this function.
1302    
1303 frank 2197 2004-05-04 Frank Koormann <[email protected]>
1304    
1305     * Extensions/bboxdump/__init__.py: Fixed string left over from
1306     copying.
1307    
1308     * Extensions/bboxdump/bboxdump.py (bboxdump):
1309     Use layer.ShapeStore().AllShapes() to loop over shapes instead of
1310     xrange(layer.NumShapes()). Compile the bboxmessage from a list
1311     of formatted outputs (string.join) instead of appending to the
1312     message. Two progress bar dialogs to report progress on the sometimes
1313     lenghty processing.
1314    
1315 frank 2196 2004-04-22 Frank Koormann <[email protected]>
1316    
1317     New Extension to dump bounding boxes of all shapes of the selected
1318     layer. An optional column can be specified to group the objects,
1319     in this case the bounding box is a union of the separate boxes.
1320     Dump can be displayed in a ScrolledMessageDialog or written to file.
1321     The Extension is simply a combination of available and well tested
1322     Thuban functionality.
1323    
1324     * Extensions/bboxdump/__init__.py: New: Init to make this
1325     directory a package.
1326    
1327     * Extensions/bboxdump/bboxdump.py: New: Dump bounding boxes of
1328     all shapes of the selected layer.
1329    
1330 jan 2192 2004-04-22 Jan-Oliver Wagner <[email protected]>
1331    
1332     * Thuban/UI/classgen.py (GenUniquePanel.__init__): Fixed two
1333     strings to be i18n now.
1334    
1335 jan 2188 2004-04-18 Jan-Oliver Wagner <[email protected]>
1336    
1337     Changing popup menu of legend from direct building
1338     to using the Menu construction as used for the mainwindow.
1339    
1340     * Thuban/UI/mainwindow.py: New method commands: layer_to_top,
1341     layer_to_bottom, layer_visibility
1342     (MainWindow.LayerToTop): New. Put current layer to the top.
1343     (MainWindow.LayerToBottom): New. Put current layer to bottom.
1344     (MainWindow.HideLayer, MainWindow.ShowLayer, _has_visible_map):
1345     Replace 1,0 by True, False.
1346     (MainWindow.ToggleLayerVisibility): New. Toggle visibility of
1347     current layer.
1348     (MainWindow.LayerShowTable): Removed raising of dialog.
1349     (_has_selected_layer_visible): New. Support function.
1350    
1351     * Thuban/UI/legend.py: ID_POP_xxx: removed.
1352     (LegendPanel.__init__): Removed EVT_MENU bindings.
1353     (LegendTree._OnRightClick): Replace direct creation of
1354     menu via wx Classes by applying the menu definition
1355     as of Menu class of menu.py.
1356    
1357 jan 2185 2004-04-16 Jan-Oliver Wagner <[email protected]>
1358    
1359     * Thuban/UI/exceptiondialog.py (ExceptionDialog.dialog_layout): Improved
1360     button string to stronger clearify that Thuban will be closed when hitting
1361     the button.
1362    
1363     * Thuban/UI/mainwindow.py (MainWindow.LayerShowTable): Added docstring.
1364     Now for layers without a ShapeStore a corresponding message is given
1365     to the user, that this layer has no table to show.
1366    
1367 joey 2182 2004-04-15 Martin Schulze <[email protected]>
1368    
1369     * Extensions/wms/layer.py (WMSLayer.setWMSFormat): Need to
1370     recalculate the format for the internal render engine as well.
1371    
1372     * Extensions/wms/properties.py (wmsProperties): First start for a
1373     properties dialog. It's functional for a first selection of
1374     layers, but still has some weired wxWidgets/GTK problems but
1375     beautification can be done later.
1376    
1377     * Extensions/wms/layer.py: Added more documentation
1378     (WMSLayer.getFormats): New: Return list of supported image formats
1379     by the WMS server
1380     (WMSLayer.getLayers): New: Return the list of layer names
1381     supported by the WMS server
1382     (WMSLayer.getLayerTitle): New: Return the title of the named layer
1383     (WMSLayer.getWMSFormat): New: Return the image format that is used
1384     for WMS GetMap requests
1385     (WMSLayer.setWMSFormat): New: Set the image format that is used
1386     for WMS GetMap requests
1387     (WMSLayer.__init__): Move away from using only one layer to using
1388     a list of layers (unsorted at the moment, though).
1389     (WMSLayer.getVisibleLayers): New: Return the list of names for all
1390     visible layers
1391     (WMSLayer.setVisibleLayers): New: Set the list of names for all
1392     visible layers
1393    
1394     * Extensions/wms/wms.py: Moved the WMS layer into layer.py in
1395     order to establish a clean structure.
1396    
1397     * Extensions/wms/layer.py: Moved the WMS layer into a file on its
1398     own in order to establish a clean structure.
1399    
1400 joey 2174 2004-04-13 Martin Schulze <[email protected]>
1401    
1402     * Extensions/wms/parser.py (WMSCapabilitiesParser.grok): Added
1403     support for oldstyle (WMS 1.0 apparently) image format
1404     specification.
1405    
1406     * Extensions/wms/wms.py (WMSLayer.calcFormat): Reduce the list of
1407     supported graphic formats back to JPEG and BMP, PNG and others are
1408     too *cough* experimental... Sorry, I meant to filter this out
1409     before I committed this part. This should make the WMS extension
1410     run from CVS again.
1411     (wms_dialog): Reset an empty URL to None so that the subsequent
1412     program can depend on this, since the dialog will indeed return an
1413     empty URL, causing another declaration of love by Python.
1414    
1415     * Extensions/wms/parser.py (WMSCapabilitiesParser.getLayerBBox):
1416     Whenever a native BoundingBox request cannot be fulfilled, check
1417     whether the requested SRS is EPSG:3426, in which case return the
1418     LatLonBoundingBox values.
1419    
1420     * Extensions/wms/test/test_parser.py
1421     (TestWMSCapabilitiesParser.test_LayerSRS): Added a test for
1422     ignoring AUTO:* SRS.
1423     (TestWMSCapabilitiesParser.test_LatLonBoundingBoxes_as_bboxes):
1424     Added another test method to test whether the LatLonBoundingBox
1425     values will be returned if BoundingBox values are requested with
1426     SRS set to EPSG:3426.
1427    
1428     * Extensions/wms/parser.py (WMSCapabilitiesParser.peekLayers):
1429     Added rudimentary support for non-EPSG SRS, i.e. ignore them for
1430     the moment by placing them into a variable which is currently
1431     unused. Also test whether the EPSG SRS is numerical as it should
1432     be and add an error message if it is not.
1433    
1434     * Extensions/wms/test/sample.xml: Added AUTO:* SRS since they
1435     appear in the real world as well. Since we cannot handle them yet
1436     (OGCLib can't either), we will ignore them for the moment.
1437    
1438     * Extensions/wms/parser.py: Use a variable for denoting the sample
1439     filename
1440     (WMSCapabilitiesParser.peekLayers): Added support for error
1441     messages during grok(). They will be aggregated in an array and
1442     may be displayed later. We may have to add a classification
1443     "Warning" and "Error" to this. That requires more experience,
1444     though, since not every error may be lethal.
1445    
1446     * Thuban/UI/mainwindow.py (MainWindow.LayerShowTable): Raise the
1447     ShowTable() dialog/frame when the user attempts to display it
1448     while it has been opened before already and not closed again.
1449    
1450 joey 2161 2004-04-11 Martin Schulze <[email protected]>
1451    
1452     * Extensions/wms/infodialog.py: Adjusted the class documentation
1453    
1454     * Extensions/wms/wms.py (WMSLayer.__init__, WMSLayer.GetMapImg):
1455     Switch to using Thuban{Begin,End}BusyCursor instead of the pure
1456     wxWidgets variants.
1457     (WMSLayer.__init__): The epsg_id variable is named top_srs now.
1458    
1459     * Extensions/wms/infodialog.py: Added an information dialog that
1460     will display various information about the WMS current resource,
1461     so that additional information such as the title, the abstract,
1462     fees and access constraints can be displayed for the user if they
1463     are documented in the WMS XML.
1464    
1465 joey 2156 2004-04-10 Martin Schulze <[email protected]>
1466    
1467     * Extensions/wms/parser.py (WMSCapabilitiesParser.grok): Adjusted
1468     string handling. It's "foo".lower() and not lower(foo) without
1469     lower imported from strings or something.
1470    
1471     * Extensions/wms/wms.py (WMSLayer): Incorporated WMSCapabilities
1472     from capabilities.py and parser.py. Implement priority list for
1473     supported graphics formats, take care of wbmp != bmp. PNG, TIFF
1474     and GIF are supported here, but not yet by main Thuban. Hence,
1475     support for them may be removed later. Special contribution to
1476     usability: get wxWidgets to change the cursor when we're waiting
1477     for data from the network so the user won't start to worry. This
1478     causes a redrawing error/warning, though.
1479    
1480     * Extensions/wms/parser.py (WMSCapabilitiesParser.grok): Unlink
1481     the DOM object.
1482    
1483     2004-04-01 Martin Schulze <[email protected]>
1484    
1485     * Extensions/wms/capabilities.py: Adjusted documentation
1486     (WMSCapabilities.__init__): Improved documentation, fixed syntax
1487     (WMSCapabilities.saveCapabilities): Only catch IOError when
1488     handling files
1489     (WMSCapabilities.loadCapabilities): Only catch IOError when
1490     handling files
1491     __main__: corrected variable naming
1492     (WMSCapabilities.fetchCapabilities,loadCapabilities): Make this
1493     class a specialisation of WMSCapabilitiesParser as well. Also
1494     execute grok() after loading or fetching capabilities, if that
1495     went well, so that subsequent calls can already access the data.
1496     (WMSCapabilities.getVersion): Export the used version of the
1497     GetCapabilities request, so we can use it for subsequent calls,
1498     i.e. for GetMap requests.
1499     (WMSCapabilities.fetchCapabilities): Added proper error handling
1500     when the GetCapabilities request failed, so that the surrounding
1501     program can act accordingly.
1502    
1503 joey 2146 2004-03-30 Martin Schulze <[email protected]>
1504    
1505     * Extensions/wms/parser.py (WMSCapabilitiesParser.getLayerSRS):
1506     Adjusted the getLayerSRS method to return the list of SRSes
1507     extracted from <SRS> elements instead of <BoundingBox> elements.
1508     Added a bit of documentation as well.
1509     (WMSCapabilitiesParser.checkLayerSRS): Removed integrity test
1510     since it was only implemented due to a misunderstanding.
1511    
1512     * Extensions/wms/test/test_parser.py
1513     (TestWMSCapabilitiesParser.test_LayerSRS): Adjust the tests to
1514     reflect the corrected interpretation of the standard: i.e. a layer
1515     does not have to define a BoundingBox for all SRSes it supports.
1516     Hence the <SRS></SRS> specification is authoritative, not the list
1517     of BoundingBoxes.
1518     (TestWMSCapabilitiesParser.test_BoundingBoxes): Added a new test
1519     to ensure None is returned for a non-existing SRS.
1520     (TestWMSCapabilitiesParser.test_grok): Removed test_grok method
1521     since it is not applicable anymore. Listing more SRSes in <SRS>
1522     elements is valid according to the specs.
1523    
1524 bernhard 2140 2004-03-26 Bernhard Reiter <[email protected]>
1525 joey 2146
1526 bernhard 2140 * README: Nicer formatting of text. Improved descriptions.
1527     Reflected wxWidgets name change.
1528    
1529     * Thuban/UI/about.py: Extended copyright to 2004 and added
1530     information about the thuban-devel mailinglist.
1531    
1532 joey 2138 2004-03-24 Martin Schulze <[email protected]>
1533 joey 2120
1534 joey 2138 * Extensions/wms/capabilities.py: Renamed the class to contain
1535     'WMS', also added a linebreak where required
1536    
1537     * Extensions/wms/parser.py: Finally added the XML parser for the
1538     GetCapabilities response.
1539    
1540     * Extensions/wms/test/sample.xml: Adjusted the sample file so that
1541     <SRS> elements match the <BoundingBox> elements, except for the
1542     layer 'beschriftung'.
1543    
1544     * Extensions/wms/test/test_parser.py: Encode non-ascii strings
1545     since Python uses unicode strings internally, otherwise
1546     comparisons will fail. Removed tests for getLayerBBoxSRS() since
1547     the SRS will be calculated anyway and this method is obsoleted by
1548     getLayerSRS(). Denote SRS as strings and not as cardinal numbers.
1549     Move loading the sample file into the setUp method. Added a test
1550     for finding the integrity problem in the sample response.
1551     Improved formatting.
1552    
1553     * Extensions/wms/domutils.py: Added convenience routines for
1554     handling of Document Object Model (DOM) nodes.
1555    
1556     * Extensions/wms/test/test_domutils.py: Added a test for the
1557     domutils module
1558    
1559     2004-03-19 Martin Schulze <[email protected]>
1560    
1561 joey 2120 * Extensions/wms/test/test_parser.py (TestWMSCapabilitiesParser):
1562     Moved path detection and adding into a module of its own,
1563     adjustpath, which exports thubandir as main Thuban directory.
1564    
1565     * Extensions/wms/test/test_ogclib.py (TestWMSLib): Moved path
1566     detection and adding into a module of its own, adjustpath, which
1567     exports thubandir as main Thuban directory. Reorganised the
1568     module in order to support the SkipTest feature for Thuban test
1569     cases.
1570    
1571     * Extensions/wms/test/adjustpath.py: Moved path detection and
1572     adding into a module of its own.
1573    
1574 joey 2115 2004-03-18 Martin Schulze <[email protected]>
1575    
1576     * Extensions/wms/test/test_parser.py: Added another test for
1577     checking whether the WMS XML parser (to be implemented) returns
1578     the information we expect. This requires a sample WMS WML file
1579     (sample.xml) which has been extracted from the frida server and
1580     "improved" manually.
1581    
1582     * Extensions/wms/test/test_ogclib.py: Added legacy code to add the
1583     main Thuban directory to the path in order to be able to import
1584     random modules. Adjusted the PyOGCLib detection to reuse the
1585     information gathered. Also added a note about the PYTHONPATH
1586     environment variable.
1587    
1588     * Extensions/wms/test/test_ogclib.py: The format specification is
1589     a mime-type, not a graphic format, hence image/jpeg wou ld be the
1590     proper format and not JPEG. We'll also have to take care of the
1591     encoding of / as %2F.
1592    
1593 joey 2111 2004-03-16 Martin Schulze <[email protected]>
1594    
1595     * Extensions/wms/test/test_ogclib.py: Added a (hopefully)
1596     comprehensive test for the getMapURL method, built compare URLs
1597     according to the documentation in OGC 01-068r3
1598    
1599     * Extensions/wms/capabilities.py (WMSCapabilities): Added the
1600     class WMSCapabilities to manage capabilites, will incorporate
1601     parsing the capabilities response and provide details for other
1602     classes.
1603    
1604 bh 2105 2004-03-12 Bernhard Herzog <[email protected]>
1605    
1606 bh 2107 Support views in addition to normal tables in the postgis
1607     shapestore
1608    
1609     * Thuban/Model/postgisdb.py
1610     (PostGISShapeStore._fetch_table_information): Add a fallback for
1611     the case where the table name is not in the geometry_columns
1612     table. This is usually the case for views. Also, set
1613     self.shapestore here.
1614     (PostGISShapeStore.ShapeType): No need to query the database all
1615     the time. The shape type is now determined in
1616     _fetch_table_information
1617    
1618     * test/postgissupport.py (PostgreSQLServer.new_postgis_db)
1619     (PostgreSQLServer.get_static_data_db, PostGISDatabase.__init__):
1620     New parameter to specify views.
1621     (PostGISDatabase.has_data): Also compare the views. New views
1622     parameter
1623     (PostGISDatabase.initdb): Create the views.
1624     (PostgreSQLServer.get_default_static_data_db): Add the v_landmarks
1625     view
1626    
1627     * test/test_postgis_db.py
1628     (TestPostGISShapestorePointFromViews): New. Test a
1629     PostGISShapeStore with a view
1630     (TestPostGISShapestorePointOIDAsGIDColumn.setUp): Pass the name of
1631     the geometry_column explicitly to test whether that works
1632    
1633     2004-03-12 Bernhard Herzog <[email protected]>
1634    
1635 bh 2105 Final step for explicit id/geometry columns: Loading and saving
1636    
1637     * Resources/XML/thuban-1.1.dtd: New. Derived from thuban-1.0.dtd
1638     with the following changes:
1639     (dbshapesource): Two new attributes id_column and geometry_column
1640    
1641     * Thuban/Model/save.py (SessionSaver.write): Use the new dtd
1642     (SessionSaver.write_session): Use the new namespace
1643     (SessionSaver.write_data_containers): Write the new dbshapesource
1644     parameters
1645    
1646     * Thuban/Model/load.py (SessionLoader.__init__): New namespace for
1647     the new file format version
1648     (SessionLoader.start_dbshapesource): Handle the new db parameters
1649    
1650     * test/test_save.py: Update to the new dtd and namespace
1651     (SaveSessionTest.test_save_postgis): Update the NonConnectionStore
1652     mock object to provide a working IDColumn method.
1653    
1654     * test/test_load_1_0.py: New. Copy of the test_load.py before
1655     today's changes but with the round-trip tests removed.
1656    
1657     * test/test_load_0_9.py: Update doc-string.
1658    
1659     * test/test_load.py: Update all .thuban files to the new dtd and
1660     namespace.
1661     (TestPostGISLayer.file_contents): Add the new dbshapesource
1662     paramters
1663    
1664 bh 2100 2004-03-11 Bernhard Herzog <[email protected]>
1665    
1666 bh 2103 Next step for explicit id/geometry columns: User interaction
1667    
1668     * Thuban/UI/dbdialog.py (ChooseDBTableDialog.__init__): Rework how
1669     the dialog is constructed. Add combo boxes to select id and
1670     geometry column. Rename some instance variables.
1671     (ChooseDBTableDialog.GetTable): Return id and geometry column
1672     names
1673     (ChooseDBTableDialog.OnTableSelect): New. Event handler for
1674     selections in the table list
1675    
1676     * Thuban/UI/mainwindow.py (MainWindow.AddDBLayer): Use id_column
1677     and geometry_column
1678    
1679     * Thuban/Model/session.py (Session.OpenDBShapeStore): Add the new
1680     parameters for id_column and geometry column of PostGISShapeStore
1681     here as well.
1682    
1683     * Thuban/Model/postgisdb.py (type_map): Add ROWID psycog type.
1684     (_raw_type_map): New. Map raw PostgreSQL type ints to thuban types
1685     (PostGISConnection.GeometryTables): Use a better query to
1686     determine which relations in the database might be usable for
1687     shapestores. Now supports views as well but is more PostgreSQL
1688     specific
1689     (PostGISConnection.table_columns): New. Somewhat experimental
1690     method to let the db dialogs provide lists of columns to users so
1691     that they can select id and geometry columns.
1692     (PostGISTable.__init__): The default value of the id_column
1693     parameter is now None it still means "gid" effectively, though.
1694     (PostGISTable.IDColumn): New introspection method to return a
1695     column object for the id column
1696     (PostGISShapeStore.GeometryColumn): New introspection method to
1697     return a column object for the geometry column
1698    
1699     * test/test_postgis_db.py
1700     (TestPostGISConnection.test_gis_tables_non_empty):
1701     Removed. Subsumed by the new:
1702     (TestPostGISConnection.test_gis_tables_with_views_and_tables):
1703     New. Tes the GeometryTables and table_columns methods with actual
1704     tables and views.
1705     (PointTests.test_id_column, PointTests.test_geometry_column):
1706     New. tests for the new methods.
1707     (TestPostGISShapestorePoint.setUp)
1708     (TestPostGISShapestorePointSRID.setUp)
1709     (TestPostGISShapestorePointExplicitGIDColumn.setUp): Fill the
1710     instance variables needed by the new tests
1711    
1712     2004-03-11 Bernhard Herzog <[email protected]>
1713    
1714 bh 2100 * Thuban/UI/classgen.py (GenQuantilesPanel.GetList): The row
1715     numbers given to ReadValue are ordinals.
1716    
1717     2004-03-11 Bernhard Herzog <[email protected]>
1718    
1719     Elimiate the requirement for PostGIS tables to have a column
1720     called "gid".
1721    
1722     * Thuban/Model/postgisdb.py (PostGISTable.__init__): New parameter
1723     id_column to specify which column to use to identify rows. Also
1724     new instance variables id_column and quoted_id_column
1725     (PostGISTable.RowIdToOrdinal, PostGISTable.RowOrdinalToId)
1726     (PostGISTable.ReadRowAsDict, PostGISTable.ReadValue)
1727     (PostGISTable.SimpleQuery): Use the id column name provided to the
1728     constructor instead of "gid"
1729     (PostGISShapeStore.__init__): New parameter id_column analogously
1730     to PostGISTable.__init__. This parameter is simply passed through
1731     to the base class constructor
1732     (PostGISShapeStore._create_col_from_description): Fix typo in
1733     doc-string
1734     (PostGISShapeStore.Shape, PostGISShapeStore.AllShapes)
1735     (PostGISShapeStore.ShapesInRegion): Use the id column name
1736     provided to the constructor instead of "gid"
1737    
1738     * test/postgissupport.py
1739     (PostgreSQLServer.get_default_static_data_db): New static table
1740     landmarks_point_id with an id column != "gid. Update the comments
1741     a bit.
1742     (skip_if_addgeometrycolumn_does_not_use_quote_ident): Fix typo in
1743     doc-
1744     (upload_shapefile): New parameter gid_column to use a name other
1745     than "gid" for the column to store the shape ids
1746    
1747     * test/test_postgis_db.py (TableTests): New. Mixin-class
1748     containing all tests previously in TestPostGISTable. The actual
1749     tests are the same but the code is a bit more configurable to
1750     allow for different id columns etc.
1751     (TestPostGISTable): Derive from TableTests now for the actual
1752     tests.
1753     (TestPostGISTableExplicitGIDColumn): New. Like TestPostGISTable
1754     except that it the landmarks_point_id table to test the id_column
1755     parameter
1756     (PointTests): Extend the doc-string
1757     (TestPostGISShapestorePointExplicitGIDColumn)
1758     (TestPostGISShapestorePointOIDAsGIDColumn): New classes derived
1759     from PointTests to test the explicit id_column parameter. One
1760     tests with the name of the column holding the shape ids, the other
1761     uses PostgreSQL's OID column. For the latter a number of methods
1762     have to be overwritten to make them independent of the actual id
1763     values.
1764    
1765 silke 2095 2004-03-08 Silke Reimer <[email protected]>
1766    
1767     Update debian directory:
1768    
1769     * debian/changelog: Added new version.
1770     * deiban/rules: Updated management of patches (with cbds)
1771     * debian/control: Added cbds to dependencies
1772     * debian/patches/*: New. Adds better support for patches of thuban in
1773     debian
1774     * debian/menu: Syntax of menu changed slightly
1775     * debian/setup.py.patch: removed because it has been moved to
1776     debian/patechs/setup.py.patch
1777    
1778    
1779 bh 2094 2004-02-26 Bernhard Herzog <[email protected]>
1780    
1781     Create the Doc/technotes directory for text files with information
1782     for developers
1783    
1784     * Doc/technotes/README: New. README for the technotes
1785    
1786     * Doc/technotes/coding_guidelines.txt: New. Coding guidelines for
1787     Thuban
1788    
1789     * Doc/technotes/release_process.txt: New. Used to be
1790     HOWTO-Release. Now slightly adapted to technote formatting style.
1791    
1792     * HOWTO-Release: Removed. It's contents are now in
1793     Doc/technotes/release_process.txt
1794    
1795 bh 2089 2004-02-25 Bernhard Herzog <[email protected]>
1796    
1797     * libraries/thuban/wxproj.cpp (get_wx_version): New. Return the
1798     version of wxWindows the module was compiled with so we can check
1799     that against the wxPython version.
1800    
1801     * Thuban/version.py (thuban_branch, thuban_release): New variables
1802     controlling which and how Thuban versions are shown. See the
1803     comments for details.
1804     (verify_versions): Also check that the wx version that wxproj is
1805     compiled against matches that of the wxPython we use at runtime
1806    
1807 bh 2080 2004-02-20 Bernhard Herzog <[email protected]>
1808    
1809 bh 2087 * Extensions/wms/wms.py (epsg_code_to_projection): Use
1810     get_system_proj_file to read the epsg projections. The old way
1811     depended on the current directory being the top Thuban directory.
1812    
1813     2004-02-20 Bernhard Herzog <[email protected]>
1814    
1815 bh 2085 * Extensions/svgexport/test/test_svgmapwriter.py
1816     (TestVirtualDC.test_clippath): Remove a debug print
1817    
1818     2004-02-20 Bernhard Herzog <[email protected]>
1819    
1820 bh 2083 * Extensions/svgexport/__init__.py: New. Turn
1821     Extensions/svgexport into a package.
1822    
1823     * Extensions/svgexport/svgmapwriter.py: Reorder the imports and
1824     doc-string a bit. The doc-string must come first, otherwise it's
1825     not a doc-string. The __future__ import must be the first thing
1826     after the doc-string. Use only double quotes in doc-strings.
1827     Single quotes trip up emacs syntax highlighting if the text
1828     contains apostrophes.
1829    
1830     2004-02-20 Bernhard Herzog <[email protected]>
1831    
1832 bh 2080 * Extensions/svgexport/test/__init__.py,
1833     Extensions/svgexport/test/test_svgmapwriter.py: New. Initial test
1834     suite for svgexport
1835    
1836     * test/runtests.py (find_test_modules): New. Function with the
1837     module finding code from main.
1838     (main): Use find_test_modules to figure out the default test
1839     modules and take modules from Extensions.svgexport.test too.
1840    
1841 bh 2075 2004-02-19 Bernhard Herzog <[email protected]>
1842    
1843 bh 2077 * Thuban/UI/application.py (ThubanApplication.OnInit): Make sure
1844     the mainwindow has a reference to the map of the initial session.
1845     This fixes a bug introduced with the fix for RT#2245
1846    
1847     2004-02-19 Bernhard Herzog <[email protected]>
1848    
1849 bh 2075 * Extensions/svgexport/svgsaver.py,
1850     Extensions/svgexport/svgmapwriter.py,
1851     Extensions/svgexport/maplegend.py: Added again. This time in the
1852     correct place.
1853    
1854 bh 2070 2004-02-17 Bernhard Herzog <[email protected]>
1855    
1856 bh 2073 Fix for RT#2245
1857    
1858     * Thuban/UI/application.py (ThubanApplication.OnInit): Initialize
1859     instance variables before trying to create any windows. Creating
1860     windows can start an event loop if e.g. message boxes are popped
1861     up for some reason, and event handlers, especially EVT_UPDATE_UI
1862     may want to access things from the application.
1863     (ThubanApplication.maps_changed): The mainwindow may not have been
1864     created yet, so check whether it has been created before calling
1865     its methods
1866    
1867     * Thuban/UI/view.py (MapCanvas.OnIdle): Only try to redraw if we
1868     have a map
1869    
1870     2004-02-17 Bernhard Herzog <[email protected]>
1871    
1872 bh 2070 * test/test_svgmapwriter.py, Extensions/svgsaver.py,
1873     Extensions/svgmapwriter.py, Extensions/maplegend.py,
1874     extensions/svgexport/svgsaver.py,
1875     extensions/svgexport/svgmapwriter.py,
1876     extensions/svgexport/maplegend.py: Removed. These files were in
1877     the wrong places or didn't work at all.
1878    
1879 bh 2067 2004-02-16 Bernhard Herzog <[email protected]>
1880    
1881 bh 2069 * Thuban/UI/view.py (MapCanvas.Export): Remove accidentally added
1882     line
1883    
1884     2004-02-16 Bernhard Herzog <[email protected]>
1885    
1886 bh 2067 * Thuban/UI/view.py (MapCanvas.Export): Avoid UnboundLocalError.
1887    
1888 mrechtie 2064 2004-02-15 Markus Rechtien <[email protected]>
1889    
1890     * Extensions/svgexport/svgmapwriter.py: New. Adds the capability
1891     to write a session to a file in SVG format.
1892     * Extensions/svgexport/svgsaver.py: New. Uses svgmapwriter.py
1893     to write a SVG map of a session.
1894     * Extensions/svgexport/maplegend: New. Writes a basic maplegend
1895     in SVG format for the current session.
1896    
1897 bh 2062 2004-02-13 Bernhard Herzog <[email protected]>
1898    
1899     * Thuban/UI/mainwindow.py (MainWindow.AddDBLayer): When the layer
1900     can't be created, return immediately after displaying the error
1901     message.
1902    
1903 bh 2060 2004-02-11 Bernhard Herzog <[email protected]>
1904    
1905     Handle postgis tables with more than one geometry column.
1906    
1907     * Thuban/Model/postgisdb.py
1908     (PostGISTable._fetch_table_information): Delegate the creation of
1909     column objects to a different method so that we can extend that in
1910     derived classes
1911     (PostGISTable._create_col_from_description): New. Column object
1912     creation part of _fetch_table_information
1913     (PostGISShapeStore._create_col_from_description): New. Extend
1914     inherited method to handle geometry columns
1915     (PostGISShapeStore.__init__): New parameter geometry_column to
1916     specify which geometry column to use. Optional but mandatory for
1917     tables with more than one geometry column
1918     (PostGISShapeStore._fetch_table_information): Also use the name of
1919     the geometry column when looking for the srid
1920     (PostGISShapeStore.ShapeType): Also use the name of the geometry
1921     column when looking for the shape type
1922    
1923     * test/test_save.py (SaveSessionTest.test_save_postgis): Adapt
1924     NonConnectionStore to changes in the PostGISShapeStore
1925    
1926     * test/test_postgis_db.py
1927     (TestPostGISSpecialCases.test_shapestore_two_geom_cols): Test
1928     PostGISShapeStore with tables having two geometry columns.
1929    
1930 bh 2058 2004-02-10 Bernhard Herzog <[email protected]>
1931    
1932     Fix some postgis problems. What remains to be done is real
1933     handling of SRIDs as they affect how reprojection is done
1934    
1935     * Thuban/Model/postgisdb.py (quote_identifier): Fix typo in
1936     doc-string
1937     (PostGISShapeStore._fetch_table_information): New. Extend
1938     inherited method to retrieve srid
1939     (PostGISShapeStore.BoundingBox): Handle tables without data.
1940     extent yields NULL for those
1941     (PostGISShapeStore.ShapesInRegion): Use the srid of the table.
1942    
1943     * test/test_postgis_db.py
1944     (TestPostGISSpecialCases.test_shapestore_empty_table): New test
1945     for the special case of a table without any data
1946     (TestPostGISShapestorePointSRID): New class with tests for a table
1947     that uses srids
1948     (PolygonTests): Fix a doc-string typo
1949    
1950     * test/postgissupport.py (PostGISDatabase.__init__): New parameter
1951     reference_systems with a specification of spacial reference
1952     systems to create in the new db.
1953     (PostgreSQLServer.new_postgis_db)
1954     (PostgreSQLServer.get_static_data_db): New parameter
1955     reference_systems to be passed through ultimately to
1956     PostGISDatabase. In new_postgis_db also check whether an existing
1957     db already has the right srids
1958     (PostgreSQLServer.get_default_static_data_db): Add srids and a
1959     table that uses srids
1960     (PostGISDatabase.initdb): Create the entries for the reference
1961     systems
1962     (PostGISDatabase.has_data): Add reference_systems parameter to
1963     check for those too
1964     (upload_shapefile): New parameter srid to create tables with a
1965     specific srid
1966    
1967 frank 2055 2004-02-06 Frank Koormann <[email protected]>
1968    
1969     * po/pt_BR.po: Fixed charset
1970    
1971 frank 2054 2004-02-05 Frank Koormann <[email protected]>
1972    
1973     * po/pt_BR.po: Fixed format string for error message, missing %s
1974     added (Thuban/UI/application.py:273)
1975    
1976 frank 2053 2004-02-03 Frank Koormann <[email protected]>
1977    
1978     First version of Portuguese (Brazilian) translation
1979    
1980     * po/pt_BR.po: New, translation of pot (2004-01-15 16:07+0300) for
1981     Brazilian Portuguese by Eduardo Patto Kanegae.
1982    
1983     * Thuban/UI/about.py (About.__init.py__): Added Eduardo to the list of
1984     translators.
1985    
1986    
1987 frank 2052 2004-01-22 Frank Koormann <[email protected]>
1988    
1989     * Doc/manual/thuban-manual.xml: Added section on installation of
1990     Thuban under Win32 systems. Fixed image path references in the postgis
1991     section. Some minor source formattings.
1992    
1993 frank 2051 2004-01-21 Frank Koormann <[email protected]>
1994    
1995     Make Thuban remember path selections (at least for one application run).
1996    
1997     * Thuban/UI/application.py (Application.OnInit): Initialize path as a
1998     attribute of application object. Path is a dictionary of
1999     strings, currently with the items "data" and "projection".
2000     (Application.SetPath): New, stores path for the specified item.
2001     (Application.Path): New, return path for the specified item.
2002    
2003     * Thuban/UI/mainwindow.py
2004     (MainWindow.OpenSession, MainWindow.SaveSessionAs,
2005     MainWindow.AddLayer, MainWindow.AddRasterLayer,
2006     MainWindow.TableOpen): Access "data" path information of the
2007     application.
2008    
2009     * Thuban/UI/projdialog.py (ProjFrame._OnImport, ProjFrame._OnExport):
2010     Access "projection" path information of the application.
2011    
2012 bh 2048 2004-01-05 Bernhard Herzog <[email protected]>
2013    
2014 bh 2050 * po/ru.po: Updated translations from Alex Shevlakov
2015    
2016     2004-01-05 Bernhard Herzog <[email protected]>
2017    
2018 bh 2048 * po/Makefile, po/README: Move the description of how to generate
2019     the translation statistics to the README.
2020    
2021 bh 2042 2003-12-23 Bernhard Herzog <[email protected]>
2022    
2023 bh 2045 * NEWS: Update for 1.0.0
2024    
2025     * po/it.po: Another update from Maurizio Napolitano
2026    
2027     2003-12-23 Bernhard Herzog <[email protected]>
2028    
2029 bh 2042 * po/it.po: Updated translation from Maurizio Napolitano
2030    
2031     2003-12-23 Bernhard Herzog <[email protected]>
2032    
2033     * Thuban/UI/join.py (JoinDialog.__init__): Mark one more string
2034     for translation
2035    
2036     * Thuban/UI/mainwindow.py (MainWindow.TableRename)
2037     (MainWindow.RenameMap, MainWindow.RenameLayer): Mark some more
2038     strings for translation
2039    
2040     * po/de.po: Update with the newly marked strings.
2041    
2042 bh 2033 2003-12-22 Bernhard Herzog <[email protected]>
2043    
2044 bh 2039 * HOWTO-Release: Fix the places where version numbers have to be
2045     updated
2046    
2047     2003-12-22 Bernhard Herzog <[email protected]>
2048    
2049 bh 2037 * setup.py (setup call): 1.0.0, yeah!
2050    
2051     * Thuban/version.py (longversion): 1.0.0, yeah!
2052    
2053     * Thuban/Model/load.py (SessionLoader.__init__): Accept the
2054     1.0.0 namespace too
2055    
2056     * Thuban/Model/save.py (SessionSaver.write_session): Save with
2057     1.0.0 namespace
2058    
2059     * test/test_load.py (LoadSessionTest.dtd)
2060     (TestSingleLayer.file_contents)
2061     (TestNonAsciiColumnName.file_contents)
2062     (TestLayerVisibility.file_contents)
2063     (TestClassification.file_contents, TestLabels.file_contents)
2064     (TestLayerProjection.file_contents)
2065     (TestRasterLayer.file_contents, TestJoinedTable.file_contents)
2066     (TestLabelLayer.file_contents, TestPostGISLayer.file_contents)
2067     (TestPostGISLayerPassword.file_contents)
2068     (TestLoadError.file_contents, TestLoadError.test): Update for
2069     1.0.0 namespace
2070    
2071     * test/test_save.py (SaveSessionTest.dtd)
2072     (SaveSessionTest.testEmptySession)
2073     (SaveSessionTest.testSingleLayer)
2074     (SaveSessionTest.testLayerProjection)
2075     (SaveSessionTest.testRasterLayer)
2076     (SaveSessionTest.testClassifiedLayer)
2077     (SaveSessionTest.test_dbf_table)
2078     (SaveSessionTest.test_joined_table)
2079     (SaveSessionTest.test_save_postgis): Update for 1.0.0 namespace
2080    
2081     2003-12-22 Bernhard Herzog <[email protected]>
2082    
2083 bh 2035 * Thuban/Model/load.py (SessionLoader.start_label): Make sure the
2084     alignment flags are byte strings not unicode and that they have
2085     valid values
2086    
2087     * test/test_load.py (TestLabelLayer): New. Test loading (and
2088     indirectly saving) of maps with labels.
2089    
2090     2003-12-22 Bernhard Herzog <[email protected]>
2091    
2092 bh 2033 * Thuban/UI/tableview.py (TableGrid.OnDestroy)
2093     (TableGrid.__init__): Handle EVT_WINDOW_DESTROY in the grid to
2094     unsubscribe all subscribers.
2095     (LayerTableFrame.OnDestroy): Do not unsubscribe any messages from
2096     self.grid since it may already have been destroyed.
2097     Fixes RT #2256
2098    
2099 bh 2031 2003-12-19 Bernhard Herzog <[email protected]>
2100    
2101     * po/fr.po, po/es.po: Updated translations from Daniel Calvelo
2102    
2103 bh 2028 2003-12-16 Bernhard Herzog <[email protected]>
2104 silke 2029
2105     * debian/bitmappath.patch, debian/setup.py.patch:
2106     added to ensure compliance with FHS for debian
2107     * debian/rules, debian/changelog:
2108     added patches in rules to ensure compliance with FHS for debian
2109 bh 2028
2110 silke 2029 2003-12-16 Bernhard Herzog <[email protected]>
2111    
2112 bh 2028 * po/Makefile (mo): Make the output a bit nicer so that it prints
2113     statistics about the translations. Add a comment how produce even
2114     nicer statistics with sed.
2115    
2116 frank 2026 2003-12-09 Frank Koormann <[email protected]>
2117    
2118     * Resources/Projections/defaults.proj:
2119     French projection sample with correct accents (UNICODE).
2120    
2121 bh 2025 2003-12-05 Bernhard Herzog <[email protected]>
2122    
2123     * MANIFEST.in: Add the devtools directory
2124    
2125     * setup.py (setup call): Use license instead of licence. This
2126     silences a deprecation warning on Python 2.3
2127    
2128 frank 2022 2003-12-05 Frank Koormann <[email protected]>
2129    
2130 frank 2023 Documentation synced with 1.0rc1
2131    
2132     * Doc/manual/thuban-manual.xml:
2133     Minor formatting changes and references to database layers .
2134     Introduction.Internationalization: New section on i18n.
2135     MapManagement.AddingandRemovingLayers: Added item on database layers.
2136     MapManagement.TheLegend: Added section and screenshot on popup menu.
2137     ProjectionManagement: Updated screenshot and sentence on EPSG.
2138     Appendix.SupportedDataSources: Added PostGIS.
2139     Appendix.WorkingwithPostGIS: New section.
2140    
2141     * Doc/manual/images/6_projection.png: Updated screenshot including
2142     EPSG checkboxes.
2143    
2144     * Doc/manual/images/3_5_popup_menu.png: New, popup menu screenshot.
2145    
2146     * Doc/manual/images/app_postgis_add_layer.png,
2147     Doc/manual/images/app_postgis_db_add.png,
2148     Doc/manual/images/app_postgis_db_management.png:
2149     New screenshots focussing on database layers
2150    
2151     2003-12-05 Frank Koormann <[email protected]>
2152    
2153 frank 2022 * Thuban/UI/projdialog.py (load_user_proj): If user.proj is missing
2154     write warning to stderr instead of rising a warning dialog
2155    
2156 bh 2016 2003-12-03 Bernhard Herzog <[email protected]>
2157    
2158 bh 2021 Fix for RT #2243
2159    
2160 bh 2020 * Thuban/UI/mainwindow.py (MainWindow.has_selected_shape_layer):
2161     New. Like has_selected_layer but for shape layers only
2162     (_has_selected_shape_layer): New. Like _has_selected_layer but for
2163     shape layers only
2164     (layer_show_table command, layer_jointable command): Use these
2165     commands should only be available for shape layers
2166    
2167     2003-12-03 Bernhard Herzog <[email protected]>
2168    
2169 bh 2018 * Thuban/UI/mainwindow.py (MainWindow.Unsubscribe): Deal with
2170     publishers that are wx objects and may have been destroyed by wx
2171     already. Fixes RT #2242.
2172    
2173     2003-12-03 Bernhard Herzog <[email protected]>
2174    
2175 bh 2016 * po/ru.po: Updates from Alex Shevlakov
2176    
2177 silke 2013 2003-12-03 Silke Reimer <silkeintevation.de>
2178    
2179     * debian/control, debian/changelog: Added gdal-support to
2180     debian package, updated to new thuban version
2181    
2182    
2183 bh 2012 2003-12-03 Bernhard Herzog <[email protected]>
2184    
2185     * Thuban/Lib/version.py: New. Module for version number
2186     manipulations. The version of make_tuple here also deals better
2187     with more unusual version number strings, such as e.g.
2188     "1.2+cvs20031111"
2189    
2190     * Thuban/version.py (make_tuple): Removed. It's now in
2191     Thuban.Lib.version. Use that implementation instead.
2192    
2193     * test/test_lib_version.py: New. Tests for Thuban/Lib/version.py
2194    
2195 bh 2005 2003-12-02 Bernhard Herzog <[email protected]>
2196    
2197 bh 2010 * MANIFEST.in: Add debian files
2198    
2199 bh 2008 * setup.py (setup call): Add packages for the Extensions so that
2200     they're installed too
2201     (data_files): Add READMEs and sample data from some Extensions
2202    
2203     * NEWS: Add note about the extensions in binary packages
2204    
2205     2003-12-02 Bernhard Herzog <[email protected]>
2206    
2207 bh 2005 * Thuban/Model/save.py (SessionSaver.write_session): Save files
2208     with the thuban-1.0rc1
2209    
2210     * Thuban/Model/load.py (SessionLoader.__init__): Recognize the
2211     thuban-1.0rc1 namespace too
2212    
2213     * test/test_save.py (SaveSessionTest.dtd)
2214     (SaveSessionTest.testEmptySession)
2215     (SaveSessionTest.testSingleLayer)
2216     (SaveSessionTest.testLayerProjection)
2217     (SaveSessionTest.testRasterLayer)
2218     (SaveSessionTest.testClassifiedLayer)
2219     (SaveSessionTest.test_dbf_table)
2220     (SaveSessionTest.test_joined_table)
2221     (SaveSessionTest.test_save_postgis): Update to thuban-1.0rc1
2222     namespace
2223    
2224     * test/test_load.py (LoadSessionTest.dtd): Update to thuban-1.0rc1
2225     namespace
2226     (TestSingleLayer.file_contents)
2227     (TestNonAsciiColumnName.file_contents)
2228     (TestLayerVisibility.file_contents)
2229     (TestClassification.file_contents, TestLabels.file_contents)
2230     (TestLayerProjection.file_contents)
2231     (TestRasterLayer.file_contents, TestJoinedTable.file_contents)
2232     (TestPostGISLayer.file_contents)
2233     (TestPostGISLayerPassword.file_contents)
2234     (TestLoadError.file_contents, TestLoadError.test): Update to
2235     thuban-1.0rc1 namespace
2236    
2237 bh 1996 2003-12-01 Bernhard Herzog <[email protected]>
2238    
2239 bh 2003 * setup.py (proj4_prefix, wx_prefix, gdal_prefix): Fix these for
2240     nt to better match Intevation's current w32 setup
2241    
2242 bh 2001 * HOWTO-Release: Add note about updating MANIFEST.in
2243    
2244     * MANIFEST.in: Add the Extensions
2245    
2246 bh 1998 * NEWS: Update for 1.0rc1
2247    
2248     2003-12-01 Bernhard Herzog <[email protected]>
2249    
2250 bh 1996 * Thuban/UI/mainwindow.py (MainWindow.AddLayer): Change the wild
2251     cards for the dialog so that shapefiles ending in all uppercase
2252     SHP are listed too
2253    
2254 bh 1988 2003-11-28 Bernhard Herzog <[email protected]>
2255    
2256 bh 1996 * Thuban/version.py (longversion): Update to 1.0rc1
2257    
2258     * setup.py (setup call): Update version to 1.0rc1. Use the
2259     [email protected] email address as author email instead of my
2260     personal one.
2261    
2262     2003-11-28 Bernhard Herzog <[email protected]>
2263    
2264 bh 1992 * po/de.po: Update german translation.
2265    
2266     2003-11-28 Bernhard Herzog <[email protected]>
2267    
2268 bh 1990 Unify the filenames stored in .thuban files so that the .thuban
2269     files are more platform independend
2270    
2271     * Thuban/Model/save.py (unify_filename): New. Unify filenames so
2272     that they can be used on both windows and unix
2273     (SessionSaver.prepare_filename): New. Handle all filename
2274     transformations for filenames stored in the thuban file
2275     (SessionSaver.write_data_containers, SessionSaver.write_layer):
2276     Use prepare_filename
2277    
2278     * test/test_save.py (SaveSessionTest.testSingleLayer)
2279     (SaveSessionTest.testLayerProjection)
2280     (SaveSessionTest.testRasterLayer)
2281     (SaveSessionTest.testClassifiedLayer)
2282     (SaveSessionTest.test_dbf_table)
2283     (SaveSessionTest.test_joined_table): Filenames are always stored
2284     with slashes on all currently supported platforms so adapt all
2285     tests to this
2286    
2287     * test/test_load.py (LoadSessionTest.filenames): With the new
2288     filename scheme the filenames in the tests should be
2289     understandable on all currently supported platforms so we turn
2290     this into an empty list because we don't have to normalize them
2291     anymore
2292    
2293     2003-11-28 Bernhard Herzog <[email protected]>
2294    
2295 bh 1988 * test/test_layer.py (TestLayer.test_arc_layer_with_projection):
2296     Add the ellipsoid to the projection since some Proj versions
2297     complain if it's missing.
2298    
2299 bh 1984 2003-11-27 Bernhard Herzog <[email protected]>
2300    
2301     Corect some bounding box projection problems
2302    
2303     * Thuban/Model/proj.py (Projection.InverseBBox): New. Inverse
2304     version of ForwardBBox
2305     (Projection._transform_bbox): New. common implementation of
2306     ForwardBBox and InverseBBox
2307     (Projection.ForwardBBox): Use _transform_bbox.
2308    
2309     * test/test_proj.py (TestProjection.test): Add test for
2310     InverseBBox
2311    
2312     * Thuban/Model/layer.py (Layer.LatLongBoundingBox)
2313     (Layer.ShapesBoundingBox, RasterLayer.LatLongBoundingBox): Use the
2314     new InverseBBox method to determine the unprojected bounding box
2315     (Layer.ShapesInRegion): Use the ForwardBBox method to project the
2316     bbox.
2317    
2318     * test/test_layer.py (TestLayer.test_point_layer_with_projection):
2319     Removed.
2320     (TestLayer.test_arc_layer_with_projection): New. This test is
2321     better able to test whether bounding boxes are projected correctly
2322     than test_point_layer_with_projection
2323    
2324 bh 1986 * Thuban/UI/viewport.py (ViewPort.map_projection_changed): Use
2325     InverseBBox to unproject bboxes
2326    
2327 bh 1975 2003-11-25 Bernhard Herzog <[email protected]>
2328    
2329 bh 1981 * Thuban/UI/about.py (About.__init__): Make sure we have ASCII
2330     source code.
2331    
2332     2003-11-25 Bernhard Herzog <[email protected]>
2333    
2334 bh 1979 * Thuban/Model/layer.py (Layer.__getattr__): Removed. It was only
2335     there for backwards compatibility and all code relying on that
2336     should have been updated by now.
2337    
2338     2003-11-25 Bernhard Herzog <[email protected]>
2339    
2340 bh 1977 * test/test_load.py (TestClassification.test): Add the missing
2341     round trip test.
2342     (TestClassification.file_contents): Update to the newest file
2343     format
2344    
2345     2003-11-25 Bernhard Herzog <[email protected]>
2346    
2347 bh 1975 Add very experimental (and possibly dangerous) extension to draw
2348     polygons:
2349    
2350     * Extensions/drawshape/README: New. Brief installation
2351     instructions
2352    
2353     * Extensions/drawshape/drawshape.py: New. Implementation of the
2354     drawshape extensions
2355    
2356     * Extensions/drawshape/patch.diff: Patch to apply before the
2357     extension can be used.
2358    
2359 bh 1971 2003-11-24 Bernhard Herzog <[email protected]>
2360    
2361 bh 1973 * Thuban/Model/data.py (ShapefileStore._open_shapefile)
2362     (ShapefileStore.__init__): Factor opening the shapefile into a
2363     separate method (the new _open_shapefile). This makes the code a
2364     bit more readable but the real reason is that it makes some evil
2365     hacks easier. :-)
2366    
2367     2003-11-24 Bernhard Herzog <[email protected]>
2368    
2369 bh 1971 * Thuban/Model/load.py (SessionLoader.check_attrs): If no
2370     converter is specified for an attribute assume it's a string
2371     containing only Latin1 characters. Update doc-string accordingly.
2372     This change should fix many places where unicode objects might
2373     accidentally enter Thuban.
2374    
2375     * test/test_load.py (TestNonAsciiColumnName): New test to check
2376     what happens with column names in DBF files that contain non-ascii
2377     characters
2378    
2379 bh 1969 2003-11-21 Bernhard Herzog <[email protected]>
2380    
2381     Enable the experimental attribute editing again and introduce a
2382     command line switch to actually activate it
2383    
2384     * Thuban/UI/main.py (options): New. Container for options set on
2385     the commmand line
2386     (main): Add the --enable-attribute-editing flag.
2387    
2388     * Thuban/UI/identifyview.py (IdentifyView.__init__): If attribute
2389     editing is enabled use the grid ctrl which allows editing of the
2390     values
2391    
2392     * Thuban/Model/transientdb.py (AutoTransientTable.write_record):
2393     New. Just delegate this to the underlying table.
2394    
2395 bh 1967 2003-11-20 Bernhard Herzog <[email protected]>
2396    
2397     * test/test_proj.py (ProjFileReadTests.test_read_unreadable_file):
2398     Skip this test if run under non-posix systems since it only works
2399     there
2400    
2401 bh 1960 2003-11-19 Bernhard Herzog <[email protected]>
2402    
2403 bh 1965 * Thuban/Model/resource.py: Rework the way gdal support is
2404     determined so that we can give a reason in the about why gdal is
2405     not supported.
2406     (gdal_support_status): New. Variable holding a string with the
2407     reason for no gdal support
2408    
2409     * Thuban/UI/about.py (About.__init__): Add the reason why gdal is
2410     not supported to the message
2411    
2412     2003-11-19 Bernhard Herzog <[email protected]>
2413    
2414 bh 1963 Remove the old table interface and its test cases
2415    
2416     * Thuban/Model/table.py (OldTableInterfaceMixin): Removed.
2417     (DBFTable, MemoryTable): Do not derive from OldTableInterfaceMixin
2418     anymore
2419    
2420     * Thuban/Model/transientdb.py (TransientTableBase)
2421     (AutoTransientTable): Do not derive from OldTableInterfaceMixin
2422     anymore
2423    
2424     * test/test_table.py: Removed since the old interface it tests is
2425     gone.
2426    
2427     * test/runtests.py (main): The old table interface is gone and
2428     with it the deprecation warnings so remove the code that turns
2429     these warnings into errors
2430    
2431     2003-11-19 Bernhard Herzog <[email protected]>
2432    
2433 bh 1960 * test/test_table.py: Revert to revision 1.5 again. Changing the
2434     tests to use the new table interface is completely wrong since the
2435     whole purpose of the tests in this module is to test the old
2436     interface.
2437    
2438 bh 1954 2003-11-18 Bernhard Herzog <[email protected]>
2439    
2440 bh 1958 * Thuban/Model/postgisdb.py (PostGISConnection.MatchesParameters):
2441     New. Test whether the connection matches a set of connection
2442     parameters
2443    
2444     * Thuban/UI/dbdialog.py (DBFrame.conns_changed): Fix doc-string
2445     (DBFrame.OnAdd): Use the new MatchesParameters method when looking
2446     for existing connections with the same parameters and break out of
2447     the loop correctly.
2448    
2449     * test/test_postgis_db.py (TestBriefDescription)
2450     (TestPostGISSimple.test_brief_description): Rename
2451     TestBriefDescription to TestPostGISSimple and the test method to
2452     test_brief_description so that we can add more test methods.
2453     (TestPostGISSimple.test_matches_parameters): New. Test the new
2454     MatchesParameters method
2455    
2456     2003-11-18 Bernhard Herzog <[email protected]>
2457    
2458 bh 1960 * Thuban/Lib/connector.py (Publisher): Introduce a new flag,
2459 bh 1954 _was_destroyed, to indicate whether an publisher instance has
2460     already been destroyed.
2461     (Publisher.Unsubscribe): Only disconnect if the publisher has not
2462     been destroyed yet.
2463     (Publisher.Destroy): Set the _was_destroyed flag to true.
2464    
2465     * test/test_connector.py
2466     (TestPublisher.test_unsubscribe_after_destroy): New. Test that
2467     calling Unsubscribe after Destroy doesn't raise an exception
2468    
2469 bh 1951 2003-11-14 Bernhard Herzog <[email protected]>
2470    
2471     * Thuban/UI/identifyview.py (IdentifyView.selected_shape): Fix
2472     typo in doc-string
2473    
2474 bh 1949 2003-11-13 Bernhard Herzog <[email protected]>
2475    
2476     Quote table and column names properly for postgis.
2477    
2478     * Thuban/Model/postgisdb.py (quote_identifier): New. Function to
2479     quote an identifier for use in an sql statement
2480     (PostGISColumn.__init__): Add the quoted_name attribute
2481     (PostGISTable.__init__): New instance variable quoted_tablename
2482     (PostGISTable._fetch_table_information): Use the quoted table
2483     name. New isntance variable quoted_geo_col with a quoted version
2484     of geometry_column
2485     (PostGISTable.NumRows, PostGISTable.RowIdToOrdinal)
2486     (PostGISTable.RowOrdinalToId): Use the quoted table name
2487     (PostGISTable.ReadValue, PostGISTable.ValueRange)
2488     (PostGISTable.UniqueValues, PostGISTable.SimpleQuery)
2489     (PostGISShapeStore.BoundingBox, PostGISShapeStore.Shape)
2490     (PostGISShapeStore.AllShapes, PostGISShapeStore.ShapesInRegion):
2491     Use quoted table and column names
2492    
2493     * test/test_postgis_db.py (TestPostGISSpecialCases)
2494     (TestPostGISIgnoredColumns): Rename the class to
2495     TestPostGISSpecialCases because that better describes the new
2496     cases
2497     (TestPostGISSpecialCases.test_unsupported_types)
2498     (TestPostGISSpecialCases.test): Rename the method to
2499     test_unsupported_types because we need a more descriptive name now
2500     that there are more methods
2501     (TestPostGISSpecialCases.test_table_name_quoting)
2502     (TestPostGISSpecialCases.test_column_name_quoting)
2503     (TestPostGISSpecialCases.test_shapestore_name_quoting): New test
2504     cases to test quoting of table and column names in PostGISTable
2505     and PostGISShapeStore
2506    
2507     * test/postgissupport.py
2508     (skip_if_addgeometrycolumn_does_not_use_quote_ident): New. Skip if
2509     AddGeometryColumn desn't support table or column names with sapces
2510     or double quotes
2511    
2512 jan 1945 2003-11-12 Jan-Oliver Wagner <[email protected]>
2513    
2514     * Extensions/wms/__init__.py: New: Init to make this
2515     directory a package.
2516    
2517     * Extensions/wms/wms.py: New: Provide layers via OGC WMS.
2518    
2519 bh 1932 2003-11-11 Bernhard Herzog <[email protected]>
2520    
2521 bh 1942 * Thuban/Model/resource.py (EPSG_DEPRECATED_PROJ_FILE): New.
2522     Constant for the file woth deprecated epsg projections
2523     (get_system_proj_file): Update doc-string
2524    
2525     * Thuban/UI/projdialog.py (ProjFrame.build_dialog): Add a space
2526     above the EPS widgets, introduce a check box for the deprecated
2527     eps projections and a label for the epsg widgets
2528     (ProjFrame._OnShowEPSG): Handle the deprecated EPSG projections
2529     too
2530    
2531     2003-11-11 Bernhard Herzog <[email protected]>
2532    
2533 bh 1939 Avoid warnings when run under Python 2.3
2534    
2535     * Thuban/UI/baserenderer.py (BaseRenderer.draw_point_shape)
2536     (BaseRenderer.draw_label_layer): Coordinates must be ints.
2537    
2538     * Thuban/UI/renderer.py (MapRenderer.make_point): Turn this into a
2539     real method so that we can convert to int.
2540     (MapRenderer.label_font): The font size mist be an int.
2541    
2542     * Thuban/UI/common.py (Color2wxColour): The color values must be
2543     ints. Also, remove the unnecessary asserts.
2544    
2545     * test/test_load_0_8.py (TestUnicodeStrings.file_contents)
2546     (TestUnicodeStrings.test): Python source code should not contain
2547     non-ascii characters unless an encoding is specified in the file.
2548     Therefore use \x escapes in the string literals for non-ascii
2549     characters.
2550    
2551     2003-11-11 Bernhard Herzog <[email protected]>
2552    
2553 bh 1934 * Thuban/Model/resource.py (get_system_proj_file): Add a filename
2554     parameter so that this function can be used for all proj files in
2555     Resource/Projections
2556     (DEFAULT_PROJ_FILE, EPSG_PROJ_FILE): New. Predefined filenames for
2557     get_system_proj_file
2558    
2559     * Thuban/UI/projdialog.py (ProjFrame.__init__): Instead of one
2560     ProjFile self.__sysProjFile use a dictionary of system ProjFile
2561     objects self._sys_proj_files
2562     (ProjFrame.build_dialog): Adapt to the new changes in the
2563     ProjectionList constructor. Add a check button to toggle whether
2564     EPSG projections are shown
2565     (ProjFrame._OnShowEPSG): New. Handler for the epsg check button
2566     events.
2567     (ProjFrame.load_user_proj, ProjFrame.load_system_proj): Only show
2568     the busy cursor if the files have not yet been loaded by the
2569     dialog.
2570     (ProjFrame.load_system_proj): Add a parameter for the name of the
2571     proj file. Maintain the dictionary of system projections
2572     self._sys_proj_files
2573    
2574     * Thuban/UI/projlist.py (ProjectionList): Merge the system_projs,
2575     user_projs parameters into one parameter proj_files which is a
2576     list of proj files.
2577     (ProjectionList._subscribe_proj_files)
2578     (ProjectionList._unsubscribe_proj_files): New. Move
2579     subscription/unsubscription of projfile messages to separate
2580     methods
2581     (ProjectionList.Destroy): The unsubscribe is now done in
2582     _unsubscribe_proj_files
2583     (ProjectionList.update_projections): We now have a list of proj
2584     file objects
2585     (ProjectionList.SetProjFiles): New method to set a new list of
2586     proj file objects
2587    
2588     * test/test_proj.py (ProjFileReadTests.test_get_system_proj_file):
2589     Specify explicitly which system proj file to load.
2590    
2591     2003-11-11 Bernhard Herzog <[email protected]>
2592    
2593 bh 1932 * Thuban/Model/load.py (SessionLoader.Destroy): New. Clear all
2594     instance variables to cut cyclic references. The GC would have
2595     collected the loader eventually but it can happen that it doesn't
2596     run at all until thuban is closed (2.3 but not 2.2 tries a bit
2597     harder and forces a collection when the interpreter terminates)
2598     (load_session): Call the handler's Destroy method to make sure
2599     that it gets garbage collected early. Otherwise it will be
2600     collected very late if at all and it holds some references to e.g.
2601     shapestores and the session which can lead to leaks (of e.g. the
2602     temporary files)
2603    
2604     * test/test_load.py (TestSingleLayer.test_leak): New. test for the
2605     resource leak in load_session
2606    
2607 bh 1929 2003-11-10 Bernhard Herzog <[email protected]>
2608    
2609     * Thuban/UI/baserenderer.py: Add a way to specify how layers in
2610     extensions are to be rendered.
2611     (_renderer_extensions): New. List with renderer for layers in
2612     extensions
2613     (add_renderer_extension): New. Add a renderer extension
2614     (init_renderer_extensions): New. Init the renderer extensions
2615     (BaseRenderer.render_map_incrementally): Search
2616     _renderer_extensions for how to draw unknown layer types
2617     (BaseRenderer.draw_raster_data): Add format parameter so that
2618     formats other than BMP can be drawn
2619     (BaseRenderer.draw_raster_layer): Pass an explicit format to
2620     draw_raster_data
2621    
2622     * Thuban/UI/renderer.py (raster_format_map): New. Mapping form the
2623     strings of the format parameter of draw_raster_data method to wx
2624     constants
2625     (MapRenderer.draw_raster_data): Add the format parameter and use
2626     raster_format_map to map it to the right wxwindows constant for
2627     wxImageFromStream
2628    
2629     * test/test_baserenderer.py (SimpleRenderer.draw_raster_data): Add
2630     the format parameter and record it
2631     (TestBaseRenderer.test_raster_no_projection): check the format
2632     paramter of the draw_raster_data method
2633     (TestBaseRenderer.test_renderer_extension): New. Test the renderer
2634     extension facility
2635    
2636 bh 1925 2003-11-07 Bernhard Herzog <[email protected]>
2637    
2638     Tweak the usage of the sqlite database to make common use cases
2639     more responsive. In most cases copying the data to the sqlite
2640     database takes so long that using sqlite doesn't have enough
2641     advantages.
2642    
2643     * Thuban/Model/transientdb.py (TransientTableBase.ValueRange): Add
2644     comments about performance and query the min and max in separate
2645     statements because only that way will indexes be used.
2646     (TransientTableBase.UniqueValues): Add some comments about
2647     performance.
2648     (AutoTransientTable.ValueRange, AutoTransientTable.UniqueValues):
2649     Do not copy the data to the transient DB but use the transient
2650     copy if it exists. See the new comments for the performance trade
2651     offs
2652    
2653     * test/test_transientdb.py
2654     (TestTransientTable.test_auto_transient_table): Make sure that the
2655     data is copied to the transient database at some point.
2656    
2657 bh 1913 2003-11-03 Bernhard Herzog <[email protected]>
2658    
2659 bh 1922 * Thuban/Model/data.py (ShapefileStore.ShapesInRegion): Bind some
2660     globals to locals so that it's a bit faster
2661    
2662     2003-11-03 Bernhard Herzog <[email protected]>
2663    
2664 bh 1920 * Thuban/UI/baserenderer.py
2665     (BaseRenderer.draw_shape_layer_incrementally): Use the ReadValue
2666     method. ReadValue is faster than ReadRowAsDict since it only reads
2667     one cell especially now that the dbf file objects actually
2668     implement it.
2669    
2670     * Thuban/Model/table.py (DBFTable.ReadValue): Use the new
2671     read_attribute method of the dbf objects
2672    
2673     2003-11-03 Bernhard Herzog <[email protected]>
2674    
2675 bh 1916 * Extensions/profiling/profiling.py (popup_dialog_box): New config
2676     variable to indicate whether the result should be shown in a
2677     dialog box
2678     (profile_screen_renderer, time_screen_renderer): Only show a
2679     dialog box if popup_dialog_box is true.
2680     (profile_screen_renderer): Flush stdout after the printing the
2681     first part of the "profiling..." message
2682    
2683     * Thuban/UI/baserenderer.py
2684     (BaseRenderer.draw_shape_layer_incrementally): Cache the pens and
2685     brushes for the groups so that they're not created over and over
2686     again
2687    
2688 bh 1913 * Thuban/Model/classification.py (Classification.__getattr__)
2689     (Classification._compile_classification)
2690     (Classification._clear_compiled_classification): New. Methods to
2691     manage a 'compiled' representation of the classification groups
2692     which is created on demand
2693     (Classification.InsertGroup, Classification.RemoveGroup)
2694     (Classification.ReplaceGroup): reset the compiled representation
2695     (Classification.FindGroup): Use the compiled representation to
2696     find the matching group
2697     (ClassGroupRange.GetRangeTuple): New. Return the range as a tuple
2698    
2699 bh 1904 2003-10-31 Bernhard Herzog <[email protected]>
2700    
2701 bh 1911 * Thuban/Model/classification.py (Classification.SetDefaultGroup):
2702     Send a CLASS_CHANGED message
2703     (Classification.RemoveGroup): Send a CLASS_CHANGED message and do
2704     not return the removed group since it wasn't used.
2705    
2706     * test/test_classification.py
2707     (TestClassification.test_set_default_group): New. Test the
2708     SetDefaultGroup method
2709     (TestClassification.test_insert_group): New. Test the InsertGroup
2710     method
2711     (TestClassification.test_remove_group): New. Test the RemoveGroup
2712     method
2713     (TestClassification.test_replace_group): New. Test the
2714     ReplaceGroup method
2715    
2716     2003-10-31 Bernhard Herzog <[email protected]>
2717    
2718 bh 1908 * test/test_classification.py (TestClassification.setUp):
2719     Subscribe to the CLASS_CHANGED messages
2720     (TestClassification.tearDown): New. Destroy the classification
2721     properly
2722     (TestClassification.test_defaults): Add tests for the default line
2723     width and whether no messages were sent yet
2724     (TestClassification.test_set_default_properties): Add tests for
2725     messages and setting the default line width
2726     (TestClassification.test_add_singleton)
2727     (TestClassification.test_add_range)
2728     (TestClassification.test_multiple_groups): Add tests for messages
2729    
2730     2003-10-31 Bernhard Herzog <[email protected]>
2731    
2732 bh 1906 Some more refactoring in preparation for new tests:
2733    
2734     * test/test_classification.py (TestClassification.setUp): New.
2735     Instantiate the classification here. Update the test methods
2736     accordingly.
2737     (TestClassification.test_multiple_groups): Make sure that the two
2738     singletons matching 1 are considered different.
2739    
2740     2003-10-31 Bernhard Herzog <[email protected]>
2741    
2742 bh 1904 * test/test_classification.py (red, green, blue): New. These
2743     constants were used in several cases. Update the relevant methods.
2744     (TestClassification.test_defaults)
2745     (TestClassification.test_set_default_properties)
2746     (TestClassification.test_add_singleton)
2747     (TestClassification.test_add_range)
2748     (TestClassification.test_multiple_groups)
2749     (TestClassification.test_deepcopy): New. These were formerly all
2750     part of the single method test.
2751     (TestClassification.test_deepcopy): Removed.
2752     (TestClassIterator): Removed. The test case is now a method of
2753     TestClassification since it tests part of the public interface of
2754     Classification
2755     (TestClassification.test_iterator): New. Used to be
2756     TestClassIterator effectively
2757    
2758 jan 1902 2003-10-31 Jan-Oliver Wagner <[email protected]>
2759    
2760     GUIfied the functions of the profiling extension.
2761    
2762     * /Extensions/profiling/__init__.py: New: Init to make this
2763     directory a package.
2764    
2765     * Extensions/profiling/profiling.py: Moved menu entries to
2766     the Extensions menu. Applied _() for strings.
2767     (profile_screen_renderer): Catch the detailed printout and present
2768     it in a dialog.
2769 bh 1904 (time_screen_renderer): Raise a dialog to present the result instead
2770 jan 1902 of printing it to stdout.
2771    
2772 bh 1897 2003-10-31 Bernhard Herzog <[email protected]>
2773    
2774 bh 1899 * test/test_classification.py (TestClassGroupProperties)
2775     (TestClassGroup, TestClassGroupDefault, TestClassGroupRange)
2776     (TestClassGroupSingleton, TestClassIterator, TestClassification):
2777     Split TestClassification into several classes, one for each class
2778     being tested. TestClassification itself now only tests
2779     Classification. This split makes changes to the tests a bit easier
2780    
2781     2003-10-31 Bernhard Herzog <[email protected]>
2782    
2783 bh 1897 * Extensions/profiling/profiling.py: New. Extension to measure
2784     Thuban performance
2785    
2786 frank 1895 2003-10-31 Frank Koormann <[email protected]>
2787    
2788     Added two items to legend popup menu: Remove Layer and Show Layer Table
2789    
2790     * Thuban/UI/legend.py (LegendPanel._OnRemoveLayer,
2791     LegendPanel._OnShowTable): New event handlers, call the corresponding
2792     mainwindow methods.
2793     (LegendTree._OnRightClick): Added items to popup menu.
2794    
2795 bh 1894 2003-10-30 Bernhard Herzog <[email protected]>
2796    
2797     * Thuban/UI/dialogs.py (ThubanFrame.__init__): Handle
2798     EVT_WINDOW_DESTROY
2799     (ThubanFrame.OnDestroy): New. Handler for EVT_WINDOW_DESTROY. Does
2800     nothing but is convenient for the derived classes.
2801    
2802     * Thuban/UI/tableview.py
2803     (TableFrame.OnDestroy, LayerTableFrame.OnDestroy): New.
2804     Unsubscribe the messages here not in OnClose because that might
2805     get called multiple times. Fixes RT #2196
2806     (TableFrame.OnClose, LayerTableFrame.OnClose): Removed. Not needed
2807     anymore.
2808    
2809     * README: Update the minimum requirement for wxPython. Since we
2810     now use the EVT_WINDOW_DESTROY event, we need at least 2.4.0.4,
2811     the version in which that was introduced for all platforms
2812    
2813 frank 1890 2003-10-30 Frank Koormann <[email protected]>
2814    
2815     * Thuban/UI/join.py (JoinDialog.OnJoin): Wrapped the major parts of
2816     the join process in a ThubanBeginBusyCursor, ThubanEndBusyCursor
2817     frame.
2818    
2819 jan 1889 2003-10-30 Jan-Oliver Wagner <[email protected]>
2820    
2821     Improved APR import extension, added further EPSG definitions
2822     and some cleanup regarding string class.
2823    
2824     * test/test_proj.py (TestProjection.test_get_projection_units_geo):
2825     Added test for alias 'longlat'.
2826    
2827     * Resources/Projections/epsg-deprecated.proj: New. Contains
2828     deprecated EPSG definitions.
2829    
2830     * Extensions/importAPR/odb.py (ODBBaseObject.TreeInfo): Added
2831     the variable names for objects.
2832    
2833     * Extensions/importAPR/apr.py (APR_BLnSym, APR_BMkSym, APR_BShSym): New.
2834     Copied from importAPR and provided with documentation.
2835    
2836     * Extensions/importAPR/importAPR.py (APR_BLnSym, APR_BMkSym, APR_BShSym):
2837     Moved to apr.py.
2838     (APR_View): Added object ref 'ITheme'.
2839    
2840     * Thuban/Lib/fileutil.py, Thuban/UI/proj4dialog.py: Replaced string
2841     split function by corresponding use of the string class method.
2842    
2843     * Thuban/Model/xmlwriter.py: Replaced string replace function by
2844     corresponding string method.
2845    
2846 bh 1880 2003-10-29 Bernhard Herzog <[email protected]>
2847    
2848     * Thuban/UI/baserenderer.py
2849     (BaseRenderer.draw_shape_layer_incrementally): Speed up the
2850     special case of a classification that only has the default group
2851    
2852 bh 1868 2003-10-27 Bernhard Herzog <[email protected]>
2853    
2854 bh 1878 * po/fr.po, po/es.po: Updated translations from Daniel Calvelo
2855    
2856 bh 1876 * po/de.po: Update.
2857    
2858     * Thuban/UI/application.py
2859     (ThubanApplication.ShowExceptionDialog): Handle translation of the
2860     dialog message properly
2861    
2862     2003-10-27 Bernhard Herzog <[email protected]>
2863    
2864 bh 1873 Rework how localization works so that we use wx's translation
2865     functions when running Thuban as a normal application but not when
2866     we don't need any UI, such as in the test suite. See the comment
2867     in Thuban/__init__.py for details
2868    
2869     * Thuban/__init__.py (_): Add one level of indirection to make the
2870     translation handling more flexible and to make it possible to use
2871     either wx's translation services or not.
2872     (gettext_identity, translation_function_installed)
2873     (install_translation_function): New function to help with this
2874    
2875     * Thuban/UI/__init__.py: Install the wx specific translation
2876     function if it's OK to do that
2877    
2878     * test/support.py (initthuban): Install a dummy translation
2879     function so that importing Thuban.UI doesn't install a wx specific
2880     one for which would need to import wxPython
2881    
2882     2003-10-27 Bernhard Herzog <[email protected]>
2883    
2884 bh 1870 * HOWTO-Release: Source archives should be created first and the
2885     binary packages should be created from the source archives.
2886     There's an official debian package now so there's no need to test
2887     the rpm on debian anymore
2888    
2889     2003-10-27 Bernhard Herzog <[email protected]>
2890    
2891 bh 1868 Several rendering changes:
2892    
2893     - Render the selection into a separate bitmap so that only that
2894     bitmap needs to be redrawn when the selection changes
2895    
2896     - Render incrementally showing previews and allowing interaction
2897     before rendering is complete
2898    
2899     - Update the renderer interface a bit. Most parameters of
2900     RenderMap are now parameters of the constructor
2901    
2902     * Thuban/UI/baserenderer.py (BaseRenderer.__init__): Add the map
2903     and the update region as parameters. Update the doc-string
2904     (BaseRenderer.render_map_incrementally): New. Generator function
2905     to renders the map incrementally
2906     (BaseRenderer.render_map): Remove the map argument (it's now in
2907     the constructor) and simply iterate over the
2908     render_map_incrementally generator to draw the map.
2909     (BaseRenderer.draw_shape_layer_incrementally)
2910     (BaseRenderer.draw_shape_layer): Renamed to
2911     draw_shape_layer_incrementally and changed into a generator that
2912     yields True every 500 shapes. Used by render_map_incrementally to
2913     render shape layers incrementally
2914    
2915     * Thuban/UI/renderer.py (ScreenRenderer.RenderMap): Removed the
2916     map and region parameters which are now in the constructor
2917     (ScreenRenderer.RenderMapIncrementally): New. Public frontend for
2918     the inherited render_map_incrementally.
2919     (BaseRenderer.draw_shape_layer): Removed.
2920     (ScreenRenderer.draw_selection_incrementally): New. The selection
2921     drawing part of the removed draw_shape_layer as a generator
2922     (ScreenRenderer.layer_shapes): Update because of the region
2923     parameter change
2924     (ExportRenderer.__init__): New. Extend the inherited constructor
2925     with the destination region for the drawing
2926     (ExportRenderer.RenderMap): Removed the map and region parameters
2927     which are now in the constructor
2928    
2929     * Thuban/UI/view.py (MapCanvas.PreviewBitmap): New. Return a
2930     bitmap suitable for a preview in a tool
2931     (CanvasPanTool.MouseMove): Use the PreviewBitmap method to get the
2932     bitmap
2933     (MapPrintout.draw_on_dc): Adapt to new renderer interface
2934     (MapCanvas.OnPaint): Handle drawing the selection bitmap if it
2935     exists
2936     (MapCanvas.OnIdle): Update the logic to deal with incremental
2937     rendering and the selection bitmap
2938     (MapCanvas._do_redraw): Handle the instantiation of the render
2939     iterator and the redraws during rendering
2940     (MapCanvas._render_iterator): New. Generator to incrementally
2941     redraw both bitmaps
2942     (MapCanvas.Export): Adapt to new renderer interface.
2943     (MapCanvas.full_redraw): Reset the selection bitmap and the
2944     renderer iterator too
2945     (MapCanvas.redraw_selection): New. Force a redraw of the selection
2946     bitmap
2947     (MapCanvas.shape_selected): Only redraw the selection bitmap
2948    
2949     * test/test_baserenderer.py
2950     (TestBaseRenderer.test_polygon_no_projection)
2951     (TestBaseRenderer.test_raster_no_projection)
2952     (TestBaseRenderer.test_point_map_projection)
2953     (TestBaseRenderer.test_point_layer_and_map_projection)
2954     (TestBaseRenderer.test_point_layer_projection)
2955     (TestBaseRenderer.test_point_with_classification): Adapt to new
2956     renderer interface
2957    
2958 bh 1865 2003-10-24 Bernhard Herzog <[email protected]>
2959    
2960     * libraries/thuban/wxproj.cpp (draw_polygon_shape)
2961     (point_in_polygon_shape, shape_centroid): Raise an exception if
2962     the shape can't be read. Previously invalid shape ids would lead
2963     to a segfault.
2964    
2965     * test/test_wxproj.py (TestShapeCentroid.test_invalid_shape_id):
2966     New. test whether an exception is raised for invalid shape ids
2967    
2968 jan 1857 2003-10-24 Jan-Oliver Wagner <[email protected]>
2969    
2970 jan 1862 * Thuban/Model/proj.py (Projection.GetProjectedUnits): Added 'longlat'
2971     as alias for 'latlong'.
2972    
2973     * Thuban/UI/projdialog.py (ProjFrame.__init__): Added 'longlat'
2974     as alias for 'latlong'.
2975    
2976     2003-10-24 Jan-Oliver Wagner <[email protected]>
2977    
2978 jan 1859 * Thuban/UI/projdialog.py (ProjFrame.proj_selection_changed): Set
2979     the projection even for the UnknownPanel.
2980     (UnknownProjPanel.__init__): Define the text and create the textctrl
2981     widget.
2982     (UnknownProjPanel._DoLayout): Replaced static text widget by the
2983     textctrl created in __init__.
2984     (UnknownProjPanel.SetProjection): Set the text for the text ctrl
2985     including the parameters of the projection.
2986    
2987     2003-10-24 Jan-Oliver Wagner <[email protected]>
2988    
2989 jan 1857 * Resources/Projections/epsg.proj: New. This is a list of
2990     EPSG codes with parameters for proj. The list has been
2991     generated using devtools/create_epsg.py based on the
2992     file nad/epsg of the proj 4.4.7 package. Four projection
2993     definitions have been deleted as they are not accepted by proj:
2994     "CH1903+ / LV95", "Bern 1898 (Bern) / LV03C", "CH1903 / LV03"
2995     and "HD72 / EOV".
2996    
2997 bh 1855 2003-10-22 Bernhard Herzog <[email protected]>
2998    
2999     Some more tweaks to the projection dialog which should fix RT
3000     #1886.
3001    
3002     * Thuban/UI/projlist.py (ProjectionList.Destroy): Unsubscribe from
3003     the ProjFile's messages and call the base class methods correctly
3004     (ProjectionList.SelectProjection): Set the wxLIST_STATE_FOCUSED
3005     flag on the newly selected item too. Otherwise some other item is
3006     focused and the first time the focus is moved with the keyboard
3007     the selection moves in unexpected ways.
3008    
3009     * Thuban/UI/projdialog.py (ProjFrame.__init__): Do not set the
3010     focus on the OK button, only on the projection list. That way the
3011     list really has the focus initially
3012     (ProjFrame.OnClose): Call the projection list's Destroy method to
3013     make it unsubscribe all messages
3014    
3015 bh 1840 2003-10-21 Bernhard Herzog <[email protected]>
3016    
3017 bh 1852 Rework the projection dialog to fix a few bugs, including RT 2166
3018     and most of 2168
3019    
3020     * Thuban/UI/projlist.py: New. The class ProjectionList is a
3021     special wxListCtrl to show a list of projections in a more MVC
3022     fashion
3023    
3024     * Thuban/UI/projdialog.py (ProjFrame): Substantial changes
3025     throughout the class. The main change is to use the ProjectionList
3026     class instead of a normal wxListBox. Also, add an explicit
3027     "Unknown" projection to the projection choice control.
3028     (ProjPanel.__init__): Add an "unknown" ellipsoid
3029     (TMPanel.__init__, LCCPanel.__init__): Tweak the order of
3030     instantiation of the panel's controls to make the tab-order more
3031     natural
3032    
3033     2003-10-21 Bernhard Herzog <[email protected]>
3034    
3035 bh 1849 * test/test_load.py (TestSingleLayer.file_contents)
3036     (TestSingleLayer.test): Add non-ascii characters to the titles of
3037     session, map and layer. This is effectively a port of the
3038     TestUnicodeStrings test in test_load_0_8.py which for some reason
3039     was only added there.
3040    
3041     * test/test_load_0_9.py (TestSingleLayer.file_contents)
3042     (TestSingleLayer.test): Same as in test_load.py: add non-ascii
3043     characters to the titles of session, map and layer,.
3044    
3045     2003-10-21 Bernhard Herzog <[email protected]>
3046    
3047 bh 1847 Add EPSG projection handling to .thuban files
3048    
3049     * test/test_save.py (SaveSessionTest.dtd)
3050     (SaveSessionTest.testEmptySession)
3051     (SaveSessionTest.testLayerProjection)
3052     (SaveSessionTest.testRasterLayer)
3053     (SaveSessionTest.testClassifiedLayer)
3054     (SaveSessionTest.test_dbf_table)
3055     (SaveSessionTest.test_joined_table)
3056     (SaveSessionTest.test_save_postgis): Update to 1.0-dev namespace
3057     (SaveSessionTest.testSingleLayer): Update to 1.0-dev namespace and
3058     use a and epsg projection to test saving them
3059    
3060     * test/test_load.py (LoadSessionTest.dtd): Update to 1.0-dev
3061     namespace
3062     (TestLayerVisibility.file_contents, TestLabels.file_contents)
3063     (TestLayerProjection.file_contents)
3064     (TestRasterLayer.file_contents, TestJoinedTable.file_contents)
3065     (TestPostGISLayer.file_contents)
3066     (TestPostGISLayerPassword.file_contents)
3067     (TestLoadError.file_contents, TestLoadError.test): Update to use
3068     1.0-dev namespace
3069     (TestSingleLayer.file_contents, TestSingleLayer.test): Update to
3070     use 1.0-dev namespace and use an EPSG projection to test whether
3071     loading it works
3072    
3073     * test/test_load_0_9.py: New. Effectively a copy of test_load.py
3074     as of Thuban 0.9. These are now tests to determine whether Thuban
3075     can still read files generated by Thuban 0.9
3076    
3077     * Thuban/Model/save.py (SessionSaver.write)
3078     (SessionSaver.write_session): Use the 1.0 dtd and 1.0-dev
3079     namespace
3080     (SessionSaver.write_projection): Write the projection's epsg
3081     attribute
3082    
3083     * Thuban/Model/load.py (SessionLoader.__init__): Also accept the
3084     thuban-1.0-dev.dtd namespace
3085     (SessionLoader.check_attrs): Allow a callable object as conversion
3086     too
3087     (SessionLoader.start_projection, SessionLoader.end_projection)
3088     (SessionLoader.start_parameter): Handle the epsg attribute and
3089     rename a few instance variables to lower case
3090    
3091     * Resources/XML/thuban-1.0.dtd: New. Only difference to
3092     thuban-0.9.dtd is the epsg attribute for projections.
3093    
3094     2003-10-21 Bernhard Herzog <[email protected]>
3095    
3096 bh 1840 * test/runtests.py (main): Let the user specify which tests to run
3097     on the command line
3098    
3099     * test/support.py (ThubanTestResult.getDescription): Override to
3100     give a better short description. The description can be used as a
3101     parameter to run_tests to run that particular test in isolation.
3102    
3103 frank 1837 2003-10-21 Frank Koormann <[email protected]>
3104    
3105     Popup menu for legend. Scheduled for the 1.2 release this was too
3106     simple to implement: The popup menu is bound to the legend tree, while
3107     the events are hanlded by its anchestor, the legend panel. This
3108     allows reuse of all the event handlers already implemented for the
3109     legend toolbar buttons.
3110    
3111     * Thuban/UI/legend.py (LegendPanel.__init__): EVT_MENU macros
3112     to add handlers for the events issued by the popup menu.
3113     (LegendPanel._OnToggleVisibility): Handler for toggling layer
3114     visibility event
3115     (LegendPanel._OnProjection): Handler for layer projection event.
3116     (LegendTree.__init__): Added EVT_TREE_ITEM_RIGHT_CLICK
3117     (LegendTree._OnRightClick): Event handler for right click, select item
3118     and pop up menu.
3119     (LegendTree.ToggleVisibility): Toggle layer visibility
3120     (LegendTree.LayerProjection): Raise layer projection dialog for
3121     current layer.
3122    
3123 bh 1836 2003-10-21 Bernhard Herzog <[email protected]>
3124    
3125     * Resources/Projections/defaults.proj: Use correct DOCTYPE
3126     declaration. The top-level element is projectionlist not projfile
3127    
3128 bh 1834 2003-10-20 Bernhard Herzog <[email protected]>
3129    
3130     * Thuban/UI/projdialog.py (ProjFrame.write_proj_file): New. helper
3131     method to write a projfile and display a busy cursor and error
3132     dialogs.
3133     (ProjFrame._OnSave, ProjFrame._OnAddToList, ProjFrame._OnImport)
3134     (ProjFrame._OnExport, ProjFrame._OnRemove): Use write_proj_file
3135     (ProjFrame.__FillAvailList): Translate "<None>" too and display a
3136     busy cursor while loading the user and system prj files.
3137    
3138 bh 1832 2003-10-16 Bernhard Herzog <[email protected]>
3139    
3140     * Thuban/Model/resource.py (projfile_cache): Introduce a cache for
3141     ProjFile objects
3142     (clear_proj_file_cache): New function to clear the cache. Mainly
3143     useful for use by the test suite
3144     (read_proj_file): Use the cache.
3145    
3146     * test/test_proj.py (TestProjFile): Clarify the doc-string
3147     (ProjFileReadTests): Update doc-string
3148     (ProjFileReadTests.test_get_system_proj_file): Check whether the
3149     system proj files is cached.
3150     (ProjFileLoadTestCase): New base class for the proj file tests
3151     derived from support.FileLoadTestCase to provide some common
3152     behavior.
3153     (TestLoadingProjFile)
3154     (TestLoadingProjFileWithEmptyProjectionlist.file_contents)
3155     (TestProjFileWithInvalidParameters.file_contents): Derive from
3156     ProjFileLoadTestCase
3157     (TestLoadingProjFile.test_caching): New. Test whether the cache
3158     works
3159    
3160 silke 1829 2003-10-16 Silke Reimer <[email protected]>
3161    
3162     * debian/*: New directory with configuration files for building a thuban
3163     deb-package.
3164    
3165 bh 1822 2003-10-14 Bernhard Herzog <[email protected]>
3166    
3167 bh 1828 * test/test_proj.py: Execute support.run_tests when run as
3168     __main__ so that missing unsubscribes are detected
3169     (TestProjFile.tearDown): Destroy the proj_file properly
3170    
3171     2003-10-14 Bernhard Herzog <[email protected]>
3172    
3173 bh 1826 * Thuban/Model/messages.py (PROJECTION_ADDED)
3174     (PROJECTION_REPLACED, PROJECTION_REMOVED): New message types for
3175     the ProjFile objects
3176    
3177     * Thuban/Model/proj.py (ProjFile): Derive from Publisher so we can
3178     easily send messages when the projections change
3179     (ProjFile.Add, ProjFile.Remove, ProjFile.Replace): Issue messages
3180     when the change was successful
3181    
3182     * test/test_proj.py (TestProjFile.setUp): Subscribe to some of the
3183     proj file messages
3184     (TestProjFile.test_add_remove)
3185     (TestProjFile.test_remove_non_existing)
3186     (TestProjFile.test_replace)
3187     (TestProjFile.test_replace_non_existing): Test whether the right
3188     messages are sent
3189    
3190     2003-10-14 Bernhard Herzog <[email protected]>
3191    
3192 bh 1822 * test/test_proj.py (TestProjFile.test): Refactor into several
3193     tests
3194     (TestProjFile.test_add_remove)
3195     (TestProjFile.test_remove_non_existing)
3196     (TestProjFile.test_replace)
3197     (TestProjFile.test_replace_non_existing): Some of the new
3198     individual test cases
3199     (TestProjFileSimple): New class for the rest of the test cases
3200     that came out of the refactoring
3201     (ProjFileTest): Derive from xmlsupport.ValidationTest so that the
3202     derived classes don't have to
3203    
3204 bh 1812 2003-10-13 Bernhard Herzog <[email protected]>
3205    
3206 bh 1820 Add an optional EPSG code to the projection objects and extend the
3207     .proj file format accordingly.
3208    
3209     * Resources/XML/projfile.dtd (element projection): Add epsg
3210     attribute
3211    
3212     * Thuban/Model/proj.py (Projection.__init__): New parameter and
3213     instance variable epsg. Update doc-string
3214     (Projection.EPSGCode, Projection.Label): New methods to provide
3215     access to EPSG code and a label for use in dialogs
3216    
3217     * Thuban/Model/resource.py (ProjFileReader.start_projection)
3218     (ProjFileReader.end_projection, ProjFileSaver.write_projfile):
3219     Handle the epsg code attribute when reading or writing proj files
3220    
3221     * Thuban/UI/projdialog.py (ProjFrame._OnSave)
3222     (ProjFrame._OnAddToList, ProjFrame.__DoOnProjAvail)
3223     (ProjFrame.__FillAvailList): Use the projection's Label method to
3224     get the string for the list box
3225    
3226     * test/test_proj.py (TestProjection.test_label)
3227     (TestProjection.test_label_epsg)
3228     (TestProjection.test_epsgcode_for_non_epsg_projection)
3229     (TestProjection.test_epsgcode_for_real_epsg_projection): New tests
3230     for the label and EPSGCode methods
3231     (WriteProjFileTests.doTestWrite, WriteProjFileTests.test_write)
3232     (WriteProjFileTests.test_write_empty_file): Create the ProjFile
3233     objects in the test cases and put the expected contents into the
3234     test case methods too. Update doTestWrite accordingly
3235     (TestLoadingProjFile)
3236     (TestLoadingProjFileWithEmptyProjectionlist): New classes with the
3237     read tests from TestProjFile.
3238     (TestProjFile.doTestRead, TestProjFile.testRead): Removed. These
3239     tests are now in the new classes.
3240     (sample_projfile, sample_projfile_data)
3241     (sample_projfile2, sample_projfile_data2): Removed. Not used
3242     anymore.
3243     (TestProjFile.test_read_unreadable_file): No need to reset the
3244     permissions at the end anymore since we use a unique filename
3245    
3246     2003-10-13 Bernhard Herzog <[email protected]>
3247    
3248 bh 1814 * test/test_proj.py: Some more refactoring of the test cases
3249     (ProjFileTest): New base class for the proj file tests.
3250     (TestProjFile): Derive from ProjFileTest
3251     (TestProjFile.test_read_unreadable_file)
3252     (TestProjFile.test_read_empty_file, TestProjFile.doTestRead): Use
3253     the new filename method to get a unique filename
3254     (TestProjFile.doTestWrite, TestProjFile.testWrite): Removed.
3255     (WriteProjFileTests): New class for proj file write tests.
3256     Contains the write test that were in TestProjFile originally.
3257    
3258     2003-10-13 Bernhard Herzog <[email protected]>
3259    
3260 bh 1812 * test/test_proj.py (TestProjFile.testRead)
3261     (TestProjFile.test_read_non_existing_file)
3262     (TestProjFile.test_read_unreadable_file)
3263     (TestProjFile.test_read_empty_file): Split into several methods.
3264    
3265 bh 1805 2003-10-10 Bernhard Herzog <[email protected]>
3266    
3267 bh 1810 * Thuban/UI/sizers.py: New file with custom sizers.
3268    
3269     * Thuban/UI/projdialog.py (ProjFrame.build_dialog): Instantiate
3270     all projection type specific panels and put them into a
3271     NotebookLikeSizer. This way the dialog doesn't change its size
3272     when a different projection is selected
3273     (ProjFrame.__init__): Rename projection_panels
3274     projection_panel_defs and reuse projection_panels for a list of
3275     the instantiated panels.
3276     (ProjFrame._show_proj_panel, ProjFrame.__DoOnProjAvail)
3277     (ProjFrame.__DoOnProjChoice): Changes due to the new handling of
3278     the panels
3279     (UnknownProjPanel._DoLayout): Place the newlines in the message
3280     differently to make the panel narrower.
3281     (TMPanel._DoLayout): Layout the parameters in one column.
3282    
3283     2003-10-10 Bernhard Herzog <[email protected]>
3284    
3285 bh 1807 * Thuban/UI/projdialog.py (ProjFrame.build_dialog): New method
3286     that contains all the setup for the dialog's widgets, layout and
3287     event handling.
3288     (__): Call build_dialog to build the dialog.
3289     (ProjFrame.__set_properties, ProjFrame.__do_layout): Removed.
3290     Their functionality is now in build_dialog
3291     (ProjFrame.__VerifyButtons, ProjFrame.__VerifyButtons)
3292     (ProjFrame.__DoOnProjAvail, ProjFrame.__DoOnProjAvail)
3293     (ProjFrame.__DoOnProjChoice): Small updates due to slightly
3294     different widget names and hierarchy introduced with build_dialog.
3295    
3296     2003-10-10 Bernhard Herzog <[email protected]>
3297    
3298 bh 1805 * README: Fix typo.
3299    
3300 bh 1803 2003-10-09 Bernhard Herzog <[email protected]>
3301    
3302     * Thuban/Model/proj.py (ProjFile.Add): Do not check whether the
3303     projection is already in the list. This is *a lot* faster when
3304     loading files with hundreds of projections since it saves a linear
3305     search. OTOH this will allow adding the same projection to the
3306     user.proj file multiple times in the projection dialog but we'll
3307     deal with that later
3308    
3309 jan 1801 2003-10-09 Jan-Oliver Wagner <[email protected]>
3310    
3311     * devtools: New. Directory for developer tools that are not intended
3312     for the regular user.
3313    
3314     * devtools/create_epsg.py: New. Convert the epsg file of proj into
3315     a python .proj file.
3316    
3317 bh 1799 2003-10-09 Bernhard Herzog <[email protected]>
3318    
3319     * test/test_proj.py
3320     (TestProjection.test_get_parameter_without_equals_sign): New. Test
3321     whether GetParameter handles parameters without "=" sign correctly
3322    
3323     * Thuban/Model/proj.py (Projection.GetParameter): Handle
3324     parameters that do not contain a "=". Update the doc-string
3325    
3326 bh 1794 2003-10-08 Bernhard Herzog <[email protected]>
3327    
3328 bh 1796 * Thuban/UI/projdialog.py (ProjFrame.__set_properties): Remove the
3329     length limit on the projname text control
3330    
3331     2003-10-08 Bernhard Herzog <[email protected]>
3332    
3333 bh 1794 * test/test_proj.py (TestProjection.test_get_projection_units_geo)
3334     (TestProjection.test_get_projection_units_normal): New. Tests for
3335     the Projection.GetProjectedUnits method
3336    
3337 jan 1792 2003-10-08 Jan-Oliver Wagner <[email protected]>
3338    
3339     * Thuban/Model/resource.py (get_user_proj_file): small bug-fix:
3340     Added missing 'val' parameter.
3341    
3342 bh 1788 2003-10-08 Bernhard Herzog <[email protected]>
3343    
3344 bh 1790 * Thuban/UI/projdialog.py (ProjFrame.__DoOnProjAvail): When the
3345     projection type of the currently selected projection is not known,
3346     i.e. there's no panel for it, use the UnknownProjPanel
3347     (ProjFrame.__DoOnProjChoice, ProjFrame._show_proj_panel): Split
3348     the actual replacing of the proj panel into the new method
3349     _show_proj_panel.
3350     (UnknownProjPanel): Add doc-string.
3351     (UnknownProjPanel._DoLayout): Insert a newline into the text so
3352     that the panel is not so wide.
3353    
3354     2003-10-08 Bernhard Herzog <[email protected]>
3355    
3356 bh 1788 * Thuban/Model/resource.py (read_proj_file): Return the warnings
3357     too. Update the doc-string
3358     (get_proj_files): Removed. It wasn't used anywhere
3359     (get_system_proj_files, get_system_proj_file): Rename to
3360     get_system_proj_file and return the ProjFile object and not a list
3361     of ProjFile objects. Update the callers.
3362     (get_user_proj_files, get_user_proj_file): Rename to
3363     get_user_proj_file return the ProjFile object and not a list of
3364     ProjFile objects. Update the callers.
3365     (ProjFileReader.__init__): New instance variable for the warnings.
3366     Rename the __pf ivar to projfile. Update the methods referring to
3367     __pf
3368     (ProjFileReader.end_projection): Catch any errors raised when
3369     instantiating the projection and record that as an error. The
3370     projection will not be in the final ProjFile object.
3371     (ProjFileReader.GetWarnings): New method to return the warnings.
3372    
3373     * Thuban/UI/projdialog.py (ProjFrame.show_warnings): New method to
3374     show the warnings from the projfile reader
3375     (ProjFrame._OnImport): Deal with any warnings returned by
3376     read_proj_file
3377     (ProjFrame.__FillAvailList): Deal with any warnings returned by
3378     get_system_proj_file or get_user_proj_file.
3379    
3380     * test/test_proj.py (TestProjFile.doTestRead): Check the warnings.
3381     (TestProjFileWithInvalidParameters.file_contents): New test cases
3382     to test whether read_proj_file handles invalid projection
3383     parameters correctly
3384     (TestProjFile.test_get_system_proj_file): New. Simple test for
3385     resource.get_system_proj_file
3386    
3387 bh 1785 2003-10-07 Bernhard Herzog <[email protected]>
3388    
3389     * test/test_derivedshapestore.py
3390     (TestDerivedShapeStoreExceptions.tearDown): Clear the session
3391     properly so that the temporary directories get deleted correctly
3392    
3393 bh 1773 2003-10-06 Bernhard Herzog <[email protected]>
3394    
3395 bh 1783 Handle the title changes in a proper MVC way.
3396    
3397     * Thuban/UI/mainwindow.py (MainWindow.__init__): Subscribe to the
3398     canvas' TITLE_CHANGED messages
3399     (MainWindow.update_title): New. Update the main window's title
3400     (MainWindow.__SetTitle): Removed. Use update_title instead.
3401     (MainWindow.SetMap): Use update_title instead of __SetTitle
3402     (MainWindow.RenameMap): Do change the window title explicitly
3403     here. That's handled in a proper MVC way now.
3404     (MainWindow.title_changed): New. Subscriber for the TITLE_CHANGED
3405     messages
3406    
3407     * Thuban/Lib/connector.py (Conduit): New class to help classes
3408     that forward messages
3409    
3410     * Thuban/UI/viewport.py: Forward the map's TITLE_CHANGED messages
3411     (ViewPort): Derive from Conduit instead of Publisher
3412     (ViewPort.Subscribe, ViewPort.Unsubscribe): Use the new base class
3413     when calling the inherited versions
3414     (ViewPort._subscribe_map, ViewPort._unsubscribe_map): New helper
3415     methods to subscribe and unsubscribe map messages
3416     (ViewPort.SetMap, ViewPort.Destroy): Use the new helper methods to
3417     handle the map subscriptions
3418     (ViewPort.Map, ViewPort.map_projection_changed)
3419     (ViewPort.layer_projection_changed): Add or update doc-strings
3420    
3421     * test/test_connector.py (TestPublisher.test_issue_simple): Fix
3422     typo
3423     (MyConduit): Helper class for the Conduit test.
3424     (TestConduit): Test cases for Conduit
3425    
3426     * test/test_connector.py: Use support.run_tests as main.
3427    
3428     * test/test_viewport.py (ViewPortTest.setUp): Also subscribe to
3429     the TITLE_CHANGED messages
3430     (ViewPortTest.test_forwarding_title_changed): New test to check
3431     whether the viewport forwards the map's TITLE_CHANGED messages
3432     (TestViewportWithPostGIS.tearDown): Call the map's Destroy method
3433     after the port's because the latter may require a still functional
3434     map.
3435    
3436     2003-10-06 Bernhard Herzog <[email protected]>
3437    
3438 bh 1777 * Thuban/UI/application.py (ThubanApplication.maps_changed): Add
3439     doc-string
3440    
3441     2003-10-06 Bernhard Herzog <[email protected]>
3442    
3443 bh 1775 * test/test_viewport.py (ViewPortTest.setUp)
3444     (SimpleViewPortTest.test_init_with_size): Move the test for the
3445     initial size as a constructor parameter from ViewPortTest.setUp
3446     method to a new separate test in SimpleViewPortTest.
3447    
3448     2003-10-06 Bernhard Herzog <[email protected]>
3449    
3450 bh 1773 * test/test_viewport.py (MockView): New class derived from
3451     ViewPort with a mock implementation of GetTextExtent to be used in
3452     the test cases
3453     (ViewPortTest.setUp): Use MockView instead of ViewPort
3454    
3455     * Thuban/UI/viewport.py (ViewPort.GetTextExtent): Turn this method
3456     into what would be a "pure virtual function" in C++: always raise
3457     NotImplementedError. Mock implementations for test cases don't
3458     belong into the real code
3459    
3460 bh 1770 2003-10-02 Bernhard Herzog <[email protected]>
3461    
3462     * test/test_layer.py (TestLayer.test_empty_layer): Explicitly
3463     close the dbf file we create so that it's contents have been
3464     written properly.
3465    
3466     * libraries/shapelib/shptree.c, libraries/shapelib/shpopen.c,
3467     libraries/shapelib/shapefil.h, libraries/shapelib/dbfopen.c:
3468     Update to shapelib 1.2.10
3469    
3470 jan 1767 2003-10-01 Jan-Oliver Wagner <[email protected]>
3471    
3472     * Thuban/UI/tree.py, Thuban/UI/main.py: Remove the #! line as
3473     it annoys lintian which warns about these files not being
3474     executable. The #! isn't necessary here since if you absolutely
3475     must execute them you can always say "python <filename>".
3476    
3477 bh 1757 2003-09-26 Bernhard Herzog <[email protected]>
3478    
3479 bh 1760 * Thuban/Model/classgen.py (GenQuantiles0): Removed since it's
3480     only used in GREAT-ER but not used in Thuban itself. When GREAT-ER
3481     is ported to a newer the import will fail, so it should be noticed
3482     immediately that this function is gone.
3483     Fixes RT#1919
3484    
3485     2003-09-26 Bernhard Herzog <[email protected]>
3486    
3487 bh 1757 Add a DTD for the projection files and make thuban write valid
3488     projection files
3489    
3490     * Resources/XML/projfile.dtd: New. DTD for thuban's projection
3491     files
3492    
3493     * Thuban/Model/resource.py (ProjFileSaver.write): Use
3494     'projectionlist' as the name in the document type declaration so
3495     that it matches the element type of the root element.
3496    
3497     * test/test_proj.py (sample_projfile, sample_projfile2): Use
3498     'projectionlist' as the name in the document type declaration just
3499     as it is done now in the files thuban would write
3500     (sample_projfile, sample_projfile_data): Fix spelling of
3501     "Mercator"
3502     (TestProjFile.doTestWrite): Validate the written and the expected
3503     XML data
3504     (TestProjFile): Derive from ValidationTest so that we can run xml
3505     validation tests
3506    
3507 bh 1751 2003-09-24 Bernhard Herzog <[email protected]>
3508    
3509     * Thuban/UI/renderer.py (ExportRenderer.render_legend): Do not
3510     modify the list returned by map.Layers() in place since it is the
3511     actual list of layers used by the map.
3512    
3513 jan 1745 2003-09-23 Jan-Oliver Wagner <[email protected]>
3514    
3515     * Doc/manual/thuban-manual.xml: Added subsection to chapter
3516     Extensions to describe the extensions coming with the Thuban
3517     standard package (gns2shp and importAPR).
3518    
3519 bh 1743 2003-09-23 Bernhard Herzog <[email protected]>
3520    
3521     * libraries/thuban/wxproj.cpp (project_point): if there's an
3522     inverse but no forward projection, convert to degrees after
3523     applying the inverse projection. Fixes RT#2096
3524    
3525     * test/test_wxproj.py: New. Test cases for wxproj.so. One test
3526     implicitly tests for the fix to RT#2096
3527    
3528     * test/support.py (FloatComparisonMixin.assertFloatSeqEqual):
3529     Check that the sequences have the same lengths
3530    
3531     * Resources/Projections/defaults.proj (Geographic projection): Use
3532     a much more precise value for the to_meter attribute.
3533    
3534 bh 1737 2003-09-22 Bernhard Herzog <[email protected]>
3535    
3536     * test/support.py (initthuban): Make sure to unset the LANG env.
3537     var. so that tests that compare translated strings work. Solves RT
3538     #2094
3539    
3540 jan 1730 2003-09-22 Jan-Oliver Wagner <[email protected]>
3541    
3542 jan 1735 Small improvement of APR import.
3543    
3544     * Extensions/importAPR/test/test_apr.py (aprTest.test_LClass):
3545     Added tests for text-ranges.
3546    
3547     * Extensions/importAPR/apr.py (APR_LClass.GetThubanRange): Now
3548     returns a string object if the range is based on text.
3549    
3550     * Extensions/importAPR/importAPR.py (import_apr_dialog): Unified
3551     range retrieval.
3552    
3553     2003-09-22 Jan-Oliver Wagner <[email protected]>
3554    
3555 jan 1730 Initial version of the importAPR extension which is in
3556     experimental state.
3557    
3558     * /Extensions/importAPR/, /Extensions/importAPR/samples/,
3559     /Extensions/importAPR/test/: New directories.
3560    
3561     * /Extensions/importAPR/samples/README: New: Howto load the samples.
3562    
3563     * /Extensions/importAPR/samples/iceland.apr: New: A sample APR
3564     file which refers to the Thuban Iceland demo data.
3565    
3566     * /Extensions/importAPR/test/README: New: Howto execute the tests.
3567    
3568     * /Extensions/importAPR/test/test_apr.py: New: Tests for APR classes.
3569    
3570     * /Extensions/importAPR/apr.py: New: Classes for ArcView Objects
3571     as in '.apr'-files.
3572    
3573     * /Extensions/importAPR/odb.py: New: Classes for generic ArcView
3574     ODB Objects as in '.apr', '.avl' and other files.
3575    
3576     * /Extensions/importAPR/__init__.py: New: Init to make this
3577     directory a package.
3578    
3579     * /Extensions/importAPR/importAPR.py: New: Import a ArcView
3580     project file (.apr) and convert it to Thuban.
3581    
3582     2003-09-22 Jan-Oliver Wagner <[email protected]>
3583    
3584     * Extensions/gns2shp.gns2shp.py: The main module of gns2shp.
3585    
3586 jan 1720 2003-09-19 Jan-Oliver Wagner <[email protected]>
3587    
3588     * Doc/manual/thuban-manual.xml: Extended section 'Installation'
3589     with description on RPM installation and RPM binary package
3590     creation.
3591    
3592 bh 1718 2003-09-18 Bernhard Herzog <[email protected]>
3593    
3594     * setup.py (data_files): Only add the mo files if the Locales
3595     directory actually exists, so that setup.py works with a fresh CVS
3596     checkout
3597    
3598 jan 1716 2003-09-12 Jan-Oliver Wagner <[email protected]>
3599    
3600     * Examples/simple_extensions/simple_tool.py: bugfix: Tool is now
3601     in viewport, not anymore in view
3602    
3603 jan 1714 2003-09-04 Jan-Oliver Wagner <[email protected]>
3604    
3605     Introducing first Extension (gns2shp).
3606    
3607     * Extensions, Extensions/gns2shp, Extensions/gns2shp/test: New.
3608    
3609     * Extensions/__init__.py: New. init to make this dir a package.
3610    
3611     * Extensions/gns2shp/__init__.py: New. init to make this dir a package.
3612    
3613     * Extensions/gns2shp/test/README: New. some info on this test directory.
3614    
3615     * Extensions/gns2shp/test/ls.txt: New. test data set (Liechtenstein).
3616    
3617     * Extensions/gns2shp/test/test_gns2shp.py: New. Test for correct creation
3618     of Shapefile from GNS text file format
3619    
3620 jan 1705 2003-09-03 Jan-Oliver Wagner <[email protected]>
3621    
3622 jan 1707 Fix/workaround for bug #2019:
3623     https://intevation.de/rt/webrt?serial_num=2019
3624    
3625     * Thuban/UI/identifyview.py (IdentifyView.ID_STOP): New.
3626     (IdentifyView.__init__): Added another button that allows to
3627     stop the identify mode.
3628     (IdentifyView.OnStop): New. Stops the identify mode.
3629    
3630     2003-09-03 Jan-Oliver Wagner <[email protected]>
3631    
3632 jan 1705 Introducing a new exception dialog that allows to exit the
3633     application immediately.
3634     This fixes bug #2060: https://intevation.de/rt/webrt?serial_num=2060
3635    
3636     * Thuban/UI/exceptiondialog.py: New. A special exception dialog.
3637    
3638     * Thuban/UI/application.py (ThubanApplication.ShowExceptionDialog):
3639     Made strings available to translations. Exchanged the simple
3640     ScrolledMessageDialog by the new ExceptionDialog.
3641    
3642 bh 1694 2003-09-01 Bernhard Herzog <[email protected]>
3643    
3644 bh 1701 * NEWS: New. Summary of changes and release notes.
3645    
3646     * MANIFEST.in: Add NEWS
3647    
3648     2003-09-01 Bernhard Herzog <[email protected]>
3649    
3650 bh 1699 * MANIFEST.in: Correct the include statement for the mo-files and
3651     include the documentation too.
3652    
3653     * setup.py (data_files): Add the .mo files
3654     (setup call): Up to version 0.9.0
3655    
3656     2003-09-01 Bernhard Herzog <[email protected]>
3657    
3658 bh 1696 * Thuban/UI/dbdialog.py (ChooseDBTableDialog.__init__): Change the
3659     parameter list to just parent and session
3660     (ChooseDBTableDialog.__set_properties): Removed. Setting the
3661     selection of empty list boxes is not allowed (and produces C++
3662     assertion errors) and the rest of the setup is better done in
3663     __init__ anyway.
3664     (ChooseDBTableDialog.OnCancel, ChooseDBTableDialog.OnOK)
3665     (ChooseDBTableDialog.OnLBDClick, DBDialog.OnOK): Use the Python
3666     builtins True/False for booleans to avoid warnings from wxPython
3667    
3668     * Thuban/UI/mainwindow.py (MainWindow.AddDBLayer): Adapt to new
3669     ChooseDBTableDialog constructor parameters.
3670    
3671     2003-09-01 Bernhard Herzog <[email protected]>
3672    
3673 bh 1694 * Thuban/Model/postgisdb.py
3674     (PostGISTable): Extend doc-string
3675     (PostGISTable._fetch_table_information): Set the column index
3676     correctly, pretending ignored columns don't exist.
3677    
3678     * test/test_postgis_db.py (TestPostGISIgnoredColumns): New tests
3679     for postgis tables with data types not yet supported by thuban.
3680    
3681 bh 1692 2003-08-29 Bernhard Herzog <[email protected]>
3682    
3683     * HOWTO-Release: Tweak item about running the tests.
3684    
3685 jan 1690 2003-08-29 Jan-Oliver Wagner <[email protected]>
3686    
3687     * /Doc/manual/thuban-manual.xml: updated to version 1.0pre2.
3688    
3689 bh 1688 2003-08-29 Bernhard Herzog <[email protected]>
3690    
3691     Add some missing parameters to projections. Proj complains about
3692     them on windows but for some reason not on Linux.
3693    
3694     * test/test_save.py (SaveSessionTest.testLayerProjection): Add
3695     missing required projection parameters
3696    
3697     * test/test_proj.py (TestProjFile.test): Add missing required
3698     projection parameters
3699    
3700     * test/test_load_0_8.py (TestLayerProjection.file_contents)
3701     (TestLayerProjection.test): Add missing required projection
3702     parameters and tests for them
3703    
3704     * test/test_load.py (TestLayerProjection.file_contents)
3705     (TestLayerProjection.test): Add missing required projection
3706     parameters and tests for them
3707    
3708     * test/test_layer.py (TestLayer.test_base_layer): Add missing
3709     required projection parameters
3710    
3711     2003-08-29 Bernhard Herzog <[email protected]>
3712    
3713     * libraries/pyprojection/Projection.i: Use pj_get_errno_ref to
3714     access the pj_errno because directly accessing pj_errno doesn't
3715     work on windows if the proj library is in a DLL
3716    
3717     * libraries/pyprojection/Projection_wrap.c: Update from Projection.i
3718    
3719 bh 1672 2003-08-28 Bernhard Herzog <[email protected]>
3720    
3721 bh 1685 * test/test_proj.py: Import things from Thuban after calling
3722     initthuban
3723    
3724     * test/test_load.py (LoadSessionTest.filenames): New class
3725     variable with the filename attributes to normalize
3726     (LoadSessionTest.check_format): Pass self.filenames to
3727     sax_eventlist to normalize the filename attributes
3728    
3729     * test/xmlsupport.py: Add cvs keywords
3730     (SaxEventLister.__init__): New parameter filenames which indicates
3731     attributes that contain filenames
3732     (SaxEventLister.startElementNS): Normalize the filename attributes
3733     with os.path.normpath
3734     (sax_eventlist): New parameter filenames to pass through to
3735     SaxEventLister
3736    
3737     * test/test_derivedshapestore.py: Make this file callable as a
3738     program to execute the tests
3739     (TestDerivedShapeStoreExceptions.test_table_with_wrong_size): Bind
3740     the session to self.session so that it gets destroyed properly
3741    
3742     * test/test_layer.py (TestLayer.tearDown): Call the session's
3743     Destroy method
3744    
3745     * test/test_map.py (TestMapBase.tearDown): Destroy self.session
3746     too if it exists
3747     (TestMapAddLayer.test_add_layer): Bind the session to self.session
3748     so that it gets destroyed properly
3749    
3750     * test/postgissupport.py (reason_for_not_running_tests): Add a
3751     test for the existence of popen2.Popen4.
3752    
3753     * test/test_save.py (SaveSessionTest.tearDown): New. Provide a
3754     reliable way to destroy the sessions created in the test cases
3755     (SaveSessionTest.test_dbf_table): Bind the session to self.session
3756     so that it gets destroyed properly
3757     (SaveSessionTest.testLayerProjection): Bind the session to
3758     self.session so that it gets destroyed properly
3759    
3760     * test/test_session.py (UnreferencedTablesTests.tearDown): Make
3761     sure that the session is destroyed properly
3762    
3763     * test/test_shapefilestore.py: Make this callable as a program to
3764     execute the tests
3765    
3766     * test/test_scalebar.py: Remove unnecessary import of _ from
3767     Thuban
3768    
3769     * test/support.py (print_garbage_information): Call initthuban
3770     here because it may be called indirectly from test cases that test
3771     test support modules which do not use anything from thuban itself
3772     (ThubanTestProgram.runTests): Remove unnecessary debug print
3773    
3774     2003-08-28 Bernhard Herzog <[email protected]>
3775    
3776 bh 1672 * Thuban/version.py (longversion): Update to 0.9
3777    
3778     * Thuban/UI/mainwindow.py: Remove some unused imports
3779    
3780     * README: Add section about required additional software. Add date
3781     and revision CVS keywords
3782    
3783     * HOWTO-Release: Add item about the translations. Add date and
3784     revision CVs keywords and change formatting to match README a bit
3785     better
3786    
3787     * po/de.po: Update for 0.9
3788    
3789     * test/README: Tweak the wording a little because many tests are
3790     not really unittest.
3791    
3792 bh 1663 2003-08-27 Bernhard Herzog <[email protected]>
3793    
3794 bh 1665 As preparation for the 0.9 release, switch thuban files to a
3795     non-dev namespace
3796    
3797     * Thuban/Model/save.py (SessionSaver.write_session): Write files
3798     with the http://thuban.intevation.org/dtds/thuban-0.9.dtd
3799     namespace
3800    
3801     * Thuban/Model/load.py (SessionLoader.__init__): Accept the
3802     http://thuban.intevation.org/dtds/thuban-0.9.dtd namespace too
3803    
3804     * test/test_save.py (SaveSessionTest.dtd)
3805     (SaveSessionTest.testEmptySession)
3806     (SaveSessionTest.testSingleLayer)
3807     (SaveSessionTest.testLayerProjection)
3808     (SaveSessionTest.testRasterLayer)
3809     (SaveSessionTest.testClassifiedLayer)
3810     (SaveSessionTest.test_dbf_table)
3811     (SaveSessionTest.test_joined_table)
3812     (SaveSessionTest.test_save_postgis): Update for new namespace
3813    
3814     * test/test_load.py (LoadSessionTest.dtd, TestSingleLayer)
3815     (TestLayerVisibility.file_contents, TestLabels.file_contents)
3816     (TestLayerProjection.file_contents)
3817     (TestRasterLayer.file_contents, TestJoinedTable.file_contents)
3818     (TestPostGISLayer.file_contents)
3819     (TestPostGISLayerPassword.file_contents)
3820     (TestLoadError.file_contents, TestLoadError.test): Update for new
3821     namespace
3822    
3823     2003-08-27 Bernhard Herzog <[email protected]>
3824    
3825 bh 1663 Make the table interface distinguish between row ids (an integer
3826     that uniquely identifies a row) and row ordinals (a simple row
3827     count from 0 to NumRows() - 1)
3828    
3829     * Thuban/Model/postgisdb.py (PostGISTable.RowIdToOrdinal)
3830     (PostGISTable.RowOrdinalToId): New methods to conver between row
3831     ids and row ordinals
3832     (PostGISTable.ReadRowAsDict, PostGISTable.ReadValue): New keyword
3833     parameter row_is_ordinal to indicate whether the row parameter is
3834     the row id or the ordinal
3835    
3836     * Thuban/Model/transientdb.py (TransientTableBase.RowIdToOrdinal)
3837     (TransientTableBase.RowOrdinalToId)
3838     (AutoTransientTable.RowIdToOrdinal)
3839     (AutoTransientTable.RowOrdinalToId): Same new methods as in
3840     PostGISTable.
3841     (TransientTableBase.ReadRowAsDict, TransientTableBase.ReadValue)
3842     (AutoTransientTable.ReadRowAsDict, AutoTransientTable.ReadValue):
3843     Same new parameter as in PostGISTable.
3844    
3845     * Thuban/Model/table.py (DBFTable.RowIdToOrdinal)
3846     (DBFTable.RowOrdinalToId, MemoryTable.RowIdToOrdinal)
3847     (MemoryTable.RowOrdinalToId): Same new methods as in PostGISTable.
3848     (DBFTable.ReadValue, DBFTable.ReadRowAsDict)
3849     (MemoryTable.ReadValue, MemoryTable.ReadRowAsDict): Same new
3850     parameter as in PostGISTable.
3851    
3852     * Thuban/UI/tableview.py (DataTable.RowIdToOrdinal)
3853     (DataTable.RowOrdinalToId): New methods to convert between row ids
3854     and row ordinals.
3855     (TableGrid.SelectRowById): New method to select a row based on its
3856     ID as opposed to its ordinal
3857     (DataTable.GetValue, TableGrid.OnRangeSelect)
3858     (TableGrid.OnSelectCell, LayerTableGrid.select_shapes)
3859     (QueryTableFrame.OnQuery, QueryTableFrame.get_selected)
3860     (LayerTableFrame.__init__): Convert between row ids and row
3861     ordinals as appropriate
3862    
3863     * test/postgissupport.py (PostGISDatabase.__init__): Add
3864     doc-string.
3865     (PostGISDatabase.initdb): The optional third item in a tuple in
3866     tables is now a (key, value) list with additional arguments to
3867     pass to upload_shapefile
3868     (upload_shapefile): New parameter gid_offset to allow gids that
3869     are not the same as the shapeids in the shapefile
3870     (PostgreSQLServer.get_default_static_data_db): Use the new
3871     gid_offset to make the gids in landmarks 1000 higher than the
3872     shapeids in the shapefile
3873    
3874     * test/test_viewport.py
3875     (TestViewportWithPostGIS.test_find_shape_at_point): Adapt to the
3876     new shapeids in the landmarks table
3877    
3878     * test/test_transientdb.py
3879     (TestTransientTable.run_iceland_political_tests)
3880     (TestTransientTable.test_transient_joined_table): Add tests for
3881     the new table methods and new keywords arguments.
3882    
3883     * test/test_postgis_db.py
3884     (TestPostGISTable.test_read_row_as_dict_row_count_mode)
3885     (TestPostGISTable.test_read_value_row_count_mode)
3886     (TestPostGISTable.test_row_id_to_ordinal)
3887     (TestPostGISTable.test_row_oridnal_to_id): New test for the new
3888     table methods and the new arguments
3889     (TestPostGISShapestorePoint.test_shapes_in_region)
3890     (TestPostGISShapestorePoint.test_shape_raw_data)
3891     (TestPostGISShapestorePoint.test_shape_points)
3892     (TestPostGISShapestorePoint.test_shape_shapeid)
3893     (TestPostGISShapestorePoint.test_all_shapes)
3894     (TestPostGISTable.test_simple_query)
3895     (TestPostGISTable.test_simple_query)
3896     (TestPostGISTable.test_simple_query)
3897     (TestPostGISTable.test_read_value)
3898     (TestPostGISTable.test_read_row_as_dict): Adapt to the new
3899     shapeids in the landmarks table
3900    
3901     * test/test_memory_table.py
3902     (TestMemoryTable.test_read_row_as_dict_row_count_mode)
3903     (TestMemoryTable.test_read_value_row_count_mode)
3904     (TestMemoryTable.test_row_id_to_ordinal)
3905     (TestMemoryTable.test_row_oridnal_to_id): New test for the new
3906     table methods and the new arguments
3907    
3908     * test/test_dbf_table.py
3909     (TestDBFTable.test_read_row_as_dict_row_count_mode)
3910     (TestDBFTable.test_read_value_row_count_mode)
3911     (TestDBFTable.test_row_id_to_ordinal)
3912     (TestDBFTable.test_row_oridnal_to_id): New test for the new table
3913     methods and the new arguments
3914    
3915 bh 1659 2003-08-26 Bernhard Herzog <[email protected]>
3916    
3917 bh 1661 * Thuban/Model/postgisdb.py (PostGISShapeStore.BoundingBox): Use a
3918     more postgis specific but much faster method to get the bounding
3919     box
3920    
3921     2003-08-26 Bernhard Herzog <[email protected]>
3922    
3923 bh 1659 * Thuban/Model/postgisdb.py (PostGISTable.Title)
3924     (PostGISShapeStore.AllShapes): Add these missing methods.
3925     (PostGISShapeStore.ShapesInRegion): No need to raise
3926     StopIteration. We can simply return
3927    
3928     * test/test_postgis_db.py (TestPostGISTable.test_title)
3929     (TestPostGISShapestorePoint.test_all_shapes): New tests for the
3930     new methods
3931    
3932 bh 1643 2003-08-25 Bernhard Herzog <[email protected]>
3933    
3934 bh 1657 * Thuban/Model/postgisdb.py (shapetype_map): Add MUTLIPOLYGON.
3935    
3936     * test/test_postgis_db.py (PolygonTests): New class containing
3937     those tests from TestPostGISShapestorePolygon that can also be
3938     used to test MUTLIPOLYGON tables
3939     (TestPostGISShapestorePolygon): Most tests are now in PolygonTests
3940     so derive from that
3941     (TestPostGISShapestoreMultiPolygon): New class with tests for
3942     MUTLIPOLYGON tables
3943    
3944     * test/postgissupport.py (PostGISDatabase.initdb): Allow the
3945     tables argument to have tuples with three items to override the
3946     WKT type used.
3947     (PostgreSQLServer.get_default_static_data_db): Use the above to
3948     create a polygon table with MUTLIPOLYGONs
3949     (point_to_wkt, coords_to_point, polygon_to_wkt, coords_to_polygon)
3950     (arc_to_wkt, coords_to_multilinestring): Rename from *_to_wkt to
3951     coords_to*
3952     (coords_to_multipolygon): New. Convert to MUTLIPOLYGON
3953     (wkt_converter): New. Map WKT types to converters
3954     (upload_shapefile): New parameter force_wkt_type to use a
3955     different WKT type than the default
3956    
3957     2003-08-25 Bernhard Herzog <[email protected]>
3958    
3959 bh 1655 * Thuban/UI/application.py
3960     (ThubanApplication.run_db_param_dialog): New. Suitable as a
3961     db_connection_callback. Main difference is that the dialog run
3962     from this method doesn't have a parent so it can be used even when
3963     there is no main window
3964     (ThubanApplication.OpenSession): Use self.run_db_param_dialog if
3965     no db_connection_callback was given. This way the dialog pops up
3966     even when the .thuban file was given as a command line parameter.
3967    
3968     2003-08-25 Bernhard Herzog <[email protected]>
3969    
3970 bh 1653 * Thuban/UI/view.py (MapCanvas.OnLeftUp): Release the the mouse
3971     before calling MouseLeftUp. MouseLeftUp may pop up modal dialogs
3972     which leads to an effectively frozen X session because the user
3973     can only interact with the dialog but the mouse is still grabbed
3974     by the canvas.
3975     Also, call the tool's Hide method before MouseLeftUp because
3976     MouseLeftUp may change the tool's coordinates.
3977    
3978     2003-08-25 Bernhard Herzog <[email protected]>
3979    
3980 bh 1651 * Thuban/UI/application.py (ThubanApplication.OpenSession): Catch
3981     LoadCancelled exceptions and handle them by returning immediately.
3982    
3983     2003-08-25 Bernhard Herzog <[email protected]>
3984    
3985 bh 1649 GUI part of loading sessions with postgis connections which may
3986     require user interaction to get passwords or updated parameters
3987    
3988     * Thuban/UI/dbdialog.py (DBDialog): Reimplement to make it look a
3989     bit nucer and be more generic.
3990     (DBFrame.OnAdd): Adapt to new DBDialog interface
3991    
3992     * Thuban/UI/application.py (ThubanApplication.OpenSession): New
3993     optional parameter db_connection_callback which is passed to
3994     load_session.
3995    
3996     * Thuban/UI/mainwindow.py (MainWindow.run_db_param_dialog): New.
3997     Suitable as a db_connection_callback
3998     (MainWindow.OpenSession): Use self.run_db_param_dialog as the
3999     db_connection_callback of the application's OpenSession method
4000    
4001    
4002     2003-08-25 Bernhard Herzog <[email protected]>
4003    
4004 bh 1647 Basic loading of sessions containing postgis connections:
4005    
4006     * Thuban/Model/load.py (LoadError): Add doc-string
4007     (LoadCancelled): New exception class to indicate a cancelled load
4008     (SessionLoader.__init__): Add the db_connection_callback parameter
4009     which will be used by the loader to get updated parameters and a
4010     password for a database connection
4011     (SessionLoader.__init__): Add the new XML elements to the
4012     dispatchers dictionary
4013     (SessionLoader.check_attrs): Two new conversions, ascii to convert
4014     to a byte-string object and idref as a generic id reference
4015     (SessionLoader.start_dbconnection)
4016     (SessionLoader.start_dbshapesource): New. Handlers for the new XML
4017     elements
4018     (load_session): Add the db_connection_callback to pass through the
4019     SessionLoader
4020    
4021     * test/test_load.py (TestPostGISLayer, TestPostGISLayerPassword):
4022     New classes to test loading of sessions with postgis database
4023     connections.
4024    
4025     2003-08-25 Bernhard Herzog <[email protected]>
4026    
4027 bh 1645 * Thuban/UI/mainwindow.py (__ThubanVersion__): Remove this and
4028     replace it and the comment with __BuildDate__ by the Source: and
4029     Id: cvs keywords as used in the other files.
4030    
4031     2003-08-25 Bernhard Herzog <[email protected]>
4032    
4033 bh 1643 * Thuban/Model/load.py (SessionLoader.check_attrs): Raise a
4034     LoadError when a required attribute is missing. The code used to
4035     be commented out for some reason, but probably should have been
4036     active.
4037    
4038     * test/test_load.py (TestLoadError.test): Test the message in the
4039     LoadError too to make sure it really is about the missing
4040     attribute
4041    
4042 bh 1632 2003-08-22 Bernhard Herzog <[email protected]>
4043 bh 1641
4044     * test/test_save.py (SaveSessionTest.test_dbf_table)
4045     (SaveSessionTest.test_joined_table): Add XML validation tests.
4046    
4047     2003-08-22 Bernhard Herzog <[email protected]>
4048    
4049 bh 1639 Implement saving a session with a postgis connection
4050 bh 1632
4051 bh 1639 * Resources/XML/thuban-0.9.dtd (dbconnection, dbshapesource) New
4052     elements for database connections and shapestores using db
4053     connections
4054     (session): Add the dbconnections to the content model
4055    
4056     * Thuban/Model/save.py (SessionSaver.write_db_connections): New.
4057     Write the db connections
4058     (SessionSaver.write_session): Call write_db_connections to write
4059     the connection before the data sources
4060     (SessionSaver.write_data_containers): Handle postgis shapestores
4061    
4062     * test/test_save.py (SaveSessionTest.thubanids)
4063     (SaveSessionTest.thubanidrefs): Update for new DTD
4064     (SaveSessionTest.test_save_postgis): New. Test saving a session
4065     with postgis connections
4066    
4067     * Thuban/Model/postgisdb.py (PostGISTable.DBConnection)
4068     (PostGISTable.TableName): New accessor methods for the connection
4069     and table name
4070    
4071     * test/test_postgis_db.py (TestPostGISTable.test_dbconn)
4072     (TestPostGISTable.test_dbname): New methods to test the new
4073     PostGISConnection methods
4074    
4075     2003-08-22 Bernhard Herzog <[email protected]>
4076    
4077 bh 1637 * Thuban/Model/postgisdb.py (ConnectionError): New exception class
4078     for exceptions occurring when establishing a Database connection
4079     (PostGISConnection.connect): Catch psycopg.OperationalError during
4080     connects and raise ConnectionError.
4081    
4082     * test/test_postgis_db.py (TestPostgisDBExceptions): New class for
4083     tests for database exceptions
4084    
4085     2003-08-22 Bernhard Herzog <[email protected]>
4086    
4087 bh 1635 Prepare the test suite for tests with required authentication
4088    
4089     * test/postgissupport.py (PostgreSQLServer.__init__): Add instance
4090     variables with two predefined users/passwords, one for the admin
4091     and one for a non-privileged user.
4092     (PostgreSQLServer.createdb): Pass the admin name to initdb and add
4093     the non-privileged user to the database and set the admin password
4094     (PostgreSQLServer.wait_for_postmaster): Use the admin user name.
4095     Better error reporting
4096     (PostgreSQLServer.connection_params)
4097     (PostgreSQLServer.connection_string): New methods to return
4098     information about how to connect to the server
4099     (PostgreSQLServer.execute_sql): New. Convenience method to execute
4100     SQL statements
4101     (PostgreSQLServer.require_authentication): Toggle whether the
4102     server requires authentication
4103     (PostgreSQLServer.create_user, PostgreSQLServer.alter_user): New.
4104     Add or alter users
4105     (PostGISDatabase.initdb): Pass the admin name one the
4106     subprocesses' command lines. Grant select rights on
4107     geometry_columns to everybody.
4108     (upload_shapefile): Use the admin name and password when
4109     connecting. Grant select rights on the new table to everybody.
4110    
4111     * test/test_viewport.py (TestViewportWithPostGIS.setUp): Use the
4112     server's new methods to get the connection parameters.
4113    
4114     * test/test_postgis_session.py (TestSessionWithPostGIS.setUp)
4115     (TestSessionWithPostGIS.test_remove_dbconn_exception): Use the
4116     server's new methods to get the connection parameters.
4117    
4118     * test/test_postgis_db.py
4119     (TestPostGISConnection.test_gis_tables_empty)
4120     (TestPostGISConnection.test_gis_tables_non_empty)
4121     (PostGISStaticTests.setUp): Use the server's new methods to get
4122     the connection parameters.
4123    
4124     2003-08-22 Bernhard Herzog <[email protected]>
4125    
4126 bh 1632 * Thuban/UI/about.py (About.__init__): Add the psycopg version.
4127    
4128     * Thuban/version.py: Add psycopg version
4129    
4130     * Thuban/Model/postgisdb.py (psycopg_version): New. Return the
4131     version of the psycopg module
4132    
4133     2003-08-22 Bernhard Herzog <[email protected]>
4134    
4135     * Thuban/UI/dbdialog.py (DBPwdDlg): Removed because it's not used.
4136     (DBFrame.OnEdit): Removed because it's not used and wouldn't work
4137     at the moment. The functionality should probably be implemented
4138     some time, though.
4139 bh 1633 (DBFrame.OnRemove): Display a message if the connection can't be
4140     removed because it's still in use.
4141 bh 1632
4142 jan 1629 2003-08-22 Jan-Oliver Wagner <[email protected]>
4143    
4144     * Thuban/UI/about.py (About.__init__): split up the huge about
4145     text into elements/lists for easier translation. This fixes bug
4146     https://intevation.de/rt/webrt?serial_num=2058
4147     Also, made some forgotten string available for the i18n.
4148    
4149 bh 1627 2003-08-21 Bernhard Herzog <[email protected]>
4150    
4151     Make postgis support really optional including insensitive menu
4152     items.
4153    
4154     * Thuban/Model/postgisdb.py (has_postgis_support): New. Return
4155     whether the postgis is supported.
4156    
4157     * Thuban/UI/dbdialog.py: Put the psycopg import into try..except
4158     to make postgis support optional
4159    
4160     * Thuban/UI/mainwindow.py (_has_postgis_support): New. Context
4161     version of Thuban.Model.postgisdb.has_postgis_support
4162     (database_management command): Make it only sensitive if postgis
4163     is supported.
4164    
4165 jan 1623 2003-08-21 Jan-Oliver Wagner <[email protected]>
4166    
4167 jan 1626 * Doc/manual/thuban-manual.xml: Added CVS revision for rev-history.
4168     (section Adding and Removing Layers): Added text and described
4169     multi-selection.
4170     (chapter Extensions): New.
4171    
4172     2003-08-21 Jan-Oliver Wagner <[email protected]>
4173    
4174 jan 1623 * Thuban/UI/mainwindow.py (MainWindow.AddLayer): Changed dialog
4175     settings to allow multiple files to load into the map.
4176     Also reduced selection to *.shp as a default.
4177    
4178 bh 1621 2003-08-20 Bernhard Herzog <[email protected]>
4179    
4180     Add dialogs and commands to open database connections and add
4181     database layers.
4182    
4183     * Thuban/UI/mainwindow.py (MainWindow.DatabaseManagement): New
4184     method to open the database connection management dialog
4185     (MainWindow.AddDBLayer): New method to add a layer from a database
4186     (_has_dbconnections): New helper function to use for sensitivity
4187     (database_management command, layer_add_db command): New commands
4188     that call the above new methods.
4189     (main_menu): Add the new commands to the menu.
4190    
4191     * Thuban/Model/postgisdb.py (PostGISConnection.__init__)
4192     (PostGISConnection.connect): Establish the actual connection in a
4193     separate method and call it in __init__. This makes it easier to
4194     override the behavior in test cases
4195     (PostGISConnection.BriefDescription): New method to return a brief
4196     description for use in dialogs.
4197    
4198     * test/test_postgis_db.py (NonConnection): DB connection that
4199     doesn't actually connect
4200     (TestBriefDescription): New class with tests for the new
4201     BriefDescription method
4202    
4203 jan 1619 2003-08-19 Jan-Oliver Wagner <[email protected]>
4204    
4205     Moved anything from extensions to libraries.
4206    
4207     * libraries: New.
4208    
4209     * libraries/ pyprojection, pyshapelib, shapelib, thuban: New.
4210    
4211     * libraries/pyprojection/ LICENSE, MANIFEST.in, Projection.i,
4212     Projection.py, Projection_wrap.c, setup.py, swighelp.txt: These files have
4213     been moved here from thuban/extensions/pyprojection/
4214     See there in the Attic for the older history.
4215    
4216     * libraries/pyshapelib/ COPYING, ChangeLog, NEWS, README, dbflib.i,
4217     dbflib.py, dbflib_wrap.c, pyshapelib_api.h, pytest.py, setup.py,
4218     shapelib.i, shapelib.py, shapelib_wrap.c, shptreemodule.c: These files
4219     have been moved here from thuban/extensions/pyshapelib/
4220     See there in the Attic for the older history.
4221    
4222     * libraries/shapelib/ dbfopen.c, shapefil.h, shpopen.c, shptree.c: These
4223     files have been moved here from thuban/extensions/shapelib/
4224     See there in the Attic for the older history.
4225    
4226     * libraries/thuban/ bmpdataset.cpp, cpl_mfile.cpp, cpl_mfile.h,
4227     gdalwarp.cpp, wxproj.cpp: These files have been moved here from
4228     thuban/extensions/thuban/
4229     See there in the Attic for the older history.
4230    
4231     * MANIFEST.in, setup.cfg, setup.py: renamed extensions to libraries.
4232    
4233     * extensions/thuban/ bmpdataset.cpp, cpl_mfile.cpp, cpl_mfile.h,
4234     gdalwarp.cpp, wxproj.cpp: Moved to libraries/thuban.
4235    
4236     * extensions/shapelib/ dbfopen.c, shapefil.h, shpopen.c, shptree.c:
4237     Moved to libraries/shapelib.
4238    
4239     * extensions/pyshapelib/ COPYING, NEWS, dbflib.py, pytest.py,
4240     shapelib.py, README, dbflib_wrap.c, setup.py, shapelib_wrap.c,
4241     ChangeLog, dbflib.i, pyshapelib_api.h, shapelib.i, shptreemodule.c:
4242     Moved to libraries/pyshapelib.
4243    
4244     * extensions/pyprojection/ MANIFEST.in, Projection.py, setup.py,
4245     LICENSE, Projection.i, Projection_wrap.c, swighelp.txt:
4246     Moved to libraries/pyprojection.
4247    
4248     * extensions/ pyprojection, pyshapelib, shapelib, thuban: Removed.
4249    
4250     * extensions: Removed.
4251    
4252 bh 1606 2003-08-19 Bernhard Herzog <[email protected]>
4253    
4254 bh 1609 * test/test_viewport.py (ViewPortTest): We don't use the
4255     facilities of FileTestMixin so don't derive from it.
4256     (TestViewportWithPostGIS): New class with tests for using a
4257     viewport on a map with postgis layers.
4258    
4259     2003-08-19 Bernhard Herzog <[email protected]>
4260    
4261     Add the db connection management to the session.
4262    
4263     * Thuban/Model/session.py (Session.__init__): New instance
4264     variable db_connections
4265     (Session.AddDBConnection, Session.DBConnections)
4266     (Session.HasDBConnections, Session.CanRemoveDBConnection)
4267     (Session.RemoveDBConnection): New methods to manage and query the
4268     db connections managed by the session
4269     (Session.OpenDBShapeStore): New method to open a shapestore from a
4270     db connection
4271    
4272     * Thuban/Model/messages.py (DBCONN_REMOVED, DBCONN_ADDED): New
4273     messages for the db connection handling in the session
4274    
4275     * test/test_postgis_session.py: New. test cases for the session's
4276     db connection handling with postgis connections
4277    
4278     2003-08-19 Bernhard Herzog <[email protected]>
4279    
4280 bh 1606 Add very basic postgis database support and the corresponding test
4281     cases. The test cases require a PostgreSQL + postgis installation
4282     but no existing database. The database will be created
4283     automatically by the test cases
4284    
4285     * test/README: Add note about skipped tests and the requirements
4286     of the postgis tests.
4287    
4288     * Thuban/Model/postgisdb.py: New. Basic postgis database support.
4289    
4290     * test/test_postgis_db.py: New. Test cases for the postgis
4291     support.
4292    
4293     * Thuban/Model/wellknowntext.py: New. Parser for well-known-text
4294     format
4295    
4296     * test/test_wellknowntext.py: New. Test cases for the
4297     wellknowntext parser
4298    
4299     * test/postgissupport.py: New. Support module for tests involving
4300     a postgis database.
4301    
4302     * test/support.py (execute_as_testsuite): Shut down the postmaster
4303     if it's still running after the tests
4304    
4305     * Thuban/Model/data.py (RAW_WKT): New constant for raw data in
4306     well known text format
4307    
4308 jan 1604 2003-08-19 Jan-Oliver Wagner <[email protected]>
4309    
4310     * Examples/simple_extensions/hello_world.py: New. Raises a Hello World
4311     message dialog.
4312    
4313 bh 1600 2003-08-18 Bernhard Herzog <[email protected]>
4314    
4315 bh 1602 * test/support.py (ThubanTestResult.printErrors): Indent the
4316     reason for the skips in the output to make it a bit more readable.
4317     (execute_as_testsuite): New helper function to run a test suite
4318     and print some more information.
4319     (run_tests): Use execute_as_testsuite to run the tests
4320    
4321     * test/runtests.py (main): Use execute_as_testsuite to run the
4322     tests
4323    
4324     2003-08-18 Bernhard Herzog <[email protected]>
4325    
4326 bh 1600 Fix some bugs in Thuban and the test suite that were uncovered by
4327     changes introduced in Python 2.3:
4328    
4329     * Thuban/Model/table.py (DBFTable.__init__): Make sure the
4330     filename is an absolute name
4331    
4332     * Thuban/Model/layer.py (RasterLayer.__init__): Make sure the
4333     filename is an absolute name
4334    
4335     * test/test_save.py (SaveSessionTest.testRasterLayer): Use a
4336     unique filename to save to and use the correct relative filename
4337     in the expected output.
4338     (SaveSessionTest.test_dbf_table): Use the correct relative
4339     filename in the expected output.
4340    
4341     * test/test_layer.py (TestLayer.test_raster_layer): Update the
4342     test to check whether the filename is absolute.
4343    
4344 jan 1596 2003-08-18 Jan-Oliver Wagner <[email protected]>
4345    
4346     * Thuban/UI/about.py (About.__init__): Added Silke Reimer.
4347    
4348 bh 1586 2003-08-15 Bernhard Herzog <[email protected]>
4349    
4350 bh 1594 Change the way shapes are returned by a shape store. The
4351     ShapesInRegion method returns an iterator over actual shape
4352     objects instead of a list of shape ids.
4353    
4354     * Thuban/Model/data.py (ShapefileShape.ShapeID): New. Return shape
4355     id.
4356     (ShapefileStore.ShapesInRegion): Return an iterator over the
4357     shapes which yields shape objects instead of returning a list of
4358     shape ids
4359     (ShapefileStore.AllShapes): New. Return an iterator over all
4360     shapes in the shape store
4361     (DerivedShapeStore.AllShapes): New. Like in ShapefileStore
4362    
4363     * Thuban/Model/layer.py (Layer.ShapesInRegion): Update
4364     doc-string.
4365    
4366     * Thuban/UI/baserenderer.py
4367     (BaseRenderer.layer_ids, BaseRenderer.layer_shapes): Rename to
4368     layer_shapes and make it return an iterator containg shapes
4369     instead of a list of ids.
4370     (BaseRenderer.draw_shape_layer): Update doc-string; Adapt to
4371     layer_shapes() change
4372    
4373     * Thuban/UI/renderer.py (ScreenRenderer.layer_ids)
4374     (ScreenRenderer.layer_shapes): Rename as in BaseRenderer
4375    
4376     * Thuban/UI/viewport.py (ViewPort._find_shape_in_layer): Adapt to
4377     changes in the ShapesInRegion return value.
4378     (ViewPort._get_hit_tester): Remove commented out code
4379    
4380     * test/mockgeo.py (SimpleShapeStore.ShapesInRegion): Adapt to the
4381     new return value.
4382     (SimpleShapeStore.AllShapes): New. Implement this method too.
4383    
4384     * test/test_layer.py (TestLayer.test_arc_layer)
4385     (TestLayer.test_polygon_layer, TestLayer.test_point_layer)
4386     (TestLayer.test_point_layer_with_projection)
4387     (TestLayer.test_derived_store): Adapt to changes in the
4388     ShapesInRegion return value.
4389    
4390     * test/test_shapefilestore.py
4391     (TestShapefileStoreArc.test_shapes_in_region)
4392     (TestShapefileStorePolygon.test_shapes_in_region)
4393     (TestShapefileStorePoint.test_shapes_in_region): Adapt to changes
4394     in the ShapesInRegion return value.
4395     (TestShapefileStorePoint.test_all_shapes)
4396     (TestShapefileStoreArc.test_shape_shapeid): New tests for the new
4397     methods
4398    
4399     * test/test_derivedshapestore.py
4400     (TestDerivedShapeStore.test_shapes_in_region): Adapt to changes in
4401     the ShapesInRegion return value.
4402     (TestDerivedShapeStore.test_all_shapes)
4403     (TestDerivedShapeStore.test_shape_shapeid): New tests for the new
4404     methods
4405    
4406     2003-08-15 Bernhard Herzog <[email protected]>
4407    
4408 bh 1592 Make the renderers deal correctly with raw vs. python level
4409     representation of shape geometries
4410    
4411     * Thuban/UI/baserenderer.py (BaseRenderer.low_level_renderer):
4412     Return a flag useraw in addition to the callable and the parameter
4413     to indicate whether the callable can deal with the raw shape data
4414     or uses the higher level python lists of coordinates. The callable
4415     now should accept either the raw data or the return value of the
4416     shape's Points() method.
4417     (BaseRenderer.draw_shape_layer): Adapt to the low_level_renderer
4418     change
4419     (BaseRenderer.projected_points): Instead of the shape id use the
4420     points list as parameter.
4421     (BaseRenderer.draw_polygon_shape, BaseRenderer.draw_arc_shape)
4422     (BaseRenderer.draw_point_shape): Adapt to projected_points()
4423     change and accept the points list as parameter instead of the
4424     shape id.
4425    
4426     * Thuban/UI/renderer.py (MapRenderer.low_level_renderer): Return
4427     the useraw flag as required by the BaseRenderer
4428     (ScreenRenderer.draw_shape_layer): Adapt to low-level renderer
4429     changes.
4430    
4431     * test/test_baserenderer.py
4432     (TestBaseRenderer.test_point_with_classification): New test for
4433     rendering a map with classifications.
4434    
4435     2003-08-15 Bernhard Herzog <[email protected]>
4436    
4437 bh 1590 * Thuban/UI/viewport.py (ViewPort.find_shape_at)
4438     (ViewPort._find_shape_in_layer, ViewPort._find_shape_in_layer)
4439     (ViewPort._get_hit_tester, ViewPort.projected_points)
4440     (ViewPort._hit_point, ViewPort._hit_arc, ViewPort._hit_polygon)
4441     (ViewPort._find_label_at): Split the find_shape_at method into
4442     several new methods and use the functions in the hit-test module.
4443    
4444     * Thuban/UI/hittest.py: New module with Python-level hit-testing
4445     functions
4446    
4447     * test/test_hittest.py: New. Test for the new hittest module
4448    
4449     2003-08-15 Bernhard Herzog <[email protected]>
4450    
4451 bh 1588 * Thuban/Model/layer.py (Layer.ShapesInRegion): Apply the layer
4452     projection to all corners of the bounding box to get a better
4453     approximation of the projected bounding box
4454    
4455     * test/test_layer.py (TestLayer.test_point_layer_with_projection):
4456     New. Test coordinate handling of a layer with a projection.
4457     Catches the bug fixed in Layer.ShapesInRegion
4458    
4459     2003-08-15 Bernhard Herzog <[email protected]>
4460    
4461 bh 1586 Move some of the mock objects in test_baserenderer into their own
4462     module so they can easily be used from other tests
4463    
4464     * test/mockgeo.py: New test helper module with some mock objects
4465     for geometry related things like shapes, shapestores and
4466     projections.
4467    
4468     * test/test_mockgeo.py: New. Tests for the new helper module
4469    
4470     * test/test_baserenderer.py: Some of the mock-objects are in
4471     mockgeo now.
4472    
4473 jan 1584 2003-08-12 Jan-Oliver Wagner <[email protected]>
4474    
4475     * Thuban/UI/about.py (About.__init__): Added Björn Broscheit.
4476    
4477 bh 1580 2003-08-12 Bernhard Herzog <[email protected]>
4478    
4479 bh 1582 * po/de.po: New. German translations by Bjoern Broscheit
4480    
4481     2003-08-12 Bernhard Herzog <[email protected]>
4482    
4483 bh 1580 * Thuban/UI/projdialog.py (UnknownProjPanel._DoLayout): Translated
4484     strings have to be one string literal.
4485    
4486 bh 1573 2003-08-11 Bernhard Herzog <[email protected]>
4487    
4488 bh 1578 * test/support.py (FloatComparisonMixin.assertPointListEquals):
4489     New. This method was used in various derived classes, but it's
4490     better to have it here.
4491    
4492     * test/test_shapefilestore.py
4493     (ShapefileStoreTests.assertPointListEquals): Removed. It's now in
4494     FloatComparisonMixin
4495    
4496     * test/test_layer.py (TestLayer.assertPointListEquals): Removed.
4497     It's now in FloatComparisonMixin
4498    
4499     * test/test_derivedshapestore.py
4500     (TestDerivedShapeStore.assertPointListEquals): Removed. It's now
4501     in FloatComparisonMixin
4502    
4503     2003-08-11 Bernhard Herzog <[email protected]>
4504    
4505 bh 1573 * Thuban/UI/join.py (JoinDialog.OnJoin): Add missing space to
4506     error message
4507    
4508 jan 1569 2003-08-08 Jan-Oliver Wagner <[email protected]>
4509    
4510 jan 1571 * Doc/manual/thuban-manual.xml: Now use authorgroup. Added revhistory
4511     with version number.
4512     Changed title to reflect version number of Thuban.
4513    
4514     2003-08-08 Jan-Oliver Wagner <[email protected]>
4515    
4516 jan 1569 * Thuban/UI/about.py (About.__init__): Reworked the hall of fame. Now
4517     the list corresponds to the "About" web page.
4518    
4519 bh 1567 2003-08-08 Bernhard Herzog <[email protected]>
4520    
4521     * Thuban/UI/projdialog.py (UTMProposeZoneDialog.dialogLayout):
4522     Make sure translated strings are recognized as one string literal.
4523    
4524     * Thuban/UI/proj4dialog.py (UTMProposeZoneDialog.dialogLayout):
4525     Make sure translated strings are recognized as one string literal.
4526    
4527     * Thuban/UI/classgen.py (ClassGenDialog.OnOK): Make sure
4528     translated strings are recognized as one string literal.
4529    
4530     * Thuban/UI/application.py (ThubanApplication.OpenSession): Make
4531     sure translated strings are recognized as one string literal.
4532    
4533 bh 1556 2003-08-07 Bernhard Herzog <[email protected]>
4534    
4535 bh 1565 * Thuban/Model/data.py (DerivedShapeStore.RawShapeFormat): New.
4536     Simply delegates to the original shapestore.
4537    
4538     * test/test_derivedshapestore.py
4539     (TestDerivedShapeStore.test_raw_format): New. Test case for
4540     DerivedShapeStore.RawShapeFormat
4541    
4542     2003-08-07 Bernhard Herzog <[email protected]>
4543    
4544 bh 1561 Add raw data interface to shape objects.
4545    
4546     * Thuban/Model/data.py (ShapefileShape, Shape): Rname the shape
4547     class to ShapefileShape which now holds shapefile specific
4548     information.
4549     (ShapefileShape.compute_bbox): Simplified to not cache any
4550     information. The way this method is used that shouldn't matter
4551     performance wise.
4552     (ShapefileShape.RawData): New. Return the shapeid which is the raw
4553     data format for shapes from shapefiles.
4554     (ShapefileStore.RawShapeFormat): New. Return the raw datatype used
4555     in the shape objects returned by a shapestore. For a
4556     ShapefileStore this is always RAW_SHAPEFILE.
4557     (RAW_PYTHON, RAW_SHAPEFILE): Constants for the RawShapeFormat
4558     method.
4559    
4560     * test/test_shapefilestore.py
4561     (TestShapefileStore.test_raw_format): New test to test the raw
4562     format feature of shapes.
4563    
4564 bh 1560 * Thuban/Model/layer.py: Remove the unused import of Shape from
4565     data. It was only there for interface compatibility but it's not
4566 bh 1561 used inside of Thuban and the generic Shape class has gone away.
4567 bh 1560
4568 bh 1563 * Thuban/UI/renderer.py (MapRenderer.low_level_renderer): Check
4569     the raw data format and only use an optimized version of its a
4570     shapefile.
4571    
4572 bh 1561 2003-08-07 Bernhard Herzog <[email protected]>
4573    
4574 bh 1559 * test/test_baserenderer.py (SimpleShape): Shape class for the
4575     tests.
4576     (SimpleShapeStore.Shape): Use SimpleShape instead of
4577     Thuban.Model.data.Shape to make the tests independed of the coming
4578     changes.
4579    
4580     2003-08-07 Bernhard Herzog <[email protected]>
4581    
4582 bh 1556 * test/support.py (SkipTest, ThubanTestResult, ThubanTestRunner)
4583     (ThubanTestProgram): New classes that extend the respective
4584     classes from unittest. These new version support skipping tests
4585     under certain expected conditions. In the Thuban test suite we
4586     uses this for tests that require the optional gdal support.
4587     (run_tests): Use ThubanTestProgram instead of the unittest.main()
4588    
4589     * test/runtests.py (main): Use the new ThubanTestRunner instead of
4590     the normal one from unittest
4591    
4592     * test/test_layer.py (TestLayer.test_raster_layer): If this test
4593     is not run because gdal support isn't available report this to the
4594     runner.
4595    
4596     * test/test_baserenderer.py
4597     (TestBaseRenderer.test_raster_no_projection): Do not run this test
4598     if gdal support isn't available and report this to the runner.
4599    
4600 bh 1553 2003-08-06 Bernhard Herzog <[email protected]>
4601    
4602     Rearrange the renderers a bit, partly in preparation for changes
4603     required for the postgis merge, partly to make it more testable.
4604     Also make the representation of coordinates in Shapes more
4605     consistent.
4606    
4607     * Thuban/UI/renderer.py (MapRenderer): Most of the code/methods in
4608     this class is now in BaseRenderer. This class is now practically
4609     only a specialization of BaseRenderer for rendering to an actual
4610     wx DC.
4611     (ScreenRenderer.draw_shape_layer): Use self.low_level_renderer()
4612     to get the shapetype specific rendering functions.
4613    
4614     * Thuban/UI/baserenderer.py: New file with the basic rendering
4615     logic. The code in this file is completely independend of wx.
4616     (BaseRenderer): Class with the basic rendering logic
4617    
4618     * test/test_baserenderer.py: New. Test cases for BaseRenderer
4619    
4620     * Thuban/UI/view.py (MapCanvas.__init__): New instance variable
4621     error_on_redraw to guard agains endless loops and stack overflows
4622     when there's a bug in the rendering code that raises exceptions.
4623     (MapCanvas.OnIdle, MapCanvas._do_redraw): Split the actual
4624     rendering into a separate method _do_redraw so that error handling
4625     is a bit easier. When an exception occurs, set error_on_redraw to
4626     true. When it's true on entry to OnIdle do nothing and return
4627     immediately.
4628    
4629     * Thuban/Model/data.py (ShapefileStore.Shape): For consistency, a
4630     Shape object will always have the coordinates as a list of list of
4631     coordinate pairs (tuples).
4632     (Shape.compute_bbox): Adapt to new representation.
4633    
4634     * Thuban/UI/viewport.py (ViewPort.find_shape_at)
4635     (ViewPort.LabelShapeAt): Adapt to new coordinate representation in
4636     Shape objects.
4637    
4638     * test/test_shapefilestore.py
4639     (ShapefileStoreTests.assertFloatTuplesEqual)
4640     (ShapefileStoreTests.assertPointListEquals): Rename to
4641     assertPointListEquals and change purpose to checking equality of
4642     the lists returned by Shape.Points().
4643     (TestShapefileStoreArc.test_shape)
4644     (TestShapefileStorePolygon.test_shape)
4645     (TestShapefileStorePoint.test_shape): Use the new
4646     assertPointListEquals instead of assertFloatTuplesEqual
4647    
4648     * test/test_layer.py (TestLayer.assertFloatTuplesEqual)
4649     (TestLayer.assertPointListEquals): Rename to assertPointListEquals
4650     and change purpose to checking equality of the lists returned by
4651     Shape.Points().
4652     (TestLayer.test_arc_layer, TestLayer.test_arc_layer)
4653     (TestLayer.test_polygon_layer, TestLayer.test_point_layer)
4654     (TestLayer.test_derived_store): Use the new assertPointListEquals
4655     instead of assertFloatTuplesEqual
4656    
4657     * test/test_derivedshapestore.py
4658     (TestDerivedShapeStore.assertFloatTuplesEqual)
4659     (TestDerivedShapeStore.assertPointListEquals): Rename to
4660     assertPointListEquals and change purpose to checking equality of
4661     the lists returned by Shape.Points().
4662     (TestDerivedShapeStore.test_shape): Use the new
4663     assertPointListEquals instead of assertFloatTuplesEqual
4664    
4665 jan 1550 2003-08-06 Jan-Oliver Wagner <[email protected]>
4666    
4667     * Thuban/UI/projdialog.py (UTMPanel._OnPropose): Added test for
4668     a bounding box. A dialog is raised in case, no bounding box
4669     is found. This fixes bug #2043:
4670     https://intevation.de/rt/webrt?serial_num=2043
4671    
4672 bh 1548 2003-08-05 Bernhard Herzog <[email protected]>
4673    
4674     * Thuban/Model/color.py (Color.__repr__): Make the repr of a color
4675     object look like a Color instantiation. Formerly it looked like a
4676     tuple.
4677    
4678     * test/test_color.py (TestColor.test_repr)
4679     (TestColor.test_equality, TestColor.test_inequality): New. test
4680     some more apects of the Color class
4681     (TestTransparent.test_repr, TestTransparent.test_hex)
4682     (TestTransparent.test_equality): New. Test cases for the
4683     Transparent object.
4684    
4685 jan 1545 2003-08-04 Jan-Oliver Wagner <[email protected]>
4686    
4687     * Doc/manual/thuban-manual.xml: a number of small improvements.
4688     The resulting file is the version submitted for GREAT-ER II.
4689    
4690 bh 1540 2003-08-01 Bernhard Herzog <[email protected]>
4691    
4692 bh 1543 * Thuban/UI/resource.py, Thuban/UI/projdialog.py,
4693     Thuban/UI/join.py, Thuban/UI/classgen.py, Thuban/UI/about.py,
4694     Thuban/Model/resource.py: Insert cvs keywords and doc-strings.
4695    
4696     * Thuban/UI/common.py: Insert cvs keywords and doc-strings.
4697     (Color2wxColour, wxColour2Color, ThubanBeginBusyCursor)
4698     (ThubanEndBusyCursor): Add doc-strings
4699    
4700     2003-08-01 Bernhard Herzog <[email protected]>
4701    
4702 bh 1540 First step towards PostGIS integration. More abstraction by movin
4703     more code from the layer to the shapestore. More methods of the
4704     layer are now simply delegated to the equivalent method of the
4705     shapestore. The SHAPETYPE_* constants are now in data not in
4706     layer.
4707    
4708     * Thuban/Model/data.py (SHAPETYPE_POLYGON, SHAPETYPE_ARC)
4709     (SHAPETYPE_POINT, Shape): Move these constants and classes from
4710     layer.py to data.py
4711     (ShapefileStore.__init__): More Initialization for the new methods
4712     and functionality.
4713     (ShapefileStore.ShapeType, ShapefileStore.NumShapes)
4714     (ShapefileStore.BoundingBox, ShapefileStore.ShapesInRegion)
4715     (ShapefileStore.Shape): New methods that were formerly implemented
4716     in the layer.
4717     (DerivedShapeStore.Shape, DerivedShapeStore.ShapesInRegion)
4718     (DerivedShapeStore.ShapeType, DerivedShapeStore.NumShapes)
4719     (DerivedShapeStore.BoundingBox): New. DerivedShapeStore
4720     equivalents of the new shape methods. These versions are simply
4721     delegated to the original shapstore.
4722    
4723     * Thuban/Model/layer.py (SHAPETYPE_POLYGON, SHAPETYPE_ARC)
4724     (SHAPETYPE_POINT, Shape): Removed. They're now in data.py
4725     (Layer.SetShapeStore): Removed the initializatin of instance
4726     variables that were needed for the stuff that's now in
4727     ShapefileStore
4728     (Layer.BoundingBox, Layer.NumShapes, Layer.ShapeType)
4729     (Layer.Shape, Layer.ShapesInRegion): Simply delegate to the
4730     shapestore.
4731    
4732     * Thuban/UI/classifier.py, Thuban/UI/renderer.py,
4733     Thuban/UI/viewport.py: Import the SHAPETYPE_* constants from data
4734     instead of layer.
4735    
4736     * test/test_shapefilestore.py: New. Tests for ShapefileStore.
4737    
4738     * test/test_derivedshapestore.py: New. Tests for DerivedShapeStore.
4739    
4740     * test/test_layer.py: Import the SHAPETYPE_* constants from data
4741     instead of layer.
4742     (TestLayer.test_derived_store): Remove the test for the exception
4743     when instantiating the DerivedShapeStore with an incompatible
4744     table which is now in test_derivedshapestore.py. Add some more
4745     tests of the layer methods to determine whether they work for a
4746     DerivedShapeStore as well.
4747    
4748 jonathan 1534 2003-07-31 Jonathan Coles <[email protected]>
4749    
4750     * Doc/manual/thuban-manual.xml: Fix the list of required packages
4751     by just listing the name and where they can be found.
4752    
4753 frank 1532 2003-07-31 Frank Koormann <[email protected]>
4754    
4755     * Doc/manual/thuban-manual.xml:
4756     Changed the screenshot elements to figure.
4757     Changed some variablelist elements to itemizedlist.
4758     Added section on GDAL formats.
4759    
4760 jonathan 1531 2003-07-31 Jonathan Coles <[email protected]>
4761    
4762     * Doc/manual/thuban-manual.xml: Added a few sentences about
4763     the Fix Border Color option when generating classes.
4764    
4765 jonathan 1529 2003-07-30 Jonathan Coles <[email protected]>
4766    
4767     * Thuban/Model/classgen.py: Add docstrings. Rename specific
4768     Ramp instances to use lower_case_style.
4769    
4770     * Thuban/UI/classgen.py: Use renamed Ramp instances.
4771    
4772     * Thuban/UI/classifier.py: Add docstrings.
4773    
4774     * Thuban/UI/dock.py: Add docstrings.
4775    
4776     * test/test_classgen.py: Use renamed Ramp instances.
4777    
4778 bh 1522 2003-07-30 Bernhard Herzog <[email protected]>
4779    
4780 bh 1524 * Thuban/Lib/connector.py (QueueingPublisher): Removed. This class
4781     was never used in Thuban.
4782    
4783     2003-07-30 Bernhard Herzog <[email protected]>
4784    
4785 bh 1522 * Thuban/UI/join.py (JoinDialog.__init__): Use the table's Title()
4786     method directly instead of going through the transient_table
4787     method. This faster because transient_table may force the copy of
4788     a DBF file into the transient database and setting a table's title
4789     doesnm't affect the title of the associated transient table, so
4790     this fixes RT #2042
4791    
4792     * Thuban/UI/main.py (__version__): Don't import the already
4793     removed show_exception_dialog.
4794    
4795 jonathan 1517 2003-07-29 Jonathan Coles <[email protected]>
4796    
4797 jonathan 1519 * Thuban/UI/application.py (ThubanApplication.ShowExceptionDialog):
4798     Put back this method and remove the equivalent function since we
4799     are setting the exception hook from within this class (OnInit).
4800    
4801     2003-07-29 Jonathan Coles <[email protected]>
4802    
4803 jonathan 1517 * Doc/manual/images/5_2_custom_ramp.png,
4804     Doc/manual/images/5_2_quantiles.png,
4805     Doc/manual/images/5_2_uniform_dist.png,
4806     Doc/manual/images/5_2_unique_values.png,
4807     Doc/manual/images/8_int_error.png: New screen shots.
4808    
4809     * Doc/manual/thuban-manual.xml: Fixed typos and wording, clarified
4810     some points, and added more screen shots.
4811    
4812 bh 1512 2003-07-29 Bernhard Herzog <[email protected]>
4813    
4814 bh 1516 * Thuban/Model/data.py: Remove the now unused import of warnings
4815    
4816     2003-07-29 Bernhard Herzog <[email protected]>
4817    
4818 bh 1514 * Thuban/Model/data.py (SimpleStore): Removed. This class has been
4819     deprecated since before the 0.8 release and isn't used in Thuban
4820     itself anymore.
4821    
4822 bh 1512 * Thuban/Model/transientdb.py: Remove some unnecessary imports
4823    
4824 jonathan 1503 2003-07-29 Jonathan Coles <[email protected]>
4825 jonathan 1506
4826     * Thuban/UI/application.py (ThubanApplication.OnInit): set the
4827     python exception hook here so that we are sure to catch any
4828     Thuban exception that happen during initialization.
4829    
4830     * Thuban/UI/main.py (main): Don't set the exception hook here,
4831     it will get set in ThubanApplication.OnInit.
4832    
4833     2003-07-29 Jonathan Coles <[email protected]>
4834 jonathan 1503
4835     * Thuban/UI/application.py (ThubanApplication.ShowExceptionDialog):
4836     Removed and called it show_exception_dialog() so that the exception
4837     handler can be set before the class is created.
4838    
4839     * Thuban/UI/main.py (main): Install the exception handler before
4840     a ThubanApplication is created.
4841    
4842 bh 1500 2003-07-29 Bernhard Herzog <[email protected]>
4843    
4844     * po/it.po: New. Italian translation by Maurizio Napolitano
4845    
4846     * po/ru.po: New. Russian translation by Alex Shevlakov
4847    
4848 frank 1497 2003-07-29 Frank Koormann <[email protected]>
4849    
4850 frank 1508 * Doc/manual/thuban-manual.xml: Extended section on supported
4851     projections.
4852    
4853     2003-07-29 Frank Koormann <[email protected]>
4854    
4855 frank 1497 * Doc/manual/thuban-manual.xml: gaspell-checked.
4856    
4857 jonathan 1493 2003-07-29 Jonathan Coles <[email protected]>
4858    
4859 jonathan 1495 * Doc/manual/images/3_5_legend.png: Added border to improve look
4860     on white background.
4861    
4862     2003-07-29 Jonathan Coles <[email protected]>
4863    
4864 jonathan 1493 * Doc/manual/thuban-manual.xml: Fixed grammar and typos. Added
4865     descriptions for the legend toolbar.
4866    
4867     * Doc/manual/images/4_2_raster_layer_properties.png: Removed
4868     cursor from dialog box.
4869    
4870     2003-07-28 Jonathan Coles <[email protected]>
4871    
4872     * Doc/manual/thuban-manual.xml: More screenshots and more chapters.
4873    
4874     * Doc/manual/images/2_4_session_tree.png,
4875     Doc/manual/images/3_5_legend.png, Doc/manual/images/3_rename_map.png,
4876     Doc/manual/images/4_2_layer_properties.png,
4877     Doc/manual/images/4_2_raster_layer_properties.png,
4878     Doc/manual/images/5_3_genclass.png,
4879     Doc/manual/images/5_classification.png,
4880     Doc/manual/images/6_projection.png,
4881     Doc/manual/images/7_1_table_view.png,
4882     Doc/manual/images/7_2_5_join.png: New screenshots.
4883    
4884     2003-07-24 Jonathan Coles <[email protected]>
4885    
4886     * Doc/manual/thuban-manual.xml: Chapter on Projection Management.
4887    
4888     2003-07-24 Jonathan Coles <[email protected]>
4889    
4890     * Doc/manual/thuban-manual.xml: Added EPS images and wrote
4891     chapter on Layer Management.
4892    
4893     * Doc/manual/Makefile: New. Makefile to generate all formats for the
4894     manual and images.
4895    
4896 bh 1483 2003-07-24 Bernhard Herzog <[email protected]>
4897    
4898     * Thuban/Model/range.py, Thuban/version.py: Remove the #! line as
4899     it annoys lintian which warns about these files not being
4900 jan 1767 executable. The #! isn't necessary here since if you absolutely
4901 bh 1483 must execute them you can always say "python <filename>".
4902    
4903     * Thuban/UI/renderer.py (ScreenRenderer.draw_shape_layer): Remove
4904     superfluous code to set brush and pen for point shapes
4905    
4906     * Thuban/UI/viewport.py: Remove commented out code that wouldn't
4907     belong in viewport anyway
4908    
4909 frank 1479 2003-07-24 Frank Koormann <[email protected]>
4910    
4911     * Doc/manual/thuban-manual.xml: Added section on table management.
4912    
4913 bh 1477 2003-07-24 Bernhard Herzog <[email protected]>
4914    
4915     * test/runtests.py (main): Recognize the long "verbose" option
4916     correctly.
4917    
4918 jonathan 1470 2003-07-22 Jonathan Coles <[email protected]>
4919    
4920     * Doc/manual/thuban-manual.xml: Continue to write first revision
4921     of the manual.
4922    
4923     * Thuban/UI/renderer.py (MapRenderer.render_map): Wrap method
4924     with Begin/EndDrawing() calls to ensure we aren't doing to
4925     many updates to the dc during rendering.
4926     (ScreenRenderer.draw_shape_layer): self.draw_point_shape takes
4927     a pen and brush argument so they need to be passed to the function.
4928    
4929     * Thuban/UI/viewport.py (ViewPort.calc_min_max_scales): New.
4930     Calculates the minimum and maximum scale values. Factored out
4931     of set_view_transform so that it could be used to zoom all the
4932     way into a single point.
4933     (ViewPort.set_view_transform): Call calc_min_max_scales().
4934     (ViewPort.FitSelectedToWindow): Zoom to the maximum scale
4935     if only a single point is selected.
4936    
4937     * Doc/manual/images/1_2_legend_close.png,
4938     Doc/manual/images/1_2_legend_dock.png,
4939     Doc/manual/images/1_2_mainwindow.png,
4940     Doc/manual/images/1_2_mainwindow.ps,
4941     Doc/manual/images/1_2_mainwindow.sk,
4942     Doc/manual/images/3_2_fullextent.png,
4943     Doc/manual/images/3_2_fulllayerextent.png,
4944     Doc/manual/images/3_2_fullshapeextent.png,
4945     Doc/manual/images/3_2_pan.png,
4946     Doc/manual/images/3_2_zoomin.png,
4947     Doc/manual/images/3_2_zoomout.png,
4948     Doc/manual/images/3_3_identify.png,
4949     Doc/manual/images/3_3_label.png,
4950     Doc/manual/images/3_5_invisible.png,
4951     Doc/manual/images/3_5_movedown.png,
4952     Doc/manual/images/3_5_moveup.png,
4953     Doc/manual/images/3_5_props.png,
4954     Doc/manual/images/3_5_tobottom.png,
4955     Doc/manual/images/3_5_totop.png,
4956     Doc/manual/images/3_5_visible.png: New. Images for the documentation.
4957    
4958 bh 1451 2003-07-18 Bernhard Herzog <[email protected]>
4959    
4960 bh 1465 * Thuban/UI/messages.py (MAP_REPLACED): New message.
4961    
4962     * Thuban/UI/viewport.py (ViewPort.SetMap): Issue MAP_REPLACED
4963     after the new map has been assigned
4964    
4965     * Thuban/UI/mainwindow.py (MainWindow.delegated_messages):
4966     Delegate MAP_REPLACED to the canvas too
4967     (MainWindow.prepare_new_session): Removed. Thanks to the new
4968     MAP_REPLACED message it's no longer needed
4969     (MainWindow.OpenSession, MainWindow.NewSession):
4970     prepare_new_session has been removed.
4971    
4972     * Thuban/UI/classifier.py (Classifier.__init__): Subscribe to
4973     MAP_REPLACED so that we can close the dialog if a new map is set.
4974     (Classifier.unsubscribe_messages): Unsubscribe from MAP_REPLACED
4975     (Classifier.map_replaced): Handle MAP_REPLACED by closing the
4976     dialog
4977    
4978     * test/test_viewport.py (SimpleViewPortTest)
4979     (SimpleViewPortTest.test_default_size): Add doc-strings
4980     (ViewPortTest.setUp): Bind map to self.map so we can use it in
4981     tests. Subscribe to MAP_REPLACED messages too.
4982     (ViewPortTest.tearDown): No need to explicitly unsubscribe
4983     (ViewPortTest.test_set_map): New test for the SetMap method.
4984    
4985     2003-07-18 Bernhard Herzog <[email protected]>
4986    
4987 bh 1463 * test/test_viewport.py (SimpleViewPortTest.test_default_size):
4988     Move this test from ViewPortTest.setUp to this new separate test
4989     case. setUp is not the place for the actual tests.
4990     (ViewPortTest.test_inital_settings, ViewPortTest.setUp): Move some
4991     more of the test from setUp to the new test test_inital_settings.
4992     (ViewPortTest.test_win_to_proj, ViewPortTest.test_proj_to_win)
4993     (ViewPortTest.test_proj_conv): Split test_proj_conv into
4994     test_win_to_proj and test_proj_to_win and make the tests easier to
4995     understand
4996     (ViewPortTest.testFitRectToWindow, ViewPortTest.testZoomFactor)
4997     (ViewPortTest.testZoomOutToRect, ViewPortTest.testTranslate)
4998     (ViewPortTest.test_unprojected_rect_around_point)
4999     (ViewPortTest.test_find_shape_at, ViewPortTest.testTools):
5000     Reformat to increase readability.
5001    
5002     2003-07-18 Bernhard Herzog <[email protected]>
5003    
5004 bh 1461 * Thuban/UI/view.py (MapCanvas.OnLeftDown): Capture the mouse.
5005    
5006     2003-07-18 Bernhard Herzog <[email protected]>
5007    
5008 bh 1459 * test/runtests.py: The test suite can now be run without an X
5009     connection. To make sure this remains true, remove the DISPLAY
5010     environment variable so that an error occurs if the wxGTK is
5011     imported accidentally
5012    
5013     2003-07-18 Bernhard Herzog <[email protected]>
5014    
5015 bh 1457 * Thuban/UI/viewport.py: Remove unused imports
5016    
5017     * Thuban/UI/view.py: Remove unused imports
5018    
5019     2003-07-18 Bernhard Herzog <[email protected]>
5020    
5021 bh 1455 * test/test_export.py Remove unused imports. The OutputTransform
5022     function is now in viewport.py and is called output_transform
5023     (TestScalebar.test_output_transform)
5024     (TestScalebar.test_OutputTransform): Renamed to
5025     test_output_transform and updated to use output_transform instead
5026     of OutputTransform
5027    
5028     * Thuban/UI/view.py (OutputTransform): Moved to viewport.py and
5029     renamed.
5030     (MapCanvas.Export, MapPrintout.draw_on_dc): OutputTransform was
5031     renamed to output_transform
5032    
5033     * Thuban/UI/viewport.py (OutputTransform, output_transform):
5034     Rename to output_transform
5035    
5036     2003-07-18 Bernhard Herzog <[email protected]>
5037    
5038 bh 1453 * Thuban/Model/layer.py (Layer.__init__): Rename
5039     classificationField to classificatin_column and init it here so
5040     that it can be used in SetClassificationColumn
5041     (Layer.GetClassificationColumn, Layer.GetClassificationField):
5042     Rename to GetClassificationColumn.
5043     (Layer.SetClassificationColumn, Layer.SetClassificationField):
5044     Rename to SetClassificationColumn and issue a LAYER_CHANGED
5045     message if the column changes.
5046     (Layer._classification_changed, Layer.ClassChanged): Rename to
5047     _classification_changed. Update the callers.
5048     (Layer.SetShapeStore): Further field->column renames.
5049    
5050     * Thuban/Model/load.py (SessionLoader.start_classification)
5051     (SessionLoader.start_clpoint): Updates because of
5052     field->column method name changes in the Layer class
5053    
5054     * Thuban/Model/save.py (SessionSaver.write_classification): Updates
5055     because of field->column method name changes in the Layer class
5056    
5057     * Thuban/UI/classifier.py (Classifier.__init__)
5058     (Classifier._OnTry, Classifier._OnRevert): Updates because of
5059     field->column method name changes in the Layer class
5060    
5061     * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Updates
5062     because of field->column method name changes in the Layer class
5063    
5064     * Thuban/UI/viewport.py (ViewPort.find_shape_at): Updates because
5065     of field->column method name changes in the Layer class
5066    
5067     * test/test_save.py (SaveSessionTest.testClassifiedLayer)
5068     (SaveSessionTest.testClassifiedLayer): Update because of
5069     field->column method name changes in the Layer class
5070    
5071     * test/test_layer.py (SetShapeStoreTests.setUp)
5072     (SetShapeStoreTests.test_sanity): Update because of field->column
5073     method name changes in the Layer class
5074     (TestLayerModification.setUp): Subscribe to LAYER_CHANGED as well
5075     (TestLayerModification.test_sanity)
5076     (TestLayerModification.test_initial_settings): remove unsued code
5077     and rename to test_sanity.
5078     (TestLayerModification.test_set_classification): New test for
5079     SetClassification and SetClassificationField.
5080    
5081     2003-07-18 Bernhard Herzog <[email protected]>
5082    
5083 bh 1451 * test/test_classgen.py (TestFixedRamp.test): Extend test to check
5084     the non-fixed values as well. The old test would have accepted a
5085     fixed ramp that only returnes the fixed properties
5086    
5087 jonathan 1449 2003-07-17 Jonathan Coles <[email protected]>
5088    
5089     * Doc/manual/mainwindow.png, Doc/manual/mainwindow.xcf: Screen
5090     shots for the manual. The XCF file is the source image and
5091     has additional layers to support changes.
5092    
5093     * Doc/manual/thuban-manual.xml: Wrote an initial Introduction.
5094    
5095     * Thuban/UI/classifier.py (Classifier.__BuildClassification):
5096     Return both the new class and the field name.
5097    
5098     * Thuban/UI/mainwindow.py (MainWindow.ToggleLegend): Don't
5099     fit the map to the window as this changes any zoom level that
5100     the user may have set.
5101    
5102 jonathan 1442 2003-07-16 Jonathan Coles <[email protected]>
5103    
5104     * Thuban/Model/classgen.py (generate_singletons,
5105     generate_uniform_distribution, generate_quantiles): Remove
5106     fixes parameter, but maintain the same functionality by having
5107     the calling function pass a FixedRamp object for the ramp.
5108     (FixedRamp): New. Adapts a ramp to have fixed property values.
5109    
5110     * Thuban/Model/classification.py: Use new CLASS_CHANGED message.
5111     (Classification): Inherit from Publisher.
5112     (Classification.__init__): Remove the layer parameter.
5113     Classifications no longer need to have a parent layer.
5114     (Classification.GetField, Classification.GetFieldType,
5115     Classification.SetFieldInfo): Removed. The field name is stored
5116     in the layer, and the type can be retreived by calling
5117     Layer.GetFieldType().
5118     (Classification._set_layer, Classification.GetLayer): Removed.
5119     Classifications no longer have a parent layer.
5120    
5121     * Thuban/Model/layer.py (Layer.Destroy): Unsubscribe from the
5122     classification.
5123     (Layer.SetShapeStore): Reset the classification first while
5124     we still have the old shape store to work with.
5125     (Layer.GetClassificationField, Layer.SetClassificationField):
5126     New. Method for getting/setting the field to classify on.
5127     (Layer.SetClassification): Simplified now that the layer
5128     simply has to hold a reference to the classification and not
5129     tell the classification who owns it.
5130     Fixes RTbug #2023.
5131    
5132     * Thuban/Model/load.py (SessionLoader.start_classification):
5133     Set the field name on the layer, not the classification.
5134    
5135     * Thuban/Model/messages.py: Add CLASS_CHANGED for when a
5136     classification is modified.
5137    
5138     * Thuban/Model/save.py (SessionSaver.write_classification):
5139     Get the field name and type from the layer.
5140    
5141     * Thuban/Model/table.py (table_to_dbf, table_to_csv): Renamed
5142     parameter records to rows and add docstring. Fixes RTbug #1997.
5143    
5144     * Thuban/UI/classgen.py (ClassGenDialog.OnOK): Use a fixed
5145     ramp when we need to fix certain values of a ramp rather than
5146     using the old fixes parameter. Fixes RTbug #2024.
5147    
5148     * Thuban/UI/classifier.py (ClassGrid.CreateTable): Add fieldType
5149     parameter.
5150     (ClassTable.Reset): Add fieldType parameter and use it, rather
5151     than asking the classification.
5152     (Classifier.__init__): Remember the original class's field
5153     and ask the layer for the field type, rather than the classification.
5154     (Classifier.__SetGridTable): Retrieve the field and field type
5155     for the table because they are not in the classification.
5156     (Classifier._OnTry, Classifier._OnRevert): Set the classification
5157     field on the layer in addition to the classification itself.
5158    
5159     * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Get the
5160     classification field from layer.
5161    
5162     * Thuban/UI/viewport.py (ViewPort.find_shape_at): Get the
5163     classification field from layer. Split up tests and remove
5164     *-imports. Fixes RTbug #1992.
5165    
5166     * test/test_classgen.py (TestFixedRamp): Test for the FixedRamp class.
5167    
5168     * test/test_classification.py
5169     (TestClassification.test_classification): Remove tests for methods
5170     that no longer exist.
5171    
5172     * test/test_layer.py (SetShapeStoreTests.setUp): Classification
5173     __init__ no longer has a field parameter, use SetClassificationField.
5174     (SetShapeStoreTests.test_sanity): Use layer object to get class
5175     field info.
5176    
5177     * test/test_save.py (SaveSessionTest.testClassifiedLayer): Use
5178     SetClassificationField on layer to set class field info.
5179    
5180     * test/test_viewport.py: Renamed from test/test_view.py.
5181    
5182 jan 1424 2003-07-16 Jan-Oliver Wagner <[email protected]>
5183    
5184     * Doc/manual/thuban-manual.xml: Added authors and an initial
5185     coarse structure.
5186    
5187 bh 1418 2003-07-15 Bernhard Herzog <[email protected]>
5188    
5189 bh 1422 * test/support.py (FloatComparisonMixin): This is a mix-in class
5190     and therefore should not be derived from any other class.
5191    
5192     * test/test_range.py (RangeTest): FloatComparisonMixin is a
5193     mix-in, so derive from TestCase as well.
5194    
5195     2003-07-15 Bernhard Herzog <[email protected]>
5196    
5197 bh 1420 * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Rework the
5198     draw_func handling a bit to remove one layer of indirection. This
5199     makes the renderer about 10% faster in the non-classifying case
5200     and the code a bit cleaner
5201     (MapRenderer.draw_point_shape): Add the pen and brush parameters
5202     and set them in the dc. Now the draw_point_shape method and
5203     wxproj's draw_polygon_shape function have basically the same
5204     signature so that both can be directly used as draw_func
5205    
5206     2003-07-15 Bernhard Herzog <[email protected]>
5207    
5208 bh 1418 * Thuban/Model/save.py (SessionSaver.write_classification): Encode
5209     string values (in addition to the labels) as UTF 8
5210    
5211     * Thuban/Model/load.py (SessionLoader.start_clpoint): Decode the
5212     values if the field type is string
5213    
5214     * test/test_save.py (SaveSessionTest.testClassifiedLayer): Test
5215     saving a session with non-ascii string classification values.
5216    
5217     * test/test_load.py (TestClassification.file_contents)
5218     (TestClassification.test): Check for non-ascii values in string
5219     classifications
5220    
5221 jonathan 1416 2003-07-14 Jonathan Coles <[email protected]>
5222    
5223     * test/test_view.py: New. Tests for ViewPort.
5224    
5225 frank 1409 2003-07-14 Frank Koormann <[email protected]>
5226    
5227     * Thuban/Model/load.py (SessionLoader.start_map): Encode map
5228     title to latin1. Fixes https://intevation.de/rt/webrt?serial_num=2013
5229    
5230 frank 1411 * test/test_load_0_8.py (TestUnicodeStrings): New, test load of
5231     unicode strings from session file: session title, map title and
5232     projection name.
5233    
5234 jonathan 1403 2003-07-10 Jonathan Coles <[email protected]>
5235    
5236 jonathan 1406 * Thuban/UI/viewport.py (Tool.MouseUp): Should have called
5237     drag_stop, not drag_move when the mouse is released.
5238    
5239     2003-07-10 Jonathan Coles <[email protected]>
5240    
5241 jonathan 1403 The most important part of this is the seperation of view.py into
5242     two pieces. viewport.py now has a class called ViewPort which
5243     contains all the non-wx parts of view.py and can therefore be
5244     tested. view.py contains only the wx-specific parts and is fairly
5245     simple.
5246    
5247     * Thuban/UI/view.py: Stripped out all non-wx functionality. Fixes
5248     RTTbug #1992.
5249     * Thuban/UI/viewport.py: New. Contains non-wx view functionality.
5250     RTTbug #1992.
5251    
5252     * Thuban/Model/classgen.py (generate_singletons,
5253     generate_uniform_distribution, generate_quantiles):
5254     Added 'fixes' parameter so that property attributes can
5255     be held constant over the generated classification groups.
5256     (CustomRamp.GetProperties): Remove unused variables.
5257    
5258     * Thuban/Model/map.py (Map.SetProjection): Send the old
5259     projection as an argument to listeners of the MAP_PROJECTION_CHANGED
5260     event.
5261    
5262     * Thuban/Model/table.py (table_to_dbf, table_to_csv): Added 'records'
5263     parameter which is a list of records that restricts which
5264     records are saved. Fixes RTbug #1997.
5265    
5266     * Thuban/UI/application.py (ThubanApplication.ShowExceptionDialog):
5267     Port exception dialog from GREAT-ER. Fixes RTbug #1993.
5268    
5269     * Thuban/UI/classgen.py (ClassGenDialog.__init__): Add controls
5270     to allow the user to fix line color/width on generated groups.
5271     (ClassGenDialog.OnOK): Use new 'fixes' parameter of the generate_*
5272     functions to optionally fix group properties.
5273    
5274     * Thuban/UI/main.py (main): Set exception hook to the
5275     ShowExceptionDialog. Fixes RTbug #1993.
5276    
5277     * Thuban/UI/mainwindow.py (MainWindow.ShowTableView): Raise
5278     the table window when it is selectd to be shown.
5279    
5280     * Thuban/UI/tableview.py (QueryTableFrame.__init__): Add an
5281     Export Selection button and move the export buttons underneath
5282     the table.
5283     (QueryTableFrame.UpdateStatusText): Added event argument so
5284     that it can respond to grid selection events. The status text
5285     is now updated even when the table is not associated with a
5286     layer as was previously assumed.
5287     (QueryTableFrame.OnGridSelectRange, OnGridSelectCell): Removed.
5288     UpdateStatusText responds to these events.
5289     (QueryTableFrame.OnSaveAs): Renamed to doExport.
5290     (QueryTableFrame.doExport): Helper function that saves the
5291     entire table, or selected rows, to a file.
5292     (QueryTableFrame.OnExport, QueryTableFrame.OnExportSel): New.
5293     Respond to export button events and call doExport.
5294    
5295     * extensions/thuban/gdalwarp.cpp (ProjectRasterFile): Make sure
5296     the function doesn't return NULL without first setting a Python
5297     Error.
5298    
5299     * test/runtests.py (main): Only print "Unknown option" for
5300     unsupported options.
5301    
5302     * test/support.py (FloatComparisonMixin.assertFloatEqual): Take
5303     optional epsilon argument to specify floating point accuracy.
5304     (FloatComparisonMixin.assertFloatSeqEqual): Call assertFloatEqual
5305     for each item test.
5306    
5307     * test/test_csv_table.py (TestCSVTable.test_table_to_cvs): Add
5308     tests for saving selected records.
5309    
5310     * test/test_dbf_table.py (TestTableToDBF.test_table_to_dbf): Add
5311     tests for saving selected records.
5312    
5313     * test/test_map.py (TestMapWithContents.test_set_projection):
5314     MAP_PROJECTION_CHANGED events send the old projection.
5315    
5316     * test/test_session.py
5317     (TestSessionWithContent.test_forward_map_projection):
5318     MAP_PROJECTION_CHANGED events send the old projection.
5319    
5320     * test/test_table.py (TableTest): Update tests to use non-deprecated
5321     functions.
5322    
5323 bh 1376 2003-07-08 Bernhard Herzog <[email protected]>
5324    
5325 bh 1382 * Thuban/Model/transientdb.py (TransientTableBase.Width): The type
5326     constants in the column objects are the standard ones defined in
5327     the table module.
5328    
5329     * test/test_transientdb.py
5330     (TestTransientTable.test_transienttable_to_dbf): New. Test whether
5331     exporting transient tables as DBF works. This should catch the bug
5332     just fixed in TransientTableBase.Width.
5333    
5334     2003-07-08 Bernhard Herzog <[email protected]>
5335    
5336 bh 1380 * Thuban/Model/classgen.py (CustomRamp.GetProperties): Compute the
5337     interpolated colors correctly.
5338    
5339     * test/test_classgen.py (TestCustomRamp.test_color_interpolation):
5340     New. Test case for the fix in classgen.py
5341    
5342     2003-07-08 Bernhard Herzog <[email protected]>
5343    
5344 bh 1378 * test/runtests.py (main): Make the default output less verbose
5345     and add a verbosity option (-v) to get the old output
5346    
5347     2003-07-08 Bernhard Herzog <[email protected]>
5348    
5349 bh 1376 * Resources/XML/thuban-0.9.dtd: New. This will become the DTD for
5350     0.9.
5351    
5352     * Thuban/Model/transientdb.py (TransientJoinedTable.JoinType):
5353     New. Return the join type
5354    
5355     * Thuban/Model/save.py (SessionSaver.write_session): Use new 0.9
5356     DTD
5357     (SessionSaver.write_data_containers): Save the join type for
5358     joined tables
5359    
5360     * Thuban/Model/load.py (SessionLoader.__init__): Add the new 0.9
5361     namespace
5362     (SessionLoader.start_jointable): Handle the jointype attribute
5363    
5364     * test/test_load_0_8.py: New. Effectively a copy of test_load.py
5365     as of Thuban 0.8. These are now tests to determine whether Thuban
5366     can still read files generated by Thuban 0.8
5367    
5368     * test/test_load.py (LoadSessionTest.dtd)
5369     (TestSingleLayer.file_contents)
5370     (TestLayerVisibility.file_contents, TestLabels.file_contents)
5371     (TestLayerProjection.file_contents)
5372     (TestRasterLayer.file_contents, TestJoinedTable.file_contents)
5373     (TestJoinedTable.file_contents)
5374     (TestLoadError.file_contents): Update for new DTD
5375     (TestJoinedTable.file_contents, TestJoinedTable.setUp): Add test
5376     for new join type attribute
5377    
5378     * test/test_save.py (SaveSessionTest.dtd)
5379     (SaveSessionTest.testEmptySession)
5380     (SaveSessionTest.testSingleLayer)
5381     (SaveSessionTest.testLayerProjection)
5382     (SaveSessionTest.testRasterLayer)
5383     (SaveSessionTest.testClassifiedLayer)
5384     (SaveSessionTest.test_dbf_table)
5385     (SaveSessionTest.test_joined_table): Update for new DTD
5386     (SaveSessionTest.test_joined_table): Add test for new join type
5387     attribute
5388    
5389 bh 1372 2003-07-04 Bernhard Herzog <[email protected]>
5390    
5391     * Thuban/Model/table.py (_find_dbf_column_names): New. Helper
5392     function for table_to_dbf
5393     (table_to_dbf): Deal with names longer than the 10 character limit
5394    
5395     * test/test_dbf_table.py (TestTableToDBF.test_table_to_dbf): Add
5396     doc-string
5397     (TestTableToDBF.test_table_to_dbf_long_col_names): New test for
5398     long column names
5399    
5400 bh 1365 2003-07-03 Bernhard Herzog <[email protected]>
5401    
5402 bh 1370 * Doc/manual/thuban-manual.xml: Fix the CVS Revision Tag syntax
5403    
5404     2003-07-03 Bernhard Herzog <[email protected]>
5405    
5406 bh 1368 * Doc/manual/thuban-manual.xml, Doc/manual/README: New. Skeleton
5407     for the Thuban manual and README with some basic information about
5408     the manual
5409    
5410     2003-07-03 Bernhard Herzog <[email protected]>
5411    
5412 bh 1365 * Thuban/Model/transientdb.py (TransientJoinedTable.__init__):
5413     Update doc-string
5414     (TransientJoinedTable.create): Do not modify the column objects of
5415     the input tables in place and copy all columns of the input tables
5416     into the joined table after all.
5417    
5418     * test/test_transientdb.py
5419     (TestTransientTable.test_transient_joined_table_same_column_name):
5420     Update to reflect the new behavior
5421     (TestTransientTable.test_transient_joined_table_with_equal_column_names):
5422     Update to reflect the new behavior
5423     (TestTransientTable.test_transient_joined_table_name_collisions_dont_modify_in_place):
5424     New test case for a bug which modified the column objects in place
5425    
5426 jonathan 1360 2003-07-02 Jonathan Coles <[email protected]>
5427 jonathan 1349
5428 jonathan 1360 * Thuban/Model/classgen.py (generate_singletons,
5429     generate_uniform_distribution, generate_quantiles,
5430 jonathan 1363 GenQuantiles0): Make sure maxValue isn't less than
5431     one, otherwise we could divide by zero.
5432    
5433     * test/test_classgen.py (ClassGenTest.doClassRangeTest,
5434     ClassGenTest.doClassSingleTest): Call doBoundsTest to
5435     check the end classification groups against the
5436     proper property values.
5437     (ClassGenTest.doBoundsTest): New. Checks the first and
5438     last classification groups to make sure their properties
5439     are the correct upper and lower bounds for a color ramp.
5440    
5441     2003-07-02 Jonathan Coles <[email protected]>
5442    
5443     * Thuban/Model/classgen.py (generate_singletons,
5444     generate_uniform_distribution, generate_quantiles,
5445 jonathan 1360 GenQuantiles0): The denominator was one to high when
5446     calculating the index for the ramp causing the index
5447     to never to reach one.
5448    
5449     2003-07-02 Jonathan Coles <[email protected]>
5450    
5451 jonathan 1358 Changed the singature of ClassGroupRange.__init__ and
5452     ClassGroupRange.SetRange() so that the min/max values are
5453     passed as a tuple. This makes a better calling scheme for
5454     when a Range object is passed instead.
5455    
5456     * Thuban/Model/classgen.py: Fixed parameters to
5457     ClassGroupRange constructor.
5458    
5459     * Thuban/Model/classification.py (ClassGroupRange.__init__):
5460     Consolidate the min/max parameters into a single _range which
5461     can either be a tuple or a Range object.
5462     (ClassGroupRange.SetRange): Consolidate the min/max parameters
5463     into a single _range which can either be a tuple or a Range object.
5464    
5465     * Thuban/Model/load.py (SessionLoader.start_clrange): Fix
5466     call to ClassGroupRange constructor to use a tuple.
5467    
5468     * Thuban/Model/layer.py (Layer.SetClassification): Switch
5469     the classification instance variable to the new class
5470     before calling _set_layer otherwise subscribers to a
5471     LAYER_CHANGED event will not see any difference.
5472    
5473     * test/test_classification.py: Fix tests of ClassGroupRange
5474     so that they use the new signature.
5475    
5476     * test/test_load.py: Fix use of ClassGroupRange so that it
5477     uses the new signature.
5478    
5479     * test/test_load_0_2.py: Fix use of ClassGroupRange so that it
5480     uses the new signature.
5481    
5482     * test/test_save.py: Fix use of ClassGroupRange so that it
5483     uses the new signature.
5484    
5485    
5486     2003-07-01 Jonathan Coles <[email protected]>
5487    
5488 jonathan 1349 * Thuban/Model/classgen.py: Fixes RTbug #1972, 1971.
5489     Import used objects/class from color.
5490     (generate_singletons): We don't
5491     need the numGroups parameter anymore because we are using
5492     the new ramps with GetProperties().
5493     (generate_uniform_distribution): Use new ramp method
5494     GetProperties().
5495     (generate_quantiles, GenQuantiles0): Use new ramp method
5496     GetProperties().
5497     (CustomRamp.SetNumGroups): Removed. The ramps now map
5498     a value from 0 to 1 to class properties so the number
5499     of groups is not needed ahead of time.
5500     (CustomRamp.next): Removed. CustomRamp does not support
5501     interation anymore.
5502     (CustomRamp.GetProperties): Returns a ClassGroupProperties
5503     object based on the index value from 0 to 1 that is
5504     passed to it.
5505     (GreyRamp, RedRamp, GreenRamp, BlueRamp, GreenToRedRamp):
5506     Made into instances of Monochromatic class instread of
5507     deriving from it.
5508     (HotToCold.SetNumGroups): Removed. See CustomRamp.
5509     (HotToCold.next): Removed. See CustomRamp.
5510    
5511     * Thuban/Model/classification.py: Fixes RTbug #1973, 1971.
5512     (Classification.SetField, Classification.SetFieldType):
5513     Replaced with SetFieldInfo.
5514     (Classification.SetFieldInfo): New. Does a better job of
5515     what SetField and SetFieldType used to do by combining
5516     their function since they should really always be done
5517     at the same time.
5518     (Classification.SetLayer): Renamed to _set_layer.
5519     (Classification._set_layer): Should only be called from
5520     Layer's SetClassification. This does not cause a recursive
5521     call as SetLayer did because we know that Layer knows about
5522     the classification.
5523    
5524     * Thuban/Model/color.py: Fixes RTbug #1971.
5525     (_Transparent): Renamed from Transparent so it doesn't
5526     conflict with the module variable.
5527     (Transparent, Black): Renamed from Color.Transparent,
5528     Color.Black so they are not class variables.
5529    
5530     * Thuban/Model/layer.py: Fixes RTbug #1971, 1973.
5531     (Layer.Destroy): We don't need to call SetClassification
5532     anymore to clear out the back reference in the classifcation
5533     to the layer. It's better to set it to None using _set_layer,
5534     and we won't be creating another clas object too.
5535     (Layer.SetClassification): Classification._set_layer is not
5536     recursive so remove all the locking variables. Also clean
5537     up the code so that it remains unchanged if something fails.
5538    
5539     * Thuban/Model/load.py: Fixes RTbug #1971.
5540     (SessionLoader.start_classification): Call
5541     Classification.SetFieldInfo().
5542    
5543     * Thuban/Model/save.py: Removed import of Color which wasn't
5544     being used.
5545    
5546     * Thuban/UI/classgen.py: Fixes RTbug #1972.
5547     (ClassGenDialog.__init__): Color ramps are now instances
5548     already so we don't need to create any new objects.
5549     (ClassGenDialog.OnOK): Check for numGroups is no longer
5550     necessary because we never use it.
5551    
5552     * Thuban/UI/classifier.py: Fixes RTbug #1971.
5553     (Classifier.__BuildClassification, Classifier.__SetGridTable):
5554     Call Classification.SetFieldInfo() instead of SetFieldType.
5555    
5556     * Thuban/UI/renderer.py: Fixes RTbug #1971.
5557    
5558     * Thuban/UI/view.py: Fixes RTbug #1974, 1971.
5559     (MapCanvas.__init__): Subscribe to the idle time event. Set
5560     background color to white.
5561     (MapCanvas.OnPaint): Set a flag indicating that we should
5562     render the map during idle time. If we already have a bitmap
5563     just draw it now.
5564     (MapCanvas.OnIdle): New. Render the map only during idle time.
5565     This also fixes a problem with the busy cursor under gtk.
5566    
5567     * test/test_classgen.py (ClassGenTest.test_generate_singletons):
5568     Fix calls to generate_singletons because the signature changed.
5569    
5570     * test/test_classification.py: Fix color references and
5571     change calls to Classification.[SetField|SetFieldType] to
5572     SetFieldInfo.
5573    
5574     * test/test_load.py: Fix color references.
5575    
5576     * test/test_load_0_2.py: Fix color references.
5577    
5578     * test/test_save.py (SaveSessionTest.testClassifiedLayer):
5579     Change calls to Classification.[SetField|SetFieldType] to
5580     SetFieldInfo.
5581    
5582 frank 1334 2003-07-01 Frank Koormann <[email protected]>
5583    
5584     MERGE from the greater-ms3 branch.
5585    
5586     * test/test_transientdb.py
5587     (TestTransientTable.test_transient_joined_table_with_equal_column_names):
5588     New. Test join of two tables with partly equal column names.
5589    
5590     * Thuban/Model/transientdb.py (TransientJoinedTable.create):
5591     If duplicates in left and right tables column names are found,
5592     append '_' (underscores) to the name until it is unique.
5593     Create always new internal names for the resulting table and reference
5594     columns in the join statement with <table>.<column>
5595    
5596 bh 1329 2003-07-01 Bernhard Herzog <[email protected]>
5597    
5598     * test/test_transientdb.py
5599     (TestTransientTable.test_transient_joined_table_same_column_name):
5600     New. Test whether joining on columns with the same names in both
5601     tables works.
5602 frank 1334
5603 bh 1329 * Thuban/Model/transientdb.py (TransientJoinedTable.create): Make
5604     sure to use the right internal names even when joining on field
5605     with the same names in both tables. Also, detect duplicate names
5606     in the joined table correctly.
5607    
5608 frank 1325 2003-07-01 Frank Koormann <[email protected]>
5609    
5610     * Thuban/UI/renderer.py (ExportRenderer.render_legend):
5611     Reverse List of layers to render in same order as in desktop legend.
5612    
5613 jonathan 1318 2003-06-30 Jonathan Coles <[email protected]>
5614    
5615 jonathan 1349 * Thuban/version.py (make_tuple): Takes a version string
5616     and splits it into a tuple of at most three integers.
5617     Used make_tuple() to make tuple versions of the version
5618     numbers.
5619    
5620     * Thuban/UI/about.py: Add Thuban email addresses.
5621    
5622     2003-06-30 Jonathan Coles <[email protected]>
5623    
5624 jonathan 1320 * Thuban/version.py: SQLite/PySQLite version dependencies
5625     were too high.
5626    
5627     2003-06-30 Jonathan Coles <[email protected]>
5628    
5629 jonathan 1318 * Thuban/version.py: Update version to 0.8.1
5630    
5631     * MANIFEST.in: Added Projections so that default.proj is
5632     included.
5633    
5634 jonathan 1312 2003-06-26 Jonathan Coles <[email protected]>
5635    
5636     New About box with lots more information including library
5637     versions and credits. More/better version checking before
5638     Thuban starts.
5639    
5640     * Thuban/UI/about.py: New. New About box that displays
5641     library version information and credits.
5642    
5643     * Thuban/version.py: Added new 'versions' dictionary which
5644     contains the verions of various libraries which are checked
5645     when the module loads.
5646     (verify_versions): Check all version numbers and returns
5647     a list of errors.
5648    
5649     * Thuban/UI/classifier.py (Classifier.__EnableButtons):
5650     Reset the status of the buttons as the situation warrants,
5651     but in a better more reliable way by not relying on the
5652     current status to determine what needs to change.
5653    
5654     * Thuban/UI/main.py (wxCHECK_VERSION): Removed. Not needed.
5655     (verify_versions): Remove most of the code since it is
5656     now in Thuban.version.verify_versions.o
5657    
5658     * Thuban/UI/mainwindow.py (MainWindow.About): Call new
5659     About box in Thuban.UI.about.
5660    
5661     * extensions/thuban/gdalwarp.cpp (get_gdal_version): New.
5662     Returns the version of gdal library being used as a string.
5663    
5664     * extensions/thuban/wxproj.cpp (check_version, check_version_gtk):
5665     Removed.
5666     (get_proj_version): Return the version of PROJ that the file
5667     was compiled with.
5668     (get_gtk_version): Return th version of GTK that the file
5669     was compiled with.
5670    
5671 jonathan 1304 2003-06-25 Jonathan Coles <[email protected]>
5672    
5673     * Thuban/UI/classifier.py (Classifier.EditSymbol): The parent
5674     of the SelectPropertiesDialog should be self so the window
5675     appears on top.
5676     (ClassGroupPropertiesCtrl.DoEdit): The parent
5677     of the SelectPropertiesDialog should be self so the window
5678     appears on top.
5679    
5680     * Thuban/UI/resource.py: Cleaned up how we determine file
5681     extensions.
5682     (GetImageResource): Return an wxImage from our Resources.
5683    
5684 jonathan 1299 2003-06-24 Jonathan Coles <[email protected]>
5685    
5686     * Thuban/UI/renderer.py (ExportRenderer.render_legend):
5687     Check that a layer has a classification before trying
5688     to get it. Raster layers don't have classifications.
5689    
5690 jonathan 1286 2003-06-23 Jonathan Coles <[email protected]>
5691 jonathan 1297
5692     * setup.py: Add Resources/XML to resource list.
5693    
5694     2003-06-23 Jonathan Coles <[email protected]>
5695 jonathan 1286
5696 jonathan 1297 * setup.cfg: Fix copyright dates
5697    
5698     2003-06-23 Jonathan Coles <[email protected]>
5699    
5700 jonathan 1294 * MANIFEST.in: Update with Resources/XML
5701    
5702     * setup.py: Don't include Locale resources yet as we don't
5703     have any and it causes problems building the distribution
5704     for Windows. Update version to 0.8.0.
5705    
5706     * Doc/thuban.dtd: Removed since it is now in Resources/XML.
5707    
5708     * Thuban/UI/mainwindow.py: Add blank line at the end because
5709     file was not being read correctly building the Windows
5710     distribution.
5711    
5712     2003-06-23 Jonathan Coles <[email protected]>
5713    
5714 jonathan 1289 * Thuban/UI/mainwindow.py (MainWindow.About): Fix text.
5715    
5716     * Thuban/version.py: Temporarily update longversion for
5717     the 0.8 release so that it doesn't have the cvs revision.
5718    
5719     2003-06-23 Jonathan Coles <[email protected]>
5720    
5721 jonathan 1286 * Thuban/UI/common.py (ThubanBeginBusyCursor): Call wxSafeYield
5722     to make sure that we don't create reentrant possibilities with
5723     wxYield.
5724    
5725     * Thuban/UI/view.py (MapCanvas.OnPaint): Call wxBeginBusyCursor()
5726     directly to avoid the wxSafeYield() call which generates an
5727     OnPaint event causing infinite recursion. Don't try to catch
5728     exception anymore. This was for before there were limits on map
5729     scaling.
5730    
5731 bh 1283 2003-06-23 Bernhard Herzog <[email protected]>
5732    
5733     Bug fix for RT #1961:
5734    
5735     * Thuban/Model/load.py (SessionLoader.start_derivedshapesource):
5736     Register DerivedShapestores with the session
5737    
5738     * Thuban/Model/session.py (Session.Tables): Make sure each table
5739     is only listed once.
5740    
5741     * test/test_load.py (TestJoinedTable.test): Add check_format call.
5742     Update file contents to match the one written out.
5743    
5744 bh 1281 2003-06-20 Bernhard Herzog <[email protected]>
5745    
5746     * test/xmlsupport.py (SaxEventLister.startElementNS)
5747     (SaxEventLister.endElementNS): Do not include the qname. Python
5748     2.2.1 and 2.2.2 and 2.2.3 differ in this regard. In 2.2.1 qname it
5749     is (presumably incorrectly) None, whereas it's a string with the
5750     element name in the later versions.
5751    
5752     * test/test_xmlsupport.py (TestEventList.test_even_list_simple)
5753     (TestEventList.test_even_list_namespace): Update tests to reflect
5754     the new behaviour
5755     (TestEventList.test_even_list_id_normalization): Fix doc-string
5756    
5757 jonathan 1272 2003-06-20 Jonathan Coles <[email protected]>
5758    
5759 jonathan 1279 * Thuban/Model/layer.py (BaseLayer.HasShapes): New. Overridden
5760     by deriving classes to determine if that layer supports shapes.
5761     (Layer): Override HasShapes and return true.
5762    
5763     * Thuban/UI/classgen.py: Use Thuban[Begin|End]BusyCursor()
5764     instead of a direct call to wx[Begin|End]CusyCursor().
5765     (GenUniquePanel._OnRetrieve): Set busy cursor while retrieving
5766     table data.
5767    
5768     * Thuban/UI/common.py (ThubanBeginBusyCursor, ThubanEndBusyCursor):
5769     New. Wrappers around the wxWindows functions that allow us to
5770     make additional calls such as wxYield which gives the native
5771     system a chance to update the cursor correctly.
5772    
5773     * Thuban/UI/tableview.py: Use Thuban[Begin|End]BusyCursor()
5774     instead of a direct call to wx[Begin|End]CusyCursor().
5775    
5776     * Thuban/UI/view.py: Use Thuban[Begin|End]BusyCursor()
5777     instead of a direct call to wx[Begin|End]CusyCursor().
5778     (MapCanvas.find_shape_at): Check if the current search layer
5779     support shapes, otherwise go on to the next layer.
5780    
5781     * test/test_layer.py: Add tests in each type of layer for
5782     HasClassification() and HasShapes()
5783    
5784     2003-06-20 Jonathan Coles <[email protected]>
5785    
5786 jonathan 1272 * Thuban/UI/view.py (MapCanvas.OnPaint): Call wxYield after
5787     turning on the busy cursor to allow the system to change the
5788     cursor before we begin painting. This fixes a problem that
5789     was occuring only under GTK. Fixes RTbug #1840.
5790    
5791 bh 1270 2003-06-20 Bernhard Herzog <[email protected]>
5792    
5793     * Resources/XML/thuban-0.8.dtd: New DTD for the new file format
5794     version.
5795    
5796     * Thuban/Model/save.py (sort_data_stores): New. Make topological
5797     sort of the data sources so they can be written with sources that
5798     data sources that depend on other data sources come after the
5799     sources they depend on.
5800     (SessionSaver.__init__): Add idmap instance variable to map from
5801     objects to the ids used in the file.
5802     (SessionSaver.get_id, SessionSaver.define_id)
5803     (SessionSaver.has_id): New. Methods to manage the idmap
5804     (SessionSaver.write): Use thuban-0.8.dtd
5805     (SessionSaver.write_session): Add a namespace on the session and
5806     write out the data sources before the maps.
5807     (SessionSaver.write_data_containers): New. Write the data
5808     containers.
5809     (SessionSaver.write_layer): Layer elements now refer to a
5810     shapestore and don't contain filenames anymore.
5811    
5812     * Thuban/Model/load.py (LoadError): Exception class to raise when
5813     errors in the files are discovered
5814     (SessionLoader.__init__): Define dispatchers for elements with a
5815     thuban-0.8 namespace too.
5816     (SessionLoader.check_attrs): New helper method to check and
5817     convert attributes
5818     (AttrDesc): New. Helper class for SessionLoader.check_attrs
5819     (SessionLoader.start_fileshapesource)
5820     (SessionLoader.start_derivedshapesource)
5821     (SessionLoader.start_filetable, SessionLoader.start_jointable):
5822     Handlers for the new elements in the new fileformat
5823     (SessionLoader.start_layer): Handle the shapestore attribute in
5824     addition to filename.
5825     (SessionLoader.start_table, SessionLoader.end_table): Removed.
5826     They were never used in the old formats and aren't needed for the
5827     new.
5828    
5829     * Thuban/Model/session.py (Session.DataContainers): New method to
5830     return all "data containers", i.e. shapestores and tables
5831    
5832     * test/xmlsupport.py (SaxEventLister.__init__)
5833     (SaxEventLister.startElementNS, sax_eventlist): Add support to
5834     normalize IDs.
5835    
5836     * test/test_xmlsupport.py
5837     (TestEventList.test_even_list_id_normalization): New test case for
5838     id normalization
5839    
5840     * test/test_load.py (LoadSessionTest.check_format): Use ID
5841     normalization
5842     (LoadSessionTest.thubanids, LoadSessionTest.thubanidrefs): New
5843     class atrributes used for ID normalization
5844     (TestSingleLayer, TestLayerVisibility, TestLabels.test)
5845     (TestLayerProjection.test, TestRasterLayer.test): Adapt to new
5846     file format
5847     (TestJoinedTable): New test for loading sessions with joined
5848     tables.
5849     (TestLoadError): New. Test whether missing required attributes
5850     cause a LoadError.
5851    
5852     * test/test_save.py (SaveSessionTest.thubanids)
5853     (SaveSessionTest.thubanidrefs): New class attributes for ID
5854     normalization in .thuban files.
5855     (SaveSessionTest.compare_xml): Use id-normalization.
5856     (SaveSessionTest.testEmptySession)
5857     (SaveSessionTest.testLayerProjection)
5858     (SaveSessionTest.testRasterLayer)
5859     (SaveSessionTest.testClassifiedLayer): Adapt to new file format.
5860     (SaveSessionTest.testLayerProjection): The filename used was the
5861     same as for testSingleLayer. Use a different one.
5862     (SaveSessionTest.test_dbf_table)
5863     (SaveSessionTest.test_joined_table): New test cases for saving the
5864     new data sources structures.
5865     (TestStoreSort, MockDataStore): Classes to test the sorting of the
5866     data stores for writing.
5867    
5868     * test/runtests.py: Add CVS keywords
5869    
5870 jonathan 1265 2003-06-20 Jonathan Coles <[email protected]>
5871    
5872 jonathan 1267 * test/test_session.py
5873     (UnreferencedTablesTests.test_unreferenced_tables_with_joins):
5874     Use the cultural_landmark-point.dbf file for the store so that
5875     the table rows and shape count match.
5876    
5877     2003-06-20 Jonathan Coles <[email protected]>
5878    
5879 jonathan 1265 * Thuban/Model/data.py (DerivedShapeStore.__init__): Raise
5880     an exception if the number of shapes is different from the
5881     number of rows in the table. Address RTbug #1933.
5882    
5883     * test/test_layer.py (TestLayer.test_derived_store): Add
5884     a test for the new exception in DerivedShapeStore.__init__.
5885    
5886     * test/support.py (FloatTestCase): Removed since there is
5887     already FloatComparisonMixin. Fixes RTbug #1954.
5888     (FloatComparisonMixin.assertFloatEqual): Include test for
5889     infinity that was part of FloatTestCase.
5890    
5891     * test/test_range.py (RangeTest): Inherit from
5892     support.FloatComparisonMixin now that we don't have
5893     support.FloatTestCase.
5894    
5895 bh 1256 2003-06-20 Bernhard Herzog <[email protected]>
5896    
5897 bh 1260 * test/test_save.py (SaxEventLister, sax_eventlist): Removed. Use
5898     the implementation in xmlsupport instead.
5899     (SaveSessionTest.compare_xml): sax_eventlist is now in xmlsupport
5900    
5901     * test/test_proj.py: Import sax_eventlist from xmlsupport instead
5902     of test_save
5903    
5904     2003-06-20 Bernhard Herzog <[email protected]>
5905    
5906 bh 1258 * test/test_load.py (LoadSessionTest.check_format): New helper
5907     method to make sure the test files we load might have been written
5908     by the current thuban version.
5909     (ClassificationTest.TestLayers, TestSingleLayer.test)
5910     (TestLayerVisibility.test, TestClassification.test)
5911     (TestLabels.test, TestLayerProjection.test, TestRasterLayer.test):
5912     Add check_format() calls and fix the thuban data to match the data
5913     that would be written by saving the session loaded from it.
5914    
5915     * test/xmlsupport.py (SaxEventLister, sax_eventlist): Copies of
5916     the same class and function in test_save.
5917    
5918     * test/test_xmlsupport.py (TestEventList): New. test cases for
5919     sax_eventlist
5920    
5921     2003-06-20 Bernhard Herzog <[email protected]>
5922    
5923 bh 1256 * Resources/XML/thuban.dtd: Add comment about which versions of
5924     Thuban are covered by this DTD
5925     (map): Fix content model for layers and raster layers. There can
5926     be any number or layers and raster layers in any order.
5927    
5928 jonathan 1254 2003-06-20 Jonathan Coles <[email protected]>
5929    
5930 jonathan 1265 This is mainly about fixing RTbug #1949.
5931    
5932 jonathan 1254 * Thuban/Model/classification.py: Remove "from __future__"
5933     import statement since python 2.2 is the earliest supported
5934     version.
5935    
5936     * Thuban/Model/proj.py (Projection.GetProjectedUnits): New.
5937     Currently returns PROJ_UNITS_METERS or PROJ_UNITS_DEGREES
5938     depending on the units this projection *forwards* into.
5939    
5940     * Thuban/Model/save.py (SessionSaver.write_classification):
5941     Remove unnecessary use of lambdas and nested functions.
5942    
5943     * Thuban/UI/legend.py (ScaleBarBitmap.__SetScale): Do scale
5944     adjustment here if the map projection uses degrees.
5945    
5946     * Thuban/UI/scalebar.py (ScaleBar.DrawScaleBar): Remove
5947     scale adjust code since it is now done before calling
5948     this method. Don't do anything if the map projection
5949     is None.
5950    
5951 bh 1244 2003-06-19 Bernhard Herzog <[email protected]>
5952    
5953 bh 1248 Move version specific load tests to their own file.
5954    
5955     * test/test_load.py: Expand the doc-string to explain a bit how to
5956     handle file format changes.
5957     (TestClassification.test): Update the docstring as this test is
5958     not about Thuban 0.2 anymore.
5959    
5960     * test/test_load_0_2.py: New file with the load tests for thuban
5961     files created with Thuban 0.2 and earlier.
5962    
5963     2003-06-19 Bernhard Herzog <[email protected]>
5964    
5965 bh 1246 Add XML validation to some of the tests. Validation will only be
5966     done if pyRXP is installed (http://reportlab.com/xml/pyrxp.html).
5967     To make the DTD available to the test cases it's moved into
5968     Resources/XML
5969    
5970     * Resources/XML/thuban.dtd: New. This is now the real Thuban DTD
5971     for versions up to and including 0.2. Two slight changes: added an
5972     encoding specification and fixed the comment which refered to
5973     GRASS, not Thuban
5974    
5975     * test/xmlsupport.py: New support module for tests involving XML.
5976     Currently there's a mix-in class for XML validation.
5977    
5978     * test/test_xmlsupport.py: New. Tests for the xmlsupport module
5979    
5980     * test/test_save.py (SaveSessionTest): Derive from ValidationTest
5981     so that we can validate the
5982     (SaveSessionTest.testEmptySession)
5983     (SaveSessionTest.testSingleLayer)
5984     (SaveSessionTest.testSingleLayer)
5985     (SaveSessionTest.testLayerProjection)
5986     (SaveSessionTest.testRasterLayer)
5987     (SaveSessionTest.testClassifiedLayer): Validate the generated XML
5988    
5989     * test/runtests.py (main): Call print_additional_summary instead
5990     of print_garbage_information
5991    
5992     * test/support.py (resource_dir): New function to return the
5993     "Resource" subdirectory
5994     (print_additional_summary): New function to combine several
5995     summary functions
5996     (run_tests): Use print_additional_summary instead of calling
5997     print_garbage_information directly
5998    
5999     2003-06-19 Bernhard Herzog <[email protected]>
6000    
6001 bh 1244 * Doc/thuban.dtd (classification): Correct the content model of
6002     the classification element.
6003     (projection): Add the "name" attribute
6004    
6005 frank 1242 2003-06-19 Frank Koormann <[email protected]>
6006    
6007     MERGE from the greater-ms3 branch.
6008    
6009     * Thuban/UI/scalebar.py (ScaleBar.DrawScaleBar): Apply conversion to
6010     scale if projection is latlong to get better estimate.
6011    
6012     Fix problem of hidden properties dialog under windows after double
6013     click on layer tree:
6014     The tree control always gets an Expanded / Collapsed event after
6015 joey 2162 the ItemActivated on double click, which raises the main window again.
6016     We add a second ItemActivated event to the queue, which simply
6017 frank 1242 raises the already displayed window.
6018    
6019     * Thuban/UI/legend.py (LegendTree.__init__): Instance variable
6020     raiseProperties initialized to prevent endless loops
6021     (LegendTree._OnItemActivated): Depending on self.raiseProperties
6022     simply raise the properties or open the dialog and issue a second
6023     event.
6024    
6025 jonathan 1235 2003-06-18 Jonathan Coles <[email protected]>
6026    
6027 jonathan 1239 * setup.py: Fix a few problems that occured under Windows.
6028    
6029     2003-06-18 Jonathan Coles <[email protected]>
6030    
6031 jonathan 1235 When Thuban loaded the map was redrawn twice because the
6032     legend was being opened after the mainwindow was created
6033     and not during its creation. This meant the map was drawn
6034     initially and then had to be redrawn when the legend
6035     caused the display to change. Now the legend is opened
6036     in the mainwindow constructor which resolves this issue.
6037    
6038     Also, although we were checking for the existence of
6039     gdal and gdalwarp modules, the gdalwarp extension was
6040     still being compiled (which may fail if the system doesn't
6041     have gdal installed). the build_ext command to setup.py
6042     now accepts the flags --with-gdal and --without-gdal.
6043     If --without-gdal is specified setup.py will try to
6044     use the gdal parameters specified by gdal-config. Under
6045     windows, those parameters have to be set in setup.py
6046     as with proj4 an wxWindows.
6047    
6048     * setup.py: Use a list instead of seperate variables for
6049     extension parameters so we can create a generic function
6050     that runs an appropriate *-config script.
6051     (run_cs_script): Renamed from run_wx_script and modified
6052     to accept a second argument which is a list of lists to
6053     be filled in by the values returned from running the command.
6054     (thuban_build_ext): New. Extends the build_ext command and
6055     provides the options --with-gdal/--without-gdal which then
6056     optionally includes the gdalwarp extension.
6057    
6058     * Thuban/Model/resource.py: First check if we can import
6059     the gdalwarp Thuban extension before checking for gdal.
6060     Also added some comments.
6061    
6062     * Thuban/UI/legend.py (ScaleBarBitmap.__SetScale): Check if
6063     the map is None which may be the case if none has been loaded
6064     yet.
6065    
6066     * Thuban/UI/main.py (main): Remove call to ShowLegend.
6067    
6068     * Thuban/UI/mainwindow.py (MainWindow.__init__): Call ShowLegend().
6069    
6070     * Thuban/UI/renderer.py: Check for gdal support before importing
6071     gdalwarp.
6072     (MapRenderer.render_map): Only try to optimize if we have gdal
6073     support otherwise nothing will get drawn.
6074    
6075 jonathan 1237 * Thuban/UI/view.py (MapCanvas.FitMapToWindow): This may be called
6076     during startup before a map has been created. Check if map is None
6077     before using it and do nothing if it is.
6078    
6079 jonathan 1224 2003-06-17 Jonathan Coles <[email protected]>
6080    
6081     Fix the problem with raster layers under Windows that caused
6082     Thuban to crash. The view should respond to layer projection
6083     changed events to update the display. Changes to a projection
6084     should not cause the map to be set to full extent.
6085    
6086     * Thuban/UI/view.py (MapCanvas.__init__): New instance variable
6087     current_map_proj to remember the current map projection so that
6088     when the projection changes we know what the previous projection
6089     was.
6090     (MapCanvas.SetMap): Unsubscribe and subscribe to
6091     LAYER_PROJECTION_CHANGED events.
6092     (MapCanvas.projection_changed): Split into two methods that respond
6093     to map and layer projection changes.
6094     (MapCanvas.map_projection_changed): New. Takes the current view and
6095     projects it using the new projection. This does not cause the
6096     map to be redrawn at full extent.
6097     (MapCanvas.layer_projection_changed): New. Cause a redraw which
6098     will draw each layer in its new projection.
6099    
6100     * extensions/thuban/bmpdataset.cpp (BMPDataset::Open): Call
6101     VSIFClose() not VSIFCloseL() to close the file. Fixes a crash
6102     under Windows.
6103    
6104     * extensions/thuban/gdalwarp.cpp (MFILENAME): Padding should be
6105     to twice sizeof(void*) because there are two digits for each
6106     hex byte.
6107    
6108 bh 1220 2003-06-16 Bernhard Herzog <[email protected]>
6109    
6110     Update to the layer interface: Direct access to the table,
6111     shapetable, shapefile and filename attributes is now actively
6112     deprecated by issuing deprecation warnings for all places where
6113     this happens.
6114    
6115     * Thuban/Model/layer.py (Layer.__getattr__): New. Implement access
6116     to the instance variables table, shapetable, shapefile and
6117     filename via __getattr__ so that we can issue a deprecation
6118     warning.
6119     (Layer.SetShapeStore): Don't set the deprecated instance variables
6120     any more
6121     (Layer.SetShapeStore): Don't use deprecated layer instance
6122     variables
6123     (Layer.Destroy): No need to explicitly remove the instance
6124     variables any more
6125     (Layer.GetFieldType, Layer.Shape): Don't use deprecated layer
6126     instance variables
6127    
6128     * Thuban/UI/classgen.py (ClassGenDialog.__init__)
6129     (GenUniformPanel._OnRetrieve, GenUniquePanel._OnRetrieve)
6130     (GenQuantilesPanel.GetList, GenQuantilesPanel.OnRetrieve): Don't
6131     use deprecated layer instance variables
6132    
6133     * Thuban/UI/classifier.py (Classifier.__init__): Don't use
6134     deprecated layer instance variables
6135    
6136     * Thuban/UI/identifyview.py (IdentifyListCtrl.selected_shape)
6137     (IdentifyGridCtrl.selected_shape): Don't set the deprecated layer
6138     instance variables
6139    
6140     * Thuban/UI/tableview.py (LayerTableGrid.select_shapes): Don't use
6141     deprecated layer instance variables
6142    
6143     * Thuban/UI/mainwindow.py (MainWindow.LayerShowTable): Don't use
6144     deprecated layer instance variables
6145    
6146     * Thuban/Model/save.py (SessionSaver.write_layer): Don't use
6147     deprecated layer instance variables
6148    
6149     * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer)
6150     (MapRenderer.polygon_render_param): Don't use deprecated layer instance
6151     variables
6152    
6153     * test/runtests.py (main): Turn Thuban's deprecation warnings into
6154     errors so that they're cought by the tests
6155    
6156     * test/test_load.py (TestSingleLayer.test): Don't use deprecated
6157     layer instance variables
6158    
6159 jonathan 1212 2003-06-16 Jonathan Coles <[email protected]>
6160    
6161     Fix a problem under Windows whereby if the user double-clicks on a
6162     layer in the legend that tree item will expand or collapse as well
6163     as open the layer properties dialog. The state of the tree item
6164     should not be affected.
6165    
6166     * Thuban/UI/legend.py (LegendTree.__init__): Add instance variable
6167     preventExpandCollapse and subscribe to expanding and collapsing
6168     events.
6169     (LegendTree.OnItemExpandCollapse): New. Responds to expanding and
6170     collapsing events and will veto the event if it has been triggered
6171     by the user double clicking on a layer.
6172     (LegendTree._OnItemActivated): Set preventExpandCollapse to indicate
6173     that an expanding/collapsing event should be vetoed.
6174    
6175 bh 1208 2003-06-13 Bernhard Herzog <[email protected]>
6176    
6177     * Thuban/UI/classifier.py (Classifier.OnClose)
6178     (Classifier.map_layers_removed)
6179     (Classifier.layer_shapestore_replaced): Unsubscribe the messages
6180     in OnClose and not in map_layers_removed or
6181     layer_shapestore_replaced to make sure it always happens when the
6182     dialog is closed
6183    
6184 jonathan 1201 2003-06-13 Jonathan Coles <[email protected]>
6185    
6186 jonathan 1203 This puts back a fix for Windows where a panel is needed so that
6187     the background of the table view appears correctly.
6188    
6189     * Thuban/UI/tableview.py (TableFrame.__init__): Add a panel
6190     object that can be used by derived classes to place any
6191     controls (including the grid) onto.
6192     (QueryTableFrame.__init__): Use the panel as the parent window
6193     for all the controls. Reparent the grid so that the panel is
6194     the parent. Call UpdateStatusText() to correctly initialize
6195     the status bar.
6196    
6197     2003-06-13 Jonathan Coles <[email protected]>
6198    
6199 jonathan 1201 * Thuban/UI/dialogs.py (ThubanFrame): New: a class that inherits
6200     from wxFrame (as opposed to wxDialog like the other classes)
6201     but otherwise behaves like the other classes. This is needed
6202     for the TableView which isn't really a dialog and needs to
6203     have a status bar and control buttons.
6204    
6205     * Thuban/UI/tableview.py (TableGrid.__init__): Create an
6206     instance variable to keep track of how many rows are selected.
6207     Subscribe once to the the events we are interested in.
6208     (ThubanGrid.OnRangeSelect): Only handle event if event handling
6209     hasn't been turned off.
6210     (ThubanGrid.OnSelectCell): Only handle event if event handling
6211     hasn't been turned off.
6212     (ThubanGrid.ToggleEventListeners): Rather than subscribe None
6213     as an event listener (which changes the event handler stack)
6214     simply set an instance variable to False. This is checked in
6215     the event handlers.
6216     (ThubanGrid.GetNumberSelected): Return the number of currently
6217     selected rows.
6218     (TableFrame): Inherit from ThubanFrame so we can have a
6219     status bar and control buttons.
6220     (QueryTableFrame.__init__): Create a status bar. Fixes RTbug #1942.
6221     Explicitly set which items are selected in the operator choice and
6222     action choice so there is always a valid selection. Fixes RTbug #1941.
6223     Subscribe to grid cell selection events so we can update the
6224     status bar.
6225     (QueryTableFrame.UpdateStatusText): Update the status bar with
6226     how many rows are in the grid, how many columns, and how many
6227     rows are selected.
6228     (QueryTableFrame.OnGridSelectRange, QueryTableFrame.OnGridSelectCell):
6229     Call UpdateStatusText when cells are (de)selected.
6230     (QueryTableFrame.OnQuery): Use the string value in the value
6231     combo if either the selected item index is 0 or if the string
6232     cannot be found in the predefined list (this happens if the
6233     user changes the text). Fixes RTbug #1940.
6234     Only turn off the grid event listeners if there a query comes
6235     back with a none empty list of ids. in the case that the list
6236     is empty this causes a grid.ClearSelection() call to actually
6237     clear the grid selection which causes the selected items in
6238     the map to be deselected. Fixes RTbug #1939.
6239    
6240     * test/test_save.py (XMLWriterTest.Encode): Check return values.
6241     Fixes RTbug #1851.
6242    
6243 bh 1195 2003-06-13 Bernhard Herzog <[email protected]>
6244    
6245     * Thuban/UI/identifyview.py (IdentifyView.__init__): Call
6246     self.selected_shape with the current selection to make sure the
6247     contents of the dialog are up to date when it's shown for the
6248     first time.
6249     The dialog used to work without this by luck. The recent fix to
6250     the connector module 'broke' a 'feature' the identify view was
6251     relying on, i.e that subscribing to a message in response to
6252     receiving a message of that type would mean that the new
6253     subscriber would also be called for the same message.
6254    
6255 jonathan 1169 2003-06-12 Jonathan Coles <[email protected]>
6256 jonathan 1175
6257 jonathan 1193 * extensions/thuban/gdalwarp.cpp: Removed debug printing as
6258     the image is rendered. Fixes RTbug #1937.
6259    
6260     2003-06-12 Jonathan Coles <[email protected]>
6261    
6262 jonathan 1191 * Thuban/Lib/fileutil.py: As is done under Windows, create the
6263 jonathan 1193 user directory if it doesn't exist on a posix system.
6264     Fixes RTbug #1815.
6265 jonathan 1191
6266     * Thuban/Model/resource.py (get_user_proj_files): Moved the
6267     called to get_application_dir here, so that the directory
6268     will only be called if this method is invoked.
6269    
6270     * Thuban/UI/projdialog.py (ProjFrame.__DoOnProjAvail): Clear
6271     the projfilepath if no projection is selected.
6272    
6273     2003-06-12 Jonathan Coles <[email protected]>
6274    
6275 jonathan 1182 * Thuban/UI/legend.py (ScaleBarBitmap.__SetScale): Don't draw
6276     the scalebar if the current map has no projection set.
6277    
6278     * Thuban/UI/projdialog.py (ProjFrame.__DoOnProjAvail): Set the
6279     projfilepath label to just the basename of the projection file
6280     rather than include the entire path.
6281    
6282     * Thuban/Model/resource.py: Fix missed proj functions that
6283     needed to be renamed.
6284    
6285     2003-06-12 Jonathan Coles <[email protected]>
6286    
6287 jonathan 1178 * Thuban/Model/classification.py: Removed assert statements that
6288     tested if the variable was an instance of Color.
6289    
6290     * Thuban/Model/color.py (Color): Remove commented code that isn't
6291     used.
6292     (Transparent): Renamed from NoColor. Doesn't inherit from Color.
6293     Fixes RTbug #1835.
6294     (Transparent.__eq__, Transparent.__ne, Transparent.__repr): New.
6295     Needed now that the class doesn't inherit from Color.
6296    
6297     2003-06-12 Jonathan Coles <[email protected]>
6298    
6299 jonathan 1175 * test/test_save.py (XMLWriterTest.testEncode): Explicitly
6300     check unicode strings.
6301    
6302     * test/test_layer.py: Check for existence of gdal.
6303    
6304     2003-06-12 Jonathan Coles <[email protected]>
6305 jonathan 1172
6306     * Thuban/Model/xmlreader.py: New. Contains the XMLReader class
6307     that was in load.py
6308 jonathan 1169
6309 jonathan 1172 * Thuban/Model/xmlwriter.py: New. Contains the XMLWriter class
6310     that was in save.py
6311    
6312     2003-06-12 Jonathan Coles <[email protected]>
6313    
6314 jonathan 1169 This is largely a collection of bug fixes. We also handle the
6315     case where gdal is not on the system. The XMLReader and XMLWriter
6316     classes were moved into there own files to resolve some circular
6317     import references and because they shouldn't really be in the
6318     file that is dediciated to reading/writing session files since
6319     they are also used elsewhere.
6320    
6321     * Thuban/Model/classgen.py: Renamed functions to follow the
6322     function_names_with_underscores style. Fixes RTbug #1903.
6323     (calculate_quantiles): Raise ValueError if 'percents' is invalid.
6324    
6325     * Thuban/Model/layer.py: Import gdal only if it available.
6326     (RasterLayer): Handle the case where the gdal library is unavailable.
6327     Addresses RTbug #1877.
6328    
6329     * Thuban/Model/load.py (XMLReader): Moved into seperate file
6330     xmlreader.py.
6331    
6332 jonathan 1172 2003-06-12 Jonathan Coles <[email protected]>
6333    
6334     This is largely a collection of bug fixes. We also handle the
6335     case where gdal is not on the system. The XMLReader and XMLWriter
6336     classes were moved into there own files to resolve some circular
6337     import references and because they shouldn't really be in the
6338     file that is dediciated to reading/writing session files since
6339     they are also used elsewhere.
6340    
6341     * Thuban/Model/classgen.py: Renamed functions to follow the
6342     function_names_with_underscores style. Fixes RTbug #1903.
6343     (calculate_quantiles): Raise ValueError if 'percents' is invalid.
6344    
6345     * Thuban/Model/layer.py: Import gdal only if it available.
6346     (RasterLayer): Handle the case where the gdal library is unavailable.
6347     Addresses RTbug #1877.
6348    
6349     * Thuban/Model/load.py (XMLReader): Moved into seperate file
6350     xmlreader.py.
6351    
6352 jonathan 1169 * Thuban/Model/save.py (escape, XMLWriter): Moved into seperate
6353     file xmlwriter.py.
6354    
6355     * Thuban/Model/resource.py: Renamed functions to following the
6356     function_names_with_underscores style.
6357     (has_gdal_support): New function that returns true if the gdal
6358     library is available. Addresses RTbug #1877.
6359    
6360     * Thuban/UI/application.py (ThubanApplication.OpenSession):
6361     Display a message box if the gdal library is not available, but
6362     only if there are any layers that would use it. Addresses RTbug #1877.
6363    
6364     * Thuban/UI/classgen.py: Use renamed projection resource functions.
6365     (GenUniformPanel.__CalcStepping): Fix a slight discrepency
6366     when using integers versus floats.
6367    
6368     * Thuban/UI/mainwindow.py (_has_gdal_support): New. Used to
6369     determine if the "Add Image Layer" menu option should be
6370     greyed out or not. Addresses RTbug #1877.
6371    
6372     * Thuban/UI/projdialog.py: Use renamed projection resource functions.
6373    
6374     * Thuban/UI/renderer.py (MapRenderer.render_map): Only try to
6375     optimize if a raster layer is visible. Fixes RTbug #1931.
6376     Only draw the raster layer if the gdal library is available.
6377     Addresses RTbug #1877.
6378    
6379     * test/test_classgen.py: Add tests for generate_singletons,
6380     generate_uniform_distribution, generate_quantiles. Fixes RTbug #1903.
6381     (test_calculate_quantiles): Fix some tests to catch the new
6382     ValueError that is raised.
6383    
6384     * test/test_proj.py: Use renamed projection resource functions.
6385    
6386     * test/test_save.py (SaveSessionTest.testClassifiedLayer): New
6387     test for saving classified layers. Fixes RTbug #1902.
6388     (XMLWriterTest): New. Tests the XMLWriter class. Fixes RTbug #1851.
6389    
6390 jan 1156 2003-06-12 Jan-Oliver Wagner <[email protected]>
6391    
6392     Fix for http://intevation.de/rt/webrt?serial_num=1900.
6393    
6394     * Thuban/UI/multiplechoicedialog.py: New. A multiple choice dialog.
6395    
6396     * Thuban/UI/mainwindow.py: import wxMultipleChoiceDialog from
6397     multiplechoicedialog.py rather than from the wxPython library.
6398    
6399 frank 1151 2003-06-11 Frank Koormann <[email protected]>
6400    
6401 frank 1152 * Thuban/Lib/fileutil.py (get_application_dir): Minor stability
6402     update.
6403    
6404     2003-06-11 Frank Koormann <[email protected]>
6405    
6406 frank 1151 * Thuban/Lib/fileutil.py (get_application_dir): New function to
6407     determine the absolute .thuban/thuban directory under
6408     "posix" (os.expanduser) and "nt" (read AppData registry key).
6409    
6410     * Thuban/Model/resource.py: Use get_application_dir
6411    
6412     * Thuban/UI/application.py (ThubanApplication.read_startup_files):
6413     Use get_application_dir.
6414    
6415 bh 1143 2003-06-10 Bernhard Herzog <[email protected]>
6416    
6417 bh 1147 * Thuban/UI/tableview.py (LayerTableFrame.__init__): Subscribe to
6418     the messages MAP_LAYERS_REMOVED messages
6419     (LayerTableFrame.OnClose): Unsubscribe from it.
6420     (LayerTableFrame.map_layers_removed): New. Receiver for
6421     MAP_LAYERS_REMOVED. Close the dialog when the layer whose the
6422     dialog is showing is removed.
6423    
6424     2003-06-10 Bernhard Herzog <[email protected]>
6425    
6426 bh 1145 * Thuban/Lib/connector.py (Connector.Issue): Iterate over a copy
6427     of the receivers list so that unsubscribing in a receiver doesn't
6428     modify it while iterating over it.
6429    
6430     * test/test_connector.py
6431     (ConnectorTest.test_disconnect_in_receiver): New. Test whether
6432     unsubscribing in a receiver works correctly. See docstring for
6433     details
6434    
6435     2003-06-10 Bernhard Herzog <[email protected]>
6436    
6437 bh 1143 * Thuban/Model/messages.py (LAYER_SHAPESTORE_REPLACED): New
6438     message.
6439    
6440     * Thuban/Model/layer.py (Layer.SetShapeStore): Send
6441     LAYER_SHAPESTORE_REPLACED when the shapestore changes. A
6442     LAYER_CHANGED will still be sent if the classification changes.
6443    
6444     * Thuban/UI/classifier.py (Classifier.__init__): Add the map as
6445     parameter so we can subscribe to some of its messages
6446     (Classifier.__init__): Subscribe to the map's MAP_LAYERS_REMOVED
6447     and the layer's LAYER_SHAPESTORE_REPLACED
6448     (Classifier.unsubscribe_messages): New. Unsubscribe from message
6449     subscribed to in __init__
6450     (Classifier.map_layers_removed)
6451     (Classifier.layer_shapestore_replaced): receivers for the messages
6452     subscribed to in __init__. Unsubscribe and close the dialog
6453    
6454     * Thuban/UI/mainwindow.py (MainWindow.OpenLayerProperties): Pass
6455     the map to the Classifier dialog
6456    
6457     * test/test_layer.py (SetShapeStoreTests): Derive from
6458     SubscriberMixin as well so we can test messages
6459     (SetShapeStoreTests.setUp): Subscribe to some of the layer's
6460     messages
6461     (SetShapeStoreTests.tearDown): Clear the messages again
6462     (SetShapeStoreTests.test_sanity): Expand the doc-string and check
6463     for the modified flag too
6464     (SetShapeStoreTests.test_set_shape_store_modified_flag): New test
6465     to check whether SetShapeStore sets the modified flag
6466     (SetShapeStoreTests.test_set_shape_store_different_field_name)
6467     (SetShapeStoreTests.test_set_shape_store_same_field)
6468     (SetShapeStoreTests.test_set_shape_store_same_field_different_type):
6469     Add tests for the messages. This checks both the new
6470     LAYER_SHAPESTORE_REPLACED and the older LAYER_CHANGED
6471    
6472 jan 1141 2003-06-06 Jan-Oliver Wagner <[email protected]>
6473    
6474     * Thuban/UI/mainwindow.py: Improved and partly added help texts for
6475     the menu items.
6476    
6477 frank 1134 2003-06-05 Frank Koormann <[email protected]>
6478    
6479 frank 1139 * Thuban/UI/identifyview.py (IdentifyView.__init__):
6480     Layout reimplemented without panel. Make life easier to fit the list
6481     in the dialog.
6482    
6483     2003-06-05 Frank Koormann <[email protected]>
6484    
6485 frank 1137 * Thuban/UI/projdialog.py (ProjFrame.__init__): Fill the projchoice
6486     once on initialisation (Former implementation resulted in multiple
6487     entries for each projection).
6488     (ProjFrame.__FillAvailList): selectProj as second optional parameter,
6489     if set, select the projection found under the specified name. This
6490     overwrites any other selection estimate.
6491     Removed projchoice filling from this method.
6492     (ProjFrame._OnSave, ProjFrame._OnAddToList):
6493     Updated call of ProjFrame.__FillAvailList
6494     (LCCPanel._DoLayout): Moved parameter controls in more common order.
6495    
6496     * Resources/Projections/defaults.proj: Extended defaults representing
6497     various common European projections.
6498    
6499     2003-06-05 Frank Koormann <[email protected]>
6500    
6501 frank 1134 * Thuban/UI/identifyview.py (IdentifyView.__init__):
6502     Use ListCtrl instead of GridCtrl
6503    
6504     * Thuban/Model/resource.py:
6505     Guess location of .thuban directory from tempdir parent directory.
6506    
6507     * Thuban/UI/application.py (ThubanApplication.read_startup_files):
6508     Guess location of .thuban directory from tempdir parent directory.
6509    
6510 bh 1130 2003-06-04 Bernhard Herzog <[email protected]>
6511    
6512     Do not cache the values returned by the tree widget's
6513     GetFirstChild and GetNextChild methods because it led to lots of
6514     segfaults. The new way requires more brute force but is more
6515     reliable.
6516    
6517     * Thuban/UI/legend.py (LegendTree.__init__): Remove instance
6518     variable layer2id
6519     (LegendTree.find_layer): New method to do with brute force what
6520     layer2id tried to accomplish
6521     (LegendTree._OnMsgLayerChanged)
6522     (LegendTree._OnMsgLayerTitleChanged, LegendTree.__ShowHideLayer):
6523     Use find_layer instead of layer2id
6524     (LegendTree.__RemoveLayer, LegendTree.__AddLayer): No need to
6525     update layer2id anymore
6526     (LegendTree._OnMsgMapLayersRemoved)
6527     (LegendTree._OnMsgMapLayersAdded): Get by without layer2id.
6528    
6529 tkoester 1128 2003-06-03 Thomas Koester <[email protected]>
6530    
6531     * Thuban/Model/classgen.py (GenQuantiles0): New function.
6532    
6533 bh 1120 2003-06-02 Bernhard Herzog <[email protected]>
6534    
6535 bh 1127 * Thuban/UI/mainwindow.py (layer_rename command, table_rename command):
6536     New commands.
6537     (main_menu): Add the new commands.
6538     (MainWindow.TableRename): New. Implementation of the table_rename
6539     command.
6540     (MainWindow.RenameLayer): New. Implementation of the layer_rename
6541     command.
6542    
6543     * Thuban/Model/session.py (Session.AddTable): call self.changed to
6544     set the modified flag
6545    
6546     * test/test_session.py (TestSessionSimple.test_add_table): Test
6547     whether the modified flag is set properly
6548    
6549     * Thuban/Model/base.py (TitledObject.SetTitle): Call changed
6550     instead of issue so that the modified flags get updated.
6551    
6552     * test/test_base.py (SomeTitledObject): Derive from Modifiable
6553     instead of Publisher to reflect reality better and to accomodate
6554     the fact that SetTitle now calls changed instead of issue
6555    
6556     2003-06-02 Bernhard Herzog <[email protected]>
6557    
6558     * Thuban/UI/classgen.py (GenQuantilesPanel.GetList): Resource
6559     acquisition has to happen before the try in a try-finally.
6560    
6561     2003-06-02 Bernhard Herzog <[email protected]>
6562    
6563 bh 1120 * Thuban/UI/legend.py (LegendTree._OnMsgMapLayersRemoved): It's
6564     possible that a layer is removed that is not currently selected in
6565     the legend so don't check for this.
6566    
6567 bh 1112 2003-05-30 Bernhard Herzog <[email protected]>
6568    
6569 bh 1118 * Thuban/Model/layer.py (Layer.Destroy): Set all instance
6570     variables to None that have direct or indirect references to
6571     shapefiles or dbf files to make sure that they do go away and the
6572     files are closed.
6573    
6574     2003-05-30 Bernhard Herzog <[email protected]>
6575    
6576 bh 1116 * Thuban/UI/legend.py (LegendTree.GetRootItem): Reset
6577     availImgListIndices when a new image list is created
6578    
6579     2003-05-30 Bernhard Herzog <[email protected]>
6580    
6581 bh 1114 * Thuban/UI/legend.py (LegendTree.__init__): New instance variable
6582     changing_selection to indicate whether the LegendTree code itself
6583     is currently changing the selection
6584     (LegendTree.normalize_selection): New method to normalize the
6585     selection by selecting the layer item even if the user clicked on
6586     the classification.
6587     (LegendTree._OnSelChanged): normalize the selection. This works
6588     around a bug in wx which doesn't keep track of the selection
6589     properly when subtrees are deleted.
6590    
6591     2003-05-30 Bernhard Herzog <[email protected]>
6592    
6593 bh 1112 * Thuban/UI/view.py (MapCanvas.set_view_transform): Limit the
6594     maximum and minimum scale factors.
6595    
6596     * test/test_classgen.py (ClassGenTest.test): Update to reflect the
6597     changes in classgen.py
6598    
6599 jonathan 1109 2003-05-30 Jonathan Coles <[email protected]>
6600    
6601     * Thuban/Model/classgen.py: Remove ClassGenerator class but make
6602     all the methods functions. Fixes RTBug #1903.
6603    
6604     * Thuban/Model/map.py (Map.TopLayer, Map.BottomLayer): Renamed
6605     to MoveLayerToTop and MoveLayerToBottom respectively. Fixes
6606     RTBug #1907.
6607    
6608     * Thuban/UI/classgen.py: Use classgen functions that were part
6609     of the ClassGenerator class. Put try/finally blocks around
6610     code that uses wxBeginBusyCursor()/wxEndBusyCursor(). Fixes
6611     RTBug #1904.
6612    
6613     * Thuban/UI/classifier.py: Remove unused import of ClassGenerator.
6614    
6615     * Thuban/UI/legend.py: The legend was cleared and repopulated any
6616     time something changed which caused some state to be lost such
6617     as which children were expanded or collapsed. Fixes RTBug #1901.
6618     (LegendTree._OnMsgMapLayersAdded): Add only new layers.
6619     (LegendTree.__OnMsgMapLayersRemoved): Remove layers that exist in
6620     the legend but not in the map.
6621     (LegendTree.__FillTree): Move main functionality out into smaller
6622     methods that can be used by other methods.
6623     (LegendTree.__FillTreeLayer): Reuse old slots in the image list
6624     if they are available.
6625     (LegendTree.DeleteAllItems): Renamed from __DeleteAllItems so
6626     that we override the wxTreeCtrl method. Iterate over children
6627     and call __RemoveLayer.
6628     (LegendTree.__AddLayer): New. Add a new layer to the legend.
6629     (LegendTree.__RemoveLayer): Remove a layer from the legend.
6630     (LegendTree.DeleteChildren): New, overrides wxTreeCtrl method.
6631     Should only be called with the id of a layer branch.
6632     (LegendTree.GetRootItem): New, overrides wxTreeCtrl method.
6633     Returns the root item or creates one if necessary.
6634    
6635     * Thuban/UI/renderer.py (MapRenderer.draw_raster_layer): Call
6636     ProjectRasterFile with tuple arguments instead of strings.
6637    
6638     * Thuban/UI/tableview.py (QueryTableFrame.OnQuery): Wrap code
6639     with try/finally. Fixes RTBug #1904.
6640    
6641     * Thuban/UI/view.py (MapCanvas.OnPaint): Wrap code
6642     with try/finally. Fixes RTBug #1904.
6643     (MapCanvas.FitSelectedToWindow): If a single point is selected
6644     simply center it on the display. Fixes RTBug #1849.
6645    
6646     * extensions/thuban/gdalwarp.cpp: Removed code that allowed gdalwarp
6647     to be compiled as a standalone app. Now the code can only be
6648     called from Python which simplifies the parameter passing.
6649     (ProjectRasterFile): Handle Python arguments. Remove code that
6650     checks for a destination dataset. Add more clean up code.
6651    
6652     * test/test_map.py (TestMapWithContents.test_raise_layer_top,
6653     TestMapWithContents.test_lower_layer_bottom):
6654     Test Map.MoveLayerToTop() and Map.MoveLayerToBottom() respectively.
6655     Fixes RTBug #1907.
6656    
6657     * Thuban/UI/mainwindow.py (MainWindow.ToggleLegend): Apply a full
6658     extent to the map when the legend is toggled. Fixes RTBug #1881.
6659    
6660 jan 1097 2003-05-29 Jan-Oliver Wagner <[email protected]>
6661    
6662     * Thuban/UI/tableview.py (LayerTableFrame.OnClose): Bug-fix: Now
6663     unsubscribes all that is subcribed in __init__.
6664    
6665 bh 1089 2003-05-28 Bernhard Herzog <[email protected]>
6666    
6667 bh 1095 * Thuban/UI/mainwindow.py (MainWindow.DuplicateLayer)
6668     (MainWindow.CanDuplicateLayer): New methods to implement the
6669     Layer/Duplicate command.
6670     (layer_duplicate command): New.
6671     (main_menu): Add layer_duplicate to the Layer menu.
6672    
6673     2003-05-28 Bernhard Herzog <[email protected]>
6674    
6675 bh 1093 * Thuban/UI/tableview.py (NullRenderer.Draw): New. Our own
6676     renderer so that NULL/None values get displayed differently (by a
6677     gray rectangle).
6678     (TableGrid.__init__): Override the default renderers
6679    
6680     2003-05-28 Bernhard Herzog <[email protected]>
6681    
6682 bh 1089 * Thuban/Model/layer.py (Layer.SetShapeStore): Set the
6683     classification to "None" if the type of the field has changed.
6684    
6685     * test/test_layer.py (SetShapeStoreTests): New. Class with a few
6686     test for the Layer.SetShapeStore method
6687    
6688 jan 1087 2003-05-28 Jan-Oliver Wagner <[email protected]>
6689 jan 1085
6690 jan 1087 * Thuban/Model/layer.py (Layer.TreeInfo): Fixed a bug (a layer
6691     does not necessarily have a filename).
6692    
6693     2003-05-28 Jan-Oliver Wagner <[email protected]>
6694    
6695 jan 1085 * Thuban/UI/mainwindow.py (MainWindow.TableClose, MainWindow.TableShow):
6696     sort the selection list for the dialog.
6697    
6698 frank 1083 2003-05-28 Frank Koormann <[email protected]>
6699    
6700     * extensions/thuban/wxproj.cpp
6701     (project_point): Removed cast to int for projected point coordinates.
6702     (shape_centroid): Return last point if all polygon vertices fall
6703     to one point.
6704    
6705 bh 1079 2003-05-28 Bernhard Herzog <[email protected]>
6706    
6707 bh 1081 * Thuban/UI/mainwindow.py (_can_unjoin): Add doc-string and cope
6708     with layers that don't have shapestores, i.e. raster layers.
6709    
6710     2003-05-28 Bernhard Herzog <[email protected]>
6711    
6712 bh 1079 * Thuban/Model/table.py (DBFTable.__init__): Omit the extension
6713     when determining the title from the filename.
6714    
6715     * test/test_dbf_table.py (TestDBFTable.test_title): Update to
6716     reflect changes in the way the title is derived from the filename
6717    
6718 frank 1077 2003-05-28 Frank Koormann <[email protected]>
6719    
6720     * Thuban/UI/mainwindow.py (MainWindow.TableShow):
6721     Added wxDEFAULT_DIALOG_STYLE to show table dialog styles.
6722    
6723 bh 1069 2003-05-27 Bernhard Herzog <[email protected]>
6724    
6725 bh 1075 * Thuban/UI/mainwindow.py (MainWindow.delegated_messages): Also
6726     delegate SelectedLayer.
6727     (MainWindow.LayerUnjoinTable): Implement.
6728     (_can_unjoin): New. Helper function for the sensitivity of the
6729     layer/unjoin command.
6730    
6731     * Thuban/Model/data.py (ShapefileStore.OrigShapeStore)
6732     (DerivedShapeStore.OrigShapeStore): New. Return the original
6733     shapestore. Used to figure out how to unjoin.
6734     (DerivedShapeStore.Shapefile): Fix a typo.
6735    
6736     2003-05-27 Bernhard Herzog <[email protected]>
6737    
6738 bh 1073 * Thuban/UI/join.py (JoinDialog): Extend to handle layer joins as
6739     well
6740     (JoinDialog.__init__): Use the layer parameter and only build the
6741     left choice when a layer is given
6742     (JoinDialog.OnJoin): Handle layer joins as well
6743     (JoinDialog.OnLeftTable, JoinDialog.OnRightTable): Handle the case
6744     that the user selects the "Select..." item. The sensitivitly
6745     updating is now in update_sensitivity
6746     (JoinDialog.y): New method to refactor the sensitivity update of
6747     the join button into its own method.
6748    
6749     * Thuban/UI/mainwindow.py (MainWindow.LayerJoinTable): Implement.
6750    
6751     2003-05-27 Bernhard Herzog <[email protected]>
6752    
6753 bh 1071 * Thuban/UI/mainwindow.py (table_close command): Make it sensitive
6754     iff there are unreferenced tables in the session
6755    
6756     2003-05-27 Bernhard Herzog <[email protected]>
6757    
6758 bh 1069 * Thuban/Model/messages.py (TABLE_REMOVED): New message.
6759    
6760     * Thuban/Model/session.py (Session.UnreferencedTables): New method
6761     to return tables that are not referenced by other tables or shape
6762     stores and can be removed.
6763     (Session.RemoveTable): Issue a TABLE_REMOVED message after
6764     removing the table
6765    
6766     * Thuban/UI/mainwindow.py: Remove unused imports
6767     (MainWindow.TableClose): Implement.
6768    
6769     * Thuban/UI/tableview.py (TableFrame.__init__): Subscribe to some
6770     messages so that the frame will be automatically closed when a new
6771     session is opened or the table is removed.
6772     (TableFrame.OnClose): Unsubscribe the Subscriptions made in
6773     __init__
6774     (TableFrame.close_on_session_replaced)
6775     (TableFrame.close_on_table_removed): New. Subscribers that close
6776     the window
6777    
6778     * test/test_session.py (TestSessionMessages.test_remove_table)
6779     (TestSessionSimple.test_remove_table): Move the test to
6780     TestSessionSimple and add test for the TABLE_REMOVED message
6781     (TestSessionBase.setUp): Also subscribe to TABLE_REMOVED
6782     (TestSessionSimple.test_unreferenced_tables) New. Test for the
6783     UnreferencedTables method.
6784     (UnreferencedTablesTests): New. Class with some more sophisticated
6785     tests for UnreferencedTables.
6786    
6787 frank 1065 2003-05-27 Frank Koormann <[email protected]>
6788    
6789 frank 1067 * Thuban/UI/tableview.py (QueryTableFrame.__init__): The "_S_election"
6790     display has some unwanted side effects. Removed again.
6791    
6792     2003-05-27 Frank Koormann <[email protected]>
6793    
6794 frank 1065 * Resources/Bitmaps/legend_icon_layer.xpm: New, icon for legend.
6795    
6796     * Thuban/UI/legend.py (LegendTree.__FillTree): Use "legend_icon_layer"
6797    
6798 jan 1062 2003-05-27 Jan-Oliver Wagner <[email protected]>
6799    
6800 bh 1069 * test/test_menu.py (MenuTest.test): Added test for
6801     Menu.RemoveItem().
6802 jan 1062
6803 bh 1069 * Thuban/UI/menu.py (Menu.RemoveItem): New. Remove an item from
6804     the menu.
6805 jan 1062
6806 frank 1059 2003-05-27 Frank Koormann <[email protected]>
6807    
6808     Nonmodal dialogs without parent (i.e. they can fall behind the main
6809     window)
6810    
6811     * Thuban/UI/mainwindow.py (MainWindow.OnClose): Explicitly destroy
6812     all dialogs in the dialogs dictionary and the canvas.
6813    
6814     * Thuban/UI/dialogs.py (NonModalNonParentDialog): New class, without
6815     parent, i.e. can fall behind other windows.
6816     (NonModalDialog.OnClose): Check is dialog is in mainwindow.dialog
6817     dictionary before removing it.
6818    
6819     * Thuban/UI/classifier.py: Dialog derived from NonModalNonParentDialog
6820    
6821     * Thuban/UI/projdialog.py: Dialog derived from NonModalNonParentDialog
6822     * Thuban/UI/tableview.py: Dialog derived from NonModalNonParentDialog
6823     * Thuban/UI/tree.py: Dialog derived from NonModalNonParentDialog
6824    
6825 bh 1053 2003-05-27 Bernhard Herzog <[email protected]>
6826    
6827 bh 1055 * Thuban/UI/mainwindow.py (MainWindow.ShowTableView): New. Open a
6828     tableview dialog
6829     (MainWindow.TableShow): Use ShowTableView to open the dialogs.
6830     Also, don't use the table's titles as the dialog names. The titles
6831     aren't guaranteed to be unique.
6832     (MainWindow.TableOpen): Open a table view dialog after opening the
6833     table
6834    
6835     2003-05-27 Bernhard Herzog <[email protected]>
6836    
6837 bh 1053 * Thuban/UI/mainwindow.py: Remove the Table/Hide menu item. Its
6838     effect can be achieved by simply closing the window showing the
6839     table.
6840     (MainWindow.TableHide): Removed.
6841     (main_menu): Removed "table_hide"
6842    
6843 frank 1051 2003-05-27 Frank Koormann <[email protected]>
6844    
6845     Fix legend tree display problems under Win32
6846    
6847     * Thuban/UI/legend.py: BMP_SIZE_W = 15
6848     (LegendTree.__FillTree): Display "legend_icon_map.xpm" with layer title.
6849     (LegendTree.__FillTreeLayer): Explicitely set SelectedImage.
6850    
6851     * Resources/Bitmaps/legend_icon_map.xpm: New icon for legend.
6852    
6853 jan 1048 2003-05-27 Jan-Oliver Wagner <[email protected]>
6854    
6855     * Thuban/UI/menu.py (Menu.InsertSeparator): Additional optional parameter
6856     'after' now allows to insert separators almost anywhere in the menu.
6857    
6858 frank 1046 2003-05-27 Frank Koormann <[email protected]>
6859    
6860     * Thuban/UI/tableview.py (QueryTableFrame.__init__): Underline the
6861     "S" of selection box label to hint on hot key (Alt-S). Works under
6862     Win32 but is ignored under GTK.
6863    
6864     2003-05-26 Frank Koormann <[email protected]>
6865    
6866     * Thuban/UI/projdialog.py (ProjFrame.__do_layout, ProjPanel._DoLayout):
6867     Center Choices.
6868    
6869 bh 1038 2003-05-26 Bernhard Herzog <[email protected]>
6870    
6871 bh 1044 Remove the Precision methods again. They're too DBF specific to be
6872     part of the table interface and they're only used in table_to_dbf
6873     anyway.
6874    
6875     * Thuban/Model/transientdb.py (TransientTableBase.Width):Use a
6876     fixed precision of 12 for doubles.
6877     (TransientTableBase.Precision): Removed
6878     (AutoTransientTable.Width): Delegate to self.table.
6879    
6880     * Thuban/Model/table.py (DBFTable.Precision)
6881     (MemoryTable.Precision): Removed.
6882     (MemoryTable.Width): Use a fixed precision of 12 for doubles.
6883     (table_to_dbf): Use a fixed precision of 12 for floats unless the
6884     column object specifies something else.
6885    
6886     * test/test_dbf_table.py (TestTableToDBF.test_table_to_dbf): New.
6887     test for table_to_dbf
6888    
6889     2003-05-26 Bernhard Herzog <[email protected]>
6890    
6891     * test/test_transientdb.py
6892     (TestTransientTable.run_iceland_political_tests): Fix a comment.
6893    
6894     2003-05-26 Bernhard Herzog <[email protected]>
6895    
6896 bh 1038 * Thuban/UI/mainwindow.py (MainWindow.TableOpen): Real
6897     implementation. Mark parts of the file format strings for
6898     localization.
6899    
6900     * Thuban/Model/session.py (Session.OpenTableFile): New. Open a dbf
6901     file and add the table to the tables managed by the session
6902    
6903 bh 1040 * test/test_session.py (TestSessionSimple.test_open_table_file):
6904     New. test case for OpenTableFile
6905    
6906 jan 1033 2003-05-26 Jan-Oliver Wagner <[email protected]>
6907    
6908 jan 1035 * Thuban/UI/controls.py, Thuban/UI/identifyview.py, Thuban/UI/join.py,
6909     Thuban/UI/labeldialog.py, Thuban/UI/mainwindow.py,
6910     Thuban/UI/proj4dialog.py, Thuban/UI/tableview.py, Thuban/UI/view.py:
6911     Replace the true/false of wxWindows by True/False of Python 2.2.1.
6912    
6913     2003-05-26 Jan-Oliver Wagner <[email protected]>
6914    
6915 bh 1038 * Thuban/UI/tableview.py (LayerTableFrame.__init__): If there is
6916     already a selection present, update the grid accordingly.
6917 jan 1033
6918     * Thuban/UI/mainwindow.py (MainWindow.TableShow): Make the dialog
6919     resizeable and increase its initial size.
6920    
6921 frank 1030 2003-05-26 Frank Koormann <[email protected]>
6922    
6923     Table export functionality
6924    
6925     * Thuban/Model/table.py (DBFTable.Width, MemoryTable.Width):
6926     Return width (in characters) for a column.
6927     (DBFTable.Precision, MemoryTable.Precision): Return decimal precision.
6928     (table_to_dbf): Write table to dbf file.
6929     (table_to_csv): Write table to csv file.
6930    
6931     * Thuban/Model/transientdb.py (TransientTableBase.Width,
6932     TransientTableBase.Precision): Return column width and precision.
6933    
6934     * Thuban/UI/tableview.py (QueryTableFrame.OnSaveAs): Call table_to_dbf
6935     or table_to_csv depending on file selection.
6936    
6937     * test/test_dbf_table.py:
6938     Test table_to_dbf (extension of former part of test).
6939    
6940     * test/test_csv_table.py:
6941     Test table_to_csv.
6942    
6943 jan 1021 2003-05-23 Jan-Oliver Wagner <[email protected]>
6944    
6945 jan 1024 * Thuban/UI/join.py (JoinDialog.OnJoin): Use _() for strings.
6946     Use QueryTableFrame instead of TableFrame.
6947 jan 1021
6948 jan 1024 * Thuban/UI/mainwindow.py (MainWindow.LayerShowTable): Prefix the
6949     table window with 'Layer Table:' instead of 'Table:'.
6950    
6951     2003-05-23 Jan-Oliver Wagner <[email protected]>
6952    
6953     Give all tables a title via mix-in TitledObject.LayerShowTable
6954    
6955 jan 1021 * Thuban/Model/base.py (TitledObject.SetTitle): Call method 'issue'
6956     only if it exists.
6957    
6958     * Thuban/Model/table.py (DBFTable, MemoryTable): mix-in TitledObject
6959     and call its init-method with a default title. Remove Title() method.
6960    
6961     * Thuban/Model/transientdb.py (TransientTable, TransientJoinedTable,
6962     AutoTransientTable): mix-in TitledObject and call its init-method with
6963     a default title. Remove Title() method.
6964    
6965 bh 1017 2003-05-23 Bernhard Herzog <[email protected]>
6966    
6967     * Thuban/Model/session.py (Session.AddShapeStore): Define
6968     AddShapeStore analogously to AddTable.
6969    
6970     * test/test_session.py (TestSessionSimple.test_add_shapestore):
6971     New. Test for AddShapeStore
6972    
6973 jan 1015 2003-05-23 Jan-Oliver Wagner <[email protected]>
6974    
6975     Introducing QueryTableFrame and a very coarse ShowTable implementation.
6976    
6977     * Thuban/UI/tableview.py (LayerTableFrame, QueryTableFrame): Split the
6978     class LayerTableFrame into two classes, LayerTableFrame and QueryTableFrame.
6979     The latter implements the selection GUI without dependency on a layer.
6980     LayerTableFrame now is derived from QueryTableFrame and connects
6981     to a layer.
6982    
6983     * Thuban/UI/mainwindow.py (MainWindow.TableShow): A very coarse
6984     implementation that still needs work.
6985    
6986     * Thuban/Model/layer.py (Layer.TreeInfo): Added filename.
6987    
6988 frank 1011 2003-05-22 Frank Koormann <[email protected]>
6989    
6990     * Thuban/Model/transientdb.py (TransientJoinedTable.__init__):
6991     Added "outer_join = False" as optional parameter.
6992     (TransientJoinedTable.create): If outer join is true, perform a
6993     "LEFT OUTER JOIN" instead of "JOIN", which preserves all records of
6994     the left table. Records not matching are filled with 0 / None.
6995    
6996     * Thuban/UI/join.py (JoinDialog.__init__): Checkbox for outer join.
6997     (JoinDialog.OnJoin): Consider outer join check box.
6998    
6999 bh 1006 2003-05-22 Bernhard Herzog <[email protected]>
7000    
7001 bh 1008 * Thuban/UI/join.py (JoinDialog.OnJoin): Use exc_info in a
7002     somewhat safer way. Storing the traceback in a local variable can
7003     lead to memory leaks
7004    
7005     2003-05-22 Bernhard Herzog <[email protected]>
7006    
7007 bh 1006 * Thuban/UI/join.py (JoinDialog.OnJoin): Make sure to really call
7008     the wxMessageDialog's Destroy() method.
7009    
7010 frank 1004 2003-05-22 Frank Koormann <[email protected]>
7011    
7012     * Thuban/UI/join.py (JoinDialog.__init__): Make use of
7013     TransientTable.Title()
7014    
7015     2003-05-22 Frank Koormann <[email protected]>
7016    
7017     Join Dialog, initial version.
7018    
7019     * Thuban/UI/mainwindow.py (MainWindow.TableJoin): Removed print.
7020    
7021     * Thuban/UI/join.py (JoinDialog): Functional implementation of
7022     former framework. Renamed Table1/Table2 to LeftTable/RightTable
7023     in all occurences.
7024    
7025     * Thuban/Model/transientdb.py (TransientJoinedTable.__doc__):
7026     Typo fixed.
7027    
7028 bh 995 2003-05-22 Bernhard Herzog <[email protected]>
7029    
7030 bh 999 Give the tables titles so that the GUI can display more meaningful
7031     names. For now the titles are fixed but depend on e.g. filenames
7032     or the titles of the joined tables.
7033    
7034     * Thuban/Model/transientdb.py (TransientTable.Title)
7035     (TransientJoinedTable.Title, AutoTransientTable.Title): New.
7036    
7037     * Thuban/Model/table.py (DBFTable.Title, MemoryTable.Title): New.
7038    
7039     * test/test_transientdb.py
7040     (TestTransientTable.test_auto_transient_table_title): New. Test
7041     for the Title method
7042     (TestTransientTable.test_transient_joined_table)
7043     (TestTransientTable.test_transient_table): Add test for the Title
7044     methods
7045    
7046     * test/test_memory_table.py (TestMemoryTable.test_title): New.
7047     Test for the Title method
7048    
7049     * test/test_dbf_table.py (TestDBFTable.test_title): New. Test for
7050     the Title method
7051    
7052     2003-05-22 Bernhard Herzog <[email protected]>
7053    
7054 bh 997 * test/test_layer.py (TestLayer.setUp, TestLayer.tearDown):
7055     Provide a better way to destroy the layers
7056     (TestLayer.test_base_layer, TestLayer.test_arc_layer)
7057     (TestLayer.test_point_layer, TestLayer.test_empty_layer)
7058     (TestLayer.test_polygon_layer, TestLayer.test_get_field_type): Use
7059     the new way to destroy the layers.
7060     (TestLayer.test_derived_store): New. Test for using a layer with a
7061     DerivedShapeStore
7062    
7063     * Thuban/Model/layer.py (Layer.SetShapeStore): Only set the
7064     filename if the shape store actually has one.
7065    
7066     2003-05-22 Bernhard Herzog <[email protected]>
7067    
7068 bh 995 * Thuban/Model/table.py (DBFTable.FileName): New. Accessor method
7069     for the filename
7070    
7071     * test/test_dbf_table.py (TestDBFTable.test_filename): New. Test
7072     for the FileName method
7073     (TestDBFTableWriting.test_write): Fix spelling of filename
7074    
7075 tkoester 993 2003-05-22 Thomas Koester <[email protected]>
7076    
7077     * Thuban/Model/range.py, test/test_range.py: Brought over new Range
7078     from SciParam that now really is immutable.
7079    
7080 frank 992 2003-05-22 Frank Koormann <[email protected]>
7081    
7082     Layer Top/Bottom placement added to legend.
7083    
7084     * Thuban/UI/legend.py
7085     (LegendPanel._OnMoveTop(), LayerPanel._OnMoveBottom): New, methods
7086     bound to tool events.
7087     (LegendTree.MoveCurrentItemTop(), LegendTree.MoveCurrentItemBottom):
7088     New, methods binding the event methods with the map methods.
7089    
7090     * Thuban/Model/map.py (Map.TopLayer(), Map.BottomLayer()): New, place
7091     layer at top/bottom of layer stack.
7092    
7093     * Resources/Bitmaps/top_layer.xpm: New button icon.
7094    
7095     * Resources/Bitmaps/bottom_layer.xpm: New button icon.
7096    
7097 bh 988 2003-05-22 Bernhard Herzog <[email protected]>
7098    
7099     * Thuban/Model/session.py (Session.RemoveTable): New method to
7100     remove tables
7101    
7102     * test/test_session.py (TestSessionSimple.test_remove_table): New.
7103     Test for RemoveTable
7104    
7105 tkoester 986 2003-05-22 Thomas Koester <[email protected]>
7106    
7107     * Thuban/Model/classgen.py: Added short module doc string and CVS id.
7108     (ClassGenerator.GenUniformDistribution): Use new Range __init__, too.
7109    
7110 bh 983 2003-05-22 Bernhard Herzog <[email protected]>
7111    
7112 bh 985 Implement a way to discover dependencies between tables and
7113     shapestores.
7114    
7115     * Thuban/Model/transientdb.py (TransientTableBase.Dependencies)
7116     (TransientJoinedTable.Dependencies)
7117     (AutoTransientTable.SimpleQuery): New. Implement the dependencies
7118     interface
7119     (TransientJoinedTable.__init__): Keep tack of the original table
7120     objects in addition to the corresponding transient tables.
7121    
7122     * Thuban/Model/table.py (DBFTable.Dependencies)
7123     (MemoryTable.Dependencies): New. Implement the dependencies
7124     interface
7125    
7126     * Thuban/Model/data.py (ShapeTable): New. Helper class for
7127     ShapefileStore
7128     (ShapefileStore.__init__): Use ShapeTable instead of
7129     AutoTransientTable
7130     (ShapefileStore.Table, ShapefileStore.Shapefile): Add doc-strings
7131     (ShapefileStore.FileName, ShapefileStore.FileType): New. Accessor
7132     methods for filename and type
7133     (ShapefileStore.Dependencies): New. Implement the dependencies
7134     interface
7135     (DerivedShapeStore): New class to replace SimpleStore. The main
7136     difference to SimpleStore is that it depends not on a shapefile
7137     but another shapestore which expresses the dependencies a bit
7138     better
7139     (SimpleStore.__init__): Add deprecation warning.
7140    
7141     * test/test_dbf_table.py (TestDBFTable.test_dependencies): New.
7142     Test for the Dependencies method.
7143    
7144     * test/test_memory_table.py (TestMemoryTable.test_dependencies):
7145     New. Test for the Dependencies method.
7146    
7147     * test/test_transientdb.py
7148     (TestTransientTable.test_auto_transient_table_dependencies): New.
7149     Test for the Dependencies method.
7150     (TestTransientTable.test_transient_joined_table): Add test for the
7151     Dependencies method.
7152    
7153     * test/test_session.py (TestSessionSimple.setUp)
7154     (TestSessionSimple.tearDown): New. Implement a better way to
7155     destroy the sessions.
7156     (TestSessionSimple.test_initial_state)
7157     (TestSessionSimple.test_add_table): Bind session to self.session
7158     so that it's destroyed by tearDown
7159     (TestSessionSimple.test_open_shapefile): New. Test for
7160     OpenShapefile and the object it returns
7161    
7162     2003-05-22 Bernhard Herzog <[email protected]>
7163    
7164 bh 983 * Thuban/Model/session.py (Session.AddTable): New method to
7165     register tables with the session.
7166     (Session.Tables): Return the tables registered with AddTable too.
7167    
7168     * test/test_session.py (TestSessionSimple.test_add_table): New.
7169     Test case for the AddTable method
7170    
7171 frank 981 2003-05-22 Frank Koormann <[email protected]>
7172    
7173     UI polishing updates: Place main buttons (OK, Cancel, etc) in the
7174     lower right corner, center labels for selections, initialize controls
7175     in reasonable order for keyboard navigation.
7176    
7177     * Thuban/UI/projdialog.py (ProjFrame.__init__, ProjFrame.__doLayout)
7178     (ProjFrame.__DoOnProjAvail): Determine position of current projection
7179     using the wxListBox.FindString() method. Still a problem (#1886)
7180    
7181     * Thuban/UI/classifier.py
7182     (Classifier.__init__, SelectPropertiesDialog.__init__)
7183    
7184     * Thuban/UI/classgen.py (ClassGenDialog.__init__,
7185     (ClassGenDialog.__DoOnGenTypeSelect): Moved initialization of the
7186     different classification types from here to __init__.
7187     (GenUniquePanel.__init__): Set the column width of the first field
7188     in the Field ListCtrl to the full width.
7189    
7190     * Thuban/UI/tableview.py (LayerTableFrame.__init__): Rename 'Save As'
7191     Button to 'Export'. Center Buttons in Selection Box, set Focus to
7192     Grid.
7193     (LayerTableFrame.OnKeyDown()): New, bound to the grid with EVT_KEY_DOWN,
7194     changes focus to the Selection when pressing "Alt-S".
7195    
7196     * Thuban/UI/legend.py (LegendTree.__SetVisibilityStyle): Only gray out
7197     the text if not visible. The italic font sometimes exceeds the
7198     rendering area.
7199    
7200 jonathan 972 2003-05-21 Jonathan Coles <[email protected]>
7201 jonathan 971
7202 jonathan 975 * Thuban/UI/dock.py (DockFrame): Rename references to _OnClose
7203     to OnClose so that Thuban closes correctly.
7204    
7205     * Thuban/UI/mainwindow.py (MainWindow.OnClose): Call
7206     DockFrame.OnClose, not DockFrame._OnClose.
7207    
7208     2003-05-21 Jonathan Coles <[email protected]>
7209    
7210 jonathan 971 * Thuban/Model/classgen.py (ClassGenerator.GenQuantiles): Remove
7211     references to 'inf' and use new Range __init__ to pass floats
7212     directly rather than converting them to strings first.
7213     Fixes RTBug #1876.
7214    
7215     * Thuban/Model/classification.py (ClassGroupRange.SetRange):
7216     Use new Range ___init__ to pass floats.
7217    
7218     * Thuban/Model/layer.py (RasterLayer.__init__): Test if the
7219     filename is a valid image file. Throw IOError otherwise.
7220    
7221     * Thuban/Model/range.py: Brought over new Range from SciParam that
7222     is immutable and has an __init__ which can accept floats.
7223    
7224     * Thuban/UI/mainwindow.py (MainWindow.AddLayer): Move OpenShapefile
7225     into try block. AddLayer doesn't throw any exceptions anymore.
7226     (MainWindow.AddRasterLayer): Move constructor of RasterLayer into
7227     try block.
7228    
7229     * Thuban/UI/projdialog.py (GeoPanel.__init__): Put Degrees as
7230     the first item in choices. Fixes RTBug #1882.
7231    
7232     * Thuban/UI/renderer.py (MapRenderer.render_map): Check if scale
7233     has gone to 0 which is a serious problem. abort.
7234     (MapRenderer.draw_raster_layer): Catch IOError seperately and
7235     print the error from GDAL.
7236    
7237     * Thuban/UI/tableview.py (TableGrid.__init__): Call
7238     ToggleEventListeners to turn on listening.
7239     (TableGrid.ToggleEventListeners): New. Turns event listening on
7240     and off so as to prevent excessive messages.
7241     (LayerTableFrame.OnQuery): Use TableGrid.ToggleEventListeners
7242     to suppress excessive messages when selecting many rows.
7243     Fixes RTBug #1880.
7244    
7245     * Thuban/UI/view.py: Added checks against if scale == 0. This
7246     is a serious problem that can occur when an image without
7247     geo data is loading and causes the map projection bounds to
7248     go to infinity. Right now, the solution is to simply try
7249     to recover.
7250    
7251     * extensions/thuban/cpl_mfile.cpp (MFILEClose): Make sure
7252     to set the MFILEReceiver attributes even if the data is NULL.
7253    
7254     * extensions/thuban/gdalwarp.cpp: Improved the error handling
7255     and passed GDAL messages back up to the Python layer. Also
7256     tried to fix some memory leaks that were present in the original
7257     utility but didn't matter because the program aborted.
7258    
7259     * test/test_range.py: Copied over tests from SciParam. Removed
7260     tests against importing. Fixes RTBug #1867.
7261    
7262 bh 958 2003-05-21 Bernhard Herzog <[email protected]>
7263    
7264     * test/test_load.py: Remove unused imports and restructure the
7265     test code
7266     (LoadSessionTest): Split into one class for each test and turn
7267     LoadSessionTest itself into the base class for all such session
7268     tests.
7269     (ClassificationTest): New base class for load tests that test
7270     classifications
7271     (TestSingleLayer, TestLayerVisibility, TestClassification)
7272     (TestLabels, TestLayerProjection, TestRasterLayer): New classes
7273     for the individual tests
7274    
7275     * test/support.py (FileLoadTestCase.filename): New base class for
7276     file loading tests
7277    
7278 jan 955 2003-05-21 Jan-Oliver Wagner <[email protected]>
7279    
7280     * Resources/Projections/defaults.proj: Renamed 'Universal Transverse
7281     Mercator' to 'UTM Zone 32' as a more convenient example.
7282     Added 'Gauss Krueger Zone 6'.
7283    
7284     * Data/iceland_sample_raster.thuban: political polygon now
7285     filled transparent to have the raster image visible at once.
7286    
7287 frank 952 2003-05-21 Frank Koormann <[email protected]>
7288    
7289     * Thuban/UI/mainwindow.py (MainWindow): Renamed _OnClose() back to
7290     OnClose() to keep in sync with extensions. Internally Thuban
7291     still uses "underscored" names.
7292    
7293 jonathan 949 2003-05-20 Jonathan Coles <[email protected]>
7294    
7295     This puts back Raster layer support. These layers support projections
7296     through the GDAL library. Currently, the CVS version is being used.
7297     There are no Debian packages available although this may change soon.
7298     A GDAL driver was extended to support writing to memory rather to
7299     files.
7300    
7301     There is still some work that needs to be done, such as some error
7302     handling when loading invalid images or when there is a problem
7303     projecting the image. This putback simply checks in the majority
7304     of the work.
7305    
7306     * setup.py: Add gdalwarp library extension.
7307    
7308     * Thuban/Model/layer.py (BaseLayer.HasClassification): New.
7309     Defaults to False, but can be overridden by subclasses if they
7310     support classification.
7311     (RasterLayer): New. Defines a new layer that represents an
7312     image.
7313    
7314     * Thuban/Model/load.py (SessionLoader.__init__): Add rasterlayer
7315     tag handler.
7316     (SessionLoader.start_layer): Encode the filename.
7317     (SessionLoader.start_rasterlayer, SessionLoader.end_rasterlayer):
7318     New. Supports reading a rasterlayer tag.
7319    
7320     * Thuban/Model/map.py (Map.BoundingBox): Fix typo in comment.
7321    
7322     * Thuban/Model/save.py (XMLWriter.encode): Don't assume that we
7323     get a string in Latin1. If we get such as string convert it to
7324     unicode first, otherwise leave if alone before encoding.
7325     (SessionSaver.write_layer): Add support for writing both Layers
7326     and RasterLayers.
7327    
7328     * Thuban/Model/transientdb.py (AutoTransientTable.SimpleQuery):
7329     The right argument may not be a string, it could also be a Column.
7330    
7331     * Thuban/UI/application.py (ThubanApplication.CreateMainWindow):
7332     Make initial window size 600x400. Fixes RTBug #1872.
7333    
7334     * Thuban/UI/classifier.py (Classifier.__init__): Rearrange how
7335     the dialog is constructed so that we can support layers that
7336     do not have classifications.
7337     (Classifier._OnTry): Only build a classification if the layer
7338     supports one.
7339    
7340     * Thuban/UI/legend.py: Change all checks that a layer is an
7341     instance of Layer into checks against BaseLayer.
7342     (LegendTree.__FillTreeLayer): Only add children to a branch if
7343     the layer supports classification.
7344    
7345     * Thuban/UI/mainwindow.py (MainWindow.NewSession,
7346     MainWindow.OpenSession): Don't proceed with an action if the
7347     user chooses Cancel when they are asked to save changes.
7348     (MainWindow.AddRasterLayer): New. Open a dialog to allow the
7349     user to select an image file. Create a new RasterLayer and add
7350     it to the map.
7351    
7352     * Thuban/UI/renderer.py (MapRenderer.render_map): Add support
7353     for rendering RasterLayer layers.
7354     (MapRenderer.draw_raster_layer): Actually method that calls
7355     the GDALWarp python wrapper and constructs an image from the
7356     data returned.
7357    
7358     * Thuban/UI/tableview.py (LayerTableFrame.__init__): Change the
7359     Choices symbols to match those used in the table query method.
7360     Replace deprecated method calls on table with new method names.
7361    
7362     * Thuban/UI/view.py (MapCanvas.set_view_transform): Try to limit
7363     how small the scale can get. This still needs more testing.
7364    
7365     * extensions/thuban/bmpdataset.cpp: New, but copied from GDAL.
7366     Provides a driver to output in .bmp format.
7367    
7368     * extensions/thuban/cpl_mfile.cpp, extensions/thuban/cpl_mfile.h:
7369     New. Provides IO routines which write to memory, rather than a file.
7370    
7371     * extensions/thuban/gdalwarp.cpp: New, but basically a direct copy
7372     of the gdalwarp utility provided in GDAL. Added function calls
7373     that can be accessed from python.
7374    
7375     * Data/iceland_sample_raster.thuban: New. Sample file that uses
7376     a raster layer.
7377    
7378     * Data/iceland/island.tfw, Data/iceland/island.tif: New. Raster
7379     layer image data.
7380    
7381     * Doc/thuban.dtd: Added rasterlayer attribute definition.
7382    
7383     * test/test_layer.py, test/test_load.py, test/test_save.py: Added
7384     tests associated with the raster layer code.
7385    
7386     * test/test_transientdb.py
7387     (TestTransientTable.test_auto_transient_table_query): Added a test
7388     for using a Column object as the "right" parameter to a query.
7389    
7390 frank 924 2003-05-19 Frank Koormann <[email protected]>
7391    
7392 frank 927 * Thuban/version.py (get_changelog_date):
7393     Catch exceptions if ChangeLog does not exist.
7394    
7395     * Thuban/UI/view.py (MapCanvas.Export): Bugfix
7396    
7397     2003-05-19 Frank Koormann <[email protected]>
7398    
7399 frank 924 Extended version information for Thuban
7400    
7401     * Thuban/version.py: New, version information for Thuban: Last
7402     modification date and last ChangeLog entry date.
7403    
7404     * Thuban/UI/mainwindow.py (MainWindow.About()): Extended version
7405     information: Display Thuban, wxPython and Python version.
7406    
7407 bh 919 2003-05-16 Bernhard Herzog <[email protected]>
7408    
7409 bh 921 * Thuban/Model/save.py: Remove some unused imports including the
7410     __future__ import for nested_scopes as Thuban relies on Python 2.2
7411     now.
7412     (XMLWriter.encode): Remove the special case for a None argument.
7413     In the saver encode is always called with a string argument.
7414    
7415     2003-05-16 Bernhard Herzog <[email protected]>
7416    
7417 bh 919 * Thuban/UI/__init__.py: Remove the work-around for the locale bug
7418     in wxPython (at least when usinvg wxGTK) prior to 2.4. The symptom
7419     of the bug was that e.g. float("1.2") would fail. Thuban now
7420     requires 2.4.x.
7421    
7422 frank 917 2003-05-16 Frank Koormann <[email protected]>
7423    
7424     Printing enhancement and WMF export (under Win32)
7425    
7426     * Thuban/UI/renderer.py (ExportRenderer): New, derived from
7427     ScreenRenderer. Renders Map, Legend and Scalebar for export.
7428     (PrinterRenderer): New, derived from ExportRenderer. Replaces the old
7429     PrintRender.
7430    
7431     * Thuban/UI/view.py (MapPrintout.__init__): Enhanced parameter set
7432     to fullfil information needed for PrinterRenderer.
7433     (MapCanvas.Export): New. Export Map (currently only to WMF on Win32).
7434     (MapCanvas.Print): Adapted to new MapPrintout.
7435     (OutputTransform): General calculations to transform from canvas
7436     coordinates to export/printing devices.
7437    
7438     * Thuban/UI/mainwindow.py (MainWindow.ExportMap()): New. Added also
7439     new method_command to call ExportMap, with platform dependency (only
7440     __WXMSW__)
7441    
7442     * Thuban/UI/scalebar.py (ScaleBar.DrawScaleBar): Position and Size
7443     of scalebar drawing area as new parameters.
7444    
7445     * Thuban/Model/scalebar.py (roundInterval): round long instead of int
7446    
7447     * Thuban/UI/legend.py (ScalebarBitmap.__SetScale):
7448     Update to extended scalebar.DrawScalebar header.
7449    
7450     * test/test_export.py: New, test Thuban.UI.view.OutputTransform()
7451    
7452     * test/test_scalebar.py: Made test executable as standalone.
7453    
7454 bh 908 2003-05-16 Bernhard Herzog <[email protected]>
7455    
7456     * Thuban/Model/table.py (Table): Remove this compatibility alias
7457     for DBFTable.
7458    
7459     * test/test_table.py: Import DBFTable as Table because that alias
7460     doesn't exist anymore.
7461    
7462     * Thuban/UI/classgen.py: Remove some unused imports
7463    
7464 jonathan 906 2003-05-14 Jonathan Coles <[email protected]>
7465    
7466     * Thuban/Model/classgen.py (ClassGenerator.GenSingletonsFromList):
7467     Fix docstring.
7468     (ClassGenerator.GenUniformDistribution): Fix spelling of method name.
7469     (ClassGenerator.GenQuantiles): Use the left/right brackets and min/max
7470     values of the supplied range to determine the beginning and end
7471     bounds of the generated classes.
7472    
7473     * Thuban/Model/range.py (Range.number_re): Now accepts floats that
7474     do not have a leading 0 (.5 is now accepted as well as 0.5).
7475    
7476     * Thuban/UI/classgen.py (ClassGenDialog.OnOK): Fix name of method
7477     call to ClassGenerator.GenUniformDistribution.
7478    
7479     * Thuban/UI/projdialog.py (ProjFrame.__do_layout): Fix Windows
7480     layout bug with the 'Projection' label.
7481    
7482     * test/support.py (FloatTestCase): New. Needed for the Range tests.
7483    
7484     * test/test_range.py: New. Imported from SciParam.
7485    
7486 jonathan 897 2003-05-12 Jonathan Coles <[email protected]>
7487    
7488 jonathan 899 * Thuban/UI/classgen.py (GenQuantilesPanel.GetList): Replace call
7489     to table.UniqueValues() with calls that retrieve all the values
7490     from the table. This will need to be replaced by a method on table
7491     which can simply return the list (perhaps more efficiently).
7492    
7493     2003-05-12 Jonathan Coles <[email protected]>
7494    
7495 jonathan 897 The return value of ClassGenerator.CalculateQuantiles has changed.
7496     Refer to the documentation for details.
7497    
7498     * test/test_classgen.py: Modified Quantile tests to use the
7499     new return values.
7500    
7501     * Thuban/Model/classgen.py
7502     (ClassGenerator.GenQuantiles): Add comments describing the parameters,
7503     use new return values from CalculateQuantiles to produce the correct
7504     range bounds in the Classification.
7505     (ClassGenerator.CalculateQuantiles): Add more comments describing
7506     the return values and parameters. Make minor adjustments to improve
7507     the legibility of the code. Fix problem with adjusted not being set
7508     in most cases.
7509    
7510 frank 893 2003-05-12 Frank Koormann <[email protected]>
7511    
7512     * Thuban/Model/save.py (XMLWriter.encode()): Explicite call to unicode
7513     and latin1. Fixes #1851 finally.
7514    
7515 jonathan 889 2003-05-09 Jonathan Coles <[email protected]>
7516    
7517 jonathan 897 * test/test_classgen.py: New. Tests the Quantile algorithm.
7518    
7519     * Thuban/Model/classgen.py (ClassGenerator.CalculateQuantiles):
7520     Clean up debugging statement, add comments, fix a small bug in the
7521     returned adjusted percentiles.
7522    
7523     2003-05-09 Jonathan Coles <[email protected]>
7524    
7525 jonathan 889 Introduces Range class from SciParam into the ClassGroupRange class,
7526     and such ranges can now be saved and loaded from disk.
7527    
7528     Quantiles are now available in the Classification Generator.
7529    
7530     Initial support for building Queries on a table. Doesn't do anything
7531     but run some tests.
7532    
7533     * Thuban/Model/classification.py: Explicit imports.
7534     (ClassGroupRange): Use the Range class to store the underlying
7535     range information. The interface remains the same, except for
7536     GetRange(), and you can also supply a Range object as the min
7537     parameter to SetRange or __init__.
7538    
7539     * Thuban/Model/load.py (XMLReader.encode): New. Encodes the given
7540     string appropriately for use in Thuban. Fixes RTbug #1851.
7541     (SessionLoader.end_projection): Handle the context of the
7542     projection tag a bit better by looking at what objects are not
7543     None. There was an assumption that a projection tag for a map
7544     could occur before any layers.
7545     (SessionLoader.start_clrange): Provide backward compatibility for
7546     reading min/max values as well as the new range parameter.
7547    
7548     * Thuban/Model/map.py: Explicit imports.
7549    
7550     * Thuban/Model/resource.py: Import _.
7551     (ProjFileSaver.write): write header using projfile.dtd.
7552    
7553     * Thuban/Model/save.py: Explicit imports.
7554     (XMLWriter.encode): New. Encode the given string from a format
7555     used by Thuban into UTF-8. Fixes RTbug #1851.
7556    
7557     * Thuban/UI/classgen.py: Explicit imports.
7558     (ClassGenDialog.__init__): Clean up the code and add support
7559     for Quantiles.
7560     (ClassGenDialog.OnOK): Add support for Quantiles.
7561     (GenQuantilesPanel): New. Input panel for Quantiles.
7562     (ClassGenerator, CustomRamp, MonochromaticRamp, GreyRamp, RedRamp,
7563     GreenRamp, BlueRamp, HotToColdRamp): Move to Thuban/Model/classgen.py
7564    
7565     * Thuban/Model/classgen.py: New. Contains all the classes named above.
7566    
7567     * Thuban/UI/classifier.py: Explicit imports.
7568     (ClassTable.GetValueAsCust, ClassTable.__ParseInput,
7569     ClassTable.SetValueAsCustom): Reworked to use new Range class.
7570    
7571     * Thuban/UI/legend.py: Explicit imports.
7572    
7573     * Thuban/UI/mainwindow.py: Add support for the Join Dialog. Added
7574     a Table menu and associated method calls.
7575     (MainWindow.choose_color): Removed. No longer needed.
7576    
7577     * Thuban/UI/projdialog.py (ProjFrame.__VerifyButtons): Save button
7578     should be disabled if no projection is selected in the available
7579     list.
7580    
7581     * Thuban/UI/renderer.py: Explicit imports.
7582    
7583     * Thuban/UI/tableview.py (TableGrid.OnRangeSelect): Fix some issues
7584     with correctly selecting the rows and issuing the right events.
7585     Be sure to call Skip() to allow the grid to do some of its own
7586     handling which allows the rows to actually be selected.
7587     (LayerTableGrid.select_shapes): Rename from select_shape. Supports
7588     selecting multiple shapes.
7589     (LayerTableFrame): Support for building Queries.
7590     (LayerTableFrame.select_shapes): Allow multiple shapes to be selected.
7591    
7592     * Thuban/UI/tree.py: Explicit imports.
7593    
7594     * Thuban/UI/view.py (MapCanvas): Delegate "SelectedShapes" so the
7595     table view can call it.
7596    
7597     * test/test_classification.py: Explicit imports.
7598     (TestClassification.test_ClassGroupRange): Fix test for new
7599     Range class.
7600    
7601     * Doc/thuban.dtd: Add range parameter for clrange.
7602    
7603     * Thuban/Model/range.py: Taken from SciParam. Used as the underlying
7604     object in ClassGroupRange, and also uesd for inputting ranges in
7605     the classifer table and elsewhere.
7606    
7607     * Thuban/UI/join.py: New. Initial Join dialog. No real functionality
7608     yet.
7609    
7610 frank 872 2003-05-09 Frank Koormann <[email protected]>
7611    
7612     * Thuban/UI/scalebar.py (DrawScaleBar): Draw only if interval > 0.0.
7613    
7614 frank 860 2003-05-08 Frank Koormann <[email protected]>
7615    
7616 frank 870 Coding style updates
7617    
7618     * test/test_scalebar.py: Replaced tab indentation by spaces.
7619    
7620     * Thuban/UI/scalebar.py: Explicit imports.
7621    
7622     2003-05-08 Frank Koormann <[email protected]>
7623    
7624 frank 867 * Thuban/UI/scalebar.py
7625     (ScaleBar.DrawScalebar): Format string bug fixed.
7626    
7627     2003-05-08 Frank Koormann <[email protected]>
7628    
7629 frank 865 Reorganization of scalebar component (no wx in Thuban/Model)
7630    
7631     * Thuban/Model/scalebar.py: Rendering moved to Thuban/UI/scalebar.py
7632     (deriveInterval):
7633     Calculate scalebar interval and unit which fits in width for scale.
7634     (roundInterval): Round float.
7635    
7636     * Thuban/UI/scalebar.py (ScaleBar): Scalebar rendering
7637    
7638     * test/test_scalebar.py: Test for Thuban/Model/scalebar.py methods.
7639    
7640     * Thuban/UI/legend.py: Import Thuban.UI.scalebar
7641    
7642     2003-05-08 Frank Koormann <[email protected]>
7643    
7644 frank 860 * Thuban/UI/legend.py (ScalebarBitmap.SetCanvas):
7645     Initialize ScaleBar with canvas.map
7646    
7647     * Thuban/Model/scalebar.py (ScaleBar.roundInterval()): New,
7648     round intervals to display smarter lengths
7649     (ScaleBar.DrawScalebar): Draw Scalebar only if the map contains a
7650     layer. If the maps has no projection applied grey the scalebar.
7651    
7652 frank 857 2003-05-07 Frank Koormann <[email protected]>
7653    
7654     Basic Scalebar features added.
7655    
7656     * Thuban/Model/scalebar.py (ScaleBar): New, scalebar rendering.
7657    
7658     * Thuban/UI/legend.py (LegendPanel): Added scalebar bitmap
7659     (ScaleBarBitmap): New, links the scalebar bitmap with view messages
7660     and the renderer.
7661    
7662     * Thuban/UI/view.py (MapCanvas.set_view_transform): Issue SCALE_CHANGED.
7663    
7664     * Thuban/UI/messages.py: SCALE_CHANGED added.
7665    
7666 bh 850 2003-05-07 Bernhard Herzog <[email protected]>
7667    
7668 bh 852 * Thuban/Model/session.py (Session.__init__): New instance
7669     variable shapestores to hold a list of all open shapestore objects
7670     (Session.ShapeStores): New. Accessor method for the shapestores
7671     list.
7672     (Session._add_shapestore, Session._clean_weak_store_refs): New.
7673     Internal methods to maintain the shapestores list.
7674     (Session.Tables): New. Return all tables open in the session.
7675     (Session.OpenShapefile): Insert the new ShapeStore into the
7676     shapestores list.
7677    
7678     * test/test_session.py (TestSessionSimple.test_initial_state): Add
7679     tests for ShapeStores and Tables
7680     (TestSessionWithContent.test_shape_stores)
7681     (TestSessionWithContent.test_tables): New. Test cases for
7682     ShapeStores and Tables
7683    
7684     2003-05-07 Bernhard Herzog <[email protected]>
7685    
7686 bh 850 * Thuban/Model/transientdb.py (TransientTableBase.ReadRowAsDict):
7687     Add comments about the optimizations used.
7688     (AutoTransientTable.ReadValue, TransientTableBase.ReadValue): New.
7689     Implement the ReadValue table interface method.
7690    
7691     * test/test_transientdb.py
7692     (TestTransientTable.run_iceland_political_tests)
7693     (TestTransientTable.test_transient_joined_table): Add tests for
7694     ReadValue
7695    
7696 frank 848 2003-05-07 Frank Koormann <[email protected]>
7697    
7698     * Resources/Bitmaps/fulllayerextent.xpm,
7699     Resources/Bitmaps/fullselextent.xpm: Replaced the place holders with
7700     new icons.
7701    
7702 bh 840 2003-05-06 Bernhard Herzog <[email protected]>
7703    
7704 bh 846 * Thuban/Model/transientdb.py (AutoTransientTable.SimpleQuery):
7705     New. Simply delegate to the transient table's version.
7706    
7707     * test/test_transientdb.py
7708     (TestTransientTable.test_auto_transient_table_query): New. Test
7709     case for AutoTransientTable's SimpleQuery
7710    
7711     2003-05-06 Bernhard Herzog <[email protected]>
7712    
7713 bh 843 * Thuban/Model/transientdb.py (TransientTableBase.SimpleQuery):
7714     Implement a simple query method for the query dialog
7715     (TransientTableBase.create): Add an INTEGER PRIMARY KEY that holds
7716     the row index or shapeid.
7717     (TransientTable.create): Insert the right value of the row index
7718     (TransientJoinedTable.create): Copy the row index of the left
7719     table to the joined result table
7720    
7721     * test/test_transientdb.py
7722     (TestTransientTable.test_transient_table_read_twice): Fix
7723     doc-string
7724     (TestTransientTable.test_transient_table_query): New. Test for the
7725     SimpleQuery method
7726    
7727     2003-05-06 Bernhard Herzog <[email protected]>
7728    
7729 bh 840 Convert all table users to use the new table interface. This only
7730     covers Thuban itself, not GREAT-ER or other applications built on
7731     Thuban yet, so the compatibility interface stays in place for the
7732     time being but it now issues DeprecationWarnings.
7733    
7734     Finally, the new Table interface has a new method, HasColumn.
7735    
7736     * Thuban/Model/table.py (OldTableInterfaceMixin): All methods
7737     issue deprecation warnings when they're. The warnings refer to the
7738     caller of the method.
7739     (OldTableInterfaceMixin.__deprecation_warning): New. Helper method
7740     for the deprecation warnings
7741    
7742     * test/test_table.py: Ignore the deprecation warnings for the old
7743     table in the tests in this module. The purpose of the tests is to
7744     test the old interface, after all.
7745    
7746     * test/test_transientdb.py
7747     (TestTransientTable.run_iceland_political_tests): Use the
7748     constants for the types. Add a test for HasColumn
7749     (TestTransientTable.test_transient_joined_table): Adapt to new
7750     table interface. Add a test for HasColumn
7751     (TestTransientTable.test_transient_table_read_twice): Adapt to new
7752     table interface
7753    
7754     * Thuban/UI/tableview.py (DataTable.SetTable, DataTable.GetValue):
7755     Adapt to new table interface
7756    
7757     * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Adapt to
7758     new table interface
7759    
7760     * Thuban/UI/controls.py (RecordListCtrl.fill_list)
7761     (RecordTable.SetTable): Adapt to new table interface
7762    
7763     * Thuban/UI/classifier.py (Classifier.__init__)
7764     (Classifier.__init__): Adapt to new table interface
7765    
7766     * Thuban/UI/classgen.py (ClassGenDialog.__init__)
7767     (GenUniformPanel._OnRetrieve, GenUniquePanel._OnRetrieve): Adapt
7768     to new table interface
7769    
7770     * Thuban/Model/transientdb.py (TransientTableBase.HasColumn)
7771     (AutoTransientTable.HasColumn): Implement the new table interface
7772     method
7773     (AutoTransientTable.ReadRowAsDict, AutoTransientTable.ValueRange)
7774     (AutoTransientTable.UniqueValues): Adapt to new table interface
7775    
7776     * Thuban/Model/layer.py (Layer.SetShapeStore, Layer.GetFieldType):
7777     Adapt to new table interface
7778    
7779     * test/test_layer.py (TestLayer.open_shapefile): Helper method to
7780     simplify opening shapefiles a bit easier.
7781     (TestLayer.test_arc_layer, TestLayer.test_polygon_layer)
7782     (TestLayer.test_point_layer): Use the new helper method
7783     (TestLayer.test_get_field_type): New. Test for the GetFieldType
7784     method
7785    
7786     * test/test_dbf_table.py (TestDBFTable.test_has_column): Test for
7787     the new table method
7788    
7789     * test/test_memory_table.py (TestMemoryTable.test_has_column):
7790     Test for the new table method HasColumn
7791    
7792 jonathan 833 2003-05-06 Jonathan Coles <[email protected]>
7793    
7794     Addresses the "Selection Extent" wish of RTbug #1787.
7795    
7796     * Resources/Bitmaps/fulllayerextent.xpm,
7797     Resources/Bitmaps/fullselextent.xpm: Bitmaps for layer and selection
7798     extent. These are just place holders for the real bitmaps.
7799    
7800     * Thuban/Model/layer.py (Shape): Since a Shape is immutable only
7801     calculate the bounding box once (the first time compute_bbox() is
7802     called).
7803     (Layer.ShapesBoundingBox): New. Given a list of shape ids, return
7804     the bounding box for the shapes in lat/long coordinates.
7805    
7806     * Thuban/UI/mainwindow.py: Added new "Full selection extent" menu
7807     option.
7808     (MainWindow.has_selected_shapes): New. Returns true if there are
7809     any selected shapes.
7810     (MainWindow.FullSelectionExtent): New. Calls
7811     MapCanvas.FitSelectedToWindow() when the user selects the menu option.
7812     (_has_selected_shapes): New. Returns true if there are any
7813     selected shapes.
7814    
7815     * Thuban/UI/selection.py (Selection.HasSelectedShapes): New. Returns
7816     true if there are any selected shapes.
7817    
7818     * Thuban/UI/view.py (MapCanvas): Added delegated method
7819     HasSelectedShapes.
7820     (MapCanvas.FitSelectedToWindow): New. Centers and scales any selected
7821     shapes on the canvas using the map projection (if any).
7822    
7823     * test/test_layer.py (TestLayer.test_arc_layer): Add some tests
7824     for Layer.ShapesBoundingBox().
7825    
7826 bh 826 2003-05-06 Bernhard Herzog <[email protected]>
7827    
7828     * Resources/Projections/defaults.proj: Fix spelling of Mercator
7829    
7830 jonathan 823 2003-05-05 Jonathan Coles <[email protected]>
7831    
7832     Addresses the "Full Layer Extent" wish of RTbug #1787.
7833    
7834     * Resources/Projections/defaults.proj: Added UK National Grid.
7835    
7836     * Thuban/UI/mainwindow.py: Added new "Full layer extent" menu option.
7837     (MainWindow.FullLayerExtent): New. Calls MapCanvas.FitLayerToWindow()
7838     when the user selects the menu option.
7839    
7840     * Thuban/UI/view.py (MapCanvas.FitLayerToWindow): New. Centers and
7841     scales the given layer on the canvas using the map projection.
7842    
7843 bh 819 2003-05-05 Bernhard Herzog <[email protected]>
7844    
7845     Convert the table implementations to a new table interface. All
7846     tables use a common mixin class to provide backwards compatibility
7847     until all table users have been updated.
7848    
7849     * Thuban/Model/table.py (OldTableInterfaceMixin): Mixin class to
7850     provide backwards compatibility for table classes implementing the
7851     new interface
7852     (DBFTable, MemoryTable): Implement the new table interface. Use
7853     OldTableInterfaceMixin as base for compatibility
7854     (DBFColumn, MemoryColumn): New. Column description for DBFTable
7855     and MemoryTable resp.
7856    
7857     * test/test_dbf_table.py: New. Test cases for the DBFTable with
7858     the new table interface.
7859    
7860     * test/test_memory_table.py: New. Test cases for the MemoryTable
7861     with the new table interface.
7862    
7863     * test/test_table.py: Document the all tests in this file as only
7864     for backwards compatibility. The equivalent tests for the new
7865     interface are in test_memory_table.py and test_dbf_table.py
7866     (MemoryTableTest.test_read): field_info should be returning tuples
7867     with four items
7868     (MemoryTableTest.test_write): Make doc-string a more precise.
7869    
7870     * Thuban/Model/transientdb.py (TransientTableBase): Convert to new
7871     table interface. Derive from from OldTableInterfaceMixin for
7872     compatibility.
7873     (TransientTableBase.create): New intance variable column_map to
7874     map from names and indices to column objects
7875     (TransientTable.create): Use the new table interface of the input
7876     table
7877     (AutoTransientTable): Convert to new table interface. Derive from
7878     from OldTableInterfaceMixin for compatibility.
7879     (AutoTransientTable.write_record): Removed. It's not implemented
7880     yet and we still have to decide how to handle writing with the new
7881     table and data framework.
7882    
7883     * test/test_transientdb.py
7884     (TestTransientTable.run_iceland_political_tests)
7885     (TestTransientTable.test_transient_joined_table): Use the new
7886     table interface
7887    
7888 jonathan 817 2003-05-05 Jonathan Coles <[email protected]>
7889    
7890     This is namely a collection of UI updates to improve user interactivity.
7891     Tabbing between controls now exists and you can use ESC to close dialog
7892     boxes; ENTER will active the default button.
7893    
7894     * Thuban/UI/classgen.py (ClassGenDialog.__init__): Rearrange the
7895     order that the controls are created so that tabbing works correctly.
7896     (ClassGenDialog.OnOK): Renamed from _OnGenerate() so that the
7897     wxDialog can handle the default button correctly.
7898     (ClassGenDialog.OnCancel): Renamed from _OnCloseBtn() for the
7899     same reasons as for OnOK.
7900     (GenUniformPanel._OnRetrieve): Call wxBeginBusyCursor/wxEndBusyCursor
7901     when we ask the table for the maximum/minimum values of a field
7902     which could take a very long time.
7903    
7904     * Thuban/UI/classifier.py (Classifier.__init__): Rearrange the
7905     order that the controls are created so that tabbing works correctly.
7906     (SelectPropertiesDialog.__init__): Rearrange the order that the
7907     controls are created so that tabbing works correctly.
7908    
7909     * Thuban/UI/dialogs.py: Copied NonModalDialog box and changed it
7910     to derive from a wxDialog but behave like the original implementation
7911     which was derived from a wxFrame. wxDialog provides useful key
7912     handling functionality like ESC calling OnCancel and ENTER calling
7913     OnOK which is lost with wxFrame.
7914    
7915     * Thuban/UI/mainwindow.py: Add "..." to menu items that will open
7916     new dialogs.
7917    
7918     * Thuban/UI/projdialog.py (ProjFrame.__init__): Rearrange the
7919     order that the controls are created so that tabbing works correctly.
7920     (ProjFrame.OnApply): Renamed from _OnTry() to use wxDialog behaviour.
7921     (ProjFrame.OnOK): Renamed from _OnOK() to use wxDialog behaviour.
7922     (ProjFrame.OnCancel): Renamed from _OnClose() to use wxDialog behaviour.
7923     (ProjPanel.__init__): Add "Airy" to the list of ellipsoids so we
7924     can provide the "UK National Grid" as a default projection.
7925     (UTMPanel.__init__): Rearrange the order that the controls are
7926     created so that tabbing works correctly.
7927    
7928 bh 809 2003-05-05 Bernhard Herzog <[email protected]>
7929    
7930 bh 811 * extensions/thuban/wxproj.cpp: Fix some of the comments.
7931     (project_point): If a map projection but no layer projection is
7932     given, convert degrees to radians before applying the map
7933     projection.
7934    
7935 bh 809 * Thuban/UI/tableview.py (TableGrid.disallow_messages)
7936     (TableGrid.allow_messages): New methods to make it possible to
7937     inhibit message sending.
7938     (TableGrid.issue): Only send the message if not inhibited.
7939     (LayerTableGrid.select_shape): Use the new methods to make sure
7940     that no ROW_SELECTED message is sent while we're updating the
7941     selected rows to match the selected shapes.
7942    
7943 jan 807 2003-05-02 Jan-Oliver Wagner <[email protected]>
7944    
7945     Implementation of MemoryTable.
7946    
7947     * Thuban/Model/table.py (MemoryTable): New. Quite simple table
7948     implementation that operates on a list of tuples. All of the data
7949     are kept in the memory.
7950    
7951     * test/test_table.py (MemoryTableTest): New.
7952    
7953     * test/test_transientdb.py (SimpleTable): Removed.
7954     (TestTransientTable.test_transient_joined_table,
7955     (TestTransientTable.test_transient_table_read_twice): Replaced
7956     SimpleTable by MemoryTable.
7957    
7958 jonathan 793 2003-04-30 Jonathan Coles <[email protected]>
7959    
7960 jonathan 803 * Data/iceland_sample.thuban: Now contains correct projections
7961     for each of the layers.
7962    
7963     * Resources/Projections/defaults.proj: Geographic projection
7964     contains unit conversion parameter.
7965    
7966     2003-04-30 Jonathan Coles <[email protected]>
7967    
7968 jonathan 793 The most important part of this putback is the projection changes.
7969     It should now be possible to specify the projection that a layer
7970     is in and then specify a different projection for the map. The
7971     projection dialog has an extra parameter for a geographic projection
7972     which lets the user select if the input is in degrees or radians.
7973    
7974     * Thuban/Model/layer.py (Layer.ShapesInRegion): Fix docstring
7975     to say that the parameter is a tuple of unprojected
7976     points (which is what the callers to this method were assuming).
7977     Also, since the points are unprojected we need to projected them.
7978    
7979     * Thuban/UI/legend.py (LegendTree.MoveCurrentItemUp,
7980     LegendTree.MoveCurrentItemDown): If the layer or any of the layer's
7981     groups are selected, move the layer up/down. Fixes RTbug #1833.
7982    
7983     * Thuban/UI/mainwindow.py: Move menu item map_rename up.
7984    
7985     * Thuban/UI/projdialog.py (ProjFrame._OnSave): Add missing
7986     parameter in call to SetClientData.
7987     (GeoPanel): Add support for selecting the units that the
7988     source data is in (Radians or Degrees).
7989    
7990     * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Optimize
7991     the rendering loop by reducing the number of if's, removing the
7992     unnecessary try/except block, and checking if the old group
7993     is the same as the new one (which happens a lot if there is
7994     no classification, or lots of shapes are in the same group).
7995    
7996     * Thuban/UI/view.py (MapCanvas.OnPaint): Add a try/except block
7997     around the redraw routine to try to catch problems that the user
7998     may create by selecting invalid projections for the data set and
7999     map. Clears the display if there are any problems and prints the
8000     error.
8001     (MapCanvas.do_redraw): Use DC.Clear() instead of drawing a filled
8002     rectangle.
8003    
8004     * extensions/thuban/wxproj.cpp (project_point): First invert the
8005     supplied point (which should be in projected coordinates) using
8006     the layer's projection and then project the point using the
8007     map's projection.
8008     (project_points): Use project_point() to project each point.
8009    
8010 jan 792 2003-04-30 Jan-Oliver Wagner <[email protected]>
8011    
8012     * Thuban/Model/layer.py (Layer.SetShapeStore): Fixed a bug:
8013     don't set the Classification to None if the classfication field
8014     is None (ie only a DEFAULT).
8015    
8016 bh 786 2003-04-30 Bernhard Herzog <[email protected]>
8017    
8018 bh 790 * Thuban/UI/view.py: Fix some typos.
8019    
8020 bh 788 * Thuban/UI/mainwindow.py (MainWindow.identify_view_on_demand): Do
8021     not pop up the dialog if the selection becomes empty (this could
8022     happen if e.g. a new selection is opened while the identify tool
8023     is active and dialog had been closed)
8024    
8025     2003-04-30 Bernhard Herzog <[email protected]>
8026    
8027 bh 786 * Thuban/Model/transientdb.py (TransientTableBase.__init__): New
8028     instance variable read_record_last_result
8029     (TransientTableBase.read_record): Make sure reading the same
8030     record twice works. The implementation uses the new instance
8031     variable read_record_last_result
8032    
8033     * test/test_transientdb.py
8034     (TestTransientTable.test_transient_table_read_twice): New test
8035     case for the above bug-fix.
8036    
8037 jonathan 793 2003-04-29 Jonathan Coles <[email protected]>
8038    
8039     * Thuban/common.py: Removed. No longer needed Str2Num. RTbug #1832.
8040    
8041     * Thuban/UI/classgen.py: Remove all uses of Str2Num.
8042    
8043     * Thuban/UI/classifier.py: Remove all uses of Str2Num.
8044     (ClassTable.SetValueAsCustom): Rename keyword argument in
8045     ClassGroup* constructors to match argument name.
8046    
8047 bh 779 2003-04-29 Bernhard Herzog <[email protected]>
8048    
8049     * Thuban/Model/session.py (Session.Destroy): Explicitly close the
8050     transient DB if it exists to make sure it doesn't leave a journal
8051     file in the temp directory.
8052    
8053     * Thuban/Model/transientdb.py (TransientDatabase.close): Set
8054     self.conn to None after closing the connection to make sure it's
8055     not closed twice
8056    
8057 jonathan 767 2003-04-29 Jonathan Coles <[email protected]>
8058    
8059 jonathan 769 Add a visible parameter in the layer XML tag. The default value is
8060     "true". If anything other than "false" is specified we also assume
8061 jonathan 776 "true". Addresses RTbug #1025.
8062 jonathan 769
8063     * Doc/thuban.dtd: Add visible parameter to a layer.
8064    
8065     * Thuban/Model/layer.py (BaseLayer.__init__): Change default value
8066     of visible from 1 to True.
8067     (Layer.__init__): Change default value of visible from 1 to True.
8068    
8069     * Thuban/Model/load.py (SessionLoader.start_layer): Read visible
8070     parameter.
8071    
8072     * Thuban/Model/save.py (SessionSaver.write_layer): Save visible
8073     parameter.
8074    
8075     * test/test_load.py: Add new test data contents_test_visible.
8076     (LoadSessionTest.setUp): save test data.
8077     (LoadSessionTest.testLayerVisibility): Test if the visible flag
8078     is loaded correctly.
8079    
8080     * test/test_save.py (SaveSessionTest.testSingleLayer): Add test
8081     for saving an invisible layer.
8082    
8083     2003-04-29 Jonathan Coles <[email protected]>
8084    
8085 jonathan 767 * Thuban/UI/mainwindow.py (MainWindow.SetMap): Look up the
8086     legend dialog box and tell it to change its map to the one
8087     supplied to SetMap(). Fixes RTbug #1770.
8088    
8089 bh 764 2003-04-29 Bernhard Herzog <[email protected]>
8090    
8091 bh 766 Next step of table implementation. Introduce a transient database
8092     using SQLite that some of the data is copied to on demand. This
8093     allows us to do joins and other operations that require an index
8094     for good performance with reasonable efficiency. Thuban now needs
8095     SQLite 2.8.0 and pysqlite 0.4.1. Older versions may work but I
8096     haven't tested that.
8097    
8098     * Thuban/Model/transientdb.py: New. Transient database
8099     implementation.
8100    
8101     * test/test_transientdb.py: New. Tests for the transient DB
8102     classes.
8103    
8104     * Thuban/Model/session.py (AutoRemoveFile, AutoRemoveDir): New
8105     classes to help automatically remove temporary files and
8106     directories.
8107     (Session.__init__): New instance variables temp_dir for the
8108     temporary directory and transient_db for the SQLite database
8109     (Session.temp_directory): New. Create a temporary directory if not
8110     yet done and return its name. Use AutoRemoveDir to have it
8111     automatically deleted
8112     (Session.TransientDB): Instantiate the transient database if not
8113     done yet and return it.
8114    
8115     * Thuban/Model/data.py (ShapefileStore.__init__): Use an
8116     AutoTransientTable so that data is copied to the transient DB on
8117     demand.
8118     (SimpleStore): New class that simply combines a table and a
8119     shapefile
8120    
8121     * Thuban/Model/table.py (Table, DBFTable): Rename Table into
8122     DBFTable and update its doc-string to reflect the fact that this
8123     is only the table interface to a DBF file. Table is now an alias
8124     for DBFTable for temporary backwards compatibility.
8125    
8126     * Thuban/UI/application.py (ThubanApplication.OnExit): Make sure
8127     the last reference to the session goes away so that the temporary
8128     files are removed properly.
8129    
8130     * test/test_load.py (LoadSessionTest.tearDown): Remove the
8131     reference to the session to make sure the temporary files are
8132     removed.
8133    
8134     2003-04-29 Bernhard Herzog <[email protected]>
8135    
8136 bh 764 * Thuban/Model/load.py (XMLReader.__init__, XMLReader.read): Turn
8137     the __parser instance variable into a normal local variable in
8138     read. It's only used there and read will never be called more than
8139     once. Plus it introduces a reference cycle that keeps can keep the
8140     session object alive for a long time.
8141    
8142 jonathan 767 2003-04-29 Jonathan Coles <[email protected]>
8143 jonathan 735
8144 jonathan 762 * Thuban/Model/proj.py (Projection): Removed Set*() methods to make
8145     Projection an immutable item. Fixes RTbug #1825.
8146     (Projection.__init__): Initialize instance variables here.
8147     (ProjFile.Replace): New. Replace the given projection object with
8148     the new projection object. This solves the problem of needing the
8149     mutator Projection.SetProjection() in the ProjFrame class and
8150     allows a projection to change parameters without changing its
8151     location in the file.
8152    
8153     * Thuban/UI/mainwindow.py (MainWindow.SaveSessionAs): Dialog should
8154     be of type wxSAVE and should verify overwriting a file.
8155    
8156     * Thuban/UI/projdialog.py (ProjFrame._OnSave): Use the new
8157     ProjFile.Replace() method instead of the mutator
8158     Projection.SetProjection(). Also requires that we reassign the
8159     client data to the new projection.
8160    
8161     * test/test_proj.py (TestProjection.test): Test GetName() and
8162     GetAllParameters()
8163     (TestProjFile.test): Remove tests for Set*() methods. Add tests
8164     for Replace().
8165    
8166     2003-04-25 Jonathan Coles <[email protected]>
8167    
8168 jonathan 756 * Thuban/Model/save.py (SessionSaver.write_projection): Make sure
8169     to save the name of the projection.
8170    
8171     * test/test_save.py (SaveSessionTest.testLayerProjection): New
8172     test to verify layer projections are saved correctly.
8173    
8174     2003-04-25 Jonathan Coles <[email protected]>
8175    
8176 jonathan 753 * Thuban/Model/proj.py (Projection.SetName): Set the name
8177     to "Unknown" if name is None.
8178     (Projection.SetAllParameters): New. Set the projection's
8179     parameter list to the one supplied.
8180     (Projection.SetProjection): New. Set the projection's
8181     properties to those of the supplied Projection.
8182    
8183     * Thuban/UI/mainwindow.py (MainWindow.MapProjection): Set
8184     the dialog title to include the map's title.
8185     (MainWindow.LayerProjection): Set the dialog title to include
8186     the layer's title.
8187    
8188     * Thuban/UI/projdialog.py (ProjFrame.__ShowError): Consolidate
8189     error dialogs into a single method call.
8190     (ProjFrame.__VerifyButtons): Add more states to check.
8191     (ProjFrame.__GetProjection): Return the current state of an
8192     edited projection or None.
8193     (ProjFrame.__FillAvailList): Remove checks for states that
8194     shouldn't exist.
8195     (ProjFrame._OnNew): Clear all selected items and supply
8196     a projection panel if necessary.
8197    
8198     * test/test_proj.py (TestProjFile.test): Add tests for
8199     ProjFile.SetAllParameters, ProjFile.SetProjection,
8200     ProjFile.SetName.
8201    
8202     2003-04-25 Jonathan Coles <[email protected]>
8203    
8204 jonathan 748 * Thuban/UI/projdialog.py (ProjFrame.__FillAvailList): Now
8205     takes an optional argument to select the current projection.
8206     This does not guarantee that the item is visible due to
8207     limited wxWindows functionality. Fixes RTBug #1821.
8208    
8209     2003-04-25 Jonathan Coles <[email protected]>
8210    
8211 jonathan 743 * Thuban/Model/load.py (SessionLoader.start_projection): Remember
8212     the projection name and use it when constructing the Projection
8213     object.
8214    
8215     * Thuban/Model/proj.py (Projection.__init__): Change the default
8216     value for 'name' to None and then test if name is equal to None
8217     in the body of the constructor. This way the caller doesn't have to
8218     know what the default value should be. Namely, useful in load.py
8219     where we have to pick a default value if the 'name' parameter
8220     doesn't exist in the XML file.
8221    
8222     * test/test_load.py (LoadSessionTest.testLayerProjection): New.
8223     Tests a file where a layer has a projection.
8224    
8225     2003-04-25 Jonathan Coles <[email protected]>
8226    
8227 jonathan 735 * Thuban/Model/layer.py (Layer.TreeInfo): Add an item to the
8228     tree for projection information.
8229    
8230     * Thuban/Model/load.py (XMLReader.GetFilename): Renamed from
8231     XMLReader.GetFileName.
8232     (SessionLoader): Added support for loading projection tags that
8233     appear inside a layer.
8234    
8235     * Thuban/Model/proj.py (ProjFile): Document the class. Move
8236     back to using a list because the order of the projections in
8237     the file is important to maintain. Fixes RTbug #1817.
8238    
8239     * Thuban/Model/resource.py: Rename calls to ProjFile.GetFileName
8240     to ProjFile.GetFilename.
8241    
8242     * Thuban/Model/save.py (SessionSaver.write_layer): Save projection
8243     information.
8244    
8245     * Thuban/UI/projdialog.py (ProjFrame._OnAddToList): Renamed from
8246     ProjFrame._OnSaveAs. Removed old dead code from previous
8247     implementation.
8248     (ProjFrame._OnExport): Add support for exporting more than one
8249     projection to a single file.
8250     (ProjFrame.__FillAvailList): use string formatting (% operator)
8251     to build strings that are (partly) translated. Fixes RTbug #1818.
8252    
8253     * test/test_proj.py (TestProjFile.test): New. Tests the base ProjFile
8254     class.
8255    
8256 bh 734 2003-04-24 Bernhard Herzog <[email protected]>
8257    
8258     * po/es.po: Updated Spanish translation by Daniel Calvelo Aros
8259    
8260     * po/fr.po: New. French translation by Daniel Calvelo Aros
8261    
8262     * Thuban/UI/projdialog.py (ProjFrame._OnSaveAs): Don't translate
8263     empty strings.
8264    
8265 jonathan 735 2003-04-24 Jonathan Coles <[email protected]>
8266 jonathan 724
8267     * Thuban/Model/layer.py (Layer.GetProjection): New. Needed to
8268     implement the interface that the ProjFrame dialog expects.
8269    
8270     * Thuban/Model/proj.py (Projection.SetName): New. Allows the
8271     name of the projection to be changed.
8272     (ProjFile): Use a dictionary instead of a list so that removing
8273     projections is easier and we are sure about uniqueness.
8274     (ProjFile.Remove): Remove the given projection object.
8275    
8276     * Thuban/Model/resource.py (GetSystemProjFiles, GetUserProjFiles):
8277     Return a list with only one projection file instead of searching for
8278     any projection file. This simplifies many things if the user can
8279     only have one system file and one user file.
8280    
8281     * Thuban/UI/classgen.py: Change all references to
8282     genCombo to genChoice.
8283    
8284     * Thuban/UI/mainwindow.py: Add a Projection option under the
8285     layer menu.
8286     (MainWindow.LayerProjection): New. Open up a projection window
8287     for a layer.
8288    
8289     * Thuban/UI/projdialog.py: Large changes to how the dialog is
8290     laid out. Use three panels instead of one. One for the list of
8291     projections, one for the edit controls, and one for the buttons.
8292     Fixed resizing problems so that the dialog resizes correctly
8293     when the projection panel changes. Added import/export, save, and
8294     new buttons/functionality.
8295    
8296 bh 723 2003-04-24 Bernhard Herzog <[email protected]>
8297    
8298     First step towards table management. Introduce a simple data
8299     abstraction so that we replace the data a layer uses more easily
8300     in the next step.
8301    
8302     * Thuban/Model/data.py: New file with a simple data abstraction
8303     that bundles shapefile and dbffile into one object.
8304    
8305     * Thuban/Model/session.py (Session.OpenShapefile): New method to
8306     open shapefiles and return a shape store object
8307    
8308     * Thuban/Model/layer.py (Layer.__init__): Pass the data as a store
8309     object instead of a shapefile filename. This introduces a new
8310     instance variable store holding the datastore. For intermediate
8311     backwards compatibility keep the old instance variables.
8312     (open_shapefile): Removed. No longer needed with the shape store.
8313     (Layer.SetShapeStore, Layer.ShapeStore): New methods to set and
8314     get the shape store used by a layer.
8315     (Layer.Destroy): No need to explicitly destroy the shapefile or
8316     table anymore.
8317    
8318     * Thuban/UI/mainwindow.py (MainWindow.AddLayer)
8319     (MainWindow.AddLayer): Use the session's OpenShapefile method to
8320     open shapefiles
8321    
8322     * Thuban/Model/load.py (ProcessSession.start_layer): Use the
8323     session's OpenShapefile method to open shapefiles
8324    
8325     * test/test_classification.py
8326     (TestClassification.test_classification): Use the session's
8327     OpenShapefile method to open shapefiles and build the filename in
8328     a more platform independed way
8329    
8330     * test/test_layer.py (TestLayer.setUp, TestLayer.tearDown):
8331     Implement to have a session to use in the tests
8332     (TestLayer.test_arc_layer, TestLayer.test_polygon_layer)
8333     (TestLayer.test_point_layer, TestLayer.test_empty_layer): Use the
8334     session's OpenShapefile method to open shapefiles
8335     (TestLayerLegend.setUp): Instantiate a session so that we can use
8336     it to open shapefiles.
8337     (TestLayerLegend.tearDown): Make sure that all references to
8338     layers and session are removed otherwise we may get a resource
8339     leak
8340    
8341     * test/test_map.py (TestMapAddLayer.test_add_layer)
8342     (TestMapWithContents.setUp): Instantiate a session so that we can
8343     use it to open shapefiles.
8344     (TestMapWithContents.tearDown): Make sure that all references to
8345     layers, maps and sessions are removed otherwise we may get a
8346     resource leak
8347     ("__main__"): use support.run_tests() so that more info about
8348     uncollected garbage is printed
8349    
8350     * test/test_save.py (SaveSessionTest.testSingleLayer): Use the
8351     session's OpenShapefile method to open shapefiles
8352     ("__main__"): use support.run_tests() so that more info about
8353     uncollected garbage is printed
8354    
8355     * test/test_selection.py (TestSelection.tearDown): Make sure that
8356     all references to the session and the selection are removed
8357     otherwise we may get a resource leak
8358     (TestSelection.get_layer): Instantiate a session so that we can
8359     use it to open shapefiles.
8360     ("__main__"): use support.run_tests() so that more info about
8361     uncollected garbage is printed
8362    
8363     * test/test_session.py (TestSessionBase.tearDown)
8364     (TestSessionWithContent.tearDown): Make sure that all references
8365     to the session and layers are removed otherwise we may get a
8366     resource leak
8367     (TestSessionWithContent.setUp): Use the session's OpenShapefile
8368     method to open shapefiles
8369    
8370 jonathan 721 2003-04-24 Jonathan Coles <[email protected]>
8371    
8372     * Thuban/Model/load.py (XMLReader.read): Should have been checking
8373     if the file_or_filename object had the 'read' attribute.
8374    
8375 jonathan 715 2003-04-23 Jonathan Coles <[email protected]>
8376    
8377 jonathan 720 * Thuban/Model/resource.py: Fixes RTbug #1813.
8378     (ReadProjFile): Add documentation about which exceptions are raised.
8379     Always pass the exceptions up to the caller.
8380     (GetProjFiles): If the directory can't be read return an empty list.
8381     If any of the proj files can't be read skip that file and go
8382     on to the next one.
8383    
8384     * test/test_proj.py: Added test cases to handle nonexistent files,
8385     unreadable files, and files that don't parse correctly.
8386    
8387     2003-04-23 Jonathan Coles <[email protected]>
8388    
8389 jonathan 716 Projection dialog. Allows the user to select from a list
8390     of projection templates and optionally edit them and save new ones.
8391    
8392     * Thuban/UI/projdialog.py (ProjFrame): New. Main dialog.
8393     (ProjPanel): Base class for projection specific panels.
8394     (TMPanel): Projection panel for Transverse Mercartor.
8395     (UTMPanel): Projection panel for Universal Transverse Mercartor.
8396     (LCCPanel): Projection panel for Lambert Conic Conformal.
8397     (GeoPanel): Projetion panel for Geographic Projection.
8398    
8399     2003-04-23 Jonathan Coles <[email protected]>
8400    
8401 jonathan 715 * Thuban/Model/load.py (XMLReader): Renamed from XMLProcessor to
8402     promote symmetry. There now exists XMLReader and XMLWriter.
8403     (XMLReader.read): New. Call to read the given file descriptor or
8404     filename.
8405     (XMLReader.close): New. Make sure the file is closed.
8406     (XMLReader.GetFileName): New. Return just the file name that is being
8407     read from.
8408     (XMLReader.GetDirectory): New. Return just the directory of the file
8409     that is being read.
8410     (XMLReader.AddDispatchers): New. Take a dictionary which contains
8411     the names of functions to call as the XML tree is parsed.
8412     (XMLReader.startElementNS): Updated to use new dispatcher dictionary.
8413     (XMLReader.endElementNS): Updated to use new dispatcher dictionary.
8414     (SessionLoader): Removed class variables start_dispatcher and
8415     end_dispatcher since this functionality is now part of a class
8416     instance. Fixes RTbug #1808.
8417     (SessionLoader.__init__): Add dispatcher functions.
8418     (load_xmlfile): Code was moved into the XMLReader.read().
8419     (load_session): Use modified SessionLoader.
8420    
8421     * Thuban/Model/map.py (Map.GetProjection): New. Returns the
8422     map's projection.
8423    
8424     * Thuban/Model/proj.py (Projection.GetParameters): Renamed to
8425     GetAllParameters.
8426     (Projection.GetParameter): Returns the value for the given parameter.
8427    
8428     * Thuban/Model/resource.py: Use XMLReader and XMLWriter.
8429     (GetProjFiles): Renamed from GetProjections. Now returns a list
8430     of ProjFile objects.
8431     (GetSystemProjFiles): Renamed from GetSuppliedProjections. Returns
8432     a list of ProjFile objects whose files are not user defined.
8433     (GetUserProjFiles): Renamed from GetUserProjections. Returns a
8434     list of ProjFile objects whose files are user defined.
8435     (ProjFileReader): Extend new XMLReader.
8436    
8437     * Thuban/Model/save.py (XMLWriter): Renamed from XMLSaver to
8438     promote symmetry.
8439    
8440     * Thuban/UI/classgen.py (ClassGenDialog.__init__): Use a wxChoice
8441     control instead of a wxComboBox. wxChoice controls do not generate
8442     events as the uses highlights possible choices which fixes problems
8443     with resizing the dialog when the use selects an option.
8444    
8445     * Thuban/UI/classifier.py (Classifier.__init__): Use a wxChoice
8446     control instead of a wxComboBox.
8447    
8448     * Thuban/UI/mainwindow.py (MainWindow.Projection): Use new projection
8449     dialog.
8450    
8451     * test/test_proj.py (TestProjection.test): New tests for GetParameter
8452     method.
8453    
8454 bh 703 2003-04-22 Bernhard Herzog <[email protected]>
8455    
8456 bh 705 * Thuban/UI/mainwindow.py: Remove some unused imports and global
8457     constants
8458    
8459 bh 703 * Thuban/UI/identifyview.py (IdentifyListCtrl.selected_shape)
8460     (IdentifyGridCtrl.selected_shape): Use table, not shapetable.
8461    
8462 bh 700 2003-04-17 Bernhard Herzog <[email protected]>
8463    
8464 bh 701 * Thuban/Model/layer.py: Don't import LAYER_LEGEND_CHANGED.
8465     (Layer): Update doc-string since LAYER_LEGEND_CHANGED is not used
8466     anymore.
8467     (Layer.BoundingBox, Layer.GetFieldType, Layer.NumShapes)
8468     (Layer.ShapeType, Layer.Shape): No need to call
8469     self.open_shapefile since it's always called in __init__
8470    
8471 bh 700 * Thuban/UI/application.py (ThubanApplication.MainLoop): Removed.
8472     In wxPython 2.4 there's no need to extend MainLoop anymore since
8473     wxPython itself makes sure OnExit is called.
8474    
8475 jonathan 688 2003-04-16 Jonathan Coles <[email protected]>
8476    
8477 jonathan 693 Initial putback of projection management code. Includes new
8478     classes to read and write projection files. The current load
8479     and save classes were abstracted a bit so they could be reused.
8480     The Projection class was extended to provide new methods and
8481     have a name.
8482    
8483     * Thuban/Model/load.py (XMLProcessor): New. Contains all the
8484     general XML reading methods that were part of ProcessSession.
8485    
8486     * Thuban/Model/proj.py (Projection.__init__): Accepts an optional
8487     name.
8488     (ProjFile): New. Represents a file that contains projection
8489     information.
8490    
8491     * Thuban/Model/resource.py: New. Contains general utilities
8492     for read and writing projection files.
8493    
8494     * Thuban/Model/save.py (XMLSaver): New. Contains all the
8495     general XML writing methods that were part of SessionSaver.
8496     (SessionSaver): Renamed from Saver.
8497    
8498     * test/test_proj.py: New test cases for the projection
8499     file read and write functions.
8500    
8501     2003-04-16 Jonathan Coles <[email protected]>
8502    
8503 jonathan 688 * Thuban/Model/classification.py: Use repr() around values
8504     in the ClassGroup*.__repr__() methods so it is clearer when
8505     a value is a string and when it is a number.
8506    
8507     * test/test_load.py: Rework the classification test to test
8508     that we can load old files.
8509     (testLabels): Test a file where the groups have labels.
8510    
8511 bh 687 2003-04-16 Bernhard Herzog <[email protected]>
8512    
8513     Safer implementation of the performance enhancements of the
8514     low-level renderer:
8515    
8516     * extensions/thuban/wxproj.cpp (extract_projection)
8517     (extract_pointer): Rename extract_projection to extract_pointer
8518     and redefine its purpose to return the pointer stored in a CObject
8519     returned by the object's cobject method. Update all callers.
8520     (s_draw_info, free_draw_info, draw_polygon_init): Implement the
8521     handling of these low-level parameters so that each s_draw_info
8522     instance is handled as a CObject at python level that also
8523     contains real references to the actual python objects which
8524     contain the values in the struct. Add free_draw_info as the
8525     destructor.
8526     (draw_polygon_shape): Add the py_draw_info parameter which must a
8527     cobject containing an s_draw_info pointer.
8528    
8529     * Thuban/UI/renderer.py (MapRenderer.polygon_render_param): New
8530     method to instantiat the low-level render parameter
8531     (MapRenderer.draw_shape_layer): Use the new method. Remove some
8532     commented out code.
8533     (MapRenderer.draw_polygon_shape): Make the first parameter not the
8534     layer but the low-level render parameter
8535     (ScreenRenderer.draw_shape_layer): Use the low-level render
8536     parameter.
8537    
8538 jonathan 673 2003-04-15 Jonathan Coles <[email protected]>
8539    
8540 jonathan 680 * Thuban/Model/classification.py: Implemented __repr__ for
8541     the ClassGroup* classes to make debugging a bit easier.
8542     (ClassGroup.SetLabel): Check that the string is an instance
8543     of StringTypes not StringType. Accounts for Unicode strings.
8544    
8545     * Thuban/Model/color.py: Implemented __repr__ to make
8546     debugging a bit easier.
8547    
8548     * Thuban/Model/save.py (Saver.write_classification): Need to
8549     save the group label.
8550    
8551     * test/test_load.py (testClassification): New. Loads the
8552     iceland_sample_test.thuban file and checks if it was loaded
8553     correctly.
8554    
8555     2003-04-15 Jonathan Coles <[email protected]>
8556    
8557 jonathan 673 * extensions/thuban/wxproj.cpp (draw_polygon_init): New. Used
8558     to improve rendering performance by initializing the variables
8559     that are not change each time draw_polygon_shape() is called.
8560     The values are stored in a global struct draw_info.
8561     (draw_polygon_shape): Removed initialization code that is
8562     now in draw_polygon_init().
8563    
8564     * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Make
8565 jonathan 674 drawing initialization call to draw_polygon_init()
8566     (MapRenderer.draw_polygon_shape): Use new signature of
8567     draw_polygon_shape.
8568 jonathan 673
8569 jonathan 674 * Thuban/UI/classgen.py (GenUniformPanel): Fix spin control
8570     weirdness by setting the range to (1, maxint).
8571 jonathan 673
8572 jonathan 674 * Thuban/Model/classification.py (ClassGroupProperties): Make
8573     instance variables private and optimize comparison operator
8574     by first checking if the color references are the same.
8575     (ClassGroupSingleton): Make instance variables private.
8576     (ClassGroupRange): Make instance variables private.
8577 jonathan 673
8578 jonathan 674 * HOWTO-Release: Filled in missing steps for releasing packages.
8579    
8580 bh 672 2003-04-15 Bernhard Herzog <[email protected]>
8581    
8582     First stab at internationalized messages:
8583    
8584     * Thuban/__init__.py (_): Implement the translation function for
8585     real using the python gettext module.
8586    
8587     * Thuban/UI/classifier.py (ClassTable.GetRowLabelValue): Don't
8588     translate empty strings.
8589    
8590     * Thuban/UI/application.py (ThubanApplication.read_startup_files):
8591     Add a missing space to a warning message
8592    
8593     * po/README: New. Notes about the management of the translation
8594     files.
8595    
8596     * po/Makefile: New. Makefile to help manage the translation files.
8597    
8598     * po/es.po: New. Spanish translation by Daniel Calvelo Aros
8599    
8600     * MANIFEST.in: Include the *.mo files in Resources/Locale and the
8601     translations and support files in po/
8602    
8603     * setup.py (data_files): Add the *.mo files to the data_files too
8604    
8605     * README: Add note about the translations when building from CVS
8606    
8607 jonathan 669 2003-04-14 Jonathan Coles <[email protected]>
8608    
8609     * Thuban/UI/dock.py: Fixes some window resizing problems most
8610     noticable under windows. Always assume the button bitmaps will
8611     be there. Code clean up.
8612     (DockabelWindow.Dock, DockableWindow.UnDock): Force all the
8613     images for the dock/undock button to the same images.
8614     Work around for RTbug #1801.
8615    
8616     * Thuban/UI/legend.py (LegendPanel.__init__): The toolbar should
8617     be allowed to grow within the sizer. Fixes a bug under Windows
8618     where the toolbar wasn't being drawn.
8619    
8620 frank 664 2003-04-14 Frank Koormann <[email protected]>
8621    
8622     * Resources/Bitmaps/dock_12.xpm, Resources/Bitmaps/undock_12.xpm:
8623     Updated design to try to make the button functionality more
8624     transparent.
8625    
8626 jonathan 662 2003-04-14 Jonathan Coles <[email protected]>
8627    
8628     * Thuban/UI/legend.py (LegendPanel.__init__): Call Create() to
8629     finalize the intialization of the panel.
8630    
8631     * Thuban/UI/dock.py (DockPanel.Create): New. Finalizes the
8632     creation of the panel. Should be the last thing called in the
8633     initializer of a subclass.
8634    
8635     * Thuban/UI/classgen.py (ClassGenDialog.__init__): Actively
8636     set the current selections in the combo boxes. This is needed
8637     under Windows.
8638    
8639     * Thuban/UI/classifier.py (Classifier.__init__): Add a top
8640     level panel to the dialog so that the background colors are
8641     consistent under Windows.
8642    
8643 jonathan 646 2003-04-11 Jonathan Coles <[email protected]>
8644    
8645 jonathan 662 * Thuban/UI/classgen.py: Change color ramps to start at white
8646     not black.
8647    
8648     * Thuban/UI/legend.py: Enable/disable the legend buttons when
8649     the legend changes. Fixes RTbug #1793.
8650    
8651     * test/test_classification.py: Added test for copying of
8652     classifications.
8653    
8654     2003-04-11 Jonathan Coles <[email protected]>
8655    
8656 jonathan 647 * Thuban/UI/resource.py: New. Centralize the loading of resources
8657     such as bitmaps.
8658    
8659     * Thuban/UI/classgen.py (GenUniquePanel.__init__): Reordered buttons,
8660     added images to the move buttons, added 'reverse' button.
8661     (CustomRampPanel.__init__): Added images to the move buttons.
8662     (GreyRamp): New. Generates a ramp from white to black.
8663     (HotToColdRamp): New. Generates a ramp from cold to hot colors.
8664    
8665     * Thuban/UI/classifier.py: Refactored ID's from ID_CLASSIFY_* to
8666     ID_PROPERTY_*.
8667     (Classifier.__init__): Minor changes to the layout.
8668     (Classifier._OnTitleChanged): Listen for when the user edits the
8669     title and update the dialog's title and the layer's title.
8670    
8671     * Thuban/UI/dock.py: Use new bitmaps for the control buttons.
8672    
8673     * Thuban/UI/legend.py: Use new bitmaps for the control buttons.
8674     (LegendTree._OnMsgLayerTitleChanged): Change the displayed title
8675     if the layer's title changes.
8676    
8677     * Thuban/UI/mainwindow.py: Added new menu item and associated code
8678     to open a dialog to rename the map.
8679     (MainWindow): Use new resource class to import bitmaps.
8680    
8681     2003-04-11 Jonathan Coles <[email protected]>
8682    
8683 jonathan 646 * Resources/Bitmaps/close_12.xpm, Resources/Bitmaps/dock_12.xpm,
8684 jonathan 647 Resources/Bitmaps/group_use.xpm, Resources/Bitmaps/group_use_all.xpm,
8685     Resources/Bitmaps/group_use_none.xpm,
8686     Resources/Bitmaps/group_use_not.xpm,
8687     Resources/Bitmaps/hide_layer.xpm,
8688     Resources/Bitmaps/layer_properties.xpm,
8689     Resources/Bitmaps/lower_layer.xpm, Resources/Bitmaps/raise_layer.xpm,
8690     Resources/Bitmaps/show_layer.xpm, Resources/Bitmaps/undock_12.xpm:
8691     New.
8692 jonathan 646
8693 jonathan 636 2003-04-10 Jonathan Coles <[email protected]>
8694    
8695 jonathan 644 * Thuban/Model/classification.py: (ClassGroupRange.__init__):
8696     Should pass group to ClassGroup constructor.
8697    
8698     2003-04-10 Jonathan Coles <[email protected]>
8699    
8700 jonathan 636 * Thuban/Model/classification.py: (ClassGroup): Move all the common
8701     methods of the derived classes ([Set|Get]Properties(), __eq__, __ne__)
8702     here. Implement SetVisible(), IsVisible().
8703     (ClassGroup.__init__): Add group parameter which acts as a copy
8704     constructor.
8705    
8706     * Thuban/UI/classifier.py (ClassTable): Add a new column for the
8707     "Visible" check boxes.
8708     (Classifier): Rename the buttons and refactor the code to match
8709     the new labels.
8710    
8711     * Thuban/UI/legend.py: Classify button is now called "Properties".
8712     Refactored the code to change variable names.
8713     (LegendTree.__FillTreeLayer): Only list a group if it is visible.
8714    
8715     * Thuban/UI/mainwindow.py: MainWindow.OpenClassifier renamed to
8716     MainWindow.OpenLayerProperties. MainWindow.LayerEditProperties
8717     renamed to MainWindow.LayerEditProperties.
8718     (MainWindow.ToggleLegend): Don't include map name in legend title.
8719     (MainWindow.SetMap): Added the map name to the window title.
8720     (MainWindow.LayerFillColor, MainWindow.LayerTransparentFill,
8721     MainWindow.LayerOutlineColor, MainWindow.LayerNoOutline): Removed.
8722     Functionality is found in the layer properties dialog.
8723    
8724     * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Only
8725     draw visible groups.
8726    
8727 jonathan 626 2003-04-09 Jonathan Coles <[email protected]>
8728    
8729 jonathan 634 * Thuban/UI/classgen.py: Modifications to allow simple
8730     addition and selection of new color schemes.
8731     (MonochromaticRamp): New. Generates a ramp between two colors.
8732     (RedRamp): New. Generates a ramp of all red.
8733     (GreenRamp): New. Generates a ramp of all green.
8734     (BlueRamp): New. Generates a ramp of all blue.
8735    
8736     2003-04-09 Jonathan Coles <[email protected]>
8737    
8738 jonathan 626 * Thuban/Model/classification.py (Classification.__deepcopy__):
8739     Need to copy over field and fieldType attributes.
8740    
8741     * Thuban/Model/table.py (Table.field_range): New. Retrive the
8742     maximum and minimum values over the entire table for a given
8743     field.
8744     (Table.GetUniqueValues): New. Retrieve all the unique values
8745     in the table for a given field.
8746    
8747     * Thuban/UI/classgen.py: Renamed GenRangePanel to GenUniformPanel.
8748     (GenUniquePanel): New. Controls to allow the user to select
8749     which unique field values they would like in the classification.
8750     (CustomRampPanel): Code that was in ClassGenDialog that allows
8751     the user to select the properties for a custom ramp.
8752     (ClassGenerator.GenUniformDistribution): Was called GenerateRanges.
8753    
8754     * Thuban/UI/classifier.py: Removed a lot of debugging code.
8755     (Classifier._SetClassification): Callback method so that the
8756     class generator can set the classification in the grid.
8757     (ClassGroupPropertiesCtrl): New. Encapsulates the drawing and
8758     editing of a group properties class into a wxWindows control.
8759    
8760     * Thuban/UI/dock.py: It was decided that if the user closes
8761     a dockable window the window should simply hide itself. That
8762     way if the user wants to show the dock again it appears in the
8763     same place as it was when it was closed.
8764     (DockableWindow.Destroy): Call renamed method OnDockDestroy().
8765     (DockableWindow._OnButtonClose): Hide the window instead of
8766     destroying it.
8767     (DockableWindow._OnClose): Hide the window instead of
8768     destroying it.
8769    
8770     * Thuban/UI/legend.py (LegendTree): Use a private method to
8771     consistently set the font and style of the text. Fixes RTbug #1786.
8772    
8773     * Thuban/UI/mainwindow.py: Import just the Classifier class.
8774    
8775 bh 623 2003-04-07 Bernhard Herzog <[email protected]>
8776    
8777 bh 625 * Thuban/UI/mainwindow.py (main_menu): Move the toggle_legend item
8778     to the map module
8779    
8780     2003-04-07 Bernhard Herzog <[email protected]>
8781    
8782 bh 623 * Thuban/UI/mainwindow.py (MainWindow.ShowSessionTree): Removed in
8783     favor of ToggleSessionTree
8784     (MainWindow.ToggleSessionTree): New method to toggle visibility of
8785     the session tree.
8786     (MainWindow.SessionTreeShown): New method to return whether the
8787     session tree is currently shown.
8788     (MainWindow.ToggleLegend): New method to toggle visibility of the
8789     legend
8790     (MainWindow.ShowLegend): Implement in terms of ToggleLegend and
8791     LegendShown
8792     (MainWindow.LegendShown): New method to return whether the legend
8793     is currently shown.
8794     (_method_command): Add checked parameter so we can define check
8795     menu items
8796     (_has_tree_window_shown, _has_legend_shown): Use the appropriate
8797     mainwindow methods.
8798     (show_session_tree, show_legend commands): Removed.
8799     (toggle_session_tree, toggle_legend commands): New commands to
8800     toggle the visibility of the dialogs
8801    
8802 jonathan 612 2003-04-07 Jonathan Coles <[email protected]>
8803    
8804 jonathan 619 * Thuban/UI/classgen.py: Fix Windows problem.
8805    
8806     * Thuban/UI/dock.py: Fix Windows problem.
8807    
8808     * Thuban/UI/mainwindow.py: Use False instead of false.
8809     (MainWindow.ShowLegend): Remove unnecessary switch parameter.
8810    
8811     2003-04-07 Jonathan Coles <[email protected]>
8812    
8813 jonathan 612 Since we now say that the order of the groups in a classification
8814     matters, it makes sense to be able to manipulate that order. Most
8815     of the changes to Thuban/Model/classification.py are to that end.
8816    
8817     * Thuban/Model/classification.py (Classification.AppendGroup,
8818     Classification.InsertGroup, Classification.ReplaceGroup,
8819     Classification.RemoveGroup, Classification.GetGroup): Do as the
8820     names imply.
8821     (Classification.FindGroup): This was called GetGroup, but GetGroup
8822     takes an index, while FindGroup takes a value.
8823     (Classification.__deepcopy__): Copy all the groups, BUT NOT THE LAYER
8824     REFERENCE. Currently there is a cyclic reference between the layer
8825     and its classification. If the classification doesn't need to know
8826     its owning layer we can change this, since it may make sense to be
8827     able to use the same classification with different layers.
8828    
8829     * Thuban/Model/load.py: Use Classification.AppendGroup(), not AddGroup()
8830    
8831     * Thuban/UI/classgen.py: Use Classification.AppendGroup(),
8832     not AddGroup()
8833    
8834     * Thuban/UI/classifier.py: Now that we can depend on the order in
8835     a Classification and have methods to manipulate that order we don't
8836     need to use our own data structures in the grid. We can simply make
8837     the grid/table access the information they need from a copy of
8838     the classification object.
8839     (Classifier._OnCloseBtn): Event handler for when the user clicks
8840     'Close'. This is needed so if the user applies changes and then
8841     continues to change the table the user has the option of discarding
8842     the most recent changes and keeping what they applied.
8843    
8844     * Thuban/UI/mainwindow.py: Put "Show Legend" and "Show Session Tree"
8845     into the same group.
8846    
8847     * extensions/thuban/wxproj.cpp (check_version): If Thuban is compiled
8848     with a really old version of proj, PJ_VERSION won't even be defined.
8849     If it isn't defined then just compile so that the function always
8850     returns Py_False.
8851    
8852     * test/test_classification.py: Fix tests to use the renamed methods.
8853     Still need to write tests for the new methods.
8854    
8855 jonathan 601 2003-04-04 Jonathan Coles <[email protected]>
8856 jonathan 608
8857 jonathan 612 * Thuban/UI/classifier.py (Classifier.__SelectField): Move the
8858     call to SetSelection out of the method and before the call
8859     to __SelectField in __init__. This prevents a recursion of events
8860     when _OnFieldSelect is triggered by the user.
8861    
8862     2003-04-04 Jonathan Coles <[email protected]>
8863    
8864 jonathan 608 * Thuban/Model/classification.py: Rename Color.None to
8865     Color.Transparent.
8866     (ClassGroupProperties.SetLineColori, ClassGroupProperties.SetFill):
8867     Don't bother copying the color, since Colors are immutable.
8868    
8869     * Thuban/Model/color.py, Thuban/Model/layer.py, Thuban/Model/load.py,
8870     Thuban/UI/classifier.py, Thuban/UI/mainwindow.py,
8871     Thuban/UI/renderer.py, Thuban/UI/view.py:
8872     Rename Color.None to Color.Transparent.
8873    
8874     * test/test_classification.py, test/test_load.py: Rename Color.None
8875     to Color.Transparent.
8876    
8877     2003-04-04 Jonathan Coles <[email protected]>
8878 jonathan 603
8879     * Thuban/Model/classification.py: Fix assert calls.
8880     (ClassGroupProperties.SetLineColor, ClassGroupProperties.SetFill):
8881     Copy the color parameter rather than hold onto a reference.
8882 jonathan 601
8883 jonathan 603 * Thuban/Model/color.py (Color.__copy__, Color.__deepcopy): Copy
8884     the color object.
8885     (NoColor.__copy__, NoColor.__deepcopy): Return 'self' so that we
8886     are sure there exists only one refernce to Color.None in the system.
8887     This allows us to use 'is' rather than the comparision functions.
8888    
8889     * Thuban/Model/save.py: Fix assert calls.
8890    
8891     * Thuban/UI/classifier.py: Fix assert calls.
8892     (ClassGrid._OnCellDClick): Call up to the classifier to open the
8893     dialog to edit the groups properties.
8894     (ClassGrid._OnCellResize): Make sure that the scollbars are drawn
8895     correctly if a cell is resized.
8896     (ClassTable.SetClassification): New. Changes the classification
8897     that is in the table.
8898     (ClassTable.__SetRow): Allow groups to be prepended.
8899     (Classifier): New code for opening the EditProperties and
8900     GenerateRanges dialogs.
8901     (SelectPropertiesDialog.__GetColor): Only set the color in the
8902     color dialog if the current color is not None.
8903    
8904     * Thuban/UI/dock.py: Fix assert calls.
8905    
8906     * Thuban/UI/legend.py: Fix assert calls.
8907    
8908     * Thuban/UI/renderer.py: Fix assert calls.
8909    
8910     * Thuban/UI/classgen.py (ClassGenDialog): Dialog for generating
8911     classifications.
8912     (GenRangePanel): Panel specific to range generation.
8913     (GenSingletonPanel): Panel specific to singleton generation.
8914     (ClassGenerator): Class responsible for actually generating
8915     the classification from the data gathered in the dialog box.
8916     (PropertyRamp): Generates properties whose values range from
8917     a starting property to an ending property.
8918 jonathan 601
8919 bh 600 2003-04-03 Bernhard Herzog <[email protected]>
8920    
8921     * test/support.py (print_garbage_information): New function that
8922     prints information about still connected messages and memory
8923     leaks.
8924     (run_suite): Removed.
8925     (run_tests): New function for use as a replacement of
8926     unittest.main in the test_* files. This one calls
8927     print_garbage_information at the end.
8928    
8929     * test/runtests.py (main): Use support.print_garbage_information
8930    
8931     * test/test_layer.py: Use support.run_tests instead of
8932     unittest.main so we get memory leak information
8933     (TestLayer.test_arc_layer, TestLayer.test_polygon_layer)
8934     (TestLayer.test_point_layer, TestLayer.test_empty_layer)
8935     (TestLayerLegend.test_visibility): Call the layer's Destroy method
8936     to fix a memory leak.
8937    
8938     * test/test_classification.py: Use support.run_tests instead of
8939     unittest.main so we get memory leak information
8940     (TestClassification.test_classification): Call the layer's Destroy
8941     method to fix a memory leak.
8942    
8943 bh 591 2003-04-02 Bernhard Herzog <[email protected]>
8944    
8945 bh 595 * extensions/thuban/wxproj.cpp (check_version, check_version_gtk):
8946     Handle the reference counts of the return value and errors in
8947     PyArg_ParseTuple correctly.
8948    
8949 bh 593 * Thuban/UI/application.py (ThubanApplication.OpenSession): Make
8950     sure the filename is absolute to avoid problems when saving the
8951     session again
8952    
8953 bh 591 * Thuban/Model/table.py: Remove unnecessary import. Fix a typo.
8954    
8955 jonathan 587 2003-04-01 Jonathan Coles <[email protected]>
8956    
8957 jonathan 589 * Thuban/UI/renderer.py (MapRenderer.draw_point_shape): Check
8958 jonathan 587 that there actually are points in the returned list of points
8959     before trying to index into the list. The list may be empty if
8960     the shape is a Null Shape.
8961    
8962 bh 586 2003-04-01 Bernhard Herzog <[email protected]>
8963    
8964     * test/test_map.py: Don't use from <module> import *
8965    
8966 jonathan 581 2003-04-01 Jonathan Coles <[email protected]>
8967    
8968     * Thuban/Model/session.py: Use LAYER_CHANGED instead of
8969     LAYER_LEGEND_CHANGED
8970    
8971     * Thuban/UI/dock.py (DockableWindow._OnButtonClose): Call
8972     self.Destroy() to close the window after yesterday's changes.
8973    
8974     * test/test_map.py, test/test_session.py: Fix messages that
8975     are sent from maps and layers.
8976    
8977 jonathan 575 2003-03-31 Jonathan Coles <[email protected]>
8978    
8979     * Thuban/UI/classifier.py: Commented out some debugging statements.
8980     (ClassDataPreviewer.Draw): Draw rectangles for polygon layers per
8981     RTbug #1769.
8982    
8983     * Thuban/UI/dock.py (DockableWindow.UnDock): Restore size and
8984     position (although position doesn't work yet under GTK).
8985     (DockableWindow.Destroy): New. Called when the window must be
8986     closed. Namely needed when the DockFrame closes and must close
8987     its children.
8988     (DockFrame): Listen for EVT_CLOSE and destroy all children.
8989    
8990     * Thuban/UI/legend.py (LegendPanel.Destroy): New. Cleans up
8991     when then window is told to close.
8992     (LegendTree._OnMsgLayerChanged): Fixes a seg fault bug. See
8993     comment in source for more info.
8994    
8995     * Thuban/UI/main.py: Show the legend by default when Thuban starts.
8996    
8997     * Thuban/UI/mainwindow.py: Renamed OnClose to _OnClose for
8998     symmetry with other such methods.
8999     (MainWindow.ShowLegend): Show the legend docked by default.
9000    
9001 jonathan 569 2003-03-28 Jonathan Coles <[email protected]>
9002    
9003     * Thuban/UI/classifier.py: Support for highlighting a specific
9004     group within the grid when the classification dialog is opened.
9005     Also contains a lot of debugging printouts which will later
9006     be removed.
9007    
9008     * Thuban/UI/dock.py: Complete rework on the dock code so that
9009     that it is fairly removed from the rest of the Thuban application.
9010     It is easy to add new docks which the rest of the program having
9011     to be aware of them.
9012    
9013     * Thuban/UI/legend.py: Modifications to support selecting a
9014     specific group in the classification dialog. Changed how layers
9015     are drawn when the layer is visible/invisible.
9016    
9017     * Thuban/UI/mainwindow.py: Removed legend specific code and
9018     replaced it with calls to the new dock code.
9019    
9020     * Thuban/UI/renderer.py (MapRenderer.__init__): Added assert
9021     to check if scale > 0. Trying to track down a divide by zero.
9022    
9023 jonathan 557 2003-03-26 Jonathan Coles <[email protected]>
9024    
9025 jonathan 567 * Thuban/UI/legend.py: Removed unnecessary LegendDialog class.
9026     (LegendPanel): Removed _OnDock()/_OnUnDock() methods which are
9027     now part of DockableWindow.
9028     (LegendPanel.DoOnSelChanged): Select the current layer in the
9029     map.
9030     (LegendTree._OnSelChanged): Call LegendPanel.DoOnSelChanged()
9031     with the selected layer and/or group.
9032    
9033     2003-03-26 Jonathan Coles <[email protected]>
9034    
9035 jonathan 557 This putback contains the code for dockable windows. There is
9036     no support in wxWindows as of this date for windows that can
9037     attach themselves to other windows.
9038    
9039     The current model contains a DockableWindow which has a parent
9040     window for when it is detached and a dock window that it puts
9041     its contents in when it is docked. The contents of a DockableWindow
9042     must be a DockPanel. DockPanel itself derives from wxPanel.
9043    
9044     * Thuban/Model/layer.py (Layer.ClassChanged): Send a LAYER_CHANGED
9045     message, not a LAYER_LEGEND_CHANGED message.
9046    
9047     * Thuban/Model/map.py (Map): Forward LAYER_CHANGED messages.
9048    
9049     * Thuban/UI/classifier.py (Classifier.__init__): Use wxADJUST_MINSIZE
9050     as one of the style properties for the fieldTypeText item to
9051     be sure that its size is correct when the text changes.
9052    
9053     * Thuban/UI/dock.py: New. Classes for the DockPanel and
9054     DockableWindow.
9055    
9056     * Thuban/UI/legend.py: Added some more buttons and made the
9057     LegendPanel a DockPanel.
9058    
9059     * Thuban/UI/mainwindow.py: Added sash windows to the main window
9060     and supporting functions for manipulating the sashes.
9061     (MainWindow.ShowLegend): Create a DockableWindow with the
9062     LegendPanel as the contents.
9063    
9064     * Thuban/UI/messages.py: Added DOCKABLE_* messages
9065    
9066     * Thuban/UI/view.py (MapCanves.SetMap): Listen for LAYER_CHANGED,
9067     not LAYER_LEGEND_CHANGED, messages.
9068    
9069 jonathan 554 2003-03-25 Jonathan Coles <[email protected]>
9070    
9071     * setup.py: Added custom script bdist_rpm_build_script so that
9072     when the rpm is built the path to wx-config is correct.
9073    
9074     * setup.cfg: Added line saying to use the custom build script
9075    
9076 jonathan 552 2003-03-20 Jonathan Coles <[email protected]>
9077    
9078     Initial implementation of the Legend.
9079    
9080     * Thuban/UI/legend.py: New. Creates a window that shows the map's
9081     Legend information and allows the user to add/modify classifications
9082     and how the layers are drawn on the map.
9083    
9084     * setup.py: New command 'build_docs' which currently uses
9085     happydoc to generate html documentation for Thuban.
9086    
9087     * Thuban/Model/classification.py (ClassGroup.GetDisplayText): New.
9088     Returns a string which is appropriately describes the group.
9089    
9090     * Thuban/Model/layer.py (Layer.SetClassification): Generate a
9091     LAYER_CHANGED event instead of a LAYER_LEGEND_CHANGED event.
9092    
9093     * Thuban/Model/map.py (Map): Rename messages and use new, more
9094     specific, messages.
9095    
9096     * Thuban/Model/messages.py: New message to indicate that a layer's
9097     data has changed (LAYER_CHANGED). New map messages to indicate
9098     when layers have been added/removed/changed or if the stacking order
9099     of the layers has changed.
9100    
9101     * Thuban/Model/session.py: Rename and use new messages.
9102    
9103     * Thuban/UI/classifier.py: Remember if any changes have actually
9104     been applied so that if the dialog is cancelled without an application
9105     of changes we don't have to set a new classification.
9106     (ClassDataPreviewer): Pulled out the window specific code and put it
9107     ClassDataPreviewWindow. ClassDataPreviewer can then be used to draw
9108     symbols on any DC.
9109    
9110     * Thuban/UI/mainwindow.py: New code to open the legend.
9111    
9112     * Thuban/UI/view.py: Use new message names.
9113    
9114 jonathan 541 2003-03-19 Jonathan Coles <[email protected]>
9115    
9116     * Thuban/UI/main.py (verify_versions): New. Checks the versions
9117     of Python, wxPython, and some other libraries.
9118    
9119     * extensions/thuban/wxproj.cpp (check_version): Checks the given
9120     version against what wxproj was compiled with.
9121     (check_version_gtk): If wxproj was compiled with gtk then check
9122     the given version against the version of the gtk library
9123     currently being used.
9124    
9125 bh 538 2003-03-14 Bernhard Herzog <[email protected]>
9126    
9127     * test/test_command.py: Run the tests when the module is run as a
9128     script
9129    
9130     2003-03-14 Bernhard Herzog <[email protected]>
9131    
9132     Implement selection of multiple selected shapes in the same layer:
9133    
9134     - Introduce a new class to hold the selection. This basically
9135     replaces the interactor which was nothing more than the
9136     selection anyway. A major difference is of course that the new
9137     selection class supports multiple selected shapes in one layer
9138    
9139     - Move the object that represents the selection from the
9140     application to the canvas. The canvas is a better place than the
9141     application because the selection represents which shapes and
9142     layer of the map displayed by the canvas are selected and
9143     affects how the map is drawn.
9144    
9145     - Make the selection and its messages publicly available through
9146     the mainwindow.
9147    
9148     - The non-modal dialogs do not get a reference to the interactor
9149     anymore as they can simply refer to their parent, the
9150     mainwindow, for the what the interactor had to offer.
9151    
9152     * Thuban/UI/selection.py: New module with a class to represent the
9153     selection.
9154    
9155     * Thuban/UI/messages.py (SELECTED_TABLE, SELECTED_MAP): Remove
9156     these unused messages
9157    
9158     * Thuban/UI/application.py (ThubanApplication.OnInit)
9159     (ThubanApplication.OnExit, ThubanApplication.SetSession): The
9160     interactor is gone now.
9161     (ThubanApplication.CreateMainWindow): There is no interactor
9162     anymore so we pass None as the interactor argument for now for
9163     compatibility.
9164    
9165     * Thuban/UI/view.py (MapCanvas.delegated_messages)
9166     (MapCanvas.Subscribe, MapCanvas.Unsubscribe): In Subscribe and
9167     Unsubscribe, delegate messages according to the delegated_messages
9168     class variable.
9169     (MapCanvas.__getattr__, MapCanvas.delegated_methods): Get some
9170     attributes from instance variables as described with the
9171     delegated_methods class variable.
9172     (MapCanvas.__init__): New instance variable selection holding the
9173     current selection
9174     (MapCanvas.do_redraw): Deal with multiple selected shapes. Simply
9175     pass them on to the renderer
9176     (MapCanvas.SetMap): Clear the selection when a different map is
9177     selected.
9178     (MapCanvas.shape_selected): Simple force a complete redraw. The
9179     selection class now takes care of only issueing SHAPES_SELECTED
9180     messages when the set of selected shapes actually does change.
9181     (MapCanvas.SelectShapeAt): The selection is now managed in
9182     self.selection
9183    
9184     * Thuban/UI/mainwindow.py (MainWindow.delegated_messages)
9185     (MainWindow.Subscribe, MainWindow.Unsubscribe): In Subscribe and
9186     Unsubscribe, delegate messages according to the delegated_messages
9187     class variable.
9188     (MainWindow.delegated_methods, MainWindow.__getattr__): Get some
9189     attributes from instance variables as described with the
9190     delegated_methods class variable.
9191     (MainWindow.__init__): The interactor as ivar is gone. The
9192     parameter is still there for compatibility. The selection messages
9193     now come from the canvas.
9194     (MainWindow.current_layer, MainWindow.has_selected_layer):
9195     Delegate to the the canvas.
9196     (MainWindow.LayerShowTable, MainWindow.Classify)
9197     (MainWindow.identify_view_on_demand): The dialogs don't need the
9198     interactor parameter anymore.
9199    
9200     * Thuban/UI/tableview.py (TableFrame.__init__)
9201     (LayerTableFrame.__init__, LayerTableFrame.OnClose)
9202     (LayerTableFrame.row_selected): The interactor is gone. It's job
9203     from the dialog's point of view is now done by the mainwindow,
9204     i.e. the parent. Subscribe to SHAPES_SELECTED instead
9205     of SELECTED_SHAPE
9206    
9207     * Thuban/UI/dialogs.py (NonModalDialog.__init__): The interactor
9208     is gone. It's job from the dialog's point of view is now done by
9209     the mainwindow, i.e. the parent.
9210    
9211     * Thuban/UI/classifier.py (Classifier.__init__): The interactor is
9212     gone. It's job from the dialog's point of view is now done by the
9213     mainwindow, i.e. the parent.
9214    
9215     * Thuban/UI/tree.py (SessionTreeView.__init__): The interactor is
9216     gone. It's job from the dialog's point of view is now done by the
9217     mainwindow, i.e. the parent.
9218     (SessionTreeCtrl.__init__): New parameter mainwindow which is
9219     stored as self.mainwindow. The mainwindow is need so that the tree
9220     can still subscribe to the selection messages.
9221     (SessionTreeCtrl.__init__, SessionTreeCtrl.unsubscribe_all)
9222     (SessionTreeCtrl.update_tree, SessionTreeCtrl.OnSelChanged): The
9223     selection is now accessible through the mainwindow. Subscribe to
9224     SHAPES_SELECTED instead of SELECTED_SHAPE
9225    
9226     * Thuban/UI/identifyview.py (IdentifyView.__init__): Use the
9227     SHAPES_SELECTED message now.
9228     (IdentifyView.selected_shape): Now subscribed to SHAPES_SELECTED,
9229     so deal with multiple shapes
9230     (IdentifyView.__init__, IdentifyView.OnClose): The interactor is
9231     gone. It's job from the dialog's point of view is now done by the
9232     mainwindow, i.e. the parent.
9233    
9234     * Thuban/UI/controls.py (RecordListCtrl.fill_list): The second
9235     parameter is now a list of shape ids.
9236     (RecordTable.SetTable): The second parameter is now a list of
9237     indices.
9238    
9239     * Thuban/UI/renderer.py (ScreenRenderer.RenderMap): Rename the
9240     selected_shape parameter and ivar to selected_shapes. It's now a
9241     list of shape ids.
9242     (MapRenderer.draw_label_layer): Deal with multiple selected
9243     shapes. Rearrange the code a bit so that the setup and shape type
9244     distinctions are only executed once.
9245    
9246     * test/test_selection.py: Test cases for the selection class
9247    
9248 jonathan 527 2003-03-11 Jonathan Coles <[email protected]>
9249    
9250     * Thuban/Model/load.py: Temporary fix so that the xml reader
9251     doesn't cause Thuban to crash.
9252    
9253     * Thuban/Model/layer.py: Handle the cyclic references between
9254     a layer and its classification better, and be sure to disconnect
9255     the classification from the layer when the layer is destroyed
9256     so that we don't maintain a cyclic reference that may not be
9257     garbage collected.
9258    
9259     * Thuban/Model/classification.py: See comment for layer.py.
9260    
9261 jan 523 2003-03-12 Jan-Oliver Wagner <[email protected]>
9262    
9263     * HOWTO-Release: New. Information on the steps for releasing
9264     a new version of Thuban.
9265    
9266 jonathan 514 2003-03-11 Jonathan Coles <[email protected]>
9267    
9268     * Thuban/UI/classifier.py: Add normal border to SelectPropertiesDialog.
9269     Use True instead of true.
9270     (Classifier): Should have a single panel in which all the controls lie.
9271    
9272     * Thuban/UI/proj4dialog.py: Add normal border.
9273    
9274     * Thuban/UI/tree.py: Fixed problem with bad item images under Windows.
9275    
9276     * Thuban/UI/mainwindow.py: Use True instead of true.
9277    
9278     * setup.py: Update some definitions to use wxWindows2.4 files
9279    
9280     * Data/iceland_sample_class.thuban: Fixed file so that the
9281     field_type information is present.
9282    
9283 jonathan 490 2003-03-10 Jonathan Coles <[email protected]>
9284    
9285 jonathan 505 * Thuban/UI/classifier.py (Classifier.__init__): Make the
9286     field type label grow so that when the text changes the
9287     size is updated correctly. This may be a wxWindows bug.
9288    
9289     2003-03-10 Jonathan Coles <[email protected]>
9290    
9291 jonathan 499 * Thuban/UI/application.py: Changed SESSION_CHANGED to
9292     SESSION_REPLACED.
9293    
9294     * Thuban/UI/classifier.py: Wrap text with _().
9295     (ClassGrid.CreateTable): Set dimensions and size hints here,
9296     instead of in Reset, so we only set the size once.
9297    
9298     * Thuban/UI/dialogs.py: Don't need Shutdown(); just use Close()!
9299    
9300     * Thuban/UI/mainwindow.py (MainWindow.prepare_new_session):
9301     Call Close() instead of Shutdown().
9302    
9303     * Thuban/UI/messages.py: Changed SESSION_CHANGED to SESSION_REPLACED.
9304    
9305     * Thuban/UI/tree.py: Changed SESSION_CHANGED to SESSION_REPLACED.
9306     Go back to using OnClose() instead of Shutdown().
9307    
9308     2003-03-10 Jonathan Coles <[email protected]>
9309    
9310 jonathan 497 * Thuban/UI/classifier.py (Classifier): SelectField() needed
9311     to know the old field index as well as the new one.
9312    
9313     2003-03-10 Jonathan Coles <[email protected]>
9314    
9315 jonathan 495 * Thuban/UI/classifier.py (Classifier): Use __SelectField()
9316     to correctly set the table information and call this from
9317     __init__ and from _OnFieldSelect so that all the information
9318     is up to date when the dialog opens and when a field is changed.
9319    
9320     2003-03-10 Jonathan Coles <[email protected]>
9321    
9322 jonathan 490 * Thuban/Model/classification.py (Classification): Don't use
9323     layer's message function directly, use the ClassChanged() method
9324     when then classification changes. SetField/SetFieldType/SetLayer
9325     must keep the information about field name and field type in
9326     sync when an owning layer is set or removed.
9327    
9328     * Thuban/Model/layer.py: Added ClassChanged() so that the
9329     classification can tell the layer when its data has changed.
9330     (Layer.SetClassification): Accepts None as an arguement to
9331     remove the current classification and correctly handles
9332     adding a new classification.
9333    
9334     * Thuban/Model/load.py: Comment out print statement
9335    
9336     * test/test_classification.py, test/test_save.py: New and
9337     improved tests.
9338    
9339 jonathan 483 2003-03-07 Jonathan Coles <[email protected]>
9340    
9341     * Thuban/Model/classification.py: Implemented __copy__ and
9342     __deepcopy__ for ClassGroup* and ClassGroupProperites so
9343     they can easily be copied by the classifier dialog.
9344     (ClassGroupProperites.__init__): The default line color should
9345     have been Color.Black.
9346    
9347     * Thuban/UI/classifier.py: Setting and Getting table values now
9348     uses a consistent set of functions.
9349     (Classifier): Now non-modal. Has field type label which changes
9350     as the field changes. Keep track of buttons in a list so that
9351     we can enable/disable the buttons when the None field is selected.
9352     (SelectPropertiesDialog): Add buttons to make the colors transparent.
9353    
9354     * Thuban/UI/dialogs.py (NonModalDialog.Shutdown): New method which
9355     does what OnClose did, but can be called by the application to
9356     close a window. Needed when a session changes, and we have to
9357     close the classifier windows.
9358    
9359     * Thuban/UI/mainwindow.py (MainWindow.prepare_new_session):
9360     Shuts down open dialogs. Used when a new session is created
9361     or a session is opened.
9362     (MainWindow.SaveSession): Should only call application.SaveSession()
9363     if we don't call SaveSessionAs first.
9364     (MainWindow.Classify): Allow different classifier dialogs for
9365     different layers.
9366    
9367     * Thuban/UI/tree.py (SessionTreeView): Remove OnClose and let
9368     the parent class handle it. Add Shutdown() to unsubscibe from
9369     event notification and call the parent Shutdown(). This was
9370     necessary so the application can close the tree window.
9371    
9372 jonathan 478 2003-03-06 Jonathan Coles <[email protected]>
9373    
9374     * Thuban/Model/classification.py: Minor documentation changes,
9375     Addition of __eq__ and __ne__ methods.
9376     (Classification.SetLayer): prevent recursion between this method
9377     and Layer.SetClassification().
9378    
9379     * Thuban/Model/color.py: Addition of __eq__ and __ne__ methods.
9380    
9381     * Thuban/Model/layer.py (SetClassification): prevent recursion
9382     between this method and Classification.SetLayer().
9383    
9384     * test/test_classification.py, test/test_load.py,
9385     test/test_session.py: Fixed and added tests for the classification
9386     classes.
9387    
9388 bh 477 2003-03-06 Bernhard Herzog <[email protected]>
9389    
9390     * Thuban/UI/classifier.py (ClassGrid.__init__)
9391     (ClassGrid.CreateTable): Move the SetSelectionMode call to
9392     CreateTable because otherwise it triggers an assertion in
9393     wxPython/wxGTK 2.4.
9394    
9395 jonathan 459 2003-03-05 Jonathan Coles <[email protected]>
9396    
9397 jonathan 475 * Thuban/common.py: Move FIELDTYPE constants back to table.py.
9398 jonathan 471
9399 jonathan 475 * Thuban/Model/load.py: import FIELDTYPE constants from table.
9400 jonathan 471
9401 jonathan 475 * Thuban/UI/classifier.py: import FIELDTYPE constants from table.
9402 jonathan 471
9403 jonathan 475 * Thuban/Model/table.py: Put FIELDTYPE constants back.
9404 jonathan 471
9405     2003-03-05 Jonathan Coles <[email protected]>
9406    
9407 jonathan 459 * Thuban/UI/classifier.py: Added class documentation.
9408     Fixed RTbug #1713, #1714. Added Move[Up|Down] buttons.
9409     Store just the groups in the table and generate the other
9410     column information when it is requested. Add "None" field
9411     to pull-down to select no classification.
9412    
9413     * Thuban/common.py: Moved FIELDTYPE constants from table.py
9414     (Str2Num): Only catch ValueError exceptions.
9415    
9416     * Thuban/Model/classification.py: Class documentation. Renaming
9417     of methods with Stroke to Line. Groups are stored in a single
9418     list with the default as the first element. Groups are searched
9419     in the order they appear in the list.
9420    
9421     * Thuban/Model/color.py: Documentation.
9422    
9423     * Thuban/Model/layer.py (Layer): Add GetFieldType to retreive
9424     the kind of data represented by a field.
9425    
9426     * Thuban/Model/load.py (ProcessSession): Use proper string
9427     conversion function; fixes RTbug #1713.
9428    
9429     * Thuban/Model/save.py (Saver): Store field type information.
9430    
9431     * Thuban/Model/table.py: Put FIELDTYPE constants in common.py.
9432     (Table): Add field_info_by_name() to retrieve field information
9433     by specifying the field name, not the number.
9434    
9435     * Thuban/UI/mainwindow.py: Function name changes.
9436    
9437     * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Only
9438     get the layer classification once. Don't try to classify
9439     values when the field is None: just use the default properties.
9440    
9441     * Thuban/UI/view.py: Function name changes.
9442    
9443     * Doc/thuban.dtd: Add field_type attribute to a classification.
9444    
9445 bh 456 2003-03-04 Bernhard Herzog <[email protected]>
9446    
9447 bh 458 * Doc/thuban.dtd: Use correct syntax for optional attributes. Make
9448     the fill and stroke layer attributes optional with suitable
9449     default values. Add the stroke_width layer attribute. Use correct
9450     syntax for empty elements. Make the attribute list for labels
9451     refer to the label element.
9452    
9453     2003-03-04 Bernhard Herzog <[email protected]>
9454    
9455 bh 456 * setup.py (thuban_build_py.build): Add a comment about distutils in
9456     Python 2.3 containing some of the functionality we implement in
9457     setup.py ourselves.
9458    
9459     * Thuban/UI/classifier.py (ClassGrid.__init__): Set the table
9460     before the selection mode. Doing it the other way round triggers
9461     an assertion in wxWindows.
9462    
9463     * Thuban/Model/save.py (escape): Fix typo in doc-string
9464    
9465     * Thuban/Model/classification.py: Remove unnecessary wxPython
9466     import
9467    
9468 jonathan 448 2003-03-04 Jonathan Coles <[email protected]>
9469    
9470     * Thuban/Model/classification.py (ClassGroupRange.GetProperties):
9471     Parameter 'value' should default to None.
9472    
9473     * Thuban/UI/mainwindow.py: Use Layer.GetClassification() since
9474     the class attribute __classification is now private.
9475    
9476     * Thuban/UI/classifier.py (ClassGrid): Moved OnCellDClick() from
9477     Classifier to ClassGrid. Added support for removing selected rows,
9478     which including code for keeping track of when cells are selected,
9479     and deselected.
9480     (ClassTable): Support for added/removing rows. Fixed a problem
9481     with __ParseInput whereby it would not allow strings (only numbers)
9482     to be entered.
9483     (Classifier): Added button and supporting code for removing
9484     selected rows.
9485    
9486 jonathan 445 2003-02-27 Jonathan Coles <[email protected]>
9487 jonathan 434
9488     * Thuban/common.py: Moved color conversion functions into
9489     Thuban/UI/common.py.
9490     (Str2Num): Now converts the float (not the string) to a long/int
9491     so that an exception isn't thrown.
9492    
9493     * Thuban/UI/common.py: Common functions used in several UI modules
9494    
9495     * Thuban/Model/classification.py: Changed the class hierarchy
9496     so that a Classification consists of Groups which return
9497     Properties when a value matches a Group.
9498    
9499     * Thuban/Model/layer.py: Fixed name resolution problem.
9500    
9501     * Thuban/Model/load.py: Use new Classification and Group functions.
9502    
9503     * Thuban/Model/save.py (Saver.write_attribs): Fixes a test case
9504     failure.
9505     (Saver.write_classification): Use new Classification and Group
9506     functions.
9507    
9508     * Thuban/UI/classifier.py: Changes to use new Classification and Group
9509 jonathan 445 functions. Fix to create a tuple with a single value instead of
9510     simply returning the value.
9511 jonathan 434
9512     * Thuban/UI/renderer.py: Use new Classification and Group functions.
9513     Use common.py functions.
9514    
9515 jonathan 445 * Thuban/UI/tree.py: Use common.py functions.
9516 jonathan 447
9517     * test/test_classification.py: Use new Classification and Group
9518     classes.
9519 jonathan 434
9520 jonathan 426 2003-02-24 Jonathan Coles <[email protected]>
9521    
9522     * Thuban/common.py (Color2wxColour, wxColour2Color): Conversion
9523     functions from Thuban color objects to wxWindow colour objects.
9524    
9525     * Thuban/Model/classification.py (Classification): Renamed
9526     GetProperties() to GetClassData(). Used the new iterator
9527     in TreeInfo().
9528     (ClassIterator): Iterator implementation to iterate over the
9529     ClassData objects in a classification object.
9530    
9531     * Thuban/Model/save.py (Saver.write_classificaton): Uses
9532     the new iterator to save the classification information.
9533    
9534     * Thuban/UI/classifier.py (SelectPropertiesDialog): Support
9535     for changing the stroke and fill colors and previewing the
9536     changes.
9537    
9538     * Thuban/UI/mainwindow.py (MainWindow.OpenSession,
9539     MainWindow.SaveSessionAs): Text string changes so the dialogs
9540     have more meaningful titles.
9541    
9542     * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Change
9543     Classification method name from GetProperties to GetClassData.
9544    
9545     * Thuban/UI/view.py (MapCanvas.find_shape_at): Use method calls
9546     instead of accessing now non-existent class variables.
9547    
9548 bh 425 2003-02-24 Bernhard Herzog <[email protected]>
9549    
9550     * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Remove
9551     unneeded Shape() call. Rendering is substantially faster without
9552     it and it avoids some problems with broken shape files.
9553    
9554 frank 423 2003-02-20 Frank Koormann <[email protected]>
9555    
9556     Force minimal size of identify and label dialogs. The autosizing
9557     looked too ugly.
9558    
9559     * Thuban/UI/controls.py (RecordListCtrl): Set minimal width for columns.
9560     * Thuban/UI/labeldialog.py (LabelDialog.dialog_layout):
9561     Set size of listctrl.
9562     * Thuban/UI/identifyview.py (IdentifyView.__init__):
9563     Set size of dialog.
9564    
9565 jonathan 408 2003-02-19 Jonathan Coles <[email protected]>
9566    
9567     * test/test_classification.py, test/test_layer.py,
9568     test/test_load.py, test/test_map.py, test/test_session.py:
9569     Updated the tests to use the new functions that are in the
9570     respective classes.
9571    
9572     * Thuban/Model/classification.py (Classification):
9573     Uses the new ClassData* classes. Modification messages are
9574     passed up to the parent layer (if it exists).
9575     (ClassData): New class to encapsulate the common data in each
9576     classification property.
9577     (ClassDataDefault): Represents the Default class. data.
9578     (ClassDataPoint): Represents a single class. data point
9579     (ClassDataRange): Represents a class. range
9580     (ClassDataMap): Represents a class. map (unused).
9581    
9582     * Thuban/Model/color.py: Added Color.None to represent something
9583     with no color. Color.Black represents the color black.
9584     (NoColor): Helper class derived from Color to represent something
9585     with no color.
9586    
9587     * Thuban/Model/layer.py (Layer): Removed references to fill, stroke,
9588     stroke_width attributes. Made the 'classification' attribute private.
9589     New methods for setting/getting the classification.
9590    
9591     * Thuban/Model/load.py (ProcessSession): Use new methods on Layer
9592     to get the classifcation and use the new ClassData* classes to
9593     hold the classification data. Use Str2Num to convert numbers
9594     properly.
9595    
9596     * Thuban/Model/save.py (Saver): Use new Color and Classification
9597     methods
9598    
9599     * Thuban/UI/classifier.py (ClassGrid): New class to represent a
9600     custom grid.
9601     (ClassTable): Support for editing Values and Labels and for
9602     changing what type (point or range) of data is stored in each
9603     property based on how the user enters the data.
9604     (Classifier): Support for saving the new classifications and
9605     launching the dialog to edit a property.
9606     (SelectPropertiesDialog): New class for editing the visual
9607     properties of a classification (stroke color, width, and fill color)
9608     (ClassPreviewer): Took the Draw method from ClassRenderer and
9609     made most of it into this new class. Intend to use this class in
9610     the SelectPropertiesDialog for previewing changes.
9611    
9612     * Thuban/UI/renderer.py: Use new Color and Classification methods.
9613    
9614     * Thuban/UI/tree.py: Formatting changes.
9615    
9616     * Doc/thuban.dtd: Add 'label' element
9617    
9618     * Thuban/common.py: New. Contains common routines used throughout
9619     the code.
9620     (Str2Num): Takes a string and converts it to the "best" type of
9621     number.
9622    
9623 bh 405 2003-02-14 Bernhard Herzog <[email protected]>
9624    
9625     * Thuban/UI/view.py (MapCanvas.OnLeftUp): Make sure that the
9626     dragging flag is always set to 0 even when the tool implementation
9627     raises an exception
9628    
9629 bh 402 2003-02-11 Bernhard Herzog <[email protected]>
9630    
9631     * Thuban/UI/application.py (ThubanApplication.splash_screen): New
9632     method to create a splash screen.
9633     (ThubanApplication.ShowMainWindow): New. Show the main window.
9634     Needed so the splash screen can display the mainwindow
9635     (ThubanApplication.OnInit): Call the
9636     new splash_screen method to determine whether the application
9637     should display a splash screen. If it displays a splash screen do
9638     not immediately show the main window.
9639    
9640 jonathan 399 2003-02-11 Jonathan Coles <[email protected]>
9641    
9642     * Thuban/Model/classification.py: Added import line to fix
9643     feature conflicts between running on python2.2 and python2.1.
9644    
9645     * Thuban/UI/classifier.py (ClassTable): Didn't need to hang
9646     onto the clinfo parameter, so removed the deepcopy().
9647    
9648 jonathan 396 2003-02-10 Jonathan Coles <[email protected]>
9649    
9650 tkoester 403 * Thuban/Model/save.py (Saver.open_element, Saver.close_element):
9651 jonathan 396 Added element_open variable to track opening and closing of tags
9652     so that tags that don't span more than one line are closed with
9653     /> instead of </tag_name>. Use the GetDefault*() methods of
9654     the Classification class.
9655    
9656     * Thuban/Model/classification.py (Classificaton): Added set and
9657     get methods for the default data. The class also takes a layer
9658     reference so that modification messages can be sent. Fixed the
9659     methods to use the new ClassData class.
9660     (ClassData): New class to encapsulate the classification data
9661    
9662     * Thuban/Model/layer.py (Layer): Remove the
9663 tkoester 403 Set[Fill|Stroke|StrokeWidth]() methods. Code should call the
9664 jonathan 396 SetDefault*() methods on the layer's classification object.
9665 tkoester 403 (Layer.__init__): Use the new SetDefault*() methods in the
9666 jonathan 396 Classification class.
9667    
9668     * Thuban/Model/load.py (ProcessSession): Use the new ClassData
9669     object instead of a dictionary.
9670    
9671 tkoester 403 * Thuban/UI/classifier.py (ClassRenderer): New class to
9672 jonathan 396 draw the classifications in the dialog box's table.
9673     (Classifier): Modified to use the ClassRenderer class.
9674    
9675 tkoester 403 * Thuban/UI/mainwindow.py (MainWindow): Use the SetDefault*()
9676     methods of the Classification class.
9677 jonathan 396
9678     * Thuban/UI/renderer.py (MapRenderer): Use the Get*() methods
9679     of the ClassData class.
9680    
9681     * test/test_classification.py, test/test_layer.py,
9682     test/test_map.py, test/test_session.py: Fix the tests to work
9683     with the above code changes.
9684    
9685 jonathan 387 2003-02-03 Jonathan Coles <[email protected]>
9686    
9687     * Thuban/Model/classification.py (Classification): Added getNull()
9688     to return the NullData reference
9689    
9690     * Thuban/Model/layer.py (Layer.SetFill, Layer.SetStroke,
9691     Layer.SetStrokeWidth): Modified these functions to change the
9692     null data in the classification rather than keep these values
9693     directly in the Layer class. Menu options to change these values
9694     work again.
9695    
9696 jonathan 380 2003-01-28 Jonathan Coles <[email protected]>
9697    
9698 jonathan 384 * Thuban/UI/classifier.py (Classifier): Resolved merging conflicts.
9699 tkoester 403 Fixed crashing problem on some systems. Dialog box shows
9700 jonathan 380 classification data.
9701    
9702 jonathan 384 * Thuban/UI/tree.py (SessionTreeCtrl.add_items): Handle drawing
9703     Colors in the tree view.
9704    
9705     * Thuban/Model/layer.py (Layer.TreeInfo): Added a call to build
9706     the tree info for classifications. Commented out unnecessary lines.
9707    
9708     * Thuban/Model/classification.py (Classification.TreeInfo): New
9709     function to add information about the classification into the
9710     tree view.
9711    
9712 tkoester 403 2003-01-27 Jan-Oliver Wagner <[email protected]>
9713 jan 375
9714 tkoester 403 * Thuban/__init__.py (_): New.
9715 jan 375
9716     * Thuban/Model/classification.py, Thuban/Model/extension.py,
9717     Thuban/Model/layer.py, Thuban/Model/load.py, Thuban/Model/map.py,
9718 tkoester 403 Thuban/Model/session.py, Thuban/UI/application.py,
9719     Thuban/UI/classifier.py, Thuban/UI/context.py, Thuban/UI/controls.py,
9720     Thuban/UI/identifyview.py, Thuban/UI/labeldialog.py,
9721     Thuban/UI/mainwindow.py, Thuban/UI/menu.py, Thuban/UI/proj4dialog.py,
9722     Thuban/UI/renderer.py, Thuban/UI/tree.py, Thuban/Lib/connector.py,
9723     Thuban/Lib/fileutil.py: Replace user string by _() for i18n.
9724 jan 375
9725 jonathan 370 2003-01-27 Jonathan Coles <[email protected]>
9726    
9727 tkoester 403 * Thuban/Model/layer.py: Classification initialization calls.
9728 jonathan 370
9729 tkoester 403 * Thuban/Model/classification.py: Created class to encapsulate
9730     a layer classification. Supports specific data points and
9731     ranges.
9732 jonathan 370
9733 tkoester 403 * Thuban/Model/load.py: Added support for loading classification
9734     information.
9735 jonathan 370
9736 tkoester 403 * Thuban/Model/save.py: Added support for saving classification
9737     information.
9738 jonathan 370
9739 tkoester 403 * Thuban/UI/classifier.py: Initial class for a dialog box for
9740     specifying classification information.
9741 jonathan 370
9742 tkoester 403 * Thuban/UI/mainwindows.py: Support for opening the classifier
9743     dialog.
9744 jonathan 370
9745 tkoester 403 * Thuban/UI/renderer.py: Support for drawing a layer with the
9746     classification information.
9747 jonathan 370
9748 tkoester 403 * Data/iceland_sample_class.thuban: iceland_sample with
9749     classification data.
9750 jonathan 370
9751 tkoester 403 * test/test_classification: Tests for the Classification class.
9752 jonathan 370
9753 bh 359 2002-12-09 Bernhard Herzog <[email protected]>
9754    
9755 bh 361 * test/test_command.py: New. Tests for the command classes.
9756    
9757 bh 359 * Thuban/UI/command.py (ToolCommand): New class for tool commands.
9758     (Command.IsTool): New method to distinguish between command
9759     switching tools and other commands.
9760    
9761     * Thuban/UI/view.py (MapCanvas.SelectTool): New method to select
9762     the tool to avoid direct assignments to instance variables
9763     (MapCanvas.ZoomInTool, MapCanvas.ZoomOutTool, MapCanvas.PanTool)
9764     (MapCanvas.IdentifyTool, MapCanvas.LabelTool): Use SelectTool to
9765     change the tool
9766    
9767     * Thuban/UI/mainwindow.py (MainWindow.update_command_ui): If an
9768     active tool's command turns insensitive, disable the tool.
9769     (_tool_command): Use the new ToolCommand class
9770    
9771     * Examples/simple_extensions/simple_tool.py (simple_tool): Use the
9772     SelectTool method to change the tool
9773     (iconfile): Use the ToolCommand class
9774    
9775 bh 354 2002-12-03 Bernhard Herzog <[email protected]>
9776    
9777     * Thuban/UI/tree.py (SessionTreeCtrl.normalize_selection): Handle
9778     the case of selected items that are not children of Layers or Maps
9779     properly. Previously this bug would trigger an assertion in
9780     wxWindows.
9781    
9782 frank 352 2002-11-06 Frank Koormann <[email protected]>
9783    
9784 bh 354 * Thuban/UI/mainwindow.py: Altered the order of tools in the
9785     toolbar: First now are all navigation tools (Zoom In/Out, Pan,
9786     Full Extent).
9787 tkoester 403
9788 bh 349 2002-10-23 Bernhard Herzog <[email protected]>
9789    
9790     * setup.py (setup call): version now 0.1.3
9791    
9792     * MANIFEST.in: Add the files in test/
9793    
9794     * test/README: Add note about tests requiring the iceland data
9795    
9796     * Thuban/UI/mainwindow.py (MainWindow.About): Add 2002 to
9797     copyright notice.
9798    
9799 bh 344 2002-10-18 Bernhard Herzog <[email protected]>
9800    
9801     * test/test_map.py
9802     (TestMapWithContents.test_projected_bounding_box): Use an explicit
9803     epsilon.
9804    
9805     * test/support.py (FloatComparisonMixin.assertFloatEqual)
9806     (FloatComparisonMixin.assertFloatSeqEqual): give a more useful
9807     message if the assertion fails and don't return the return value
9808     of self.assert_. In assertFloatSeqEqual the return meant that not
9809     all items of the sequence were compared.
9810    
9811 bh 326 2002-09-20 Bernhard Herzog <[email protected]>
9812    
9813 bh 341 * test/test_fileutil.py: New. Test cases for Thuban.Lib.fileutil
9814    
9815     * Thuban/Lib/fileutil.py: Fixup some whitespace and typos
9816    
9817 bh 338 * test/test_map.py (TestMapWithContents.test_tree_info): Create
9818     the string with the bounding box on the fly because of platform
9819     differences in the way %g is handled.
9820    
9821     * test/test_layer.py (TestLayer.test_empty_layer): Create an empty
9822     DBFfile too because Thuban layers can't yet cope missing DBF
9823     files.
9824    
9825     2002-09-20 Bernhard Herzog <[email protected]>
9826    
9827 bh 326 * test/test_menu.py: Use initthuban instead of
9828     add_thuban_dir_to_path to initialize Thuban.
9829    
9830     * test/support.py (FloatComparisonMixin.assertFloatEqual): New.
9831     Mixin class for float comparisons
9832     (SubscriberMixin): New. Mixin class to test messages sent through
9833     the Connector class
9834    
9835     * test/README: Fix a typo and add the -v flag to the command for
9836     individual tests
9837    
9838 bh 335 * test/test_session.py: New. Test cases for Thuban.Model.session
9839    
9840     * test/test_proj.py: New. Test cases for Thuban.Model.proj
9841    
9842     * test/test_map.py: New. Test cases for Thuban.Model.map
9843    
9844     * test/test_layer.py: New. Test cases for Thuban.Model.layer
9845    
9846     * test/test_label.py: New. Test cases for Thuban.Model.label
9847    
9848     * test/test_connector.py: New. Test cases for Thuban.Lib.connector
9849    
9850     * test/test_color.py: New. Test cases for Thuban.Model.color
9851    
9852     * test/test_base.py: New. Test cases for Thuban.Model.base
9853    
9854 bh 322 2002-09-13 Bernhard Herzog <[email protected]>
9855    
9856     * Thuban/Model/session.py (Session.forwarded_channels): Forward
9857     the CHANGED channel too.
9858    
9859     * Thuban/Model/map.py (Map.forwarded_channels): Forward the
9860     CHANGED channel too.
9861     (Map.__init__): Call the Modifiable constructor as well.
9862    
9863     * Thuban/Model/base.py (Modifiable.UnsetModified): Issue a CHANGED
9864     event if the modified flag changes.
9865     (Modifiable.changed): Tweak the doc-string.
9866    
9867     * Thuban/UI/mainwindow.py (MainWindow.view_position_changed)
9868     (MainWindow.set_position_text): Put the code that puts the text
9869     with the mouse position into the status bar into the new method
9870     set_position_text so that it can overwritten in derived classes.
9871    
9872 bh 317 2002-09-12 Bernhard Herzog <[email protected]>
9873    
9874     * Thuban/UI/mainwindow.py (MainWindow.RunMessageBox): Center the
9875     message box on the main window.
9876    
9877 bh 313 2002-09-11 Bernhard Herzog <[email protected]>
9878    
9879     * Thuban/UI/mainwindow.py: Underline the 'x' in "Exit" instead of
9880     the 'E' because it's less likely to interfere with other menu
9881     entries.
9882 bh 315 (MainWindow.build_menu): remove an incorrect comment.
9883 bh 313
9884 bh 311 2002-09-10 Bernhard Herzog <[email protected]>
9885    
9886     * Thuban/UI/mainwindow.py (MainWindow.Map): New.
9887     (_tool_command): Add sensitive parameter
9888     (_has_visible_map): Sensitivity callback to tools and other
9889     commands that require a visible map. Use it in map_zoom_in_tool,
9890     map_zoom_out_tool, map_pan_tool, map_identify_tool, map_label_tool
9891     and map_full_extent
9892    
9893 bh 308 2002-09-06 Bernhard Herzog <[email protected]>
9894    
9895     * Thuban/UI/mainwindow.py (MainWindow.OnClose): Unsubscribe
9896     VIEW_POSITION
9897    
9898 tkoester 403 2002-09-04 Frank Koormann <[email protected]>
9899 frank 306
9900     * Resources/Bitmaps/fullextent.xpm: Updated Icon (removed "potatoe")
9901    
9902 bh 302 2002-09-02 Bernhard Herzog <[email protected]>
9903    
9904 bh 304 * Thuban/UI/view.py: Get rid of the idle redraw. This is done by
9905     wxWindows already and our implementation doesn't work correctly
9906     with wxGTK 2.3:
9907     (MapCanvas.__init__): Remove the instance variable
9908     (MapCanvas.OnPaint): Always call do_redraw when there's a map to
9909     be drawin
9910     (MapCanvas.OnIdle): Removed.
9911    
9912 bh 302 * Thuban/UI/view.py (MapCanvas.unprojected_rect_around_point): Add
9913     a parameter to determine the size of the rectangle.
9914     (MapCanvas.find_shape_at): Create the box around the point on a
9915     layer by layer basis and make the size depend on the shape type.
9916     This solves a problem with the selection of point shapes at the
9917     border of the layer's bounding box
9918    
9919 bh 292 2002-08-30 Bernhard Herzog <[email protected]>
9920    
9921 bh 300 * Thuban/UI/mainwindow.py (MainWindow.CanRemoveLayer): New method
9922     for the sensitivity of remove layer.
9923     (_can_remove_layer): New. Sensitivity callback for remove layer
9924     (Command layer_remove): Use _can_remove_layer
9925    
9926     * Thuban/Model/map.py (Map.CanRemoveLayer): New method to
9927     determine whether a given layer can be deleted.
9928    
9929 bh 297 * Thuban/UI/view.py (MapCanvas.__init__, MapCanvas.OnPaint)
9930     (MapCanvas.do_redraw): Get rid of the unused update_region
9931     instance variable
9932    
9933 bh 294 * Thuban/UI/view.py: Add/update some doc-strings.
9934    
9935 bh 292 * test/: new subdirectory with a bunch of unit tests.
9936    
9937     * test/README, test/test_table.py, test/test_save.py,
9938     test/test_menu.py, test/test_load.py: Initial set of tests and
9939     brief instructions on how to run them
9940    
9941 bh 287 2002-08-29 Bernhard Herzog <[email protected]>
9942    
9943 bh 291 * Thuban/UI/renderer.py (ScreenRenderer.draw_shape_layer): Handle
9944     arcs with multiple parts.
9945    
9946 bh 289 * Thuban/UI/view.py (ZoomInTool.MouseUp, ZoomOutTool.MouseUp):
9947     Handle degenrate rectangles.
9948    
9949 bh 287 * Thuban/Model/table.py: Make writing records work correctly:
9950     (Table.__init__): Keep track of whether the DBF is open for
9951     writing
9952     (Table.write_record): Open the DBF file for writing when necessary
9953    
9954 bh 285 2002-08-27 Bernhard Herzog <[email protected]>
9955    
9956     * Thuban/Model/table.py (Table.write_record, Table.__init__): Open
9957     dbf files only for reading by default. Use a new writable dbf
9958     object for writing.
9959    
9960 bh 278 2002-08-26 Bernhard Herzog <[email protected]>
9961    
9962 bh 282 * Thuban/UI/mainwindow.py: Refactor the context creation:
9963     (MainWindow.Context): New method to return a context
9964     (MainWindow.invoke_command, MainWindow.update_command_ui): Use the
9965     new method
9966    
9967 bh 278 * Thuban/UI/tableview.py (TableGrid, LayerTableGrid): Split the
9968     layer table specific code from TableGrid into LayerTableGrid
9969     (TableFrame, LayerTableFrame): Split the layer table specific code
9970     from TableFrame into LayerTableFrame
9971 bh 280 (LayerTableGrid.select_shape): Remove a debug print
9972 bh 278
9973     * Thuban/UI/mainwindow.py (MainWindow.LayerShowTable): Use the
9974     LayerTableFrame
9975    
9976 bh 277 2002-08-23 Bernhard Herzog <[email protected]>
9977    
9978     * Thuban/Model/layer.py (Layer.__init__): Make sure we have an
9979     absolute filename.
9980    
9981 bh 269 2002-08-22 Bernhard Herzog <[email protected]>
9982    
9983 bh 275 * Thuban/Model/table.py (Table.write_record): New method to write
9984     records.
9985 tkoester 403 (Table.__init__): Open the DBF file for writing too.
9986 bh 275
9987     * Thuban/UI/controls.py (RecordTable.SetValue): Write the value
9988     into the underlying table.
9989    
9990     * extensions/shapelib/shapefil.h (DBFCommit),
9991     extensions/shapelib/dbfopen.c (DBFCommit): New API function to
9992     commit any changes made to the DBF file.
9993    
9994 bh 271 * Thuban/UI/mainwindow.py (make_check_current_tool)
9995     (_tool_command): Put the code that generates the "checked"
9996     callback into a separate function so that we can reuse it
9997     elsewhere
9998    
9999 bh 269 * Thuban/Model/save.py (Saver): New class to handle serializing a
10000     session into an XML file. The main reason to introduce a class is
10001     that applications built on Thuban can derive from it so that they
10002     can save additional information in a session file.
10003     (save_session): Delegate almost all the work to the Saver class.
10004     Rename the filename argument to file because it may be a file like
10005     object now.
10006    
10007     * Thuban/Model/load.py: Get rid of the Python 1.5.2 compatibility
10008     code. Remove the little test code which would be executed when the
10009     module is run as a script which didn't work anymore since it can't
10010     import the other Thuban modules.
10011     (ProcessSession, load_session): Refactor the ProcessSession to
10012     have one method for each element start and end tag so that derived
10013     classes can easily override the processing of individual tags.
10014     Also, always parse with namespaces enabled because applications
10015     built on top of Thuban will likely use namespaces if they extend
10016     the session file format.
10017    
10018 bh 266 2002-08-21 Bernhard Herzog <[email protected]>
10019    
10020     * setup.py (ThubanInstall.run): Don't repr install_lib_orig
10021     because thubaninit_contents will do it for us.
10022    
10023 tkoester 403 2002-08-16 Jan-Oliver Wagner <[email protected]>
10024 jan 265
10025     * Thuban/UI/mainwindow.py: menu item 'show session tree' now disable if
10026     tree window already open
10027    
10028 bh 259 2002-08-15 Bernhard Herzog <[email protected]>
10029    
10030 bh 263 * Thuban/Model/layer.py (Layer.Destroy): Call the unboundd method
10031     with self.
10032    
10033     * Thuban/UI/view.py (MapCanvas.OnLeftUp): Only release the mouse
10034     when we have actually captured it.
10035    
10036 bh 259 * Thuban/Model/layer.py (Layer.Destroy): New. Explicitly close the
10037     shapefile and destroy the table.
10038    
10039     * Thuban/Model/table.py (Table.Destroy): New. Close the DBF file.
10040    
10041 bh 254 2002-08-14 Bernhard Herzog <[email protected]>
10042    
10043 bh 256 * Thuban/UI/controls.py (RecordTable.__init__): Remove the unused
10044     instance variable columns
10045     (RecordTable.GetTypeName): row and col may be negative in some
10046     cases.
10047    
10048 bh 254 * setup.py (InstallLocal.initialize_options)
10049     (InstallLocal.finalize_options, InstallLocal.user_options): New
10050     option create-init-file to build a thubaninit.py when running
10051     install_local
10052     (InstallLocal.run): Create the thubaninit.py module when requested
10053     (thubaninit_contents): Split the template into several parts and
10054     create a new function thubaninit_contents that creates the
10055     contents of a thubaninit module.
10056     (ThubanInstall.run): Use the new function to create the thubaninit
10057     module.
10058    
10059 bh 252 2002-07-30 Bernhard Herzog <[email protected]>
10060    
10061     * Thuban/UI/application.py (ThubanApplication.OnExit): Do some
10062     cleanup.
10063     (ThubanApplication.MainLoop): Extend to automatically call OnExit.
10064    
10065     * Thuban/Model/session.py (Session.Destroy): Don't bypass the
10066     direct base class' Destroy method.
10067    
10068     * Thuban/Model/map.py (Map.ClearLayers): New method to delete all
10069     layers.
10070     (Map.Destroy): Destroy the label_layer as well and call the
10071     inherited Desatroymethod first so that no more messages are
10072     issued.
10073     (Map.RaiseLayer, Map.LowerLayer): Only issue LAYERS_CHANGED
10074     message if the stacking order actually has changed. Add
10075     doc-strings.
10076     (Map.BoundingBox): Correct the doc-string.
10077     (Map.AddLayer, Map.RemoveLayer, Map.Layers, Map.HasLayers)
10078     (Map.ProjectedBoundingBox, Map.SetProjection): Add doc-strings.
10079    
10080     * Thuban/Model/label.py (LabelLayer.ClearLabels): New to delete
10081     all labels.
10082    
10083 bh 247 2002-07-29 Bernhard Herzog <[email protected]>
10084    
10085     * Thuban/Model/map.py (Map.subscribe_layer_channels)
10086     (Map.unsubscribe_layer_channels): Put the code that (un)subscribes
10087     to a layer's channels into separate methods.
10088     (Map.RemoveLayer, Map.AddLayer): Call the new methods
10089     (Map.Destroy): Unsubscribe from a layer's channels before
10090     destroying it.
10091    
10092     * Thuban/UI/view.py (MapCanvas.find_shape_at): Change the
10093     selected_layer parameter to searched_layer which is the layer to
10094     search in.
10095     (MapCanvas.SelectShapeAt): New parameter layer to restrict the
10096     search to that layer. Return the selected layer and shape.
10097    
10098     * Examples/simple_extensions/simple_tool.py (simple_tool): Fix a
10099     typo
10100    
10101 bh 238 2002-07-24 Bernhard Herzog <[email protected]>
10102    
10103 bh 243 * Thuban/UI/application.py (ThubanApplication.create_session):
10104     Extend the doc string.
10105     (ThubanApplication.subscribe_session)
10106     (ThubanApplication.unsubscribe_session): New methods to
10107     subscribe/unsubscribe to/from session channels.
10108     (ThubanApplication.SetSession): Call the new methods here.
10109     (ThubanApplication.maps_changed, ThubanApplication.set_map):
10110     Renamed set_map to maps_changed. Its now a subscriber for
10111     MAPS_CHANGED.
10112    
10113     * Thuban/UI/view.py (ZoomOutTool.MouseUp): Use the correct
10114     x-coordinate in case of simple clicks
10115    
10116     * Thuban/Model/base.py (Modifiable.changed): Apply the args tuple,
10117     don't pass it as a parameter
10118    
10119     * Thuban/Model/session.py (Session.RemoveMap): New
10120    
10121 bh 238 * Thuban/UI/mainwindow.py (MainWindow.__init__): Turn the initial
10122     window size into a parameter.
10123    
10124 bh 235 2002-07-23 Bernhard Herzog <[email protected]>
10125    
10126 bh 237 * Thuban/UI/menu.py (Menu.item_index): Also search for menus not
10127     just commands.
10128    
10129 bh 235 * Thuban/UI/mainwindow.py (MainWindow.__init__): Change the
10130     parameter list a bit to allow setting the window title and the
10131     initial message in the status bar. Update the callers.
10132    
10133     * Thuban/UI/application.py (ThubanApplication.OnInit)
10134     (ThubanApplication.CreateMainWindow): Put the mainwindow
10135     instantiation into a separate method so that it can be overridden
10136     by a subclass.
10137    
10138 bh 230 2002-07-19 Bernhard Herzog <[email protected]>
10139    
10140 bh 234 * Thuban/Model/session.py: Issue a CHANGED message every time
10141     another changed message is issued to make it easier to get
10142     notified of changes.
10143     (Session): Update the doc string
10144     (Session.forward): Issue changed-events as CHANGED as well.
10145     (Session.changed): Overwrite the inherited version to issue
10146     CHANGED events as well.
10147    
10148     * Thuban/UI/tree.py: We can now simply subscribe to the session's
10149     CHANGED channel to be informed of changes.
10150     (SessionTreeCtrl.session_channels): Not needed any longer.
10151 tkoester 403 (SessionTreeCtrl.unsubscribe_all, SessionTreeCtrl.session_changed):
10152 bh 234 Only have to (un)subscribe CHANGED
10153    
10154     * Thuban/Model/map.py (Map.TreeInfo): Deal better with empty maps.
10155    
10156 bh 230 * Thuban/UI/main.py, Thuban/UI/__init__.py: Move the work-around
10157     for the wxPython locale bug to __init__.py so that it's
10158     automatically executed by anybody using UI code from Thuban.
10159    
10160 bh 225 2002-07-18 Bernhard Herzog <[email protected]>
10161    
10162 bh 228 * Thuban/UI/main.py (main): app no longer needs to be global
10163    
10164     * Thuban/UI/mainwindow.py (MainWindow.__init__): Add application
10165     as parameter and store it in an instance variable
10166     (MainWindow.invoke_command, MainWindow.update_command_ui)
10167     (MainWindow.save_modified_session, MainWindow.NewSession)
10168     (MainWindow.OpenSession, MainWindow.SaveSession)
10169     (MainWindow.SaveSessionAs, MainWindow.ShowSessionTree): Use self's
10170     application object.
10171    
10172     * Thuban/UI/application.py (ThubanApplication.OnInit): Instantiate
10173     the main window with self.
10174    
10175 bh 225 * Thuban/UI/context.py: New module with the context class
10176    
10177     * Thuban/UI/command.py (Command): Update doc string.
10178    
10179     * Thuban/UI/mainwindow.py (MainWindow.invoke_command,
10180     MainWindow.update_command_ui): Pass an instance of the context
10181     class to the command's methods
10182     (check_current_tool, call_method): Handle the new context
10183     implementation
10184    
10185     * Examples/simple_extensions/simple_tool.py (simple_tool,
10186     check_simple_tool): Handle the new context implementation
10187    
10188     * Examples/simple_extensions/simple_command.py (simple_command):
10189     Handle the new context implementation. Update the comments about
10190     the context.
10191    
10192     * Thuban/UI/application.py (ThubanApplication.SetSession): Add
10193     doc-string
10194     (ThubanApplication.Session): New method to return the session
10195     object
10196    
10197     * Thuban/UI/tree.py (SessionTreeCtrl.update_tree): The
10198     interactor's selected_layer may not be a layer of the current
10199     session when the tree is updated while a new session is being set.
10200    
10201 bh 217 2002-07-17 Bernhard Herzog <[email protected]>
10202    
10203     * Thuban/UI/tree.py (color_string): Removed. No longer used.
10204     (SessionTreeCtrl.update_tree, SessionTreeCtrl.add_items): Split
10205     update_tree into update_tree and add_items. The tree now uses a
10206     more generic way to display the contents of the tree.
10207     (SessionTreeCtrl): Add a doc string explaining the TreeInfo method
10208    
10209     * Thuban/Model/layer.py (Layer.TreeInfo),
10210     Thuban/Model/extension.py (Extension.TreeInfo),
10211     Thuban/Model/map.py (Map.TreeInfo),
10212 tkoester 403 Thuban/Model/session.py (Session.TreeInfo):
10213 bh 217 Add TreeInfo methods to implement the new tree view update scheme
10214    
10215 bh 216 2002-07-16 Bernhard Herzog <[email protected]>
10216    
10217     * Thuban/UI/application.py: Don't use "import from" for the
10218     MainWindow. It can't always be resolved.
10219     (ThubanApplication.OnInit): change reference to MainWindow
10220     accordingly.
10221    
10222     * Thuban/UI/menu.py (Menu.SetItems): New method to replace a menu
10223     completely
10224    
10225 bh 213 2002-07-10 Bernhard Herzog <[email protected]>
10226    
10227     * setup.py (create_init_module): New configurable variable whose
10228     default depends on the platform we're running on.
10229     (ThubanInstall.initialize_options): Initialize
10230     self.create_init_module from the global create_init_module
10231     (ThubanInstall.user_options): indictate that the options
10232     create-init-module and init-module-dir have arguments.
10233    
10234     * setup.py: In the setup call change the version number to include
10235     cvs.
10236    
10237     * MANIFEST.in: Add the files in Examples
10238    
10239 bh 205 2002-07-09 Bernhard Herzog <[email protected]>
10240    
10241 bh 210 * setup.py: In the setup call, use the thuban homepage as the
10242     value of the url parameter.
10243    
10244 bh 208 * Examples: New subdirectory for examples.
10245    
10246     * Examples/simple_extensions/simple_tool.xpm,
10247     Examples/simple_extensions/simple_tool.py,
10248     Examples/simple_extensions/simple_command.py,
10249     Examples/simple_extensions/README: Simple examples showing how to
10250     add new commands and tools.
10251    
10252 bh 207 * setup.cfg (bdist_rpm): Add the default value for prefix and tell
10253     bdist_rpm that we also have an install script.
10254     (bdist_inno): Add 2002 to the copyright notice.
10255    
10256 bh 205 * setup.py: Create a file in python's site-packages directory to
10257     make installation of Thuban as a library easier.
10258     (ThubanInstall.user_options): Add two new options,
10259     create-init-module and init-module-dir
10260     (ThubanInstall.expand_with_pure_python_dirs): New method to expand
10261     filenames for installation in the default directories.
10262     (ThubanInstall.select_scheme, ThubanInstall.convert_paths): Extend
10263     the inherited methods to capture some filenames before they're
10264     transformed too much by distutils.
10265     (ThubanInstall.run): Create the init module if requested.
10266     (ThubanInstall.thuban_init_filename): New method to return the
10267     full name of the init module.
10268     (ThubanInstall.get_outputs): Append the filename of the init
10269     module.
10270    
10271 bh 202 2002-07-08 Bernhard Herzog <[email protected]>
10272    
10273 bh 205 * setup.py (thuban_bdist_rpm): Extend this version of bdist_rpm to
10274     handle the prefix properly which means that the default for the
10275     installation prefix should be /usr for RPMs and /usr/local when
10276     doing a normal source install.
10277     (bdist_rpm_install_script): Script to override the default install
10278     commands in the specfile generated by the bdist_rpm command.
10279     (thuban_bdist_rpm.user_options): Add a prefix option
10280     (thuban_bdist_rpm.initialize_options): Init the prefix option.
10281     Create the script files for the spec files as empty files here
10282     (thuban_bdist_rpm._make_spec_file): Override the inherited method
10283     to fill the script files with content.
10284    
10285 bh 202 * Thuban/Model/save.py (relative_filename): Wrapper around
10286     Thuban.Lib.fileutil.relative_filename that accepts an empty dir
10287     argument. save_session now automatically uses this version,
10288     solving a problem when saving to a relative filename.
10289    
10290     * setup.py: In the setup call, make sure that the library
10291     directories are under $prefix/lib not directly under $prefix.
10292    
10293 tkoester 403 2002-06-20 Jan-Oliver Wagner <[email protected]>
10294 jan 199
10295     * Thuban/Model/extension.py: new module to handle extension objects.
10296     * Thuban/Model/messages.py: new messages for extensions.
10297     * Thuban/Model/session.py (Session.Extensions, Session.HasExtensions,
10298     Session.AddExtension): new for handling extensions.
10299     Also some other minor changes to round up extension handling.
10300     * Thuban/UI/tree.py (SessionTreeCrtl:update_tree): Added visualization
10301     of Extension titles and title and names of its objects.
10302    
10303 bh 194 2002-05-29 Bernhard Herzog <[email protected]>
10304    
10305     * Thuban/UI/mainwindow.py (MainWindow.bind_command_events): Bind
10306 bh 202 the events for a command.
10307 bh 194 (MainWindow.add_toolbar_command, MainWindow.add_menu_command):
10308     Call bind_command_events to bind the events. add_toolbar_command
10309     can now bind events too so that it's possible to have commands
10310     that are only available through the toolbar.
10311     (MainWindow.init_ids): New instance variable events_bound to keep
10312     track of for which commands events have been bound.
10313    
10314 bh 190 2002-05-28 Bernhard Herzog <[email protected]>
10315    
10316     * Thuban/UI/menu.py: New module to build and manage menus.
10317    
10318     * Thuban/UI/mainwindow.py: Remove some unused imports.
10319     (MainWindow.__init__, main_menu): move the definition of the main
10320     menu from __init__ to the Menu instance main_menu.
10321     (MainWindow.build_menu_bar, MainWindow.build_menu): New methods to
10322     build the menu bar and sub-menus from a menu description.
10323    
10324     * Thuban/UI/application.py (ThubanApplication.OnInit): Read the
10325     startup file
10326     (ThubanApplication.read_startup_files): New method to run
10327     ~/.thuban/thubanstart.py
10328    
10329 bh 192 * Thuban/UI/mainwindow.py (MainWindow.__init__, main_toolbar):
10330     Move the toolbar definition to the Menu instance main_toolbar.
10331     (MainWindow.build_toolbar): New method to build the toolbar
10332     similar to the build_menu methods
10333    
10334 bh 184 2002-05-23 Bernhard Herzog <[email protected]>
10335    
10336 bh 186 * Thuban/UI/mainwindow.py (MainWindow.__init__): Fix spelling of
10337     layer_outline_color. Fix it in the definition of the command too.
10338    
10339 bh 184 * Thuban/UI/command.py (Command): Fix typo in doc string
10340    
10341 bh 182 2002-05-22 Bernhard Herzog <[email protected]>
10342    
10343     * Thuban/UI/mainwindow.py (MainWindow.RunMessageBox): Fix a typo
10344     in the docstring
10345    
10346 bh 175 2002-05-15 Bernhard Herzog <[email protected]>
10347    
10348 bh 180 * Thuban/Model/layer.py (Layer.open_shapefile): Set bbox to None
10349     when the shapefile is empty.
10350     (Layer.BoundingBox, Layer.LatLongBoundingBox): Both methods may
10351     now return None for empty shapefiles. Update doc-strings.
10352    
10353     * Thuban/Model/map.py (Map.BoundingBox): Add doc-string. Deal with
10354     the layer's bbox being None.
10355    
10356     * Thuban/UI/tree.py (SessionTreeCtrl.update_tree): Deal with the
10357     layer's bbox being None.
10358    
10359 bh 175 * Thuban/UI/view.py (MapCanvas.shape_selected): Only redraw when
10360     necessary.
10361     (MapCanvas.__init__): New instance variables, last_selected_layer
10362     and last_selected_shape to determine how the selection has
10363     changed.
10364    
10365     * Thuban/UI/tableview.py (TableGrid.__init__): Do not call
10366     AutoSizeColumns because it will cause a traversal of the entire
10367     table which for large .dbf files will take a very long time.
10368    
10369 bh 172 2002-05-14 Bernhard Herzog <[email protected]>
10370    
10371     * Thuban/Model/layer.py (Layer.open_shapefile): Choose a better
10372     maximum depth for the tree than shapelib does by default.
10373    
10374 bh 165 2002-05-10 Bernhard Herzog <[email protected]>
10375    
10376     * setup.py (py_modules): The shptree modules doesn't have a
10377     wrapper, so don't include it in the py_modules
10378    
10379 bh 163 2002-05-08 Bernhard Herzog <[email protected]>
10380    
10381     * extensions/shapelib/shptree.c (compare_ints): Make arguments
10382     const void * as in the qsort prototype
10383     (SHPTreeFindLikelyShapes): Remove some unused variables.
10384    
10385     * Thuban/UI/view.py (PanTool.MouseMove): Use the bitmap the view
10386     maintains to redraw the window during a drag.
10387     (MapCanvas.unprojected_rect_around_point): New method to determine
10388     a small region around a point for hit-testing.
10389     (MapCanvas.find_shape_at): Only test the shapes in a small region
10390     around the point.
10391    
10392     * setup.py: Increment the version to 0.1.2
10393    
10394     * Thuban/UI/tree.py (SessionTreeCtrl.unsubscribe_all): Remove a
10395     debug print and set session to None after unsubscribing
10396    
10397 bh 146 2002-05-07 Bernhard Herzog <[email protected]>
10398    
10399 bh 154 * Data/iceland_sample.session, Data/iceland_sample.thuban: Rename
10400     the file to have a .thuban extension.
10401    
10402 bh 152 * Thuban/UI/tree.py (session_channels): New class constant with
10403     all the session channels to subscribe to to update the tree
10404     (SessionTreeCtrl.session_changed): Remember the session so that we
10405     can unsubscribe properly. Use the new class constant to
10406     unsubscribe from the old session and subscribe to the new one.
10407     (SessionTreeCtrl.unsubscribe_all): New method to unsubscribe all
10408     subscriptions of the SessionTreeCtrl.
10409     (SessionTreeView.OnClose): Call the tree's unsubscribe_all method.
10410    
10411     * Thuban/UI/mainwindow.py (MainWindow.__init__): Add the "Show
10412     Session Tree" command to the file menu.
10413    
10414     * Thuban/UI/view.py (MapCanvas.do_redraw): Pass the entire bitmap
10415     as update_region to the renderer.
10416    
10417     * Thuban/UI/renderer.py
10418     (ScreenRenderer.layer_ids, ScreenRenderer.draw_shape_layer): The
10419     update box is now directly a tuple, not a wxRect anymore.
10420    
10421     * Thuban/Model/layer.py (Layer.ShapesInRegion): Remove some debug
10422     prints.
10423    
10424     2002-05-07 Bernhard Herzog <[email protected]>
10425    
10426 bh 146 * setup.py: Add the shptree extension module. See
10427     extensions/pyshapelib/ChangeLog for more details.
10428    
10429     * extensions/shapelib/shpopen.c, extensions/shapelib/shapefil.h,
10430     extensions/shapelib/dbfopen.c: Really update to the versions of
10431     shapelib 1.2.9. For some reason it wasn't really done on
10432     2002-04-11.
10433    
10434     * extensions/shapelib/shptree.c: Modified version of shptree.c of
10435     shapelib 1.2.9. The only real difference is the use of qsort
10436     instead of a bubble sort implementation
10437    
10438     * Thuban/Model/layer.py (Layer.__init__): New instance variable
10439     shapetree to hold the shapelib quadtree for the shapefile
10440     (Layer.open_shapefile): Create the quad tree.
10441     (Layer.ShapesInRegion): New method to return the ids of shapes in
10442     a given region using the quad tree.
10443    
10444     * extensions/thuban/wxproj.cpp (project_points): Fix some typos in
10445     comment
10446     (draw_polygon_shape): Accept both arcs and polygons.
10447     (initwxproj): Use the new PYSHAPELIB_IMPORT_API macro to import
10448     the api.
10449    
10450     * Thuban/UI/renderer.py (MapRenderer.layer_ids): New method to
10451     return the shape ids to be rendered in a given layer.
10452     (MapRenderer.draw_shape_layer): Call layer_ids to get the list of
10453     ids. Use draw_polygon_shape to draw arc shapes as well.
10454     (ScreenRenderer.RenderMap): New parameter for the rectangle that
10455     has to be updated
10456     (ScreenRenderer.layer_ids): Make use of the layer's quadtree by
10457     calling it's ShapesInRegion method.
10458    
10459     * Thuban/UI/view.py (MapCanvas.__init__): New instance variable
10460     update_region for the update region.
10461     (MapCanvas.OnPaint): Maintain the update region
10462     (MapCanvas.do_redraw): Pass the bounding box of the update_region
10463     to the renderer when drawing the bitmap. Reset the update_region.
10464    
10465 bh 129 2002-05-03 Bernhard Herzog <[email protected]>
10466    
10467 bh 131 * Thuban/UI/mainwindow.py (MainWindow.SaveSessionAs,
10468     MainWindow.OpenSession): Change the file extension of the session
10469     files to .thuban
10470    
10471 bh 129 * Thuban/Model/session.py (Session.AddMap, forwarded_channels):
10472     Move the map channels to be forwarded by the session into the
10473 bh 146 class constant with forwarded_channels. Also add
10474     LAYER_PROJECTION_CHANGED and LAYER_VISIBILITY_CHANGED to
10475     forwarded_channels
10476 bh 129
10477     * Thuban/Model/base.py (Modifiable.changed): Fix doc-string (a
10478     typo and some rewording).
10479    
10480 bh 126 2002-05-02 Bernhard Herzog <[email protected]>
10481    
10482     * Thuban/UI/view.py: Keep the temporary bitmap used during drawing
10483     around to speed up most redraws:
10484     (MapCanvas.__init__): New instance variable bitmap which holds the
10485     bitmap
10486     (MapCanvas.do_redraw): Redraw self.bitmap if necessary. Use
10487     self.bitmap to draw.
10488     (MapCanvas.full_redraw): New method to force a full redraw
10489     including the bitmap
10490     (MapCanvas.SetMap): Subscribe full_redraw instead of redraw to
10491     make sure the bitmap is redrawn.
10492     (MapCanvas.projection_changed, MapCanvas.set_view_transform,
10493     MapCanvas.shape_selected): Call full_redraw instead of readraw to
10494     make sure the bitmap is redrawn.
10495     (MapCanvas.OnSize): New method to handle size events so that the
10496     bitmap can be redrawn.
10497    
10498 bh 124 2002-04-29 Bernhard Herzog <[email protected]>
10499    
10500     * Thuban/UI/mainwindow.py (MainWindow.__init__): Subscribe to the
10501     canvas' VIEW_POSITION event
10502     (MainWindow.view_position_changed): Handler for VIEW_POSITION.
10503     Update the text in the status-bar accordingly.
10504    
10505     * Thuban/UI/view.py (MapCanvas): Derive from Publisher as well
10506     (MapCanvas.__del__): Implement because Publisher.__del__ has to be
10507     called.
10508     (MapCanvas.__init__): Bind EVT_LEAVE_WINDOW too. Initialize
10509     current_position
10510     (MapCanvas.set_current_position): New method to set
10511     current_position. Issue a VIEW_POSITION event
10512     (MapCanvas.CurrentPosition): New public method to return the value
10513     of current_position. Should be called when the VIEW_POSITION event
10514     is processed.
10515     (MapCanvas.OnLeftDown, MapCanvas.OnLeftUp, MapCanvas.OnMotion):
10516     Update the position.
10517     (MapCanvas.OnLeaveWindow): Set the position to None.
10518    
10519     * Thuban/UI/messages.py (VIEW_POSITION): New message for the
10520     position in the statusbar
10521    
10522 tkoester 403 2002-04-26 Frank Koormann <[email protected]>
10523 frank 120
10524     * Thuban/UI/mainwindow.py: AddLayer, Dialog title s/session/data
10525    
10526 tkoester 403 2002-04-24 Frank Koormann <[email protected]>
10527    
10528 frank 118 * Resources/Bitmaps/identify.xpm: shadow added
10529    
10530     * Resources/Bitmaps/fullextent.xpm: new
10531 jan 116
10532 tkoester 403 2002-04-22 Jan-Oliver Wagner <[email protected]>
10533 jan 116
10534 tkoester 403 * Thuban/UI/tree.py (update_tree): added test for None on map bounding
10535     box
10536 jan 114
10537 tkoester 403 2002-04-21 Jan-Oliver Wagner <[email protected]>
10538    
10539 jan 114 * Thuban/UI/proj4dialog.py (UTMProposeZoneDialog): new
10540    
10541     * Thuban/UI/tree.py (update_tree): added added map extent
10542    
10543     * Thuban/UI/mainwindow.py (_method_command): extended by parameter
10544 tkoester 403 icon; added map_full_extend as tool
10545 jan 114
10546 tkoester 403 2002-04-19 Jan-Oliver Wagner <[email protected]>
10547 jan 107
10548     * Thuban/UI/mainwindow.py (SaveSession): launch save as dialog for
10549     saving _new_ sessions
10550    
10551     * Thuban/Model/session.py (create_empty_session): new session
10552     don't have a filename (set to None)
10553    
10554     * Thuban/UI/tree.py (update_tree): added filename and modified flag
10555    
10556     * Thuban/Model/load.py (ProcessSession): convert projection
10557     parameters from unicode to regular string
10558    
10559     * Data/iceland_sample.session: Added UTM Zone 26 projection.
10560    
10561 bh 100 2002-04-11 Bernhard Herzog <[email protected]>
10562    
10563     * extensions/shapelib/shapefil.h, extensions/shapelib/shpopen.c,
10564     extensions/shapelib/dbfopen.c: Update to the versions of shapelib
10565     1.2.9
10566    
10567     * setup.py (Lib.wxproj extension): Don't link shpopen.c and put
10568     the pyshapelib directoy into the list of include dirs, so that
10569     pyshapelib_api.h can be found.
10570    
10571     * extensions/thuban/wxproj.cpp (pyshapelib_api): New variable that
10572     holds the pyshapelib C-API
10573     (draw_polygon_shape, point_in_polygon_shape, shape_centroid): Use
10574     pyshapelib_api to access the shapelib functions.
10575     (initwxproj): Import the c_api from the shapelib module and
10576     initialize pyshapelib_api.
10577    
10578 bh 89 2002-04-04 Bernhard Herzog <[email protected]>
10579    
10580 bh 91 * setup.py (thuban_bdist_rpm.initialize_options): Use
10581     initialize_options to create the scripts for the rpm.
10582    
10583 bh 89 * extensions/pyprojection/setup.py (PROJ4_PREFIX): Just use /
10584    
10585 bh 85 2002-04-03 Bernhard Herzog <[email protected]>
10586    
10587 bh 87 * setup.py: Increment version to 0.1.1
10588    
10589 bh 85 * Thuban/UI/mainwindow.py (MainWindow.__init__): Move the "Add
10590     Layer" and "Remove Layer" commands from the layer menu to the map
10591     menu
10592    
10593 bh 83 2002-02-15 Bernhard Herzog <[email protected]>
10594    
10595     * Thuban/Model/layer.py (Layer.Shape): list append only takes one
10596     argument (python <= 1.5.2 erroneously accepted multiuple
10597     arguments)
10598    
10599 bh 81 2002-02-04 Bernhard Herzog <[email protected]>
10600    
10601     * Thuban/UI/identifyview.py (IdentifyGridCtrl): New class to use a
10602     RecordGrid in the identifyview.
10603     (IdentifyView.__init__): Use IdentifyGridCtrl instead of
10604     IdentifyListCtrl. The grid allows editing of the values.
10605    
10606     * Thuban/UI/controls.py (RecordTable, RecordGridCtrl): New classes
10607     implementing a grid for a single row of a thuban table.
10608    
10609     * Thuban/UI/view.py (MapCanvas.SelectShapeAt): Search through all
10610     layers by default. Easier to use than the previous default of only
10611     searching through the select layer which meant that if no layer
10612     was selected, you couldn't select a shape.
10613    
10614     * Thuban/UI/tableview.py (TableGrid.__init__): Fix typo
10615    
10616     * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Honour the
10617     stroke_width attribute
10618    
10619     * Thuban/Model/save.py (save_session): Write the new stroke_width
10620     attribute
10621    
10622     * Thuban/Model/load.py (ProcessSession.startElement): Read the
10623     stroke_width attribute
10624    
10625     * Thuban/Model/layer.py (Layer.__init__): New parameter and
10626     instance variable stroke_width
10627     (Layer.SetStrokeWidth): Set the stroke_width.
10628    
10629 bh 72 2002-02-01 Bernhard Herzog <[email protected]>
10630    
10631     * extensions/thuban/wxproj.cpp (project_points): Fix two
10632     off-by-one errors in the last loop that joins the various parts
10633     together.
10634    
10635 bh 71 2002-01-14 Bernhard Herzog <[email protected]>
10636    
10637     * setup.py (data_dist.make_distribution): Fix some typos
10638    
10639 bh 70 2001-09-18 Bernhard Herzog <[email protected]>
10640    
10641     * README: Slight tweaking in preparation for the 0.1 release
10642    
10643     * setup.cfg: Add section for sdist to create both tgz and zip
10644     archives
10645    
10646     * setup.py: increase version number to 0.1
10647     (data_dist): New command class for data distribution
10648    
10649 bh 64 2001-09-14 Bernhard Herzog <[email protected]>
10650    
10651 bh 70 * Thuban/UI/identifyview.py (IdentifyListCtrl.selected_shape):
10652     Handle the case of no layer (i.e. layer is None) properly.
10653    
10654 tkoester 403 * Thuban/UI/proj4dialog.py (UTMDialog.__init__, Proj4Dialog.__init__):
10655 bh 70 Set the initial selection of the combo boxes to reflect the
10656     projection we're starting with in a way that works on windows,
10657     too.
10658    
10659 bh 64 * Thuban/Lib/connector.py (Connector.print_connections): Print the
10660     puiblisher's ids in hex to make it easier to compare them to the
10661     standard repr of python methods
10662    
10663     * Thuban/Model/map.py (Map.Destroy): Unsubscribe the label_layer
10664     messages
10665    
10666 bh 59 2001-09-13 Bernhard Herzog <[email protected]>
10667    
10668 bh 64 * Thuban/UI/tree.py (SessionTreeCtrl.OnSelChanged): Make sure to
10669     deselect the layer if no layer is selected
10670    
10671 bh 59 * Thuban/UI/view.py (MapCanvas.OnPaint): Only delay drawing to
10672     idle time when there actually is something to draw. If there's
10673     nothing to draw simply clear the window
10674     (MapCanvas.do_redraw): Call dc.EndDrawing and add some comments.
10675     (MapCanvas.SetMap): force a redraw in all cases because
10676     FitMapToWindow doesn't always do it.
10677     (MapCanvas.ZoomFactor): Add an optional parameter, center, to
10678     specify the point to move into the center of the window
10679     (ZoomOutTool.MouseUp, ZoomInTool.MouseUp): If the mouse wasn't
10680     dragged, zoon in/out by a factor of 2
10681 bh 64 (MapCanvas.find_shape_at): Iterate backwards (i.e. with decreasing
10682     index, i.e. reversed drawing order) so that objects appearing to
10683     be in from of others are selected first. This is probably mostly
10684     relevant for point shapes where the symbols used may overlap
10685 bh 59
10686     * Thuban/Model/session.py (create_empty_session): Unset the
10687     modified bit before returning it
10688    
10689     * Thuban/UI/mainwindow.py (MainWindow.NewSession): Use
10690     create_empty_session session to create the new, empty session.
10691    
10692     * Thuban/UI/mainwindow.py (MainWindow.__init__): Set the size of
10693     the tool bitmaps.
10694     (MainWindow.OnClose, MainWindow.save_modified_session): Separate
10695     the code that asks whether the session should be saved into the
10696     new method save_modified_session.
10697     (MainWindow.OpenSession, MainWindow.NewSession): Use the new
10698     method to save modified session here too.
10699    
10700 bh 55 2001-09-11 Bernhard Herzog <[email protected]>
10701    
10702     * setup.py (InnoIconItem): fix typo
10703    
10704     (thuban_bdist_inno.run):
10705     (bdist_inno.run): Move the decision not to create symlinks on
10706     non-nt platforms to thuban_bdist_inno and do it unconditinally
10707     since we never want to create the symlinks here
10708    
10709 bh 48 2001-09-10 Bernhard Herzog <[email protected]>
10710    
10711 bh 53 * Thuban/UI/mainwindow.py (MainWindow.IdentifyTool): Popup the
10712     identify view immediately
10713    
10714     * Thuban/UI/controls.py: New file with two classes RecordListCtrl
10715     and SelectableRecordListCtrl that implement the code shared by the
10716     identify view and the label dialog
10717    
10718     * Thuban/UI/identifyview.py (IdentifyListCtrl): Derive from the
10719     new class RecordListCtrl
10720    
10721     * Thuban/UI/labeldialog.py (LabelDialog.OnOK): Check whether the
10722     return value of GetValue is None instead of using it as a boolean
10723     directly so that Zero numbers are handled properly.
10724     (LabelListCtrl): Derive from the new class
10725     SelectableRecordListCtrl
10726    
10727 bh 48 * Thuban/UI/proj4dialog.py (Proj4Dialog.__init__):
10728     (Proj4Dialog.dialogLayout): Make the window resizable and set the
10729     size of the text control explicitly to make the sizers work on
10730     both Windows and X.
10731    
10732 bh 44 2001-09-07 Bernhard Herzog <[email protected]>
10733    
10734     * Thuban/UI/view.py (MapCanvas.find_shape_at):Add a new parameter
10735     that can limit the search to the currently selected layer.
10736     (MapCanvas.SelectShapeAt): Make sure that the currently selected
10737     layer stays selected even when no shape is found
10738 bh 46 (MapCanvas.FitRectToWindow): If the rect has zero with or zero
10739     height do nothing (avoids zero division errors)
10740 bh 44
10741 bh 32 2001-09-06 Bernhard Herzog <[email protected]>
10742    
10743 bh 42 * Thuban/UI/tree.py (SessionTreeCtrl, SessionTreeView.__init__):
10744     Correct the spelling of SessionTreeCtrl. dabbrev is too damn
10745     convenient :-)
10746     (SessionTreeCtrl.__init__, SessionTreeCtrl.update_tree): Introduce
10747     a new instvar layer_to_item to map layers to tree items
10748     (SessionTreeCtrl.layer_selected): Select the appropriate tree item
10749     to match the current selection in the interactor
10750    
10751 bh 40 * Thuban/UI/interactor.py (Interactor.SelectedLayer):
10752     (Interactor.HasSelectedLayer): New methods to query the current
10753     selection
10754    
10755     * Thuban/UI/mainwindow.py (MainWindow.current_layer):
10756     (MainWindow.has_selected_layer): Simply call the appropriate
10757     interactor method
10758    
10759     * Thuban/UI/mainwindow.py (MainWindow.__init__):
10760     (MainWindow.LayerShowTable):
10761     (MainWindow.identify_view_on_demand): Store the interactor in an
10762     instvar and use that reference instead of going through main.app
10763    
10764 tkoester 403 * Thuban/UI/mainwindow.py (MainWindow.ShowSessionTree):
10765     * Thuban/UI/application.py (ThubanApplication.OnInit):
10766 bh 40 * Thuban/UI/main.py (main): Create the session tree view in main
10767     with the new mainwindow method ShowSessionTree and not directly
10768     the application's OnInit method
10769    
10770     * Thuban/UI/tree.py (myTreeCtrlPanel):
10771     (SessioinTreeCtrl): Rename to SessioinTreeCtrl and turn it into a
10772     TreeCtrl isntead of a panel. This affects most method since we now
10773     refer to self instead of self.tree
10774     (SessionTreeView): New class implementing a non-modal dialog
10775     showing the session tree.
10776    
10777 bh 35 * Thuban/UI/mainwindow.py (MainWindow.LayerShowTable): Pass the
10778     layer to the tableview dialog.
10779    
10780     * Thuban/UI/tableview.py: Add some doc-strings
10781 tkoester 403 (TableGrid):
10782 bh 35 (TableGrid.OnRangeSelect):
10783     (TableGrid.OnSelectCell):
10784     (TableFrame.__init__):
10785     (TableFrame.row_selected):
10786     Selecting rows in the grid view now updates the selected shapes
10787     through the TableFrame. To achieve this we derive TableGrid from
10788     Publisher and introduce the message type ROW_SELECTED which the
10789     TableFrame subscribes to and which is issued by OnRangeSelect and
10790     OnSelectCell
10791    
10792     (DataTable.SelectRow): Removed because it's no longer needed in
10793     the row/shape selection scheme
10794    
10795 bh 32 * Thuban/UI/dialogs.py: New file implementing common classes for
10796     dialogs
10797    
10798     * Thuban/UI/tableview.py (TableGrid.__init__): Don't subscribe to
10799     the SELECTED_SHAPE message anymore. This is now handled by the
10800     parent.
10801     (TableGrid.select_shape): Only update the selection if the shape
10802     is not None.
10803     (TableFrame): Inherit from the new NonModalDialog class.
10804     (TableFrame.__init__, TableFrame.select_shape): Handle the
10805     SELECT_SHAPE message.
10806     (TableFrame.OnClose): Extend the inherited method to unsubscribe
10807     SELECT_SHAPE
10808    
10809     * Thuban/UI/mainwindow.py (MainWindow.init_dialogs):
10810     (MainWindow.add_dialog):
10811     (MainWindow.dialog_open):
10812     (MainWindow.remove_dialog):
10813     (MainWindow.get_open_dialog): New methods to maintain a dictionary
10814     of opened non-modal dialogs.
10815    
10816     (MainWindow.__init__): Initialize the new non-modal dictionary
10817     management code
10818     (MainWindow.LayerShowTable): maintain separate dialogs for each
10819     table using the non-modal dialog management code to only open a
10820     view once for each table.
10821    
10822     (MainWindow.IdentifyTool):
10823     (MainWindow.__init__):
10824     (MainWindow.identify_view_on_demand): Don't open the identify view
10825     in IdentifyTool anymore. This will be done automatically by the
10826     new method identify_view_on_demand which handles the
10827     SELECTED_SHAPE message so that the identify view will be opened on
10828     demand
10829    
10830     * Thuban/UI/identifyview.py (IdentifyListCtrl.__init__): Remove
10831     the interactor argument. The SELECTED_SHAPE message is now handled
10832     by the parent.
10833     (IdentifyView.__init__): Add the interactor argument so that we
10834     can handle the SELECTED_SHAPE message here
10835     (IdentifyView.selected_shape): New method to handle the
10836     SELECTED_SHAPE messages
10837    
10838     * Thuban/UI/identifyview.py (IdentifyView): Derive from the new
10839     NonModalDialog class
10840     (IdentifyView.OnClose): Extend the inherited version to
10841     unsubscribe SELECT_SHAPE
10842    
10843     * Thuban/Model/session.py (Session.UnsetModified): Remove debug prints
10844    
10845 bh 26 2001-09-05 Bernhard Herzog <[email protected]>
10846    
10847     * Thuban/UI/view.py (MapCanvas.__init__): New argument, interactor.
10848 tkoester 403
10849 bh 26 * Thuban/UI/mainwindow.py (MainWindow.__init__): New argument
10850     interactor to pass through to the MapCanvas
10851 tkoester 403
10852 bh 26 * Thuban/UI/application.py (ThubanApplication.OnInit): Use the new
10853     argument to the MainWindow constructor to get rid of the ugly hack
10854     that made main.app available early just so that the mapcanvas
10855     could access the interactor object.
10856    
10857 bh 19 2001-09-04 Bernhard Herzog <[email protected]>
10858    
10859 bh 22 * Thuban/UI/mainwindow.py (MainWindow.RunMessageBox): New method
10860     that runs a modal message box
10861     (MainWindow.OnClose): Use the new method
10862     (MainWindow.RemoveLayer): Just do nothing in case no layer is
10863     selected. The command should be grayed out anyway, so there's no
10864     need to pop up a message box.
10865     (MainWindow.AddLayer): Pop up a message box with an error message
10866     if the shape file can't be opened
10867    
10868     * Thuban/Model/layer.py (Layer.__init__): Open the shapefile
10869     immediately. This will cause an exception in case the file can't
10870     be opened and we can display an appropriate message.
10871    
10872 bh 19 * MANIFEST.in: Add extensions/pyprojection/LICENSE
10873    
10874     * setup.py (thuban_bdist_rpm): New class implementing a Thuban
10875     specific bdist_rpm command.
10876    
10877     * Thuban/UI/main.py: Catch ImportError exceptions when importing
10878     the locale module because it may not be available on some
10879     installations.
10880    
10881     * extensions/pyprojection/LICENSE: Copy of the license text in
10882     Projection.i. Having it in a separate file makes it easier to
10883     refer to license text in e.g. RPMs
10884    
10885 bh 18 2001-09-03 Bernhard Herzog <[email protected]>
10886    
10887 bh 19 * setup.py: use wx-config instead of wxgtk-config because it's
10888     more generic
10889    
10890     * setup.py (ThubanInstall.get_outputs): Add the symlink in
10891     <prefix>/bin to the outputs
10892     (ThubanInstall.link_file): New method to link files. We need this
10893     because the standard copy_files refuses to link non-existing
10894     files.
10895     (ThubanInstall.run): Remove the leading install root from the
10896     script filename if an install root was specified and use the new
10897     link_file method
10898 tkoester 403
10899 bh 18 * Thuban/UI/mainwindow.py (MainWindow.AddLayer): Fit the map to
10900     the window when the first layer is added to the map.
10901    
10902     * setup.py (ThubanInstall.run): Honor the build root (self.root)
10903     when linking thuban.py to <prefix>/bin
10904    
10905 bh 16 2001-08-31 Bernhard Herzog <[email protected]>
10906    
10907     * setup.py: In the setup call, the install parameters shouldn't
10908     have trailing slashes because distutils on non-posix platforms
10909     doesn't like that. The same applies to other directories like
10910     "Resources/Bitmaps"
10911    
10912     In the configuration section for nt, move the wxWindows directory
10913     optins into the part clearly marked as editable.
10914    
10915     (InstallLocal.initialize_options):
10916     (InstallLocal.user_options): remove the currently unused debug
10917     flag
10918     (thuban_build_py.find_all_modules): Add this method so that it
10919     works for our case of having packages and modules in one
10920     distribution as well.
10921     (ThubanInstall.initialize_options):
10922     (ThubanInstall.finalize_options):
10923     (ThubanInstall.user_options):
10924     (ThubanInstall.boolean_options): Add new options, do-symlink and
10925     extra files. Since these are the first ThubanInstall specific
10926     options, override user_options and boolean_options
10927     (ThubanInstall.run): Honor the new do-symlink and extra-files
10928     options.
10929     (ThubanInstall.get_outputs): Add to override the base-class's
10930     version and add the extra-files to the outputs
10931     (bdist_inno): New class for windows distributions with Inno Setup
10932     (InnoIconItem): Helper class for bdist_inno
10933     (thuban_bdist_inno): Thuban specific version of bdist_inno. Added
10934     this together with the appropriate parameters, to the setup call.
10935 tkoester 403
10936 bh 16 * setup.cfg (bdist_inno): added new section for the inno setup
10937     installer
10938    
10939     * Thuban/UI/tree.py (myTreeCtrlPanel.__init__): New inst var
10940     changing_selection to avoid recursive selection events when
10941     modifying the selection in response to a selection event.
10942     (myTreeCtrlPanel.normalize_selection): Set the new inst var when
10943     changing the tree's selection.
10944     (myTreeCtrlPanel.OnSelChanged): Only normalize the selection when
10945     we're not being called indirectly from normalize_selection.
10946    
10947     * Thuban/UI/mainwindow.py (MainWindow.update_command_ui): Call
10948     event.Check only if the command is actuall checkable.
10949     (MainWindow.__init__): Call the toolbar's Realize method to make
10950     sure that the items are actually shown
10951    
10952 bh 7 2001-08-28 Bernhard Herzog <[email protected]>
10953    
10954 bh 9 * setup.py: Fix some doc strings
10955    
10956 bh 7 * ChangeLog: started
10957    

Properties

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

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26