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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 2481 - (hide annotations)
Sat Dec 18 00:32:48 2004 UTC (20 years, 2 months ago) by bernhard
Original Path: trunk/thuban/ChangeLog
File size: 423029 byte(s)
Added Extensions/svgexport/TODO

1 bernhard 2479 2004-12-18 Bernhard Reiter <[email protected]>
2 bernhard 2480
3 bernhard 2481 Added Extensions/svgexport/TODO
4    
5     2004-12-18 Bernhard Reiter <[email protected]>
6    
7 bernhard 2480 Refactored in svgexport:
8     DrawPath replaces DrawPolygon; added newline in front of "M" in paths.
9    
10     * Extensions/svgexport/svgmapwriter.py
11     Added verbosity level 3 to print out polygon points.
12     (class Point): added __repr__
13     (class Brush, __str__()): Added space after ,.
14     (DrawPolygon): Renamed to DrawPath()
15     (DrawPath): Takes list of polygons as input now, adds \n before "M"s.
16     (DrawLines): Using DrawPath now.
17    
18     * Extensions/svgexport/test/test_svgmapwriter.py:
19     Replaced DrawPolygon() calls with DrawPath() and put the first argument
20     inside another list. Adapted test data with a newline before "M".
21    
22     2004-12-18 Bernhard Reiter <[email protected]>
23 bernhard 2479
24     Refactored svgexport tests: 9 double tests runs eliminated;
25     code size reduced by 8 lines.
26    
27     * Extensions/svgexport/test/test_svgmapwriter.py:
28     (class TestWithDC): Renamed to BaseTestWithDC, moved to top.
29     (class BaseWithDCtools): New, subclass from BaseTestWithDC.
30     (class TestDrawSplines): now subclass from BaseTestWithDCtools,
31     this fixed the double running of the nine tests of TestVirtualDC.
32     (class TestVirtualDC): Using self.dc and self.file from setUp().
33    
34 bh 2478 2004-12-17 Bernhard Herzog <[email protected]>
35    
36     Two windows specific fixes ported from thuban-1­0-branch:
37    
38     * Thuban/UI/about.py (unicodeToLocale): Use getdefaultlocale
39     instead of getlocale because getlocale doesn't return a usable
40     encoding name on a german windows 2000
41    
42     * setup.py: windows build: Removed the absolute path names and
43     made all prfixes relative to the directory containing setup.py.
44     Makes it a little easier to adapt to a different system.
45    
46 bh 2470 2004-12-16 Bernhard Herzog <[email protected]>
47    
48 bernhard 2479 Add support for PostGIS tables with LINESTRING geometries.
49 bh 2472 Fixes RT#2299
50    
51     * Thuban/Model/postgisdb.py (shapetype_map): Add LINESTRING
52    
53     * test/postgissupport.py
54     (PostgreSQLServer.get_default_static_data_db): Rename the "roads"
55     table to "roads-multi" because it now uses MULTILINESTRING
56     geometries and introduce a new "roads" table that uses LINESTRING
57     (coords_to_multilinestring): Make the doc string more precise
58     (coords_to_linestring): New. Create a LINESTRING WKT
59     representatin
60     (wkt_converter): Add coords_to_linestring
61     (upload_shapefile): Rephrase the doc-string a bit.
62    
63     * test/test_postgis_db.py (TestPostGISShapestoreArc)
64     (LineStringTests)
65     (TestPostGISShapestoreLineString)
66     (TestPostGISShapestoreMultiLineString): Split
67     TestPostGISShapestoreArc into a base class LineStringTests and two
68     derived classes TestPostGISShapestoreLineString for LINESTRING
69     geometries and TestPostGISShapestoreMultiLineString for
70     MULTILINESTRING geometries. Most test methods are in the base
71     class with the exception of tests that explicitly check the raw
72     format.
73    
74     2004-12-16 Bernhard Herzog <[email protected]>
75    
76 bh 2471 Make the test suite work with PostGIS 0.8.2 and PostgreSQL 7.4
77    
78     * test/postgissupport.py (find_postgis_sql): Different postgis
79     versions put the postgis.sql file into slightly different places
80     so we have to look in both. The updated doc string describes this
81     is more detail.
82    
83     * test/test_postgis_db.py
84     (TestPostGISSpecialCases.test_column_name_quoting): The return
85     value of UniqueValues is unsorted, so it has to be sorted for
86     comparison.
87    
88     2004-12-16 Bernhard Herzog <[email protected]>
89    
90 bh 2470 Fix for RT#2237
91    
92     * Thuban/UI/projdialog.py (ProjFrame._show_proj_panel): If the
93     panel to be shown is the UnknownProjPanel disable the OK and Try
94     buttons. Otherwise enable them.
95     (ProjFrame.__GetProjection): The UnknownProjPanel returns None for
96     the parameters. In that case __GetProjection also returns None
97     now.
98    
99 bh 2459 2004-12-15 Bernhard Herzog <[email protected]>
100    
101 bh 2462 * Thuban/UI/classgen.py (GenQuantilesPanel.__init__): Set the
102     minimum number of classes to 2. The calculate_quantiles needs at
103     least two and raises an exception otherwise.
104     Fixes RT#2549
105    
106     2004-12-15 Bernhard Herzog <[email protected]>
107    
108 bh 2460 * test/postgissupport.py (PostgreSQLServer.execute_sql): Extend to
109     so that it returns a result for select statements.
110     (PostgreSQLServer.server_version): New. Return the version of the
111     server software.
112     (PostgreSQLServer.require_authentication): The format of
113     pg_hba.conf has changed between PostgrSQL 7.2 and 7.3. Check the
114     server version and generate the file in the correct format
115    
116     2004-12-15 Bernhard Herzog <[email protected]>
117    
118 bh 2459 * test/postgissupport.py (PostgreSQLServer.is_running): Fix typo
119     in the doc string and rephrase it a little.
120    
121 frank 2457 2004-12-15 Frank Koormann <[email protected]>
122    
123     * test/test_load.py (TestAltPath.checkSession): New, extended checks if
124     session has been loaded successfully. The check is called by the relevant
125     tests after executing load_session().
126    
127 bh 2450 2004-12-13 Bernhard Herzog <[email protected]>
128    
129 bh 2454 Make sure the region used to determine which shapes are visible
130     actually matches the region on the printed page. If this isn't
131     done properly some shapes might not be printed.
132     Fixes RT #2692
133    
134     * Thuban/UI/view.py (MapPrintout.draw_on_dc): The region for the
135     renderer has to be at the same position as the mapregion
136    
137     * Thuban/UI/renderer.py (ExportRenderer.RenderMap): self.region
138     has to be moved by (self.shiftx, self.shifty) too.
139    
140     2004-12-13 Bernhard Herzog <[email protected]>
141    
142 bh 2452 * libraries/pyprojection/Projection.i: Work around a bug in the
143     generated python code which leads to exception in the __del__
144     method when the constructor fails. See the comments in the code
145     for more details.
146    
147     * libraries/pyprojection/Projection.py: Updated from Projection.i
148     with SWIG.
149    
150     2004-12-13 Bernhard Herzog <[email protected]>
151    
152 bh 2451 * test/test_load.py (TestAltPath.test_01_single_path_error_fix)
153     (TestAltPath.test_02_path_error_fix_from_list)
154     (TestAltPath.test_05_path_error_fix_from_list_changed)
155     (TestAltPath.test_06_path_error_fix_from_list_fails): self.session
156     is destroyed in tearDown, so there's no need to do it in a test
157     case.
158    
159     * Thuban/Model/load.py (SessionLoader.open_shapefile): Remove a
160     debug print
161    
162     2004-12-13 Bernhard Herzog <[email protected]>
163    
164 bh 2450 * Extensions/svgexport/test/test_svgmapwriter.py
165     (TestDrawSplines.setUp): Do not use super with the unittest
166     classes because in Python 2.2 they're still old-style classes.
167    
168 frank 2448 2004-12-13 Frank Koormann <[email protected]>
169    
170     Alternative Path feature: When loading a (moved) session where
171     shapefiles cannot be found, ask the user. Use the specified path
172     if further shapefiles are missing. However, ask the usr for confirmation
173     in such cases.
174    
175     * test/test_load.py (TestAltPath): New, tests for alternative path feature
176     in load_session()
177     (Shapefile_CallBack): Helper, implements controllable callback.
178    
179     * Thuban/UI/application.py (ThubanApplication.OnInit):
180     Added "alt_path" to self.path
181     (ThubanApplication.OpenSession): Added shapefile_callback as second
182     callback similar to db_connection_callback.
183     (ThubanApplication.run_alt_path_dialog): New, implementaion of
184     shapefile_callback. In addition to raising the dialog the control of
185     self.path('alt_path') is implemented here.
186    
187     * Thuban/Model/load.py (SessionLoader.__init__): Added shapefile_callback.
188     (SessionLoader.open_shapefile): Open shapefile, eventually with
189     alternative path. This wrapps the "theSession.OpenShapefile(filename)"
190     formerly used in start_fileshapesource()/start_layer().
191     (SessionLoader.start_fileshapesource): Call open_shapefile().
192     (SessionLoader.start_layer): Call open_shapefile().
193     (load_session): Added shapefile_callback.
194    
195     * Thuban/UI/altpathdialog.py: New, implements dialogs for alternative path
196     feature (search / check).
197    
198     * Doc/manual/thuban-manual.xml: Added documentation of new feature.
199    
200 bernhard 2443 2004-12-11 Bernhard Reiter <[email protected]>
201    
202 bernhard 2445 svgexport 0.9.2: Point size supports for maps.
203    
204     * Extensions/svgexport/svgmapwriter.py: Added import of SHAPETYPE_POINT
205     (def draw_point_shape): new parameter size defaults to 2 as before.
206     (draw_shape_layer_incrementally): Moved draw_func log line higher.
207     Added draw_func call with size when dealing with a point layer.
208    
209     * Extensions/svgexport/__init__.py: bumped version to 0.9.2.
210    
211     2004-12-11 Bernhard Reiter <[email protected]>
212    
213 bernhard 2444 Made sure that newlines are inserted in the svg path d attributes
214     to raise the chance that the line length will be below 255 characters,
215     as recommended by REC SVG 1.1 in section 8.3.1.
216    
217     * Extensions/svgexport/svgmapwriter.py(DrawPolygon):
218     Adding \n before L's and changed whitespace handling.
219    
220     * Extensions/svgexport/test/test_svgmapwriter.py:
221     Adapted tests to new whitespace handling of DrawPolygon.
222    
223     2004-12-11 Bernhard Reiter <[email protected]>
224    
225 bernhard 2443 * Doc/technotes/coding_guidelines.txt: easy typo fixed.
226    
227     * Extensions/svgexport/test/test_svgmapwriter.py:
228     Removed test_drawbezier in favour of new test_drawspline3 and
229     test_drawspline4 within new class TestDrawSplines(TestVirtualDC).
230     All only to test DrawSpline.
231    
232     * Extensions/svgexport/svgmapwriter.py(DrawSpline):
233     New implementation now really using the strange algorithm of
234     xfig 3.1's approximated splines and its conversion to postscript
235     with one twist: SVG can do quadratic beziers, so skipped translation
236     to cubic beziers.
237     (TestWithDC): Typo in comment fixed.
238    
239 joey 2442 2004-12-09 Martin Schulze <[email protected]>
240    
241     * Thuban/Model/classgen.py: Added missing character encoding
242    
243     * Extensions/wms/properties.py (OpenWMSProperties): removed
244    
245     * Extensions/wms/parser.py (WMSCapabilitiesParser.error): Dropped
246     support for get_srs_discrepancies() since there are no
247     discrepancies anymore (was a thinko)
248    
249     * Extensions/wms/layer.py (WMSLayer.GetMapImg): Improved graphic
250     format priority now that more formats are supported globally by
251     the render engine.
252    
253 silke 2437 2004-12-08 Silke Reimer <[email protected]>
254     * Extensions/ogr/ogrshapes.py: Substituted ogr-method CloseRings
255     because it is not available in all versions of ogr
256    
257 bernhard 2436 2004-12-08 Bernhard Reiter <[email protected]>
258     * Extensions/ogr/__init__.py: Added empty __init__.py to heal
259     global tests until a real one is commited.
260    
261 nhueffme 2435 2004-12-07 Nina Hüffmeyer <[email protected]>
262    
263     * /Extensions/ogr/: Adding a new extension to read shapefiles with
264     ogr. It is planned to add other vector formats.
265    
266     * /test/runtests.py: Adding tests from /Extensions/ogr/test/.
267    
268 jan 2434 2004-12-07 Jan-Oliver Wagner <[email protected]>
269    
270     * /Extensions/svgexport/test/test_svgmapwriter.py: Reverting
271     part of a (non-)fix to renable that the tests are always
272     executed.
273    
274 bernhard 2432 2004-12-07 Bernhard Reiter <[email protected]>
275    
276     * Extensions/svgexport/test/test_svgmapwriter.py:
277     Added test_drawbezier() to test DrawSpline().
278    
279     * Extensions/svgexport/svgmapwriter.py(DrawSpline):
280     Really implemented bezier drawing.
281    
282     * Extensions/svgexport/__init__.py: Bumped version of svgexport
283     to 0.9.1 because now the legend examples lines styles
284     will be drawing with beziers.
285    
286 joey 2431 2004-12-05 Martin Schulze <[email protected]>
287    
288     * Thuban/UI/renderer.py (raster_format_map): Added PNG, TIFF and
289     GIF as supported bitmap image formats (helpful for the WMS extension)
290    
291 joey 2430 2004-11-30 Martin Schulze <[email protected]>
292    
293     * Extensions/wms/test/test_ogclib.py (TestOGCLib.test_compareURLs):
294     Improved the test for the internal compare method
295    
296 jan 2429 2004-11-27 Jan-Oliver Wagner <[email protected]>
297    
298     * Thuban/UI/about.py (About.__init__): Added
299     Norbert Solymosi for hungarian translation and Ole Rahn
300     as contrbutor. Moved Bernhard Reiter from Contributor
301     to Developer.
302    
303 bernhard 2425 2004-11-27 Bernhard Reiter <[email protected]>
304    
305     * Extensions/svgexport/test/test_svgmapwriter.py:
306     Removed Jan from author list as he did not change enough significant
307     lines yet.
308    
309     * Extensions/svgexport/__init__.py: Added Bernhard as author
310     of the Extension.
311    
312 jan 2422 2004-11-27 Jan-Oliver Wagner <[email protected]>
313    
314     * po/hu.po: New. Hungarian translation. Contributed
315     by Norbert Solymosi.
316    
317 bh 2419 2004-11-26 Bernhard Herzog <[email protected]>
318    
319     * Extensions/svgexport/test/test_svgmapwriter.py
320     (Testobjectexport.test_transparent_polygon): Commented out some
321     debug prints
322    
323 jan 2418 2004-11-24 Jan-Oliver Wagner <[email protected]>
324    
325     Fix broken tests for svg extension and added svg legend
326     to Experimental menu.
327    
328     * Extensions/svgexport/test/test_svgmapwriter.py: Fix to have
329     the test run correctly even if the extension is a package.
330     Also removed the "import Thuban" which makes no sense.
331    
332     * Extensions/svgexport/__init__.py: Fix to have the extensions'
333     test module also be executed from the global test routine.
334     This is done by looking for the absense of the DISPLAY variable.
335    
336     * Extensions/svgexport/maplegend.py: Moved the menu entry from Extensions
337     to Experimental menu since this module has yet not reached a stable
338     status (ie. 1.0).
339    
340 bernhard 2414 2004-11-22 Bernhard Reiter <[email protected]>
341    
342     * Extensions/svgexport/svgmapwriter.py:
343     Added verbose variable and some logging depending on it.
344     (class VirtualDC(XMLWriter)): Minor improvement in the polygon loop,
345     because counting i is not necessary.
346     (class Pen, class Brush): Added simple __str__ methods.
347     (SVGRenderer.draw_polygone_shape): Fix #2698 (transparent polygons are
348     not exported to svg file) Note: holes still unhandled.
349    
350     * Extensions/svgexport/test/test_svgmapwriter.py:
351     Made a baseclass TestWithDC for test needed a DC.
352     Added tests for bug #2698 (transparent polygons are not
353     exported to svg file):
354     Testobjectexport.test_transparent_polygon()
355    
356     * Thuban/Model/base.py (UnsetModified):
357     Fixed some typos in docstring.
358    
359     * Thuban/UI/baserenderer.py (BaseRenderer.draw_polygon_shape()):
360     Added hints on the used algorithm for handling holes.
361    
362 jan 2403 2004-11-20 Jan-Oliver Wagner <[email protected]>
363    
364 jan 2412 Some face lifting for the examples.
365    
366     * Examples/__init__.py: Make this directory a package.
367    
368     * Examples/simple_extensions/__init__.py: Make this directory a package.
369    
370     * Examples/simple_extensions/hello_world.py: Moved entry from Extensions
371     menu to Examples menu.
372    
373     * Examples/simple_extensions/simple_command.py: Some more comments,
374     minor changes.
375    
376     * Examples/simple_extensions/simple_tool.py: Minor changes.
377    
378     2004-11-20 Jan-Oliver Wagner <[email protected]>
379    
380 jan 2407 Changed way of extension registry for wms and added extension
381     registry for umn_mapserver extension.
382    
383     * Extensions/wms/__init__.py: Added registry entry and the importing
384     of the actual wms module. Included a test for the required PyOGCLib.
385    
386     * Extensions/wms/wms.py: Removed registry entry (moved to __init__.py).
387    
388     * Extensions/umn_mapserver/__init__.py: Added registry entry and the
389     importing of the actual umn mapserver management modules.
390     Included a test for the required Python MapScript.
391    
392     2004-11-20 Jan-Oliver Wagner <[email protected]>
393    
394 jan 2403 Changed way of extension registry for importAPR, bboxdump
395     and added extension registry for svgexport.extension registry for
396     svgexport.
397    
398     * Extensions/importAPR/__init__.py: Added registry entry and the importing
399     of the actual importAPR module.
400    
401     * Extensions/importAPR/importAPR.py: Removed registry entry (moved to
402     __init__.py).
403    
404     * Extensions/bboxdump/__init__.py: Added registry entry and the importing
405     »···of the actual bboxdump module.
406    
407     * Extensions/bboxdump/bboxdump.py: Removed registry entry (moved to
408     »···__init__.py).
409    
410     * Extensions/svgexport/__init__.py: Added registry entry and the importing
411     of the svgsaver module.
412    
413     * Extensions/svgexport/svgsaver.py: Moved the menu entry from Extensions
414     to Experimental menu since this module has yet not reached a stable
415     status (ie. 1.0).
416    
417 jan 2397 2004-11-18 Jan-Oliver Wagner <[email protected]>
418    
419     Now the hit test considers the size of point symbols.
420    
421     * Thuban/UI/viewport.py (ViewPort._hit_point): Added optional parameter
422     'size' defaulting to the previously fixed value 5.
423     Extended doc-string.
424     (Viewport._find_shape_in_layer): Resolved FIXME regarding flexibility
425     for symbols.
426     Now the size of the largest point symbol is determined to find out
427     about whether the point has been hit.
428     This fixes the problem that only clicks inside a fixed distance of
429     5 where found.
430    
431 jan 2395 2004-11-17 Jan-Oliver Wagner <[email protected]>
432    
433 jan 2397 Another open issue fixed regarding sizeable symbols: correct rendering of
434 jan 2395 selected symbols.
435    
436     * Thuban/UI/renderer.py (ScreenRenderer.draw_selection_incrementally):
437     Added consideration of the specific size of point symbols.
438     The property for each point symbol is retrieved and the size applied
439     for the rendering method.
440     Added doc-string.
441    
442 jan 2393 2004-11-16 Jan-Oliver Wagner <[email protected]>
443    
444     Changed way of Extension Registry for gns2shp and profiling.
445    
446     * Extensions/gns2shp/gns2shp.py: Removed registry entry (moved to
447     __init__.py).
448    
449     * Extensions/gns2shp/__init__.py: Added registry entry and the importing
450     of the actual gns2shp module.
451    
452     * Extensions/profiling/profiling.py: Removed registry entry (moved to
453     __init__.py).
454    
455     * Extensions/profiling/__init__.py: Added registry entry and the importing
456     of the actual profiling module.
457    
458 bernhard 2388 2004-10-28 Bernhard Reiter <[email protected]>
459    
460     * Extensions/svgexport/: Minor improvements to doc strings.
461    
462 jan 2387 2004-10-07 Jan-Oliver Wagner <[email protected]>
463    
464     Further elements for sizable point objects now
465     making this feature usable though not yet complete.
466    
467     * Thuban/Model/save.py (SessionSaver.write_classification): Write
468     attribute 'size' for cldata when the shape layer is of point type.
469     This also now make the test_load.py tests happy.
470    
471     * Thuban/Model/classgen.py (CustomRamp.GetProperties): Added size
472     gradient.
473    
474     * Thuban/UI/classifier.py (ID_SELPROP_SPINCTRL): Renamed to
475     ID_SELPROP_SPINCTRL_LINEWIDTH.
476     (ID_SELPROP_SPINCTRL_LINEWIDTH): New Id replaces ID_SELPROP_SPINCTRL.
477     (ID_SELPROP_SPINCTRL_SIZE): New Id.
478     (SelectPropertiesDialog.__init__): Added a second spin control
479     for the size in case the corresponding layer is of point type.
480     (SelectPropertiesDialog._OnSpin): Renamed to _OnSpinLineWidth.
481     (SelectPropertiesDialog._OnSpinLineWidth): New. Former _OnSpin.
482     (SelectPropertiesDialog._OnSpinSize): New. Set size of property
483     and refresh preview.
484    
485    
486    
487 joey 2381 2004-10-04 Martin Schulze <[email protected]>
488    
489     * Extensions/wms/test/test_parser.py
490     (TestWMSCapabilitiesParser.test_compareLists): Added missing
491     self-test for compareLists()
492     (TestWMSCapabilitiesParser.test_compareDicts): Added missing
493     self-test for compareDicts()
494 joey 2382 (TestWMSCapabilitiesParser.test_compareLists): Adding more tests
495     to verify the test routine fails with non-equal arguments
496     (TestWMSCapabilitiesParser.test_compareDicts): Adding more tests
497     to verify the test routine fails with non-equal arguments
498 joey 2381
499 jan 2370 2004-10-03 Jan-Oliver Wagner <[email protected]>
500    
501 jan 2380 First elements for sizeable point objects.
502    
503     * Resources/XML/thuban-1.1.dtd: Added size attribute to cldata.
504    
505     * Data/iceland_sample_size.thuban: New. Sample for sized point objects.
506    
507     * test/test_load.py (ClassificationTest.TestLayers): Added SetSize in case
508     of a corresponding argument is given.
509     (TestSymbolSize): New. Test the size attribute of cldata.
510    
511     * Thuban/Model/classification.py: Removed some trailing whitespaces.
512     (ClassGroupProperties.__init__): Set default size.
513     (ClassGroupProperties.SetProperties): Set the size.
514     (ClassGroupProperties.GetSize): New. Return the size.
515     (ClassGroupProperties.SetSize): New. Set the size.
516     (ClassGroupProperties__eq__): Compare also size.
517     (ClassGroupProperties__repr__): Print also size.
518    
519     * Thuban/Model/load.py (SessionLoader.start_cldata): Also parse
520     the size attribute.
521    
522     * Thuban/UI/classifier.py (ClassDataPreviewer.Draw): Added doc-string.
523     Also, now there is a return value that indicates whether the drawing
524     size exceeded the given rect extent and if so the new extent.
525     Finally, point objects are drawn depending on the size. If either
526     the width or height is exceeded, the new extent is returned.
527     (ClassRenderer.Draw): Now when calling the previewer drawing function,
528     evaluate the return value and, if not None, adapt the grid widget size
529     accordingly and redraw again.
530    
531     * Thuban/UI/baserenderer.py (BaseRenderer.draw_shape_layer_incrementally):
532     If the draw function is for points, call it with the size as additional
533     parameter.
534     (BaseRenderer.draw_point_shape): Added additional, optional parameter for
535     the size. Compute the radius using the size.
536    
537     * Extensions/importAPR/apr.py (APR_BMkSym.GetThubanProp): Now
538     that Thuban supports size, apply this correctly.
539    
540     * Extensions/importAPR/importAPR.py: Bumped version to 0.1.1.
541    
542     2004-10-03 Jan-Oliver Wagner <[email protected]>
543    
544 jan 2370 * Doc/manual/thuban-manual-de.xml: Started translation of
545     Map chapter.
546    
547 joey 2368 2004-10-01 Martin Schulze <[email protected]>
548    
549     * Extensions/wms/properties.py (wmsProperties.__init__): Extended
550     argument for general use through properties-dialog selector
551    
552     * Thuban/UI/classifier.py: Register properties dialog classes for
553     both provided layer classes/types.
554    
555     * Thuban/UI/mainwindow.py (MainWindow.OpenLayerProperties): The
556     map can be retrieved through the parent which is passed to the
557     constructor anyway and doesn't require an argument of its own,
558     required for the unification of arguments for general use through
559     properties-dialog selector.
560     (MainWindow.OpenOrRaiseDialog): Move the logic for checking
561     whether a dialog is already opened (and raising it to the users
562     attention) and creating a new dialog into a function of its own
563     (MainWindow.OpenLayerProperties): Use the new OpenOrRaiseDialog()
564     method
565     (MainWindow.OpenLayerProperties): Utilise the new ClassMapper for
566     global registration of properties dialog classes (which are indeed
567     layer-specific).
568    
569     * Thuban/UI/classifier.py (Classifier.__init__): Unify arguments
570     for general use through properties-dialog selector, the map can be
571     retrieved through the parent and doesn't require an argument of
572     its own.
573    
574     * Extensions/wms/wms.py: Register the properties dialog class for
575     the provided WMS layer
576    
577 jan 2358 2004-09-28 Jan-Oliver Wagner <[email protected]>
578    
579     New feature: Registry for Extensions.
580    
581     * Thuban/UI/extensionregistry.py: This module defines a registry for
582     Extensions.
583    
584     * Thuban/UI/about.py (About.__init__): Added description
585     of the registered extensions with all of the information.
586    
587     * Thuban/Model/extension.py (Extension): Improved doc-string.
588    
589     * Extensions/gns2shp/gns2shp.py, Extensions/importAPR/importAPR.py,
590     Extensions/bboxdump/bboxdump.py, Extensions/profiling/profiling.py,
591     Extensions/wms/wms.py: Added registration of the extension.
592    
593 bernhard 2352 2004-09-27 Bernhard Reiter <[email protected]>
594    
595     More fixes to svgexport to make used ids unique and
596     conforming to XML's Name production.
597    
598     * Extensions/svgexport/test/test_svgmapwriter.py: Added new tests
599     test_xml_id_constraints(), test_make_ide_nosetbaseid() and
600     test_make_id_nonintegersetid(). Switched SetID and SetBaseID.
601     Added Bernhard R. as author.
602     * Extensions/svgexport/svgmapwriter.py (make_id): Using "_" as
603     concatenation char now (makes test_make_ide_nosetbaseid() valid).
604     Also transform second id part with "%d" and catch the TypeError
605     to raise SVGMapWriterError (making test_make_id_nonintegersetid() ok).
606     Corrected typo inBernhard's author line.
607     (SetBaseID): Return the transformed base id. Transform characters
608     which are not alnum() or in ".-_" to binascii.b2a_hex(). Added
609     import binascii. If to be set string starts with "xml" or so, add "t".
610     (draw_shape_layer_incrementally): use the returned value of SetBaseID
611     for used_baseids checks.
612    
613 bh 2351 2004-09-25 Bernhard Herzog <[email protected]>
614    
615     * test/test_layer.py (TestLayer.test_arc_layer_with_projection):
616     Remove a debug print and some tab characters.
617    
618 bernhard 2350 2004-09-25 Bernhard Reiter <[email protected]>
619    
620     * Extensions/svgexport/svgmapwriter.py: Added Bernhard R. as Author.
621     (SetBaseID, SetID, make_id): Improved docstring comments to explain
622     the interaction of the three functions and the XML id contrains.
623    
624 bernhard 2352
625 jan 2346 2004-09-23 Jan-Oliver Wagner <[email protected]>
626    
627 jan 2349 * Doc/ThubanModel.xmi: New. UML file for Thuban Model
628     Module.
629    
630     * Doc/README: Added info on ThubanModel.xmi.
631    
632     2004-09-23 Jan-Oliver Wagner <[email protected]>
633    
634 jan 2346 * Doc/README: New. Some info about how to generate technical
635     documentation from the source code.
636     This text was send to the Thuban developer mailing list on
637     September 21st 2004 by Bernhard Reiter.
638    
639 bernhard 2344 2004-09-21 Bernhard Reiter <[email protected]>
640    
641     Improved the svgexport to only use unique ids. Will issues
642     an error message dialoge when two layer names are the same.
643     ShapeIDs are now added with a dash within the svg ids.
644    
645     * Extensions/svgexport/svgmapwriter.py (SVGMapWriterError): New.
646     * Extensions/svgexport/test/test_svgmapwriter.py: Added imports
647     (TestSVGRenderer): New test class with test_make_in() and
648     test_check_for_layer_name_clash()
649     * Extensions/svgexport/svgmapwriter.py (SVGRenderer): Fixed __init__()
650     and draw_shape_layer_incrementally() to not use a baseid twice,
651     satisfying test_check_for_layer_name_clash()
652     (VirtualDC.make_id): Use a dash between baseit and id, satisfies
653     test_make_in().
654     * Extensions/svexport/svgsaver.py: Import SVGMapWriterError, wxOK
655     and wxICON_HAND.
656     (write_to_svg): Put dc and rendering in a try statement and on
657     catching SVGmapWriterError notify the user and delete the target file.
658    
659 bernhard 2343 2004-09-20 Bernhard Reiter <[email protected]>
660    
661     * Model/base.by, Model/layer.py: Fixed typos in docstrings.
662    
663 jschuengel 2342 2004-09-03 Jan Schüngel <[email protected]>
664    
665     * Extensions/umn_mapserver/mapfile(MF_Class.add_thubanstyle): Fix a
666     small bug with the line color. Now the line color will now only set
667     if it is set in Thuban an not Transparent.
668    
669     * Extensions/umn_mapserver/mf_export(tblayer_to_map): Fixed a bug with
670     deleting the layers from mapfile. Now all layers will delete backwards
671     from the last.
672    
673 silke 2339 2004-08-20 Silke Reimer <[email protected]>
674 silke 2338
675 silke 2339 * Thuban/Model/layer.py:
676     Fixes bug in projection handling: Otherwise very large region might not
677     have valid values in the layer's projection.
678    
679     2004-08-20 Silke Reimer <[email protected]>
680    
681 silke 2338 * Thuban/UI/about.py:
682     small changes to be consistent with coding style.
683    
684 joey 2337 2004-08-13 Martin Schulze <[email protected]>
685    
686     * Extensions/wms/test/test_ogclib.py (TestOGCLib.compare_URLs):
687     Adjusted a comment
688    
689 silke 2335 2004-08-11 Silke Reimer <[email protected]>
690 silke 2334
691 silke 2335 * Thuban/UI/about.py: Small changes to encoding related stuff to avoid
692     too many and too enhanced imports of locale
693    
694 silke 2334 2004-08-10 Silke Reimer <[email protected]>
695    
696     * Thuban/UI/about.py: Fixed encoding problem of about dialog: Added
697 silke 2339 function unicodeToLocale() to convert special characters to users
698     locale encoding
699 silke 2334
700 jan 2333 2004-08-10 Jan-Oliver Wagner <[email protected]>
701    
702     * Doc/technotes/coding_guidelines.txt: Added rule 'Method names start with
703     lower case letter'
704    
705 jschuengel 2331 2004-08-09 Jan Schüngel <[email protected]>
706    
707     * ChangeLog: Rewrite the last ChangeLog entry to follow
708     the standard way.
709    
710     * Extensions/umn_mapserver/mapfile: Moved the import AnnotationLayer to
711     the function where it is needed, because it don't works if it stands
712     at the beginning.
713     (MF_Layer.__init__): Removed the extra numclassed variable. Now
714     numclasses from the mapscript will be used.
715     (MF_Layer.get_index): New. Return the index of the layer in mapfile.
716     (MF_Layer.set_classes): New. A Classlist will be set to the layer.
717     (MF_Layer.set_metadata): New. A Metadata mapscript object will set.
718     (MF_Layer.remove_allclasses): New. All class of the layer will remove.
719     (MF_Map.create_new_layer): New. A new Layer is created and associated
720     with the mapscript object.
721     (MF_Map.set_layerorder): New. The Layer order like in thuban is set in
722     the mapscript.
723     (MF_Map.add_thubanlayer): Now a new layerobj is created if no one is
724     linked to the layer in thuban, else the layerobject linked to the
725     thubanlayer will be used.
726     AnnotationLayer will now store the filename of the shapefile.
727     (MF_Map.remove_layer): If a layer is removed the associated object
728     must be set new.
729    
730     * Extensions/umn_mapserver/mf_export.py(tb_layer_to_map): Add all
731     layers which are exists in thuban to the mapobj. All removed Layers
732     will be removed from the mapobj.
733     Added comments to all functions.
734     (thuban_to_map): No layer will be removed here.
735    
736     * Extensions/umn_mapserver/mf_handle.py
737     (_has_umn_mapobj_and_selectedlayer): Activating the layer menu. Now
738     Layersettings for the mapserver kann be edited.
739    
740     * Extensions/umn_mapserver/mf_import.py: Now all layers which are
741     imported, will be linked with the associated MF_Layer.
742     (import_mapfile): All layers, which are not selected, will be removed.
743     Disable the "import layer from mapfile" menu option.
744    
745     * Extensions/umn_mapserver/sample/iceland.map: Set the status of the
746     Annotation Layer from DEFAULT to OFF. The DEFAULT setting turns the
747     layer on permanently.
748    
749 jschuengel 2323 2004-08-03 Jan Schüngel <[email protected]>
750    
751 jschuengel 2331 * Extensions/umn_mapserver/mapfile.py(MF_Metadata.remove_allmetadata):
752     New. This function removes all metadata
753     (MF_Layer.set_group): New. Set the group setting.
754     (MF_Layer.get_group): New. Get the group setting.
755     (MF_Map): Removed the extra numlayers variable, used the mapscript
756     parameter instead.
757     (MF_Map.get_numlayers): New. This get numlayers.
758     (MF_Map.remove_all_layers): New. Removes all layers from the mapobj.
759 jschuengel 2323 (MF_Map.add_thubanlayer): Replaced the exception handling by a check
760     if the object is an instance. Also added the annotation layer here to
761     export, but only the layer is created in the mapfile.
762    
763 jschuengel 2331 * Extensions/umn_mapserver/mf_export.py(export_mapfile): Removed
764     the check if a mapobj exist, because its not needed anymore. The
765     export function is only available if a mapobj exist.
766     Use the new function to remove all layers.
767 jschuengel 2323
768 jschuengel 2331 * Extensions/umn_mapserver/mf_handle.py(Layer_Dialog): Added a group
769     option and the metadata button. The layer dialog is temporary disabled.
770     (Metadata_CustomDataTable): Added some functions to show the grid
771 jschuengel 2323 correct.
772    
773 jschuengel 2331 * Extensions/umn_mapserver/mf_import.py: Moved the code for showing
774     the number of layer from import_mapfile to this function.
775     (AnnotationLayer): New. This Class shows the Annotation layer in
776     thuban. The layer don't do anything. It's only to show the layer
777     and to save the layer order.
778     (add_annotationlayer): New. Import an annotation layer to thuban.
779     (select_layer2import): New. Import only layers to thuban and not
780     the other settings like projection or scalebar.
781     (create_new_mapfile): Moved the _has_umn_mapobj function and the
782     create_new_mapfile functions from mf_handle.py to mf_import.py.
783 jschuengel 2323
784     * Extensions/umn_mapserver/sample/iceland.map: Added the group
785     parameter to the roads and cultural layers. Also added a new
786     Annotation Layer for the cultural points.
787    
788     * Extensions/umn_mapserver/sample/iceland.html: Added the select
789     option for the annotation layer.
790    
791     * Extensions/umn_mapserver/sample/index.html: Added the start
792     parameter for the annotation layer.
793    
794 jan 2315 2004-08-01 Jan-Oliver Wagner <[email protected]>
795    
796     * Doc/manual/thuban-manual-de.xml (Chapter Session Management):
797     translation completed.
798    
799     * Doc/manual/thuban-manual.xml (Chapter Session Management):
800     Fixed unprecise description for Save Session.
801    
802 jan 2312 2004-07-31 Jan-Oliver Wagner <[email protected]>
803    
804     Started translation of Users Manual into german.
805    
806     * Doc/manual/thuban-manual-de.xml: New. German Users Manual.
807    
808     * Doc/manual/Makefile: Added build instructions for german
809     users manual.
810    
811     * Doc/manual/thuban-manual.xml: Minor corrections in Introduction.
812    
813 jschuengel 2308 2004-07-28 Jan Schüngel <[email protected]>
814    
815     * Extensions/umn_mapserver/mapfile.py(MF_Metadata): Changed all class
816     functions. Now all metadata will handle by the function and its not
817     needed to initialize it from outside. Therefor the associated mapobj
818     will be stored in the Metadata Object. So we can use the special
819     functions from the associated mapobj to get the Metadata.
820     Therefor all initialization code for the metadata is removed from the
821     other classes.
822     (MF_Layer): Added a function to get the metadata object.
823     (MF_Map): Added a function to set the mappath, the path where
824     the mapfile ist stored.
825    
826     * Extensions/umn_mapserver/mf_export.py(thuban_to_map): Changed the code
827     to set the extent in the mapfile. Now the code is set by the displayed
828     data in the Thuban-view.
829     (export_mapfile): The shapepath is now set empty, until relative
830     pathnames are supported.
831    
832     * Extension/umn_mapserver/mf_handle.py: Added a dialog to handle
833     metadata. Yet only mapfile metadata are supported. Layer and class
834     supported are not implemented.
835     Added a dialog to handle layer informations. The dialog only shows the
836     selected layer at the moment.
837    
838     * Extensions/umn_mapserver/mf_import.py(import_mapfile): Changed the
839     code for setting the extent in thuban. Now the extent is set to the
840     given extent from the mapfile.
841     Fixed a logical mistake. Now the extent is set when realy a layer is
842     loaded, and not if one is selected to load.
843    
844     * Extensions/umn_mapserver/sample/iceland.html: Added code to zoom and
845     move the shown map in the browser.
846    
847     * Extensions/umn_mapserver/sample/iceland.map: Added a new metadata
848     line to the mapobj and added metadata to the political layer.
849    
850     * Extensions/umn_mapserver/test/test_mapserver.py: Changed the test
851     for Metadata.
852    
853 joey 2300 2004-07-26 Martin Schulze <[email protected]>
854    
855     * Thuban/Lib/classmapper.py (ClassMapper.has): Added the new
856     ClassMapper
857    
858     * test/test_classmapper.py (TestMapping.test_mapper): Added a Test
859     case for the new ClassMapper
860    
861    
862 bh 2296 2004-07-22 Bernhard Herzog <[email protected]>
863    
864 bh 2297 * Thuban/UI/viewport.py (ViewPort.VisibleExtent): New. Return the
865     visible extent of the map in projected coordinates
866    
867     * test/test_viewport.py (SimpleViewPortTest.test_default_size)
868     (SimpleViewPortTest.test_init_with_size): Add some VisibleExtent()
869     tests.
870     (SimpleViewPortTest.test_visible_extent): New. The real test for
871     VisibleExtent()
872    
873     2004-07-22 Bernhard Herzog <[email protected]>
874    
875 bh 2296 * test/test_viewport.py: Use support.run_tests as the main
876     function when running asa script.
877    
878 jschuengel 2295 2004-07-22 Jan Schüngel <[email protected]>
879    
880     * Extensions/umn_mapserver/mf_export.py: Added "import os"
881     Removed the old "import Thuban.UI.mainwindow" code.
882     (tbextent_to_map): Removed the extra function and at the code direct
883     to "thuban_to_map" function.
884     (write_creatorcomment): Added. Now a short comment is added to the
885     beginning of an generated mapfile.
886     (export_mapfile): Now the Path and filename are saved in to variables,
887     and not together in one variable. This is needed for the new
888     write_creatorcomment function.
889    
890     * Extensions/umn_mapserver/mf_import.py (import_mapfile): Added the
891     import module "re". Also added Range and the ClassGroupRange import
892     from Thuban. Both are needed for the new range expression import.
893     (create_rangeexpression): Added. Creates a Range Expression in Thuban
894     style from a given mapfile expression.
895     (added_rasterlayer): Make some small code changes. The shapepath is
896     now stored in an extra variable and the clazz_name is set empty if no
897     class name set in the mapfile.
898     Changed the Error message for Range Expressions, becaus the new
899     function create a error string which will be shown in the dialog.
900    
901     * Extensions/umn_mapserver/test/test_mapserver.py: Added a test for the
902     range expression import.
903 jan 2312
904 jan 2291 2004-07-21 Jan-Oliver Wagner <[email protected]>
905    
906     * Extensions/umn_mapserver/README: Added hint that
907     installation as root can be avoided. Removed all tabs.
908    
909 bh 2289 2004-07-16 Bernhard Herzog <[email protected]>
910    
911     * test/test_viewport.py
912     (ViewPortTest.test_changing_map_projection): Check that changing
913     the projection of an empty map shown in a viewport doesn't lead to
914     exceptions in the viewport's handler for the
915     MAP_PROJECTION_CHANGED messages
916    
917     * Thuban/UI/viewport.py (ViewPort.map_projection_changed): Only
918     try to keep the same region visible when the map actually contains
919     something
920    
921 jschuengel 2288 2004-07-15 Jan Schüngel <[email protected]>
922    
923     * Extensions/umn_mapserver/mapfile.py: Added a function to get the
924     mappath directly from the mapobj. Is needed because of the changes
925     in mf_import.py.
926     (MF_Layer.add_thubanclass): Added a new comment.
927     (MF_Map.set_extent): Fixed a bug with exporting empty mapobj. If the
928     mapobj is empty there is no extent get from thuban an so no one can
929     set to th mapobj.
930    
931     * Extensions/umn_mapserver/mf_import.py (import_mapfile): Updated
932     the discription.
933     Split the funktion in to three smaller ones. The new functions are
934     add_rasterlayer, add_polygonlayer and select_layer2import.
935     Removed the mapfilepath and filepath initialisation, because its know
936     include in the new functions.
937     Now nothing will be imported if cancel is pressed in the
938     layer choice dialog.
939    
940 jschuengel 2285 2004-07-14 Jan Schüngel <[email protected]>
941    
942     * Extensions/umn_mapserver/mapfile.py: Added ClassGroupDefault to
943     import.
944     (MF_Symbolset): Removed the extra variable for numsymbols.
945     (MF_Class.__init__): Added a comment to the exception clause.
946     Removed the extent init, because it was not needed anymore.
947     (MF_Layer.add_thubanclass): Added the code to set the class name to
948     the expression value from thuban if no label is defined.
949     Added the code to export Range expressions from thuban to the mapfile.
950     (MF_Map.set_extent): Removed the exception and replace it by some if
951     code. If the size of a map is not defined the size will be set to 1,1.
952     This is necessary because if the extent is set, mapscript checks if
953     the size is greater than zero.
954     (MF_Web): Added the get and set function for the template.
955    
956     * Extensions/umn_mapserver/mf_export.py: Added the function to check
957     if a mapobject exists and used it to set the status of the menu items.
958     If no mapfile exists the settings could not be edditied.
959     Define after which menuitem the exportitem will include.
960    
961     * Extensions/umn_mapserver/mf_handle.py: Removed the import
962     Thuban.UI.mainwindow clause, because it is not needed.
963     Added the command Refresh() to all "OnChangeColor()" functions,
964     because the color preview window was not updated on a color change.
965     Added the function to check if a mapobject exists and used it to set the
966     status of the menu items. If no mapobject exists the settings could not
967     be edditied.
968     (Map_Dialog): Moved the imagetype selector from the
969     Outputformat_Dialog to Map_Dialog and removed Outputformat_Dialog.
970     (Web_Dialog): Removed the name label and added the template textbox.
971    
972     * Extensions/umn_mapserver/mf_import.py (import_mapfile): Replace
973     the exception handling on loading the layers by an if statement. It
974     is not necessary to us the exception there.
975     The Filepath creation now use os.path.join to build the path.
976    
977     * Extensions/umn_mapserver/test/test_mapserver.py: Moved the testMap
978     definition from global to the setUp function. Now the testMap will
979     initialize new on each test.
980    
981     * Extensions/umn_mapserver/sample/iceland.map: Include three new
982     classes in the Line Layer, to test logical Expressions.
983     Set the status of the class "Point9" in the Point Layer to off
984    
985 bh 2278 2004-07-13 Bernhard Herzog <[email protected]>
986    
987     * Thuban/UI/baserenderer.py
988     (BaseRenderer.render_map_incrementally): Fix a logic bug in the
989     optimization that tries not to draw layers under a raster layer.
990     The bug was harmless. All it effectively did was to produce The a
991     strange messages about not being able to draw Layer instances for
992     all vector layers below a raster layer which would be invisible
993     anyway because the raster layer currently always covers the entire
994     window
995    
996 jschuengel 2277 2004-07-08 Jan Schüngel <[email protected]>
997    
998     * Extensions/umn_mapserver/mapfile.py: Added code to generade and get
999     a list of supported outputformats. This formats are not alle supported
1000     because there is no possibility to get the outputformat without the
1001     name known. Make some formal changes to the code.
1002     (MF_Map.set_name()): Fixed a bug if the name is None.
1003    
1004     * Extensions/umn_mapserver/mf_handle.py: Removed the image_type import
1005     statement, because its not needed anymore. The Outputformat is now
1006     given as string from the object. Make some formal changes to the code.
1007    
1008     * Extensions/umn_mapserver/test/test_mapserver.py: Added new test for
1009     most of the new setting which were added during the last changes.
1010     Removed the MF_Size Test.
1011    
1012     * Extensions/umn_mapserver/test/test.map: Added a new class to the
1013     cultural Layer to test expressions and the the status of that layer
1014     from on to default.
1015     Changed the data path the the correct Thuban Data
1016     Added the Outputformat Object and Symbol Object
1017    
1018 jschuengel 2272 2004-07-07 Jan Schüngel <[email protected]>
1019    
1020     * Extensions/umn_mapserver/mapfile.py: Added some new
1021     settings to edit (outputformat, label, imagetype)
1022    
1023     * Extensions/umn_mapserver/mf_handle.py: Added some setting to
1024     the Label Dialog and add the OutputDialog.
1025     Make some changes to the code order.
1026    
1027 jschuengel 2269 2004-07-06 Jan Schüngel <[email protected]>
1028    
1029     * Extensions/umn_mapserver/mapfile.py: Added the symbolObj, pointObj
1030     and line Obj and add the scalebar_status_type, scalebar_style_type and
1031     scalebar_position_type.
1032     Added the symbol- and symbolsetObject (MF_Symbol,MF_Symbolset). The
1033     are only used to create a Symbol like the circle in Thuban.
1034     Added the scalebarObject (MF_Scalebar)
1035     (MF_Class): Added set_status and get_status.
1036     (MF_Layer.add_thubanclass): Added code to set the class status
1037     (MF_Map): Added code to handle the symbols and scalebar
1038     (MF_Label): Added the set_partials and get_partials functions
1039    
1040     * Extensions/umn_mapserver/mf_export.py: Added MF_Symbol to import
1041     from mapfile. Added a function to create a circle object like the one
1042     from thuban if no one exists.
1043    
1044     * Extensions/umn_mapserver/mf_handle.py: All colors are now set when
1045     press ok in the assosiated dialog and not at the end of the
1046     colordialog.
1047     Added the Dialog for the Scalebar.
1048     (Label_Dialog): Added the offset option
1049    
1050     * Extensions/umn_mapserver/mf_import.py: Added code to import the
1051     status of the Classes.
1052     Fixed a bug with the projection. Now the to_meter parameter will be
1053     added to the Projection only if it doesn't exists.
1054    
1055 jschuengel 2264 2004-07-01 Jan Schüngel <[email protected]>
1056    
1057     Added the functionality to handle the content thuban is not
1058     able to handle directly.
1059    
1060     * Extensions/umn_mapserver/mf_handle.py: New. This module extents
1061     Thuban with the possibility to edit the mapfile content.
1062    
1063     * Extensions/umn_mapserver/mf_import.py: Added the possibility
1064     to import mapfiles without any layer selected. So it is possible
1065     to edit the other settings in a mapfile.
1066     (import_mapfile): Added code to use the editing functions.
1067     Added the possibility to import the projection to a layer if one
1068     is defined.
1069     Status settings (On,Off) will now set in thuban (visible, invisible).
1070     fixed a bug with with classnames. If no classname is set in mapfile
1071     the value in Thuban will set to the expression.
1072    
1073     * Extensions/umn_mapserver/mf_export.py(export_mapfile): Added the
1074     possibility to save a new mapfile or use the old one which is
1075     imported or new created.
1076     Added code to use the editing functions.
1077     Remove some not needed import statements
1078    
1079     * Extensions/umn_mapserver/mapfile.py: Added new types which are
1080     need for the editing functions.
1081     Added needed set-functions for the editing functions.
1082     Added the possibility to export rasterimages.
1083     Added new classes (MF_Web, MF_Label, MF_Legend, MF_Symbol,
1084     MF_SymbolSet). MF_Symbol and MF_SymbolSet are not needed at the
1085     moment.
1086     (MF_Class.set_thubanstyle): Now point layers will set to a default
1087     symbol to show a circle in mapserver and not only a 1px dot.
1088     (MF_Style.__init__): Fixed a bug with the color. Color was not set
1089     correct before.
1090     (MF_Size): Removed, because it is not needed.
1091    
1092     * Extensions/umn_mapserver/README: Added the hints to use the
1093     export and editing functions, too.
1094    
1095     * Extensions/umn_mapserver/sample/iceland.map: Added the
1096     new parameter "UNITS METERS".
1097     Change the political layer to status OFF.
1098    
1099     * Extensions/umn_mapserver/sample/README: Added some
1100     more details to setup the sample in the MapServer.
1101    
1102 bernhard 2256 2004-06-26 Bernhard Reiter <[email protected]>
1103    
1104     * Extensions/svgexport/test/test_svgmapwriter.py:
1105     Removed class VFile and used standard StringIO instead.
1106    
1107 jschuengel 2255 2004-06-23 Jan Schüngel <[email protected]>
1108    
1109     Add the export function to the umn_mapserver extension.
1110    
1111     * Extension/umn_mapserver/mf_export.py: New. This module extents
1112     Thuban with the possibility to export the Thuban content.
1113    
1114     * Extensions/umn_mapserver/mapfile.py: Expand the classes to use
1115     with the export module. Especially added the possibility to
1116     add thuban objects directly to the map objects.
1117    
1118     * Extensions/umn_mapserver/mf_import.py: Removed the wxCHANGE_DIR,
1119     because of the hint from Bernhard Herzog.
1120     Corrected the handling of absolute pathnames.
1121     Changed the Text of the Menu-Item, now the beginning is upper case.
1122    
1123     * Extensions/umn_mapserver/README: Added the --with-tiff statement.
1124    
1125 jschuengel 2250 2004-06-16 Jan Schüngel <[email protected]>
1126 jschuengel 2242
1127 jschuengel 2250 Add a sample and make some changes.
1128    
1129     * Extension/umn_mapserver/mf_import.py: Changed the wxPython.wx
1130     import from * to explicit used statements. Changed the
1131     Thuban.UI.mainwindow import phrase, too.
1132     (import_mapfile):Corrected a clerical mistake.
1133     Added wxCHANGE_DIR in OpenFile Dialog.
1134     Added a MultipleChoiceDialog, to select the layers to load from
1135     mapfile into thuban. Thereby the projection is only set if one layer
1136     is selected.
1137     Added the possibility to handle relative pathnames which uses
1138     up-level references.
1139     Removed some doubled code.
1140     Corrected an error with integer values used as label in thuban
1141     ClassGroup.
1142    
1143     * Extensions/umn_mapserver/sample: New.
1144    
1145     * Extensions/umn_mapserver/sample/README: New. Describes the
1146     usage of the sample files.
1147    
1148     * Extensions/umn_mapserver/sample/iceland.map: New. This is
1149     a suitable .map-file for the iceland data.
1150    
1151     * Extensions/umn_mapserver/sample/index.html: New. The template
1152     for the mapfile.
1153    
1154     * Extensions/umn_mapserver/sample/iceland.html: New. Initialisation
1155     file for the Iceland Application on web.
1156    
1157     * Extensions/umn_mapserver/README: Corrected a inaccuracy and added
1158     some details.
1159    
1160     * Extensions/umn_mapserver/test/test_mapserver
1161     (mapserver_import_Test_generalClasses.test_MF_Color):
1162     Corrected the thubancolor test.
1163    
1164     2004-06-15 Jan Schüngel <[email protected]>
1165    
1166 jschuengel 2242 * Extensions/umn_mapserver/README: New. Install instruction.
1167    
1168 bernhard 2240 2004-06-14 Bernhard Reiter <[email protected]>
1169    
1170     * libraries/thuban/cpl_mfile.h: Added copyright header.
1171    
1172     * libraries/thuban/ cpl_mfile.cpp, cpl_mfile.h: Added non-protecting
1173     Free Software License so that it is most useful with gdalwarp
1174     and bmpdataset.
1175    
1176 bh 2239 2004-06-14 Bernhard Herzog <[email protected]>
1177    
1178     * Thuban/UI/multiplechoicedialog.py (__version__): Add missing
1179     import of wxPython.wx itself (as opposed to the contents of
1180     wxPython.wx). For some reason wxPython.wx is available as
1181     wxPython.wx.wx in at least some 2.4 releases. Fixes RT#2482
1182     wrt. wxPython 2.4.
1183    
1184 jschuengel 2238 2004-06-10 Jan Schüngel <[email protected]>
1185    
1186     Initial version of new extension "umn_mapserver". This extension aims
1187     to manage configuration for the UMN MapServer application. This
1188     inital version just imports the .map-files and displays all, Thuban is
1189     capable of.
1190    
1191     * Extensions/umn_mapserver, Extensions/umn_mapserver/test: New.
1192    
1193     * Extensions/umn_mapserver/test/README: New. Describes how to run the
1194     tests.
1195    
1196     * Extensions/umn_mapserver/test/test.map: New. This is a test
1197     .map-file for automated tests of the umn_mapserver extension of
1198     Thuban.
1199    
1200     * Extensions/umn_mapserver/test/test_mapserver.py: New. Tests for
1201     UMN Mapserver classes.
1202    
1203     * Extensions/umn_mapserver/__init__.py: New. Init to make this
1204     directory a package.
1205    
1206     * Extensions/umn_mapserver/mapfile.py: New. Classes to represent
1207     '.map'-file objects.
1208    
1209     * Extensions/umn_mapserver/mf_import.py: New. This module extends
1210     Thuban with the possibility to handle UMN MapServer mapfiles.
1211    
1212 bh 2230 2004-06-03 Bernhard Herzog <[email protected]>
1213    
1214     * Thuban/Model/layer.py (Layer.TreeInfo): Convert the bounding box
1215     to a tuple before using it as arguments to the % operator. This
1216     fixes the formatting issue filed in RT#2239 on 2004-01-13 and
1217     reported today on thuban-list by Jan Schüngel
1218    
1219     * test/test_layer.py (TestLayerModification.setUp): Save the
1220     filename as an instance variable so we can refer to it in tests
1221     (TestLayerModification.test_tree_info): Uncomment this method
1222     again and make it work. This tests for the formatting issue
1223     filed in RT#2239 on 2004-01-13
1224    
1225 bh 2224 2004-05-28 Bernhard Herzog <[email protected]>
1226    
1227     * Thuban/UI/baserenderer.py: Fix some typos.
1228    
1229 jan 2217 2004-05-18 Jan-Oliver Wagner <[email protected]>
1230    
1231     * Extensions/gns2shp/gns2shp.py (gns2shp): Fixed a bug
1232     by increasing a field size.
1233    
1234 bh 2213 2004-05-17 Bernhard Herzog <[email protected]>
1235    
1236     Update to newest shapelib and get rid of Thuban specific
1237     extensions, i.e. use the new DBFUpdateHeader instead of our
1238     DBFCommit kludge
1239    
1240     * libraries/shapelib/shpopen.c: Update to version from current
1241     shapelib CVS.
1242    
1243     * libraries/shapelib/shapefil.h: Update to version from current
1244     shapelib CVS.
1245    
1246     * libraries/shapelib/dbfopen.c: Update to version from current
1247     shapelib CVS.
1248     (DBFCommit): Effectively removed since shapelib itself has
1249     DBFUpdateHeader now which is better for what DBFCommit wanted to
1250     achieve.
1251     We're now using an unmodified version of dbfopen.
1252    
1253     * setup.py (extensions): Add the HAVE_UPDATE_HEADER macro with
1254     value '1' to the Lib.dbflibc extension. This simply reflects the
1255     shapelib and pyshapelib updates
1256    
1257 jan 2211 2004-05-16 Jan-Oliver Wagner <[email protected]>
1258    
1259     Finished introduction of Menu.FindOrInsertMenu.
1260    
1261     * Extensions/drawshape/drawshape.py: Add the command
1262     to the experimental menu additionally to the toolbar.
1263    
1264     * Extensions/svgexport/svgsaver.py: Use FindOrInsertMenu() instead of
1265     finding menu on its own.
1266    
1267     * Doc/manual/thuban-manual.xml: updated sample file
1268     to use FindOrInsertMenu().
1269    
1270     * Examples/simple_extensions/hello_world.py: Use FindOrInsertMenu()
1271     instead of finding menu on its own.
1272    
1273 jan 2206 2004-05-11 Jan-Oliver Wagner <[email protected]>
1274    
1275     * test/test_menu.py (MenuTest.test): Added testing
1276     of method Menu.FindOrInsertMenu.
1277    
1278 jan 2204 2004-05-10 Jan-Oliver Wagner <[email protected]>
1279    
1280     Introduce and use Menu.FindOrInsertMenu.
1281    
1282     * Thuban/UI/menu.py (Menu.FindOrInsertMenu): New. Find a
1283     given menu or, if not found, insert it.
1284    
1285     * Extensions/bboxdump/bboxdump.py, /Extensions/gns2shp/gns2shp.py,
1286     /Extensions/importAPR/importAPR.py, Extensions/profiling/profiling.py,
1287     /Extensions/wms/wms.py: Use FindOrInsertMenu() instead of finding
1288     menu on its own.
1289    
1290 jan 2201 2004-05-06 Jan-Oliver Wagner <[email protected]>
1291    
1292     Introduce a abstract ColorDialog class and remove
1293     and outdated file.
1294    
1295     * Thuban/UI/proj4dialog.py: Removed. It is has been
1296     replaced by projdialog for quite a while and is not used
1297     anymore.
1298    
1299     * Thuban/UI/colordialog.py: New. Abstraction for color selection
1300     dialog(s).
1301    
1302     * Thuban/UI/classifier.py (SelectPropertiesDialog.__GetColor):
1303     Now calls the abstract ColorDialog instead of wxColourDialog.
1304     This also removed the dependency to Color class conversion
1305     from this function.
1306    
1307 frank 2197 2004-05-04 Frank Koormann <[email protected]>
1308    
1309     * Extensions/bboxdump/__init__.py: Fixed string left over from
1310     copying.
1311    
1312     * Extensions/bboxdump/bboxdump.py (bboxdump):
1313     Use layer.ShapeStore().AllShapes() to loop over shapes instead of
1314     xrange(layer.NumShapes()). Compile the bboxmessage from a list
1315     of formatted outputs (string.join) instead of appending to the
1316     message. Two progress bar dialogs to report progress on the sometimes
1317     lenghty processing.
1318    
1319 frank 2196 2004-04-22 Frank Koormann <[email protected]>
1320    
1321     New Extension to dump bounding boxes of all shapes of the selected
1322     layer. An optional column can be specified to group the objects,
1323     in this case the bounding box is a union of the separate boxes.
1324     Dump can be displayed in a ScrolledMessageDialog or written to file.
1325     The Extension is simply a combination of available and well tested
1326     Thuban functionality.
1327    
1328     * Extensions/bboxdump/__init__.py: New: Init to make this
1329     directory a package.
1330    
1331     * Extensions/bboxdump/bboxdump.py: New: Dump bounding boxes of
1332     all shapes of the selected layer.
1333    
1334 jan 2192 2004-04-22 Jan-Oliver Wagner <[email protected]>
1335    
1336     * Thuban/UI/classgen.py (GenUniquePanel.__init__): Fixed two
1337     strings to be i18n now.
1338    
1339 jan 2188 2004-04-18 Jan-Oliver Wagner <[email protected]>
1340    
1341     Changing popup menu of legend from direct building
1342     to using the Menu construction as used for the mainwindow.
1343    
1344     * Thuban/UI/mainwindow.py: New method commands: layer_to_top,
1345     layer_to_bottom, layer_visibility
1346     (MainWindow.LayerToTop): New. Put current layer to the top.
1347     (MainWindow.LayerToBottom): New. Put current layer to bottom.
1348     (MainWindow.HideLayer, MainWindow.ShowLayer, _has_visible_map):
1349     Replace 1,0 by True, False.
1350     (MainWindow.ToggleLayerVisibility): New. Toggle visibility of
1351     current layer.
1352     (MainWindow.LayerShowTable): Removed raising of dialog.
1353     (_has_selected_layer_visible): New. Support function.
1354    
1355     * Thuban/UI/legend.py: ID_POP_xxx: removed.
1356     (LegendPanel.__init__): Removed EVT_MENU bindings.
1357     (LegendTree._OnRightClick): Replace direct creation of
1358     menu via wx Classes by applying the menu definition
1359     as of Menu class of menu.py.
1360    
1361 jan 2185 2004-04-16 Jan-Oliver Wagner <[email protected]>
1362    
1363     * Thuban/UI/exceptiondialog.py (ExceptionDialog.dialog_layout): Improved
1364     button string to stronger clearify that Thuban will be closed when hitting
1365     the button.
1366    
1367     * Thuban/UI/mainwindow.py (MainWindow.LayerShowTable): Added docstring.
1368     Now for layers without a ShapeStore a corresponding message is given
1369     to the user, that this layer has no table to show.
1370    
1371 joey 2182 2004-04-15 Martin Schulze <[email protected]>
1372    
1373     * Extensions/wms/layer.py (WMSLayer.setWMSFormat): Need to
1374     recalculate the format for the internal render engine as well.
1375    
1376     * Extensions/wms/properties.py (wmsProperties): First start for a
1377     properties dialog. It's functional for a first selection of
1378     layers, but still has some weired wxWidgets/GTK problems but
1379     beautification can be done later.
1380    
1381     * Extensions/wms/layer.py: Added more documentation
1382     (WMSLayer.getFormats): New: Return list of supported image formats
1383     by the WMS server
1384     (WMSLayer.getLayers): New: Return the list of layer names
1385     supported by the WMS server
1386     (WMSLayer.getLayerTitle): New: Return the title of the named layer
1387     (WMSLayer.getWMSFormat): New: Return the image format that is used
1388     for WMS GetMap requests
1389     (WMSLayer.setWMSFormat): New: Set the image format that is used
1390     for WMS GetMap requests
1391     (WMSLayer.__init__): Move away from using only one layer to using
1392     a list of layers (unsorted at the moment, though).
1393     (WMSLayer.getVisibleLayers): New: Return the list of names for all
1394     visible layers
1395     (WMSLayer.setVisibleLayers): New: Set the list of names for all
1396     visible layers
1397    
1398     * Extensions/wms/wms.py: Moved the WMS layer into layer.py in
1399     order to establish a clean structure.
1400    
1401     * Extensions/wms/layer.py: Moved the WMS layer into a file on its
1402     own in order to establish a clean structure.
1403    
1404 joey 2174 2004-04-13 Martin Schulze <[email protected]>
1405    
1406     * Extensions/wms/parser.py (WMSCapabilitiesParser.grok): Added
1407     support for oldstyle (WMS 1.0 apparently) image format
1408     specification.
1409    
1410     * Extensions/wms/wms.py (WMSLayer.calcFormat): Reduce the list of
1411     supported graphic formats back to JPEG and BMP, PNG and others are
1412     too *cough* experimental... Sorry, I meant to filter this out
1413     before I committed this part. This should make the WMS extension
1414     run from CVS again.
1415     (wms_dialog): Reset an empty URL to None so that the subsequent
1416     program can depend on this, since the dialog will indeed return an
1417     empty URL, causing another declaration of love by Python.
1418    
1419     * Extensions/wms/parser.py (WMSCapabilitiesParser.getLayerBBox):
1420     Whenever a native BoundingBox request cannot be fulfilled, check
1421     whether the requested SRS is EPSG:3426, in which case return the
1422     LatLonBoundingBox values.
1423    
1424     * Extensions/wms/test/test_parser.py
1425     (TestWMSCapabilitiesParser.test_LayerSRS): Added a test for
1426     ignoring AUTO:* SRS.
1427     (TestWMSCapabilitiesParser.test_LatLonBoundingBoxes_as_bboxes):
1428     Added another test method to test whether the LatLonBoundingBox
1429     values will be returned if BoundingBox values are requested with
1430     SRS set to EPSG:3426.
1431    
1432     * Extensions/wms/parser.py (WMSCapabilitiesParser.peekLayers):
1433     Added rudimentary support for non-EPSG SRS, i.e. ignore them for
1434     the moment by placing them into a variable which is currently
1435     unused. Also test whether the EPSG SRS is numerical as it should
1436     be and add an error message if it is not.
1437    
1438     * Extensions/wms/test/sample.xml: Added AUTO:* SRS since they
1439     appear in the real world as well. Since we cannot handle them yet
1440     (OGCLib can't either), we will ignore them for the moment.
1441    
1442     * Extensions/wms/parser.py: Use a variable for denoting the sample
1443     filename
1444     (WMSCapabilitiesParser.peekLayers): Added support for error
1445     messages during grok(). They will be aggregated in an array and
1446     may be displayed later. We may have to add a classification
1447     "Warning" and "Error" to this. That requires more experience,
1448     though, since not every error may be lethal.
1449    
1450     * Thuban/UI/mainwindow.py (MainWindow.LayerShowTable): Raise the
1451     ShowTable() dialog/frame when the user attempts to display it
1452     while it has been opened before already and not closed again.
1453    
1454 joey 2161 2004-04-11 Martin Schulze <[email protected]>
1455    
1456     * Extensions/wms/infodialog.py: Adjusted the class documentation
1457    
1458     * Extensions/wms/wms.py (WMSLayer.__init__, WMSLayer.GetMapImg):
1459     Switch to using Thuban{Begin,End}BusyCursor instead of the pure
1460     wxWidgets variants.
1461     (WMSLayer.__init__): The epsg_id variable is named top_srs now.
1462    
1463     * Extensions/wms/infodialog.py: Added an information dialog that
1464     will display various information about the WMS current resource,
1465     so that additional information such as the title, the abstract,
1466     fees and access constraints can be displayed for the user if they
1467     are documented in the WMS XML.
1468    
1469 joey 2156 2004-04-10 Martin Schulze <[email protected]>
1470    
1471     * Extensions/wms/parser.py (WMSCapabilitiesParser.grok): Adjusted
1472     string handling. It's "foo".lower() and not lower(foo) without
1473     lower imported from strings or something.
1474    
1475     * Extensions/wms/wms.py (WMSLayer): Incorporated WMSCapabilities
1476     from capabilities.py and parser.py. Implement priority list for
1477     supported graphics formats, take care of wbmp != bmp. PNG, TIFF
1478     and GIF are supported here, but not yet by main Thuban. Hence,
1479     support for them may be removed later. Special contribution to
1480     usability: get wxWidgets to change the cursor when we're waiting
1481     for data from the network so the user won't start to worry. This
1482     causes a redrawing error/warning, though.
1483    
1484     * Extensions/wms/parser.py (WMSCapabilitiesParser.grok): Unlink
1485     the DOM object.
1486    
1487     2004-04-01 Martin Schulze <[email protected]>
1488    
1489     * Extensions/wms/capabilities.py: Adjusted documentation
1490     (WMSCapabilities.__init__): Improved documentation, fixed syntax
1491     (WMSCapabilities.saveCapabilities): Only catch IOError when
1492     handling files
1493     (WMSCapabilities.loadCapabilities): Only catch IOError when
1494     handling files
1495     __main__: corrected variable naming
1496     (WMSCapabilities.fetchCapabilities,loadCapabilities): Make this
1497     class a specialisation of WMSCapabilitiesParser as well. Also
1498     execute grok() after loading or fetching capabilities, if that
1499     went well, so that subsequent calls can already access the data.
1500     (WMSCapabilities.getVersion): Export the used version of the
1501     GetCapabilities request, so we can use it for subsequent calls,
1502     i.e. for GetMap requests.
1503     (WMSCapabilities.fetchCapabilities): Added proper error handling
1504     when the GetCapabilities request failed, so that the surrounding
1505     program can act accordingly.
1506    
1507 joey 2146 2004-03-30 Martin Schulze <[email protected]>
1508    
1509     * Extensions/wms/parser.py (WMSCapabilitiesParser.getLayerSRS):
1510     Adjusted the getLayerSRS method to return the list of SRSes
1511     extracted from <SRS> elements instead of <BoundingBox> elements.
1512     Added a bit of documentation as well.
1513     (WMSCapabilitiesParser.checkLayerSRS): Removed integrity test
1514     since it was only implemented due to a misunderstanding.
1515    
1516     * Extensions/wms/test/test_parser.py
1517     (TestWMSCapabilitiesParser.test_LayerSRS): Adjust the tests to
1518     reflect the corrected interpretation of the standard: i.e. a layer
1519     does not have to define a BoundingBox for all SRSes it supports.
1520     Hence the <SRS></SRS> specification is authoritative, not the list
1521     of BoundingBoxes.
1522     (TestWMSCapabilitiesParser.test_BoundingBoxes): Added a new test
1523     to ensure None is returned for a non-existing SRS.
1524     (TestWMSCapabilitiesParser.test_grok): Removed test_grok method
1525     since it is not applicable anymore. Listing more SRSes in <SRS>
1526     elements is valid according to the specs.
1527    
1528 bernhard 2140 2004-03-26 Bernhard Reiter <[email protected]>
1529 joey 2146
1530 bernhard 2140 * README: Nicer formatting of text. Improved descriptions.
1531     Reflected wxWidgets name change.
1532    
1533     * Thuban/UI/about.py: Extended copyright to 2004 and added
1534     information about the thuban-devel mailinglist.
1535    
1536 joey 2138 2004-03-24 Martin Schulze <[email protected]>
1537 joey 2120
1538 joey 2138 * Extensions/wms/capabilities.py: Renamed the class to contain
1539     'WMS', also added a linebreak where required
1540    
1541     * Extensions/wms/parser.py: Finally added the XML parser for the
1542     GetCapabilities response.
1543    
1544     * Extensions/wms/test/sample.xml: Adjusted the sample file so that
1545     <SRS> elements match the <BoundingBox> elements, except for the
1546     layer 'beschriftung'.
1547    
1548     * Extensions/wms/test/test_parser.py: Encode non-ascii strings
1549     since Python uses unicode strings internally, otherwise
1550     comparisons will fail. Removed tests for getLayerBBoxSRS() since
1551     the SRS will be calculated anyway and this method is obsoleted by
1552     getLayerSRS(). Denote SRS as strings and not as cardinal numbers.
1553     Move loading the sample file into the setUp method. Added a test
1554     for finding the integrity problem in the sample response.
1555     Improved formatting.
1556    
1557     * Extensions/wms/domutils.py: Added convenience routines for
1558     handling of Document Object Model (DOM) nodes.
1559    
1560     * Extensions/wms/test/test_domutils.py: Added a test for the
1561     domutils module
1562    
1563     2004-03-19 Martin Schulze <[email protected]>
1564    
1565 joey 2120 * Extensions/wms/test/test_parser.py (TestWMSCapabilitiesParser):
1566     Moved path detection and adding into a module of its own,
1567     adjustpath, which exports thubandir as main Thuban directory.
1568    
1569     * Extensions/wms/test/test_ogclib.py (TestWMSLib): Moved path
1570     detection and adding into a module of its own, adjustpath, which
1571     exports thubandir as main Thuban directory. Reorganised the
1572     module in order to support the SkipTest feature for Thuban test
1573     cases.
1574    
1575     * Extensions/wms/test/adjustpath.py: Moved path detection and
1576     adding into a module of its own.
1577    
1578 joey 2115 2004-03-18 Martin Schulze <[email protected]>
1579    
1580     * Extensions/wms/test/test_parser.py: Added another test for
1581     checking whether the WMS XML parser (to be implemented) returns
1582     the information we expect. This requires a sample WMS WML file
1583     (sample.xml) which has been extracted from the frida server and
1584     "improved" manually.
1585    
1586     * Extensions/wms/test/test_ogclib.py: Added legacy code to add the
1587     main Thuban directory to the path in order to be able to import
1588     random modules. Adjusted the PyOGCLib detection to reuse the
1589     information gathered. Also added a note about the PYTHONPATH
1590     environment variable.
1591    
1592     * Extensions/wms/test/test_ogclib.py: The format specification is
1593     a mime-type, not a graphic format, hence image/jpeg wou ld be the
1594     proper format and not JPEG. We'll also have to take care of the
1595     encoding of / as %2F.
1596    
1597 joey 2111 2004-03-16 Martin Schulze <[email protected]>
1598    
1599     * Extensions/wms/test/test_ogclib.py: Added a (hopefully)
1600     comprehensive test for the getMapURL method, built compare URLs
1601     according to the documentation in OGC 01-068r3
1602    
1603     * Extensions/wms/capabilities.py (WMSCapabilities): Added the
1604     class WMSCapabilities to manage capabilites, will incorporate
1605     parsing the capabilities response and provide details for other
1606     classes.
1607    
1608 bh 2105 2004-03-12 Bernhard Herzog <[email protected]>
1609    
1610 bh 2107 Support views in addition to normal tables in the postgis
1611     shapestore
1612    
1613     * Thuban/Model/postgisdb.py
1614     (PostGISShapeStore._fetch_table_information): Add a fallback for
1615     the case where the table name is not in the geometry_columns
1616     table. This is usually the case for views. Also, set
1617     self.shapestore here.
1618     (PostGISShapeStore.ShapeType): No need to query the database all
1619     the time. The shape type is now determined in
1620     _fetch_table_information
1621    
1622     * test/postgissupport.py (PostgreSQLServer.new_postgis_db)
1623     (PostgreSQLServer.get_static_data_db, PostGISDatabase.__init__):
1624     New parameter to specify views.
1625     (PostGISDatabase.has_data): Also compare the views. New views
1626     parameter
1627     (PostGISDatabase.initdb): Create the views.
1628     (PostgreSQLServer.get_default_static_data_db): Add the v_landmarks
1629     view
1630    
1631     * test/test_postgis_db.py
1632     (TestPostGISShapestorePointFromViews): New. Test a
1633     PostGISShapeStore with a view
1634     (TestPostGISShapestorePointOIDAsGIDColumn.setUp): Pass the name of
1635     the geometry_column explicitly to test whether that works
1636    
1637     2004-03-12 Bernhard Herzog <[email protected]>
1638    
1639 bh 2105 Final step for explicit id/geometry columns: Loading and saving
1640    
1641     * Resources/XML/thuban-1.1.dtd: New. Derived from thuban-1.0.dtd
1642     with the following changes:
1643     (dbshapesource): Two new attributes id_column and geometry_column
1644    
1645     * Thuban/Model/save.py (SessionSaver.write): Use the new dtd
1646     (SessionSaver.write_session): Use the new namespace
1647     (SessionSaver.write_data_containers): Write the new dbshapesource
1648     parameters
1649    
1650     * Thuban/Model/load.py (SessionLoader.__init__): New namespace for
1651     the new file format version
1652     (SessionLoader.start_dbshapesource): Handle the new db parameters
1653    
1654     * test/test_save.py: Update to the new dtd and namespace
1655     (SaveSessionTest.test_save_postgis): Update the NonConnectionStore
1656     mock object to provide a working IDColumn method.
1657    
1658     * test/test_load_1_0.py: New. Copy of the test_load.py before
1659     today's changes but with the round-trip tests removed.
1660    
1661     * test/test_load_0_9.py: Update doc-string.
1662    
1663     * test/test_load.py: Update all .thuban files to the new dtd and
1664     namespace.
1665     (TestPostGISLayer.file_contents): Add the new dbshapesource
1666     paramters
1667    
1668 bh 2100 2004-03-11 Bernhard Herzog <[email protected]>
1669    
1670 bh 2103 Next step for explicit id/geometry columns: User interaction
1671    
1672     * Thuban/UI/dbdialog.py (ChooseDBTableDialog.__init__): Rework how
1673     the dialog is constructed. Add combo boxes to select id and
1674     geometry column. Rename some instance variables.
1675     (ChooseDBTableDialog.GetTable): Return id and geometry column
1676     names
1677     (ChooseDBTableDialog.OnTableSelect): New. Event handler for
1678     selections in the table list
1679    
1680     * Thuban/UI/mainwindow.py (MainWindow.AddDBLayer): Use id_column
1681     and geometry_column
1682    
1683     * Thuban/Model/session.py (Session.OpenDBShapeStore): Add the new
1684     parameters for id_column and geometry column of PostGISShapeStore
1685     here as well.
1686    
1687     * Thuban/Model/postgisdb.py (type_map): Add ROWID psycog type.
1688     (_raw_type_map): New. Map raw PostgreSQL type ints to thuban types
1689     (PostGISConnection.GeometryTables): Use a better query to
1690     determine which relations in the database might be usable for
1691     shapestores. Now supports views as well but is more PostgreSQL
1692     specific
1693     (PostGISConnection.table_columns): New. Somewhat experimental
1694     method to let the db dialogs provide lists of columns to users so
1695     that they can select id and geometry columns.
1696     (PostGISTable.__init__): The default value of the id_column
1697     parameter is now None it still means "gid" effectively, though.
1698     (PostGISTable.IDColumn): New introspection method to return a
1699     column object for the id column
1700     (PostGISShapeStore.GeometryColumn): New introspection method to
1701     return a column object for the geometry column
1702    
1703     * test/test_postgis_db.py
1704     (TestPostGISConnection.test_gis_tables_non_empty):
1705     Removed. Subsumed by the new:
1706     (TestPostGISConnection.test_gis_tables_with_views_and_tables):
1707     New. Tes the GeometryTables and table_columns methods with actual
1708     tables and views.
1709     (PointTests.test_id_column, PointTests.test_geometry_column):
1710     New. tests for the new methods.
1711     (TestPostGISShapestorePoint.setUp)
1712     (TestPostGISShapestorePointSRID.setUp)
1713     (TestPostGISShapestorePointExplicitGIDColumn.setUp): Fill the
1714     instance variables needed by the new tests
1715    
1716     2004-03-11 Bernhard Herzog <[email protected]>
1717    
1718 bh 2100 * Thuban/UI/classgen.py (GenQuantilesPanel.GetList): The row
1719     numbers given to ReadValue are ordinals.
1720    
1721     2004-03-11 Bernhard Herzog <[email protected]>
1722    
1723     Elimiate the requirement for PostGIS tables to have a column
1724     called "gid".
1725    
1726     * Thuban/Model/postgisdb.py (PostGISTable.__init__): New parameter
1727     id_column to specify which column to use to identify rows. Also
1728     new instance variables id_column and quoted_id_column
1729     (PostGISTable.RowIdToOrdinal, PostGISTable.RowOrdinalToId)
1730     (PostGISTable.ReadRowAsDict, PostGISTable.ReadValue)
1731     (PostGISTable.SimpleQuery): Use the id column name provided to the
1732     constructor instead of "gid"
1733     (PostGISShapeStore.__init__): New parameter id_column analogously
1734     to PostGISTable.__init__. This parameter is simply passed through
1735     to the base class constructor
1736     (PostGISShapeStore._create_col_from_description): Fix typo in
1737     doc-string
1738     (PostGISShapeStore.Shape, PostGISShapeStore.AllShapes)
1739     (PostGISShapeStore.ShapesInRegion): Use the id column name
1740     provided to the constructor instead of "gid"
1741    
1742     * test/postgissupport.py
1743     (PostgreSQLServer.get_default_static_data_db): New static table
1744     landmarks_point_id with an id column != "gid. Update the comments
1745     a bit.
1746     (skip_if_addgeometrycolumn_does_not_use_quote_ident): Fix typo in
1747     doc-
1748     (upload_shapefile): New parameter gid_column to use a name other
1749     than "gid" for the column to store the shape ids
1750    
1751     * test/test_postgis_db.py (TableTests): New. Mixin-class
1752     containing all tests previously in TestPostGISTable. The actual
1753     tests are the same but the code is a bit more configurable to
1754     allow for different id columns etc.
1755     (TestPostGISTable): Derive from TableTests now for the actual
1756     tests.
1757     (TestPostGISTableExplicitGIDColumn): New. Like TestPostGISTable
1758     except that it the landmarks_point_id table to test the id_column
1759     parameter
1760     (PointTests): Extend the doc-string
1761     (TestPostGISShapestorePointExplicitGIDColumn)
1762     (TestPostGISShapestorePointOIDAsGIDColumn): New classes derived
1763     from PointTests to test the explicit id_column parameter. One
1764     tests with the name of the column holding the shape ids, the other
1765     uses PostgreSQL's OID column. For the latter a number of methods
1766     have to be overwritten to make them independent of the actual id
1767     values.
1768    
1769 silke 2095 2004-03-08 Silke Reimer <[email protected]>
1770    
1771     Update debian directory:
1772    
1773     * debian/changelog: Added new version.
1774     * deiban/rules: Updated management of patches (with cbds)
1775     * debian/control: Added cbds to dependencies
1776     * debian/patches/*: New. Adds better support for patches of thuban in
1777     debian
1778     * debian/menu: Syntax of menu changed slightly
1779     * debian/setup.py.patch: removed because it has been moved to
1780     debian/patechs/setup.py.patch
1781    
1782    
1783 bh 2094 2004-02-26 Bernhard Herzog <[email protected]>
1784    
1785     Create the Doc/technotes directory for text files with information
1786     for developers
1787    
1788     * Doc/technotes/README: New. README for the technotes
1789    
1790     * Doc/technotes/coding_guidelines.txt: New. Coding guidelines for
1791     Thuban
1792    
1793     * Doc/technotes/release_process.txt: New. Used to be
1794     HOWTO-Release. Now slightly adapted to technote formatting style.
1795    
1796     * HOWTO-Release: Removed. It's contents are now in
1797     Doc/technotes/release_process.txt
1798    
1799 bh 2089 2004-02-25 Bernhard Herzog <[email protected]>
1800    
1801     * libraries/thuban/wxproj.cpp (get_wx_version): New. Return the
1802     version of wxWindows the module was compiled with so we can check
1803     that against the wxPython version.
1804    
1805     * Thuban/version.py (thuban_branch, thuban_release): New variables
1806     controlling which and how Thuban versions are shown. See the
1807     comments for details.
1808     (verify_versions): Also check that the wx version that wxproj is
1809     compiled against matches that of the wxPython we use at runtime
1810    
1811 bh 2080 2004-02-20 Bernhard Herzog <[email protected]>
1812    
1813 bh 2087 * Extensions/wms/wms.py (epsg_code_to_projection): Use
1814     get_system_proj_file to read the epsg projections. The old way
1815     depended on the current directory being the top Thuban directory.
1816    
1817     2004-02-20 Bernhard Herzog <[email protected]>
1818    
1819 bh 2085 * Extensions/svgexport/test/test_svgmapwriter.py
1820     (TestVirtualDC.test_clippath): Remove a debug print
1821    
1822     2004-02-20 Bernhard Herzog <[email protected]>
1823    
1824 bh 2083 * Extensions/svgexport/__init__.py: New. Turn
1825     Extensions/svgexport into a package.
1826    
1827     * Extensions/svgexport/svgmapwriter.py: Reorder the imports and
1828     doc-string a bit. The doc-string must come first, otherwise it's
1829     not a doc-string. The __future__ import must be the first thing
1830     after the doc-string. Use only double quotes in doc-strings.
1831     Single quotes trip up emacs syntax highlighting if the text
1832     contains apostrophes.
1833    
1834     2004-02-20 Bernhard Herzog <[email protected]>
1835    
1836 bh 2080 * Extensions/svgexport/test/__init__.py,
1837     Extensions/svgexport/test/test_svgmapwriter.py: New. Initial test
1838     suite for svgexport
1839    
1840     * test/runtests.py (find_test_modules): New. Function with the
1841     module finding code from main.
1842     (main): Use find_test_modules to figure out the default test
1843     modules and take modules from Extensions.svgexport.test too.
1844    
1845 bh 2075 2004-02-19 Bernhard Herzog <[email protected]>
1846    
1847 bh 2077 * Thuban/UI/application.py (ThubanApplication.OnInit): Make sure
1848     the mainwindow has a reference to the map of the initial session.
1849     This fixes a bug introduced with the fix for RT#2245
1850    
1851     2004-02-19 Bernhard Herzog <[email protected]>
1852    
1853 bh 2075 * Extensions/svgexport/svgsaver.py,
1854     Extensions/svgexport/svgmapwriter.py,
1855     Extensions/svgexport/maplegend.py: Added again. This time in the
1856     correct place.
1857    
1858 bh 2070 2004-02-17 Bernhard Herzog <[email protected]>
1859    
1860 bh 2073 Fix for RT#2245
1861    
1862     * Thuban/UI/application.py (ThubanApplication.OnInit): Initialize
1863     instance variables before trying to create any windows. Creating
1864     windows can start an event loop if e.g. message boxes are popped
1865     up for some reason, and event handlers, especially EVT_UPDATE_UI
1866     may want to access things from the application.
1867     (ThubanApplication.maps_changed): The mainwindow may not have been
1868     created yet, so check whether it has been created before calling
1869     its methods
1870    
1871     * Thuban/UI/view.py (MapCanvas.OnIdle): Only try to redraw if we
1872     have a map
1873    
1874     2004-02-17 Bernhard Herzog <[email protected]>
1875    
1876 bh 2070 * test/test_svgmapwriter.py, Extensions/svgsaver.py,
1877     Extensions/svgmapwriter.py, Extensions/maplegend.py,
1878     extensions/svgexport/svgsaver.py,
1879     extensions/svgexport/svgmapwriter.py,
1880     extensions/svgexport/maplegend.py: Removed. These files were in
1881     the wrong places or didn't work at all.
1882    
1883 bh 2067 2004-02-16 Bernhard Herzog <[email protected]>
1884    
1885 bh 2069 * Thuban/UI/view.py (MapCanvas.Export): Remove accidentally added
1886     line
1887    
1888     2004-02-16 Bernhard Herzog <[email protected]>
1889    
1890 bh 2067 * Thuban/UI/view.py (MapCanvas.Export): Avoid UnboundLocalError.
1891    
1892 mrechtie 2064 2004-02-15 Markus Rechtien <[email protected]>
1893    
1894     * Extensions/svgexport/svgmapwriter.py: New. Adds the capability
1895     to write a session to a file in SVG format.
1896     * Extensions/svgexport/svgsaver.py: New. Uses svgmapwriter.py
1897     to write a SVG map of a session.
1898     * Extensions/svgexport/maplegend: New. Writes a basic maplegend
1899     in SVG format for the current session.
1900    
1901 bh 2062 2004-02-13 Bernhard Herzog <[email protected]>
1902    
1903     * Thuban/UI/mainwindow.py (MainWindow.AddDBLayer): When the layer
1904     can't be created, return immediately after displaying the error
1905     message.
1906    
1907 bh 2060 2004-02-11 Bernhard Herzog <[email protected]>
1908    
1909     Handle postgis tables with more than one geometry column.
1910    
1911     * Thuban/Model/postgisdb.py
1912     (PostGISTable._fetch_table_information): Delegate the creation of
1913     column objects to a different method so that we can extend that in
1914     derived classes
1915     (PostGISTable._create_col_from_description): New. Column object
1916     creation part of _fetch_table_information
1917     (PostGISShapeStore._create_col_from_description): New. Extend
1918     inherited method to handle geometry columns
1919     (PostGISShapeStore.__init__): New parameter geometry_column to
1920     specify which geometry column to use. Optional but mandatory for
1921     tables with more than one geometry column
1922     (PostGISShapeStore._fetch_table_information): Also use the name of
1923     the geometry column when looking for the srid
1924     (PostGISShapeStore.ShapeType): Also use the name of the geometry
1925     column when looking for the shape type
1926    
1927     * test/test_save.py (SaveSessionTest.test_save_postgis): Adapt
1928     NonConnectionStore to changes in the PostGISShapeStore
1929    
1930     * test/test_postgis_db.py
1931     (TestPostGISSpecialCases.test_shapestore_two_geom_cols): Test
1932     PostGISShapeStore with tables having two geometry columns.
1933    
1934 bh 2058 2004-02-10 Bernhard Herzog <[email protected]>
1935    
1936     Fix some postgis problems. What remains to be done is real
1937     handling of SRIDs as they affect how reprojection is done
1938    
1939     * Thuban/Model/postgisdb.py (quote_identifier): Fix typo in
1940     doc-string
1941     (PostGISShapeStore._fetch_table_information): New. Extend
1942     inherited method to retrieve srid
1943     (PostGISShapeStore.BoundingBox): Handle tables without data.
1944     extent yields NULL for those
1945     (PostGISShapeStore.ShapesInRegion): Use the srid of the table.
1946    
1947     * test/test_postgis_db.py
1948     (TestPostGISSpecialCases.test_shapestore_empty_table): New test
1949     for the special case of a table without any data
1950     (TestPostGISShapestorePointSRID): New class with tests for a table
1951     that uses srids
1952     (PolygonTests): Fix a doc-string typo
1953    
1954     * test/postgissupport.py (PostGISDatabase.__init__): New parameter
1955     reference_systems with a specification of spacial reference
1956     systems to create in the new db.
1957     (PostgreSQLServer.new_postgis_db)
1958     (PostgreSQLServer.get_static_data_db): New parameter
1959     reference_systems to be passed through ultimately to
1960     PostGISDatabase. In new_postgis_db also check whether an existing
1961     db already has the right srids
1962     (PostgreSQLServer.get_default_static_data_db): Add srids and a
1963     table that uses srids
1964     (PostGISDatabase.initdb): Create the entries for the reference
1965     systems
1966     (PostGISDatabase.has_data): Add reference_systems parameter to
1967     check for those too
1968     (upload_shapefile): New parameter srid to create tables with a
1969     specific srid
1970    
1971 frank 2055 2004-02-06 Frank Koormann <[email protected]>
1972    
1973     * po/pt_BR.po: Fixed charset
1974    
1975 frank 2054 2004-02-05 Frank Koormann <[email protected]>
1976    
1977     * po/pt_BR.po: Fixed format string for error message, missing %s
1978     added (Thuban/UI/application.py:273)
1979    
1980 frank 2053 2004-02-03 Frank Koormann <[email protected]>
1981    
1982     First version of Portuguese (Brazilian) translation
1983    
1984     * po/pt_BR.po: New, translation of pot (2004-01-15 16:07+0300) for
1985     Brazilian Portuguese by Eduardo Patto Kanegae.
1986    
1987     * Thuban/UI/about.py (About.__init.py__): Added Eduardo to the list of
1988     translators.
1989    
1990    
1991 frank 2052 2004-01-22 Frank Koormann <[email protected]>
1992    
1993     * Doc/manual/thuban-manual.xml: Added section on installation of
1994     Thuban under Win32 systems. Fixed image path references in the postgis
1995     section. Some minor source formattings.
1996    
1997 frank 2051 2004-01-21 Frank Koormann <[email protected]>
1998    
1999     Make Thuban remember path selections (at least for one application run).
2000    
2001     * Thuban/UI/application.py (Application.OnInit): Initialize path as a
2002     attribute of application object. Path is a dictionary of
2003     strings, currently with the items "data" and "projection".
2004     (Application.SetPath): New, stores path for the specified item.
2005     (Application.Path): New, return path for the specified item.
2006    
2007     * Thuban/UI/mainwindow.py
2008     (MainWindow.OpenSession, MainWindow.SaveSessionAs,
2009     MainWindow.AddLayer, MainWindow.AddRasterLayer,
2010     MainWindow.TableOpen): Access "data" path information of the
2011     application.
2012    
2013     * Thuban/UI/projdialog.py (ProjFrame._OnImport, ProjFrame._OnExport):
2014     Access "projection" path information of the application.
2015    
2016 bh 2048 2004-01-05 Bernhard Herzog <[email protected]>
2017    
2018 bh 2050 * po/ru.po: Updated translations from Alex Shevlakov
2019    
2020     2004-01-05 Bernhard Herzog <[email protected]>
2021    
2022 bh 2048 * po/Makefile, po/README: Move the description of how to generate
2023     the translation statistics to the README.
2024    
2025 bh 2042 2003-12-23 Bernhard Herzog <[email protected]>
2026    
2027 bh 2045 * NEWS: Update for 1.0.0
2028    
2029     * po/it.po: Another update from Maurizio Napolitano
2030    
2031     2003-12-23 Bernhard Herzog <[email protected]>
2032    
2033 bh 2042 * po/it.po: Updated translation from Maurizio Napolitano
2034    
2035     2003-12-23 Bernhard Herzog <[email protected]>
2036    
2037     * Thuban/UI/join.py (JoinDialog.__init__): Mark one more string
2038     for translation
2039    
2040     * Thuban/UI/mainwindow.py (MainWindow.TableRename)
2041     (MainWindow.RenameMap, MainWindow.RenameLayer): Mark some more
2042     strings for translation
2043    
2044     * po/de.po: Update with the newly marked strings.
2045    
2046 bh 2033 2003-12-22 Bernhard Herzog <[email protected]>
2047    
2048 bh 2039 * HOWTO-Release: Fix the places where version numbers have to be
2049     updated
2050    
2051     2003-12-22 Bernhard Herzog <[email protected]>
2052    
2053 bh 2037 * setup.py (setup call): 1.0.0, yeah!
2054    
2055     * Thuban/version.py (longversion): 1.0.0, yeah!
2056    
2057     * Thuban/Model/load.py (SessionLoader.__init__): Accept the
2058     1.0.0 namespace too
2059    
2060     * Thuban/Model/save.py (SessionSaver.write_session): Save with
2061     1.0.0 namespace
2062    
2063     * test/test_load.py (LoadSessionTest.dtd)
2064     (TestSingleLayer.file_contents)
2065     (TestNonAsciiColumnName.file_contents)
2066     (TestLayerVisibility.file_contents)
2067     (TestClassification.file_contents, TestLabels.file_contents)
2068     (TestLayerProjection.file_contents)
2069     (TestRasterLayer.file_contents, TestJoinedTable.file_contents)
2070     (TestLabelLayer.file_contents, TestPostGISLayer.file_contents)
2071     (TestPostGISLayerPassword.file_contents)
2072     (TestLoadError.file_contents, TestLoadError.test): Update for
2073     1.0.0 namespace
2074    
2075     * test/test_save.py (SaveSessionTest.dtd)
2076     (SaveSessionTest.testEmptySession)
2077     (SaveSessionTest.testSingleLayer)
2078     (SaveSessionTest.testLayerProjection)
2079     (SaveSessionTest.testRasterLayer)
2080     (SaveSessionTest.testClassifiedLayer)
2081     (SaveSessionTest.test_dbf_table)
2082     (SaveSessionTest.test_joined_table)
2083     (SaveSessionTest.test_save_postgis): Update for 1.0.0 namespace
2084    
2085     2003-12-22 Bernhard Herzog <[email protected]>
2086    
2087 bh 2035 * Thuban/Model/load.py (SessionLoader.start_label): Make sure the
2088     alignment flags are byte strings not unicode and that they have
2089     valid values
2090    
2091     * test/test_load.py (TestLabelLayer): New. Test loading (and
2092     indirectly saving) of maps with labels.
2093    
2094     2003-12-22 Bernhard Herzog <[email protected]>
2095    
2096 bh 2033 * Thuban/UI/tableview.py (TableGrid.OnDestroy)
2097     (TableGrid.__init__): Handle EVT_WINDOW_DESTROY in the grid to
2098     unsubscribe all subscribers.
2099     (LayerTableFrame.OnDestroy): Do not unsubscribe any messages from
2100     self.grid since it may already have been destroyed.
2101     Fixes RT #2256
2102    
2103 bh 2031 2003-12-19 Bernhard Herzog <[email protected]>
2104    
2105     * po/fr.po, po/es.po: Updated translations from Daniel Calvelo
2106    
2107 bh 2028 2003-12-16 Bernhard Herzog <[email protected]>
2108 silke 2029
2109     * debian/bitmappath.patch, debian/setup.py.patch:
2110     added to ensure compliance with FHS for debian
2111     * debian/rules, debian/changelog:
2112     added patches in rules to ensure compliance with FHS for debian
2113 bh 2028
2114 silke 2029 2003-12-16 Bernhard Herzog <[email protected]>
2115    
2116 bh 2028 * po/Makefile (mo): Make the output a bit nicer so that it prints
2117     statistics about the translations. Add a comment how produce even
2118     nicer statistics with sed.
2119    
2120 frank 2026 2003-12-09 Frank Koormann <[email protected]>
2121    
2122     * Resources/Projections/defaults.proj:
2123     French projection sample with correct accents (UNICODE).
2124    
2125 bh 2025 2003-12-05 Bernhard Herzog <[email protected]>
2126    
2127     * MANIFEST.in: Add the devtools directory
2128    
2129     * setup.py (setup call): Use license instead of licence. This
2130     silences a deprecation warning on Python 2.3
2131    
2132 frank 2022 2003-12-05 Frank Koormann <[email protected]>
2133    
2134 frank 2023 Documentation synced with 1.0rc1
2135    
2136     * Doc/manual/thuban-manual.xml:
2137     Minor formatting changes and references to database layers .
2138     Introduction.Internationalization: New section on i18n.
2139     MapManagement.AddingandRemovingLayers: Added item on database layers.
2140     MapManagement.TheLegend: Added section and screenshot on popup menu.
2141     ProjectionManagement: Updated screenshot and sentence on EPSG.
2142     Appendix.SupportedDataSources: Added PostGIS.
2143     Appendix.WorkingwithPostGIS: New section.
2144    
2145     * Doc/manual/images/6_projection.png: Updated screenshot including
2146     EPSG checkboxes.
2147    
2148     * Doc/manual/images/3_5_popup_menu.png: New, popup menu screenshot.
2149    
2150     * Doc/manual/images/app_postgis_add_layer.png,
2151     Doc/manual/images/app_postgis_db_add.png,
2152     Doc/manual/images/app_postgis_db_management.png:
2153     New screenshots focussing on database layers
2154    
2155     2003-12-05 Frank Koormann <[email protected]>
2156    
2157 frank 2022 * Thuban/UI/projdialog.py (load_user_proj): If user.proj is missing
2158     write warning to stderr instead of rising a warning dialog
2159    
2160 bh 2016 2003-12-03 Bernhard Herzog <[email protected]>
2161    
2162 bh 2021 Fix for RT #2243
2163    
2164 bh 2020 * Thuban/UI/mainwindow.py (MainWindow.has_selected_shape_layer):
2165     New. Like has_selected_layer but for shape layers only
2166     (_has_selected_shape_layer): New. Like _has_selected_layer but for
2167     shape layers only
2168     (layer_show_table command, layer_jointable command): Use these
2169     commands should only be available for shape layers
2170    
2171     2003-12-03 Bernhard Herzog <[email protected]>
2172    
2173 bh 2018 * Thuban/UI/mainwindow.py (MainWindow.Unsubscribe): Deal with
2174     publishers that are wx objects and may have been destroyed by wx
2175     already. Fixes RT #2242.
2176    
2177     2003-12-03 Bernhard Herzog <[email protected]>
2178    
2179 bh 2016 * po/ru.po: Updates from Alex Shevlakov
2180    
2181 silke 2013 2003-12-03 Silke Reimer <silkeintevation.de>
2182    
2183     * debian/control, debian/changelog: Added gdal-support to
2184     debian package, updated to new thuban version
2185    
2186    
2187 bh 2012 2003-12-03 Bernhard Herzog <[email protected]>
2188    
2189     * Thuban/Lib/version.py: New. Module for version number
2190     manipulations. The version of make_tuple here also deals better
2191     with more unusual version number strings, such as e.g.
2192     "1.2+cvs20031111"
2193    
2194     * Thuban/version.py (make_tuple): Removed. It's now in
2195     Thuban.Lib.version. Use that implementation instead.
2196    
2197     * test/test_lib_version.py: New. Tests for Thuban/Lib/version.py
2198    
2199 bh 2005 2003-12-02 Bernhard Herzog <[email protected]>
2200    
2201 bh 2010 * MANIFEST.in: Add debian files
2202    
2203 bh 2008 * setup.py (setup call): Add packages for the Extensions so that
2204     they're installed too
2205     (data_files): Add READMEs and sample data from some Extensions
2206    
2207     * NEWS: Add note about the extensions in binary packages
2208    
2209     2003-12-02 Bernhard Herzog <[email protected]>
2210    
2211 bh 2005 * Thuban/Model/save.py (SessionSaver.write_session): Save files
2212     with the thuban-1.0rc1
2213    
2214     * Thuban/Model/load.py (SessionLoader.__init__): Recognize the
2215     thuban-1.0rc1 namespace too
2216    
2217     * test/test_save.py (SaveSessionTest.dtd)
2218     (SaveSessionTest.testEmptySession)
2219     (SaveSessionTest.testSingleLayer)
2220     (SaveSessionTest.testLayerProjection)
2221     (SaveSessionTest.testRasterLayer)
2222     (SaveSessionTest.testClassifiedLayer)
2223     (SaveSessionTest.test_dbf_table)
2224     (SaveSessionTest.test_joined_table)
2225     (SaveSessionTest.test_save_postgis): Update to thuban-1.0rc1
2226     namespace
2227    
2228     * test/test_load.py (LoadSessionTest.dtd): Update to thuban-1.0rc1
2229     namespace
2230     (TestSingleLayer.file_contents)
2231     (TestNonAsciiColumnName.file_contents)
2232     (TestLayerVisibility.file_contents)
2233     (TestClassification.file_contents, TestLabels.file_contents)
2234     (TestLayerProjection.file_contents)
2235     (TestRasterLayer.file_contents, TestJoinedTable.file_contents)
2236     (TestPostGISLayer.file_contents)
2237     (TestPostGISLayerPassword.file_contents)
2238     (TestLoadError.file_contents, TestLoadError.test): Update to
2239     thuban-1.0rc1 namespace
2240    
2241 bh 1996 2003-12-01 Bernhard Herzog <[email protected]>
2242    
2243 bh 2003 * setup.py (proj4_prefix, wx_prefix, gdal_prefix): Fix these for
2244     nt to better match Intevation's current w32 setup
2245    
2246 bh 2001 * HOWTO-Release: Add note about updating MANIFEST.in
2247    
2248     * MANIFEST.in: Add the Extensions
2249    
2250 bh 1998 * NEWS: Update for 1.0rc1
2251    
2252     2003-12-01 Bernhard Herzog <[email protected]>
2253    
2254 bh 1996 * Thuban/UI/mainwindow.py (MainWindow.AddLayer): Change the wild
2255     cards for the dialog so that shapefiles ending in all uppercase
2256     SHP are listed too
2257    
2258 bh 1988 2003-11-28 Bernhard Herzog <[email protected]>
2259    
2260 bh 1996 * Thuban/version.py (longversion): Update to 1.0rc1
2261    
2262     * setup.py (setup call): Update version to 1.0rc1. Use the
2263     [email protected] email address as author email instead of my
2264     personal one.
2265    
2266     2003-11-28 Bernhard Herzog <[email protected]>
2267    
2268 bh 1992 * po/de.po: Update german translation.
2269    
2270     2003-11-28 Bernhard Herzog <[email protected]>
2271    
2272 bh 1990 Unify the filenames stored in .thuban files so that the .thuban
2273     files are more platform independend
2274    
2275     * Thuban/Model/save.py (unify_filename): New. Unify filenames so
2276     that they can be used on both windows and unix
2277     (SessionSaver.prepare_filename): New. Handle all filename
2278     transformations for filenames stored in the thuban file
2279     (SessionSaver.write_data_containers, SessionSaver.write_layer):
2280     Use prepare_filename
2281    
2282     * test/test_save.py (SaveSessionTest.testSingleLayer)
2283     (SaveSessionTest.testLayerProjection)
2284     (SaveSessionTest.testRasterLayer)
2285     (SaveSessionTest.testClassifiedLayer)
2286     (SaveSessionTest.test_dbf_table)
2287     (SaveSessionTest.test_joined_table): Filenames are always stored
2288     with slashes on all currently supported platforms so adapt all
2289     tests to this
2290    
2291     * test/test_load.py (LoadSessionTest.filenames): With the new
2292     filename scheme the filenames in the tests should be
2293     understandable on all currently supported platforms so we turn
2294     this into an empty list because we don't have to normalize them
2295     anymore
2296    
2297     2003-11-28 Bernhard Herzog <[email protected]>
2298    
2299 bh 1988 * test/test_layer.py (TestLayer.test_arc_layer_with_projection):
2300     Add the ellipsoid to the projection since some Proj versions
2301     complain if it's missing.
2302    
2303 bh 1984 2003-11-27 Bernhard Herzog <[email protected]>
2304    
2305     Corect some bounding box projection problems
2306    
2307     * Thuban/Model/proj.py (Projection.InverseBBox): New. Inverse
2308     version of ForwardBBox
2309     (Projection._transform_bbox): New. common implementation of
2310     ForwardBBox and InverseBBox
2311     (Projection.ForwardBBox): Use _transform_bbox.
2312    
2313     * test/test_proj.py (TestProjection.test): Add test for
2314     InverseBBox
2315    
2316     * Thuban/Model/layer.py (Layer.LatLongBoundingBox)
2317     (Layer.ShapesBoundingBox, RasterLayer.LatLongBoundingBox): Use the
2318     new InverseBBox method to determine the unprojected bounding box
2319     (Layer.ShapesInRegion): Use the ForwardBBox method to project the
2320     bbox.
2321    
2322     * test/test_layer.py (TestLayer.test_point_layer_with_projection):
2323     Removed.
2324     (TestLayer.test_arc_layer_with_projection): New. This test is
2325     better able to test whether bounding boxes are projected correctly
2326     than test_point_layer_with_projection
2327    
2328 bh 1986 * Thuban/UI/viewport.py (ViewPort.map_projection_changed): Use
2329     InverseBBox to unproject bboxes
2330    
2331 bh 1975 2003-11-25 Bernhard Herzog <[email protected]>
2332    
2333 bh 1981 * Thuban/UI/about.py (About.__init__): Make sure we have ASCII
2334     source code.
2335    
2336     2003-11-25 Bernhard Herzog <[email protected]>
2337    
2338 bh 1979 * Thuban/Model/layer.py (Layer.__getattr__): Removed. It was only
2339     there for backwards compatibility and all code relying on that
2340     should have been updated by now.
2341    
2342     2003-11-25 Bernhard Herzog <[email protected]>
2343    
2344 bh 1977 * test/test_load.py (TestClassification.test): Add the missing
2345     round trip test.
2346     (TestClassification.file_contents): Update to the newest file
2347     format
2348    
2349     2003-11-25 Bernhard Herzog <[email protected]>
2350    
2351 bh 1975 Add very experimental (and possibly dangerous) extension to draw
2352     polygons:
2353    
2354     * Extensions/drawshape/README: New. Brief installation
2355     instructions
2356    
2357     * Extensions/drawshape/drawshape.py: New. Implementation of the
2358     drawshape extensions
2359    
2360     * Extensions/drawshape/patch.diff: Patch to apply before the
2361     extension can be used.
2362    
2363 bh 1971 2003-11-24 Bernhard Herzog <[email protected]>
2364    
2365 bh 1973 * Thuban/Model/data.py (ShapefileStore._open_shapefile)
2366     (ShapefileStore.__init__): Factor opening the shapefile into a
2367     separate method (the new _open_shapefile). This makes the code a
2368     bit more readable but the real reason is that it makes some evil
2369     hacks easier. :-)
2370    
2371     2003-11-24 Bernhard Herzog <[email protected]>
2372    
2373 bh 1971 * Thuban/Model/load.py (SessionLoader.check_attrs): If no
2374     converter is specified for an attribute assume it's a string
2375     containing only Latin1 characters. Update doc-string accordingly.
2376     This change should fix many places where unicode objects might
2377     accidentally enter Thuban.
2378    
2379     * test/test_load.py (TestNonAsciiColumnName): New test to check
2380     what happens with column names in DBF files that contain non-ascii
2381     characters
2382    
2383 bh 1969 2003-11-21 Bernhard Herzog <[email protected]>
2384    
2385     Enable the experimental attribute editing again and introduce a
2386     command line switch to actually activate it
2387    
2388     * Thuban/UI/main.py (options): New. Container for options set on
2389     the commmand line
2390     (main): Add the --enable-attribute-editing flag.
2391    
2392     * Thuban/UI/identifyview.py (IdentifyView.__init__): If attribute
2393     editing is enabled use the grid ctrl which allows editing of the
2394     values
2395    
2396     * Thuban/Model/transientdb.py (AutoTransientTable.write_record):
2397     New. Just delegate this to the underlying table.
2398    
2399 bh 1967 2003-11-20 Bernhard Herzog <[email protected]>
2400    
2401     * test/test_proj.py (ProjFileReadTests.test_read_unreadable_file):
2402     Skip this test if run under non-posix systems since it only works
2403     there
2404    
2405 bh 1960 2003-11-19 Bernhard Herzog <[email protected]>
2406    
2407 bh 1965 * Thuban/Model/resource.py: Rework the way gdal support is
2408     determined so that we can give a reason in the about why gdal is
2409     not supported.
2410     (gdal_support_status): New. Variable holding a string with the
2411     reason for no gdal support
2412    
2413     * Thuban/UI/about.py (About.__init__): Add the reason why gdal is
2414     not supported to the message
2415    
2416     2003-11-19 Bernhard Herzog <[email protected]>
2417    
2418 bh 1963 Remove the old table interface and its test cases
2419    
2420     * Thuban/Model/table.py (OldTableInterfaceMixin): Removed.
2421     (DBFTable, MemoryTable): Do not derive from OldTableInterfaceMixin
2422     anymore
2423    
2424     * Thuban/Model/transientdb.py (TransientTableBase)
2425     (AutoTransientTable): Do not derive from OldTableInterfaceMixin
2426     anymore
2427    
2428     * test/test_table.py: Removed since the old interface it tests is
2429     gone.
2430    
2431     * test/runtests.py (main): The old table interface is gone and
2432     with it the deprecation warnings so remove the code that turns
2433     these warnings into errors
2434    
2435     2003-11-19 Bernhard Herzog <[email protected]>
2436    
2437 bh 1960 * test/test_table.py: Revert to revision 1.5 again. Changing the
2438     tests to use the new table interface is completely wrong since the
2439     whole purpose of the tests in this module is to test the old
2440     interface.
2441    
2442 bh 1954 2003-11-18 Bernhard Herzog <[email protected]>
2443    
2444 bh 1958 * Thuban/Model/postgisdb.py (PostGISConnection.MatchesParameters):
2445     New. Test whether the connection matches a set of connection
2446     parameters
2447    
2448     * Thuban/UI/dbdialog.py (DBFrame.conns_changed): Fix doc-string
2449     (DBFrame.OnAdd): Use the new MatchesParameters method when looking
2450     for existing connections with the same parameters and break out of
2451     the loop correctly.
2452    
2453     * test/test_postgis_db.py (TestBriefDescription)
2454     (TestPostGISSimple.test_brief_description): Rename
2455     TestBriefDescription to TestPostGISSimple and the test method to
2456     test_brief_description so that we can add more test methods.
2457     (TestPostGISSimple.test_matches_parameters): New. Test the new
2458     MatchesParameters method
2459    
2460     2003-11-18 Bernhard Herzog <[email protected]>
2461    
2462 bh 1960 * Thuban/Lib/connector.py (Publisher): Introduce a new flag,
2463 bh 1954 _was_destroyed, to indicate whether an publisher instance has
2464     already been destroyed.
2465     (Publisher.Unsubscribe): Only disconnect if the publisher has not
2466     been destroyed yet.
2467     (Publisher.Destroy): Set the _was_destroyed flag to true.
2468    
2469     * test/test_connector.py
2470     (TestPublisher.test_unsubscribe_after_destroy): New. Test that
2471     calling Unsubscribe after Destroy doesn't raise an exception
2472    
2473 bh 1951 2003-11-14 Bernhard Herzog <[email protected]>
2474    
2475     * Thuban/UI/identifyview.py (IdentifyView.selected_shape): Fix
2476     typo in doc-string
2477    
2478 bh 1949 2003-11-13 Bernhard Herzog <[email protected]>
2479    
2480     Quote table and column names properly for postgis.
2481    
2482     * Thuban/Model/postgisdb.py (quote_identifier): New. Function to
2483     quote an identifier for use in an sql statement
2484     (PostGISColumn.__init__): Add the quoted_name attribute
2485     (PostGISTable.__init__): New instance variable quoted_tablename
2486     (PostGISTable._fetch_table_information): Use the quoted table
2487     name. New isntance variable quoted_geo_col with a quoted version
2488     of geometry_column
2489     (PostGISTable.NumRows, PostGISTable.RowIdToOrdinal)
2490     (PostGISTable.RowOrdinalToId): Use the quoted table name
2491     (PostGISTable.ReadValue, PostGISTable.ValueRange)
2492     (PostGISTable.UniqueValues, PostGISTable.SimpleQuery)
2493     (PostGISShapeStore.BoundingBox, PostGISShapeStore.Shape)
2494     (PostGISShapeStore.AllShapes, PostGISShapeStore.ShapesInRegion):
2495     Use quoted table and column names
2496    
2497     * test/test_postgis_db.py (TestPostGISSpecialCases)
2498     (TestPostGISIgnoredColumns): Rename the class to
2499     TestPostGISSpecialCases because that better describes the new
2500     cases
2501     (TestPostGISSpecialCases.test_unsupported_types)
2502     (TestPostGISSpecialCases.test): Rename the method to
2503     test_unsupported_types because we need a more descriptive name now
2504     that there are more methods
2505     (TestPostGISSpecialCases.test_table_name_quoting)
2506     (TestPostGISSpecialCases.test_column_name_quoting)
2507     (TestPostGISSpecialCases.test_shapestore_name_quoting): New test
2508     cases to test quoting of table and column names in PostGISTable
2509     and PostGISShapeStore
2510    
2511     * test/postgissupport.py
2512     (skip_if_addgeometrycolumn_does_not_use_quote_ident): New. Skip if
2513     AddGeometryColumn desn't support table or column names with sapces
2514     or double quotes
2515    
2516 jan 1945 2003-11-12 Jan-Oliver Wagner <[email protected]>
2517    
2518     * Extensions/wms/__init__.py: New: Init to make this
2519     directory a package.
2520    
2521     * Extensions/wms/wms.py: New: Provide layers via OGC WMS.
2522    
2523 bh 1932 2003-11-11 Bernhard Herzog <[email protected]>
2524    
2525 bh 1942 * Thuban/Model/resource.py (EPSG_DEPRECATED_PROJ_FILE): New.
2526     Constant for the file woth deprecated epsg projections
2527     (get_system_proj_file): Update doc-string
2528    
2529     * Thuban/UI/projdialog.py (ProjFrame.build_dialog): Add a space
2530     above the EPS widgets, introduce a check box for the deprecated
2531     eps projections and a label for the epsg widgets
2532     (ProjFrame._OnShowEPSG): Handle the deprecated EPSG projections
2533     too
2534    
2535     2003-11-11 Bernhard Herzog <[email protected]>
2536    
2537 bh 1939 Avoid warnings when run under Python 2.3
2538    
2539     * Thuban/UI/baserenderer.py (BaseRenderer.draw_point_shape)
2540     (BaseRenderer.draw_label_layer): Coordinates must be ints.
2541    
2542     * Thuban/UI/renderer.py (MapRenderer.make_point): Turn this into a
2543     real method so that we can convert to int.
2544     (MapRenderer.label_font): The font size mist be an int.
2545    
2546     * Thuban/UI/common.py (Color2wxColour): The color values must be
2547     ints. Also, remove the unnecessary asserts.
2548    
2549     * test/test_load_0_8.py (TestUnicodeStrings.file_contents)
2550     (TestUnicodeStrings.test): Python source code should not contain
2551     non-ascii characters unless an encoding is specified in the file.
2552     Therefore use \x escapes in the string literals for non-ascii
2553     characters.
2554    
2555     2003-11-11 Bernhard Herzog <[email protected]>
2556    
2557 bh 1934 * Thuban/Model/resource.py (get_system_proj_file): Add a filename
2558     parameter so that this function can be used for all proj files in
2559     Resource/Projections
2560     (DEFAULT_PROJ_FILE, EPSG_PROJ_FILE): New. Predefined filenames for
2561     get_system_proj_file
2562    
2563     * Thuban/UI/projdialog.py (ProjFrame.__init__): Instead of one
2564     ProjFile self.__sysProjFile use a dictionary of system ProjFile
2565     objects self._sys_proj_files
2566     (ProjFrame.build_dialog): Adapt to the new changes in the
2567     ProjectionList constructor. Add a check button to toggle whether
2568     EPSG projections are shown
2569     (ProjFrame._OnShowEPSG): New. Handler for the epsg check button
2570     events.
2571     (ProjFrame.load_user_proj, ProjFrame.load_system_proj): Only show
2572     the busy cursor if the files have not yet been loaded by the
2573     dialog.
2574     (ProjFrame.load_system_proj): Add a parameter for the name of the
2575     proj file. Maintain the dictionary of system projections
2576     self._sys_proj_files
2577    
2578     * Thuban/UI/projlist.py (ProjectionList): Merge the system_projs,
2579     user_projs parameters into one parameter proj_files which is a
2580     list of proj files.
2581     (ProjectionList._subscribe_proj_files)
2582     (ProjectionList._unsubscribe_proj_files): New. Move
2583     subscription/unsubscription of projfile messages to separate
2584     methods
2585     (ProjectionList.Destroy): The unsubscribe is now done in
2586     _unsubscribe_proj_files
2587     (ProjectionList.update_projections): We now have a list of proj
2588     file objects
2589     (ProjectionList.SetProjFiles): New method to set a new list of
2590     proj file objects
2591    
2592     * test/test_proj.py (ProjFileReadTests.test_get_system_proj_file):
2593     Specify explicitly which system proj file to load.
2594    
2595     2003-11-11 Bernhard Herzog <[email protected]>
2596    
2597 bh 1932 * Thuban/Model/load.py (SessionLoader.Destroy): New. Clear all
2598     instance variables to cut cyclic references. The GC would have
2599     collected the loader eventually but it can happen that it doesn't
2600     run at all until thuban is closed (2.3 but not 2.2 tries a bit
2601     harder and forces a collection when the interpreter terminates)
2602     (load_session): Call the handler's Destroy method to make sure
2603     that it gets garbage collected early. Otherwise it will be
2604     collected very late if at all and it holds some references to e.g.
2605     shapestores and the session which can lead to leaks (of e.g. the
2606     temporary files)
2607    
2608     * test/test_load.py (TestSingleLayer.test_leak): New. test for the
2609     resource leak in load_session
2610    
2611 bh 1929 2003-11-10 Bernhard Herzog <[email protected]>
2612    
2613     * Thuban/UI/baserenderer.py: Add a way to specify how layers in
2614     extensions are to be rendered.
2615     (_renderer_extensions): New. List with renderer for layers in
2616     extensions
2617     (add_renderer_extension): New. Add a renderer extension
2618     (init_renderer_extensions): New. Init the renderer extensions
2619     (BaseRenderer.render_map_incrementally): Search
2620     _renderer_extensions for how to draw unknown layer types
2621     (BaseRenderer.draw_raster_data): Add format parameter so that
2622     formats other than BMP can be drawn
2623     (BaseRenderer.draw_raster_layer): Pass an explicit format to
2624     draw_raster_data
2625    
2626     * Thuban/UI/renderer.py (raster_format_map): New. Mapping form the
2627     strings of the format parameter of draw_raster_data method to wx
2628     constants
2629     (MapRenderer.draw_raster_data): Add the format parameter and use
2630     raster_format_map to map it to the right wxwindows constant for
2631     wxImageFromStream
2632    
2633     * test/test_baserenderer.py (SimpleRenderer.draw_raster_data): Add
2634     the format parameter and record it
2635     (TestBaseRenderer.test_raster_no_projection): check the format
2636     paramter of the draw_raster_data method
2637     (TestBaseRenderer.test_renderer_extension): New. Test the renderer
2638     extension facility
2639    
2640 bh 1925 2003-11-07 Bernhard Herzog <[email protected]>
2641    
2642     Tweak the usage of the sqlite database to make common use cases
2643     more responsive. In most cases copying the data to the sqlite
2644     database takes so long that using sqlite doesn't have enough
2645     advantages.
2646    
2647     * Thuban/Model/transientdb.py (TransientTableBase.ValueRange): Add
2648     comments about performance and query the min and max in separate
2649     statements because only that way will indexes be used.
2650     (TransientTableBase.UniqueValues): Add some comments about
2651     performance.
2652     (AutoTransientTable.ValueRange, AutoTransientTable.UniqueValues):
2653     Do not copy the data to the transient DB but use the transient
2654     copy if it exists. See the new comments for the performance trade
2655     offs
2656    
2657     * test/test_transientdb.py
2658     (TestTransientTable.test_auto_transient_table): Make sure that the
2659     data is copied to the transient database at some point.
2660    
2661 bh 1913 2003-11-03 Bernhard Herzog <[email protected]>
2662    
2663 bh 1922 * Thuban/Model/data.py (ShapefileStore.ShapesInRegion): Bind some
2664     globals to locals so that it's a bit faster
2665    
2666     2003-11-03 Bernhard Herzog <[email protected]>
2667    
2668 bh 1920 * Thuban/UI/baserenderer.py
2669     (BaseRenderer.draw_shape_layer_incrementally): Use the ReadValue
2670     method. ReadValue is faster than ReadRowAsDict since it only reads
2671     one cell especially now that the dbf file objects actually
2672     implement it.
2673    
2674     * Thuban/Model/table.py (DBFTable.ReadValue): Use the new
2675     read_attribute method of the dbf objects
2676    
2677     2003-11-03 Bernhard Herzog <[email protected]>
2678    
2679 bh 1916 * Extensions/profiling/profiling.py (popup_dialog_box): New config
2680     variable to indicate whether the result should be shown in a
2681     dialog box
2682     (profile_screen_renderer, time_screen_renderer): Only show a
2683     dialog box if popup_dialog_box is true.
2684     (profile_screen_renderer): Flush stdout after the printing the
2685     first part of the "profiling..." message
2686    
2687     * Thuban/UI/baserenderer.py
2688     (BaseRenderer.draw_shape_layer_incrementally): Cache the pens and
2689     brushes for the groups so that they're not created over and over
2690     again
2691    
2692 bh 1913 * Thuban/Model/classification.py (Classification.__getattr__)
2693     (Classification._compile_classification)
2694     (Classification._clear_compiled_classification): New. Methods to
2695     manage a 'compiled' representation of the classification groups
2696     which is created on demand
2697     (Classification.InsertGroup, Classification.RemoveGroup)
2698     (Classification.ReplaceGroup): reset the compiled representation
2699     (Classification.FindGroup): Use the compiled representation to
2700     find the matching group
2701     (ClassGroupRange.GetRangeTuple): New. Return the range as a tuple
2702    
2703 bh 1904 2003-10-31 Bernhard Herzog <[email protected]>
2704    
2705 bh 1911 * Thuban/Model/classification.py (Classification.SetDefaultGroup):
2706     Send a CLASS_CHANGED message
2707     (Classification.RemoveGroup): Send a CLASS_CHANGED message and do
2708     not return the removed group since it wasn't used.
2709    
2710     * test/test_classification.py
2711     (TestClassification.test_set_default_group): New. Test the
2712     SetDefaultGroup method
2713     (TestClassification.test_insert_group): New. Test the InsertGroup
2714     method
2715     (TestClassification.test_remove_group): New. Test the RemoveGroup
2716     method
2717     (TestClassification.test_replace_group): New. Test the
2718     ReplaceGroup method
2719    
2720     2003-10-31 Bernhard Herzog <[email protected]>
2721    
2722 bh 1908 * test/test_classification.py (TestClassification.setUp):
2723     Subscribe to the CLASS_CHANGED messages
2724     (TestClassification.tearDown): New. Destroy the classification
2725     properly
2726     (TestClassification.test_defaults): Add tests for the default line
2727     width and whether no messages were sent yet
2728     (TestClassification.test_set_default_properties): Add tests for
2729     messages and setting the default line width
2730     (TestClassification.test_add_singleton)
2731     (TestClassification.test_add_range)
2732     (TestClassification.test_multiple_groups): Add tests for messages
2733    
2734     2003-10-31 Bernhard Herzog <[email protected]>
2735    
2736 bh 1906 Some more refactoring in preparation for new tests:
2737    
2738     * test/test_classification.py (TestClassification.setUp): New.
2739     Instantiate the classification here. Update the test methods
2740     accordingly.
2741     (TestClassification.test_multiple_groups): Make sure that the two
2742     singletons matching 1 are considered different.
2743    
2744     2003-10-31 Bernhard Herzog <[email protected]>
2745    
2746 bh 1904 * test/test_classification.py (red, green, blue): New. These
2747     constants were used in several cases. Update the relevant methods.
2748     (TestClassification.test_defaults)
2749     (TestClassification.test_set_default_properties)
2750     (TestClassification.test_add_singleton)
2751     (TestClassification.test_add_range)
2752     (TestClassification.test_multiple_groups)
2753     (TestClassification.test_deepcopy): New. These were formerly all
2754     part of the single method test.
2755     (TestClassification.test_deepcopy): Removed.
2756     (TestClassIterator): Removed. The test case is now a method of
2757     TestClassification since it tests part of the public interface of
2758     Classification
2759     (TestClassification.test_iterator): New. Used to be
2760     TestClassIterator effectively
2761    
2762 jan 1902 2003-10-31 Jan-Oliver Wagner <[email protected]>
2763    
2764     GUIfied the functions of the profiling extension.
2765    
2766     * /Extensions/profiling/__init__.py: New: Init to make this
2767     directory a package.
2768    
2769     * Extensions/profiling/profiling.py: Moved menu entries to
2770     the Extensions menu. Applied _() for strings.
2771     (profile_screen_renderer): Catch the detailed printout and present
2772     it in a dialog.
2773 bh 1904 (time_screen_renderer): Raise a dialog to present the result instead
2774 jan 1902 of printing it to stdout.
2775    
2776 bh 1897 2003-10-31 Bernhard Herzog <[email protected]>
2777    
2778 bh 1899 * test/test_classification.py (TestClassGroupProperties)
2779     (TestClassGroup, TestClassGroupDefault, TestClassGroupRange)
2780     (TestClassGroupSingleton, TestClassIterator, TestClassification):
2781     Split TestClassification into several classes, one for each class
2782     being tested. TestClassification itself now only tests
2783     Classification. This split makes changes to the tests a bit easier
2784    
2785     2003-10-31 Bernhard Herzog <[email protected]>
2786    
2787 bh 1897 * Extensions/profiling/profiling.py: New. Extension to measure
2788     Thuban performance
2789    
2790 frank 1895 2003-10-31 Frank Koormann <[email protected]>
2791    
2792     Added two items to legend popup menu: Remove Layer and Show Layer Table
2793    
2794     * Thuban/UI/legend.py (LegendPanel._OnRemoveLayer,
2795     LegendPanel._OnShowTable): New event handlers, call the corresponding
2796     mainwindow methods.
2797     (LegendTree._OnRightClick): Added items to popup menu.
2798    
2799 bh 1894 2003-10-30 Bernhard Herzog <[email protected]>
2800    
2801     * Thuban/UI/dialogs.py (ThubanFrame.__init__): Handle
2802     EVT_WINDOW_DESTROY
2803     (ThubanFrame.OnDestroy): New. Handler for EVT_WINDOW_DESTROY. Does
2804     nothing but is convenient for the derived classes.
2805    
2806     * Thuban/UI/tableview.py
2807     (TableFrame.OnDestroy, LayerTableFrame.OnDestroy): New.
2808     Unsubscribe the messages here not in OnClose because that might
2809     get called multiple times. Fixes RT #2196
2810     (TableFrame.OnClose, LayerTableFrame.OnClose): Removed. Not needed
2811     anymore.
2812    
2813     * README: Update the minimum requirement for wxPython. Since we
2814     now use the EVT_WINDOW_DESTROY event, we need at least 2.4.0.4,
2815     the version in which that was introduced for all platforms
2816    
2817 frank 1890 2003-10-30 Frank Koormann <[email protected]>
2818    
2819     * Thuban/UI/join.py (JoinDialog.OnJoin): Wrapped the major parts of
2820     the join process in a ThubanBeginBusyCursor, ThubanEndBusyCursor
2821     frame.
2822    
2823 jan 1889 2003-10-30 Jan-Oliver Wagner <[email protected]>
2824    
2825     Improved APR import extension, added further EPSG definitions
2826     and some cleanup regarding string class.
2827    
2828     * test/test_proj.py (TestProjection.test_get_projection_units_geo):
2829     Added test for alias 'longlat'.
2830    
2831     * Resources/Projections/epsg-deprecated.proj: New. Contains
2832     deprecated EPSG definitions.
2833    
2834     * Extensions/importAPR/odb.py (ODBBaseObject.TreeInfo): Added
2835     the variable names for objects.
2836    
2837     * Extensions/importAPR/apr.py (APR_BLnSym, APR_BMkSym, APR_BShSym): New.
2838     Copied from importAPR and provided with documentation.
2839    
2840     * Extensions/importAPR/importAPR.py (APR_BLnSym, APR_BMkSym, APR_BShSym):
2841     Moved to apr.py.
2842     (APR_View): Added object ref 'ITheme'.
2843    
2844     * Thuban/Lib/fileutil.py, Thuban/UI/proj4dialog.py: Replaced string
2845     split function by corresponding use of the string class method.
2846    
2847     * Thuban/Model/xmlwriter.py: Replaced string replace function by
2848     corresponding string method.
2849    
2850 bh 1880 2003-10-29 Bernhard Herzog <[email protected]>
2851    
2852     * Thuban/UI/baserenderer.py
2853     (BaseRenderer.draw_shape_layer_incrementally): Speed up the
2854     special case of a classification that only has the default group
2855    
2856 bh 1868 2003-10-27 Bernhard Herzog <[email protected]>
2857    
2858 bh 1878 * po/fr.po, po/es.po: Updated translations from Daniel Calvelo
2859    
2860 bh 1876 * po/de.po: Update.
2861    
2862     * Thuban/UI/application.py
2863     (ThubanApplication.ShowExceptionDialog): Handle translation of the
2864     dialog message properly
2865    
2866     2003-10-27 Bernhard Herzog <[email protected]>
2867    
2868 bh 1873 Rework how localization works so that we use wx's translation
2869     functions when running Thuban as a normal application but not when
2870     we don't need any UI, such as in the test suite. See the comment
2871     in Thuban/__init__.py for details
2872    
2873     * Thuban/__init__.py (_): Add one level of indirection to make the
2874     translation handling more flexible and to make it possible to use
2875     either wx's translation services or not.
2876     (gettext_identity, translation_function_installed)
2877     (install_translation_function): New function to help with this
2878    
2879     * Thuban/UI/__init__.py: Install the wx specific translation
2880     function if it's OK to do that
2881    
2882     * test/support.py (initthuban): Install a dummy translation
2883     function so that importing Thuban.UI doesn't install a wx specific
2884     one for which would need to import wxPython
2885    
2886     2003-10-27 Bernhard Herzog <[email protected]>
2887    
2888 bh 1870 * HOWTO-Release: Source archives should be created first and the
2889     binary packages should be created from the source archives.
2890     There's an official debian package now so there's no need to test
2891     the rpm on debian anymore
2892    
2893     2003-10-27 Bernhard Herzog <[email protected]>
2894    
2895 bh 1868 Several rendering changes:
2896    
2897     - Render the selection into a separate bitmap so that only that
2898     bitmap needs to be redrawn when the selection changes
2899    
2900     - Render incrementally showing previews and allowing interaction
2901     before rendering is complete
2902    
2903     - Update the renderer interface a bit. Most parameters of
2904     RenderMap are now parameters of the constructor
2905    
2906     * Thuban/UI/baserenderer.py (BaseRenderer.__init__): Add the map
2907     and the update region as parameters. Update the doc-string
2908     (BaseRenderer.render_map_incrementally): New. Generator function
2909     to renders the map incrementally
2910     (BaseRenderer.render_map): Remove the map argument (it's now in
2911     the constructor) and simply iterate over the
2912     render_map_incrementally generator to draw the map.
2913     (BaseRenderer.draw_shape_layer_incrementally)
2914     (BaseRenderer.draw_shape_layer): Renamed to
2915     draw_shape_layer_incrementally and changed into a generator that
2916     yields True every 500 shapes. Used by render_map_incrementally to
2917     render shape layers incrementally
2918    
2919     * Thuban/UI/renderer.py (ScreenRenderer.RenderMap): Removed the
2920     map and region parameters which are now in the constructor
2921     (ScreenRenderer.RenderMapIncrementally): New. Public frontend for
2922     the inherited render_map_incrementally.
2923     (BaseRenderer.draw_shape_layer): Removed.
2924     (ScreenRenderer.draw_selection_incrementally): New. The selection
2925     drawing part of the removed draw_shape_layer as a generator
2926     (ScreenRenderer.layer_shapes): Update because of the region
2927     parameter change
2928     (ExportRenderer.__init__): New. Extend the inherited constructor
2929     with the destination region for the drawing
2930     (ExportRenderer.RenderMap): Removed the map and region parameters
2931     which are now in the constructor
2932    
2933     * Thuban/UI/view.py (MapCanvas.PreviewBitmap): New. Return a
2934     bitmap suitable for a preview in a tool
2935     (CanvasPanTool.MouseMove): Use the PreviewBitmap method to get the
2936     bitmap
2937     (MapPrintout.draw_on_dc): Adapt to new renderer interface
2938     (MapCanvas.OnPaint): Handle drawing the selection bitmap if it
2939     exists
2940     (MapCanvas.OnIdle): Update the logic to deal with incremental
2941     rendering and the selection bitmap
2942     (MapCanvas._do_redraw): Handle the instantiation of the render
2943     iterator and the redraws during rendering
2944     (MapCanvas._render_iterator): New. Generator to incrementally
2945     redraw both bitmaps
2946     (MapCanvas.Export): Adapt to new renderer interface.
2947     (MapCanvas.full_redraw): Reset the selection bitmap and the
2948     renderer iterator too
2949     (MapCanvas.redraw_selection): New. Force a redraw of the selection
2950     bitmap
2951     (MapCanvas.shape_selected): Only redraw the selection bitmap
2952    
2953     * test/test_baserenderer.py
2954     (TestBaseRenderer.test_polygon_no_projection)
2955     (TestBaseRenderer.test_raster_no_projection)
2956     (TestBaseRenderer.test_point_map_projection)
2957     (TestBaseRenderer.test_point_layer_and_map_projection)
2958     (TestBaseRenderer.test_point_layer_projection)
2959     (TestBaseRenderer.test_point_with_classification): Adapt to new
2960     renderer interface
2961    
2962 bh 1865 2003-10-24 Bernhard Herzog <[email protected]>
2963    
2964     * libraries/thuban/wxproj.cpp (draw_polygon_shape)
2965     (point_in_polygon_shape, shape_centroid): Raise an exception if
2966     the shape can't be read. Previously invalid shape ids would lead
2967     to a segfault.
2968    
2969     * test/test_wxproj.py (TestShapeCentroid.test_invalid_shape_id):
2970     New. test whether an exception is raised for invalid shape ids
2971    
2972 jan 1857 2003-10-24 Jan-Oliver Wagner <[email protected]>
2973    
2974 jan 1862 * Thuban/Model/proj.py (Projection.GetProjectedUnits): Added 'longlat'
2975     as alias for 'latlong'.
2976    
2977     * Thuban/UI/projdialog.py (ProjFrame.__init__): Added 'longlat'
2978     as alias for 'latlong'.
2979    
2980     2003-10-24 Jan-Oliver Wagner <[email protected]>
2981    
2982 jan 1859 * Thuban/UI/projdialog.py (ProjFrame.proj_selection_changed): Set
2983     the projection even for the UnknownPanel.
2984     (UnknownProjPanel.__init__): Define the text and create the textctrl
2985     widget.
2986     (UnknownProjPanel._DoLayout): Replaced static text widget by the
2987     textctrl created in __init__.
2988     (UnknownProjPanel.SetProjection): Set the text for the text ctrl
2989     including the parameters of the projection.
2990    
2991     2003-10-24 Jan-Oliver Wagner <[email protected]>
2992    
2993 jan 1857 * Resources/Projections/epsg.proj: New. This is a list of
2994     EPSG codes with parameters for proj. The list has been
2995     generated using devtools/create_epsg.py based on the
2996     file nad/epsg of the proj 4.4.7 package. Four projection
2997     definitions have been deleted as they are not accepted by proj:
2998     "CH1903+ / LV95", "Bern 1898 (Bern) / LV03C", "CH1903 / LV03"
2999     and "HD72 / EOV".
3000    
3001 bh 1855 2003-10-22 Bernhard Herzog <[email protected]>
3002    
3003     Some more tweaks to the projection dialog which should fix RT
3004     #1886.
3005    
3006     * Thuban/UI/projlist.py (ProjectionList.Destroy): Unsubscribe from
3007     the ProjFile's messages and call the base class methods correctly
3008     (ProjectionList.SelectProjection): Set the wxLIST_STATE_FOCUSED
3009     flag on the newly selected item too. Otherwise some other item is
3010     focused and the first time the focus is moved with the keyboard
3011     the selection moves in unexpected ways.
3012    
3013     * Thuban/UI/projdialog.py (ProjFrame.__init__): Do not set the
3014     focus on the OK button, only on the projection list. That way the
3015     list really has the focus initially
3016     (ProjFrame.OnClose): Call the projection list's Destroy method to
3017     make it unsubscribe all messages
3018    
3019 bh 1840 2003-10-21 Bernhard Herzog <[email protected]>
3020    
3021 bh 1852 Rework the projection dialog to fix a few bugs, including RT 2166
3022     and most of 2168
3023    
3024     * Thuban/UI/projlist.py: New. The class ProjectionList is a
3025     special wxListCtrl to show a list of projections in a more MVC
3026     fashion
3027    
3028     * Thuban/UI/projdialog.py (ProjFrame): Substantial changes
3029     throughout the class. The main change is to use the ProjectionList
3030     class instead of a normal wxListBox. Also, add an explicit
3031     "Unknown" projection to the projection choice control.
3032     (ProjPanel.__init__): Add an "unknown" ellipsoid
3033     (TMPanel.__init__, LCCPanel.__init__): Tweak the order of
3034     instantiation of the panel's controls to make the tab-order more
3035     natural
3036    
3037     2003-10-21 Bernhard Herzog <[email protected]>
3038    
3039 bh 1849 * test/test_load.py (TestSingleLayer.file_contents)
3040     (TestSingleLayer.test): Add non-ascii characters to the titles of
3041     session, map and layer. This is effectively a port of the
3042     TestUnicodeStrings test in test_load_0_8.py which for some reason
3043     was only added there.
3044    
3045     * test/test_load_0_9.py (TestSingleLayer.file_contents)
3046     (TestSingleLayer.test): Same as in test_load.py: add non-ascii
3047     characters to the titles of session, map and layer,.
3048    
3049     2003-10-21 Bernhard Herzog <[email protected]>
3050    
3051 bh 1847 Add EPSG projection handling to .thuban files
3052    
3053     * test/test_save.py (SaveSessionTest.dtd)
3054     (SaveSessionTest.testEmptySession)
3055     (SaveSessionTest.testLayerProjection)
3056     (SaveSessionTest.testRasterLayer)
3057     (SaveSessionTest.testClassifiedLayer)
3058     (SaveSessionTest.test_dbf_table)
3059     (SaveSessionTest.test_joined_table)
3060     (SaveSessionTest.test_save_postgis): Update to 1.0-dev namespace
3061     (SaveSessionTest.testSingleLayer): Update to 1.0-dev namespace and
3062     use a and epsg projection to test saving them
3063    
3064     * test/test_load.py (LoadSessionTest.dtd): Update to 1.0-dev
3065     namespace
3066     (TestLayerVisibility.file_contents, TestLabels.file_contents)
3067     (TestLayerProjection.file_contents)
3068     (TestRasterLayer.file_contents, TestJoinedTable.file_contents)
3069     (TestPostGISLayer.file_contents)
3070     (TestPostGISLayerPassword.file_contents)
3071     (TestLoadError.file_contents, TestLoadError.test): Update to use
3072     1.0-dev namespace
3073     (TestSingleLayer.file_contents, TestSingleLayer.test): Update to
3074     use 1.0-dev namespace and use an EPSG projection to test whether
3075     loading it works
3076    
3077     * test/test_load_0_9.py: New. Effectively a copy of test_load.py
3078     as of Thuban 0.9. These are now tests to determine whether Thuban
3079     can still read files generated by Thuban 0.9
3080    
3081     * Thuban/Model/save.py (SessionSaver.write)
3082     (SessionSaver.write_session): Use the 1.0 dtd and 1.0-dev
3083     namespace
3084     (SessionSaver.write_projection): Write the projection's epsg
3085     attribute
3086    
3087     * Thuban/Model/load.py (SessionLoader.__init__): Also accept the
3088     thuban-1.0-dev.dtd namespace
3089     (SessionLoader.check_attrs): Allow a callable object as conversion
3090     too
3091     (SessionLoader.start_projection, SessionLoader.end_projection)
3092     (SessionLoader.start_parameter): Handle the epsg attribute and
3093     rename a few instance variables to lower case
3094    
3095     * Resources/XML/thuban-1.0.dtd: New. Only difference to
3096     thuban-0.9.dtd is the epsg attribute for projections.
3097    
3098     2003-10-21 Bernhard Herzog <[email protected]>
3099    
3100 bh 1840 * test/runtests.py (main): Let the user specify which tests to run
3101     on the command line
3102    
3103     * test/support.py (ThubanTestResult.getDescription): Override to
3104     give a better short description. The description can be used as a
3105     parameter to run_tests to run that particular test in isolation.
3106    
3107 frank 1837 2003-10-21 Frank Koormann <[email protected]>
3108    
3109     Popup menu for legend. Scheduled for the 1.2 release this was too
3110     simple to implement: The popup menu is bound to the legend tree, while
3111     the events are hanlded by its anchestor, the legend panel. This
3112     allows reuse of all the event handlers already implemented for the
3113     legend toolbar buttons.
3114    
3115     * Thuban/UI/legend.py (LegendPanel.__init__): EVT_MENU macros
3116     to add handlers for the events issued by the popup menu.
3117     (LegendPanel._OnToggleVisibility): Handler for toggling layer
3118     visibility event
3119     (LegendPanel._OnProjection): Handler for layer projection event.
3120     (LegendTree.__init__): Added EVT_TREE_ITEM_RIGHT_CLICK
3121     (LegendTree._OnRightClick): Event handler for right click, select item
3122     and pop up menu.
3123     (LegendTree.ToggleVisibility): Toggle layer visibility
3124     (LegendTree.LayerProjection): Raise layer projection dialog for
3125     current layer.
3126    
3127 bh 1836 2003-10-21 Bernhard Herzog <[email protected]>
3128    
3129     * Resources/Projections/defaults.proj: Use correct DOCTYPE
3130     declaration. The top-level element is projectionlist not projfile
3131    
3132 bh 1834 2003-10-20 Bernhard Herzog <[email protected]>
3133    
3134     * Thuban/UI/projdialog.py (ProjFrame.write_proj_file): New. helper
3135     method to write a projfile and display a busy cursor and error
3136     dialogs.
3137     (ProjFrame._OnSave, ProjFrame._OnAddToList, ProjFrame._OnImport)
3138     (ProjFrame._OnExport, ProjFrame._OnRemove): Use write_proj_file
3139     (ProjFrame.__FillAvailList): Translate "<None>" too and display a
3140     busy cursor while loading the user and system prj files.
3141    
3142 bh 1832 2003-10-16 Bernhard Herzog <[email protected]>
3143    
3144     * Thuban/Model/resource.py (projfile_cache): Introduce a cache for
3145     ProjFile objects
3146     (clear_proj_file_cache): New function to clear the cache. Mainly
3147     useful for use by the test suite
3148     (read_proj_file): Use the cache.
3149    
3150     * test/test_proj.py (TestProjFile): Clarify the doc-string
3151     (ProjFileReadTests): Update doc-string
3152     (ProjFileReadTests.test_get_system_proj_file): Check whether the
3153     system proj files is cached.
3154     (ProjFileLoadTestCase): New base class for the proj file tests
3155     derived from support.FileLoadTestCase to provide some common
3156     behavior.
3157     (TestLoadingProjFile)
3158     (TestLoadingProjFileWithEmptyProjectionlist.file_contents)
3159     (TestProjFileWithInvalidParameters.file_contents): Derive from
3160     ProjFileLoadTestCase
3161     (TestLoadingProjFile.test_caching): New. Test whether the cache
3162     works
3163    
3164 silke 1829 2003-10-16 Silke Reimer <[email protected]>
3165    
3166     * debian/*: New directory with configuration files for building a thuban
3167     deb-package.
3168    
3169 bh 1822 2003-10-14 Bernhard Herzog <[email protected]>
3170    
3171 bh 1828 * test/test_proj.py: Execute support.run_tests when run as
3172     __main__ so that missing unsubscribes are detected
3173     (TestProjFile.tearDown): Destroy the proj_file properly
3174    
3175     2003-10-14 Bernhard Herzog <[email protected]>
3176    
3177 bh 1826 * Thuban/Model/messages.py (PROJECTION_ADDED)
3178     (PROJECTION_REPLACED, PROJECTION_REMOVED): New message types for
3179     the ProjFile objects
3180    
3181     * Thuban/Model/proj.py (ProjFile): Derive from Publisher so we can
3182     easily send messages when the projections change
3183     (ProjFile.Add, ProjFile.Remove, ProjFile.Replace): Issue messages
3184     when the change was successful
3185    
3186     * test/test_proj.py (TestProjFile.setUp): Subscribe to some of the
3187     proj file messages
3188     (TestProjFile.test_add_remove)
3189     (TestProjFile.test_remove_non_existing)
3190     (TestProjFile.test_replace)
3191     (TestProjFile.test_replace_non_existing): Test whether the right
3192     messages are sent
3193    
3194     2003-10-14 Bernhard Herzog <[email protected]>
3195    
3196 bh 1822 * test/test_proj.py (TestProjFile.test): Refactor into several
3197     tests
3198     (TestProjFile.test_add_remove)
3199     (TestProjFile.test_remove_non_existing)
3200     (TestProjFile.test_replace)
3201     (TestProjFile.test_replace_non_existing): Some of the new
3202     individual test cases
3203     (TestProjFileSimple): New class for the rest of the test cases
3204     that came out of the refactoring
3205     (ProjFileTest): Derive from xmlsupport.ValidationTest so that the
3206     derived classes don't have to
3207    
3208 bh 1812 2003-10-13 Bernhard Herzog <[email protected]>
3209    
3210 bh 1820 Add an optional EPSG code to the projection objects and extend the
3211     .proj file format accordingly.
3212    
3213     * Resources/XML/projfile.dtd (element projection): Add epsg
3214     attribute
3215    
3216     * Thuban/Model/proj.py (Projection.__init__): New parameter and
3217     instance variable epsg. Update doc-string
3218     (Projection.EPSGCode, Projection.Label): New methods to provide
3219     access to EPSG code and a label for use in dialogs
3220    
3221     * Thuban/Model/resource.py (ProjFileReader.start_projection)
3222     (ProjFileReader.end_projection, ProjFileSaver.write_projfile):
3223     Handle the epsg code attribute when reading or writing proj files
3224    
3225     * Thuban/UI/projdialog.py (ProjFrame._OnSave)
3226     (ProjFrame._OnAddToList, ProjFrame.__DoOnProjAvail)
3227     (ProjFrame.__FillAvailList): Use the projection's Label method to
3228     get the string for the list box
3229    
3230     * test/test_proj.py (TestProjection.test_label)
3231     (TestProjection.test_label_epsg)
3232     (TestProjection.test_epsgcode_for_non_epsg_projection)
3233     (TestProjection.test_epsgcode_for_real_epsg_projection): New tests
3234     for the label and EPSGCode methods
3235     (WriteProjFileTests.doTestWrite, WriteProjFileTests.test_write)
3236     (WriteProjFileTests.test_write_empty_file): Create the ProjFile
3237     objects in the test cases and put the expected contents into the
3238     test case methods too. Update doTestWrite accordingly
3239     (TestLoadingProjFile)
3240     (TestLoadingProjFileWithEmptyProjectionlist): New classes with the
3241     read tests from TestProjFile.
3242     (TestProjFile.doTestRead, TestProjFile.testRead): Removed. These
3243     tests are now in the new classes.
3244     (sample_projfile, sample_projfile_data)
3245     (sample_projfile2, sample_projfile_data2): Removed. Not used
3246     anymore.
3247     (TestProjFile.test_read_unreadable_file): No need to reset the
3248     permissions at the end anymore since we use a unique filename
3249    
3250     2003-10-13 Bernhard Herzog <[email protected]>
3251    
3252 bh 1814 * test/test_proj.py: Some more refactoring of the test cases
3253     (ProjFileTest): New base class for the proj file tests.
3254     (TestProjFile): Derive from ProjFileTest
3255     (TestProjFile.test_read_unreadable_file)
3256     (TestProjFile.test_read_empty_file, TestProjFile.doTestRead): Use
3257     the new filename method to get a unique filename
3258     (TestProjFile.doTestWrite, TestProjFile.testWrite): Removed.
3259     (WriteProjFileTests): New class for proj file write tests.
3260     Contains the write test that were in TestProjFile originally.
3261    
3262     2003-10-13 Bernhard Herzog <[email protected]>
3263    
3264 bh 1812 * test/test_proj.py (TestProjFile.testRead)
3265     (TestProjFile.test_read_non_existing_file)
3266     (TestProjFile.test_read_unreadable_file)
3267     (TestProjFile.test_read_empty_file): Split into several methods.
3268    
3269 bh 1805 2003-10-10 Bernhard Herzog <[email protected]>
3270    
3271 bh 1810 * Thuban/UI/sizers.py: New file with custom sizers.
3272    
3273     * Thuban/UI/projdialog.py (ProjFrame.build_dialog): Instantiate
3274     all projection type specific panels and put them into a
3275     NotebookLikeSizer. This way the dialog doesn't change its size
3276     when a different projection is selected
3277     (ProjFrame.__init__): Rename projection_panels
3278     projection_panel_defs and reuse projection_panels for a list of
3279     the instantiated panels.
3280     (ProjFrame._show_proj_panel, ProjFrame.__DoOnProjAvail)
3281     (ProjFrame.__DoOnProjChoice): Changes due to the new handling of
3282     the panels
3283     (UnknownProjPanel._DoLayout): Place the newlines in the message
3284     differently to make the panel narrower.
3285     (TMPanel._DoLayout): Layout the parameters in one column.
3286    
3287     2003-10-10 Bernhard Herzog <[email protected]>
3288    
3289 bh 1807 * Thuban/UI/projdialog.py (ProjFrame.build_dialog): New method
3290     that contains all the setup for the dialog's widgets, layout and
3291     event handling.
3292     (__): Call build_dialog to build the dialog.
3293     (ProjFrame.__set_properties, ProjFrame.__do_layout): Removed.
3294     Their functionality is now in build_dialog
3295     (ProjFrame.__VerifyButtons, ProjFrame.__VerifyButtons)
3296     (ProjFrame.__DoOnProjAvail, ProjFrame.__DoOnProjAvail)
3297     (ProjFrame.__DoOnProjChoice): Small updates due to slightly
3298     different widget names and hierarchy introduced with build_dialog.
3299    
3300     2003-10-10 Bernhard Herzog <[email protected]>
3301    
3302 bh 1805 * README: Fix typo.
3303    
3304 bh 1803 2003-10-09 Bernhard Herzog <[email protected]>
3305    
3306     * Thuban/Model/proj.py (ProjFile.Add): Do not check whether the
3307     projection is already in the list. This is *a lot* faster when
3308     loading files with hundreds of projections since it saves a linear
3309     search. OTOH this will allow adding the same projection to the
3310     user.proj file multiple times in the projection dialog but we'll
3311     deal with that later
3312    
3313 jan 1801 2003-10-09 Jan-Oliver Wagner <[email protected]>
3314    
3315     * devtools: New. Directory for developer tools that are not intended
3316     for the regular user.
3317    
3318     * devtools/create_epsg.py: New. Convert the epsg file of proj into
3319     a python .proj file.
3320    
3321 bh 1799 2003-10-09 Bernhard Herzog <[email protected]>
3322    
3323     * test/test_proj.py
3324     (TestProjection.test_get_parameter_without_equals_sign): New. Test
3325     whether GetParameter handles parameters without "=" sign correctly
3326    
3327     * Thuban/Model/proj.py (Projection.GetParameter): Handle
3328     parameters that do not contain a "=". Update the doc-string
3329    
3330 bh 1794 2003-10-08 Bernhard Herzog <[email protected]>
3331    
3332 bh 1796 * Thuban/UI/projdialog.py (ProjFrame.__set_properties): Remove the
3333     length limit on the projname text control
3334    
3335     2003-10-08 Bernhard Herzog <[email protected]>
3336    
3337 bh 1794 * test/test_proj.py (TestProjection.test_get_projection_units_geo)
3338     (TestProjection.test_get_projection_units_normal): New. Tests for
3339     the Projection.GetProjectedUnits method
3340    
3341 jan 1792 2003-10-08 Jan-Oliver Wagner <[email protected]>
3342    
3343     * Thuban/Model/resource.py (get_user_proj_file): small bug-fix:
3344     Added missing 'val' parameter.
3345    
3346 bh 1788 2003-10-08 Bernhard Herzog <[email protected]>
3347    
3348 bh 1790 * Thuban/UI/projdialog.py (ProjFrame.__DoOnProjAvail): When the
3349     projection type of the currently selected projection is not known,
3350     i.e. there's no panel for it, use the UnknownProjPanel
3351     (ProjFrame.__DoOnProjChoice, ProjFrame._show_proj_panel): Split
3352     the actual replacing of the proj panel into the new method
3353     _show_proj_panel.
3354     (UnknownProjPanel): Add doc-string.
3355     (UnknownProjPanel._DoLayout): Insert a newline into the text so
3356     that the panel is not so wide.
3357    
3358     2003-10-08 Bernhard Herzog <[email protected]>
3359    
3360 bh 1788 * Thuban/Model/resource.py (read_proj_file): Return the warnings
3361     too. Update the doc-string
3362     (get_proj_files): Removed. It wasn't used anywhere
3363     (get_system_proj_files, get_system_proj_file): Rename to
3364     get_system_proj_file and return the ProjFile object and not a list
3365     of ProjFile objects. Update the callers.
3366     (get_user_proj_files, get_user_proj_file): Rename to
3367     get_user_proj_file return the ProjFile object and not a list of
3368     ProjFile objects. Update the callers.
3369     (ProjFileReader.__init__): New instance variable for the warnings.
3370     Rename the __pf ivar to projfile. Update the methods referring to
3371     __pf
3372     (ProjFileReader.end_projection): Catch any errors raised when
3373     instantiating the projection and record that as an error. The
3374     projection will not be in the final ProjFile object.
3375     (ProjFileReader.GetWarnings): New method to return the warnings.
3376    
3377     * Thuban/UI/projdialog.py (ProjFrame.show_warnings): New method to
3378     show the warnings from the projfile reader
3379     (ProjFrame._OnImport): Deal with any warnings returned by
3380     read_proj_file
3381     (ProjFrame.__FillAvailList): Deal with any warnings returned by
3382     get_system_proj_file or get_user_proj_file.
3383    
3384     * test/test_proj.py (TestProjFile.doTestRead): Check the warnings.
3385     (TestProjFileWithInvalidParameters.file_contents): New test cases
3386     to test whether read_proj_file handles invalid projection
3387     parameters correctly
3388     (TestProjFile.test_get_system_proj_file): New. Simple test for
3389     resource.get_system_proj_file
3390    
3391 bh 1785 2003-10-07 Bernhard Herzog <[email protected]>
3392    
3393     * test/test_derivedshapestore.py
3394     (TestDerivedShapeStoreExceptions.tearDown): Clear the session
3395     properly so that the temporary directories get deleted correctly
3396    
3397 bh 1773 2003-10-06 Bernhard Herzog <[email protected]>
3398    
3399 bh 1783 Handle the title changes in a proper MVC way.
3400    
3401     * Thuban/UI/mainwindow.py (MainWindow.__init__): Subscribe to the
3402     canvas' TITLE_CHANGED messages
3403     (MainWindow.update_title): New. Update the main window's title
3404     (MainWindow.__SetTitle): Removed. Use update_title instead.
3405     (MainWindow.SetMap): Use update_title instead of __SetTitle
3406     (MainWindow.RenameMap): Do change the window title explicitly
3407     here. That's handled in a proper MVC way now.
3408     (MainWindow.title_changed): New. Subscriber for the TITLE_CHANGED
3409     messages
3410    
3411     * Thuban/Lib/connector.py (Conduit): New class to help classes
3412     that forward messages
3413    
3414     * Thuban/UI/viewport.py: Forward the map's TITLE_CHANGED messages
3415     (ViewPort): Derive from Conduit instead of Publisher
3416     (ViewPort.Subscribe, ViewPort.Unsubscribe): Use the new base class
3417     when calling the inherited versions
3418     (ViewPort._subscribe_map, ViewPort._unsubscribe_map): New helper
3419     methods to subscribe and unsubscribe map messages
3420     (ViewPort.SetMap, ViewPort.Destroy): Use the new helper methods to
3421     handle the map subscriptions
3422     (ViewPort.Map, ViewPort.map_projection_changed)
3423     (ViewPort.layer_projection_changed): Add or update doc-strings
3424    
3425     * test/test_connector.py (TestPublisher.test_issue_simple): Fix
3426     typo
3427     (MyConduit): Helper class for the Conduit test.
3428     (TestConduit): Test cases for Conduit
3429    
3430     * test/test_connector.py: Use support.run_tests as main.
3431    
3432     * test/test_viewport.py (ViewPortTest.setUp): Also subscribe to
3433     the TITLE_CHANGED messages
3434     (ViewPortTest.test_forwarding_title_changed): New test to check
3435     whether the viewport forwards the map's TITLE_CHANGED messages
3436     (TestViewportWithPostGIS.tearDown): Call the map's Destroy method
3437     after the port's because the latter may require a still functional
3438     map.
3439    
3440     2003-10-06 Bernhard Herzog <[email protected]>
3441    
3442 bh 1777 * Thuban/UI/application.py (ThubanApplication.maps_changed): Add
3443     doc-string
3444    
3445     2003-10-06 Bernhard Herzog <[email protected]>
3446    
3447 bh 1775 * test/test_viewport.py (ViewPortTest.setUp)
3448     (SimpleViewPortTest.test_init_with_size): Move the test for the
3449     initial size as a constructor parameter from ViewPortTest.setUp
3450     method to a new separate test in SimpleViewPortTest.
3451    
3452     2003-10-06 Bernhard Herzog <[email protected]>
3453    
3454 bh 1773 * test/test_viewport.py (MockView): New class derived from
3455     ViewPort with a mock implementation of GetTextExtent to be used in
3456     the test cases
3457     (ViewPortTest.setUp): Use MockView instead of ViewPort
3458    
3459     * Thuban/UI/viewport.py (ViewPort.GetTextExtent): Turn this method
3460     into what would be a "pure virtual function" in C++: always raise
3461     NotImplementedError. Mock implementations for test cases don't
3462     belong into the real code
3463    
3464 bh 1770 2003-10-02 Bernhard Herzog <[email protected]>
3465    
3466     * test/test_layer.py (TestLayer.test_empty_layer): Explicitly
3467     close the dbf file we create so that it's contents have been
3468     written properly.
3469    
3470     * libraries/shapelib/shptree.c, libraries/shapelib/shpopen.c,
3471     libraries/shapelib/shapefil.h, libraries/shapelib/dbfopen.c:
3472     Update to shapelib 1.2.10
3473    
3474 jan 1767 2003-10-01 Jan-Oliver Wagner <[email protected]>
3475    
3476     * Thuban/UI/tree.py, Thuban/UI/main.py: Remove the #! line as
3477     it annoys lintian which warns about these files not being
3478     executable. The #! isn't necessary here since if you absolutely
3479     must execute them you can always say "python <filename>".
3480    
3481 bh 1757 2003-09-26 Bernhard Herzog <[email protected]>
3482    
3483 bh 1760 * Thuban/Model/classgen.py (GenQuantiles0): Removed since it's
3484     only used in GREAT-ER but not used in Thuban itself. When GREAT-ER
3485     is ported to a newer the import will fail, so it should be noticed
3486     immediately that this function is gone.
3487     Fixes RT#1919
3488    
3489     2003-09-26 Bernhard Herzog <[email protected]>
3490    
3491 bh 1757 Add a DTD for the projection files and make thuban write valid
3492     projection files
3493    
3494     * Resources/XML/projfile.dtd: New. DTD for thuban's projection
3495     files
3496    
3497     * Thuban/Model/resource.py (ProjFileSaver.write): Use
3498     'projectionlist' as the name in the document type declaration so
3499     that it matches the element type of the root element.
3500    
3501     * test/test_proj.py (sample_projfile, sample_projfile2): Use
3502     'projectionlist' as the name in the document type declaration just
3503     as it is done now in the files thuban would write
3504     (sample_projfile, sample_projfile_data): Fix spelling of
3505     "Mercator"
3506     (TestProjFile.doTestWrite): Validate the written and the expected
3507     XML data
3508     (TestProjFile): Derive from ValidationTest so that we can run xml
3509     validation tests
3510    
3511 bh 1751 2003-09-24 Bernhard Herzog <[email protected]>
3512    
3513     * Thuban/UI/renderer.py (ExportRenderer.render_legend): Do not
3514     modify the list returned by map.Layers() in place since it is the
3515     actual list of layers used by the map.
3516    
3517 jan 1745 2003-09-23 Jan-Oliver Wagner <[email protected]>
3518    
3519     * Doc/manual/thuban-manual.xml: Added subsection to chapter
3520     Extensions to describe the extensions coming with the Thuban
3521     standard package (gns2shp and importAPR).
3522    
3523 bh 1743 2003-09-23 Bernhard Herzog <[email protected]>
3524    
3525     * libraries/thuban/wxproj.cpp (project_point): if there's an
3526     inverse but no forward projection, convert to degrees after
3527     applying the inverse projection. Fixes RT#2096
3528    
3529     * test/test_wxproj.py: New. Test cases for wxproj.so. One test
3530     implicitly tests for the fix to RT#2096
3531    
3532     * test/support.py (FloatComparisonMixin.assertFloatSeqEqual):
3533     Check that the sequences have the same lengths
3534    
3535     * Resources/Projections/defaults.proj (Geographic projection): Use
3536     a much more precise value for the to_meter attribute.
3537    
3538 bh 1737 2003-09-22 Bernhard Herzog <[email protected]>
3539    
3540     * test/support.py (initthuban): Make sure to unset the LANG env.
3541     var. so that tests that compare translated strings work. Solves RT
3542     #2094
3543    
3544 jan 1730 2003-09-22 Jan-Oliver Wagner <[email protected]>
3545    
3546 jan 1735 Small improvement of APR import.
3547    
3548     * Extensions/importAPR/test/test_apr.py (aprTest.test_LClass):
3549     Added tests for text-ranges.
3550    
3551     * Extensions/importAPR/apr.py (APR_LClass.GetThubanRange): Now
3552     returns a string object if the range is based on text.
3553    
3554     * Extensions/importAPR/importAPR.py (import_apr_dialog): Unified
3555     range retrieval.
3556    
3557     2003-09-22 Jan-Oliver Wagner <[email protected]>
3558    
3559 jan 1730 Initial version of the importAPR extension which is in
3560     experimental state.
3561    
3562     * /Extensions/importAPR/, /Extensions/importAPR/samples/,
3563     /Extensions/importAPR/test/: New directories.
3564    
3565     * /Extensions/importAPR/samples/README: New: Howto load the samples.
3566    
3567     * /Extensions/importAPR/samples/iceland.apr: New: A sample APR
3568     file which refers to the Thuban Iceland demo data.
3569    
3570     * /Extensions/importAPR/test/README: New: Howto execute the tests.
3571    
3572     * /Extensions/importAPR/test/test_apr.py: New: Tests for APR classes.
3573    
3574     * /Extensions/importAPR/apr.py: New: Classes for ArcView Objects
3575     as in '.apr'-files.
3576    
3577     * /Extensions/importAPR/odb.py: New: Classes for generic ArcView
3578     ODB Objects as in '.apr', '.avl' and other files.
3579    
3580     * /Extensions/importAPR/__init__.py: New: Init to make this
3581     directory a package.
3582    
3583     * /Extensions/importAPR/importAPR.py: New: Import a ArcView
3584     project file (.apr) and convert it to Thuban.
3585    
3586     2003-09-22 Jan-Oliver Wagner <[email protected]>
3587    
3588     * Extensions/gns2shp.gns2shp.py: The main module of gns2shp.
3589    
3590 jan 1720 2003-09-19 Jan-Oliver Wagner <[email protected]>
3591    
3592     * Doc/manual/thuban-manual.xml: Extended section 'Installation'
3593     with description on RPM installation and RPM binary package
3594     creation.
3595    
3596 bh 1718 2003-09-18 Bernhard Herzog <[email protected]>
3597    
3598     * setup.py (data_files): Only add the mo files if the Locales
3599     directory actually exists, so that setup.py works with a fresh CVS
3600     checkout
3601    
3602 jan 1716 2003-09-12 Jan-Oliver Wagner <[email protected]>
3603    
3604     * Examples/simple_extensions/simple_tool.py: bugfix: Tool is now
3605     in viewport, not anymore in view
3606    
3607 jan 1714 2003-09-04 Jan-Oliver Wagner <[email protected]>
3608    
3609     Introducing first Extension (gns2shp).
3610    
3611     * Extensions, Extensions/gns2shp, Extensions/gns2shp/test: New.
3612    
3613     * Extensions/__init__.py: New. init to make this dir a package.
3614    
3615     * Extensions/gns2shp/__init__.py: New. init to make this dir a package.
3616    
3617     * Extensions/gns2shp/test/README: New. some info on this test directory.
3618    
3619     * Extensions/gns2shp/test/ls.txt: New. test data set (Liechtenstein).
3620    
3621     * Extensions/gns2shp/test/test_gns2shp.py: New. Test for correct creation
3622     of Shapefile from GNS text file format
3623    
3624 jan 1705 2003-09-03 Jan-Oliver Wagner <[email protected]>
3625    
3626 jan 1707 Fix/workaround for bug #2019:
3627     https://intevation.de/rt/webrt?serial_num=2019
3628    
3629     * Thuban/UI/identifyview.py (IdentifyView.ID_STOP): New.
3630     (IdentifyView.__init__): Added another button that allows to
3631     stop the identify mode.
3632     (IdentifyView.OnStop): New. Stops the identify mode.
3633    
3634     2003-09-03 Jan-Oliver Wagner <[email protected]>
3635    
3636 jan 1705 Introducing a new exception dialog that allows to exit the
3637     application immediately.
3638     This fixes bug #2060: https://intevation.de/rt/webrt?serial_num=2060
3639    
3640     * Thuban/UI/exceptiondialog.py: New. A special exception dialog.
3641    
3642     * Thuban/UI/application.py (ThubanApplication.ShowExceptionDialog):
3643     Made strings available to translations. Exchanged the simple
3644     ScrolledMessageDialog by the new ExceptionDialog.
3645    
3646 bh 1694 2003-09-01 Bernhard Herzog <[email protected]>
3647    
3648 bh 1701 * NEWS: New. Summary of changes and release notes.
3649    
3650     * MANIFEST.in: Add NEWS
3651    
3652     2003-09-01 Bernhard Herzog <[email protected]>
3653    
3654 bh 1699 * MANIFEST.in: Correct the include statement for the mo-files and
3655     include the documentation too.
3656    
3657     * setup.py (data_files): Add the .mo files
3658     (setup call): Up to version 0.9.0
3659    
3660     2003-09-01 Bernhard Herzog <[email protected]>
3661    
3662 bh 1696 * Thuban/UI/dbdialog.py (ChooseDBTableDialog.__init__): Change the
3663     parameter list to just parent and session
3664     (ChooseDBTableDialog.__set_properties): Removed. Setting the
3665     selection of empty list boxes is not allowed (and produces C++
3666     assertion errors) and the rest of the setup is better done in
3667     __init__ anyway.
3668     (ChooseDBTableDialog.OnCancel, ChooseDBTableDialog.OnOK)
3669     (ChooseDBTableDialog.OnLBDClick, DBDialog.OnOK): Use the Python
3670     builtins True/False for booleans to avoid warnings from wxPython
3671    
3672     * Thuban/UI/mainwindow.py (MainWindow.AddDBLayer): Adapt to new
3673     ChooseDBTableDialog constructor parameters.
3674    
3675     2003-09-01 Bernhard Herzog <[email protected]>
3676    
3677 bh 1694 * Thuban/Model/postgisdb.py
3678     (PostGISTable): Extend doc-string
3679     (PostGISTable._fetch_table_information): Set the column index
3680     correctly, pretending ignored columns don't exist.
3681    
3682     * test/test_postgis_db.py (TestPostGISIgnoredColumns): New tests
3683     for postgis tables with data types not yet supported by thuban.
3684    
3685 bh 1692 2003-08-29 Bernhard Herzog <[email protected]>
3686    
3687     * HOWTO-Release: Tweak item about running the tests.
3688    
3689 jan 1690 2003-08-29 Jan-Oliver Wagner <[email protected]>
3690    
3691     * /Doc/manual/thuban-manual.xml: updated to version 1.0pre2.
3692    
3693 bh 1688 2003-08-29 Bernhard Herzog <[email protected]>
3694    
3695     Add some missing parameters to projections. Proj complains about
3696     them on windows but for some reason not on Linux.
3697    
3698     * test/test_save.py (SaveSessionTest.testLayerProjection): Add
3699     missing required projection parameters
3700    
3701     * test/test_proj.py (TestProjFile.test): Add missing required
3702     projection parameters
3703    
3704     * test/test_load_0_8.py (TestLayerProjection.file_contents)
3705     (TestLayerProjection.test): Add missing required projection
3706     parameters and tests for them
3707    
3708     * test/test_load.py (TestLayerProjection.file_contents)
3709     (TestLayerProjection.test): Add missing required projection
3710     parameters and tests for them
3711    
3712     * test/test_layer.py (TestLayer.test_base_layer): Add missing
3713     required projection parameters
3714    
3715     2003-08-29 Bernhard Herzog <[email protected]>
3716    
3717     * libraries/pyprojection/Projection.i: Use pj_get_errno_ref to
3718     access the pj_errno because directly accessing pj_errno doesn't
3719     work on windows if the proj library is in a DLL
3720    
3721     * libraries/pyprojection/Projection_wrap.c: Update from Projection.i
3722    
3723 bh 1672 2003-08-28 Bernhard Herzog <[email protected]>
3724    
3725 bh 1685 * test/test_proj.py: Import things from Thuban after calling
3726     initthuban
3727    
3728     * test/test_load.py (LoadSessionTest.filenames): New class
3729     variable with the filename attributes to normalize
3730     (LoadSessionTest.check_format): Pass self.filenames to
3731     sax_eventlist to normalize the filename attributes
3732    
3733     * test/xmlsupport.py: Add cvs keywords
3734     (SaxEventLister.__init__): New parameter filenames which indicates
3735     attributes that contain filenames
3736     (SaxEventLister.startElementNS): Normalize the filename attributes
3737     with os.path.normpath
3738     (sax_eventlist): New parameter filenames to pass through to
3739     SaxEventLister
3740    
3741     * test/test_derivedshapestore.py: Make this file callable as a
3742     program to execute the tests
3743     (TestDerivedShapeStoreExceptions.test_table_with_wrong_size): Bind
3744     the session to self.session so that it gets destroyed properly
3745    
3746     * test/test_layer.py (TestLayer.tearDown): Call the session's
3747     Destroy method
3748    
3749     * test/test_map.py (TestMapBase.tearDown): Destroy self.session
3750     too if it exists
3751     (TestMapAddLayer.test_add_layer): Bind the session to self.session
3752     so that it gets destroyed properly
3753    
3754     * test/postgissupport.py (reason_for_not_running_tests): Add a
3755     test for the existence of popen2.Popen4.
3756    
3757     * test/test_save.py (SaveSessionTest.tearDown): New. Provide a
3758     reliable way to destroy the sessions created in the test cases
3759     (SaveSessionTest.test_dbf_table): Bind the session to self.session
3760     so that it gets destroyed properly
3761     (SaveSessionTest.testLayerProjection): Bind the session to
3762     self.session so that it gets destroyed properly
3763    
3764     * test/test_session.py (UnreferencedTablesTests.tearDown): Make
3765     sure that the session is destroyed properly
3766    
3767     * test/test_shapefilestore.py: Make this callable as a program to
3768     execute the tests
3769    
3770     * test/test_scalebar.py: Remove unnecessary import of _ from
3771     Thuban
3772    
3773     * test/support.py (print_garbage_information): Call initthuban
3774     here because it may be called indirectly from test cases that test
3775     test support modules which do not use anything from thuban itself
3776     (ThubanTestProgram.runTests): Remove unnecessary debug print
3777    
3778     2003-08-28 Bernhard Herzog <[email protected]>
3779    
3780 bh 1672 * Thuban/version.py (longversion): Update to 0.9
3781    
3782     * Thuban/UI/mainwindow.py: Remove some unused imports
3783    
3784     * README: Add section about required additional software. Add date
3785     and revision CVS keywords
3786    
3787     * HOWTO-Release: Add item about the translations. Add date and
3788     revision CVs keywords and change formatting to match README a bit
3789     better
3790    
3791     * po/de.po: Update for 0.9
3792    
3793     * test/README: Tweak the wording a little because many tests are
3794     not really unittest.
3795    
3796 bh 1663 2003-08-27 Bernhard Herzog <[email protected]>
3797    
3798 bh 1665 As preparation for the 0.9 release, switch thuban files to a
3799     non-dev namespace
3800    
3801     * Thuban/Model/save.py (SessionSaver.write_session): Write files
3802     with the http://thuban.intevation.org/dtds/thuban-0.9.dtd
3803     namespace
3804    
3805     * Thuban/Model/load.py (SessionLoader.__init__): Accept the
3806     http://thuban.intevation.org/dtds/thuban-0.9.dtd namespace too
3807    
3808     * test/test_save.py (SaveSessionTest.dtd)
3809     (SaveSessionTest.testEmptySession)
3810     (SaveSessionTest.testSingleLayer)
3811     (SaveSessionTest.testLayerProjection)
3812     (SaveSessionTest.testRasterLayer)
3813     (SaveSessionTest.testClassifiedLayer)
3814     (SaveSessionTest.test_dbf_table)
3815     (SaveSessionTest.test_joined_table)
3816     (SaveSessionTest.test_save_postgis): Update for new namespace
3817    
3818     * test/test_load.py (LoadSessionTest.dtd, TestSingleLayer)
3819     (TestLayerVisibility.file_contents, TestLabels.file_contents)
3820     (TestLayerProjection.file_contents)
3821     (TestRasterLayer.file_contents, TestJoinedTable.file_contents)
3822     (TestPostGISLayer.file_contents)
3823     (TestPostGISLayerPassword.file_contents)
3824     (TestLoadError.file_contents, TestLoadError.test): Update for new
3825     namespace
3826    
3827     2003-08-27 Bernhard Herzog <[email protected]>
3828    
3829 bh 1663 Make the table interface distinguish between row ids (an integer
3830     that uniquely identifies a row) and row ordinals (a simple row
3831     count from 0 to NumRows() - 1)
3832    
3833     * Thuban/Model/postgisdb.py (PostGISTable.RowIdToOrdinal)
3834     (PostGISTable.RowOrdinalToId): New methods to conver between row
3835     ids and row ordinals
3836     (PostGISTable.ReadRowAsDict, PostGISTable.ReadValue): New keyword
3837     parameter row_is_ordinal to indicate whether the row parameter is
3838     the row id or the ordinal
3839    
3840     * Thuban/Model/transientdb.py (TransientTableBase.RowIdToOrdinal)
3841     (TransientTableBase.RowOrdinalToId)
3842     (AutoTransientTable.RowIdToOrdinal)
3843     (AutoTransientTable.RowOrdinalToId): Same new methods as in
3844     PostGISTable.
3845     (TransientTableBase.ReadRowAsDict, TransientTableBase.ReadValue)
3846     (AutoTransientTable.ReadRowAsDict, AutoTransientTable.ReadValue):
3847     Same new parameter as in PostGISTable.
3848    
3849     * Thuban/Model/table.py (DBFTable.RowIdToOrdinal)
3850     (DBFTable.RowOrdinalToId, MemoryTable.RowIdToOrdinal)
3851     (MemoryTable.RowOrdinalToId): Same new methods as in PostGISTable.
3852     (DBFTable.ReadValue, DBFTable.ReadRowAsDict)
3853     (MemoryTable.ReadValue, MemoryTable.ReadRowAsDict): Same new
3854     parameter as in PostGISTable.
3855    
3856     * Thuban/UI/tableview.py (DataTable.RowIdToOrdinal)
3857     (DataTable.RowOrdinalToId): New methods to convert between row ids
3858     and row ordinals.
3859     (TableGrid.SelectRowById): New method to select a row based on its
3860     ID as opposed to its ordinal
3861     (DataTable.GetValue, TableGrid.OnRangeSelect)
3862     (TableGrid.OnSelectCell, LayerTableGrid.select_shapes)
3863     (QueryTableFrame.OnQuery, QueryTableFrame.get_selected)
3864     (LayerTableFrame.__init__): Convert between row ids and row
3865     ordinals as appropriate
3866    
3867     * test/postgissupport.py (PostGISDatabase.__init__): Add
3868     doc-string.
3869     (PostGISDatabase.initdb): The optional third item in a tuple in
3870     tables is now a (key, value) list with additional arguments to
3871     pass to upload_shapefile
3872     (upload_shapefile): New parameter gid_offset to allow gids that
3873     are not the same as the shapeids in the shapefile
3874     (PostgreSQLServer.get_default_static_data_db): Use the new
3875     gid_offset to make the gids in landmarks 1000 higher than the
3876     shapeids in the shapefile
3877    
3878     * test/test_viewport.py
3879     (TestViewportWithPostGIS.test_find_shape_at_point): Adapt to the
3880     new shapeids in the landmarks table
3881    
3882     * test/test_transientdb.py
3883     (TestTransientTable.run_iceland_political_tests)
3884     (TestTransientTable.test_transient_joined_table): Add tests for
3885     the new table methods and new keywords arguments.
3886    
3887     * test/test_postgis_db.py
3888     (TestPostGISTable.test_read_row_as_dict_row_count_mode)
3889     (TestPostGISTable.test_read_value_row_count_mode)
3890     (TestPostGISTable.test_row_id_to_ordinal)
3891     (TestPostGISTable.test_row_oridnal_to_id): New test for the new
3892     table methods and the new arguments
3893     (TestPostGISShapestorePoint.test_shapes_in_region)
3894     (TestPostGISShapestorePoint.test_shape_raw_data)
3895     (TestPostGISShapestorePoint.test_shape_points)
3896     (TestPostGISShapestorePoint.test_shape_shapeid)
3897     (TestPostGISShapestorePoint.test_all_shapes)
3898     (TestPostGISTable.test_simple_query)
3899     (TestPostGISTable.test_simple_query)
3900     (TestPostGISTable.test_simple_query)
3901     (TestPostGISTable.test_read_value)
3902     (TestPostGISTable.test_read_row_as_dict): Adapt to the new
3903     shapeids in the landmarks table
3904    
3905     * test/test_memory_table.py
3906     (TestMemoryTable.test_read_row_as_dict_row_count_mode)
3907     (TestMemoryTable.test_read_value_row_count_mode)
3908     (TestMemoryTable.test_row_id_to_ordinal)
3909     (TestMemoryTable.test_row_oridnal_to_id): New test for the new
3910     table methods and the new arguments
3911    
3912     * test/test_dbf_table.py
3913     (TestDBFTable.test_read_row_as_dict_row_count_mode)
3914     (TestDBFTable.test_read_value_row_count_mode)
3915     (TestDBFTable.test_row_id_to_ordinal)
3916     (TestDBFTable.test_row_oridnal_to_id): New test for the new table
3917     methods and the new arguments
3918    
3919 bh 1659 2003-08-26 Bernhard Herzog <[email protected]>
3920    
3921 bh 1661 * Thuban/Model/postgisdb.py (PostGISShapeStore.BoundingBox): Use a
3922     more postgis specific but much faster method to get the bounding
3923     box
3924    
3925     2003-08-26 Bernhard Herzog <[email protected]>
3926    
3927 bh 1659 * Thuban/Model/postgisdb.py (PostGISTable.Title)
3928     (PostGISShapeStore.AllShapes): Add these missing methods.
3929     (PostGISShapeStore.ShapesInRegion): No need to raise
3930     StopIteration. We can simply return
3931    
3932     * test/test_postgis_db.py (TestPostGISTable.test_title)
3933     (TestPostGISShapestorePoint.test_all_shapes): New tests for the
3934     new methods
3935    
3936 bh 1643 2003-08-25 Bernhard Herzog <[email protected]>
3937    
3938 bh 1657 * Thuban/Model/postgisdb.py (shapetype_map): Add MUTLIPOLYGON.
3939    
3940     * test/test_postgis_db.py (PolygonTests): New class containing
3941     those tests from TestPostGISShapestorePolygon that can also be
3942     used to test MUTLIPOLYGON tables
3943     (TestPostGISShapestorePolygon): Most tests are now in PolygonTests
3944     so derive from that
3945     (TestPostGISShapestoreMultiPolygon): New class with tests for
3946     MUTLIPOLYGON tables
3947    
3948     * test/postgissupport.py (PostGISDatabase.initdb): Allow the
3949     tables argument to have tuples with three items to override the
3950     WKT type used.
3951     (PostgreSQLServer.get_default_static_data_db): Use the above to
3952     create a polygon table with MUTLIPOLYGONs
3953     (point_to_wkt, coords_to_point, polygon_to_wkt, coords_to_polygon)
3954     (arc_to_wkt, coords_to_multilinestring): Rename from *_to_wkt to
3955     coords_to*
3956     (coords_to_multipolygon): New. Convert to MUTLIPOLYGON
3957     (wkt_converter): New. Map WKT types to converters
3958     (upload_shapefile): New parameter force_wkt_type to use a
3959     different WKT type than the default
3960    
3961     2003-08-25 Bernhard Herzog <[email protected]>
3962    
3963 bh 1655 * Thuban/UI/application.py
3964     (ThubanApplication.run_db_param_dialog): New. Suitable as a
3965     db_connection_callback. Main difference is that the dialog run
3966     from this method doesn't have a parent so it can be used even when
3967     there is no main window
3968     (ThubanApplication.OpenSession): Use self.run_db_param_dialog if
3969     no db_connection_callback was given. This way the dialog pops up
3970     even when the .thuban file was given as a command line parameter.
3971    
3972     2003-08-25 Bernhard Herzog <[email protected]>
3973    
3974 bh 1653 * Thuban/UI/view.py (MapCanvas.OnLeftUp): Release the the mouse
3975     before calling MouseLeftUp. MouseLeftUp may pop up modal dialogs
3976     which leads to an effectively frozen X session because the user
3977     can only interact with the dialog but the mouse is still grabbed
3978     by the canvas.
3979     Also, call the tool's Hide method before MouseLeftUp because
3980     MouseLeftUp may change the tool's coordinates.
3981    
3982     2003-08-25 Bernhard Herzog <[email protected]>
3983    
3984 bh 1651 * Thuban/UI/application.py (ThubanApplication.OpenSession): Catch
3985     LoadCancelled exceptions and handle them by returning immediately.
3986    
3987     2003-08-25 Bernhard Herzog <[email protected]>
3988    
3989 bh 1649 GUI part of loading sessions with postgis connections which may
3990     require user interaction to get passwords or updated parameters
3991    
3992     * Thuban/UI/dbdialog.py (DBDialog): Reimplement to make it look a
3993     bit nucer and be more generic.
3994     (DBFrame.OnAdd): Adapt to new DBDialog interface
3995    
3996     * Thuban/UI/application.py (ThubanApplication.OpenSession): New
3997     optional parameter db_connection_callback which is passed to
3998     load_session.
3999    
4000     * Thuban/UI/mainwindow.py (MainWindow.run_db_param_dialog): New.
4001     Suitable as a db_connection_callback
4002     (MainWindow.OpenSession): Use self.run_db_param_dialog as the
4003     db_connection_callback of the application's OpenSession method
4004    
4005    
4006     2003-08-25 Bernhard Herzog <[email protected]>
4007    
4008 bh 1647 Basic loading of sessions containing postgis connections:
4009    
4010     * Thuban/Model/load.py (LoadError): Add doc-string
4011     (LoadCancelled): New exception class to indicate a cancelled load
4012     (SessionLoader.__init__): Add the db_connection_callback parameter
4013     which will be used by the loader to get updated parameters and a
4014     password for a database connection
4015     (SessionLoader.__init__): Add the new XML elements to the
4016     dispatchers dictionary
4017     (SessionLoader.check_attrs): Two new conversions, ascii to convert
4018     to a byte-string object and idref as a generic id reference
4019     (SessionLoader.start_dbconnection)
4020     (SessionLoader.start_dbshapesource): New. Handlers for the new XML
4021     elements
4022     (load_session): Add the db_connection_callback to pass through the
4023     SessionLoader
4024    
4025     * test/test_load.py (TestPostGISLayer, TestPostGISLayerPassword):
4026     New classes to test loading of sessions with postgis database
4027     connections.
4028    
4029     2003-08-25 Bernhard Herzog <[email protected]>
4030    
4031 bh 1645 * Thuban/UI/mainwindow.py (__ThubanVersion__): Remove this and
4032     replace it and the comment with __BuildDate__ by the Source: and
4033     Id: cvs keywords as used in the other files.
4034    
4035     2003-08-25 Bernhard Herzog <[email protected]>
4036    
4037 bh 1643 * Thuban/Model/load.py (SessionLoader.check_attrs): Raise a
4038     LoadError when a required attribute is missing. The code used to
4039     be commented out for some reason, but probably should have been
4040     active.
4041    
4042     * test/test_load.py (TestLoadError.test): Test the message in the
4043     LoadError too to make sure it really is about the missing
4044     attribute
4045    
4046 bh 1632 2003-08-22 Bernhard Herzog <[email protected]>
4047 bh 1641
4048     * test/test_save.py (SaveSessionTest.test_dbf_table)
4049     (SaveSessionTest.test_joined_table): Add XML validation tests.
4050    
4051     2003-08-22 Bernhard Herzog <[email protected]>
4052    
4053 bh 1639 Implement saving a session with a postgis connection
4054 bh 1632
4055 bh 1639 * Resources/XML/thuban-0.9.dtd (dbconnection, dbshapesource) New
4056     elements for database connections and shapestores using db
4057     connections
4058     (session): Add the dbconnections to the content model
4059    
4060     * Thuban/Model/save.py (SessionSaver.write_db_connections): New.
4061     Write the db connections
4062     (SessionSaver.write_session): Call write_db_connections to write
4063     the connection before the data sources
4064     (SessionSaver.write_data_containers): Handle postgis shapestores
4065    
4066     * test/test_save.py (SaveSessionTest.thubanids)
4067     (SaveSessionTest.thubanidrefs): Update for new DTD
4068     (SaveSessionTest.test_save_postgis): New. Test saving a session
4069     with postgis connections
4070    
4071     * Thuban/Model/postgisdb.py (PostGISTable.DBConnection)
4072     (PostGISTable.TableName): New accessor methods for the connection
4073     and table name
4074    
4075     * test/test_postgis_db.py (TestPostGISTable.test_dbconn)
4076     (TestPostGISTable.test_dbname): New methods to test the new
4077     PostGISConnection methods
4078    
4079     2003-08-22 Bernhard Herzog <[email protected]>
4080    
4081 bh 1637 * Thuban/Model/postgisdb.py (ConnectionError): New exception class
4082     for exceptions occurring when establishing a Database connection
4083     (PostGISConnection.connect): Catch psycopg.OperationalError during
4084     connects and raise ConnectionError.
4085    
4086     * test/test_postgis_db.py (TestPostgisDBExceptions): New class for
4087     tests for database exceptions
4088    
4089     2003-08-22 Bernhard Herzog <[email protected]>
4090    
4091 bh 1635 Prepare the test suite for tests with required authentication
4092    
4093     * test/postgissupport.py (PostgreSQLServer.__init__): Add instance
4094     variables with two predefined users/passwords, one for the admin
4095     and one for a non-privileged user.
4096     (PostgreSQLServer.createdb): Pass the admin name to initdb and add
4097     the non-privileged user to the database and set the admin password
4098     (PostgreSQLServer.wait_for_postmaster): Use the admin user name.
4099     Better error reporting
4100     (PostgreSQLServer.connection_params)
4101     (PostgreSQLServer.connection_string): New methods to return
4102     information about how to connect to the server
4103     (PostgreSQLServer.execute_sql): New. Convenience method to execute
4104     SQL statements
4105     (PostgreSQLServer.require_authentication): Toggle whether the
4106     server requires authentication
4107     (PostgreSQLServer.create_user, PostgreSQLServer.alter_user): New.
4108     Add or alter users
4109     (PostGISDatabase.initdb): Pass the admin name one the
4110     subprocesses' command lines. Grant select rights on
4111     geometry_columns to everybody.
4112     (upload_shapefile): Use the admin name and password when
4113     connecting. Grant select rights on the new table to everybody.
4114    
4115     * test/test_viewport.py (TestViewportWithPostGIS.setUp): Use the
4116     server's new methods to get the connection parameters.
4117    
4118     * test/test_postgis_session.py (TestSessionWithPostGIS.setUp)
4119     (TestSessionWithPostGIS.test_remove_dbconn_exception): Use the
4120     server's new methods to get the connection parameters.
4121    
4122     * test/test_postgis_db.py
4123     (TestPostGISConnection.test_gis_tables_empty)
4124     (TestPostGISConnection.test_gis_tables_non_empty)
4125     (PostGISStaticTests.setUp): Use the server's new methods to get
4126     the connection parameters.
4127    
4128     2003-08-22 Bernhard Herzog <[email protected]>
4129    
4130 bh 1632 * Thuban/UI/about.py (About.__init__): Add the psycopg version.
4131    
4132     * Thuban/version.py: Add psycopg version
4133    
4134     * Thuban/Model/postgisdb.py (psycopg_version): New. Return the
4135     version of the psycopg module
4136    
4137     2003-08-22 Bernhard Herzog <[email protected]>
4138    
4139     * Thuban/UI/dbdialog.py (DBPwdDlg): Removed because it's not used.
4140     (DBFrame.OnEdit): Removed because it's not used and wouldn't work
4141     at the moment. The functionality should probably be implemented
4142     some time, though.
4143 bh 1633 (DBFrame.OnRemove): Display a message if the connection can't be
4144     removed because it's still in use.
4145 bh 1632
4146 jan 1629 2003-08-22 Jan-Oliver Wagner <[email protected]>
4147    
4148     * Thuban/UI/about.py (About.__init__): split up the huge about
4149     text into elements/lists for easier translation. This fixes bug
4150     https://intevation.de/rt/webrt?serial_num=2058
4151     Also, made some forgotten string available for the i18n.
4152    
4153 bh 1627 2003-08-21 Bernhard Herzog <[email protected]>
4154    
4155     Make postgis support really optional including insensitive menu
4156     items.
4157    
4158     * Thuban/Model/postgisdb.py (has_postgis_support): New. Return
4159     whether the postgis is supported.
4160    
4161     * Thuban/UI/dbdialog.py: Put the psycopg import into try..except
4162     to make postgis support optional
4163    
4164     * Thuban/UI/mainwindow.py (_has_postgis_support): New. Context
4165     version of Thuban.Model.postgisdb.has_postgis_support
4166     (database_management command): Make it only sensitive if postgis
4167     is supported.
4168    
4169 jan 1623 2003-08-21 Jan-Oliver Wagner <[email protected]>
4170    
4171 jan 1626 * Doc/manual/thuban-manual.xml: Added CVS revision for rev-history.
4172     (section Adding and Removing Layers): Added text and described
4173     multi-selection.
4174     (chapter Extensions): New.
4175    
4176     2003-08-21 Jan-Oliver Wagner <[email protected]>
4177    
4178 jan 1623 * Thuban/UI/mainwindow.py (MainWindow.AddLayer): Changed dialog
4179     settings to allow multiple files to load into the map.
4180     Also reduced selection to *.shp as a default.
4181    
4182 bh 1621 2003-08-20 Bernhard Herzog <[email protected]>
4183    
4184     Add dialogs and commands to open database connections and add
4185     database layers.
4186    
4187     * Thuban/UI/mainwindow.py (MainWindow.DatabaseManagement): New
4188     method to open the database connection management dialog
4189     (MainWindow.AddDBLayer): New method to add a layer from a database
4190     (_has_dbconnections): New helper function to use for sensitivity
4191     (database_management command, layer_add_db command): New commands
4192     that call the above new methods.
4193     (main_menu): Add the new commands to the menu.
4194    
4195     * Thuban/Model/postgisdb.py (PostGISConnection.__init__)
4196     (PostGISConnection.connect): Establish the actual connection in a
4197     separate method and call it in __init__. This makes it easier to
4198     override the behavior in test cases
4199     (PostGISConnection.BriefDescription): New method to return a brief
4200     description for use in dialogs.
4201    
4202     * test/test_postgis_db.py (NonConnection): DB connection that
4203     doesn't actually connect
4204     (TestBriefDescription): New class with tests for the new
4205     BriefDescription method
4206    
4207 jan 1619 2003-08-19 Jan-Oliver Wagner <[email protected]>
4208    
4209     Moved anything from extensions to libraries.
4210    
4211     * libraries: New.
4212    
4213     * libraries/ pyprojection, pyshapelib, shapelib, thuban: New.
4214    
4215     * libraries/pyprojection/ LICENSE, MANIFEST.in, Projection.i,
4216     Projection.py, Projection_wrap.c, setup.py, swighelp.txt: These files have
4217     been moved here from thuban/extensions/pyprojection/
4218     See there in the Attic for the older history.
4219    
4220     * libraries/pyshapelib/ COPYING, ChangeLog, NEWS, README, dbflib.i,
4221     dbflib.py, dbflib_wrap.c, pyshapelib_api.h, pytest.py, setup.py,
4222     shapelib.i, shapelib.py, shapelib_wrap.c, shptreemodule.c: These files
4223     have been moved here from thuban/extensions/pyshapelib/
4224     See there in the Attic for the older history.
4225    
4226     * libraries/shapelib/ dbfopen.c, shapefil.h, shpopen.c, shptree.c: These
4227     files have been moved here from thuban/extensions/shapelib/
4228     See there in the Attic for the older history.
4229    
4230     * libraries/thuban/ bmpdataset.cpp, cpl_mfile.cpp, cpl_mfile.h,
4231     gdalwarp.cpp, wxproj.cpp: These files have been moved here from
4232     thuban/extensions/thuban/
4233     See there in the Attic for the older history.
4234    
4235     * MANIFEST.in, setup.cfg, setup.py: renamed extensions to libraries.
4236    
4237     * extensions/thuban/ bmpdataset.cpp, cpl_mfile.cpp, cpl_mfile.h,
4238     gdalwarp.cpp, wxproj.cpp: Moved to libraries/thuban.
4239    
4240     * extensions/shapelib/ dbfopen.c, shapefil.h, shpopen.c, shptree.c:
4241     Moved to libraries/shapelib.
4242    
4243     * extensions/pyshapelib/ COPYING, NEWS, dbflib.py, pytest.py,
4244     shapelib.py, README, dbflib_wrap.c, setup.py, shapelib_wrap.c,
4245     ChangeLog, dbflib.i, pyshapelib_api.h, shapelib.i, shptreemodule.c:
4246     Moved to libraries/pyshapelib.
4247    
4248     * extensions/pyprojection/ MANIFEST.in, Projection.py, setup.py,
4249     LICENSE, Projection.i, Projection_wrap.c, swighelp.txt:
4250     Moved to libraries/pyprojection.
4251    
4252     * extensions/ pyprojection, pyshapelib, shapelib, thuban: Removed.
4253    
4254     * extensions: Removed.
4255    
4256 bh 1606 2003-08-19 Bernhard Herzog <[email protected]>
4257    
4258 bh 1609 * test/test_viewport.py (ViewPortTest): We don't use the
4259     facilities of FileTestMixin so don't derive from it.
4260     (TestViewportWithPostGIS): New class with tests for using a
4261     viewport on a map with postgis layers.
4262    
4263     2003-08-19 Bernhard Herzog <[email protected]>
4264    
4265     Add the db connection management to the session.
4266    
4267     * Thuban/Model/session.py (Session.__init__): New instance
4268     variable db_connections
4269     (Session.AddDBConnection, Session.DBConnections)
4270     (Session.HasDBConnections, Session.CanRemoveDBConnection)
4271     (Session.RemoveDBConnection): New methods to manage and query the
4272     db connections managed by the session
4273     (Session.OpenDBShapeStore): New method to open a shapestore from a
4274     db connection
4275    
4276     * Thuban/Model/messages.py (DBCONN_REMOVED, DBCONN_ADDED): New
4277     messages for the db connection handling in the session
4278    
4279     * test/test_postgis_session.py: New. test cases for the session's
4280     db connection handling with postgis connections
4281    
4282     2003-08-19 Bernhard Herzog <[email protected]>
4283    
4284 bh 1606 Add very basic postgis database support and the corresponding test
4285     cases. The test cases require a PostgreSQL + postgis installation
4286     but no existing database. The database will be created
4287     automatically by the test cases
4288    
4289     * test/README: Add note about skipped tests and the requirements
4290     of the postgis tests.
4291    
4292     * Thuban/Model/postgisdb.py: New. Basic postgis database support.
4293    
4294     * test/test_postgis_db.py: New. Test cases for the postgis
4295     support.
4296    
4297     * Thuban/Model/wellknowntext.py: New. Parser for well-known-text
4298     format
4299    
4300     * test/test_wellknowntext.py: New. Test cases for the
4301     wellknowntext parser
4302    
4303     * test/postgissupport.py: New. Support module for tests involving
4304     a postgis database.
4305    
4306     * test/support.py (execute_as_testsuite): Shut down the postmaster
4307     if it's still running after the tests
4308    
4309     * Thuban/Model/data.py (RAW_WKT): New constant for raw data in
4310     well known text format
4311    
4312 jan 1604 2003-08-19 Jan-Oliver Wagner <[email protected]>
4313    
4314     * Examples/simple_extensions/hello_world.py: New. Raises a Hello World
4315     message dialog.
4316    
4317 bh 1600 2003-08-18 Bernhard Herzog <[email protected]>
4318    
4319 bh 1602 * test/support.py (ThubanTestResult.printErrors): Indent the
4320     reason for the skips in the output to make it a bit more readable.
4321     (execute_as_testsuite): New helper function to run a test suite
4322     and print some more information.
4323     (run_tests): Use execute_as_testsuite to run the tests
4324    
4325     * test/runtests.py (main): Use execute_as_testsuite to run the
4326     tests
4327    
4328     2003-08-18 Bernhard Herzog <[email protected]>
4329    
4330 bh 1600 Fix some bugs in Thuban and the test suite that were uncovered by
4331     changes introduced in Python 2.3:
4332    
4333     * Thuban/Model/table.py (DBFTable.__init__): Make sure the
4334     filename is an absolute name
4335    
4336     * Thuban/Model/layer.py (RasterLayer.__init__): Make sure the
4337     filename is an absolute name
4338    
4339     * test/test_save.py (SaveSessionTest.testRasterLayer): Use a
4340     unique filename to save to and use the correct relative filename
4341     in the expected output.
4342     (SaveSessionTest.test_dbf_table): Use the correct relative
4343     filename in the expected output.
4344    
4345     * test/test_layer.py (TestLayer.test_raster_layer): Update the
4346     test to check whether the filename is absolute.
4347    
4348 jan 1596 2003-08-18 Jan-Oliver Wagner <[email protected]>
4349    
4350     * Thuban/UI/about.py (About.__init__): Added Silke Reimer.
4351    
4352 bh 1586 2003-08-15 Bernhard Herzog <[email protected]>
4353    
4354 bh 1594 Change the way shapes are returned by a shape store. The
4355     ShapesInRegion method returns an iterator over actual shape
4356     objects instead of a list of shape ids.
4357    
4358     * Thuban/Model/data.py (ShapefileShape.ShapeID): New. Return shape
4359     id.
4360     (ShapefileStore.ShapesInRegion): Return an iterator over the
4361     shapes which yields shape objects instead of returning a list of
4362     shape ids
4363     (ShapefileStore.AllShapes): New. Return an iterator over all
4364     shapes in the shape store
4365     (DerivedShapeStore.AllShapes): New. Like in ShapefileStore
4366    
4367     * Thuban/Model/layer.py (Layer.ShapesInRegion): Update
4368     doc-string.
4369    
4370     * Thuban/UI/baserenderer.py
4371     (BaseRenderer.layer_ids, BaseRenderer.layer_shapes): Rename to
4372     layer_shapes and make it return an iterator containg shapes
4373     instead of a list of ids.
4374     (BaseRenderer.draw_shape_layer): Update doc-string; Adapt to
4375     layer_shapes() change
4376    
4377     * Thuban/UI/renderer.py (ScreenRenderer.layer_ids)
4378     (ScreenRenderer.layer_shapes): Rename as in BaseRenderer
4379    
4380     * Thuban/UI/viewport.py (ViewPort._find_shape_in_layer): Adapt to
4381     changes in the ShapesInRegion return value.
4382     (ViewPort._get_hit_tester): Remove commented out code
4383    
4384     * test/mockgeo.py (SimpleShapeStore.ShapesInRegion): Adapt to the
4385     new return value.
4386     (SimpleShapeStore.AllShapes): New. Implement this method too.
4387    
4388     * test/test_layer.py (TestLayer.test_arc_layer)
4389     (TestLayer.test_polygon_layer, TestLayer.test_point_layer)
4390     (TestLayer.test_point_layer_with_projection)
4391     (TestLayer.test_derived_store): Adapt to changes in the
4392     ShapesInRegion return value.
4393    
4394     * test/test_shapefilestore.py
4395     (TestShapefileStoreArc.test_shapes_in_region)
4396     (TestShapefileStorePolygon.test_shapes_in_region)
4397     (TestShapefileStorePoint.test_shapes_in_region): Adapt to changes
4398     in the ShapesInRegion return value.
4399     (TestShapefileStorePoint.test_all_shapes)
4400     (TestShapefileStoreArc.test_shape_shapeid): New tests for the new
4401     methods
4402    
4403     * test/test_derivedshapestore.py
4404     (TestDerivedShapeStore.test_shapes_in_region): Adapt to changes in
4405     the ShapesInRegion return value.
4406     (TestDerivedShapeStore.test_all_shapes)
4407     (TestDerivedShapeStore.test_shape_shapeid): New tests for the new
4408     methods
4409    
4410     2003-08-15 Bernhard Herzog <[email protected]>
4411    
4412 bh 1592 Make the renderers deal correctly with raw vs. python level
4413     representation of shape geometries
4414    
4415     * Thuban/UI/baserenderer.py (BaseRenderer.low_level_renderer):
4416     Return a flag useraw in addition to the callable and the parameter
4417     to indicate whether the callable can deal with the raw shape data
4418     or uses the higher level python lists of coordinates. The callable
4419     now should accept either the raw data or the return value of the
4420     shape's Points() method.
4421     (BaseRenderer.draw_shape_layer): Adapt to the low_level_renderer
4422     change
4423     (BaseRenderer.projected_points): Instead of the shape id use the
4424     points list as parameter.
4425     (BaseRenderer.draw_polygon_shape, BaseRenderer.draw_arc_shape)
4426     (BaseRenderer.draw_point_shape): Adapt to projected_points()
4427     change and accept the points list as parameter instead of the
4428     shape id.
4429    
4430     * Thuban/UI/renderer.py (MapRenderer.low_level_renderer): Return
4431     the useraw flag as required by the BaseRenderer
4432     (ScreenRenderer.draw_shape_layer): Adapt to low-level renderer
4433     changes.
4434    
4435     * test/test_baserenderer.py
4436     (TestBaseRenderer.test_point_with_classification): New test for
4437     rendering a map with classifications.
4438    
4439     2003-08-15 Bernhard Herzog <[email protected]>
4440    
4441 bh 1590 * Thuban/UI/viewport.py (ViewPort.find_shape_at)
4442     (ViewPort._find_shape_in_layer, ViewPort._find_shape_in_layer)
4443     (ViewPort._get_hit_tester, ViewPort.projected_points)
4444     (ViewPort._hit_point, ViewPort._hit_arc, ViewPort._hit_polygon)
4445     (ViewPort._find_label_at): Split the find_shape_at method into
4446     several new methods and use the functions in the hit-test module.
4447    
4448     * Thuban/UI/hittest.py: New module with Python-level hit-testing
4449     functions
4450    
4451     * test/test_hittest.py: New. Test for the new hittest module
4452    
4453     2003-08-15 Bernhard Herzog <[email protected]>
4454    
4455 bh 1588 * Thuban/Model/layer.py (Layer.ShapesInRegion): Apply the layer
4456     projection to all corners of the bounding box to get a better
4457     approximation of the projected bounding box
4458    
4459     * test/test_layer.py (TestLayer.test_point_layer_with_projection):
4460     New. Test coordinate handling of a layer with a projection.
4461     Catches the bug fixed in Layer.ShapesInRegion
4462    
4463     2003-08-15 Bernhard Herzog <[email protected]>
4464    
4465 bh 1586 Move some of the mock objects in test_baserenderer into their own
4466     module so they can easily be used from other tests
4467    
4468     * test/mockgeo.py: New test helper module with some mock objects
4469     for geometry related things like shapes, shapestores and
4470     projections.
4471    
4472     * test/test_mockgeo.py: New. Tests for the new helper module
4473    
4474     * test/test_baserenderer.py: Some of the mock-objects are in
4475     mockgeo now.
4476    
4477 jan 1584 2003-08-12 Jan-Oliver Wagner <[email protected]>
4478    
4479     * Thuban/UI/about.py (About.__init__): Added Björn Broscheit.
4480    
4481 bh 1580 2003-08-12 Bernhard Herzog <[email protected]>
4482    
4483 bh 1582 * po/de.po: New. German translations by Bjoern Broscheit
4484    
4485     2003-08-12 Bernhard Herzog <[email protected]>
4486    
4487 bh 1580 * Thuban/UI/projdialog.py (UnknownProjPanel._DoLayout): Translated
4488     strings have to be one string literal.
4489    
4490 bh 1573 2003-08-11 Bernhard Herzog <[email protected]>
4491    
4492 bh 1578 * test/support.py (FloatComparisonMixin.assertPointListEquals):
4493     New. This method was used in various derived classes, but it's
4494     better to have it here.
4495    
4496     * test/test_shapefilestore.py
4497     (ShapefileStoreTests.assertPointListEquals): Removed. It's now in
4498     FloatComparisonMixin
4499    
4500     * test/test_layer.py (TestLayer.assertPointListEquals): Removed.
4501     It's now in FloatComparisonMixin
4502    
4503     * test/test_derivedshapestore.py
4504     (TestDerivedShapeStore.assertPointListEquals): Removed. It's now
4505     in FloatComparisonMixin
4506    
4507     2003-08-11 Bernhard Herzog <[email protected]>
4508    
4509 bh 1573 * Thuban/UI/join.py (JoinDialog.OnJoin): Add missing space to
4510     error message
4511    
4512 jan 1569 2003-08-08 Jan-Oliver Wagner <[email protected]>
4513    
4514 jan 1571 * Doc/manual/thuban-manual.xml: Now use authorgroup. Added revhistory
4515     with version number.
4516     Changed title to reflect version number of Thuban.
4517    
4518     2003-08-08 Jan-Oliver Wagner <[email protected]>
4519    
4520 jan 1569 * Thuban/UI/about.py (About.__init__): Reworked the hall of fame. Now
4521     the list corresponds to the "About" web page.
4522    
4523 bh 1567 2003-08-08 Bernhard Herzog <[email protected]>
4524    
4525     * Thuban/UI/projdialog.py (UTMProposeZoneDialog.dialogLayout):
4526     Make sure translated strings are recognized as one string literal.
4527    
4528     * Thuban/UI/proj4dialog.py (UTMProposeZoneDialog.dialogLayout):
4529     Make sure translated strings are recognized as one string literal.
4530    
4531     * Thuban/UI/classgen.py (ClassGenDialog.OnOK): Make sure
4532     translated strings are recognized as one string literal.
4533    
4534     * Thuban/UI/application.py (ThubanApplication.OpenSession): Make
4535     sure translated strings are recognized as one string literal.
4536    
4537 bh 1556 2003-08-07 Bernhard Herzog <[email protected]>
4538    
4539 bh 1565 * Thuban/Model/data.py (DerivedShapeStore.RawShapeFormat): New.
4540     Simply delegates to the original shapestore.
4541    
4542     * test/test_derivedshapestore.py
4543     (TestDerivedShapeStore.test_raw_format): New. Test case for
4544     DerivedShapeStore.RawShapeFormat
4545    
4546     2003-08-07 Bernhard Herzog <[email protected]>
4547    
4548 bh 1561 Add raw data interface to shape objects.
4549    
4550     * Thuban/Model/data.py (ShapefileShape, Shape): Rname the shape
4551     class to ShapefileShape which now holds shapefile specific
4552     information.
4553     (ShapefileShape.compute_bbox): Simplified to not cache any
4554     information. The way this method is used that shouldn't matter
4555     performance wise.
4556     (ShapefileShape.RawData): New. Return the shapeid which is the raw
4557     data format for shapes from shapefiles.
4558     (ShapefileStore.RawShapeFormat): New. Return the raw datatype used
4559     in the shape objects returned by a shapestore. For a
4560     ShapefileStore this is always RAW_SHAPEFILE.
4561     (RAW_PYTHON, RAW_SHAPEFILE): Constants for the RawShapeFormat
4562     method.
4563    
4564     * test/test_shapefilestore.py
4565     (TestShapefileStore.test_raw_format): New test to test the raw
4566     format feature of shapes.
4567    
4568 bh 1560 * Thuban/Model/layer.py: Remove the unused import of Shape from
4569     data. It was only there for interface compatibility but it's not
4570 bh 1561 used inside of Thuban and the generic Shape class has gone away.
4571 bh 1560
4572 bh 1563 * Thuban/UI/renderer.py (MapRenderer.low_level_renderer): Check
4573     the raw data format and only use an optimized version of its a
4574     shapefile.
4575    
4576 bh 1561 2003-08-07 Bernhard Herzog <[email protected]>
4577    
4578 bh 1559 * test/test_baserenderer.py (SimpleShape): Shape class for the
4579     tests.
4580     (SimpleShapeStore.Shape): Use SimpleShape instead of
4581     Thuban.Model.data.Shape to make the tests independed of the coming
4582     changes.
4583    
4584     2003-08-07 Bernhard Herzog <[email protected]>
4585    
4586 bh 1556 * test/support.py (SkipTest, ThubanTestResult, ThubanTestRunner)
4587     (ThubanTestProgram): New classes that extend the respective
4588     classes from unittest. These new version support skipping tests
4589     under certain expected conditions. In the Thuban test suite we
4590     uses this for tests that require the optional gdal support.
4591     (run_tests): Use ThubanTestProgram instead of the unittest.main()
4592    
4593     * test/runtests.py (main): Use the new ThubanTestRunner instead of
4594     the normal one from unittest
4595    
4596     * test/test_layer.py (TestLayer.test_raster_layer): If this test
4597     is not run because gdal support isn't available report this to the
4598     runner.
4599    
4600     * test/test_baserenderer.py
4601     (TestBaseRenderer.test_raster_no_projection): Do not run this test
4602     if gdal support isn't available and report this to the runner.
4603    
4604 bh 1553 2003-08-06 Bernhard Herzog <[email protected]>
4605    
4606     Rearrange the renderers a bit, partly in preparation for changes
4607     required for the postgis merge, partly to make it more testable.
4608     Also make the representation of coordinates in Shapes more
4609     consistent.
4610    
4611     * Thuban/UI/renderer.py (MapRenderer): Most of the code/methods in
4612     this class is now in BaseRenderer. This class is now practically
4613     only a specialization of BaseRenderer for rendering to an actual
4614     wx DC.
4615     (ScreenRenderer.draw_shape_layer): Use self.low_level_renderer()
4616     to get the shapetype specific rendering functions.
4617    
4618     * Thuban/UI/baserenderer.py: New file with the basic rendering
4619     logic. The code in this file is completely independend of wx.
4620     (BaseRenderer): Class with the basic rendering logic
4621    
4622     * test/test_baserenderer.py: New. Test cases for BaseRenderer
4623    
4624     * Thuban/UI/view.py (MapCanvas.__init__): New instance variable
4625     error_on_redraw to guard agains endless loops and stack overflows
4626     when there's a bug in the rendering code that raises exceptions.
4627     (MapCanvas.OnIdle, MapCanvas._do_redraw): Split the actual
4628     rendering into a separate method _do_redraw so that error handling
4629     is a bit easier. When an exception occurs, set error_on_redraw to
4630     true. When it's true on entry to OnIdle do nothing and return
4631     immediately.
4632    
4633     * Thuban/Model/data.py (ShapefileStore.Shape): For consistency, a
4634     Shape object will always have the coordinates as a list of list of
4635     coordinate pairs (tuples).
4636     (Shape.compute_bbox): Adapt to new representation.
4637    
4638     * Thuban/UI/viewport.py (ViewPort.find_shape_at)
4639     (ViewPort.LabelShapeAt): Adapt to new coordinate representation in
4640     Shape objects.
4641    
4642     * test/test_shapefilestore.py
4643     (ShapefileStoreTests.assertFloatTuplesEqual)
4644     (ShapefileStoreTests.assertPointListEquals): Rename to
4645     assertPointListEquals and change purpose to checking equality of
4646     the lists returned by Shape.Points().
4647     (TestShapefileStoreArc.test_shape)
4648     (TestShapefileStorePolygon.test_shape)
4649     (TestShapefileStorePoint.test_shape): Use the new
4650     assertPointListEquals instead of assertFloatTuplesEqual
4651    
4652     * test/test_layer.py (TestLayer.assertFloatTuplesEqual)
4653     (TestLayer.assertPointListEquals): Rename to assertPointListEquals
4654     and change purpose to checking equality of the lists returned by
4655     Shape.Points().
4656     (TestLayer.test_arc_layer, TestLayer.test_arc_layer)
4657     (TestLayer.test_polygon_layer, TestLayer.test_point_layer)
4658     (TestLayer.test_derived_store): Use the new assertPointListEquals
4659     instead of assertFloatTuplesEqual
4660    
4661     * test/test_derivedshapestore.py
4662     (TestDerivedShapeStore.assertFloatTuplesEqual)
4663     (TestDerivedShapeStore.assertPointListEquals): Rename to
4664     assertPointListEquals and change purpose to checking equality of
4665     the lists returned by Shape.Points().
4666     (TestDerivedShapeStore.test_shape): Use the new
4667     assertPointListEquals instead of assertFloatTuplesEqual
4668    
4669 jan 1550 2003-08-06 Jan-Oliver Wagner <[email protected]>
4670    
4671     * Thuban/UI/projdialog.py (UTMPanel._OnPropose): Added test for
4672     a bounding box. A dialog is raised in case, no bounding box
4673     is found. This fixes bug #2043:
4674     https://intevation.de/rt/webrt?serial_num=2043
4675    
4676 bh 1548 2003-08-05 Bernhard Herzog <[email protected]>
4677    
4678     * Thuban/Model/color.py (Color.__repr__): Make the repr of a color
4679     object look like a Color instantiation. Formerly it looked like a
4680     tuple.
4681    
4682     * test/test_color.py (TestColor.test_repr)
4683     (TestColor.test_equality, TestColor.test_inequality): New. test
4684     some more apects of the Color class
4685     (TestTransparent.test_repr, TestTransparent.test_hex)
4686     (TestTransparent.test_equality): New. Test cases for the
4687     Transparent object.
4688    
4689 jan 1545 2003-08-04 Jan-Oliver Wagner <[email protected]>
4690    
4691     * Doc/manual/thuban-manual.xml: a number of small improvements.
4692     The resulting file is the version submitted for GREAT-ER II.
4693    
4694 bh 1540 2003-08-01 Bernhard Herzog <[email protected]>
4695    
4696 bh 1543 * Thuban/UI/resource.py, Thuban/UI/projdialog.py,
4697     Thuban/UI/join.py, Thuban/UI/classgen.py, Thuban/UI/about.py,
4698     Thuban/Model/resource.py: Insert cvs keywords and doc-strings.
4699    
4700     * Thuban/UI/common.py: Insert cvs keywords and doc-strings.
4701     (Color2wxColour, wxColour2Color, ThubanBeginBusyCursor)
4702     (ThubanEndBusyCursor): Add doc-strings
4703    
4704     2003-08-01 Bernhard Herzog <[email protected]>
4705    
4706 bh 1540 First step towards PostGIS integration. More abstraction by movin
4707     more code from the layer to the shapestore. More methods of the
4708     layer are now simply delegated to the equivalent method of the
4709     shapestore. The SHAPETYPE_* constants are now in data not in
4710     layer.
4711    
4712     * Thuban/Model/data.py (SHAPETYPE_POLYGON, SHAPETYPE_ARC)
4713     (SHAPETYPE_POINT, Shape): Move these constants and classes from
4714     layer.py to data.py
4715     (ShapefileStore.__init__): More Initialization for the new methods
4716     and functionality.
4717     (ShapefileStore.ShapeType, ShapefileStore.NumShapes)
4718     (ShapefileStore.BoundingBox, ShapefileStore.ShapesInRegion)
4719     (ShapefileStore.Shape): New methods that were formerly implemented
4720     in the layer.
4721     (DerivedShapeStore.Shape, DerivedShapeStore.ShapesInRegion)
4722     (DerivedShapeStore.ShapeType, DerivedShapeStore.NumShapes)
4723     (DerivedShapeStore.BoundingBox): New. DerivedShapeStore
4724     equivalents of the new shape methods. These versions are simply
4725     delegated to the original shapstore.
4726    
4727     * Thuban/Model/layer.py (SHAPETYPE_POLYGON, SHAPETYPE_ARC)
4728     (SHAPETYPE_POINT, Shape): Removed. They're now in data.py
4729     (Layer.SetShapeStore): Removed the initializatin of instance
4730     variables that were needed for the stuff that's now in
4731     ShapefileStore
4732     (Layer.BoundingBox, Layer.NumShapes, Layer.ShapeType)
4733     (Layer.Shape, Layer.ShapesInRegion): Simply delegate to the
4734     shapestore.
4735    
4736     * Thuban/UI/classifier.py, Thuban/UI/renderer.py,
4737     Thuban/UI/viewport.py: Import the SHAPETYPE_* constants from data
4738     instead of layer.
4739    
4740     * test/test_shapefilestore.py: New. Tests for ShapefileStore.
4741    
4742     * test/test_derivedshapestore.py: New. Tests for DerivedShapeStore.
4743    
4744     * test/test_layer.py: Import the SHAPETYPE_* constants from data
4745     instead of layer.
4746     (TestLayer.test_derived_store): Remove the test for the exception
4747     when instantiating the DerivedShapeStore with an incompatible
4748     table which is now in test_derivedshapestore.py. Add some more
4749     tests of the layer methods to determine whether they work for a
4750     DerivedShapeStore as well.
4751    
4752 jonathan 1534 2003-07-31 Jonathan Coles <[email protected]>
4753    
4754     * Doc/manual/thuban-manual.xml: Fix the list of required packages
4755     by just listing the name and where they can be found.
4756    
4757 frank 1532 2003-07-31 Frank Koormann <[email protected]>
4758    
4759     * Doc/manual/thuban-manual.xml:
4760     Changed the screenshot elements to figure.
4761     Changed some variablelist elements to itemizedlist.
4762     Added section on GDAL formats.
4763    
4764 jonathan 1531 2003-07-31 Jonathan Coles <[email protected]>
4765    
4766     * Doc/manual/thuban-manual.xml: Added a few sentences about
4767     the Fix Border Color option when generating classes.
4768    
4769 jonathan 1529 2003-07-30 Jonathan Coles <[email protected]>
4770    
4771     * Thuban/Model/classgen.py: Add docstrings. Rename specific
4772     Ramp instances to use lower_case_style.
4773    
4774     * Thuban/UI/classgen.py: Use renamed Ramp instances.
4775    
4776     * Thuban/UI/classifier.py: Add docstrings.
4777    
4778     * Thuban/UI/dock.py: Add docstrings.
4779    
4780     * test/test_classgen.py: Use renamed Ramp instances.
4781    
4782 bh 1522 2003-07-30 Bernhard Herzog <[email protected]>
4783    
4784 bh 1524 * Thuban/Lib/connector.py (QueueingPublisher): Removed. This class
4785     was never used in Thuban.
4786    
4787     2003-07-30 Bernhard Herzog <[email protected]>
4788    
4789 bh 1522 * Thuban/UI/join.py (JoinDialog.__init__): Use the table's Title()
4790     method directly instead of going through the transient_table
4791     method. This faster because transient_table may force the copy of
4792     a DBF file into the transient database and setting a table's title
4793     doesnm't affect the title of the associated transient table, so
4794     this fixes RT #2042
4795    
4796     * Thuban/UI/main.py (__version__): Don't import the already
4797     removed show_exception_dialog.
4798    
4799 jonathan 1517 2003-07-29 Jonathan Coles <[email protected]>
4800    
4801 jonathan 1519 * Thuban/UI/application.py (ThubanApplication.ShowExceptionDialog):
4802     Put back this method and remove the equivalent function since we
4803     are setting the exception hook from within this class (OnInit).
4804    
4805     2003-07-29 Jonathan Coles <[email protected]>
4806    
4807 jonathan 1517 * Doc/manual/images/5_2_custom_ramp.png,
4808     Doc/manual/images/5_2_quantiles.png,
4809     Doc/manual/images/5_2_uniform_dist.png,
4810     Doc/manual/images/5_2_unique_values.png,
4811     Doc/manual/images/8_int_error.png: New screen shots.
4812    
4813     * Doc/manual/thuban-manual.xml: Fixed typos and wording, clarified
4814     some points, and added more screen shots.
4815    
4816 bh 1512 2003-07-29 Bernhard Herzog <[email protected]>
4817    
4818 bh 1516 * Thuban/Model/data.py: Remove the now unused import of warnings
4819    
4820     2003-07-29 Bernhard Herzog <[email protected]>
4821    
4822 bh 1514 * Thuban/Model/data.py (SimpleStore): Removed. This class has been
4823     deprecated since before the 0.8 release and isn't used in Thuban
4824     itself anymore.
4825    
4826 bh 1512 * Thuban/Model/transientdb.py: Remove some unnecessary imports
4827    
4828 jonathan 1503 2003-07-29 Jonathan Coles <[email protected]>
4829 jonathan 1506
4830     * Thuban/UI/application.py (ThubanApplication.OnInit): set the
4831     python exception hook here so that we are sure to catch any
4832     Thuban exception that happen during initialization.
4833    
4834     * Thuban/UI/main.py (main): Don't set the exception hook here,
4835     it will get set in ThubanApplication.OnInit.
4836    
4837     2003-07-29 Jonathan Coles <[email protected]>
4838 jonathan 1503
4839     * Thuban/UI/application.py (ThubanApplication.ShowExceptionDialog):
4840     Removed and called it show_exception_dialog() so that the exception
4841     handler can be set before the class is created.
4842    
4843     * Thuban/UI/main.py (main): Install the exception handler before
4844     a ThubanApplication is created.
4845    
4846 bh 1500 2003-07-29 Bernhard Herzog <[email protected]>
4847    
4848     * po/it.po: New. Italian translation by Maurizio Napolitano
4849    
4850     * po/ru.po: New. Russian translation by Alex Shevlakov
4851    
4852 frank 1497 2003-07-29 Frank Koormann <[email protected]>
4853    
4854 frank 1508 * Doc/manual/thuban-manual.xml: Extended section on supported
4855     projections.
4856    
4857     2003-07-29 Frank Koormann <[email protected]>
4858    
4859 frank 1497 * Doc/manual/thuban-manual.xml: gaspell-checked.
4860    
4861 jonathan 1493 2003-07-29 Jonathan Coles <[email protected]>
4862    
4863 jonathan 1495 * Doc/manual/images/3_5_legend.png: Added border to improve look
4864     on white background.
4865    
4866     2003-07-29 Jonathan Coles <[email protected]>
4867    
4868 jonathan 1493 * Doc/manual/thuban-manual.xml: Fixed grammar and typos. Added
4869     descriptions for the legend toolbar.
4870    
4871     * Doc/manual/images/4_2_raster_layer_properties.png: Removed
4872     cursor from dialog box.
4873    
4874     2003-07-28 Jonathan Coles <[email protected]>
4875    
4876     * Doc/manual/thuban-manual.xml: More screenshots and more chapters.
4877    
4878     * Doc/manual/images/2_4_session_tree.png,
4879     Doc/manual/images/3_5_legend.png, Doc/manual/images/3_rename_map.png,
4880     Doc/manual/images/4_2_layer_properties.png,
4881     Doc/manual/images/4_2_raster_layer_properties.png,
4882     Doc/manual/images/5_3_genclass.png,
4883     Doc/manual/images/5_classification.png,
4884     Doc/manual/images/6_projection.png,
4885     Doc/manual/images/7_1_table_view.png,
4886     Doc/manual/images/7_2_5_join.png: New screenshots.
4887    
4888     2003-07-24 Jonathan Coles <[email protected]>
4889    
4890     * Doc/manual/thuban-manual.xml: Chapter on Projection Management.
4891    
4892     2003-07-24 Jonathan Coles <[email protected]>
4893    
4894     * Doc/manual/thuban-manual.xml: Added EPS images and wrote
4895     chapter on Layer Management.
4896    
4897     * Doc/manual/Makefile: New. Makefile to generate all formats for the
4898     manual and images.
4899    
4900 bh 1483 2003-07-24 Bernhard Herzog <[email protected]>
4901    
4902     * Thuban/Model/range.py, Thuban/version.py: Remove the #! line as
4903     it annoys lintian which warns about these files not being
4904 jan 1767 executable. The #! isn't necessary here since if you absolutely
4905 bh 1483 must execute them you can always say "python <filename>".
4906    
4907     * Thuban/UI/renderer.py (ScreenRenderer.draw_shape_layer): Remove
4908     superfluous code to set brush and pen for point shapes
4909    
4910     * Thuban/UI/viewport.py: Remove commented out code that wouldn't
4911     belong in viewport anyway
4912    
4913 frank 1479 2003-07-24 Frank Koormann <[email protected]>
4914    
4915     * Doc/manual/thuban-manual.xml: Added section on table management.
4916    
4917 bh 1477 2003-07-24 Bernhard Herzog <[email protected]>
4918    
4919     * test/runtests.py (main): Recognize the long "verbose" option
4920     correctly.
4921    
4922 jonathan 1470 2003-07-22 Jonathan Coles <[email protected]>
4923    
4924     * Doc/manual/thuban-manual.xml: Continue to write first revision
4925     of the manual.
4926    
4927     * Thuban/UI/renderer.py (MapRenderer.render_map): Wrap method
4928     with Begin/EndDrawing() calls to ensure we aren't doing to
4929     many updates to the dc during rendering.
4930     (ScreenRenderer.draw_shape_layer): self.draw_point_shape takes
4931     a pen and brush argument so they need to be passed to the function.
4932    
4933     * Thuban/UI/viewport.py (ViewPort.calc_min_max_scales): New.
4934     Calculates the minimum and maximum scale values. Factored out
4935     of set_view_transform so that it could be used to zoom all the
4936     way into a single point.
4937     (ViewPort.set_view_transform): Call calc_min_max_scales().
4938     (ViewPort.FitSelectedToWindow): Zoom to the maximum scale
4939     if only a single point is selected.
4940    
4941     * Doc/manual/images/1_2_legend_close.png,
4942     Doc/manual/images/1_2_legend_dock.png,
4943     Doc/manual/images/1_2_mainwindow.png,
4944     Doc/manual/images/1_2_mainwindow.ps,
4945     Doc/manual/images/1_2_mainwindow.sk,
4946     Doc/manual/images/3_2_fullextent.png,
4947     Doc/manual/images/3_2_fulllayerextent.png,
4948     Doc/manual/images/3_2_fullshapeextent.png,
4949     Doc/manual/images/3_2_pan.png,
4950     Doc/manual/images/3_2_zoomin.png,
4951     Doc/manual/images/3_2_zoomout.png,
4952     Doc/manual/images/3_3_identify.png,
4953     Doc/manual/images/3_3_label.png,
4954     Doc/manual/images/3_5_invisible.png,
4955     Doc/manual/images/3_5_movedown.png,
4956     Doc/manual/images/3_5_moveup.png,
4957     Doc/manual/images/3_5_props.png,
4958     Doc/manual/images/3_5_tobottom.png,
4959     Doc/manual/images/3_5_totop.png,
4960     Doc/manual/images/3_5_visible.png: New. Images for the documentation.
4961    
4962 bh 1451 2003-07-18 Bernhard Herzog <[email protected]>
4963    
4964 bh 1465 * Thuban/UI/messages.py (MAP_REPLACED): New message.
4965    
4966     * Thuban/UI/viewport.py (ViewPort.SetMap): Issue MAP_REPLACED
4967     after the new map has been assigned
4968    
4969     * Thuban/UI/mainwindow.py (MainWindow.delegated_messages):
4970     Delegate MAP_REPLACED to the canvas too
4971     (MainWindow.prepare_new_session): Removed. Thanks to the new
4972     MAP_REPLACED message it's no longer needed
4973     (MainWindow.OpenSession, MainWindow.NewSession):
4974     prepare_new_session has been removed.
4975    
4976     * Thuban/UI/classifier.py (Classifier.__init__): Subscribe to
4977     MAP_REPLACED so that we can close the dialog if a new map is set.
4978     (Classifier.unsubscribe_messages): Unsubscribe from MAP_REPLACED
4979     (Classifier.map_replaced): Handle MAP_REPLACED by closing the
4980     dialog
4981    
4982     * test/test_viewport.py (SimpleViewPortTest)
4983     (SimpleViewPortTest.test_default_size): Add doc-strings
4984     (ViewPortTest.setUp): Bind map to self.map so we can use it in
4985     tests. Subscribe to MAP_REPLACED messages too.
4986     (ViewPortTest.tearDown): No need to explicitly unsubscribe
4987     (ViewPortTest.test_set_map): New test for the SetMap method.
4988    
4989     2003-07-18 Bernhard Herzog <[email protected]>
4990    
4991 bh 1463 * test/test_viewport.py (SimpleViewPortTest.test_default_size):
4992     Move this test from ViewPortTest.setUp to this new separate test
4993     case. setUp is not the place for the actual tests.
4994     (ViewPortTest.test_inital_settings, ViewPortTest.setUp): Move some
4995     more of the test from setUp to the new test test_inital_settings.
4996     (ViewPortTest.test_win_to_proj, ViewPortTest.test_proj_to_win)
4997     (ViewPortTest.test_proj_conv): Split test_proj_conv into
4998     test_win_to_proj and test_proj_to_win and make the tests easier to
4999     understand
5000     (ViewPortTest.testFitRectToWindow, ViewPortTest.testZoomFactor)
5001     (ViewPortTest.testZoomOutToRect, ViewPortTest.testTranslate)
5002     (ViewPortTest.test_unprojected_rect_around_point)
5003     (ViewPortTest.test_find_shape_at, ViewPortTest.testTools):
5004     Reformat to increase readability.
5005    
5006     2003-07-18 Bernhard Herzog <[email protected]>
5007    
5008 bh 1461 * Thuban/UI/view.py (MapCanvas.OnLeftDown): Capture the mouse.
5009    
5010     2003-07-18 Bernhard Herzog <[email protected]>
5011    
5012 bh 1459 * test/runtests.py: The test suite can now be run without an X
5013     connection. To make sure this remains true, remove the DISPLAY
5014     environment variable so that an error occurs if the wxGTK is
5015     imported accidentally
5016    
5017     2003-07-18 Bernhard Herzog <[email protected]>
5018    
5019 bh 1457 * Thuban/UI/viewport.py: Remove unused imports
5020    
5021     * Thuban/UI/view.py: Remove unused imports
5022    
5023     2003-07-18 Bernhard Herzog <[email protected]>
5024    
5025 bh 1455 * test/test_export.py Remove unused imports. The OutputTransform
5026     function is now in viewport.py and is called output_transform
5027     (TestScalebar.test_output_transform)
5028     (TestScalebar.test_OutputTransform): Renamed to
5029     test_output_transform and updated to use output_transform instead
5030     of OutputTransform
5031    
5032     * Thuban/UI/view.py (OutputTransform): Moved to viewport.py and
5033     renamed.
5034     (MapCanvas.Export, MapPrintout.draw_on_dc): OutputTransform was
5035     renamed to output_transform
5036    
5037     * Thuban/UI/viewport.py (OutputTransform, output_transform):
5038     Rename to output_transform
5039    
5040     2003-07-18 Bernhard Herzog <[email protected]>
5041    
5042 bh 1453 * Thuban/Model/layer.py (Layer.__init__): Rename
5043     classificationField to classificatin_column and init it here so
5044     that it can be used in SetClassificationColumn
5045     (Layer.GetClassificationColumn, Layer.GetClassificationField):
5046     Rename to GetClassificationColumn.
5047     (Layer.SetClassificationColumn, Layer.SetClassificationField):
5048     Rename to SetClassificationColumn and issue a LAYER_CHANGED
5049     message if the column changes.
5050     (Layer._classification_changed, Layer.ClassChanged): Rename to
5051     _classification_changed. Update the callers.
5052     (Layer.SetShapeStore): Further field->column renames.
5053    
5054     * Thuban/Model/load.py (SessionLoader.start_classification)
5055     (SessionLoader.start_clpoint): Updates because of
5056     field->column method name changes in the Layer class
5057    
5058     * Thuban/Model/save.py (SessionSaver.write_classification): Updates
5059     because of field->column method name changes in the Layer class
5060    
5061     * Thuban/UI/classifier.py (Classifier.__init__)
5062     (Classifier._OnTry, Classifier._OnRevert): Updates because of
5063     field->column method name changes in the Layer class
5064    
5065     * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Updates
5066     because of field->column method name changes in the Layer class
5067    
5068     * Thuban/UI/viewport.py (ViewPort.find_shape_at): Updates because
5069     of field->column method name changes in the Layer class
5070    
5071     * test/test_save.py (SaveSessionTest.testClassifiedLayer)
5072     (SaveSessionTest.testClassifiedLayer): Update because of
5073     field->column method name changes in the Layer class
5074    
5075     * test/test_layer.py (SetShapeStoreTests.setUp)
5076     (SetShapeStoreTests.test_sanity): Update because of field->column
5077     method name changes in the Layer class
5078     (TestLayerModification.setUp): Subscribe to LAYER_CHANGED as well
5079     (TestLayerModification.test_sanity)
5080     (TestLayerModification.test_initial_settings): remove unsued code
5081     and rename to test_sanity.
5082     (TestLayerModification.test_set_classification): New test for
5083     SetClassification and SetClassificationField.
5084    
5085     2003-07-18 Bernhard Herzog <[email protected]>
5086    
5087 bh 1451 * test/test_classgen.py (TestFixedRamp.test): Extend test to check
5088     the non-fixed values as well. The old test would have accepted a
5089     fixed ramp that only returnes the fixed properties
5090    
5091 jonathan 1449 2003-07-17 Jonathan Coles <[email protected]>
5092    
5093     * Doc/manual/mainwindow.png, Doc/manual/mainwindow.xcf: Screen
5094     shots for the manual. The XCF file is the source image and
5095     has additional layers to support changes.
5096    
5097     * Doc/manual/thuban-manual.xml: Wrote an initial Introduction.
5098    
5099     * Thuban/UI/classifier.py (Classifier.__BuildClassification):
5100     Return both the new class and the field name.
5101    
5102     * Thuban/UI/mainwindow.py (MainWindow.ToggleLegend): Don't
5103     fit the map to the window as this changes any zoom level that
5104     the user may have set.
5105    
5106 jonathan 1442 2003-07-16 Jonathan Coles <[email protected]>
5107    
5108     * Thuban/Model/classgen.py (generate_singletons,
5109     generate_uniform_distribution, generate_quantiles): Remove
5110     fixes parameter, but maintain the same functionality by having
5111     the calling function pass a FixedRamp object for the ramp.
5112     (FixedRamp): New. Adapts a ramp to have fixed property values.
5113    
5114     * Thuban/Model/classification.py: Use new CLASS_CHANGED message.
5115     (Classification): Inherit from Publisher.
5116     (Classification.__init__): Remove the layer parameter.
5117     Classifications no longer need to have a parent layer.
5118     (Classification.GetField, Classification.GetFieldType,
5119     Classification.SetFieldInfo): Removed. The field name is stored
5120     in the layer, and the type can be retreived by calling
5121     Layer.GetFieldType().
5122     (Classification._set_layer, Classification.GetLayer): Removed.
5123     Classifications no longer have a parent layer.
5124    
5125     * Thuban/Model/layer.py (Layer.Destroy): Unsubscribe from the
5126     classification.
5127     (Layer.SetShapeStore): Reset the classification first while
5128     we still have the old shape store to work with.
5129     (Layer.GetClassificationField, Layer.SetClassificationField):
5130     New. Method for getting/setting the field to classify on.
5131     (Layer.SetClassification): Simplified now that the layer
5132     simply has to hold a reference to the classification and not
5133     tell the classification who owns it.
5134     Fixes RTbug #2023.
5135    
5136     * Thuban/Model/load.py (SessionLoader.start_classification):
5137     Set the field name on the layer, not the classification.
5138    
5139     * Thuban/Model/messages.py: Add CLASS_CHANGED for when a
5140     classification is modified.
5141    
5142     * Thuban/Model/save.py (SessionSaver.write_classification):
5143     Get the field name and type from the layer.
5144    
5145     * Thuban/Model/table.py (table_to_dbf, table_to_csv): Renamed
5146     parameter records to rows and add docstring. Fixes RTbug #1997.
5147    
5148     * Thuban/UI/classgen.py (ClassGenDialog.OnOK): Use a fixed
5149     ramp when we need to fix certain values of a ramp rather than
5150     using the old fixes parameter. Fixes RTbug #2024.
5151    
5152     * Thuban/UI/classifier.py (ClassGrid.CreateTable): Add fieldType
5153     parameter.
5154     (ClassTable.Reset): Add fieldType parameter and use it, rather
5155     than asking the classification.
5156     (Classifier.__init__): Remember the original class's field
5157     and ask the layer for the field type, rather than the classification.
5158     (Classifier.__SetGridTable): Retrieve the field and field type
5159     for the table because they are not in the classification.
5160     (Classifier._OnTry, Classifier._OnRevert): Set the classification
5161     field on the layer in addition to the classification itself.
5162    
5163     * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Get the
5164     classification field from layer.
5165    
5166     * Thuban/UI/viewport.py (ViewPort.find_shape_at): Get the
5167     classification field from layer. Split up tests and remove
5168     *-imports. Fixes RTbug #1992.
5169    
5170     * test/test_classgen.py (TestFixedRamp): Test for the FixedRamp class.
5171    
5172     * test/test_classification.py
5173     (TestClassification.test_classification): Remove tests for methods
5174     that no longer exist.
5175    
5176     * test/test_layer.py (SetShapeStoreTests.setUp): Classification
5177     __init__ no longer has a field parameter, use SetClassificationField.
5178     (SetShapeStoreTests.test_sanity): Use layer object to get class
5179     field info.
5180    
5181     * test/test_save.py (SaveSessionTest.testClassifiedLayer): Use
5182     SetClassificationField on layer to set class field info.
5183    
5184     * test/test_viewport.py: Renamed from test/test_view.py.
5185    
5186 jan 1424 2003-07-16 Jan-Oliver Wagner <[email protected]>
5187    
5188     * Doc/manual/thuban-manual.xml: Added authors and an initial
5189     coarse structure.
5190    
5191 bh 1418 2003-07-15 Bernhard Herzog <[email protected]>
5192    
5193 bh 1422 * test/support.py (FloatComparisonMixin): This is a mix-in class
5194     and therefore should not be derived from any other class.
5195    
5196     * test/test_range.py (RangeTest): FloatComparisonMixin is a
5197     mix-in, so derive from TestCase as well.
5198    
5199     2003-07-15 Bernhard Herzog <[email protected]>
5200    
5201 bh 1420 * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Rework the
5202     draw_func handling a bit to remove one layer of indirection. This
5203     makes the renderer about 10% faster in the non-classifying case
5204     and the code a bit cleaner
5205     (MapRenderer.draw_point_shape): Add the pen and brush parameters
5206     and set them in the dc. Now the draw_point_shape method and
5207     wxproj's draw_polygon_shape function have basically the same
5208     signature so that both can be directly used as draw_func
5209    
5210     2003-07-15 Bernhard Herzog <[email protected]>
5211    
5212 bh 1418 * Thuban/Model/save.py (SessionSaver.write_classification): Encode
5213     string values (in addition to the labels) as UTF 8
5214    
5215     * Thuban/Model/load.py (SessionLoader.start_clpoint): Decode the
5216     values if the field type is string
5217    
5218     * test/test_save.py (SaveSessionTest.testClassifiedLayer): Test
5219     saving a session with non-ascii string classification values.
5220    
5221     * test/test_load.py (TestClassification.file_contents)
5222     (TestClassification.test): Check for non-ascii values in string
5223     classifications
5224    
5225 jonathan 1416 2003-07-14 Jonathan Coles <[email protected]>
5226    
5227     * test/test_view.py: New. Tests for ViewPort.
5228    
5229 frank 1409 2003-07-14 Frank Koormann <[email protected]>
5230    
5231     * Thuban/Model/load.py (SessionLoader.start_map): Encode map
5232     title to latin1. Fixes https://intevation.de/rt/webrt?serial_num=2013
5233    
5234 frank 1411 * test/test_load_0_8.py (TestUnicodeStrings): New, test load of
5235     unicode strings from session file: session title, map title and
5236     projection name.
5237    
5238 jonathan 1403 2003-07-10 Jonathan Coles <[email protected]>
5239    
5240 jonathan 1406 * Thuban/UI/viewport.py (Tool.MouseUp): Should have called
5241     drag_stop, not drag_move when the mouse is released.
5242    
5243     2003-07-10 Jonathan Coles <[email protected]>
5244    
5245 jonathan 1403 The most important part of this is the seperation of view.py into
5246     two pieces. viewport.py now has a class called ViewPort which
5247     contains all the non-wx parts of view.py and can therefore be
5248     tested. view.py contains only the wx-specific parts and is fairly
5249     simple.
5250    
5251     * Thuban/UI/view.py: Stripped out all non-wx functionality. Fixes
5252     RTTbug #1992.
5253     * Thuban/UI/viewport.py: New. Contains non-wx view functionality.
5254     RTTbug #1992.
5255    
5256     * Thuban/Model/classgen.py (generate_singletons,
5257     generate_uniform_distribution, generate_quantiles):
5258     Added 'fixes' parameter so that property attributes can
5259     be held constant over the generated classification groups.
5260     (CustomRamp.GetProperties): Remove unused variables.
5261    
5262     * Thuban/Model/map.py (Map.SetProjection): Send the old
5263     projection as an argument to listeners of the MAP_PROJECTION_CHANGED
5264     event.
5265    
5266     * Thuban/Model/table.py (table_to_dbf, table_to_csv): Added 'records'
5267     parameter which is a list of records that restricts which
5268     records are saved. Fixes RTbug #1997.
5269    
5270     * Thuban/UI/application.py (ThubanApplication.ShowExceptionDialog):
5271     Port exception dialog from GREAT-ER. Fixes RTbug #1993.
5272    
5273     * Thuban/UI/classgen.py (ClassGenDialog.__init__): Add controls
5274     to allow the user to fix line color/width on generated groups.
5275     (ClassGenDialog.OnOK): Use new 'fixes' parameter of the generate_*
5276     functions to optionally fix group properties.
5277    
5278     * Thuban/UI/main.py (main): Set exception hook to the
5279     ShowExceptionDialog. Fixes RTbug #1993.
5280    
5281     * Thuban/UI/mainwindow.py (MainWindow.ShowTableView): Raise
5282     the table window when it is selectd to be shown.
5283    
5284     * Thuban/UI/tableview.py (QueryTableFrame.__init__): Add an
5285     Export Selection button and move the export buttons underneath
5286     the table.
5287     (QueryTableFrame.UpdateStatusText): Added event argument so
5288     that it can respond to grid selection events. The status text
5289     is now updated even when the table is not associated with a
5290     layer as was previously assumed.
5291     (QueryTableFrame.OnGridSelectRange, OnGridSelectCell): Removed.
5292     UpdateStatusText responds to these events.
5293     (QueryTableFrame.OnSaveAs): Renamed to doExport.
5294     (QueryTableFrame.doExport): Helper function that saves the
5295     entire table, or selected rows, to a file.
5296     (QueryTableFrame.OnExport, QueryTableFrame.OnExportSel): New.
5297     Respond to export button events and call doExport.
5298    
5299     * extensions/thuban/gdalwarp.cpp (ProjectRasterFile): Make sure
5300     the function doesn't return NULL without first setting a Python
5301     Error.
5302    
5303     * test/runtests.py (main): Only print "Unknown option" for
5304     unsupported options.
5305    
5306     * test/support.py (FloatComparisonMixin.assertFloatEqual): Take
5307     optional epsilon argument to specify floating point accuracy.
5308     (FloatComparisonMixin.assertFloatSeqEqual): Call assertFloatEqual
5309     for each item test.
5310    
5311     * test/test_csv_table.py (TestCSVTable.test_table_to_cvs): Add
5312     tests for saving selected records.
5313    
5314     * test/test_dbf_table.py (TestTableToDBF.test_table_to_dbf): Add
5315     tests for saving selected records.
5316    
5317     * test/test_map.py (TestMapWithContents.test_set_projection):
5318     MAP_PROJECTION_CHANGED events send the old projection.
5319    
5320     * test/test_session.py
5321     (TestSessionWithContent.test_forward_map_projection):
5322     MAP_PROJECTION_CHANGED events send the old projection.
5323    
5324     * test/test_table.py (TableTest): Update tests to use non-deprecated
5325     functions.
5326    
5327 bh 1376 2003-07-08 Bernhard Herzog <[email protected]>
5328    
5329 bh 1382 * Thuban/Model/transientdb.py (TransientTableBase.Width): The type
5330     constants in the column objects are the standard ones defined in
5331     the table module.
5332    
5333     * test/test_transientdb.py
5334     (TestTransientTable.test_transienttable_to_dbf): New. Test whether
5335     exporting transient tables as DBF works. This should catch the bug
5336     just fixed in TransientTableBase.Width.
5337    
5338     2003-07-08 Bernhard Herzog <[email protected]>
5339    
5340 bh 1380 * Thuban/Model/classgen.py (CustomRamp.GetProperties): Compute the
5341     interpolated colors correctly.
5342    
5343     * test/test_classgen.py (TestCustomRamp.test_color_interpolation):
5344     New. Test case for the fix in classgen.py
5345    
5346     2003-07-08 Bernhard Herzog <[email protected]>
5347    
5348 bh 1378 * test/runtests.py (main): Make the default output less verbose
5349     and add a verbosity option (-v) to get the old output
5350    
5351     2003-07-08 Bernhard Herzog <[email protected]>
5352    
5353 bh 1376 * Resources/XML/thuban-0.9.dtd: New. This will become the DTD for
5354     0.9.
5355    
5356     * Thuban/Model/transientdb.py (TransientJoinedTable.JoinType):
5357     New. Return the join type
5358    
5359     * Thuban/Model/save.py (SessionSaver.write_session): Use new 0.9
5360     DTD
5361     (SessionSaver.write_data_containers): Save the join type for
5362     joined tables
5363    
5364     * Thuban/Model/load.py (SessionLoader.__init__): Add the new 0.9
5365     namespace
5366     (SessionLoader.start_jointable): Handle the jointype attribute
5367    
5368     * test/test_load_0_8.py: New. Effectively a copy of test_load.py
5369     as of Thuban 0.8. These are now tests to determine whether Thuban
5370     can still read files generated by Thuban 0.8
5371    
5372     * test/test_load.py (LoadSessionTest.dtd)
5373     (TestSingleLayer.file_contents)
5374     (TestLayerVisibility.file_contents, TestLabels.file_contents)
5375     (TestLayerProjection.file_contents)
5376     (TestRasterLayer.file_contents, TestJoinedTable.file_contents)
5377     (TestJoinedTable.file_contents)
5378     (TestLoadError.file_contents): Update for new DTD
5379     (TestJoinedTable.file_contents, TestJoinedTable.setUp): Add test
5380     for new join type attribute
5381    
5382     * test/test_save.py (SaveSessionTest.dtd)
5383     (SaveSessionTest.testEmptySession)
5384     (SaveSessionTest.testSingleLayer)
5385     (SaveSessionTest.testLayerProjection)
5386     (SaveSessionTest.testRasterLayer)
5387     (SaveSessionTest.testClassifiedLayer)
5388     (SaveSessionTest.test_dbf_table)
5389     (SaveSessionTest.test_joined_table): Update for new DTD
5390     (SaveSessionTest.test_joined_table): Add test for new join type
5391     attribute
5392    
5393 bh 1372 2003-07-04 Bernhard Herzog <[email protected]>
5394    
5395     * Thuban/Model/table.py (_find_dbf_column_names): New. Helper
5396     function for table_to_dbf
5397     (table_to_dbf): Deal with names longer than the 10 character limit
5398    
5399     * test/test_dbf_table.py (TestTableToDBF.test_table_to_dbf): Add
5400     doc-string
5401     (TestTableToDBF.test_table_to_dbf_long_col_names): New test for
5402     long column names
5403    
5404 bh 1365 2003-07-03 Bernhard Herzog <[email protected]>
5405    
5406 bh 1370 * Doc/manual/thuban-manual.xml: Fix the CVS Revision Tag syntax
5407    
5408     2003-07-03 Bernhard Herzog <[email protected]>
5409    
5410 bh 1368 * Doc/manual/thuban-manual.xml, Doc/manual/README: New. Skeleton
5411     for the Thuban manual and README with some basic information about
5412     the manual
5413    
5414     2003-07-03 Bernhard Herzog <[email protected]>
5415    
5416 bh 1365 * Thuban/Model/transientdb.py (TransientJoinedTable.__init__):
5417     Update doc-string
5418     (TransientJoinedTable.create): Do not modify the column objects of
5419     the input tables in place and copy all columns of the input tables
5420     into the joined table after all.
5421    
5422     * test/test_transientdb.py
5423     (TestTransientTable.test_transient_joined_table_same_column_name):
5424     Update to reflect the new behavior
5425     (TestTransientTable.test_transient_joined_table_with_equal_column_names):
5426     Update to reflect the new behavior
5427     (TestTransientTable.test_transient_joined_table_name_collisions_dont_modify_in_place):
5428     New test case for a bug which modified the column objects in place
5429    
5430 jonathan 1360 2003-07-02 Jonathan Coles <[email protected]>
5431 jonathan 1349
5432 jonathan 1360 * Thuban/Model/classgen.py (generate_singletons,
5433     generate_uniform_distribution, generate_quantiles,
5434 jonathan 1363 GenQuantiles0): Make sure maxValue isn't less than
5435     one, otherwise we could divide by zero.
5436    
5437     * test/test_classgen.py (ClassGenTest.doClassRangeTest,
5438     ClassGenTest.doClassSingleTest): Call doBoundsTest to
5439     check the end classification groups against the
5440     proper property values.
5441     (ClassGenTest.doBoundsTest): New. Checks the first and
5442     last classification groups to make sure their properties
5443     are the correct upper and lower bounds for a color ramp.
5444    
5445     2003-07-02 Jonathan Coles <[email protected]>
5446    
5447     * Thuban/Model/classgen.py (generate_singletons,
5448     generate_uniform_distribution, generate_quantiles,
5449 jonathan 1360 GenQuantiles0): The denominator was one to high when
5450     calculating the index for the ramp causing the index
5451     to never to reach one.
5452    
5453     2003-07-02 Jonathan Coles <[email protected]>
5454    
5455 jonathan 1358 Changed the singature of ClassGroupRange.__init__ and
5456     ClassGroupRange.SetRange() so that the min/max values are
5457     passed as a tuple. This makes a better calling scheme for
5458     when a Range object is passed instead.
5459    
5460     * Thuban/Model/classgen.py: Fixed parameters to
5461     ClassGroupRange constructor.
5462    
5463     * Thuban/Model/classification.py (ClassGroupRange.__init__):
5464     Consolidate the min/max parameters into a single _range which
5465     can either be a tuple or a Range object.
5466     (ClassGroupRange.SetRange): Consolidate the min/max parameters
5467     into a single _range which can either be a tuple or a Range object.
5468    
5469     * Thuban/Model/load.py (SessionLoader.start_clrange): Fix
5470     call to ClassGroupRange constructor to use a tuple.
5471    
5472     * Thuban/Model/layer.py (Layer.SetClassification): Switch
5473     the classification instance variable to the new class
5474     before calling _set_layer otherwise subscribers to a
5475     LAYER_CHANGED event will not see any difference.
5476    
5477     * test/test_classification.py: Fix tests of ClassGroupRange
5478     so that they use the new signature.
5479    
5480     * test/test_load.py: Fix use of ClassGroupRange so that it
5481     uses the new signature.
5482    
5483     * test/test_load_0_2.py: Fix use of ClassGroupRange so that it
5484     uses the new signature.
5485    
5486     * test/test_save.py: Fix use of ClassGroupRange so that it
5487     uses the new signature.
5488    
5489    
5490     2003-07-01 Jonathan Coles <[email protected]>
5491    
5492 jonathan 1349 * Thuban/Model/classgen.py: Fixes RTbug #1972, 1971.
5493     Import used objects/class from color.
5494     (generate_singletons): We don't
5495     need the numGroups parameter anymore because we are using
5496     the new ramps with GetProperties().
5497     (generate_uniform_distribution): Use new ramp method
5498     GetProperties().
5499     (generate_quantiles, GenQuantiles0): Use new ramp method
5500     GetProperties().
5501     (CustomRamp.SetNumGroups): Removed. The ramps now map
5502     a value from 0 to 1 to class properties so the number
5503     of groups is not needed ahead of time.
5504     (CustomRamp.next): Removed. CustomRamp does not support
5505     interation anymore.
5506     (CustomRamp.GetProperties): Returns a ClassGroupProperties
5507     object based on the index value from 0 to 1 that is
5508     passed to it.
5509     (GreyRamp, RedRamp, GreenRamp, BlueRamp, GreenToRedRamp):
5510     Made into instances of Monochromatic class instread of
5511     deriving from it.
5512     (HotToCold.SetNumGroups): Removed. See CustomRamp.
5513     (HotToCold.next): Removed. See CustomRamp.
5514    
5515     * Thuban/Model/classification.py: Fixes RTbug #1973, 1971.
5516     (Classification.SetField, Classification.SetFieldType):
5517     Replaced with SetFieldInfo.
5518     (Classification.SetFieldInfo): New. Does a better job of
5519     what SetField and SetFieldType used to do by combining
5520     their function since they should really always be done
5521     at the same time.
5522     (Classification.SetLayer): Renamed to _set_layer.
5523     (Classification._set_layer): Should only be called from
5524     Layer's SetClassification. This does not cause a recursive
5525     call as SetLayer did because we know that Layer knows about
5526     the classification.
5527    
5528     * Thuban/Model/color.py: Fixes RTbug #1971.
5529     (_Transparent): Renamed from Transparent so it doesn't
5530     conflict with the module variable.
5531     (Transparent, Black): Renamed from Color.Transparent,
5532     Color.Black so they are not class variables.
5533    
5534     * Thuban/Model/layer.py: Fixes RTbug #1971, 1973.
5535     (Layer.Destroy): We don't need to call SetClassification
5536     anymore to clear out the back reference in the classifcation
5537     to the layer. It's better to set it to None using _set_layer,
5538     and we won't be creating another clas object too.
5539     (Layer.SetClassification): Classification._set_layer is not
5540     recursive so remove all the locking variables. Also clean
5541     up the code so that it remains unchanged if something fails.
5542    
5543     * Thuban/Model/load.py: Fixes RTbug #1971.
5544     (SessionLoader.start_classification): Call
5545     Classification.SetFieldInfo().
5546    
5547     * Thuban/Model/save.py: Removed import of Color which wasn't
5548     being used.
5549    
5550     * Thuban/UI/classgen.py: Fixes RTbug #1972.
5551     (ClassGenDialog.__init__): Color ramps are now instances
5552     already so we don't need to create any new objects.
5553     (ClassGenDialog.OnOK): Check for numGroups is no longer
5554     necessary because we never use it.
5555    
5556     * Thuban/UI/classifier.py: Fixes RTbug #1971.
5557     (Classifier.__BuildClassification, Classifier.__SetGridTable):
5558     Call Classification.SetFieldInfo() instead of SetFieldType.
5559    
5560     * Thuban/UI/renderer.py: Fixes RTbug #1971.
5561    
5562     * Thuban/UI/view.py: Fixes RTbug #1974, 1971.
5563     (MapCanvas.__init__): Subscribe to the idle time event. Set
5564     background color to white.
5565     (MapCanvas.OnPaint): Set a flag indicating that we should
5566     render the map during idle time. If we already have a bitmap
5567     just draw it now.
5568     (MapCanvas.OnIdle): New. Render the map only during idle time.
5569     This also fixes a problem with the busy cursor under gtk.
5570    
5571     * test/test_classgen.py (ClassGenTest.test_generate_singletons):
5572     Fix calls to generate_singletons because the signature changed.
5573    
5574     * test/test_classification.py: Fix color references and
5575     change calls to Classification.[SetField|SetFieldType] to
5576     SetFieldInfo.
5577    
5578     * test/test_load.py: Fix color references.
5579    
5580     * test/test_load_0_2.py: Fix color references.
5581    
5582     * test/test_save.py (SaveSessionTest.testClassifiedLayer):
5583     Change calls to Classification.[SetField|SetFieldType] to
5584     SetFieldInfo.
5585    
5586 frank 1334 2003-07-01 Frank Koormann <[email protected]>
5587    
5588     MERGE from the greater-ms3 branch.
5589    
5590     * test/test_transientdb.py
5591     (TestTransientTable.test_transient_joined_table_with_equal_column_names):
5592     New. Test join of two tables with partly equal column names.
5593    
5594     * Thuban/Model/transientdb.py (TransientJoinedTable.create):
5595     If duplicates in left and right tables column names are found,
5596     append '_' (underscores) to the name until it is unique.
5597     Create always new internal names for the resulting table and reference
5598     columns in the join statement with <table>.<column>
5599    
5600 bh 1329 2003-07-01 Bernhard Herzog <[email protected]>
5601    
5602     * test/test_transientdb.py
5603     (TestTransientTable.test_transient_joined_table_same_column_name):
5604     New. Test whether joining on columns with the same names in both
5605     tables works.
5606 frank 1334
5607 bh 1329 * Thuban/Model/transientdb.py (TransientJoinedTable.create): Make
5608     sure to use the right internal names even when joining on field
5609     with the same names in both tables. Also, detect duplicate names
5610     in the joined table correctly.
5611    
5612 frank 1325 2003-07-01 Frank Koormann <[email protected]>
5613    
5614     * Thuban/UI/renderer.py (ExportRenderer.render_legend):
5615     Reverse List of layers to render in same order as in desktop legend.
5616    
5617 jonathan 1318 2003-06-30 Jonathan Coles <[email protected]>
5618    
5619 jonathan 1349 * Thuban/version.py (make_tuple): Takes a version string
5620     and splits it into a tuple of at most three integers.
5621     Used make_tuple() to make tuple versions of the version
5622     numbers.
5623    
5624     * Thuban/UI/about.py: Add Thuban email addresses.
5625    
5626     2003-06-30 Jonathan Coles <[email protected]>
5627    
5628 jonathan 1320 * Thuban/version.py: SQLite/PySQLite version dependencies
5629     were too high.
5630    
5631     2003-06-30 Jonathan Coles <[email protected]>
5632    
5633 jonathan 1318 * Thuban/version.py: Update version to 0.8.1
5634    
5635     * MANIFEST.in: Added Projections so that default.proj is
5636     included.
5637    
5638 jonathan 1312 2003-06-26 Jonathan Coles <[email protected]>
5639    
5640     New About box with lots more information including library
5641     versions and credits. More/better version checking before
5642     Thuban starts.
5643    
5644     * Thuban/UI/about.py: New. New About box that displays
5645     library version information and credits.
5646    
5647     * Thuban/version.py: Added new 'versions' dictionary which
5648     contains the verions of various libraries which are checked
5649     when the module loads.
5650     (verify_versions): Check all version numbers and returns
5651     a list of errors.
5652    
5653     * Thuban/UI/classifier.py (Classifier.__EnableButtons):
5654     Reset the status of the buttons as the situation warrants,
5655     but in a better more reliable way by not relying on the
5656     current status to determine what needs to change.
5657    
5658     * Thuban/UI/main.py (wxCHECK_VERSION): Removed. Not needed.
5659     (verify_versions): Remove most of the code since it is
5660     now in Thuban.version.verify_versions.o
5661    
5662     * Thuban/UI/mainwindow.py (MainWindow.About): Call new
5663     About box in Thuban.UI.about.
5664    
5665     * extensions/thuban/gdalwarp.cpp (get_gdal_version): New.
5666     Returns the version of gdal library being used as a string.
5667    
5668     * extensions/thuban/wxproj.cpp (check_version, check_version_gtk):
5669     Removed.
5670     (get_proj_version): Return the version of PROJ that the file
5671     was compiled with.
5672     (get_gtk_version): Return th version of GTK that the file
5673     was compiled with.
5674    
5675 jonathan 1304 2003-06-25 Jonathan Coles <[email protected]>
5676    
5677     * Thuban/UI/classifier.py (Classifier.EditSymbol): The parent
5678     of the SelectPropertiesDialog should be self so the window
5679     appears on top.
5680     (ClassGroupPropertiesCtrl.DoEdit): The parent
5681     of the SelectPropertiesDialog should be self so the window
5682     appears on top.
5683    
5684     * Thuban/UI/resource.py: Cleaned up how we determine file
5685     extensions.
5686     (GetImageResource): Return an wxImage from our Resources.
5687    
5688 jonathan 1299 2003-06-24 Jonathan Coles <[email protected]>
5689    
5690     * Thuban/UI/renderer.py (ExportRenderer.render_legend):
5691     Check that a layer has a classification before trying
5692     to get it. Raster layers don't have classifications.
5693    
5694 jonathan 1286 2003-06-23 Jonathan Coles <[email protected]>
5695 jonathan 1297
5696     * setup.py: Add Resources/XML to resource list.
5697    
5698     2003-06-23 Jonathan Coles <[email protected]>
5699 jonathan 1286
5700 jonathan 1297 * setup.cfg: Fix copyright dates
5701    
5702     2003-06-23 Jonathan Coles <[email protected]>
5703    
5704 jonathan 1294 * MANIFEST.in: Update with Resources/XML
5705    
5706     * setup.py: Don't include Locale resources yet as we don't
5707     have any and it causes problems building the distribution
5708     for Windows. Update version to 0.8.0.
5709    
5710     * Doc/thuban.dtd: Removed since it is now in Resources/XML.
5711    
5712     * Thuban/UI/mainwindow.py: Add blank line at the end because
5713     file was not being read correctly building the Windows
5714     distribution.
5715    
5716     2003-06-23 Jonathan Coles <[email protected]>
5717    
5718 jonathan 1289 * Thuban/UI/mainwindow.py (MainWindow.About): Fix text.
5719    
5720     * Thuban/version.py: Temporarily update longversion for
5721     the 0.8 release so that it doesn't have the cvs revision.
5722    
5723     2003-06-23 Jonathan Coles <[email protected]>
5724    
5725 jonathan 1286 * Thuban/UI/common.py (ThubanBeginBusyCursor): Call wxSafeYield
5726     to make sure that we don't create reentrant possibilities with
5727     wxYield.
5728    
5729     * Thuban/UI/view.py (MapCanvas.OnPaint): Call wxBeginBusyCursor()
5730     directly to avoid the wxSafeYield() call which generates an
5731     OnPaint event causing infinite recursion. Don't try to catch
5732     exception anymore. This was for before there were limits on map
5733     scaling.
5734    
5735 bh 1283 2003-06-23 Bernhard Herzog <[email protected]>
5736    
5737     Bug fix for RT #1961:
5738    
5739     * Thuban/Model/load.py (SessionLoader.start_derivedshapesource):
5740     Register DerivedShapestores with the session
5741    
5742     * Thuban/Model/session.py (Session.Tables): Make sure each table
5743     is only listed once.
5744    
5745     * test/test_load.py (TestJoinedTable.test): Add check_format call.
5746     Update file contents to match the one written out.
5747    
5748 bh 1281 2003-06-20 Bernhard Herzog <[email protected]>
5749    
5750     * test/xmlsupport.py (SaxEventLister.startElementNS)
5751     (SaxEventLister.endElementNS): Do not include the qname. Python
5752     2.2.1 and 2.2.2 and 2.2.3 differ in this regard. In 2.2.1 qname it
5753     is (presumably incorrectly) None, whereas it's a string with the
5754     element name in the later versions.
5755    
5756     * test/test_xmlsupport.py (TestEventList.test_even_list_simple)
5757     (TestEventList.test_even_list_namespace): Update tests to reflect
5758     the new behaviour
5759     (TestEventList.test_even_list_id_normalization): Fix doc-string
5760    
5761 jonathan 1272 2003-06-20 Jonathan Coles <[email protected]>
5762    
5763 jonathan 1279 * Thuban/Model/layer.py (BaseLayer.HasShapes): New. Overridden
5764     by deriving classes to determine if that layer supports shapes.
5765     (Layer): Override HasShapes and return true.
5766    
5767     * Thuban/UI/classgen.py: Use Thuban[Begin|End]BusyCursor()
5768     instead of a direct call to wx[Begin|End]CusyCursor().
5769     (GenUniquePanel._OnRetrieve): Set busy cursor while retrieving
5770     table data.
5771    
5772     * Thuban/UI/common.py (ThubanBeginBusyCursor, ThubanEndBusyCursor):
5773     New. Wrappers around the wxWindows functions that allow us to
5774     make additional calls such as wxYield which gives the native
5775     system a chance to update the cursor correctly.
5776    
5777     * Thuban/UI/tableview.py: Use Thuban[Begin|End]BusyCursor()
5778     instead of a direct call to wx[Begin|End]CusyCursor().
5779    
5780     * Thuban/UI/view.py: Use Thuban[Begin|End]BusyCursor()
5781     instead of a direct call to wx[Begin|End]CusyCursor().
5782     (MapCanvas.find_shape_at): Check if the current search layer
5783     support shapes, otherwise go on to the next layer.
5784    
5785     * test/test_layer.py: Add tests in each type of layer for
5786     HasClassification() and HasShapes()
5787    
5788     2003-06-20 Jonathan Coles <[email protected]>
5789    
5790 jonathan 1272 * Thuban/UI/view.py (MapCanvas.OnPaint): Call wxYield after
5791     turning on the busy cursor to allow the system to change the
5792     cursor before we begin painting. This fixes a problem that
5793     was occuring only under GTK. Fixes RTbug #1840.
5794    
5795 bh 1270 2003-06-20 Bernhard Herzog <[email protected]>
5796    
5797     * Resources/XML/thuban-0.8.dtd: New DTD for the new file format
5798     version.
5799    
5800     * Thuban/Model/save.py (sort_data_stores): New. Make topological
5801     sort of the data sources so they can be written with sources that
5802     data sources that depend on other data sources come after the
5803     sources they depend on.
5804     (SessionSaver.__init__): Add idmap instance variable to map from
5805     objects to the ids used in the file.
5806     (SessionSaver.get_id, SessionSaver.define_id)
5807     (SessionSaver.has_id): New. Methods to manage the idmap
5808     (SessionSaver.write): Use thuban-0.8.dtd
5809     (SessionSaver.write_session): Add a namespace on the session and
5810     write out the data sources before the maps.
5811     (SessionSaver.write_data_containers): New. Write the data
5812     containers.
5813     (SessionSaver.write_layer): Layer elements now refer to a
5814     shapestore and don't contain filenames anymore.
5815    
5816     * Thuban/Model/load.py (LoadError): Exception class to raise when
5817     errors in the files are discovered
5818     (SessionLoader.__init__): Define dispatchers for elements with a
5819     thuban-0.8 namespace too.
5820     (SessionLoader.check_attrs): New helper method to check and
5821     convert attributes
5822     (AttrDesc): New. Helper class for SessionLoader.check_attrs
5823     (SessionLoader.start_fileshapesource)
5824     (SessionLoader.start_derivedshapesource)
5825     (SessionLoader.start_filetable, SessionLoader.start_jointable):
5826     Handlers for the new elements in the new fileformat
5827     (SessionLoader.start_layer): Handle the shapestore attribute in
5828     addition to filename.
5829     (SessionLoader.start_table, SessionLoader.end_table): Removed.
5830     They were never used in the old formats and aren't needed for the
5831     new.
5832    
5833     * Thuban/Model/session.py (Session.DataContainers): New method to
5834     return all "data containers", i.e. shapestores and tables
5835    
5836     * test/xmlsupport.py (SaxEventLister.__init__)
5837     (SaxEventLister.startElementNS, sax_eventlist): Add support to
5838     normalize IDs.
5839    
5840     * test/test_xmlsupport.py
5841     (TestEventList.test_even_list_id_normalization): New test case for
5842     id normalization
5843    
5844     * test/test_load.py (LoadSessionTest.check_format): Use ID
5845     normalization
5846     (LoadSessionTest.thubanids, LoadSessionTest.thubanidrefs): New
5847     class atrributes used for ID normalization
5848     (TestSingleLayer, TestLayerVisibility, TestLabels.test)
5849     (TestLayerProjection.test, TestRasterLayer.test): Adapt to new
5850     file format
5851     (TestJoinedTable): New test for loading sessions with joined
5852     tables.
5853     (TestLoadError): New. Test whether missing required attributes
5854     cause a LoadError.
5855    
5856     * test/test_save.py (SaveSessionTest.thubanids)
5857     (SaveSessionTest.thubanidrefs): New class attributes for ID
5858     normalization in .thuban files.
5859     (SaveSessionTest.compare_xml): Use id-normalization.
5860     (SaveSessionTest.testEmptySession)
5861     (SaveSessionTest.testLayerProjection)
5862     (SaveSessionTest.testRasterLayer)
5863     (SaveSessionTest.testClassifiedLayer): Adapt to new file format.
5864     (SaveSessionTest.testLayerProjection): The filename used was the
5865     same as for testSingleLayer. Use a different one.
5866     (SaveSessionTest.test_dbf_table)
5867     (SaveSessionTest.test_joined_table): New test cases for saving the
5868     new data sources structures.
5869     (TestStoreSort, MockDataStore): Classes to test the sorting of the
5870     data stores for writing.
5871    
5872     * test/runtests.py: Add CVS keywords
5873    
5874 jonathan 1265 2003-06-20 Jonathan Coles <[email protected]>
5875    
5876 jonathan 1267 * test/test_session.py
5877     (UnreferencedTablesTests.test_unreferenced_tables_with_joins):
5878     Use the cultural_landmark-point.dbf file for the store so that
5879     the table rows and shape count match.
5880    
5881     2003-06-20 Jonathan Coles <[email protected]>
5882    
5883 jonathan 1265 * Thuban/Model/data.py (DerivedShapeStore.__init__): Raise
5884     an exception if the number of shapes is different from the
5885     number of rows in the table. Address RTbug #1933.
5886    
5887     * test/test_layer.py (TestLayer.test_derived_store): Add
5888     a test for the new exception in DerivedShapeStore.__init__.
5889    
5890     * test/support.py (FloatTestCase): Removed since there is
5891     already FloatComparisonMixin. Fixes RTbug #1954.
5892     (FloatComparisonMixin.assertFloatEqual): Include test for
5893     infinity that was part of FloatTestCase.
5894    
5895     * test/test_range.py (RangeTest): Inherit from
5896     support.FloatComparisonMixin now that we don't have
5897     support.FloatTestCase.
5898    
5899 bh 1256 2003-06-20 Bernhard Herzog <[email protected]>
5900    
5901 bh 1260 * test/test_save.py (SaxEventLister, sax_eventlist): Removed. Use
5902     the implementation in xmlsupport instead.
5903     (SaveSessionTest.compare_xml): sax_eventlist is now in xmlsupport
5904    
5905     * test/test_proj.py: Import sax_eventlist from xmlsupport instead
5906     of test_save
5907    
5908     2003-06-20 Bernhard Herzog <[email protected]>
5909    
5910 bh 1258 * test/test_load.py (LoadSessionTest.check_format): New helper
5911     method to make sure the test files we load might have been written
5912     by the current thuban version.
5913     (ClassificationTest.TestLayers, TestSingleLayer.test)
5914     (TestLayerVisibility.test, TestClassification.test)
5915     (TestLabels.test, TestLayerProjection.test, TestRasterLayer.test):
5916     Add check_format() calls and fix the thuban data to match the data
5917     that would be written by saving the session loaded from it.
5918    
5919     * test/xmlsupport.py (SaxEventLister, sax_eventlist): Copies of
5920     the same class and function in test_save.
5921    
5922     * test/test_xmlsupport.py (TestEventList): New. test cases for
5923     sax_eventlist
5924    
5925     2003-06-20 Bernhard Herzog <[email protected]>
5926    
5927 bh 1256 * Resources/XML/thuban.dtd: Add comment about which versions of
5928     Thuban are covered by this DTD
5929     (map): Fix content model for layers and raster layers. There can
5930     be any number or layers and raster layers in any order.
5931    
5932 jonathan 1254 2003-06-20 Jonathan Coles <[email protected]>
5933    
5934 jonathan 1265 This is mainly about fixing RTbug #1949.
5935    
5936 jonathan 1254 * Thuban/Model/classification.py: Remove "from __future__"
5937     import statement since python 2.2 is the earliest supported
5938     version.
5939    
5940     * Thuban/Model/proj.py (Projection.GetProjectedUnits): New.
5941     Currently returns PROJ_UNITS_METERS or PROJ_UNITS_DEGREES
5942     depending on the units this projection *forwards* into.
5943    
5944     * Thuban/Model/save.py (SessionSaver.write_classification):
5945     Remove unnecessary use of lambdas and nested functions.
5946    
5947     * Thuban/UI/legend.py (ScaleBarBitmap.__SetScale): Do scale
5948     adjustment here if the map projection uses degrees.
5949    
5950     * Thuban/UI/scalebar.py (ScaleBar.DrawScaleBar): Remove
5951     scale adjust code since it is now done before calling
5952     this method. Don't do anything if the map projection
5953     is None.
5954    
5955 bh 1244 2003-06-19 Bernhard Herzog <[email protected]>
5956    
5957 bh 1248 Move version specific load tests to their own file.
5958    
5959     * test/test_load.py: Expand the doc-string to explain a bit how to
5960     handle file format changes.
5961     (TestClassification.test): Update the docstring as this test is
5962     not about Thuban 0.2 anymore.
5963    
5964     * test/test_load_0_2.py: New file with the load tests for thuban
5965     files created with Thuban 0.2 and earlier.
5966    
5967     2003-06-19 Bernhard Herzog <[email protected]>
5968    
5969 bh 1246 Add XML validation to some of the tests. Validation will only be
5970     done if pyRXP is installed (http://reportlab.com/xml/pyrxp.html).
5971     To make the DTD available to the test cases it's moved into
5972     Resources/XML
5973    
5974     * Resources/XML/thuban.dtd: New. This is now the real Thuban DTD
5975     for versions up to and including 0.2. Two slight changes: added an
5976     encoding specification and fixed the comment which refered to
5977     GRASS, not Thuban
5978    
5979     * test/xmlsupport.py: New support module for tests involving XML.
5980     Currently there's a mix-in class for XML validation.
5981    
5982     * test/test_xmlsupport.py: New. Tests for the xmlsupport module
5983    
5984     * test/test_save.py (SaveSessionTest): Derive from ValidationTest
5985     so that we can validate the
5986     (SaveSessionTest.testEmptySession)
5987     (SaveSessionTest.testSingleLayer)
5988     (SaveSessionTest.testSingleLayer)
5989     (SaveSessionTest.testLayerProjection)
5990     (SaveSessionTest.testRasterLayer)
5991     (SaveSessionTest.testClassifiedLayer): Validate the generated XML
5992    
5993     * test/runtests.py (main): Call print_additional_summary instead
5994     of print_garbage_information
5995    
5996     * test/support.py (resource_dir): New function to return the
5997     "Resource" subdirectory
5998     (print_additional_summary): New function to combine several
5999     summary functions
6000     (run_tests): Use print_additional_summary instead of calling
6001     print_garbage_information directly
6002    
6003     2003-06-19 Bernhard Herzog <[email protected]>
6004    
6005 bh 1244 * Doc/thuban.dtd (classification): Correct the content model of
6006     the classification element.
6007     (projection): Add the "name" attribute
6008    
6009 frank 1242 2003-06-19 Frank Koormann <[email protected]>
6010    
6011     MERGE from the greater-ms3 branch.
6012    
6013     * Thuban/UI/scalebar.py (ScaleBar.DrawScaleBar): Apply conversion to
6014     scale if projection is latlong to get better estimate.
6015    
6016     Fix problem of hidden properties dialog under windows after double
6017     click on layer tree:
6018     The tree control always gets an Expanded / Collapsed event after
6019 joey 2162 the ItemActivated on double click, which raises the main window again.
6020     We add a second ItemActivated event to the queue, which simply
6021 frank 1242 raises the already displayed window.
6022    
6023     * Thuban/UI/legend.py (LegendTree.__init__): Instance variable
6024     raiseProperties initialized to prevent endless loops
6025     (LegendTree._OnItemActivated): Depending on self.raiseProperties
6026     simply raise the properties or open the dialog and issue a second
6027     event.
6028    
6029 jonathan 1235 2003-06-18 Jonathan Coles <[email protected]>
6030    
6031 jonathan 1239 * setup.py: Fix a few problems that occured under Windows.
6032    
6033     2003-06-18 Jonathan Coles <[email protected]>
6034    
6035 jonathan 1235 When Thuban loaded the map was redrawn twice because the
6036     legend was being opened after the mainwindow was created
6037     and not during its creation. This meant the map was drawn
6038     initially and then had to be redrawn when the legend
6039     caused the display to change. Now the legend is opened
6040     in the mainwindow constructor which resolves this issue.
6041    
6042     Also, although we were checking for the existence of
6043     gdal and gdalwarp modules, the gdalwarp extension was
6044     still being compiled (which may fail if the system doesn't
6045     have gdal installed). the build_ext command to setup.py
6046     now accepts the flags --with-gdal and --without-gdal.
6047     If --without-gdal is specified setup.py will try to
6048     use the gdal parameters specified by gdal-config. Under
6049     windows, those parameters have to be set in setup.py
6050     as with proj4 an wxWindows.
6051    
6052     * setup.py: Use a list instead of seperate variables for
6053     extension parameters so we can create a generic function
6054     that runs an appropriate *-config script.
6055     (run_cs_script): Renamed from run_wx_script and modified
6056     to accept a second argument which is a list of lists to
6057     be filled in by the values returned from running the command.
6058     (thuban_build_ext): New. Extends the build_ext command and
6059     provides the options --with-gdal/--without-gdal which then
6060     optionally includes the gdalwarp extension.
6061    
6062     * Thuban/Model/resource.py: First check if we can import
6063     the gdalwarp Thuban extension before checking for gdal.
6064     Also added some comments.
6065    
6066     * Thuban/UI/legend.py (ScaleBarBitmap.__SetScale): Check if
6067     the map is None which may be the case if none has been loaded
6068     yet.
6069    
6070     * Thuban/UI/main.py (main): Remove call to ShowLegend.
6071    
6072     * Thuban/UI/mainwindow.py (MainWindow.__init__): Call ShowLegend().
6073    
6074     * Thuban/UI/renderer.py: Check for gdal support before importing
6075     gdalwarp.
6076     (MapRenderer.render_map): Only try to optimize if we have gdal
6077     support otherwise nothing will get drawn.
6078    
6079 jonathan 1237 * Thuban/UI/view.py (MapCanvas.FitMapToWindow): This may be called
6080     during startup before a map has been created. Check if map is None
6081     before using it and do nothing if it is.
6082    
6083 jonathan 1224 2003-06-17 Jonathan Coles <[email protected]>
6084    
6085     Fix the problem with raster layers under Windows that caused
6086     Thuban to crash. The view should respond to layer projection
6087     changed events to update the display. Changes to a projection
6088     should not cause the map to be set to full extent.
6089    
6090     * Thuban/UI/view.py (MapCanvas.__init__): New instance variable
6091     current_map_proj to remember the current map projection so that
6092     when the projection changes we know what the previous projection
6093     was.
6094     (MapCanvas.SetMap): Unsubscribe and subscribe to
6095     LAYER_PROJECTION_CHANGED events.
6096     (MapCanvas.projection_changed): Split into two methods that respond
6097     to map and layer projection changes.
6098     (MapCanvas.map_projection_changed): New. Takes the current view and
6099     projects it using the new projection. This does not cause the
6100     map to be redrawn at full extent.
6101     (MapCanvas.layer_projection_changed): New. Cause a redraw which
6102     will draw each layer in its new projection.
6103    
6104     * extensions/thuban/bmpdataset.cpp (BMPDataset::Open): Call
6105     VSIFClose() not VSIFCloseL() to close the file. Fixes a crash
6106     under Windows.
6107    
6108     * extensions/thuban/gdalwarp.cpp (MFILENAME): Padding should be
6109     to twice sizeof(void*) because there are two digits for each
6110     hex byte.
6111    
6112 bh 1220 2003-06-16 Bernhard Herzog <[email protected]>
6113    
6114     Update to the layer interface: Direct access to the table,
6115     shapetable, shapefile and filename attributes is now actively
6116     deprecated by issuing deprecation warnings for all places where
6117     this happens.
6118    
6119     * Thuban/Model/layer.py (Layer.__getattr__): New. Implement access
6120     to the instance variables table, shapetable, shapefile and
6121     filename via __getattr__ so that we can issue a deprecation
6122     warning.
6123     (Layer.SetShapeStore): Don't set the deprecated instance variables
6124     any more
6125     (Layer.SetShapeStore): Don't use deprecated layer instance
6126     variables
6127     (Layer.Destroy): No need to explicitly remove the instance
6128     variables any more
6129     (Layer.GetFieldType, Layer.Shape): Don't use deprecated layer
6130     instance variables
6131    
6132     * Thuban/UI/classgen.py (ClassGenDialog.__init__)
6133     (GenUniformPanel._OnRetrieve, GenUniquePanel._OnRetrieve)
6134     (GenQuantilesPanel.GetList, GenQuantilesPanel.OnRetrieve): Don't
6135     use deprecated layer instance variables
6136    
6137     * Thuban/UI/classifier.py (Classifier.__init__): Don't use
6138     deprecated layer instance variables
6139    
6140     * Thuban/UI/identifyview.py (IdentifyListCtrl.selected_shape)
6141     (IdentifyGridCtrl.selected_shape): Don't set the deprecated layer
6142     instance variables
6143    
6144     * Thuban/UI/tableview.py (LayerTableGrid.select_shapes): Don't use
6145     deprecated layer instance variables
6146    
6147     * Thuban/UI/mainwindow.py (MainWindow.LayerShowTable): Don't use
6148     deprecated layer instance variables
6149    
6150     * Thuban/Model/save.py (SessionSaver.write_layer): Don't use
6151     deprecated layer instance variables
6152    
6153     * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer)
6154     (MapRenderer.polygon_render_param): Don't use deprecated layer instance
6155     variables
6156    
6157     * test/runtests.py (main): Turn Thuban's deprecation warnings into
6158     errors so that they're cought by the tests
6159    
6160     * test/test_load.py (TestSingleLayer.test): Don't use deprecated
6161     layer instance variables
6162    
6163 jonathan 1212 2003-06-16 Jonathan Coles <[email protected]>
6164    
6165     Fix a problem under Windows whereby if the user double-clicks on a
6166     layer in the legend that tree item will expand or collapse as well
6167     as open the layer properties dialog. The state of the tree item
6168     should not be affected.
6169    
6170     * Thuban/UI/legend.py (LegendTree.__init__): Add instance variable
6171     preventExpandCollapse and subscribe to expanding and collapsing
6172     events.
6173     (LegendTree.OnItemExpandCollapse): New. Responds to expanding and
6174     collapsing events and will veto the event if it has been triggered
6175     by the user double clicking on a layer.
6176     (LegendTree._OnItemActivated): Set preventExpandCollapse to indicate
6177     that an expanding/collapsing event should be vetoed.
6178    
6179 bh 1208 2003-06-13 Bernhard Herzog <[email protected]>
6180    
6181     * Thuban/UI/classifier.py (Classifier.OnClose)
6182     (Classifier.map_layers_removed)
6183     (Classifier.layer_shapestore_replaced): Unsubscribe the messages
6184     in OnClose and not in map_layers_removed or
6185     layer_shapestore_replaced to make sure it always happens when the
6186     dialog is closed
6187    
6188 jonathan 1201 2003-06-13 Jonathan Coles <[email protected]>
6189    
6190 jonathan 1203 This puts back a fix for Windows where a panel is needed so that
6191     the background of the table view appears correctly.
6192    
6193     * Thuban/UI/tableview.py (TableFrame.__init__): Add a panel
6194     object that can be used by derived classes to place any
6195     controls (including the grid) onto.
6196     (QueryTableFrame.__init__): Use the panel as the parent window
6197     for all the controls. Reparent the grid so that the panel is
6198     the parent. Call UpdateStatusText() to correctly initialize
6199     the status bar.
6200    
6201     2003-06-13 Jonathan Coles <[email protected]>
6202    
6203 jonathan 1201 * Thuban/UI/dialogs.py (ThubanFrame): New: a class that inherits
6204     from wxFrame (as opposed to wxDialog like the other classes)
6205     but otherwise behaves like the other classes. This is needed
6206     for the TableView which isn't really a dialog and needs to
6207     have a status bar and control buttons.
6208    
6209     * Thuban/UI/tableview.py (TableGrid.__init__): Create an
6210     instance variable to keep track of how many rows are selected.
6211     Subscribe once to the the events we are interested in.
6212     (ThubanGrid.OnRangeSelect): Only handle event if event handling
6213     hasn't been turned off.
6214     (ThubanGrid.OnSelectCell): Only handle event if event handling
6215     hasn't been turned off.
6216     (ThubanGrid.ToggleEventListeners): Rather than subscribe None
6217     as an event listener (which changes the event handler stack)
6218     simply set an instance variable to False. This is checked in
6219     the event handlers.
6220     (ThubanGrid.GetNumberSelected): Return the number of currently
6221     selected rows.
6222     (TableFrame): Inherit from ThubanFrame so we can have a
6223     status bar and control buttons.
6224     (QueryTableFrame.__init__): Create a status bar. Fixes RTbug #1942.
6225     Explicitly set which items are selected in the operator choice and
6226     action choice so there is always a valid selection. Fixes RTbug #1941.
6227     Subscribe to grid cell selection events so we can update the
6228     status bar.
6229     (QueryTableFrame.UpdateStatusText): Update the status bar with
6230     how many rows are in the grid, how many columns, and how many
6231     rows are selected.
6232     (QueryTableFrame.OnGridSelectRange, QueryTableFrame.OnGridSelectCell):
6233     Call UpdateStatusText when cells are (de)selected.
6234     (QueryTableFrame.OnQuery): Use the string value in the value
6235     combo if either the selected item index is 0 or if the string
6236     cannot be found in the predefined list (this happens if the
6237     user changes the text). Fixes RTbug #1940.
6238     Only turn off the grid event listeners if there a query comes
6239     back with a none empty list of ids. in the case that the list
6240     is empty this causes a grid.ClearSelection() call to actually
6241     clear the grid selection which causes the selected items in
6242     the map to be deselected. Fixes RTbug #1939.
6243    
6244     * test/test_save.py (XMLWriterTest.Encode): Check return values.
6245     Fixes RTbug #1851.
6246    
6247 bh 1195 2003-06-13 Bernhard Herzog <[email protected]>
6248    
6249     * Thuban/UI/identifyview.py (IdentifyView.__init__): Call
6250     self.selected_shape with the current selection to make sure the
6251     contents of the dialog are up to date when it's shown for the
6252     first time.
6253     The dialog used to work without this by luck. The recent fix to
6254     the connector module 'broke' a 'feature' the identify view was
6255     relying on, i.e that subscribing to a message in response to
6256     receiving a message of that type would mean that the new
6257     subscriber would also be called for the same message.
6258    
6259 jonathan 1169 2003-06-12 Jonathan Coles <[email protected]>
6260 jonathan 1175
6261 jonathan 1193 * extensions/thuban/gdalwarp.cpp: Removed debug printing as
6262     the image is rendered. Fixes RTbug #1937.
6263    
6264     2003-06-12 Jonathan Coles <[email protected]>
6265    
6266 jonathan 1191 * Thuban/Lib/fileutil.py: As is done under Windows, create the
6267 jonathan 1193 user directory if it doesn't exist on a posix system.
6268     Fixes RTbug #1815.
6269 jonathan 1191
6270     * Thuban/Model/resource.py (get_user_proj_files): Moved the
6271     called to get_application_dir here, so that the directory
6272     will only be called if this method is invoked.
6273    
6274     * Thuban/UI/projdialog.py (ProjFrame.__DoOnProjAvail): Clear
6275     the projfilepath if no projection is selected.
6276    
6277     2003-06-12 Jonathan Coles <[email protected]>
6278    
6279 jonathan 1182 * Thuban/UI/legend.py (ScaleBarBitmap.__SetScale): Don't draw
6280     the scalebar if the current map has no projection set.
6281    
6282     * Thuban/UI/projdialog.py (ProjFrame.__DoOnProjAvail): Set the
6283     projfilepath label to just the basename of the projection file
6284     rather than include the entire path.
6285    
6286     * Thuban/Model/resource.py: Fix missed proj functions that
6287     needed to be renamed.
6288    
6289     2003-06-12 Jonathan Coles <[email protected]>
6290    
6291 jonathan 1178 * Thuban/Model/classification.py: Removed assert statements that
6292     tested if the variable was an instance of Color.
6293    
6294     * Thuban/Model/color.py (Color): Remove commented code that isn't
6295     used.
6296     (Transparent): Renamed from NoColor. Doesn't inherit from Color.
6297     Fixes RTbug #1835.
6298     (Transparent.__eq__, Transparent.__ne, Transparent.__repr): New.
6299     Needed now that the class doesn't inherit from Color.
6300    
6301     2003-06-12 Jonathan Coles <[email protected]>
6302    
6303 jonathan 1175 * test/test_save.py (XMLWriterTest.testEncode): Explicitly
6304     check unicode strings.
6305    
6306     * test/test_layer.py: Check for existence of gdal.
6307    
6308     2003-06-12 Jonathan Coles <[email protected]>
6309 jonathan 1172
6310     * Thuban/Model/xmlreader.py: New. Contains the XMLReader class
6311     that was in load.py
6312 jonathan 1169
6313 jonathan 1172 * Thuban/Model/xmlwriter.py: New. Contains the XMLWriter class
6314     that was in save.py
6315    
6316     2003-06-12 Jonathan Coles <[email protected]>
6317    
6318 jonathan 1169 This is largely a collection of bug fixes. We also handle the
6319     case where gdal is not on the system. The XMLReader and XMLWriter
6320     classes were moved into there own files to resolve some circular
6321     import references and because they shouldn't really be in the
6322     file that is dediciated to reading/writing session files since
6323     they are also used elsewhere.
6324    
6325     * Thuban/Model/classgen.py: Renamed functions to follow the
6326     function_names_with_underscores style. Fixes RTbug #1903.
6327     (calculate_quantiles): Raise ValueError if 'percents' is invalid.
6328    
6329     * Thuban/Model/layer.py: Import gdal only if it available.
6330     (RasterLayer): Handle the case where the gdal library is unavailable.
6331     Addresses RTbug #1877.
6332    
6333     * Thuban/Model/load.py (XMLReader): Moved into seperate file
6334     xmlreader.py.
6335    
6336 jonathan 1172 2003-06-12 Jonathan Coles <[email protected]>
6337    
6338     This is largely a collection of bug fixes. We also handle the
6339     case where gdal is not on the system. The XMLReader and XMLWriter
6340     classes were moved into there own files to resolve some circular
6341     import references and because they shouldn't really be in the
6342     file that is dediciated to reading/writing session files since
6343     they are also used elsewhere.
6344    
6345     * Thuban/Model/classgen.py: Renamed functions to follow the
6346     function_names_with_underscores style. Fixes RTbug #1903.
6347     (calculate_quantiles): Raise ValueError if 'percents' is invalid.
6348    
6349     * Thuban/Model/layer.py: Import gdal only if it available.
6350     (RasterLayer): Handle the case where the gdal library is unavailable.
6351     Addresses RTbug #1877.
6352    
6353     * Thuban/Model/load.py (XMLReader): Moved into seperate file
6354     xmlreader.py.
6355    
6356 jonathan 1169 * Thuban/Model/save.py (escape, XMLWriter): Moved into seperate
6357     file xmlwriter.py.
6358    
6359     * Thuban/Model/resource.py: Renamed functions to following the
6360     function_names_with_underscores style.
6361     (has_gdal_support): New function that returns true if the gdal
6362     library is available. Addresses RTbug #1877.
6363    
6364     * Thuban/UI/application.py (ThubanApplication.OpenSession):
6365     Display a message box if the gdal library is not available, but
6366     only if there are any layers that would use it. Addresses RTbug #1877.
6367    
6368     * Thuban/UI/classgen.py: Use renamed projection resource functions.
6369     (GenUniformPanel.__CalcStepping): Fix a slight discrepency
6370     when using integers versus floats.
6371    
6372     * Thuban/UI/mainwindow.py (_has_gdal_support): New. Used to
6373     determine if the "Add Image Layer" menu option should be
6374     greyed out or not. Addresses RTbug #1877.
6375    
6376     * Thuban/UI/projdialog.py: Use renamed projection resource functions.
6377    
6378     * Thuban/UI/renderer.py (MapRenderer.render_map): Only try to
6379     optimize if a raster layer is visible. Fixes RTbug #1931.
6380     Only draw the raster layer if the gdal library is available.
6381     Addresses RTbug #1877.
6382    
6383     * test/test_classgen.py: Add tests for generate_singletons,
6384     generate_uniform_distribution, generate_quantiles. Fixes RTbug #1903.
6385     (test_calculate_quantiles): Fix some tests to catch the new
6386     ValueError that is raised.
6387    
6388     * test/test_proj.py: Use renamed projection resource functions.
6389    
6390     * test/test_save.py (SaveSessionTest.testClassifiedLayer): New
6391     test for saving classified layers. Fixes RTbug #1902.
6392     (XMLWriterTest): New. Tests the XMLWriter class. Fixes RTbug #1851.
6393    
6394 jan 1156 2003-06-12 Jan-Oliver Wagner <[email protected]>
6395    
6396     Fix for http://intevation.de/rt/webrt?serial_num=1900.
6397    
6398     * Thuban/UI/multiplechoicedialog.py: New. A multiple choice dialog.
6399    
6400     * Thuban/UI/mainwindow.py: import wxMultipleChoiceDialog from
6401     multiplechoicedialog.py rather than from the wxPython library.
6402    
6403 frank 1151 2003-06-11 Frank Koormann <[email protected]>
6404    
6405 frank 1152 * Thuban/Lib/fileutil.py (get_application_dir): Minor stability
6406     update.
6407    
6408     2003-06-11 Frank Koormann <[email protected]>
6409    
6410 frank 1151 * Thuban/Lib/fileutil.py (get_application_dir): New function to
6411     determine the absolute .thuban/thuban directory under
6412     "posix" (os.expanduser) and "nt" (read AppData registry key).
6413    
6414     * Thuban/Model/resource.py: Use get_application_dir
6415    
6416     * Thuban/UI/application.py (ThubanApplication.read_startup_files):
6417     Use get_application_dir.
6418    
6419 bh 1143 2003-06-10 Bernhard Herzog <[email protected]>
6420    
6421 bh 1147 * Thuban/UI/tableview.py (LayerTableFrame.__init__): Subscribe to
6422     the messages MAP_LAYERS_REMOVED messages
6423     (LayerTableFrame.OnClose): Unsubscribe from it.
6424     (LayerTableFrame.map_layers_removed): New. Receiver for
6425     MAP_LAYERS_REMOVED. Close the dialog when the layer whose the
6426     dialog is showing is removed.
6427    
6428     2003-06-10 Bernhard Herzog <[email protected]>
6429    
6430 bh 1145 * Thuban/Lib/connector.py (Connector.Issue): Iterate over a copy
6431     of the receivers list so that unsubscribing in a receiver doesn't
6432     modify it while iterating over it.
6433    
6434     * test/test_connector.py
6435     (ConnectorTest.test_disconnect_in_receiver): New. Test whether
6436     unsubscribing in a receiver works correctly. See docstring for
6437     details
6438    
6439     2003-06-10 Bernhard Herzog <[email protected]>
6440    
6441 bh 1143 * Thuban/Model/messages.py (LAYER_SHAPESTORE_REPLACED): New
6442     message.
6443    
6444     * Thuban/Model/layer.py (Layer.SetShapeStore): Send
6445     LAYER_SHAPESTORE_REPLACED when the shapestore changes. A
6446     LAYER_CHANGED will still be sent if the classification changes.
6447    
6448     * Thuban/UI/classifier.py (Classifier.__init__): Add the map as
6449     parameter so we can subscribe to some of its messages
6450     (Classifier.__init__): Subscribe to the map's MAP_LAYERS_REMOVED
6451     and the layer's LAYER_SHAPESTORE_REPLACED
6452     (Classifier.unsubscribe_messages): New. Unsubscribe from message
6453     subscribed to in __init__
6454     (Classifier.map_layers_removed)
6455     (Classifier.layer_shapestore_replaced): receivers for the messages
6456     subscribed to in __init__. Unsubscribe and close the dialog
6457    
6458     * Thuban/UI/mainwindow.py (MainWindow.OpenLayerProperties): Pass
6459     the map to the Classifier dialog
6460    
6461     * test/test_layer.py (SetShapeStoreTests): Derive from
6462     SubscriberMixin as well so we can test messages
6463     (SetShapeStoreTests.setUp): Subscribe to some of the layer's
6464     messages
6465     (SetShapeStoreTests.tearDown): Clear the messages again
6466     (SetShapeStoreTests.test_sanity): Expand the doc-string and check
6467     for the modified flag too
6468     (SetShapeStoreTests.test_set_shape_store_modified_flag): New test
6469     to check whether SetShapeStore sets the modified flag
6470     (SetShapeStoreTests.test_set_shape_store_different_field_name)
6471     (SetShapeStoreTests.test_set_shape_store_same_field)
6472     (SetShapeStoreTests.test_set_shape_store_same_field_different_type):
6473     Add tests for the messages. This checks both the new
6474     LAYER_SHAPESTORE_REPLACED and the older LAYER_CHANGED
6475    
6476 jan 1141 2003-06-06 Jan-Oliver Wagner <[email protected]>
6477    
6478     * Thuban/UI/mainwindow.py: Improved and partly added help texts for
6479     the menu items.
6480    
6481 frank 1134 2003-06-05 Frank Koormann <[email protected]>
6482    
6483 frank 1139 * Thuban/UI/identifyview.py (IdentifyView.__init__):
6484     Layout reimplemented without panel. Make life easier to fit the list
6485     in the dialog.
6486    
6487     2003-06-05 Frank Koormann <[email protected]>
6488    
6489 frank 1137 * Thuban/UI/projdialog.py (ProjFrame.__init__): Fill the projchoice
6490     once on initialisation (Former implementation resulted in multiple
6491     entries for each projection).
6492     (ProjFrame.__FillAvailList): selectProj as second optional parameter,
6493     if set, select the projection found under the specified name. This
6494     overwrites any other selection estimate.
6495     Removed projchoice filling from this method.
6496     (ProjFrame._OnSave, ProjFrame._OnAddToList):
6497     Updated call of ProjFrame.__FillAvailList
6498     (LCCPanel._DoLayout): Moved parameter controls in more common order.
6499    
6500     * Resources/Projections/defaults.proj: Extended defaults representing
6501     various common European projections.
6502    
6503     2003-06-05 Frank Koormann <[email protected]>
6504    
6505 frank 1134 * Thuban/UI/identifyview.py (IdentifyView.__init__):
6506     Use ListCtrl instead of GridCtrl
6507    
6508     * Thuban/Model/resource.py:
6509     Guess location of .thuban directory from tempdir parent directory.
6510    
6511     * Thuban/UI/application.py (ThubanApplication.read_startup_files):
6512     Guess location of .thuban directory from tempdir parent directory.
6513    
6514 bh 1130 2003-06-04 Bernhard Herzog <[email protected]>
6515    
6516     Do not cache the values returned by the tree widget's
6517     GetFirstChild and GetNextChild methods because it led to lots of
6518     segfaults. The new way requires more brute force but is more
6519     reliable.
6520    
6521     * Thuban/UI/legend.py (LegendTree.__init__): Remove instance
6522     variable layer2id
6523     (LegendTree.find_layer): New method to do with brute force what
6524     layer2id tried to accomplish
6525     (LegendTree._OnMsgLayerChanged)
6526     (LegendTree._OnMsgLayerTitleChanged, LegendTree.__ShowHideLayer):
6527     Use find_layer instead of layer2id
6528     (LegendTree.__RemoveLayer, LegendTree.__AddLayer): No need to
6529     update layer2id anymore
6530     (LegendTree._OnMsgMapLayersRemoved)
6531     (LegendTree._OnMsgMapLayersAdded): Get by without layer2id.
6532    
6533 tkoester 1128 2003-06-03 Thomas Koester <[email protected]>
6534    
6535     * Thuban/Model/classgen.py (GenQuantiles0): New function.
6536    
6537 bh 1120 2003-06-02 Bernhard Herzog <[email protected]>
6538    
6539 bh 1127 * Thuban/UI/mainwindow.py (layer_rename command, table_rename command):
6540     New commands.
6541     (main_menu): Add the new commands.
6542     (MainWindow.TableRename): New. Implementation of the table_rename
6543     command.
6544     (MainWindow.RenameLayer): New. Implementation of the layer_rename
6545     command.
6546    
6547     * Thuban/Model/session.py (Session.AddTable): call self.changed to
6548     set the modified flag
6549    
6550     * test/test_session.py (TestSessionSimple.test_add_table): Test
6551     whether the modified flag is set properly
6552    
6553     * Thuban/Model/base.py (TitledObject.SetTitle): Call changed
6554     instead of issue so that the modified flags get updated.
6555    
6556     * test/test_base.py (SomeTitledObject): Derive from Modifiable
6557     instead of Publisher to reflect reality better and to accomodate
6558     the fact that SetTitle now calls changed instead of issue
6559    
6560     2003-06-02 Bernhard Herzog <[email protected]>
6561    
6562     * Thuban/UI/classgen.py (GenQuantilesPanel.GetList): Resource
6563     acquisition has to happen before the try in a try-finally.
6564    
6565     2003-06-02 Bernhard Herzog <[email protected]>
6566    
6567 bh 1120 * Thuban/UI/legend.py (LegendTree._OnMsgMapLayersRemoved): It's
6568     possible that a layer is removed that is not currently selected in
6569     the legend so don't check for this.
6570    
6571 bh 1112 2003-05-30 Bernhard Herzog <[email protected]>
6572    
6573 bh 1118 * Thuban/Model/layer.py (Layer.Destroy): Set all instance
6574     variables to None that have direct or indirect references to
6575     shapefiles or dbf files to make sure that they do go away and the
6576     files are closed.
6577    
6578     2003-05-30 Bernhard Herzog <[email protected]>
6579    
6580 bh 1116 * Thuban/UI/legend.py (LegendTree.GetRootItem): Reset
6581     availImgListIndices when a new image list is created
6582    
6583     2003-05-30 Bernhard Herzog <[email protected]>
6584    
6585 bh 1114 * Thuban/UI/legend.py (LegendTree.__init__): New instance variable
6586     changing_selection to indicate whether the LegendTree code itself
6587     is currently changing the selection
6588     (LegendTree.normalize_selection): New method to normalize the
6589     selection by selecting the layer item even if the user clicked on
6590     the classification.
6591     (LegendTree._OnSelChanged): normalize the selection. This works
6592     around a bug in wx which doesn't keep track of the selection
6593     properly when subtrees are deleted.
6594    
6595     2003-05-30 Bernhard Herzog <[email protected]>
6596    
6597 bh 1112 * Thuban/UI/view.py (MapCanvas.set_view_transform): Limit the
6598     maximum and minimum scale factors.
6599    
6600     * test/test_classgen.py (ClassGenTest.test): Update to reflect the
6601     changes in classgen.py
6602    
6603 jonathan 1109 2003-05-30 Jonathan Coles <[email protected]>
6604    
6605     * Thuban/Model/classgen.py: Remove ClassGenerator class but make
6606     all the methods functions. Fixes RTBug #1903.
6607    
6608     * Thuban/Model/map.py (Map.TopLayer, Map.BottomLayer): Renamed
6609     to MoveLayerToTop and MoveLayerToBottom respectively. Fixes
6610     RTBug #1907.
6611    
6612     * Thuban/UI/classgen.py: Use classgen functions that were part
6613     of the ClassGenerator class. Put try/finally blocks around
6614     code that uses wxBeginBusyCursor()/wxEndBusyCursor(). Fixes
6615     RTBug #1904.
6616    
6617     * Thuban/UI/classifier.py: Remove unused import of ClassGenerator.
6618    
6619     * Thuban/UI/legend.py: The legend was cleared and repopulated any
6620     time something changed which caused some state to be lost such
6621     as which children were expanded or collapsed. Fixes RTBug #1901.
6622     (LegendTree._OnMsgMapLayersAdded): Add only new layers.
6623     (LegendTree.__OnMsgMapLayersRemoved): Remove layers that exist in
6624     the legend but not in the map.
6625     (LegendTree.__FillTree): Move main functionality out into smaller
6626     methods that can be used by other methods.
6627     (LegendTree.__FillTreeLayer): Reuse old slots in the image list
6628     if they are available.
6629     (LegendTree.DeleteAllItems): Renamed from __DeleteAllItems so
6630     that we override the wxTreeCtrl method. Iterate over children
6631     and call __RemoveLayer.
6632     (LegendTree.__AddLayer): New. Add a new layer to the legend.
6633     (LegendTree.__RemoveLayer): Remove a layer from the legend.
6634     (LegendTree.DeleteChildren): New, overrides wxTreeCtrl method.
6635     Should only be called with the id of a layer branch.
6636     (LegendTree.GetRootItem): New, overrides wxTreeCtrl method.
6637     Returns the root item or creates one if necessary.
6638    
6639     * Thuban/UI/renderer.py (MapRenderer.draw_raster_layer): Call
6640     ProjectRasterFile with tuple arguments instead of strings.
6641    
6642     * Thuban/UI/tableview.py (QueryTableFrame.OnQuery): Wrap code
6643     with try/finally. Fixes RTBug #1904.
6644    
6645     * Thuban/UI/view.py (MapCanvas.OnPaint): Wrap code
6646     with try/finally. Fixes RTBug #1904.
6647     (MapCanvas.FitSelectedToWindow): If a single point is selected
6648     simply center it on the display. Fixes RTBug #1849.
6649    
6650     * extensions/thuban/gdalwarp.cpp: Removed code that allowed gdalwarp
6651     to be compiled as a standalone app. Now the code can only be
6652     called from Python which simplifies the parameter passing.
6653     (ProjectRasterFile): Handle Python arguments. Remove code that
6654     checks for a destination dataset. Add more clean up code.
6655    
6656     * test/test_map.py (TestMapWithContents.test_raise_layer_top,
6657     TestMapWithContents.test_lower_layer_bottom):
6658     Test Map.MoveLayerToTop() and Map.MoveLayerToBottom() respectively.
6659     Fixes RTBug #1907.
6660    
6661     * Thuban/UI/mainwindow.py (MainWindow.ToggleLegend): Apply a full
6662     extent to the map when the legend is toggled. Fixes RTBug #1881.
6663    
6664 jan 1097 2003-05-29 Jan-Oliver Wagner <[email protected]>
6665    
6666     * Thuban/UI/tableview.py (LayerTableFrame.OnClose): Bug-fix: Now
6667     unsubscribes all that is subcribed in __init__.
6668    
6669 bh 1089 2003-05-28 Bernhard Herzog <[email protected]>
6670    
6671 bh 1095 * Thuban/UI/mainwindow.py (MainWindow.DuplicateLayer)
6672     (MainWindow.CanDuplicateLayer): New methods to implement the
6673     Layer/Duplicate command.
6674     (layer_duplicate command): New.
6675     (main_menu): Add layer_duplicate to the Layer menu.
6676    
6677     2003-05-28 Bernhard Herzog <[email protected]>
6678    
6679 bh 1093 * Thuban/UI/tableview.py (NullRenderer.Draw): New. Our own
6680     renderer so that NULL/None values get displayed differently (by a
6681     gray rectangle).
6682     (TableGrid.__init__): Override the default renderers
6683    
6684     2003-05-28 Bernhard Herzog <[email protected]>
6685    
6686 bh 1089 * Thuban/Model/layer.py (Layer.SetShapeStore): Set the
6687     classification to "None" if the type of the field has changed.
6688    
6689     * test/test_layer.py (SetShapeStoreTests): New. Class with a few
6690     test for the Layer.SetShapeStore method
6691    
6692 jan 1087 2003-05-28 Jan-Oliver Wagner <[email protected]>
6693 jan 1085
6694 jan 1087 * Thuban/Model/layer.py (Layer.TreeInfo): Fixed a bug (a layer
6695     does not necessarily have a filename).
6696    
6697     2003-05-28 Jan-Oliver Wagner <[email protected]>
6698    
6699 jan 1085 * Thuban/UI/mainwindow.py (MainWindow.TableClose, MainWindow.TableShow):
6700     sort the selection list for the dialog.
6701    
6702 frank 1083 2003-05-28 Frank Koormann <[email protected]>
6703    
6704     * extensions/thuban/wxproj.cpp
6705     (project_point): Removed cast to int for projected point coordinates.
6706     (shape_centroid): Return last point if all polygon vertices fall
6707     to one point.
6708    
6709 bh 1079 2003-05-28 Bernhard Herzog <[email protected]>
6710    
6711 bh 1081 * Thuban/UI/mainwindow.py (_can_unjoin): Add doc-string and cope
6712     with layers that don't have shapestores, i.e. raster layers.
6713    
6714     2003-05-28 Bernhard Herzog <[email protected]>
6715    
6716 bh 1079 * Thuban/Model/table.py (DBFTable.__init__): Omit the extension
6717     when determining the title from the filename.
6718    
6719     * test/test_dbf_table.py (TestDBFTable.test_title): Update to
6720     reflect changes in the way the title is derived from the filename
6721    
6722 frank 1077 2003-05-28 Frank Koormann <[email protected]>
6723    
6724     * Thuban/UI/mainwindow.py (MainWindow.TableShow):
6725     Added wxDEFAULT_DIALOG_STYLE to show table dialog styles.
6726    
6727 bh 1069 2003-05-27 Bernhard Herzog <[email protected]>
6728    
6729 bh 1075 * Thuban/UI/mainwindow.py (MainWindow.delegated_messages): Also
6730     delegate SelectedLayer.
6731     (MainWindow.LayerUnjoinTable): Implement.
6732     (_can_unjoin): New. Helper function for the sensitivity of the
6733     layer/unjoin command.
6734    
6735     * Thuban/Model/data.py (ShapefileStore.OrigShapeStore)
6736     (DerivedShapeStore.OrigShapeStore): New. Return the original
6737     shapestore. Used to figure out how to unjoin.
6738     (DerivedShapeStore.Shapefile): Fix a typo.
6739    
6740     2003-05-27 Bernhard Herzog <[email protected]>
6741    
6742 bh 1073 * Thuban/UI/join.py (JoinDialog): Extend to handle layer joins as
6743     well
6744     (JoinDialog.__init__): Use the layer parameter and only build the
6745     left choice when a layer is given
6746     (JoinDialog.OnJoin): Handle layer joins as well
6747     (JoinDialog.OnLeftTable, JoinDialog.OnRightTable): Handle the case
6748     that the user selects the "Select..." item. The sensitivitly
6749     updating is now in update_sensitivity
6750     (JoinDialog.y): New method to refactor the sensitivity update of
6751     the join button into its own method.
6752    
6753     * Thuban/UI/mainwindow.py (MainWindow.LayerJoinTable): Implement.
6754    
6755     2003-05-27 Bernhard Herzog <[email protected]>
6756    
6757 bh 1071 * Thuban/UI/mainwindow.py (table_close command): Make it sensitive
6758     iff there are unreferenced tables in the session
6759    
6760     2003-05-27 Bernhard Herzog <[email protected]>
6761    
6762 bh 1069 * Thuban/Model/messages.py (TABLE_REMOVED): New message.
6763    
6764     * Thuban/Model/session.py (Session.UnreferencedTables): New method
6765     to return tables that are not referenced by other tables or shape
6766     stores and can be removed.
6767     (Session.RemoveTable): Issue a TABLE_REMOVED message after
6768     removing the table
6769    
6770     * Thuban/UI/mainwindow.py: Remove unused imports
6771     (MainWindow.TableClose): Implement.
6772    
6773     * Thuban/UI/tableview.py (TableFrame.__init__): Subscribe to some
6774     messages so that the frame will be automatically closed when a new
6775     session is opened or the table is removed.
6776     (TableFrame.OnClose): Unsubscribe the Subscriptions made in
6777     __init__
6778     (TableFrame.close_on_session_replaced)
6779     (TableFrame.close_on_table_removed): New. Subscribers that close
6780     the window
6781    
6782     * test/test_session.py (TestSessionMessages.test_remove_table)
6783     (TestSessionSimple.test_remove_table): Move the test to
6784     TestSessionSimple and add test for the TABLE_REMOVED message
6785     (TestSessionBase.setUp): Also subscribe to TABLE_REMOVED
6786     (TestSessionSimple.test_unreferenced_tables) New. Test for the
6787     UnreferencedTables method.
6788     (UnreferencedTablesTests): New. Class with some more sophisticated
6789     tests for UnreferencedTables.
6790    
6791 frank 1065 2003-05-27 Frank Koormann <[email protected]>
6792    
6793 frank 1067 * Thuban/UI/tableview.py (QueryTableFrame.__init__): The "_S_election"
6794     display has some unwanted side effects. Removed again.
6795    
6796     2003-05-27 Frank Koormann <[email protected]>
6797    
6798 frank 1065 * Resources/Bitmaps/legend_icon_layer.xpm: New, icon for legend.
6799    
6800     * Thuban/UI/legend.py (LegendTree.__FillTree): Use "legend_icon_layer"
6801    
6802 jan 1062 2003-05-27 Jan-Oliver Wagner <[email protected]>
6803    
6804 bh 1069 * test/test_menu.py (MenuTest.test): Added test for
6805     Menu.RemoveItem().
6806 jan 1062
6807 bh 1069 * Thuban/UI/menu.py (Menu.RemoveItem): New. Remove an item from
6808     the menu.
6809 jan 1062
6810 frank 1059 2003-05-27 Frank Koormann <[email protected]>
6811    
6812     Nonmodal dialogs without parent (i.e. they can fall behind the main
6813     window)
6814    
6815     * Thuban/UI/mainwindow.py (MainWindow.OnClose): Explicitly destroy
6816     all dialogs in the dialogs dictionary and the canvas.
6817    
6818     * Thuban/UI/dialogs.py (NonModalNonParentDialog): New class, without
6819     parent, i.e. can fall behind other windows.
6820     (NonModalDialog.OnClose): Check is dialog is in mainwindow.dialog
6821     dictionary before removing it.
6822    
6823     * Thuban/UI/classifier.py: Dialog derived from NonModalNonParentDialog
6824    
6825     * Thuban/UI/projdialog.py: Dialog derived from NonModalNonParentDialog
6826     * Thuban/UI/tableview.py: Dialog derived from NonModalNonParentDialog
6827     * Thuban/UI/tree.py: Dialog derived from NonModalNonParentDialog
6828    
6829 bh 1053 2003-05-27 Bernhard Herzog <[email protected]>
6830    
6831 bh 1055 * Thuban/UI/mainwindow.py (MainWindow.ShowTableView): New. Open a
6832     tableview dialog
6833     (MainWindow.TableShow): Use ShowTableView to open the dialogs.
6834     Also, don't use the table's titles as the dialog names. The titles
6835     aren't guaranteed to be unique.
6836     (MainWindow.TableOpen): Open a table view dialog after opening the
6837     table
6838    
6839     2003-05-27 Bernhard Herzog <[email protected]>
6840    
6841 bh 1053 * Thuban/UI/mainwindow.py: Remove the Table/Hide menu item. Its
6842     effect can be achieved by simply closing the window showing the
6843     table.
6844     (MainWindow.TableHide): Removed.
6845     (main_menu): Removed "table_hide"
6846    
6847 frank 1051 2003-05-27 Frank Koormann <[email protected]>
6848    
6849     Fix legend tree display problems under Win32
6850    
6851     * Thuban/UI/legend.py: BMP_SIZE_W = 15
6852     (LegendTree.__FillTree): Display "legend_icon_map.xpm" with layer title.
6853     (LegendTree.__FillTreeLayer): Explicitely set SelectedImage.
6854    
6855     * Resources/Bitmaps/legend_icon_map.xpm: New icon for legend.
6856    
6857 jan 1048 2003-05-27 Jan-Oliver Wagner <[email protected]>
6858    
6859     * Thuban/UI/menu.py (Menu.InsertSeparator): Additional optional parameter
6860     'after' now allows to insert separators almost anywhere in the menu.
6861    
6862 frank 1046 2003-05-27 Frank Koormann <[email protected]>
6863    
6864     * Thuban/UI/tableview.py (QueryTableFrame.__init__): Underline the
6865     "S" of selection box label to hint on hot key (Alt-S). Works under
6866     Win32 but is ignored under GTK.
6867    
6868     2003-05-26 Frank Koormann <[email protected]>
6869    
6870     * Thuban/UI/projdialog.py (ProjFrame.__do_layout, ProjPanel._DoLayout):
6871     Center Choices.
6872    
6873 bh 1038 2003-05-26 Bernhard Herzog <[email protected]>
6874    
6875 bh 1044 Remove the Precision methods again. They're too DBF specific to be
6876     part of the table interface and they're only used in table_to_dbf
6877     anyway.
6878    
6879     * Thuban/Model/transientdb.py (TransientTableBase.Width):Use a
6880     fixed precision of 12 for doubles.
6881     (TransientTableBase.Precision): Removed
6882     (AutoTransientTable.Width): Delegate to self.table.
6883    
6884     * Thuban/Model/table.py (DBFTable.Precision)
6885     (MemoryTable.Precision): Removed.
6886     (MemoryTable.Width): Use a fixed precision of 12 for doubles.
6887     (table_to_dbf): Use a fixed precision of 12 for floats unless the
6888     column object specifies something else.
6889    
6890     * test/test_dbf_table.py (TestTableToDBF.test_table_to_dbf): New.
6891     test for table_to_dbf
6892    
6893     2003-05-26 Bernhard Herzog <[email protected]>
6894    
6895     * test/test_transientdb.py
6896     (TestTransientTable.run_iceland_political_tests): Fix a comment.
6897    
6898     2003-05-26 Bernhard Herzog <[email protected]>
6899    
6900 bh 1038 * Thuban/UI/mainwindow.py (MainWindow.TableOpen): Real
6901     implementation. Mark parts of the file format strings for
6902     localization.
6903    
6904     * Thuban/Model/session.py (Session.OpenTableFile): New. Open a dbf
6905     file and add the table to the tables managed by the session
6906    
6907 bh 1040 * test/test_session.py (TestSessionSimple.test_open_table_file):
6908     New. test case for OpenTableFile
6909    
6910 jan 1033 2003-05-26 Jan-Oliver Wagner <[email protected]>
6911    
6912 jan 1035 * Thuban/UI/controls.py, Thuban/UI/identifyview.py, Thuban/UI/join.py,
6913     Thuban/UI/labeldialog.py, Thuban/UI/mainwindow.py,
6914     Thuban/UI/proj4dialog.py, Thuban/UI/tableview.py, Thuban/UI/view.py:
6915     Replace the true/false of wxWindows by True/False of Python 2.2.1.
6916    
6917     2003-05-26 Jan-Oliver Wagner <[email protected]>
6918    
6919 bh 1038 * Thuban/UI/tableview.py (LayerTableFrame.__init__): If there is
6920     already a selection present, update the grid accordingly.
6921 jan 1033
6922     * Thuban/UI/mainwindow.py (MainWindow.TableShow): Make the dialog
6923     resizeable and increase its initial size.
6924    
6925 frank 1030 2003-05-26 Frank Koormann <[email protected]>
6926    
6927     Table export functionality
6928    
6929     * Thuban/Model/table.py (DBFTable.Width, MemoryTable.Width):
6930     Return width (in characters) for a column.
6931     (DBFTable.Precision, MemoryTable.Precision): Return decimal precision.
6932     (table_to_dbf): Write table to dbf file.
6933     (table_to_csv): Write table to csv file.
6934    
6935     * Thuban/Model/transientdb.py (TransientTableBase.Width,
6936     TransientTableBase.Precision): Return column width and precision.
6937    
6938     * Thuban/UI/tableview.py (QueryTableFrame.OnSaveAs): Call table_to_dbf
6939     or table_to_csv depending on file selection.
6940    
6941     * test/test_dbf_table.py:
6942     Test table_to_dbf (extension of former part of test).
6943    
6944     * test/test_csv_table.py:
6945     Test table_to_csv.
6946    
6947 jan 1021 2003-05-23 Jan-Oliver Wagner <[email protected]>
6948    
6949 jan 1024 * Thuban/UI/join.py (JoinDialog.OnJoin): Use _() for strings.
6950     Use QueryTableFrame instead of TableFrame.
6951 jan 1021
6952 jan 1024 * Thuban/UI/mainwindow.py (MainWindow.LayerShowTable): Prefix the
6953     table window with 'Layer Table:' instead of 'Table:'.
6954    
6955     2003-05-23 Jan-Oliver Wagner <[email protected]>
6956    
6957     Give all tables a title via mix-in TitledObject.LayerShowTable
6958    
6959 jan 1021 * Thuban/Model/base.py (TitledObject.SetTitle): Call method 'issue'
6960     only if it exists.
6961    
6962     * Thuban/Model/table.py (DBFTable, MemoryTable): mix-in TitledObject
6963     and call its init-method with a default title. Remove Title() method.
6964    
6965     * Thuban/Model/transientdb.py (TransientTable, TransientJoinedTable,
6966     AutoTransientTable): mix-in TitledObject and call its init-method with
6967     a default title. Remove Title() method.
6968    
6969 bh 1017 2003-05-23 Bernhard Herzog <[email protected]>
6970    
6971     * Thuban/Model/session.py (Session.AddShapeStore): Define
6972     AddShapeStore analogously to AddTable.
6973    
6974     * test/test_session.py (TestSessionSimple.test_add_shapestore):
6975     New. Test for AddShapeStore
6976    
6977 jan 1015 2003-05-23 Jan-Oliver Wagner <[email protected]>
6978    
6979     Introducing QueryTableFrame and a very coarse ShowTable implementation.
6980    
6981     * Thuban/UI/tableview.py (LayerTableFrame, QueryTableFrame): Split the
6982     class LayerTableFrame into two classes, LayerTableFrame and QueryTableFrame.
6983     The latter implements the selection GUI without dependency on a layer.
6984     LayerTableFrame now is derived from QueryTableFrame and connects
6985     to a layer.
6986    
6987     * Thuban/UI/mainwindow.py (MainWindow.TableShow): A very coarse
6988     implementation that still needs work.
6989    
6990     * Thuban/Model/layer.py (Layer.TreeInfo): Added filename.
6991    
6992 frank 1011 2003-05-22 Frank Koormann <[email protected]>
6993    
6994     * Thuban/Model/transientdb.py (TransientJoinedTable.__init__):
6995     Added "outer_join = False" as optional parameter.
6996     (TransientJoinedTable.create): If outer join is true, perform a
6997     "LEFT OUTER JOIN" instead of "JOIN", which preserves all records of
6998     the left table. Records not matching are filled with 0 / None.
6999    
7000     * Thuban/UI/join.py (JoinDialog.__init__): Checkbox for outer join.
7001     (JoinDialog.OnJoin): Consider outer join check box.
7002    
7003 bh 1006 2003-05-22 Bernhard Herzog <[email protected]>
7004    
7005 bh 1008 * Thuban/UI/join.py (JoinDialog.OnJoin): Use exc_info in a
7006     somewhat safer way. Storing the traceback in a local variable can
7007     lead to memory leaks
7008    
7009     2003-05-22 Bernhard Herzog <[email protected]>
7010    
7011 bh 1006 * Thuban/UI/join.py (JoinDialog.OnJoin): Make sure to really call
7012     the wxMessageDialog's Destroy() method.
7013    
7014 frank 1004 2003-05-22 Frank Koormann <[email protected]>
7015    
7016     * Thuban/UI/join.py (JoinDialog.__init__): Make use of
7017     TransientTable.Title()
7018    
7019     2003-05-22 Frank Koormann <[email protected]>
7020    
7021     Join Dialog, initial version.
7022    
7023     * Thuban/UI/mainwindow.py (MainWindow.TableJoin): Removed print.
7024    
7025     * Thuban/UI/join.py (JoinDialog): Functional implementation of
7026     former framework. Renamed Table1/Table2 to LeftTable/RightTable
7027     in all occurences.
7028    
7029     * Thuban/Model/transientdb.py (TransientJoinedTable.__doc__):
7030     Typo fixed.
7031    
7032 bh 995 2003-05-22 Bernhard Herzog <[email protected]>
7033    
7034 bh 999 Give the tables titles so that the GUI can display more meaningful
7035     names. For now the titles are fixed but depend on e.g. filenames
7036     or the titles of the joined tables.
7037    
7038     * Thuban/Model/transientdb.py (TransientTable.Title)
7039     (TransientJoinedTable.Title, AutoTransientTable.Title): New.
7040    
7041     * Thuban/Model/table.py (DBFTable.Title, MemoryTable.Title): New.
7042    
7043     * test/test_transientdb.py
7044     (TestTransientTable.test_auto_transient_table_title): New. Test
7045     for the Title method
7046     (TestTransientTable.test_transient_joined_table)
7047     (TestTransientTable.test_transient_table): Add test for the Title
7048     methods
7049    
7050     * test/test_memory_table.py (TestMemoryTable.test_title): New.
7051     Test for the Title method
7052    
7053     * test/test_dbf_table.py (TestDBFTable.test_title): New. Test for
7054     the Title method
7055    
7056     2003-05-22 Bernhard Herzog <[email protected]>
7057    
7058 bh 997 * test/test_layer.py (TestLayer.setUp, TestLayer.tearDown):
7059     Provide a better way to destroy the layers
7060     (TestLayer.test_base_layer, TestLayer.test_arc_layer)
7061     (TestLayer.test_point_layer, TestLayer.test_empty_layer)
7062     (TestLayer.test_polygon_layer, TestLayer.test_get_field_type): Use
7063     the new way to destroy the layers.
7064     (TestLayer.test_derived_store): New. Test for using a layer with a
7065     DerivedShapeStore
7066    
7067     * Thuban/Model/layer.py (Layer.SetShapeStore): Only set the
7068     filename if the shape store actually has one.
7069    
7070     2003-05-22 Bernhard Herzog <[email protected]>
7071    
7072 bh 995 * Thuban/Model/table.py (DBFTable.FileName): New. Accessor method
7073     for the filename
7074    
7075     * test/test_dbf_table.py (TestDBFTable.test_filename): New. Test
7076     for the FileName method
7077     (TestDBFTableWriting.test_write): Fix spelling of filename
7078    
7079 tkoester 993 2003-05-22 Thomas Koester <[email protected]>
7080    
7081     * Thuban/Model/range.py, test/test_range.py: Brought over new Range
7082     from SciParam that now really is immutable.
7083    
7084 frank 992 2003-05-22 Frank Koormann <[email protected]>
7085    
7086     Layer Top/Bottom placement added to legend.
7087    
7088     * Thuban/UI/legend.py
7089     (LegendPanel._OnMoveTop(), LayerPanel._OnMoveBottom): New, methods
7090     bound to tool events.
7091     (LegendTree.MoveCurrentItemTop(), LegendTree.MoveCurrentItemBottom):
7092     New, methods binding the event methods with the map methods.
7093    
7094     * Thuban/Model/map.py (Map.TopLayer(), Map.BottomLayer()): New, place
7095     layer at top/bottom of layer stack.
7096    
7097     * Resources/Bitmaps/top_layer.xpm: New button icon.
7098    
7099     * Resources/Bitmaps/bottom_layer.xpm: New button icon.
7100    
7101 bh 988 2003-05-22 Bernhard Herzog <[email protected]>
7102    
7103     * Thuban/Model/session.py (Session.RemoveTable): New method to
7104     remove tables
7105    
7106     * test/test_session.py (TestSessionSimple.test_remove_table): New.
7107     Test for RemoveTable
7108    
7109 tkoester 986 2003-05-22 Thomas Koester <[email protected]>
7110    
7111     * Thuban/Model/classgen.py: Added short module doc string and CVS id.
7112     (ClassGenerator.GenUniformDistribution): Use new Range __init__, too.
7113    
7114 bh 983 2003-05-22 Bernhard Herzog <[email protected]>
7115    
7116 bh 985 Implement a way to discover dependencies between tables and
7117     shapestores.
7118    
7119     * Thuban/Model/transientdb.py (TransientTableBase.Dependencies)
7120     (TransientJoinedTable.Dependencies)
7121     (AutoTransientTable.SimpleQuery): New. Implement the dependencies
7122     interface
7123     (TransientJoinedTable.__init__): Keep tack of the original table
7124     objects in addition to the corresponding transient tables.
7125    
7126     * Thuban/Model/table.py (DBFTable.Dependencies)
7127     (MemoryTable.Dependencies): New. Implement the dependencies
7128     interface
7129    
7130     * Thuban/Model/data.py (ShapeTable): New. Helper class for
7131     ShapefileStore
7132     (ShapefileStore.__init__): Use ShapeTable instead of
7133     AutoTransientTable
7134     (ShapefileStore.Table, ShapefileStore.Shapefile): Add doc-strings
7135     (ShapefileStore.FileName, ShapefileStore.FileType): New. Accessor
7136     methods for filename and type
7137     (ShapefileStore.Dependencies): New. Implement the dependencies
7138     interface
7139     (DerivedShapeStore): New class to replace SimpleStore. The main
7140     difference to SimpleStore is that it depends not on a shapefile
7141     but another shapestore which expresses the dependencies a bit
7142     better
7143     (SimpleStore.__init__): Add deprecation warning.
7144    
7145     * test/test_dbf_table.py (TestDBFTable.test_dependencies): New.
7146     Test for the Dependencies method.
7147    
7148     * test/test_memory_table.py (TestMemoryTable.test_dependencies):
7149     New. Test for the Dependencies method.
7150    
7151     * test/test_transientdb.py
7152     (TestTransientTable.test_auto_transient_table_dependencies): New.
7153     Test for the Dependencies method.
7154     (TestTransientTable.test_transient_joined_table): Add test for the
7155     Dependencies method.
7156    
7157     * test/test_session.py (TestSessionSimple.setUp)
7158     (TestSessionSimple.tearDown): New. Implement a better way to
7159     destroy the sessions.
7160     (TestSessionSimple.test_initial_state)
7161     (TestSessionSimple.test_add_table): Bind session to self.session
7162     so that it's destroyed by tearDown
7163     (TestSessionSimple.test_open_shapefile): New. Test for
7164     OpenShapefile and the object it returns
7165    
7166     2003-05-22 Bernhard Herzog <[email protected]>
7167    
7168 bh 983 * Thuban/Model/session.py (Session.AddTable): New method to
7169     register tables with the session.
7170     (Session.Tables): Return the tables registered with AddTable too.
7171    
7172     * test/test_session.py (TestSessionSimple.test_add_table): New.
7173     Test case for the AddTable method
7174    
7175 frank 981 2003-05-22 Frank Koormann <[email protected]>
7176    
7177     UI polishing updates: Place main buttons (OK, Cancel, etc) in the
7178     lower right corner, center labels for selections, initialize controls
7179     in reasonable order for keyboard navigation.
7180    
7181     * Thuban/UI/projdialog.py (ProjFrame.__init__, ProjFrame.__doLayout)
7182     (ProjFrame.__DoOnProjAvail): Determine position of current projection
7183     using the wxListBox.FindString() method. Still a problem (#1886)
7184    
7185     * Thuban/UI/classifier.py
7186     (Classifier.__init__, SelectPropertiesDialog.__init__)
7187    
7188     * Thuban/UI/classgen.py (ClassGenDialog.__init__,
7189     (ClassGenDialog.__DoOnGenTypeSelect): Moved initialization of the
7190     different classification types from here to __init__.
7191     (GenUniquePanel.__init__): Set the column width of the first field
7192     in the Field ListCtrl to the full width.
7193    
7194     * Thuban/UI/tableview.py (LayerTableFrame.__init__): Rename 'Save As'
7195     Button to 'Export'. Center Buttons in Selection Box, set Focus to
7196     Grid.
7197     (LayerTableFrame.OnKeyDown()): New, bound to the grid with EVT_KEY_DOWN,
7198     changes focus to the Selection when pressing "Alt-S".
7199    
7200     * Thuban/UI/legend.py (LegendTree.__SetVisibilityStyle): Only gray out
7201     the text if not visible. The italic font sometimes exceeds the
7202     rendering area.
7203    
7204 jonathan 972 2003-05-21 Jonathan Coles <[email protected]>
7205 jonathan 971
7206 jonathan 975 * Thuban/UI/dock.py (DockFrame): Rename references to _OnClose
7207     to OnClose so that Thuban closes correctly.
7208    
7209     * Thuban/UI/mainwindow.py (MainWindow.OnClose): Call
7210     DockFrame.OnClose, not DockFrame._OnClose.
7211    
7212     2003-05-21 Jonathan Coles <[email protected]>
7213    
7214 jonathan 971 * Thuban/Model/classgen.py (ClassGenerator.GenQuantiles): Remove
7215     references to 'inf' and use new Range __init__ to pass floats
7216     directly rather than converting them to strings first.
7217     Fixes RTBug #1876.
7218    
7219     * Thuban/Model/classification.py (ClassGroupRange.SetRange):
7220     Use new Range ___init__ to pass floats.
7221    
7222     * Thuban/Model/layer.py (RasterLayer.__init__): Test if the
7223     filename is a valid image file. Throw IOError otherwise.
7224    
7225     * Thuban/Model/range.py: Brought over new Range from SciParam that
7226     is immutable and has an __init__ which can accept floats.
7227    
7228     * Thuban/UI/mainwindow.py (MainWindow.AddLayer): Move OpenShapefile
7229     into try block. AddLayer doesn't throw any exceptions anymore.
7230     (MainWindow.AddRasterLayer): Move constructor of RasterLayer into
7231     try block.
7232    
7233     * Thuban/UI/projdialog.py (GeoPanel.__init__): Put Degrees as
7234     the first item in choices. Fixes RTBug #1882.
7235    
7236     * Thuban/UI/renderer.py (MapRenderer.render_map): Check if scale
7237     has gone to 0 which is a serious problem. abort.
7238     (MapRenderer.draw_raster_layer): Catch IOError seperately and
7239     print the error from GDAL.
7240    
7241     * Thuban/UI/tableview.py (TableGrid.__init__): Call
7242     ToggleEventListeners to turn on listening.
7243     (TableGrid.ToggleEventListeners): New. Turns event listening on
7244     and off so as to prevent excessive messages.
7245     (LayerTableFrame.OnQuery): Use TableGrid.ToggleEventListeners
7246     to suppress excessive messages when selecting many rows.
7247     Fixes RTBug #1880.
7248    
7249     * Thuban/UI/view.py: Added checks against if scale == 0. This
7250     is a serious problem that can occur when an image without
7251     geo data is loading and causes the map projection bounds to
7252     go to infinity. Right now, the solution is to simply try
7253     to recover.
7254    
7255     * extensions/thuban/cpl_mfile.cpp (MFILEClose): Make sure
7256     to set the MFILEReceiver attributes even if the data is NULL.
7257    
7258     * extensions/thuban/gdalwarp.cpp: Improved the error handling
7259     and passed GDAL messages back up to the Python layer. Also
7260     tried to fix some memory leaks that were present in the original
7261     utility but didn't matter because the program aborted.
7262    
7263     * test/test_range.py: Copied over tests from SciParam. Removed
7264     tests against importing. Fixes RTBug #1867.
7265    
7266 bh 958 2003-05-21 Bernhard Herzog <[email protected]>
7267    
7268     * test/test_load.py: Remove unused imports and restructure the
7269     test code
7270     (LoadSessionTest): Split into one class for each test and turn
7271     LoadSessionTest itself into the base class for all such session
7272     tests.
7273     (ClassificationTest): New base class for load tests that test
7274     classifications
7275     (TestSingleLayer, TestLayerVisibility, TestClassification)
7276     (TestLabels, TestLayerProjection, TestRasterLayer): New classes
7277     for the individual tests
7278    
7279     * test/support.py (FileLoadTestCase.filename): New base class for
7280     file loading tests
7281    
7282 jan 955 2003-05-21 Jan-Oliver Wagner <[email protected]>
7283    
7284     * Resources/Projections/defaults.proj: Renamed 'Universal Transverse
7285     Mercator' to 'UTM Zone 32' as a more convenient example.
7286     Added 'Gauss Krueger Zone 6'.
7287    
7288     * Data/iceland_sample_raster.thuban: political polygon now
7289     filled transparent to have the raster image visible at once.
7290    
7291 frank 952 2003-05-21 Frank Koormann <[email protected]>
7292    
7293     * Thuban/UI/mainwindow.py (MainWindow): Renamed _OnClose() back to
7294     OnClose() to keep in sync with extensions. Internally Thuban
7295     still uses "underscored" names.
7296    
7297 jonathan 949 2003-05-20 Jonathan Coles <[email protected]>
7298    
7299     This puts back Raster layer support. These layers support projections
7300     through the GDAL library. Currently, the CVS version is being used.
7301     There are no Debian packages available although this may change soon.
7302     A GDAL driver was extended to support writing to memory rather to
7303     files.
7304    
7305     There is still some work that needs to be done, such as some error
7306     handling when loading invalid images or when there is a problem
7307     projecting the image. This putback simply checks in the majority
7308     of the work.
7309    
7310     * setup.py: Add gdalwarp library extension.
7311    
7312     * Thuban/Model/layer.py (BaseLayer.HasClassification): New.
7313     Defaults to False, but can be overridden by subclasses if they
7314     support classification.
7315     (RasterLayer): New. Defines a new layer that represents an
7316     image.
7317    
7318     * Thuban/Model/load.py (SessionLoader.__init__): Add rasterlayer
7319     tag handler.
7320     (SessionLoader.start_layer): Encode the filename.
7321     (SessionLoader.start_rasterlayer, SessionLoader.end_rasterlayer):
7322     New. Supports reading a rasterlayer tag.
7323    
7324     * Thuban/Model/map.py (Map.BoundingBox): Fix typo in comment.
7325    
7326     * Thuban/Model/save.py (XMLWriter.encode): Don't assume that we
7327     get a string in Latin1. If we get such as string convert it to
7328     unicode first, otherwise leave if alone before encoding.
7329     (SessionSaver.write_layer): Add support for writing both Layers
7330     and RasterLayers.
7331    
7332     * Thuban/Model/transientdb.py (AutoTransientTable.SimpleQuery):
7333     The right argument may not be a string, it could also be a Column.
7334    
7335     * Thuban/UI/application.py (ThubanApplication.CreateMainWindow):
7336     Make initial window size 600x400. Fixes RTBug #1872.
7337    
7338     * Thuban/UI/classifier.py (Classifier.__init__): Rearrange how
7339     the dialog is constructed so that we can support layers that
7340     do not have classifications.
7341     (Classifier._OnTry): Only build a classification if the layer
7342     supports one.
7343    
7344     * Thuban/UI/legend.py: Change all checks that a layer is an
7345     instance of Layer into checks against BaseLayer.
7346     (LegendTree.__FillTreeLayer): Only add children to a branch if
7347     the layer supports classification.
7348    
7349     * Thuban/UI/mainwindow.py (MainWindow.NewSession,
7350     MainWindow.OpenSession): Don't proceed with an action if the
7351     user chooses Cancel when they are asked to save changes.
7352     (MainWindow.AddRasterLayer): New. Open a dialog to allow the
7353     user to select an image file. Create a new RasterLayer and add
7354     it to the map.
7355    
7356     * Thuban/UI/renderer.py (MapRenderer.render_map): Add support
7357     for rendering RasterLayer layers.
7358     (MapRenderer.draw_raster_layer): Actually method that calls
7359     the GDALWarp python wrapper and constructs an image from the
7360     data returned.
7361    
7362     * Thuban/UI/tableview.py (LayerTableFrame.__init__): Change the
7363     Choices symbols to match those used in the table query method.
7364     Replace deprecated method calls on table with new method names.
7365    
7366     * Thuban/UI/view.py (MapCanvas.set_view_transform): Try to limit
7367     how small the scale can get. This still needs more testing.
7368    
7369     * extensions/thuban/bmpdataset.cpp: New, but copied from GDAL.
7370     Provides a driver to output in .bmp format.
7371    
7372     * extensions/thuban/cpl_mfile.cpp, extensions/thuban/cpl_mfile.h:
7373     New. Provides IO routines which write to memory, rather than a file.
7374    
7375     * extensions/thuban/gdalwarp.cpp: New, but basically a direct copy
7376     of the gdalwarp utility provided in GDAL. Added function calls
7377     that can be accessed from python.
7378    
7379     * Data/iceland_sample_raster.thuban: New. Sample file that uses
7380     a raster layer.
7381    
7382     * Data/iceland/island.tfw, Data/iceland/island.tif: New. Raster
7383     layer image data.
7384    
7385     * Doc/thuban.dtd: Added rasterlayer attribute definition.
7386    
7387     * test/test_layer.py, test/test_load.py, test/test_save.py: Added
7388     tests associated with the raster layer code.
7389    
7390     * test/test_transientdb.py
7391     (TestTransientTable.test_auto_transient_table_query): Added a test
7392     for using a Column object as the "right" parameter to a query.
7393    
7394 frank 924 2003-05-19 Frank Koormann <[email protected]>
7395    
7396 frank 927 * Thuban/version.py (get_changelog_date):
7397     Catch exceptions if ChangeLog does not exist.
7398    
7399     * Thuban/UI/view.py (MapCanvas.Export): Bugfix
7400    
7401     2003-05-19 Frank Koormann <[email protected]>
7402    
7403 frank 924 Extended version information for Thuban
7404    
7405     * Thuban/version.py: New, version information for Thuban: Last
7406     modification date and last ChangeLog entry date.
7407    
7408     * Thuban/UI/mainwindow.py (MainWindow.About()): Extended version
7409     information: Display Thuban, wxPython and Python version.
7410    
7411 bh 919 2003-05-16 Bernhard Herzog <[email protected]>
7412    
7413 bh 921 * Thuban/Model/save.py: Remove some unused imports including the
7414     __future__ import for nested_scopes as Thuban relies on Python 2.2
7415     now.
7416     (XMLWriter.encode): Remove the special case for a None argument.
7417     In the saver encode is always called with a string argument.
7418    
7419     2003-05-16 Bernhard Herzog <[email protected]>
7420    
7421 bh 919 * Thuban/UI/__init__.py: Remove the work-around for the locale bug
7422     in wxPython (at least when usinvg wxGTK) prior to 2.4. The symptom
7423     of the bug was that e.g. float("1.2") would fail. Thuban now
7424     requires 2.4.x.
7425    
7426 frank 917 2003-05-16 Frank Koormann <[email protected]>
7427    
7428     Printing enhancement and WMF export (under Win32)
7429    
7430     * Thuban/UI/renderer.py (ExportRenderer): New, derived from
7431     ScreenRenderer. Renders Map, Legend and Scalebar for export.
7432     (PrinterRenderer): New, derived from ExportRenderer. Replaces the old
7433     PrintRender.
7434    
7435     * Thuban/UI/view.py (MapPrintout.__init__): Enhanced parameter set
7436     to fullfil information needed for PrinterRenderer.
7437     (MapCanvas.Export): New. Export Map (currently only to WMF on Win32).
7438     (MapCanvas.Print): Adapted to new MapPrintout.
7439     (OutputTransform): General calculations to transform from canvas
7440     coordinates to export/printing devices.
7441    
7442     * Thuban/UI/mainwindow.py (MainWindow.ExportMap()): New. Added also
7443     new method_command to call ExportMap, with platform dependency (only
7444     __WXMSW__)
7445    
7446     * Thuban/UI/scalebar.py (ScaleBar.DrawScaleBar): Position and Size
7447     of scalebar drawing area as new parameters.
7448    
7449     * Thuban/Model/scalebar.py (roundInterval): round long instead of int
7450    
7451     * Thuban/UI/legend.py (ScalebarBitmap.__SetScale):
7452     Update to extended scalebar.DrawScalebar header.
7453    
7454     * test/test_export.py: New, test Thuban.UI.view.OutputTransform()
7455    
7456     * test/test_scalebar.py: Made test executable as standalone.
7457    
7458 bh 908 2003-05-16 Bernhard Herzog <[email protected]>
7459    
7460     * Thuban/Model/table.py (Table): Remove this compatibility alias
7461     for DBFTable.
7462    
7463     * test/test_table.py: Import DBFTable as Table because that alias
7464     doesn't exist anymore.
7465    
7466     * Thuban/UI/classgen.py: Remove some unused imports
7467    
7468 jonathan 906 2003-05-14 Jonathan Coles <[email protected]>
7469    
7470     * Thuban/Model/classgen.py (ClassGenerator.GenSingletonsFromList):
7471     Fix docstring.
7472     (ClassGenerator.GenUniformDistribution): Fix spelling of method name.
7473     (ClassGenerator.GenQuantiles): Use the left/right brackets and min/max
7474     values of the supplied range to determine the beginning and end
7475     bounds of the generated classes.
7476    
7477     * Thuban/Model/range.py (Range.number_re): Now accepts floats that
7478     do not have a leading 0 (.5 is now accepted as well as 0.5).
7479    
7480     * Thuban/UI/classgen.py (ClassGenDialog.OnOK): Fix name of method
7481     call to ClassGenerator.GenUniformDistribution.
7482    
7483     * Thuban/UI/projdialog.py (ProjFrame.__do_layout): Fix Windows
7484     layout bug with the 'Projection' label.
7485    
7486     * test/support.py (FloatTestCase): New. Needed for the Range tests.
7487    
7488     * test/test_range.py: New. Imported from SciParam.
7489    
7490 jonathan 897 2003-05-12 Jonathan Coles <[email protected]>
7491    
7492 jonathan 899 * Thuban/UI/classgen.py (GenQuantilesPanel.GetList): Replace call
7493     to table.UniqueValues() with calls that retrieve all the values
7494     from the table. This will need to be replaced by a method on table
7495     which can simply return the list (perhaps more efficiently).
7496    
7497     2003-05-12 Jonathan Coles <[email protected]>
7498    
7499 jonathan 897 The return value of ClassGenerator.CalculateQuantiles has changed.
7500     Refer to the documentation for details.
7501    
7502     * test/test_classgen.py: Modified Quantile tests to use the
7503     new return values.
7504    
7505     * Thuban/Model/classgen.py
7506     (ClassGenerator.GenQuantiles): Add comments describing the parameters,
7507     use new return values from CalculateQuantiles to produce the correct
7508     range bounds in the Classification.
7509     (ClassGenerator.CalculateQuantiles): Add more comments describing
7510     the return values and parameters. Make minor adjustments to improve
7511     the legibility of the code. Fix problem with adjusted not being set
7512     in most cases.
7513    
7514 frank 893 2003-05-12 Frank Koormann <[email protected]>
7515    
7516     * Thuban/Model/save.py (XMLWriter.encode()): Explicite call to unicode
7517     and latin1. Fixes #1851 finally.
7518    
7519 jonathan 889 2003-05-09 Jonathan Coles <[email protected]>
7520    
7521 jonathan 897 * test/test_classgen.py: New. Tests the Quantile algorithm.
7522    
7523     * Thuban/Model/classgen.py (ClassGenerator.CalculateQuantiles):
7524     Clean up debugging statement, add comments, fix a small bug in the
7525     returned adjusted percentiles.
7526    
7527     2003-05-09 Jonathan Coles <[email protected]>
7528    
7529 jonathan 889 Introduces Range class from SciParam into the ClassGroupRange class,
7530     and such ranges can now be saved and loaded from disk.
7531    
7532     Quantiles are now available in the Classification Generator.
7533    
7534     Initial support for building Queries on a table. Doesn't do anything
7535     but run some tests.
7536    
7537     * Thuban/Model/classification.py: Explicit imports.
7538     (ClassGroupRange): Use the Range class to store the underlying
7539     range information. The interface remains the same, except for
7540     GetRange(), and you can also supply a Range object as the min
7541     parameter to SetRange or __init__.
7542    
7543     * Thuban/Model/load.py (XMLReader.encode): New. Encodes the given
7544     string appropriately for use in Thuban. Fixes RTbug #1851.
7545     (SessionLoader.end_projection): Handle the context of the
7546     projection tag a bit better by looking at what objects are not
7547     None. There was an assumption that a projection tag for a map
7548     could occur before any layers.
7549     (SessionLoader.start_clrange): Provide backward compatibility for
7550     reading min/max values as well as the new range parameter.
7551    
7552     * Thuban/Model/map.py: Explicit imports.
7553    
7554     * Thuban/Model/resource.py: Import _.
7555     (ProjFileSaver.write): write header using projfile.dtd.
7556    
7557     * Thuban/Model/save.py: Explicit imports.
7558     (XMLWriter.encode): New. Encode the given string from a format
7559     used by Thuban into UTF-8. Fixes RTbug #1851.
7560    
7561     * Thuban/UI/classgen.py: Explicit imports.
7562     (ClassGenDialog.__init__): Clean up the code and add support
7563     for Quantiles.
7564     (ClassGenDialog.OnOK): Add support for Quantiles.
7565     (GenQuantilesPanel): New. Input panel for Quantiles.
7566     (ClassGenerator, CustomRamp, MonochromaticRamp, GreyRamp, RedRamp,
7567     GreenRamp, BlueRamp, HotToColdRamp): Move to Thuban/Model/classgen.py
7568    
7569     * Thuban/Model/classgen.py: New. Contains all the classes named above.
7570    
7571     * Thuban/UI/classifier.py: Explicit imports.
7572     (ClassTable.GetValueAsCust, ClassTable.__ParseInput,
7573     ClassTable.SetValueAsCustom): Reworked to use new Range class.
7574    
7575     * Thuban/UI/legend.py: Explicit imports.
7576    
7577     * Thuban/UI/mainwindow.py: Add support for the Join Dialog. Added
7578     a Table menu and associated method calls.
7579     (MainWindow.choose_color): Removed. No longer needed.
7580    
7581     * Thuban/UI/projdialog.py (ProjFrame.__VerifyButtons): Save button
7582     should be disabled if no projection is selected in the available
7583     list.
7584    
7585     * Thuban/UI/renderer.py: Explicit imports.
7586    
7587     * Thuban/UI/tableview.py (TableGrid.OnRangeSelect): Fix some issues
7588     with correctly selecting the rows and issuing the right events.
7589     Be sure to call Skip() to allow the grid to do some of its own
7590     handling which allows the rows to actually be selected.
7591     (LayerTableGrid.select_shapes): Rename from select_shape. Supports
7592     selecting multiple shapes.
7593     (LayerTableFrame): Support for building Queries.
7594     (LayerTableFrame.select_shapes): Allow multiple shapes to be selected.
7595    
7596     * Thuban/UI/tree.py: Explicit imports.
7597    
7598     * Thuban/UI/view.py (MapCanvas): Delegate "SelectedShapes" so the
7599     table view can call it.
7600    
7601     * test/test_classification.py: Explicit imports.
7602     (TestClassification.test_ClassGroupRange): Fix test for new
7603     Range class.
7604    
7605     * Doc/thuban.dtd: Add range parameter for clrange.
7606    
7607     * Thuban/Model/range.py: Taken from SciParam. Used as the underlying
7608     object in ClassGroupRange, and also uesd for inputting ranges in
7609     the classifer table and elsewhere.
7610    
7611     * Thuban/UI/join.py: New. Initial Join dialog. No real functionality
7612     yet.
7613    
7614 frank 872 2003-05-09 Frank Koormann <[email protected]>
7615    
7616     * Thuban/UI/scalebar.py (DrawScaleBar): Draw only if interval > 0.0.
7617    
7618 frank 860 2003-05-08 Frank Koormann <[email protected]>
7619    
7620 frank 870 Coding style updates
7621    
7622     * test/test_scalebar.py: Replaced tab indentation by spaces.
7623    
7624     * Thuban/UI/scalebar.py: Explicit imports.
7625    
7626     2003-05-08 Frank Koormann <[email protected]>
7627    
7628 frank 867 * Thuban/UI/scalebar.py
7629     (ScaleBar.DrawScalebar): Format string bug fixed.
7630    
7631     2003-05-08 Frank Koormann <[email protected]>
7632    
7633 frank 865 Reorganization of scalebar component (no wx in Thuban/Model)
7634    
7635     * Thuban/Model/scalebar.py: Rendering moved to Thuban/UI/scalebar.py
7636     (deriveInterval):
7637     Calculate scalebar interval and unit which fits in width for scale.
7638     (roundInterval): Round float.
7639    
7640     * Thuban/UI/scalebar.py (ScaleBar): Scalebar rendering
7641    
7642     * test/test_scalebar.py: Test for Thuban/Model/scalebar.py methods.
7643    
7644     * Thuban/UI/legend.py: Import Thuban.UI.scalebar
7645    
7646     2003-05-08 Frank Koormann <[email protected]>
7647    
7648 frank 860 * Thuban/UI/legend.py (ScalebarBitmap.SetCanvas):
7649     Initialize ScaleBar with canvas.map
7650    
7651     * Thuban/Model/scalebar.py (ScaleBar.roundInterval()): New,
7652     round intervals to display smarter lengths
7653     (ScaleBar.DrawScalebar): Draw Scalebar only if the map contains a
7654     layer. If the maps has no projection applied grey the scalebar.
7655    
7656 frank 857 2003-05-07 Frank Koormann <[email protected]>
7657    
7658     Basic Scalebar features added.
7659    
7660     * Thuban/Model/scalebar.py (ScaleBar): New, scalebar rendering.
7661    
7662     * Thuban/UI/legend.py (LegendPanel): Added scalebar bitmap
7663     (ScaleBarBitmap): New, links the scalebar bitmap with view messages
7664     and the renderer.
7665    
7666     * Thuban/UI/view.py (MapCanvas.set_view_transform): Issue SCALE_CHANGED.
7667    
7668     * Thuban/UI/messages.py: SCALE_CHANGED added.
7669    
7670 bh 850 2003-05-07 Bernhard Herzog <[email protected]>
7671    
7672 bh 852 * Thuban/Model/session.py (Session.__init__): New instance
7673     variable shapestores to hold a list of all open shapestore objects
7674     (Session.ShapeStores): New. Accessor method for the shapestores
7675     list.
7676     (Session._add_shapestore, Session._clean_weak_store_refs): New.
7677     Internal methods to maintain the shapestores list.
7678     (Session.Tables): New. Return all tables open in the session.
7679     (Session.OpenShapefile): Insert the new ShapeStore into the
7680     shapestores list.
7681    
7682     * test/test_session.py (TestSessionSimple.test_initial_state): Add
7683     tests for ShapeStores and Tables
7684     (TestSessionWithContent.test_shape_stores)
7685     (TestSessionWithContent.test_tables): New. Test cases for
7686     ShapeStores and Tables
7687    
7688     2003-05-07 Bernhard Herzog <[email protected]>
7689    
7690 bh 850 * Thuban/Model/transientdb.py (TransientTableBase.ReadRowAsDict):
7691     Add comments about the optimizations used.
7692     (AutoTransientTable.ReadValue, TransientTableBase.ReadValue): New.
7693     Implement the ReadValue table interface method.
7694    
7695     * test/test_transientdb.py
7696     (TestTransientTable.run_iceland_political_tests)
7697     (TestTransientTable.test_transient_joined_table): Add tests for
7698     ReadValue
7699    
7700 frank 848 2003-05-07 Frank Koormann <[email protected]>
7701    
7702     * Resources/Bitmaps/fulllayerextent.xpm,
7703     Resources/Bitmaps/fullselextent.xpm: Replaced the place holders with
7704     new icons.
7705    
7706 bh 840 2003-05-06 Bernhard Herzog <[email protected]>
7707    
7708 bh 846 * Thuban/Model/transientdb.py (AutoTransientTable.SimpleQuery):
7709     New. Simply delegate to the transient table's version.
7710    
7711     * test/test_transientdb.py
7712     (TestTransientTable.test_auto_transient_table_query): New. Test
7713     case for AutoTransientTable's SimpleQuery
7714    
7715     2003-05-06 Bernhard Herzog <[email protected]>
7716    
7717 bh 843 * Thuban/Model/transientdb.py (TransientTableBase.SimpleQuery):
7718     Implement a simple query method for the query dialog
7719     (TransientTableBase.create): Add an INTEGER PRIMARY KEY that holds
7720     the row index or shapeid.
7721     (TransientTable.create): Insert the right value of the row index
7722     (TransientJoinedTable.create): Copy the row index of the left
7723     table to the joined result table
7724    
7725     * test/test_transientdb.py
7726     (TestTransientTable.test_transient_table_read_twice): Fix
7727     doc-string
7728     (TestTransientTable.test_transient_table_query): New. Test for the
7729     SimpleQuery method
7730    
7731     2003-05-06 Bernhard Herzog <[email protected]>
7732    
7733 bh 840 Convert all table users to use the new table interface. This only
7734     covers Thuban itself, not GREAT-ER or other applications built on
7735     Thuban yet, so the compatibility interface stays in place for the
7736     time being but it now issues DeprecationWarnings.
7737    
7738     Finally, the new Table interface has a new method, HasColumn.
7739    
7740     * Thuban/Model/table.py (OldTableInterfaceMixin): All methods
7741     issue deprecation warnings when they're. The warnings refer to the
7742     caller of the method.
7743     (OldTableInterfaceMixin.__deprecation_warning): New. Helper method
7744     for the deprecation warnings
7745    
7746     * test/test_table.py: Ignore the deprecation warnings for the old
7747     table in the tests in this module. The purpose of the tests is to
7748     test the old interface, after all.
7749    
7750     * test/test_transientdb.py
7751     (TestTransientTable.run_iceland_political_tests): Use the
7752     constants for the types. Add a test for HasColumn
7753     (TestTransientTable.test_transient_joined_table): Adapt to new
7754     table interface. Add a test for HasColumn
7755     (TestTransientTable.test_transient_table_read_twice): Adapt to new
7756     table interface
7757    
7758     * Thuban/UI/tableview.py (DataTable.SetTable, DataTable.GetValue):
7759     Adapt to new table interface
7760    
7761     * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Adapt to
7762     new table interface
7763    
7764     * Thuban/UI/controls.py (RecordListCtrl.fill_list)
7765     (RecordTable.SetTable): Adapt to new table interface
7766    
7767     * Thuban/UI/classifier.py (Classifier.__init__)
7768     (Classifier.__init__): Adapt to new table interface
7769    
7770     * Thuban/UI/classgen.py (ClassGenDialog.__init__)
7771     (GenUniformPanel._OnRetrieve, GenUniquePanel._OnRetrieve): Adapt
7772     to new table interface
7773    
7774     * Thuban/Model/transientdb.py (TransientTableBase.HasColumn)
7775     (AutoTransientTable.HasColumn): Implement the new table interface
7776     method
7777     (AutoTransientTable.ReadRowAsDict, AutoTransientTable.ValueRange)
7778     (AutoTransientTable.UniqueValues): Adapt to new table interface
7779    
7780     * Thuban/Model/layer.py (Layer.SetShapeStore, Layer.GetFieldType):
7781     Adapt to new table interface
7782    
7783     * test/test_layer.py (TestLayer.open_shapefile): Helper method to
7784     simplify opening shapefiles a bit easier.
7785     (TestLayer.test_arc_layer, TestLayer.test_polygon_layer)
7786     (TestLayer.test_point_layer): Use the new helper method
7787     (TestLayer.test_get_field_type): New. Test for the GetFieldType
7788     method
7789    
7790     * test/test_dbf_table.py (TestDBFTable.test_has_column): Test for
7791     the new table method
7792    
7793     * test/test_memory_table.py (TestMemoryTable.test_has_column):
7794     Test for the new table method HasColumn
7795    
7796 jonathan 833 2003-05-06 Jonathan Coles <[email protected]>
7797    
7798     Addresses the "Selection Extent" wish of RTbug #1787.
7799    
7800     * Resources/Bitmaps/fulllayerextent.xpm,
7801     Resources/Bitmaps/fullselextent.xpm: Bitmaps for layer and selection
7802     extent. These are just place holders for the real bitmaps.
7803    
7804     * Thuban/Model/layer.py (Shape): Since a Shape is immutable only
7805     calculate the bounding box once (the first time compute_bbox() is
7806     called).
7807     (Layer.ShapesBoundingBox): New. Given a list of shape ids, return
7808     the bounding box for the shapes in lat/long coordinates.
7809    
7810     * Thuban/UI/mainwindow.py: Added new "Full selection extent" menu
7811     option.
7812     (MainWindow.has_selected_shapes): New. Returns true if there are
7813     any selected shapes.
7814     (MainWindow.FullSelectionExtent): New. Calls
7815     MapCanvas.FitSelectedToWindow() when the user selects the menu option.
7816     (_has_selected_shapes): New. Returns true if there are any
7817     selected shapes.
7818    
7819     * Thuban/UI/selection.py (Selection.HasSelectedShapes): New. Returns
7820     true if there are any selected shapes.
7821    
7822     * Thuban/UI/view.py (MapCanvas): Added delegated method
7823     HasSelectedShapes.
7824     (MapCanvas.FitSelectedToWindow): New. Centers and scales any selected
7825     shapes on the canvas using the map projection (if any).
7826    
7827     * test/test_layer.py (TestLayer.test_arc_layer): Add some tests
7828     for Layer.ShapesBoundingBox().
7829    
7830 bh 826 2003-05-06 Bernhard Herzog <[email protected]>
7831    
7832     * Resources/Projections/defaults.proj: Fix spelling of Mercator
7833    
7834 jonathan 823 2003-05-05 Jonathan Coles <[email protected]>
7835    
7836     Addresses the "Full Layer Extent" wish of RTbug #1787.
7837    
7838     * Resources/Projections/defaults.proj: Added UK National Grid.
7839    
7840     * Thuban/UI/mainwindow.py: Added new "Full layer extent" menu option.
7841     (MainWindow.FullLayerExtent): New. Calls MapCanvas.FitLayerToWindow()
7842     when the user selects the menu option.
7843    
7844     * Thuban/UI/view.py (MapCanvas.FitLayerToWindow): New. Centers and
7845     scales the given layer on the canvas using the map projection.
7846    
7847 bh 819 2003-05-05 Bernhard Herzog <[email protected]>
7848    
7849     Convert the table implementations to a new table interface. All
7850     tables use a common mixin class to provide backwards compatibility
7851     until all table users have been updated.
7852    
7853     * Thuban/Model/table.py (OldTableInterfaceMixin): Mixin class to
7854     provide backwards compatibility for table classes implementing the
7855     new interface
7856     (DBFTable, MemoryTable): Implement the new table interface. Use
7857     OldTableInterfaceMixin as base for compatibility
7858     (DBFColumn, MemoryColumn): New. Column description for DBFTable
7859     and MemoryTable resp.
7860    
7861     * test/test_dbf_table.py: New. Test cases for the DBFTable with
7862     the new table interface.
7863    
7864     * test/test_memory_table.py: New. Test cases for the MemoryTable
7865     with the new table interface.
7866    
7867     * test/test_table.py: Document the all tests in this file as only
7868     for backwards compatibility. The equivalent tests for the new
7869     interface are in test_memory_table.py and test_dbf_table.py
7870     (MemoryTableTest.test_read): field_info should be returning tuples
7871     with four items
7872     (MemoryTableTest.test_write): Make doc-string a more precise.
7873    
7874     * Thuban/Model/transientdb.py (TransientTableBase): Convert to new
7875     table interface. Derive from from OldTableInterfaceMixin for
7876     compatibility.
7877     (TransientTableBase.create): New intance variable column_map to
7878     map from names and indices to column objects
7879     (TransientTable.create): Use the new table interface of the input
7880     table
7881     (AutoTransientTable): Convert to new table interface. Derive from
7882     from OldTableInterfaceMixin for compatibility.
7883     (AutoTransientTable.write_record): Removed. It's not implemented
7884     yet and we still have to decide how to handle writing with the new
7885     table and data framework.
7886    
7887     * test/test_transientdb.py
7888     (TestTransientTable.run_iceland_political_tests)
7889     (TestTransientTable.test_transient_joined_table): Use the new
7890     table interface
7891    
7892 jonathan 817 2003-05-05 Jonathan Coles <[email protected]>
7893    
7894     This is namely a collection of UI updates to improve user interactivity.
7895     Tabbing between controls now exists and you can use ESC to close dialog
7896     boxes; ENTER will active the default button.
7897    
7898     * Thuban/UI/classgen.py (ClassGenDialog.__init__): Rearrange the
7899     order that the controls are created so that tabbing works correctly.
7900     (ClassGenDialog.OnOK): Renamed from _OnGenerate() so that the
7901     wxDialog can handle the default button correctly.
7902     (ClassGenDialog.OnCancel): Renamed from _OnCloseBtn() for the
7903     same reasons as for OnOK.
7904     (GenUniformPanel._OnRetrieve): Call wxBeginBusyCursor/wxEndBusyCursor
7905     when we ask the table for the maximum/minimum values of a field
7906     which could take a very long time.
7907    
7908     * Thuban/UI/classifier.py (Classifier.__init__): Rearrange the
7909     order that the controls are created so that tabbing works correctly.
7910     (SelectPropertiesDialog.__init__): Rearrange the order that the
7911     controls are created so that tabbing works correctly.
7912    
7913     * Thuban/UI/dialogs.py: Copied NonModalDialog box and changed it
7914     to derive from a wxDialog but behave like the original implementation
7915     which was derived from a wxFrame. wxDialog provides useful key
7916     handling functionality like ESC calling OnCancel and ENTER calling
7917     OnOK which is lost with wxFrame.
7918    
7919     * Thuban/UI/mainwindow.py: Add "..." to menu items that will open
7920     new dialogs.
7921    
7922     * Thuban/UI/projdialog.py (ProjFrame.__init__): Rearrange the
7923     order that the controls are created so that tabbing works correctly.
7924     (ProjFrame.OnApply): Renamed from _OnTry() to use wxDialog behaviour.
7925     (ProjFrame.OnOK): Renamed from _OnOK() to use wxDialog behaviour.
7926     (ProjFrame.OnCancel): Renamed from _OnClose() to use wxDialog behaviour.
7927     (ProjPanel.__init__): Add "Airy" to the list of ellipsoids so we
7928     can provide the "UK National Grid" as a default projection.
7929     (UTMPanel.__init__): Rearrange the order that the controls are
7930     created so that tabbing works correctly.
7931    
7932 bh 809 2003-05-05 Bernhard Herzog <[email protected]>
7933    
7934 bh 811 * extensions/thuban/wxproj.cpp: Fix some of the comments.
7935     (project_point): If a map projection but no layer projection is
7936     given, convert degrees to radians before applying the map
7937     projection.
7938    
7939 bh 809 * Thuban/UI/tableview.py (TableGrid.disallow_messages)
7940     (TableGrid.allow_messages): New methods to make it possible to
7941     inhibit message sending.
7942     (TableGrid.issue): Only send the message if not inhibited.
7943     (LayerTableGrid.select_shape): Use the new methods to make sure
7944     that no ROW_SELECTED message is sent while we're updating the
7945     selected rows to match the selected shapes.
7946    
7947 jan 807 2003-05-02 Jan-Oliver Wagner <[email protected]>
7948    
7949     Implementation of MemoryTable.
7950    
7951     * Thuban/Model/table.py (MemoryTable): New. Quite simple table
7952     implementation that operates on a list of tuples. All of the data
7953     are kept in the memory.
7954    
7955     * test/test_table.py (MemoryTableTest): New.
7956    
7957     * test/test_transientdb.py (SimpleTable): Removed.
7958     (TestTransientTable.test_transient_joined_table,
7959     (TestTransientTable.test_transient_table_read_twice): Replaced
7960     SimpleTable by MemoryTable.
7961    
7962 jonathan 793 2003-04-30 Jonathan Coles <[email protected]>
7963    
7964 jonathan 803 * Data/iceland_sample.thuban: Now contains correct projections
7965     for each of the layers.
7966    
7967     * Resources/Projections/defaults.proj: Geographic projection
7968     contains unit conversion parameter.
7969    
7970     2003-04-30 Jonathan Coles <[email protected]>
7971    
7972 jonathan 793 The most important part of this putback is the projection changes.
7973     It should now be possible to specify the projection that a layer
7974     is in and then specify a different projection for the map. The
7975     projection dialog has an extra parameter for a geographic projection
7976     which lets the user select if the input is in degrees or radians.
7977    
7978     * Thuban/Model/layer.py (Layer.ShapesInRegion): Fix docstring
7979     to say that the parameter is a tuple of unprojected
7980     points (which is what the callers to this method were assuming).
7981     Also, since the points are unprojected we need to projected them.
7982    
7983     * Thuban/UI/legend.py (LegendTree.MoveCurrentItemUp,
7984     LegendTree.MoveCurrentItemDown): If the layer or any of the layer's
7985     groups are selected, move the layer up/down. Fixes RTbug #1833.
7986    
7987     * Thuban/UI/mainwindow.py: Move menu item map_rename up.
7988    
7989     * Thuban/UI/projdialog.py (ProjFrame._OnSave): Add missing
7990     parameter in call to SetClientData.
7991     (GeoPanel): Add support for selecting the units that the
7992     source data is in (Radians or Degrees).
7993    
7994     * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Optimize
7995     the rendering loop by reducing the number of if's, removing the
7996     unnecessary try/except block, and checking if the old group
7997     is the same as the new one (which happens a lot if there is
7998     no classification, or lots of shapes are in the same group).
7999    
8000     * Thuban/UI/view.py (MapCanvas.OnPaint): Add a try/except block
8001     around the redraw routine to try to catch problems that the user
8002     may create by selecting invalid projections for the data set and
8003     map. Clears the display if there are any problems and prints the
8004     error.
8005     (MapCanvas.do_redraw): Use DC.Clear() instead of drawing a filled
8006     rectangle.
8007    
8008     * extensions/thuban/wxproj.cpp (project_point): First invert the
8009     supplied point (which should be in projected coordinates) using
8010     the layer's projection and then project the point using the
8011     map's projection.
8012     (project_points): Use project_point() to project each point.
8013    
8014 jan 792 2003-04-30 Jan-Oliver Wagner <[email protected]>
8015    
8016     * Thuban/Model/layer.py (Layer.SetShapeStore): Fixed a bug:
8017     don't set the Classification to None if the classfication field
8018     is None (ie only a DEFAULT).
8019    
8020 bh 786 2003-04-30 Bernhard Herzog <[email protected]>
8021    
8022 bh 790 * Thuban/UI/view.py: Fix some typos.
8023    
8024 bh 788 * Thuban/UI/mainwindow.py (MainWindow.identify_view_on_demand): Do
8025     not pop up the dialog if the selection becomes empty (this could
8026     happen if e.g. a new selection is opened while the identify tool
8027     is active and dialog had been closed)
8028    
8029     2003-04-30 Bernhard Herzog <[email protected]>
8030    
8031 bh 786 * Thuban/Model/transientdb.py (TransientTableBase.__init__): New
8032     instance variable read_record_last_result
8033     (TransientTableBase.read_record): Make sure reading the same
8034     record twice works. The implementation uses the new instance
8035     variable read_record_last_result
8036    
8037     * test/test_transientdb.py
8038     (TestTransientTable.test_transient_table_read_twice): New test
8039     case for the above bug-fix.
8040    
8041 jonathan 793 2003-04-29 Jonathan Coles <[email protected]>
8042    
8043     * Thuban/common.py: Removed. No longer needed Str2Num. RTbug #1832.
8044    
8045     * Thuban/UI/classgen.py: Remove all uses of Str2Num.
8046    
8047     * Thuban/UI/classifier.py: Remove all uses of Str2Num.
8048     (ClassTable.SetValueAsCustom): Rename keyword argument in
8049     ClassGroup* constructors to match argument name.
8050    
8051 bh 779 2003-04-29 Bernhard Herzog <[email protected]>
8052    
8053     * Thuban/Model/session.py (Session.Destroy): Explicitly close the
8054     transient DB if it exists to make sure it doesn't leave a journal
8055     file in the temp directory.
8056    
8057     * Thuban/Model/transientdb.py (TransientDatabase.close): Set
8058     self.conn to None after closing the connection to make sure it's
8059     not closed twice
8060    
8061 jonathan 767 2003-04-29 Jonathan Coles <[email protected]>
8062    
8063 jonathan 769 Add a visible parameter in the layer XML tag. The default value is
8064     "true". If anything other than "false" is specified we also assume
8065 jonathan 776 "true". Addresses RTbug #1025.
8066 jonathan 769
8067     * Doc/thuban.dtd: Add visible parameter to a layer.
8068    
8069     * Thuban/Model/layer.py (BaseLayer.__init__): Change default value
8070     of visible from 1 to True.
8071     (Layer.__init__): Change default value of visible from 1 to True.
8072    
8073     * Thuban/Model/load.py (SessionLoader.start_layer): Read visible
8074     parameter.
8075    
8076     * Thuban/Model/save.py (SessionSaver.write_layer): Save visible
8077     parameter.
8078    
8079     * test/test_load.py: Add new test data contents_test_visible.
8080     (LoadSessionTest.setUp): save test data.
8081     (LoadSessionTest.testLayerVisibility): Test if the visible flag
8082     is loaded correctly.
8083    
8084     * test/test_save.py (SaveSessionTest.testSingleLayer): Add test
8085     for saving an invisible layer.
8086    
8087     2003-04-29 Jonathan Coles <[email protected]>
8088    
8089 jonathan 767 * Thuban/UI/mainwindow.py (MainWindow.SetMap): Look up the
8090     legend dialog box and tell it to change its map to the one
8091     supplied to SetMap(). Fixes RTbug #1770.
8092    
8093 bh 764 2003-04-29 Bernhard Herzog <[email protected]>
8094    
8095 bh 766 Next step of table implementation. Introduce a transient database
8096     using SQLite that some of the data is copied to on demand. This
8097     allows us to do joins and other operations that require an index
8098     for good performance with reasonable efficiency. Thuban now needs
8099     SQLite 2.8.0 and pysqlite 0.4.1. Older versions may work but I
8100     haven't tested that.
8101    
8102     * Thuban/Model/transientdb.py: New. Transient database
8103     implementation.
8104    
8105     * test/test_transientdb.py: New. Tests for the transient DB
8106     classes.
8107    
8108     * Thuban/Model/session.py (AutoRemoveFile, AutoRemoveDir): New
8109     classes to help automatically remove temporary files and
8110     directories.
8111     (Session.__init__): New instance variables temp_dir for the
8112     temporary directory and transient_db for the SQLite database
8113     (Session.temp_directory): New. Create a temporary directory if not
8114     yet done and return its name. Use AutoRemoveDir to have it
8115     automatically deleted
8116     (Session.TransientDB): Instantiate the transient database if not
8117     done yet and return it.
8118    
8119     * Thuban/Model/data.py (ShapefileStore.__init__): Use an
8120     AutoTransientTable so that data is copied to the transient DB on
8121     demand.
8122     (SimpleStore): New class that simply combines a table and a
8123     shapefile
8124    
8125     * Thuban/Model/table.py (Table, DBFTable): Rename Table into
8126     DBFTable and update its doc-string to reflect the fact that this
8127     is only the table interface to a DBF file. Table is now an alias
8128     for DBFTable for temporary backwards compatibility.
8129    
8130     * Thuban/UI/application.py (ThubanApplication.OnExit): Make sure
8131     the last reference to the session goes away so that the temporary
8132     files are removed properly.
8133    
8134     * test/test_load.py (LoadSessionTest.tearDown): Remove the
8135     reference to the session to make sure the temporary files are
8136     removed.
8137    
8138     2003-04-29 Bernhard Herzog <[email protected]>
8139    
8140 bh 764 * Thuban/Model/load.py (XMLReader.__init__, XMLReader.read): Turn
8141     the __parser instance variable into a normal local variable in
8142     read. It's only used there and read will never be called more than
8143     once. Plus it introduces a reference cycle that keeps can keep the
8144     session object alive for a long time.
8145    
8146 jonathan 767 2003-04-29 Jonathan Coles <[email protected]>
8147 jonathan 735
8148 jonathan 762 * Thuban/Model/proj.py (Projection): Removed Set*() methods to make
8149     Projection an immutable item. Fixes RTbug #1825.
8150     (Projection.__init__): Initialize instance variables here.
8151     (ProjFile.Replace): New. Replace the given projection object with
8152     the new projection object. This solves the problem of needing the
8153     mutator Projection.SetProjection() in the ProjFrame class and
8154     allows a projection to change parameters without changing its
8155     location in the file.
8156    
8157     * Thuban/UI/mainwindow.py (MainWindow.SaveSessionAs): Dialog should
8158     be of type wxSAVE and should verify overwriting a file.
8159    
8160     * Thuban/UI/projdialog.py (ProjFrame._OnSave): Use the new
8161     ProjFile.Replace() method instead of the mutator
8162     Projection.SetProjection(). Also requires that we reassign the
8163     client data to the new projection.
8164    
8165     * test/test_proj.py (TestProjection.test): Test GetName() and
8166     GetAllParameters()
8167     (TestProjFile.test): Remove tests for Set*() methods. Add tests
8168     for Replace().
8169    
8170     2003-04-25 Jonathan Coles <[email protected]>
8171    
8172 jonathan 756 * Thuban/Model/save.py (SessionSaver.write_projection): Make sure
8173     to save the name of the projection.
8174    
8175     * test/test_save.py (SaveSessionTest.testLayerProjection): New
8176     test to verify layer projections are saved correctly.
8177    
8178     2003-04-25 Jonathan Coles <[email protected]>
8179    
8180 jonathan 753 * Thuban/Model/proj.py (Projection.SetName): Set the name
8181     to "Unknown" if name is None.
8182     (Projection.SetAllParameters): New. Set the projection's
8183     parameter list to the one supplied.
8184     (Projection.SetProjection): New. Set the projection's
8185     properties to those of the supplied Projection.
8186    
8187     * Thuban/UI/mainwindow.py (MainWindow.MapProjection): Set
8188     the dialog title to include the map's title.
8189     (MainWindow.LayerProjection): Set the dialog title to include
8190     the layer's title.
8191    
8192     * Thuban/UI/projdialog.py (ProjFrame.__ShowError): Consolidate
8193     error dialogs into a single method call.
8194     (ProjFrame.__VerifyButtons): Add more states to check.
8195     (ProjFrame.__GetProjection): Return the current state of an
8196     edited projection or None.
8197     (ProjFrame.__FillAvailList): Remove checks for states that
8198     shouldn't exist.
8199     (ProjFrame._OnNew): Clear all selected items and supply
8200     a projection panel if necessary.
8201    
8202     * test/test_proj.py (TestProjFile.test): Add tests for
8203     ProjFile.SetAllParameters, ProjFile.SetProjection,
8204     ProjFile.SetName.
8205    
8206     2003-04-25 Jonathan Coles <[email protected]>
8207    
8208 jonathan 748 * Thuban/UI/projdialog.py (ProjFrame.__FillAvailList): Now
8209     takes an optional argument to select the current projection.
8210     This does not guarantee that the item is visible due to
8211     limited wxWindows functionality. Fixes RTBug #1821.
8212    
8213     2003-04-25 Jonathan Coles <[email protected]>
8214    
8215 jonathan 743 * Thuban/Model/load.py (SessionLoader.start_projection): Remember
8216     the projection name and use it when constructing the Projection
8217     object.
8218    
8219     * Thuban/Model/proj.py (Projection.__init__): Change the default
8220     value for 'name' to None and then test if name is equal to None
8221     in the body of the constructor. This way the caller doesn't have to
8222     know what the default value should be. Namely, useful in load.py
8223     where we have to pick a default value if the 'name' parameter
8224     doesn't exist in the XML file.
8225    
8226     * test/test_load.py (LoadSessionTest.testLayerProjection): New.
8227     Tests a file where a layer has a projection.
8228    
8229     2003-04-25 Jonathan Coles <[email protected]>
8230    
8231 jonathan 735 * Thuban/Model/layer.py (Layer.TreeInfo): Add an item to the
8232     tree for projection information.
8233    
8234     * Thuban/Model/load.py (XMLReader.GetFilename): Renamed from
8235     XMLReader.GetFileName.
8236     (SessionLoader): Added support for loading projection tags that
8237     appear inside a layer.
8238    
8239     * Thuban/Model/proj.py (ProjFile): Document the class. Move
8240     back to using a list because the order of the projections in
8241     the file is important to maintain. Fixes RTbug #1817.
8242    
8243     * Thuban/Model/resource.py: Rename calls to ProjFile.GetFileName
8244     to ProjFile.GetFilename.
8245    
8246     * Thuban/Model/save.py (SessionSaver.write_layer): Save projection
8247     information.
8248    
8249     * Thuban/UI/projdialog.py (ProjFrame._OnAddToList): Renamed from
8250     ProjFrame._OnSaveAs. Removed old dead code from previous
8251     implementation.
8252     (ProjFrame._OnExport): Add support for exporting more than one
8253     projection to a single file.
8254     (ProjFrame.__FillAvailList): use string formatting (% operator)
8255     to build strings that are (partly) translated. Fixes RTbug #1818.
8256    
8257     * test/test_proj.py (TestProjFile.test): New. Tests the base ProjFile
8258     class.
8259    
8260 bh 734 2003-04-24 Bernhard Herzog <[email protected]>
8261    
8262     * po/es.po: Updated Spanish translation by Daniel Calvelo Aros
8263    
8264     * po/fr.po: New. French translation by Daniel Calvelo Aros
8265    
8266     * Thuban/UI/projdialog.py (ProjFrame._OnSaveAs): Don't translate
8267     empty strings.
8268    
8269 jonathan 735 2003-04-24 Jonathan Coles <[email protected]>
8270 jonathan 724
8271     * Thuban/Model/layer.py (Layer.GetProjection): New. Needed to
8272     implement the interface that the ProjFrame dialog expects.
8273    
8274     * Thuban/Model/proj.py (Projection.SetName): New. Allows the
8275     name of the projection to be changed.
8276     (ProjFile): Use a dictionary instead of a list so that removing
8277     projections is easier and we are sure about uniqueness.
8278     (ProjFile.Remove): Remove the given projection object.
8279    
8280     * Thuban/Model/resource.py (GetSystemProjFiles, GetUserProjFiles):
8281     Return a list with only one projection file instead of searching for
8282     any projection file. This simplifies many things if the user can
8283     only have one system file and one user file.
8284    
8285     * Thuban/UI/classgen.py: Change all references to
8286     genCombo to genChoice.
8287    
8288     * Thuban/UI/mainwindow.py: Add a Projection option under the
8289     layer menu.
8290     (MainWindow.LayerProjection): New. Open up a projection window
8291     for a layer.
8292    
8293     * Thuban/UI/projdialog.py: Large changes to how the dialog is
8294     laid out. Use three panels instead of one. One for the list of
8295     projections, one for the edit controls, and one for the buttons.
8296     Fixed resizing problems so that the dialog resizes correctly
8297     when the projection panel changes. Added import/export, save, and
8298     new buttons/functionality.
8299    
8300 bh 723 2003-04-24 Bernhard Herzog <[email protected]>
8301    
8302     First step towards table management. Introduce a simple data
8303     abstraction so that we replace the data a layer uses more easily
8304     in the next step.
8305    
8306     * Thuban/Model/data.py: New file with a simple data abstraction
8307     that bundles shapefile and dbffile into one object.
8308    
8309     * Thuban/Model/session.py (Session.OpenShapefile): New method to
8310     open shapefiles and return a shape store object
8311    
8312     * Thuban/Model/layer.py (Layer.__init__): Pass the data as a store
8313     object instead of a shapefile filename. This introduces a new
8314     instance variable store holding the datastore. For intermediate
8315     backwards compatibility keep the old instance variables.
8316     (open_shapefile): Removed. No longer needed with the shape store.
8317     (Layer.SetShapeStore, Layer.ShapeStore): New methods to set and
8318     get the shape store used by a layer.
8319     (Layer.Destroy): No need to explicitly destroy the shapefile or
8320     table anymore.
8321    
8322     * Thuban/UI/mainwindow.py (MainWindow.AddLayer)
8323     (MainWindow.AddLayer): Use the session's OpenShapefile method to
8324     open shapefiles
8325    
8326     * Thuban/Model/load.py (ProcessSession.start_layer): Use the
8327     session's OpenShapefile method to open shapefiles
8328    
8329     * test/test_classification.py
8330     (TestClassification.test_classification): Use the session's
8331     OpenShapefile method to open shapefiles and build the filename in
8332     a more platform independed way
8333    
8334     * test/test_layer.py (TestLayer.setUp, TestLayer.tearDown):
8335     Implement to have a session to use in the tests
8336     (TestLayer.test_arc_layer, TestLayer.test_polygon_layer)
8337     (TestLayer.test_point_layer, TestLayer.test_empty_layer): Use the
8338     session's OpenShapefile method to open shapefiles
8339     (TestLayerLegend.setUp): Instantiate a session so that we can use
8340     it to open shapefiles.
8341     (TestLayerLegend.tearDown): Make sure that all references to
8342     layers and session are removed otherwise we may get a resource
8343     leak
8344    
8345     * test/test_map.py (TestMapAddLayer.test_add_layer)
8346     (TestMapWithContents.setUp): Instantiate a session so that we can
8347     use it to open shapefiles.
8348     (TestMapWithContents.tearDown): Make sure that all references to
8349     layers, maps and sessions are removed otherwise we may get a
8350     resource leak
8351     ("__main__"): use support.run_tests() so that more info about
8352     uncollected garbage is printed
8353    
8354     * test/test_save.py (SaveSessionTest.testSingleLayer): Use the
8355     session's OpenShapefile method to open shapefiles
8356     ("__main__"): use support.run_tests() so that more info about
8357     uncollected garbage is printed
8358    
8359     * test/test_selection.py (TestSelection.tearDown): Make sure that
8360     all references to the session and the selection are removed
8361     otherwise we may get a resource leak
8362     (TestSelection.get_layer): Instantiate a session so that we can
8363     use it to open shapefiles.
8364     ("__main__"): use support.run_tests() so that more info about
8365     uncollected garbage is printed
8366    
8367     * test/test_session.py (TestSessionBase.tearDown)
8368     (TestSessionWithContent.tearDown): Make sure that all references
8369     to the session and layers are removed otherwise we may get a
8370     resource leak
8371     (TestSessionWithContent.setUp): Use the session's OpenShapefile
8372     method to open shapefiles
8373    
8374 jonathan 721 2003-04-24 Jonathan Coles <[email protected]>
8375    
8376     * Thuban/Model/load.py (XMLReader.read): Should have been checking
8377     if the file_or_filename object had the 'read' attribute.
8378    
8379 jonathan 715 2003-04-23 Jonathan Coles <[email protected]>
8380    
8381 jonathan 720 * Thuban/Model/resource.py: Fixes RTbug #1813.
8382     (ReadProjFile): Add documentation about which exceptions are raised.
8383     Always pass the exceptions up to the caller.
8384     (GetProjFiles): If the directory can't be read return an empty list.
8385     If any of the proj files can't be read skip that file and go
8386     on to the next one.
8387    
8388     * test/test_proj.py: Added test cases to handle nonexistent files,
8389     unreadable files, and files that don't parse correctly.
8390    
8391     2003-04-23 Jonathan Coles <[email protected]>
8392    
8393 jonathan 716 Projection dialog. Allows the user to select from a list
8394     of projection templates and optionally edit them and save new ones.
8395    
8396     * Thuban/UI/projdialog.py (ProjFrame): New. Main dialog.
8397     (ProjPanel): Base class for projection specific panels.
8398     (TMPanel): Projection panel for Transverse Mercartor.
8399     (UTMPanel): Projection panel for Universal Transverse Mercartor.
8400     (LCCPanel): Projection panel for Lambert Conic Conformal.
8401     (GeoPanel): Projetion panel for Geographic Projection.
8402    
8403     2003-04-23 Jonathan Coles <[email protected]>
8404    
8405 jonathan 715 * Thuban/Model/load.py (XMLReader): Renamed from XMLProcessor to
8406     promote symmetry. There now exists XMLReader and XMLWriter.
8407     (XMLReader.read): New. Call to read the given file descriptor or
8408     filename.
8409     (XMLReader.close): New. Make sure the file is closed.
8410     (XMLReader.GetFileName): New. Return just the file name that is being
8411     read from.
8412     (XMLReader.GetDirectory): New. Return just the directory of the file
8413     that is being read.
8414     (XMLReader.AddDispatchers): New. Take a dictionary which contains
8415     the names of functions to call as the XML tree is parsed.
8416     (XMLReader.startElementNS): Updated to use new dispatcher dictionary.
8417     (XMLReader.endElementNS): Updated to use new dispatcher dictionary.
8418     (SessionLoader): Removed class variables start_dispatcher and
8419     end_dispatcher since this functionality is now part of a class
8420     instance. Fixes RTbug #1808.
8421     (SessionLoader.__init__): Add dispatcher functions.
8422     (load_xmlfile): Code was moved into the XMLReader.read().
8423     (load_session): Use modified SessionLoader.
8424    
8425     * Thuban/Model/map.py (Map.GetProjection): New. Returns the
8426     map's projection.
8427    
8428     * Thuban/Model/proj.py (Projection.GetParameters): Renamed to
8429     GetAllParameters.
8430     (Projection.GetParameter): Returns the value for the given parameter.
8431    
8432     * Thuban/Model/resource.py: Use XMLReader and XMLWriter.
8433     (GetProjFiles): Renamed from GetProjections. Now returns a list
8434     of ProjFile objects.
8435     (GetSystemProjFiles): Renamed from GetSuppliedProjections. Returns
8436     a list of ProjFile objects whose files are not user defined.
8437     (GetUserProjFiles): Renamed from GetUserProjections. Returns a
8438     list of ProjFile objects whose files are user defined.
8439     (ProjFileReader): Extend new XMLReader.
8440    
8441     * Thuban/Model/save.py (XMLWriter): Renamed from XMLSaver to
8442     promote symmetry.
8443    
8444     * Thuban/UI/classgen.py (ClassGenDialog.__init__): Use a wxChoice
8445     control instead of a wxComboBox. wxChoice controls do not generate
8446     events as the uses highlights possible choices which fixes problems
8447     with resizing the dialog when the use selects an option.
8448    
8449     * Thuban/UI/classifier.py (Classifier.__init__): Use a wxChoice
8450     control instead of a wxComboBox.
8451    
8452     * Thuban/UI/mainwindow.py (MainWindow.Projection): Use new projection
8453     dialog.
8454    
8455     * test/test_proj.py (TestProjection.test): New tests for GetParameter
8456     method.
8457    
8458 bh 703 2003-04-22 Bernhard Herzog <[email protected]>
8459    
8460 bh 705 * Thuban/UI/mainwindow.py: Remove some unused imports and global
8461     constants
8462    
8463 bh 703 * Thuban/UI/identifyview.py (IdentifyListCtrl.selected_shape)
8464     (IdentifyGridCtrl.selected_shape): Use table, not shapetable.
8465    
8466 bh 700 2003-04-17 Bernhard Herzog <[email protected]>
8467    
8468 bh 701 * Thuban/Model/layer.py: Don't import LAYER_LEGEND_CHANGED.
8469     (Layer): Update doc-string since LAYER_LEGEND_CHANGED is not used
8470     anymore.
8471     (Layer.BoundingBox, Layer.GetFieldType, Layer.NumShapes)
8472     (Layer.ShapeType, Layer.Shape): No need to call
8473     self.open_shapefile since it's always called in __init__
8474    
8475 bh 700 * Thuban/UI/application.py (ThubanApplication.MainLoop): Removed.
8476     In wxPython 2.4 there's no need to extend MainLoop anymore since
8477     wxPython itself makes sure OnExit is called.
8478    
8479 jonathan 688 2003-04-16 Jonathan Coles <[email protected]>
8480    
8481 jonathan 693 Initial putback of projection management code. Includes new
8482     classes to read and write projection files. The current load
8483     and save classes were abstracted a bit so they could be reused.
8484     The Projection class was extended to provide new methods and
8485     have a name.
8486    
8487     * Thuban/Model/load.py (XMLProcessor): New. Contains all the
8488     general XML reading methods that were part of ProcessSession.
8489    
8490     * Thuban/Model/proj.py (Projection.__init__): Accepts an optional
8491     name.
8492     (ProjFile): New. Represents a file that contains projection
8493     information.
8494    
8495     * Thuban/Model/resource.py: New. Contains general utilities
8496     for read and writing projection files.
8497    
8498     * Thuban/Model/save.py (XMLSaver): New. Contains all the
8499     general XML writing methods that were part of SessionSaver.
8500     (SessionSaver): Renamed from Saver.
8501    
8502     * test/test_proj.py: New test cases for the projection
8503     file read and write functions.
8504    
8505     2003-04-16 Jonathan Coles <[email protected]>
8506    
8507 jonathan 688 * Thuban/Model/classification.py: Use repr() around values
8508     in the ClassGroup*.__repr__() methods so it is clearer when
8509     a value is a string and when it is a number.
8510    
8511     * test/test_load.py: Rework the classification test to test
8512     that we can load old files.
8513     (testLabels): Test a file where the groups have labels.
8514    
8515 bh 687 2003-04-16 Bernhard Herzog <[email protected]>
8516    
8517     Safer implementation of the performance enhancements of the
8518     low-level renderer:
8519    
8520     * extensions/thuban/wxproj.cpp (extract_projection)
8521     (extract_pointer): Rename extract_projection to extract_pointer
8522     and redefine its purpose to return the pointer stored in a CObject
8523     returned by the object's cobject method. Update all callers.
8524     (s_draw_info, free_draw_info, draw_polygon_init): Implement the
8525     handling of these low-level parameters so that each s_draw_info
8526     instance is handled as a CObject at python level that also
8527     contains real references to the actual python objects which
8528     contain the values in the struct. Add free_draw_info as the
8529     destructor.
8530     (draw_polygon_shape): Add the py_draw_info parameter which must a
8531     cobject containing an s_draw_info pointer.
8532    
8533     * Thuban/UI/renderer.py (MapRenderer.polygon_render_param): New
8534     method to instantiat the low-level render parameter
8535     (MapRenderer.draw_shape_layer): Use the new method. Remove some
8536     commented out code.
8537     (MapRenderer.draw_polygon_shape): Make the first parameter not the
8538     layer but the low-level render parameter
8539     (ScreenRenderer.draw_shape_layer): Use the low-level render
8540     parameter.
8541    
8542 jonathan 673 2003-04-15 Jonathan Coles <[email protected]>
8543    
8544 jonathan 680 * Thuban/Model/classification.py: Implemented __repr__ for
8545     the ClassGroup* classes to make debugging a bit easier.
8546     (ClassGroup.SetLabel): Check that the string is an instance
8547     of StringTypes not StringType. Accounts for Unicode strings.
8548    
8549     * Thuban/Model/color.py: Implemented __repr__ to make
8550     debugging a bit easier.
8551    
8552     * Thuban/Model/save.py (Saver.write_classification): Need to
8553     save the group label.
8554    
8555     * test/test_load.py (testClassification): New. Loads the
8556     iceland_sample_test.thuban file and checks if it was loaded
8557     correctly.
8558    
8559     2003-04-15 Jonathan Coles <[email protected]>
8560    
8561 jonathan 673 * extensions/thuban/wxproj.cpp (draw_polygon_init): New. Used
8562     to improve rendering performance by initializing the variables
8563     that are not change each time draw_polygon_shape() is called.
8564     The values are stored in a global struct draw_info.
8565     (draw_polygon_shape): Removed initialization code that is
8566     now in draw_polygon_init().
8567    
8568     * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Make
8569 jonathan 674 drawing initialization call to draw_polygon_init()
8570     (MapRenderer.draw_polygon_shape): Use new signature of
8571     draw_polygon_shape.
8572 jonathan 673
8573 jonathan 674 * Thuban/UI/classgen.py (GenUniformPanel): Fix spin control
8574     weirdness by setting the range to (1, maxint).
8575 jonathan 673
8576 jonathan 674 * Thuban/Model/classification.py (ClassGroupProperties): Make
8577     instance variables private and optimize comparison operator
8578     by first checking if the color references are the same.
8579     (ClassGroupSingleton): Make instance variables private.
8580     (ClassGroupRange): Make instance variables private.
8581 jonathan 673
8582 jonathan 674 * HOWTO-Release: Filled in missing steps for releasing packages.
8583    
8584 bh 672 2003-04-15 Bernhard Herzog <[email protected]>
8585    
8586     First stab at internationalized messages:
8587    
8588     * Thuban/__init__.py (_): Implement the translation function for
8589     real using the python gettext module.
8590    
8591     * Thuban/UI/classifier.py (ClassTable.GetRowLabelValue): Don't
8592     translate empty strings.
8593    
8594     * Thuban/UI/application.py (ThubanApplication.read_startup_files):
8595     Add a missing space to a warning message
8596    
8597     * po/README: New. Notes about the management of the translation
8598     files.
8599    
8600     * po/Makefile: New. Makefile to help manage the translation files.
8601    
8602     * po/es.po: New. Spanish translation by Daniel Calvelo Aros
8603    
8604     * MANIFEST.in: Include the *.mo files in Resources/Locale and the
8605     translations and support files in po/
8606    
8607     * setup.py (data_files): Add the *.mo files to the data_files too
8608    
8609     * README: Add note about the translations when building from CVS
8610    
8611 jonathan 669 2003-04-14 Jonathan Coles <[email protected]>
8612    
8613     * Thuban/UI/dock.py: Fixes some window resizing problems most
8614     noticable under windows. Always assume the button bitmaps will
8615     be there. Code clean up.
8616     (DockabelWindow.Dock, DockableWindow.UnDock): Force all the
8617     images for the dock/undock button to the same images.
8618     Work around for RTbug #1801.
8619    
8620     * Thuban/UI/legend.py (LegendPanel.__init__): The toolbar should
8621     be allowed to grow within the sizer. Fixes a bug under Windows
8622     where the toolbar wasn't being drawn.
8623    
8624 frank 664 2003-04-14 Frank Koormann <[email protected]>
8625    
8626     * Resources/Bitmaps/dock_12.xpm, Resources/Bitmaps/undock_12.xpm:
8627     Updated design to try to make the button functionality more
8628     transparent.
8629    
8630 jonathan 662 2003-04-14 Jonathan Coles <[email protected]>
8631    
8632     * Thuban/UI/legend.py (LegendPanel.__init__): Call Create() to
8633     finalize the intialization of the panel.
8634    
8635     * Thuban/UI/dock.py (DockPanel.Create): New. Finalizes the
8636     creation of the panel. Should be the last thing called in the
8637     initializer of a subclass.
8638    
8639     * Thuban/UI/classgen.py (ClassGenDialog.__init__): Actively
8640     set the current selections in the combo boxes. This is needed
8641     under Windows.
8642    
8643     * Thuban/UI/classifier.py (Classifier.__init__): Add a top
8644     level panel to the dialog so that the background colors are
8645     consistent under Windows.
8646    
8647 jonathan 646 2003-04-11 Jonathan Coles <[email protected]>
8648    
8649 jonathan 662 * Thuban/UI/classgen.py: Change color ramps to start at white
8650     not black.
8651    
8652     * Thuban/UI/legend.py: Enable/disable the legend buttons when
8653     the legend changes. Fixes RTbug #1793.
8654    
8655     * test/test_classification.py: Added test for copying of
8656     classifications.
8657    
8658     2003-04-11 Jonathan Coles <[email protected]>
8659    
8660 jonathan 647 * Thuban/UI/resource.py: New. Centralize the loading of resources
8661     such as bitmaps.
8662    
8663     * Thuban/UI/classgen.py (GenUniquePanel.__init__): Reordered buttons,
8664     added images to the move buttons, added 'reverse' button.
8665     (CustomRampPanel.__init__): Added images to the move buttons.
8666     (GreyRamp): New. Generates a ramp from white to black.
8667     (HotToColdRamp): New. Generates a ramp from cold to hot colors.
8668    
8669     * Thuban/UI/classifier.py: Refactored ID's from ID_CLASSIFY_* to
8670     ID_PROPERTY_*.
8671     (Classifier.__init__): Minor changes to the layout.
8672     (Classifier._OnTitleChanged): Listen for when the user edits the
8673     title and update the dialog's title and the layer's title.
8674    
8675     * Thuban/UI/dock.py: Use new bitmaps for the control buttons.
8676    
8677     * Thuban/UI/legend.py: Use new bitmaps for the control buttons.
8678     (LegendTree._OnMsgLayerTitleChanged): Change the displayed title
8679     if the layer's title changes.
8680    
8681     * Thuban/UI/mainwindow.py: Added new menu item and associated code
8682     to open a dialog to rename the map.
8683     (MainWindow): Use new resource class to import bitmaps.
8684    
8685     2003-04-11 Jonathan Coles <[email protected]>
8686    
8687 jonathan 646 * Resources/Bitmaps/close_12.xpm, Resources/Bitmaps/dock_12.xpm,
8688 jonathan 647 Resources/Bitmaps/group_use.xpm, Resources/Bitmaps/group_use_all.xpm,
8689     Resources/Bitmaps/group_use_none.xpm,
8690     Resources/Bitmaps/group_use_not.xpm,
8691     Resources/Bitmaps/hide_layer.xpm,
8692     Resources/Bitmaps/layer_properties.xpm,
8693     Resources/Bitmaps/lower_layer.xpm, Resources/Bitmaps/raise_layer.xpm,
8694     Resources/Bitmaps/show_layer.xpm, Resources/Bitmaps/undock_12.xpm:
8695     New.
8696 jonathan 646
8697 jonathan 636 2003-04-10 Jonathan Coles <[email protected]>
8698    
8699 jonathan 644 * Thuban/Model/classification.py: (ClassGroupRange.__init__):
8700     Should pass group to ClassGroup constructor.
8701    
8702     2003-04-10 Jonathan Coles <[email protected]>
8703    
8704 jonathan 636 * Thuban/Model/classification.py: (ClassGroup): Move all the common
8705     methods of the derived classes ([Set|Get]Properties(), __eq__, __ne__)
8706     here. Implement SetVisible(), IsVisible().
8707     (ClassGroup.__init__): Add group parameter which acts as a copy
8708     constructor.
8709    
8710     * Thuban/UI/classifier.py (ClassTable): Add a new column for the
8711     "Visible" check boxes.
8712     (Classifier): Rename the buttons and refactor the code to match
8713     the new labels.
8714    
8715     * Thuban/UI/legend.py: Classify button is now called "Properties".
8716     Refactored the code to change variable names.
8717     (LegendTree.__FillTreeLayer): Only list a group if it is visible.
8718    
8719     * Thuban/UI/mainwindow.py: MainWindow.OpenClassifier renamed to
8720     MainWindow.OpenLayerProperties. MainWindow.LayerEditProperties
8721     renamed to MainWindow.LayerEditProperties.
8722     (MainWindow.ToggleLegend): Don't include map name in legend title.
8723     (MainWindow.SetMap): Added the map name to the window title.
8724     (MainWindow.LayerFillColor, MainWindow.LayerTransparentFill,
8725     MainWindow.LayerOutlineColor, MainWindow.LayerNoOutline): Removed.
8726     Functionality is found in the layer properties dialog.
8727    
8728     * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Only
8729     draw visible groups.
8730    
8731 jonathan 626 2003-04-09 Jonathan Coles <[email protected]>
8732    
8733 jonathan 634 * Thuban/UI/classgen.py: Modifications to allow simple
8734     addition and selection of new color schemes.
8735     (MonochromaticRamp): New. Generates a ramp between two colors.
8736     (RedRamp): New. Generates a ramp of all red.
8737     (GreenRamp): New. Generates a ramp of all green.
8738     (BlueRamp): New. Generates a ramp of all blue.
8739    
8740     2003-04-09 Jonathan Coles <[email protected]>
8741    
8742 jonathan 626 * Thuban/Model/classification.py (Classification.__deepcopy__):
8743     Need to copy over field and fieldType attributes.
8744    
8745     * Thuban/Model/table.py (Table.field_range): New. Retrive the
8746     maximum and minimum values over the entire table for a given
8747     field.
8748     (Table.GetUniqueValues): New. Retrieve all the unique values
8749     in the table for a given field.
8750    
8751     * Thuban/UI/classgen.py: Renamed GenRangePanel to GenUniformPanel.
8752     (GenUniquePanel): New. Controls to allow the user to select
8753     which unique field values they would like in the classification.
8754     (CustomRampPanel): Code that was in ClassGenDialog that allows
8755     the user to select the properties for a custom ramp.
8756     (ClassGenerator.GenUniformDistribution): Was called GenerateRanges.
8757    
8758     * Thuban/UI/classifier.py: Removed a lot of debugging code.
8759     (Classifier._SetClassification): Callback method so that the
8760     class generator can set the classification in the grid.
8761     (ClassGroupPropertiesCtrl): New. Encapsulates the drawing and
8762     editing of a group properties class into a wxWindows control.
8763    
8764     * Thuban/UI/dock.py: It was decided that if the user closes
8765     a dockable window the window should simply hide itself. That
8766     way if the user wants to show the dock again it appears in the
8767     same place as it was when it was closed.
8768     (DockableWindow.Destroy): Call renamed method OnDockDestroy().
8769     (DockableWindow._OnButtonClose): Hide the window instead of
8770     destroying it.
8771     (DockableWindow._OnClose): Hide the window instead of
8772     destroying it.
8773    
8774     * Thuban/UI/legend.py (LegendTree): Use a private method to
8775     consistently set the font and style of the text. Fixes RTbug #1786.
8776    
8777     * Thuban/UI/mainwindow.py: Import just the Classifier class.
8778    
8779 bh 623 2003-04-07 Bernhard Herzog <[email protected]>
8780    
8781 bh 625 * Thuban/UI/mainwindow.py (main_menu): Move the toggle_legend item
8782     to the map module
8783    
8784     2003-04-07 Bernhard Herzog <[email protected]>
8785    
8786 bh 623 * Thuban/UI/mainwindow.py (MainWindow.ShowSessionTree): Removed in
8787     favor of ToggleSessionTree
8788     (MainWindow.ToggleSessionTree): New method to toggle visibility of
8789     the session tree.
8790     (MainWindow.SessionTreeShown): New method to return whether the
8791     session tree is currently shown.
8792     (MainWindow.ToggleLegend): New method to toggle visibility of the
8793     legend
8794     (MainWindow.ShowLegend): Implement in terms of ToggleLegend and
8795     LegendShown
8796     (MainWindow.LegendShown): New method to return whether the legend
8797     is currently shown.
8798     (_method_command): Add checked parameter so we can define check
8799     menu items
8800     (_has_tree_window_shown, _has_legend_shown): Use the appropriate
8801     mainwindow methods.
8802     (show_session_tree, show_legend commands): Removed.
8803     (toggle_session_tree, toggle_legend commands): New commands to
8804     toggle the visibility of the dialogs
8805    
8806 jonathan 612 2003-04-07 Jonathan Coles <[email protected]>
8807    
8808 jonathan 619 * Thuban/UI/classgen.py: Fix Windows problem.
8809    
8810     * Thuban/UI/dock.py: Fix Windows problem.
8811    
8812     * Thuban/UI/mainwindow.py: Use False instead of false.
8813     (MainWindow.ShowLegend): Remove unnecessary switch parameter.
8814    
8815     2003-04-07 Jonathan Coles <[email protected]>
8816    
8817 jonathan 612 Since we now say that the order of the groups in a classification
8818     matters, it makes sense to be able to manipulate that order. Most
8819     of the changes to Thuban/Model/classification.py are to that end.
8820    
8821     * Thuban/Model/classification.py (Classification.AppendGroup,
8822     Classification.InsertGroup, Classification.ReplaceGroup,
8823     Classification.RemoveGroup, Classification.GetGroup): Do as the
8824     names imply.
8825     (Classification.FindGroup): This was called GetGroup, but GetGroup
8826     takes an index, while FindGroup takes a value.
8827     (Classification.__deepcopy__): Copy all the groups, BUT NOT THE LAYER
8828     REFERENCE. Currently there is a cyclic reference between the layer
8829     and its classification. If the classification doesn't need to know
8830     its owning layer we can change this, since it may make sense to be
8831     able to use the same classification with different layers.
8832    
8833     * Thuban/Model/load.py: Use Classification.AppendGroup(), not AddGroup()
8834    
8835     * Thuban/UI/classgen.py: Use Classification.AppendGroup(),
8836     not AddGroup()
8837    
8838     * Thuban/UI/classifier.py: Now that we can depend on the order in
8839     a Classification and have methods to manipulate that order we don't
8840     need to use our own data structures in the grid. We can simply make
8841     the grid/table access the information they need from a copy of
8842     the classification object.
8843     (Classifier._OnCloseBtn): Event handler for when the user clicks
8844     'Close'. This is needed so if the user applies changes and then
8845     continues to change the table the user has the option of discarding
8846     the most recent changes and keeping what they applied.
8847    
8848     * Thuban/UI/mainwindow.py: Put "Show Legend" and "Show Session Tree"
8849     into the same group.
8850    
8851     * extensions/thuban/wxproj.cpp (check_version): If Thuban is compiled
8852     with a really old version of proj, PJ_VERSION won't even be defined.
8853     If it isn't defined then just compile so that the function always
8854     returns Py_False.
8855    
8856     * test/test_classification.py: Fix tests to use the renamed methods.
8857     Still need to write tests for the new methods.
8858    
8859 jonathan 601 2003-04-04 Jonathan Coles <[email protected]>
8860 jonathan 608
8861 jonathan 612 * Thuban/UI/classifier.py (Classifier.__SelectField): Move the
8862     call to SetSelection out of the method and before the call
8863     to __SelectField in __init__. This prevents a recursion of events
8864     when _OnFieldSelect is triggered by the user.
8865    
8866     2003-04-04 Jonathan Coles <[email protected]>
8867    
8868 jonathan 608 * Thuban/Model/classification.py: Rename Color.None to
8869     Color.Transparent.
8870     (ClassGroupProperties.SetLineColori, ClassGroupProperties.SetFill):
8871     Don't bother copying the color, since Colors are immutable.
8872    
8873     * Thuban/Model/color.py, Thuban/Model/layer.py, Thuban/Model/load.py,
8874     Thuban/UI/classifier.py, Thuban/UI/mainwindow.py,
8875     Thuban/UI/renderer.py, Thuban/UI/view.py:
8876     Rename Color.None to Color.Transparent.
8877    
8878     * test/test_classification.py, test/test_load.py: Rename Color.None
8879     to Color.Transparent.
8880    
8881     2003-04-04 Jonathan Coles <[email protected]>
8882 jonathan 603
8883     * Thuban/Model/classification.py: Fix assert calls.
8884     (ClassGroupProperties.SetLineColor, ClassGroupProperties.SetFill):
8885     Copy the color parameter rather than hold onto a reference.
8886 jonathan 601
8887 jonathan 603 * Thuban/Model/color.py (Color.__copy__, Color.__deepcopy): Copy
8888     the color object.
8889     (NoColor.__copy__, NoColor.__deepcopy): Return 'self' so that we
8890     are sure there exists only one refernce to Color.None in the system.
8891     This allows us to use 'is' rather than the comparision functions.
8892    
8893     * Thuban/Model/save.py: Fix assert calls.
8894    
8895     * Thuban/UI/classifier.py: Fix assert calls.
8896     (ClassGrid._OnCellDClick): Call up to the classifier to open the
8897     dialog to edit the groups properties.
8898     (ClassGrid._OnCellResize): Make sure that the scollbars are drawn
8899     correctly if a cell is resized.
8900     (ClassTable.SetClassification): New. Changes the classification
8901     that is in the table.
8902     (ClassTable.__SetRow): Allow groups to be prepended.
8903     (Classifier): New code for opening the EditProperties and
8904     GenerateRanges dialogs.
8905     (SelectPropertiesDialog.__GetColor): Only set the color in the
8906     color dialog if the current color is not None.
8907    
8908     * Thuban/UI/dock.py: Fix assert calls.
8909    
8910     * Thuban/UI/legend.py: Fix assert calls.
8911    
8912     * Thuban/UI/renderer.py: Fix assert calls.
8913    
8914     * Thuban/UI/classgen.py (ClassGenDialog): Dialog for generating
8915     classifications.
8916     (GenRangePanel): Panel specific to range generation.
8917     (GenSingletonPanel): Panel specific to singleton generation.
8918     (ClassGenerator): Class responsible for actually generating
8919     the classification from the data gathered in the dialog box.
8920     (PropertyRamp): Generates properties whose values range from
8921     a starting property to an ending property.
8922 jonathan 601
8923 bh 600 2003-04-03 Bernhard Herzog <[email protected]>
8924    
8925     * test/support.py (print_garbage_information): New function that
8926     prints information about still connected messages and memory
8927     leaks.
8928     (run_suite): Removed.
8929     (run_tests): New function for use as a replacement of
8930     unittest.main in the test_* files. This one calls
8931     print_garbage_information at the end.
8932    
8933     * test/runtests.py (main): Use support.print_garbage_information
8934    
8935     * test/test_layer.py: Use support.run_tests instead of
8936     unittest.main so we get memory leak information
8937     (TestLayer.test_arc_layer, TestLayer.test_polygon_layer)
8938     (TestLayer.test_point_layer, TestLayer.test_empty_layer)
8939     (TestLayerLegend.test_visibility): Call the layer's Destroy method
8940     to fix a memory leak.
8941    
8942     * test/test_classification.py: Use support.run_tests instead of
8943     unittest.main so we get memory leak information
8944     (TestClassification.test_classification): Call the layer's Destroy
8945     method to fix a memory leak.
8946    
8947 bh 591 2003-04-02 Bernhard Herzog <[email protected]>
8948    
8949 bh 595 * extensions/thuban/wxproj.cpp (check_version, check_version_gtk):
8950     Handle the reference counts of the return value and errors in
8951     PyArg_ParseTuple correctly.
8952    
8953 bh 593 * Thuban/UI/application.py (ThubanApplication.OpenSession): Make
8954     sure the filename is absolute to avoid problems when saving the
8955     session again
8956    
8957 bh 591 * Thuban/Model/table.py: Remove unnecessary import. Fix a typo.
8958    
8959 jonathan 587 2003-04-01 Jonathan Coles <[email protected]>
8960    
8961 jonathan 589 * Thuban/UI/renderer.py (MapRenderer.draw_point_shape): Check
8962 jonathan 587 that there actually are points in the returned list of points
8963     before trying to index into the list. The list may be empty if
8964     the shape is a Null Shape.
8965    
8966 bh 586 2003-04-01 Bernhard Herzog <[email protected]>
8967    
8968     * test/test_map.py: Don't use from <module> import *
8969    
8970 jonathan 581 2003-04-01 Jonathan Coles <[email protected]>
8971    
8972     * Thuban/Model/session.py: Use LAYER_CHANGED instead of
8973     LAYER_LEGEND_CHANGED
8974    
8975     * Thuban/UI/dock.py (DockableWindow._OnButtonClose): Call
8976     self.Destroy() to close the window after yesterday's changes.
8977    
8978     * test/test_map.py, test/test_session.py: Fix messages that
8979     are sent from maps and layers.
8980    
8981 jonathan 575 2003-03-31 Jonathan Coles <[email protected]>
8982    
8983     * Thuban/UI/classifier.py: Commented out some debugging statements.
8984     (ClassDataPreviewer.Draw): Draw rectangles for polygon layers per
8985     RTbug #1769.
8986    
8987     * Thuban/UI/dock.py (DockableWindow.UnDock): Restore size and
8988     position (although position doesn't work yet under GTK).
8989     (DockableWindow.Destroy): New. Called when the window must be
8990     closed. Namely needed when the DockFrame closes and must close
8991     its children.
8992     (DockFrame): Listen for EVT_CLOSE and destroy all children.
8993    
8994     * Thuban/UI/legend.py (LegendPanel.Destroy): New. Cleans up
8995     when then window is told to close.
8996     (LegendTree._OnMsgLayerChanged): Fixes a seg fault bug. See
8997     comment in source for more info.
8998    
8999     * Thuban/UI/main.py: Show the legend by default when Thuban starts.
9000    
9001     * Thuban/UI/mainwindow.py: Renamed OnClose to _OnClose for
9002     symmetry with other such methods.
9003     (MainWindow.ShowLegend): Show the legend docked by default.
9004    
9005 jonathan 569 2003-03-28 Jonathan Coles <[email protected]>
9006    
9007     * Thuban/UI/classifier.py: Support for highlighting a specific
9008     group within the grid when the classification dialog is opened.
9009     Also contains a lot of debugging printouts which will later
9010     be removed.
9011    
9012     * Thuban/UI/dock.py: Complete rework on the dock code so that
9013     that it is fairly removed from the rest of the Thuban application.
9014     It is easy to add new docks which the rest of the program having
9015     to be aware of them.
9016    
9017     * Thuban/UI/legend.py: Modifications to support selecting a
9018     specific group in the classification dialog. Changed how layers
9019     are drawn when the layer is visible/invisible.
9020    
9021     * Thuban/UI/mainwindow.py: Removed legend specific code and
9022     replaced it with calls to the new dock code.
9023    
9024     * Thuban/UI/renderer.py (MapRenderer.__init__): Added assert
9025     to check if scale > 0. Trying to track down a divide by zero.
9026    
9027 jonathan 557 2003-03-26 Jonathan Coles <[email protected]>
9028    
9029 jonathan 567 * Thuban/UI/legend.py: Removed unnecessary LegendDialog class.
9030     (LegendPanel): Removed _OnDock()/_OnUnDock() methods which are
9031     now part of DockableWindow.
9032     (LegendPanel.DoOnSelChanged): Select the current layer in the
9033     map.
9034     (LegendTree._OnSelChanged): Call LegendPanel.DoOnSelChanged()
9035     with the selected layer and/or group.
9036    
9037     2003-03-26 Jonathan Coles <[email protected]>
9038    
9039 jonathan 557 This putback contains the code for dockable windows. There is
9040     no support in wxWindows as of this date for windows that can
9041     attach themselves to other windows.
9042    
9043     The current model contains a DockableWindow which has a parent
9044     window for when it is detached and a dock window that it puts
9045     its contents in when it is docked. The contents of a DockableWindow
9046     must be a DockPanel. DockPanel itself derives from wxPanel.
9047    
9048     * Thuban/Model/layer.py (Layer.ClassChanged): Send a LAYER_CHANGED
9049     message, not a LAYER_LEGEND_CHANGED message.
9050    
9051     * Thuban/Model/map.py (Map): Forward LAYER_CHANGED messages.
9052    
9053     * Thuban/UI/classifier.py (Classifier.__init__): Use wxADJUST_MINSIZE
9054     as one of the style properties for the fieldTypeText item to
9055     be sure that its size is correct when the text changes.
9056    
9057     * Thuban/UI/dock.py: New. Classes for the DockPanel and
9058     DockableWindow.
9059    
9060     * Thuban/UI/legend.py: Added some more buttons and made the
9061     LegendPanel a DockPanel.
9062    
9063     * Thuban/UI/mainwindow.py: Added sash windows to the main window
9064     and supporting functions for manipulating the sashes.
9065     (MainWindow.ShowLegend): Create a DockableWindow with the
9066     LegendPanel as the contents.
9067    
9068     * Thuban/UI/messages.py: Added DOCKABLE_* messages
9069    
9070     * Thuban/UI/view.py (MapCanves.SetMap): Listen for LAYER_CHANGED,
9071     not LAYER_LEGEND_CHANGED, messages.
9072    
9073 jonathan 554 2003-03-25 Jonathan Coles <[email protected]>
9074    
9075     * setup.py: Added custom script bdist_rpm_build_script so that
9076     when the rpm is built the path to wx-config is correct.
9077    
9078     * setup.cfg: Added line saying to use the custom build script
9079    
9080 jonathan 552 2003-03-20 Jonathan Coles <[email protected]>
9081    
9082     Initial implementation of the Legend.
9083    
9084     * Thuban/UI/legend.py: New. Creates a window that shows the map's
9085     Legend information and allows the user to add/modify classifications
9086     and how the layers are drawn on the map.
9087    
9088     * setup.py: New command 'build_docs' which currently uses
9089     happydoc to generate html documentation for Thuban.
9090    
9091     * Thuban/Model/classification.py (ClassGroup.GetDisplayText): New.
9092     Returns a string which is appropriately describes the group.
9093    
9094     * Thuban/Model/layer.py (Layer.SetClassification): Generate a
9095     LAYER_CHANGED event instead of a LAYER_LEGEND_CHANGED event.
9096    
9097     * Thuban/Model/map.py (Map): Rename messages and use new, more
9098     specific, messages.
9099    
9100     * Thuban/Model/messages.py: New message to indicate that a layer's
9101     data has changed (LAYER_CHANGED). New map messages to indicate
9102     when layers have been added/removed/changed or if the stacking order
9103     of the layers has changed.
9104    
9105     * Thuban/Model/session.py: Rename and use new messages.
9106    
9107     * Thuban/UI/classifier.py: Remember if any changes have actually
9108     been applied so that if the dialog is cancelled without an application
9109     of changes we don't have to set a new classification.
9110     (ClassDataPreviewer): Pulled out the window specific code and put it
9111     ClassDataPreviewWindow. ClassDataPreviewer can then be used to draw
9112     symbols on any DC.
9113    
9114     * Thuban/UI/mainwindow.py: New code to open the legend.
9115    
9116     * Thuban/UI/view.py: Use new message names.
9117    
9118 jonathan 541 2003-03-19 Jonathan Coles <[email protected]>
9119    
9120     * Thuban/UI/main.py (verify_versions): New. Checks the versions
9121     of Python, wxPython, and some other libraries.
9122    
9123     * extensions/thuban/wxproj.cpp (check_version): Checks the given
9124     version against what wxproj was compiled with.
9125     (check_version_gtk): If wxproj was compiled with gtk then check
9126     the given version against the version of the gtk library
9127     currently being used.
9128    
9129 bh 538 2003-03-14 Bernhard Herzog <[email protected]>
9130    
9131     * test/test_command.py: Run the tests when the module is run as a
9132     script
9133    
9134     2003-03-14 Bernhard Herzog <[email protected]>
9135    
9136     Implement selection of multiple selected shapes in the same layer:
9137    
9138     - Introduce a new class to hold the selection. This basically
9139     replaces the interactor which was nothing more than the
9140     selection anyway. A major difference is of course that the new
9141     selection class supports multiple selected shapes in one layer
9142    
9143     - Move the object that represents the selection from the
9144     application to the canvas. The canvas is a better place than the
9145     application because the selection represents which shapes and
9146     layer of the map displayed by the canvas are selected and
9147     affects how the map is drawn.
9148    
9149     - Make the selection and its messages publicly available through
9150     the mainwindow.
9151    
9152     - The non-modal dialogs do not get a reference to the interactor
9153     anymore as they can simply refer to their parent, the
9154     mainwindow, for the what the interactor had to offer.
9155    
9156     * Thuban/UI/selection.py: New module with a class to represent the
9157     selection.
9158    
9159     * Thuban/UI/messages.py (SELECTED_TABLE, SELECTED_MAP): Remove
9160     these unused messages
9161    
9162     * Thuban/UI/application.py (ThubanApplication.OnInit)
9163     (ThubanApplication.OnExit, ThubanApplication.SetSession): The
9164     interactor is gone now.
9165     (ThubanApplication.CreateMainWindow): There is no interactor
9166     anymore so we pass None as the interactor argument for now for
9167     compatibility.
9168    
9169     * Thuban/UI/view.py (MapCanvas.delegated_messages)
9170     (MapCanvas.Subscribe, MapCanvas.Unsubscribe): In Subscribe and
9171     Unsubscribe, delegate messages according to the delegated_messages
9172     class variable.
9173     (MapCanvas.__getattr__, MapCanvas.delegated_methods): Get some
9174     attributes from instance variables as described with the
9175     delegated_methods class variable.
9176     (MapCanvas.__init__): New instance variable selection holding the
9177     current selection
9178     (MapCanvas.do_redraw): Deal with multiple selected shapes. Simply
9179     pass them on to the renderer
9180     (MapCanvas.SetMap): Clear the selection when a different map is
9181     selected.
9182     (MapCanvas.shape_selected): Simple force a complete redraw. The
9183     selection class now takes care of only issueing SHAPES_SELECTED
9184     messages when the set of selected shapes actually does change.
9185     (MapCanvas.SelectShapeAt): The selection is now managed in
9186     self.selection
9187    
9188     * Thuban/UI/mainwindow.py (MainWindow.delegated_messages)
9189     (MainWindow.Subscribe, MainWindow.Unsubscribe): In Subscribe and
9190     Unsubscribe, delegate messages according to the delegated_messages
9191     class variable.
9192     (MainWindow.delegated_methods, MainWindow.__getattr__): Get some
9193     attributes from instance variables as described with the
9194     delegated_methods class variable.
9195     (MainWindow.__init__): The interactor as ivar is gone. The
9196     parameter is still there for compatibility. The selection messages
9197     now come from the canvas.
9198     (MainWindow.current_layer, MainWindow.has_selected_layer):
9199     Delegate to the the canvas.
9200     (MainWindow.LayerShowTable, MainWindow.Classify)
9201     (MainWindow.identify_view_on_demand): The dialogs don't need the
9202     interactor parameter anymore.
9203    
9204     * Thuban/UI/tableview.py (TableFrame.__init__)
9205     (LayerTableFrame.__init__, LayerTableFrame.OnClose)
9206     (LayerTableFrame.row_selected): The interactor is gone. It's job
9207     from the dialog's point of view is now done by the mainwindow,
9208     i.e. the parent. Subscribe to SHAPES_SELECTED instead
9209     of SELECTED_SHAPE
9210    
9211     * Thuban/UI/dialogs.py (NonModalDialog.__init__): The interactor
9212     is gone. It's job from the dialog's point of view is now done by
9213     the mainwindow, i.e. the parent.
9214    
9215     * Thuban/UI/classifier.py (Classifier.__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    
9219     * Thuban/UI/tree.py (SessionTreeView.__init__): The interactor is
9220     gone. It's job from the dialog's point of view is now done by the
9221     mainwindow, i.e. the parent.
9222     (SessionTreeCtrl.__init__): New parameter mainwindow which is
9223     stored as self.mainwindow. The mainwindow is need so that the tree
9224     can still subscribe to the selection messages.
9225     (SessionTreeCtrl.__init__, SessionTreeCtrl.unsubscribe_all)
9226     (SessionTreeCtrl.update_tree, SessionTreeCtrl.OnSelChanged): The
9227     selection is now accessible through the mainwindow. Subscribe to
9228     SHAPES_SELECTED instead of SELECTED_SHAPE
9229    
9230     * Thuban/UI/identifyview.py (IdentifyView.__init__): Use the
9231     SHAPES_SELECTED message now.
9232     (IdentifyView.selected_shape): Now subscribed to SHAPES_SELECTED,
9233     so deal with multiple shapes
9234     (IdentifyView.__init__, IdentifyView.OnClose): The interactor is
9235     gone. It's job from the dialog's point of view is now done by the
9236     mainwindow, i.e. the parent.
9237    
9238     * Thuban/UI/controls.py (RecordListCtrl.fill_list): The second
9239     parameter is now a list of shape ids.
9240     (RecordTable.SetTable): The second parameter is now a list of
9241     indices.
9242    
9243     * Thuban/UI/renderer.py (ScreenRenderer.RenderMap): Rename the
9244     selected_shape parameter and ivar to selected_shapes. It's now a
9245     list of shape ids.
9246     (MapRenderer.draw_label_layer): Deal with multiple selected
9247     shapes. Rearrange the code a bit so that the setup and shape type
9248     distinctions are only executed once.
9249    
9250     * test/test_selection.py: Test cases for the selection class
9251    
9252 jonathan 527 2003-03-11 Jonathan Coles <[email protected]>
9253    
9254     * Thuban/Model/load.py: Temporary fix so that the xml reader
9255     doesn't cause Thuban to crash.
9256    
9257     * Thuban/Model/layer.py: Handle the cyclic references between
9258     a layer and its classification better, and be sure to disconnect
9259     the classification from the layer when the layer is destroyed
9260     so that we don't maintain a cyclic reference that may not be
9261     garbage collected.
9262    
9263     * Thuban/Model/classification.py: See comment for layer.py.
9264    
9265 jan 523 2003-03-12 Jan-Oliver Wagner <[email protected]>
9266    
9267     * HOWTO-Release: New. Information on the steps for releasing
9268     a new version of Thuban.
9269    
9270 jonathan 514 2003-03-11 Jonathan Coles <[email protected]>
9271    
9272     * Thuban/UI/classifier.py: Add normal border to SelectPropertiesDialog.
9273     Use True instead of true.
9274     (Classifier): Should have a single panel in which all the controls lie.
9275    
9276     * Thuban/UI/proj4dialog.py: Add normal border.
9277    
9278     * Thuban/UI/tree.py: Fixed problem with bad item images under Windows.
9279    
9280     * Thuban/UI/mainwindow.py: Use True instead of true.
9281    
9282     * setup.py: Update some definitions to use wxWindows2.4 files
9283    
9284     * Data/iceland_sample_class.thuban: Fixed file so that the
9285     field_type information is present.
9286    
9287 jonathan 490 2003-03-10 Jonathan Coles <[email protected]>
9288    
9289 jonathan 505 * Thuban/UI/classifier.py (Classifier.__init__): Make the
9290     field type label grow so that when the text changes the
9291     size is updated correctly. This may be a wxWindows bug.
9292    
9293     2003-03-10 Jonathan Coles <[email protected]>
9294    
9295 jonathan 499 * Thuban/UI/application.py: Changed SESSION_CHANGED to
9296     SESSION_REPLACED.
9297    
9298     * Thuban/UI/classifier.py: Wrap text with _().
9299     (ClassGrid.CreateTable): Set dimensions and size hints here,
9300     instead of in Reset, so we only set the size once.
9301    
9302     * Thuban/UI/dialogs.py: Don't need Shutdown(); just use Close()!
9303    
9304     * Thuban/UI/mainwindow.py (MainWindow.prepare_new_session):
9305     Call Close() instead of Shutdown().
9306    
9307     * Thuban/UI/messages.py: Changed SESSION_CHANGED to SESSION_REPLACED.
9308    
9309     * Thuban/UI/tree.py: Changed SESSION_CHANGED to SESSION_REPLACED.
9310     Go back to using OnClose() instead of Shutdown().
9311    
9312     2003-03-10 Jonathan Coles <[email protected]>
9313    
9314 jonathan 497 * Thuban/UI/classifier.py (Classifier): SelectField() needed
9315     to know the old field index as well as the new one.
9316    
9317     2003-03-10 Jonathan Coles <[email protected]>
9318    
9319 jonathan 495 * Thuban/UI/classifier.py (Classifier): Use __SelectField()
9320     to correctly set the table information and call this from
9321     __init__ and from _OnFieldSelect so that all the information
9322     is up to date when the dialog opens and when a field is changed.
9323    
9324     2003-03-10 Jonathan Coles <[email protected]>
9325    
9326 jonathan 490 * Thuban/Model/classification.py (Classification): Don't use
9327     layer's message function directly, use the ClassChanged() method
9328     when then classification changes. SetField/SetFieldType/SetLayer
9329     must keep the information about field name and field type in
9330     sync when an owning layer is set or removed.
9331    
9332     * Thuban/Model/layer.py: Added ClassChanged() so that the
9333     classification can tell the layer when its data has changed.
9334     (Layer.SetClassification): Accepts None as an arguement to
9335     remove the current classification and correctly handles
9336     adding a new classification.
9337    
9338     * Thuban/Model/load.py: Comment out print statement
9339    
9340     * test/test_classification.py, test/test_save.py: New and
9341     improved tests.
9342    
9343 jonathan 483 2003-03-07 Jonathan Coles <[email protected]>
9344    
9345     * Thuban/Model/classification.py: Implemented __copy__ and
9346     __deepcopy__ for ClassGroup* and ClassGroupProperites so
9347     they can easily be copied by the classifier dialog.
9348     (ClassGroupProperites.__init__): The default line color should
9349     have been Color.Black.
9350    
9351     * Thuban/UI/classifier.py: Setting and Getting table values now
9352     uses a consistent set of functions.
9353     (Classifier): Now non-modal. Has field type label which changes
9354     as the field changes. Keep track of buttons in a list so that
9355     we can enable/disable the buttons when the None field is selected.
9356     (SelectPropertiesDialog): Add buttons to make the colors transparent.
9357    
9358     * Thuban/UI/dialogs.py (NonModalDialog.Shutdown): New method which
9359     does what OnClose did, but can be called by the application to
9360     close a window. Needed when a session changes, and we have to
9361     close the classifier windows.
9362    
9363     * Thuban/UI/mainwindow.py (MainWindow.prepare_new_session):
9364     Shuts down open dialogs. Used when a new session is created
9365     or a session is opened.
9366     (MainWindow.SaveSession): Should only call application.SaveSession()
9367     if we don't call SaveSessionAs first.
9368     (MainWindow.Classify): Allow different classifier dialogs for
9369     different layers.
9370    
9371     * Thuban/UI/tree.py (SessionTreeView): Remove OnClose and let
9372     the parent class handle it. Add Shutdown() to unsubscibe from
9373     event notification and call the parent Shutdown(). This was
9374     necessary so the application can close the tree window.
9375    
9376 jonathan 478 2003-03-06 Jonathan Coles <[email protected]>
9377    
9378     * Thuban/Model/classification.py: Minor documentation changes,
9379     Addition of __eq__ and __ne__ methods.
9380     (Classification.SetLayer): prevent recursion between this method
9381     and Layer.SetClassification().
9382    
9383     * Thuban/Model/color.py: Addition of __eq__ and __ne__ methods.
9384    
9385     * Thuban/Model/layer.py (SetClassification): prevent recursion
9386     between this method and Classification.SetLayer().
9387    
9388     * test/test_classification.py, test/test_load.py,
9389     test/test_session.py: Fixed and added tests for the classification
9390     classes.
9391    
9392 bh 477 2003-03-06 Bernhard Herzog <[email protected]>
9393    
9394     * Thuban/UI/classifier.py (ClassGrid.__init__)
9395     (ClassGrid.CreateTable): Move the SetSelectionMode call to
9396     CreateTable because otherwise it triggers an assertion in
9397     wxPython/wxGTK 2.4.
9398    
9399 jonathan 459 2003-03-05 Jonathan Coles <[email protected]>
9400    
9401 jonathan 475 * Thuban/common.py: Move FIELDTYPE constants back to table.py.
9402 jonathan 471
9403 jonathan 475 * Thuban/Model/load.py: import FIELDTYPE constants from table.
9404 jonathan 471
9405 jonathan 475 * Thuban/UI/classifier.py: import FIELDTYPE constants from table.
9406 jonathan 471
9407 jonathan 475 * Thuban/Model/table.py: Put FIELDTYPE constants back.
9408 jonathan 471
9409     2003-03-05 Jonathan Coles <[email protected]>
9410    
9411 jonathan 459 * Thuban/UI/classifier.py: Added class documentation.
9412     Fixed RTbug #1713, #1714. Added Move[Up|Down] buttons.
9413     Store just the groups in the table and generate the other
9414     column information when it is requested. Add "None" field
9415     to pull-down to select no classification.
9416    
9417     * Thuban/common.py: Moved FIELDTYPE constants from table.py
9418     (Str2Num): Only catch ValueError exceptions.
9419    
9420     * Thuban/Model/classification.py: Class documentation. Renaming
9421     of methods with Stroke to Line. Groups are stored in a single
9422     list with the default as the first element. Groups are searched
9423     in the order they appear in the list.
9424    
9425     * Thuban/Model/color.py: Documentation.
9426    
9427     * Thuban/Model/layer.py (Layer): Add GetFieldType to retreive
9428     the kind of data represented by a field.
9429    
9430     * Thuban/Model/load.py (ProcessSession): Use proper string
9431     conversion function; fixes RTbug #1713.
9432    
9433     * Thuban/Model/save.py (Saver): Store field type information.
9434    
9435     * Thuban/Model/table.py: Put FIELDTYPE constants in common.py.
9436     (Table): Add field_info_by_name() to retrieve field information
9437     by specifying the field name, not the number.
9438    
9439     * Thuban/UI/mainwindow.py: Function name changes.
9440    
9441     * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Only
9442     get the layer classification once. Don't try to classify
9443     values when the field is None: just use the default properties.
9444    
9445     * Thuban/UI/view.py: Function name changes.
9446    
9447     * Doc/thuban.dtd: Add field_type attribute to a classification.
9448    
9449 bh 456 2003-03-04 Bernhard Herzog <[email protected]>
9450    
9451 bh 458 * Doc/thuban.dtd: Use correct syntax for optional attributes. Make
9452     the fill and stroke layer attributes optional with suitable
9453     default values. Add the stroke_width layer attribute. Use correct
9454     syntax for empty elements. Make the attribute list for labels
9455     refer to the label element.
9456    
9457     2003-03-04 Bernhard Herzog <[email protected]>
9458    
9459 bh 456 * setup.py (thuban_build_py.build): Add a comment about distutils in
9460     Python 2.3 containing some of the functionality we implement in
9461     setup.py ourselves.
9462    
9463     * Thuban/UI/classifier.py (ClassGrid.__init__): Set the table
9464     before the selection mode. Doing it the other way round triggers
9465     an assertion in wxWindows.
9466    
9467     * Thuban/Model/save.py (escape): Fix typo in doc-string
9468    
9469     * Thuban/Model/classification.py: Remove unnecessary wxPython
9470     import
9471    
9472 jonathan 448 2003-03-04 Jonathan Coles <[email protected]>
9473    
9474     * Thuban/Model/classification.py (ClassGroupRange.GetProperties):
9475     Parameter 'value' should default to None.
9476    
9477     * Thuban/UI/mainwindow.py: Use Layer.GetClassification() since
9478     the class attribute __classification is now private.
9479    
9480     * Thuban/UI/classifier.py (ClassGrid): Moved OnCellDClick() from
9481     Classifier to ClassGrid. Added support for removing selected rows,
9482     which including code for keeping track of when cells are selected,
9483     and deselected.
9484     (ClassTable): Support for added/removing rows. Fixed a problem
9485     with __ParseInput whereby it would not allow strings (only numbers)
9486     to be entered.
9487     (Classifier): Added button and supporting code for removing
9488     selected rows.
9489    
9490 jonathan 445 2003-02-27 Jonathan Coles <[email protected]>
9491 jonathan 434
9492     * Thuban/common.py: Moved color conversion functions into
9493     Thuban/UI/common.py.
9494     (Str2Num): Now converts the float (not the string) to a long/int
9495     so that an exception isn't thrown.
9496    
9497     * Thuban/UI/common.py: Common functions used in several UI modules
9498    
9499     * Thuban/Model/classification.py: Changed the class hierarchy
9500     so that a Classification consists of Groups which return
9501     Properties when a value matches a Group.
9502    
9503     * Thuban/Model/layer.py: Fixed name resolution problem.
9504    
9505     * Thuban/Model/load.py: Use new Classification and Group functions.
9506    
9507     * Thuban/Model/save.py (Saver.write_attribs): Fixes a test case
9508     failure.
9509     (Saver.write_classification): Use new Classification and Group
9510     functions.
9511    
9512     * Thuban/UI/classifier.py: Changes to use new Classification and Group
9513 jonathan 445 functions. Fix to create a tuple with a single value instead of
9514     simply returning the value.
9515 jonathan 434
9516     * Thuban/UI/renderer.py: Use new Classification and Group functions.
9517     Use common.py functions.
9518    
9519 jonathan 445 * Thuban/UI/tree.py: Use common.py functions.
9520 jonathan 447
9521     * test/test_classification.py: Use new Classification and Group
9522     classes.
9523 jonathan 434
9524 jonathan 426 2003-02-24 Jonathan Coles <[email protected]>
9525    
9526     * Thuban/common.py (Color2wxColour, wxColour2Color): Conversion
9527     functions from Thuban color objects to wxWindow colour objects.
9528    
9529     * Thuban/Model/classification.py (Classification): Renamed
9530     GetProperties() to GetClassData(). Used the new iterator
9531     in TreeInfo().
9532     (ClassIterator): Iterator implementation to iterate over the
9533     ClassData objects in a classification object.
9534    
9535     * Thuban/Model/save.py (Saver.write_classificaton): Uses
9536     the new iterator to save the classification information.
9537    
9538     * Thuban/UI/classifier.py (SelectPropertiesDialog): Support
9539     for changing the stroke and fill colors and previewing the
9540     changes.
9541    
9542     * Thuban/UI/mainwindow.py (MainWindow.OpenSession,
9543     MainWindow.SaveSessionAs): Text string changes so the dialogs
9544     have more meaningful titles.
9545    
9546     * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Change
9547     Classification method name from GetProperties to GetClassData.
9548    
9549     * Thuban/UI/view.py (MapCanvas.find_shape_at): Use method calls
9550     instead of accessing now non-existent class variables.
9551    
9552 bh 425 2003-02-24 Bernhard Herzog <[email protected]>
9553    
9554     * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Remove
9555     unneeded Shape() call. Rendering is substantially faster without
9556     it and it avoids some problems with broken shape files.
9557    
9558 frank 423 2003-02-20 Frank Koormann <[email protected]>
9559    
9560     Force minimal size of identify and label dialogs. The autosizing
9561     looked too ugly.
9562    
9563     * Thuban/UI/controls.py (RecordListCtrl): Set minimal width for columns.
9564     * Thuban/UI/labeldialog.py (LabelDialog.dialog_layout):
9565     Set size of listctrl.
9566     * Thuban/UI/identifyview.py (IdentifyView.__init__):
9567     Set size of dialog.
9568    
9569 jonathan 408 2003-02-19 Jonathan Coles <[email protected]>
9570    
9571     * test/test_classification.py, test/test_layer.py,
9572     test/test_load.py, test/test_map.py, test/test_session.py:
9573     Updated the tests to use the new functions that are in the
9574     respective classes.
9575    
9576     * Thuban/Model/classification.py (Classification):
9577     Uses the new ClassData* classes. Modification messages are
9578     passed up to the parent layer (if it exists).
9579     (ClassData): New class to encapsulate the common data in each
9580     classification property.
9581     (ClassDataDefault): Represents the Default class. data.
9582     (ClassDataPoint): Represents a single class. data point
9583     (ClassDataRange): Represents a class. range
9584     (ClassDataMap): Represents a class. map (unused).
9585    
9586     * Thuban/Model/color.py: Added Color.None to represent something
9587     with no color. Color.Black represents the color black.
9588     (NoColor): Helper class derived from Color to represent something
9589     with no color.
9590    
9591     * Thuban/Model/layer.py (Layer): Removed references to fill, stroke,
9592     stroke_width attributes. Made the 'classification' attribute private.
9593     New methods for setting/getting the classification.
9594    
9595     * Thuban/Model/load.py (ProcessSession): Use new methods on Layer
9596     to get the classifcation and use the new ClassData* classes to
9597     hold the classification data. Use Str2Num to convert numbers
9598     properly.
9599    
9600     * Thuban/Model/save.py (Saver): Use new Color and Classification
9601     methods
9602    
9603     * Thuban/UI/classifier.py (ClassGrid): New class to represent a
9604     custom grid.
9605     (ClassTable): Support for editing Values and Labels and for
9606     changing what type (point or range) of data is stored in each
9607     property based on how the user enters the data.
9608     (Classifier): Support for saving the new classifications and
9609     launching the dialog to edit a property.
9610     (SelectPropertiesDialog): New class for editing the visual
9611     properties of a classification (stroke color, width, and fill color)
9612     (ClassPreviewer): Took the Draw method from ClassRenderer and
9613     made most of it into this new class. Intend to use this class in
9614     the SelectPropertiesDialog for previewing changes.
9615    
9616     * Thuban/UI/renderer.py: Use new Color and Classification methods.
9617    
9618     * Thuban/UI/tree.py: Formatting changes.
9619    
9620     * Doc/thuban.dtd: Add 'label' element
9621    
9622     * Thuban/common.py: New. Contains common routines used throughout
9623     the code.
9624     (Str2Num): Takes a string and converts it to the "best" type of
9625     number.
9626    
9627 bh 405 2003-02-14 Bernhard Herzog <[email protected]>
9628    
9629     * Thuban/UI/view.py (MapCanvas.OnLeftUp): Make sure that the
9630     dragging flag is always set to 0 even when the tool implementation
9631     raises an exception
9632    
9633 bh 402 2003-02-11 Bernhard Herzog <[email protected]>
9634    
9635     * Thuban/UI/application.py (ThubanApplication.splash_screen): New
9636     method to create a splash screen.
9637     (ThubanApplication.ShowMainWindow): New. Show the main window.
9638     Needed so the splash screen can display the mainwindow
9639     (ThubanApplication.OnInit): Call the
9640     new splash_screen method to determine whether the application
9641     should display a splash screen. If it displays a splash screen do
9642     not immediately show the main window.
9643    
9644 jonathan 399 2003-02-11 Jonathan Coles <[email protected]>
9645    
9646     * Thuban/Model/classification.py: Added import line to fix
9647     feature conflicts between running on python2.2 and python2.1.
9648    
9649     * Thuban/UI/classifier.py (ClassTable): Didn't need to hang
9650     onto the clinfo parameter, so removed the deepcopy().
9651    
9652 jonathan 396 2003-02-10 Jonathan Coles <[email protected]>
9653    
9654 tkoester 403 * Thuban/Model/save.py (Saver.open_element, Saver.close_element):
9655 jonathan 396 Added element_open variable to track opening and closing of tags
9656     so that tags that don't span more than one line are closed with
9657     /> instead of </tag_name>. Use the GetDefault*() methods of
9658     the Classification class.
9659    
9660     * Thuban/Model/classification.py (Classificaton): Added set and
9661     get methods for the default data. The class also takes a layer
9662     reference so that modification messages can be sent. Fixed the
9663     methods to use the new ClassData class.
9664     (ClassData): New class to encapsulate the classification data
9665    
9666     * Thuban/Model/layer.py (Layer): Remove the
9667 tkoester 403 Set[Fill|Stroke|StrokeWidth]() methods. Code should call the
9668 jonathan 396 SetDefault*() methods on the layer's classification object.
9669 tkoester 403 (Layer.__init__): Use the new SetDefault*() methods in the
9670 jonathan 396 Classification class.
9671    
9672     * Thuban/Model/load.py (ProcessSession): Use the new ClassData
9673     object instead of a dictionary.
9674    
9675 tkoester 403 * Thuban/UI/classifier.py (ClassRenderer): New class to
9676 jonathan 396 draw the classifications in the dialog box's table.
9677     (Classifier): Modified to use the ClassRenderer class.
9678    
9679 tkoester 403 * Thuban/UI/mainwindow.py (MainWindow): Use the SetDefault*()
9680     methods of the Classification class.
9681 jonathan 396
9682     * Thuban/UI/renderer.py (MapRenderer): Use the Get*() methods
9683     of the ClassData class.
9684    
9685     * test/test_classification.py, test/test_layer.py,
9686     test/test_map.py, test/test_session.py: Fix the tests to work
9687     with the above code changes.
9688    
9689 jonathan 387 2003-02-03 Jonathan Coles <[email protected]>
9690    
9691     * Thuban/Model/classification.py (Classification): Added getNull()
9692     to return the NullData reference
9693    
9694     * Thuban/Model/layer.py (Layer.SetFill, Layer.SetStroke,
9695     Layer.SetStrokeWidth): Modified these functions to change the
9696     null data in the classification rather than keep these values
9697     directly in the Layer class. Menu options to change these values
9698     work again.
9699    
9700 jonathan 380 2003-01-28 Jonathan Coles <[email protected]>
9701    
9702 jonathan 384 * Thuban/UI/classifier.py (Classifier): Resolved merging conflicts.
9703 tkoester 403 Fixed crashing problem on some systems. Dialog box shows
9704 jonathan 380 classification data.
9705    
9706 jonathan 384 * Thuban/UI/tree.py (SessionTreeCtrl.add_items): Handle drawing
9707     Colors in the tree view.
9708    
9709     * Thuban/Model/layer.py (Layer.TreeInfo): Added a call to build
9710     the tree info for classifications. Commented out unnecessary lines.
9711    
9712     * Thuban/Model/classification.py (Classification.TreeInfo): New
9713     function to add information about the classification into the
9714     tree view.
9715    
9716 tkoester 403 2003-01-27 Jan-Oliver Wagner <[email protected]>
9717 jan 375
9718 tkoester 403 * Thuban/__init__.py (_): New.
9719 jan 375
9720     * Thuban/Model/classification.py, Thuban/Model/extension.py,
9721     Thuban/Model/layer.py, Thuban/Model/load.py, Thuban/Model/map.py,
9722 tkoester 403 Thuban/Model/session.py, Thuban/UI/application.py,
9723     Thuban/UI/classifier.py, Thuban/UI/context.py, Thuban/UI/controls.py,
9724     Thuban/UI/identifyview.py, Thuban/UI/labeldialog.py,
9725     Thuban/UI/mainwindow.py, Thuban/UI/menu.py, Thuban/UI/proj4dialog.py,
9726     Thuban/UI/renderer.py, Thuban/UI/tree.py, Thuban/Lib/connector.py,
9727     Thuban/Lib/fileutil.py: Replace user string by _() for i18n.
9728 jan 375
9729 jonathan 370 2003-01-27 Jonathan Coles <[email protected]>
9730    
9731 tkoester 403 * Thuban/Model/layer.py: Classification initialization calls.
9732 jonathan 370
9733 tkoester 403 * Thuban/Model/classification.py: Created class to encapsulate
9734     a layer classification. Supports specific data points and
9735     ranges.
9736 jonathan 370
9737 tkoester 403 * Thuban/Model/load.py: Added support for loading classification
9738     information.
9739 jonathan 370
9740 tkoester 403 * Thuban/Model/save.py: Added support for saving classification
9741     information.
9742 jonathan 370
9743 tkoester 403 * Thuban/UI/classifier.py: Initial class for a dialog box for
9744     specifying classification information.
9745 jonathan 370
9746 tkoester 403 * Thuban/UI/mainwindows.py: Support for opening the classifier
9747     dialog.
9748 jonathan 370
9749 tkoester 403 * Thuban/UI/renderer.py: Support for drawing a layer with the
9750     classification information.
9751 jonathan 370
9752 tkoester 403 * Data/iceland_sample_class.thuban: iceland_sample with
9753     classification data.
9754 jonathan 370
9755 tkoester 403 * test/test_classification: Tests for the Classification class.
9756 jonathan 370
9757 bh 359 2002-12-09 Bernhard Herzog <[email protected]>
9758    
9759 bh 361 * test/test_command.py: New. Tests for the command classes.
9760    
9761 bh 359 * Thuban/UI/command.py (ToolCommand): New class for tool commands.
9762     (Command.IsTool): New method to distinguish between command
9763     switching tools and other commands.
9764    
9765     * Thuban/UI/view.py (MapCanvas.SelectTool): New method to select
9766     the tool to avoid direct assignments to instance variables
9767     (MapCanvas.ZoomInTool, MapCanvas.ZoomOutTool, MapCanvas.PanTool)
9768     (MapCanvas.IdentifyTool, MapCanvas.LabelTool): Use SelectTool to
9769     change the tool
9770    
9771     * Thuban/UI/mainwindow.py (MainWindow.update_command_ui): If an
9772     active tool's command turns insensitive, disable the tool.
9773     (_tool_command): Use the new ToolCommand class
9774    
9775     * Examples/simple_extensions/simple_tool.py (simple_tool): Use the
9776     SelectTool method to change the tool
9777     (iconfile): Use the ToolCommand class
9778    
9779 bh 354 2002-12-03 Bernhard Herzog <[email protected]>
9780    
9781     * Thuban/UI/tree.py (SessionTreeCtrl.normalize_selection): Handle
9782     the case of selected items that are not children of Layers or Maps
9783     properly. Previously this bug would trigger an assertion in
9784     wxWindows.
9785    
9786 frank 352 2002-11-06 Frank Koormann <[email protected]>
9787    
9788 bh 354 * Thuban/UI/mainwindow.py: Altered the order of tools in the
9789     toolbar: First now are all navigation tools (Zoom In/Out, Pan,
9790     Full Extent).
9791 tkoester 403
9792 bh 349 2002-10-23 Bernhard Herzog <[email protected]>
9793    
9794     * setup.py (setup call): version now 0.1.3
9795    
9796     * MANIFEST.in: Add the files in test/
9797    
9798     * test/README: Add note about tests requiring the iceland data
9799    
9800     * Thuban/UI/mainwindow.py (MainWindow.About): Add 2002 to
9801     copyright notice.
9802    
9803 bh 344 2002-10-18 Bernhard Herzog <[email protected]>
9804    
9805     * test/test_map.py
9806     (TestMapWithContents.test_projected_bounding_box): Use an explicit
9807     epsilon.
9808    
9809     * test/support.py (FloatComparisonMixin.assertFloatEqual)
9810     (FloatComparisonMixin.assertFloatSeqEqual): give a more useful
9811     message if the assertion fails and don't return the return value
9812     of self.assert_. In assertFloatSeqEqual the return meant that not
9813     all items of the sequence were compared.
9814    
9815 bh 326 2002-09-20 Bernhard Herzog <[email protected]>
9816    
9817 bh 341 * test/test_fileutil.py: New. Test cases for Thuban.Lib.fileutil
9818    
9819     * Thuban/Lib/fileutil.py: Fixup some whitespace and typos
9820    
9821 bh 338 * test/test_map.py (TestMapWithContents.test_tree_info): Create
9822     the string with the bounding box on the fly because of platform
9823     differences in the way %g is handled.
9824    
9825     * test/test_layer.py (TestLayer.test_empty_layer): Create an empty
9826     DBFfile too because Thuban layers can't yet cope missing DBF
9827     files.
9828    
9829     2002-09-20 Bernhard Herzog <[email protected]>
9830    
9831 bh 326 * test/test_menu.py: Use initthuban instead of
9832     add_thuban_dir_to_path to initialize Thuban.
9833    
9834     * test/support.py (FloatComparisonMixin.assertFloatEqual): New.
9835     Mixin class for float comparisons
9836     (SubscriberMixin): New. Mixin class to test messages sent through
9837     the Connector class
9838    
9839     * test/README: Fix a typo and add the -v flag to the command for
9840     individual tests
9841    
9842 bh 335 * test/test_session.py: New. Test cases for Thuban.Model.session
9843    
9844     * test/test_proj.py: New. Test cases for Thuban.Model.proj
9845    
9846     * test/test_map.py: New. Test cases for Thuban.Model.map
9847    
9848     * test/test_layer.py: New. Test cases for Thuban.Model.layer
9849    
9850     * test/test_label.py: New. Test cases for Thuban.Model.label
9851    
9852     * test/test_connector.py: New. Test cases for Thuban.Lib.connector
9853    
9854     * test/test_color.py: New. Test cases for Thuban.Model.color
9855    
9856     * test/test_base.py: New. Test cases for Thuban.Model.base
9857    
9858 bh 322 2002-09-13 Bernhard Herzog <[email protected]>
9859    
9860     * Thuban/Model/session.py (Session.forwarded_channels): Forward
9861     the CHANGED channel too.
9862    
9863     * Thuban/Model/map.py (Map.forwarded_channels): Forward the
9864     CHANGED channel too.
9865     (Map.__init__): Call the Modifiable constructor as well.
9866    
9867     * Thuban/Model/base.py (Modifiable.UnsetModified): Issue a CHANGED
9868     event if the modified flag changes.
9869     (Modifiable.changed): Tweak the doc-string.
9870    
9871     * Thuban/UI/mainwindow.py (MainWindow.view_position_changed)
9872     (MainWindow.set_position_text): Put the code that puts the text
9873     with the mouse position into the status bar into the new method
9874     set_position_text so that it can overwritten in derived classes.
9875    
9876 bh 317 2002-09-12 Bernhard Herzog <[email protected]>
9877    
9878     * Thuban/UI/mainwindow.py (MainWindow.RunMessageBox): Center the
9879     message box on the main window.
9880    
9881 bh 313 2002-09-11 Bernhard Herzog <[email protected]>
9882    
9883     * Thuban/UI/mainwindow.py: Underline the 'x' in "Exit" instead of
9884     the 'E' because it's less likely to interfere with other menu
9885     entries.
9886 bh 315 (MainWindow.build_menu): remove an incorrect comment.
9887 bh 313
9888 bh 311 2002-09-10 Bernhard Herzog <[email protected]>
9889    
9890     * Thuban/UI/mainwindow.py (MainWindow.Map): New.
9891     (_tool_command): Add sensitive parameter
9892     (_has_visible_map): Sensitivity callback to tools and other
9893     commands that require a visible map. Use it in map_zoom_in_tool,
9894     map_zoom_out_tool, map_pan_tool, map_identify_tool, map_label_tool
9895     and map_full_extent
9896    
9897 bh 308 2002-09-06 Bernhard Herzog <[email protected]>
9898    
9899     * Thuban/UI/mainwindow.py (MainWindow.OnClose): Unsubscribe
9900     VIEW_POSITION
9901    
9902 tkoester 403 2002-09-04 Frank Koormann <[email protected]>
9903 frank 306
9904     * Resources/Bitmaps/fullextent.xpm: Updated Icon (removed "potatoe")
9905    
9906 bh 302 2002-09-02 Bernhard Herzog <[email protected]>
9907    
9908 bh 304 * Thuban/UI/view.py: Get rid of the idle redraw. This is done by
9909     wxWindows already and our implementation doesn't work correctly
9910     with wxGTK 2.3:
9911     (MapCanvas.__init__): Remove the instance variable
9912     (MapCanvas.OnPaint): Always call do_redraw when there's a map to
9913     be drawin
9914     (MapCanvas.OnIdle): Removed.
9915    
9916 bh 302 * Thuban/UI/view.py (MapCanvas.unprojected_rect_around_point): Add
9917     a parameter to determine the size of the rectangle.
9918     (MapCanvas.find_shape_at): Create the box around the point on a
9919     layer by layer basis and make the size depend on the shape type.
9920     This solves a problem with the selection of point shapes at the
9921     border of the layer's bounding box
9922    
9923 bh 292 2002-08-30 Bernhard Herzog <[email protected]>
9924    
9925 bh 300 * Thuban/UI/mainwindow.py (MainWindow.CanRemoveLayer): New method
9926     for the sensitivity of remove layer.
9927     (_can_remove_layer): New. Sensitivity callback for remove layer
9928     (Command layer_remove): Use _can_remove_layer
9929    
9930     * Thuban/Model/map.py (Map.CanRemoveLayer): New method to
9931     determine whether a given layer can be deleted.
9932    
9933 bh 297 * Thuban/UI/view.py (MapCanvas.__init__, MapCanvas.OnPaint)
9934     (MapCanvas.do_redraw): Get rid of the unused update_region
9935     instance variable
9936    
9937 bh 294 * Thuban/UI/view.py: Add/update some doc-strings.
9938    
9939 bh 292 * test/: new subdirectory with a bunch of unit tests.
9940    
9941     * test/README, test/test_table.py, test/test_save.py,
9942     test/test_menu.py, test/test_load.py: Initial set of tests and
9943     brief instructions on how to run them
9944    
9945 bh 287 2002-08-29 Bernhard Herzog <[email protected]>
9946    
9947 bh 291 * Thuban/UI/renderer.py (ScreenRenderer.draw_shape_layer): Handle
9948     arcs with multiple parts.
9949    
9950 bh 289 * Thuban/UI/view.py (ZoomInTool.MouseUp, ZoomOutTool.MouseUp):
9951     Handle degenrate rectangles.
9952    
9953 bh 287 * Thuban/Model/table.py: Make writing records work correctly:
9954     (Table.__init__): Keep track of whether the DBF is open for
9955     writing
9956     (Table.write_record): Open the DBF file for writing when necessary
9957    
9958 bh 285 2002-08-27 Bernhard Herzog <[email protected]>
9959    
9960     * Thuban/Model/table.py (Table.write_record, Table.__init__): Open
9961     dbf files only for reading by default. Use a new writable dbf
9962     object for writing.
9963    
9964 bh 278 2002-08-26 Bernhard Herzog <[email protected]>
9965    
9966 bh 282 * Thuban/UI/mainwindow.py: Refactor the context creation:
9967     (MainWindow.Context): New method to return a context
9968     (MainWindow.invoke_command, MainWindow.update_command_ui): Use the
9969     new method
9970    
9971 bh 278 * Thuban/UI/tableview.py (TableGrid, LayerTableGrid): Split the
9972     layer table specific code from TableGrid into LayerTableGrid
9973     (TableFrame, LayerTableFrame): Split the layer table specific code
9974     from TableFrame into LayerTableFrame
9975 bh 280 (LayerTableGrid.select_shape): Remove a debug print
9976 bh 278
9977     * Thuban/UI/mainwindow.py (MainWindow.LayerShowTable): Use the
9978     LayerTableFrame
9979    
9980 bh 277 2002-08-23 Bernhard Herzog <[email protected]>
9981    
9982     * Thuban/Model/layer.py (Layer.__init__): Make sure we have an
9983     absolute filename.
9984    
9985 bh 269 2002-08-22 Bernhard Herzog <[email protected]>
9986    
9987 bh 275 * Thuban/Model/table.py (Table.write_record): New method to write
9988     records.
9989 tkoester 403 (Table.__init__): Open the DBF file for writing too.
9990 bh 275
9991     * Thuban/UI/controls.py (RecordTable.SetValue): Write the value
9992     into the underlying table.
9993    
9994     * extensions/shapelib/shapefil.h (DBFCommit),
9995     extensions/shapelib/dbfopen.c (DBFCommit): New API function to
9996     commit any changes made to the DBF file.
9997    
9998 bh 271 * Thuban/UI/mainwindow.py (make_check_current_tool)
9999     (_tool_command): Put the code that generates the "checked"
10000     callback into a separate function so that we can reuse it
10001     elsewhere
10002    
10003 bh 269 * Thuban/Model/save.py (Saver): New class to handle serializing a
10004     session into an XML file. The main reason to introduce a class is
10005     that applications built on Thuban can derive from it so that they
10006     can save additional information in a session file.
10007     (save_session): Delegate almost all the work to the Saver class.
10008     Rename the filename argument to file because it may be a file like
10009     object now.
10010    
10011     * Thuban/Model/load.py: Get rid of the Python 1.5.2 compatibility
10012     code. Remove the little test code which would be executed when the
10013     module is run as a script which didn't work anymore since it can't
10014     import the other Thuban modules.
10015     (ProcessSession, load_session): Refactor the ProcessSession to
10016     have one method for each element start and end tag so that derived
10017     classes can easily override the processing of individual tags.
10018     Also, always parse with namespaces enabled because applications
10019     built on top of Thuban will likely use namespaces if they extend
10020     the session file format.
10021    
10022 bh 266 2002-08-21 Bernhard Herzog <[email protected]>
10023    
10024     * setup.py (ThubanInstall.run): Don't repr install_lib_orig
10025     because thubaninit_contents will do it for us.
10026    
10027 tkoester 403 2002-08-16 Jan-Oliver Wagner <[email protected]>
10028 jan 265
10029     * Thuban/UI/mainwindow.py: menu item 'show session tree' now disable if
10030     tree window already open
10031    
10032 bh 259 2002-08-15 Bernhard Herzog <[email protected]>
10033    
10034 bh 263 * Thuban/Model/layer.py (Layer.Destroy): Call the unboundd method
10035     with self.
10036    
10037     * Thuban/UI/view.py (MapCanvas.OnLeftUp): Only release the mouse
10038     when we have actually captured it.
10039    
10040 bh 259 * Thuban/Model/layer.py (Layer.Destroy): New. Explicitly close the
10041     shapefile and destroy the table.
10042    
10043     * Thuban/Model/table.py (Table.Destroy): New. Close the DBF file.
10044    
10045 bh 254 2002-08-14 Bernhard Herzog <[email protected]>
10046    
10047 bh 256 * Thuban/UI/controls.py (RecordTable.__init__): Remove the unused
10048     instance variable columns
10049     (RecordTable.GetTypeName): row and col may be negative in some
10050     cases.
10051    
10052 bh 254 * setup.py (InstallLocal.initialize_options)
10053     (InstallLocal.finalize_options, InstallLocal.user_options): New
10054     option create-init-file to build a thubaninit.py when running
10055     install_local
10056     (InstallLocal.run): Create the thubaninit.py module when requested
10057     (thubaninit_contents): Split the template into several parts and
10058     create a new function thubaninit_contents that creates the
10059     contents of a thubaninit module.
10060     (ThubanInstall.run): Use the new function to create the thubaninit
10061     module.
10062    
10063 bh 252 2002-07-30 Bernhard Herzog <[email protected]>
10064    
10065     * Thuban/UI/application.py (ThubanApplication.OnExit): Do some
10066     cleanup.
10067     (ThubanApplication.MainLoop): Extend to automatically call OnExit.
10068    
10069     * Thuban/Model/session.py (Session.Destroy): Don't bypass the
10070     direct base class' Destroy method.
10071    
10072     * Thuban/Model/map.py (Map.ClearLayers): New method to delete all
10073     layers.
10074     (Map.Destroy): Destroy the label_layer as well and call the
10075     inherited Desatroymethod first so that no more messages are
10076     issued.
10077     (Map.RaiseLayer, Map.LowerLayer): Only issue LAYERS_CHANGED
10078     message if the stacking order actually has changed. Add
10079     doc-strings.
10080     (Map.BoundingBox): Correct the doc-string.
10081     (Map.AddLayer, Map.RemoveLayer, Map.Layers, Map.HasLayers)
10082     (Map.ProjectedBoundingBox, Map.SetProjection): Add doc-strings.
10083    
10084     * Thuban/Model/label.py (LabelLayer.ClearLabels): New to delete
10085     all labels.
10086    
10087 bh 247 2002-07-29 Bernhard Herzog <[email protected]>
10088    
10089     * Thuban/Model/map.py (Map.subscribe_layer_channels)
10090     (Map.unsubscribe_layer_channels): Put the code that (un)subscribes
10091     to a layer's channels into separate methods.
10092     (Map.RemoveLayer, Map.AddLayer): Call the new methods
10093     (Map.Destroy): Unsubscribe from a layer's channels before
10094     destroying it.
10095    
10096     * Thuban/UI/view.py (MapCanvas.find_shape_at): Change the
10097     selected_layer parameter to searched_layer which is the layer to
10098     search in.
10099     (MapCanvas.SelectShapeAt): New parameter layer to restrict the
10100     search to that layer. Return the selected layer and shape.
10101    
10102     * Examples/simple_extensions/simple_tool.py (simple_tool): Fix a
10103     typo
10104    
10105 bh 238 2002-07-24 Bernhard Herzog <[email protected]>
10106    
10107 bh 243 * Thuban/UI/application.py (ThubanApplication.create_session):
10108     Extend the doc string.
10109     (ThubanApplication.subscribe_session)
10110     (ThubanApplication.unsubscribe_session): New methods to
10111     subscribe/unsubscribe to/from session channels.
10112     (ThubanApplication.SetSession): Call the new methods here.
10113     (ThubanApplication.maps_changed, ThubanApplication.set_map):
10114     Renamed set_map to maps_changed. Its now a subscriber for
10115     MAPS_CHANGED.
10116    
10117     * Thuban/UI/view.py (ZoomOutTool.MouseUp): Use the correct
10118     x-coordinate in case of simple clicks
10119    
10120     * Thuban/Model/base.py (Modifiable.changed): Apply the args tuple,
10121     don't pass it as a parameter
10122    
10123     * Thuban/Model/session.py (Session.RemoveMap): New
10124    
10125 bh 238 * Thuban/UI/mainwindow.py (MainWindow.__init__): Turn the initial
10126     window size into a parameter.
10127    
10128 bh 235 2002-07-23 Bernhard Herzog <[email protected]>
10129    
10130 bh 237 * Thuban/UI/menu.py (Menu.item_index): Also search for menus not
10131     just commands.
10132    
10133 bh 235 * Thuban/UI/mainwindow.py (MainWindow.__init__): Change the
10134     parameter list a bit to allow setting the window title and the
10135     initial message in the status bar. Update the callers.
10136    
10137     * Thuban/UI/application.py (ThubanApplication.OnInit)
10138     (ThubanApplication.CreateMainWindow): Put the mainwindow
10139     instantiation into a separate method so that it can be overridden
10140     by a subclass.
10141    
10142 bh 230 2002-07-19 Bernhard Herzog <[email protected]>
10143    
10144 bh 234 * Thuban/Model/session.py: Issue a CHANGED message every time
10145     another changed message is issued to make it easier to get
10146     notified of changes.
10147     (Session): Update the doc string
10148     (Session.forward): Issue changed-events as CHANGED as well.
10149     (Session.changed): Overwrite the inherited version to issue
10150     CHANGED events as well.
10151    
10152     * Thuban/UI/tree.py: We can now simply subscribe to the session's
10153     CHANGED channel to be informed of changes.
10154     (SessionTreeCtrl.session_channels): Not needed any longer.
10155 tkoester 403 (SessionTreeCtrl.unsubscribe_all, SessionTreeCtrl.session_changed):
10156 bh 234 Only have to (un)subscribe CHANGED
10157    
10158     * Thuban/Model/map.py (Map.TreeInfo): Deal better with empty maps.
10159    
10160 bh 230 * Thuban/UI/main.py, Thuban/UI/__init__.py: Move the work-around
10161     for the wxPython locale bug to __init__.py so that it's
10162     automatically executed by anybody using UI code from Thuban.
10163    
10164 bh 225 2002-07-18 Bernhard Herzog <[email protected]>
10165    
10166 bh 228 * Thuban/UI/main.py (main): app no longer needs to be global
10167    
10168     * Thuban/UI/mainwindow.py (MainWindow.__init__): Add application
10169     as parameter and store it in an instance variable
10170     (MainWindow.invoke_command, MainWindow.update_command_ui)
10171     (MainWindow.save_modified_session, MainWindow.NewSession)
10172     (MainWindow.OpenSession, MainWindow.SaveSession)
10173     (MainWindow.SaveSessionAs, MainWindow.ShowSessionTree): Use self's
10174     application object.
10175    
10176     * Thuban/UI/application.py (ThubanApplication.OnInit): Instantiate
10177     the main window with self.
10178    
10179 bh 225 * Thuban/UI/context.py: New module with the context class
10180    
10181     * Thuban/UI/command.py (Command): Update doc string.
10182    
10183     * Thuban/UI/mainwindow.py (MainWindow.invoke_command,
10184     MainWindow.update_command_ui): Pass an instance of the context
10185     class to the command's methods
10186     (check_current_tool, call_method): Handle the new context
10187     implementation
10188    
10189     * Examples/simple_extensions/simple_tool.py (simple_tool,
10190     check_simple_tool): Handle the new context implementation
10191    
10192     * Examples/simple_extensions/simple_command.py (simple_command):
10193     Handle the new context implementation. Update the comments about
10194     the context.
10195    
10196     * Thuban/UI/application.py (ThubanApplication.SetSession): Add
10197     doc-string
10198     (ThubanApplication.Session): New method to return the session
10199     object
10200    
10201     * Thuban/UI/tree.py (SessionTreeCtrl.update_tree): The
10202     interactor's selected_layer may not be a layer of the current
10203     session when the tree is updated while a new session is being set.
10204    
10205 bh 217 2002-07-17 Bernhard Herzog <[email protected]>
10206    
10207     * Thuban/UI/tree.py (color_string): Removed. No longer used.
10208     (SessionTreeCtrl.update_tree, SessionTreeCtrl.add_items): Split
10209     update_tree into update_tree and add_items. The tree now uses a
10210     more generic way to display the contents of the tree.
10211     (SessionTreeCtrl): Add a doc string explaining the TreeInfo method
10212    
10213     * Thuban/Model/layer.py (Layer.TreeInfo),
10214     Thuban/Model/extension.py (Extension.TreeInfo),
10215     Thuban/Model/map.py (Map.TreeInfo),
10216 tkoester 403 Thuban/Model/session.py (Session.TreeInfo):
10217 bh 217 Add TreeInfo methods to implement the new tree view update scheme
10218    
10219 bh 216 2002-07-16 Bernhard Herzog <[email protected]>
10220    
10221     * Thuban/UI/application.py: Don't use "import from" for the
10222     MainWindow. It can't always be resolved.
10223     (ThubanApplication.OnInit): change reference to MainWindow
10224     accordingly.
10225    
10226     * Thuban/UI/menu.py (Menu.SetItems): New method to replace a menu
10227     completely
10228    
10229 bh 213 2002-07-10 Bernhard Herzog <[email protected]>
10230    
10231     * setup.py (create_init_module): New configurable variable whose
10232     default depends on the platform we're running on.
10233     (ThubanInstall.initialize_options): Initialize
10234     self.create_init_module from the global create_init_module
10235     (ThubanInstall.user_options): indictate that the options
10236     create-init-module and init-module-dir have arguments.
10237    
10238     * setup.py: In the setup call change the version number to include
10239     cvs.
10240    
10241     * MANIFEST.in: Add the files in Examples
10242    
10243 bh 205 2002-07-09 Bernhard Herzog <[email protected]>
10244    
10245 bh 210 * setup.py: In the setup call, use the thuban homepage as the
10246     value of the url parameter.
10247    
10248 bh 208 * Examples: New subdirectory for examples.
10249    
10250     * Examples/simple_extensions/simple_tool.xpm,
10251     Examples/simple_extensions/simple_tool.py,
10252     Examples/simple_extensions/simple_command.py,
10253     Examples/simple_extensions/README: Simple examples showing how to
10254     add new commands and tools.
10255    
10256 bh 207 * setup.cfg (bdist_rpm): Add the default value for prefix and tell
10257     bdist_rpm that we also have an install script.
10258     (bdist_inno): Add 2002 to the copyright notice.
10259    
10260 bh 205 * setup.py: Create a file in python's site-packages directory to
10261     make installation of Thuban as a library easier.
10262     (ThubanInstall.user_options): Add two new options,
10263     create-init-module and init-module-dir
10264     (ThubanInstall.expand_with_pure_python_dirs): New method to expand
10265     filenames for installation in the default directories.
10266     (ThubanInstall.select_scheme, ThubanInstall.convert_paths): Extend
10267     the inherited methods to capture some filenames before they're
10268     transformed too much by distutils.
10269     (ThubanInstall.run): Create the init module if requested.
10270     (ThubanInstall.thuban_init_filename): New method to return the
10271     full name of the init module.
10272     (ThubanInstall.get_outputs): Append the filename of the init
10273     module.
10274    
10275 bh 202 2002-07-08 Bernhard Herzog <[email protected]>
10276    
10277 bh 205 * setup.py (thuban_bdist_rpm): Extend this version of bdist_rpm to
10278     handle the prefix properly which means that the default for the
10279     installation prefix should be /usr for RPMs and /usr/local when
10280     doing a normal source install.
10281     (bdist_rpm_install_script): Script to override the default install
10282     commands in the specfile generated by the bdist_rpm command.
10283     (thuban_bdist_rpm.user_options): Add a prefix option
10284     (thuban_bdist_rpm.initialize_options): Init the prefix option.
10285     Create the script files for the spec files as empty files here
10286     (thuban_bdist_rpm._make_spec_file): Override the inherited method
10287     to fill the script files with content.
10288    
10289 bh 202 * Thuban/Model/save.py (relative_filename): Wrapper around
10290     Thuban.Lib.fileutil.relative_filename that accepts an empty dir
10291     argument. save_session now automatically uses this version,
10292     solving a problem when saving to a relative filename.
10293    
10294     * setup.py: In the setup call, make sure that the library
10295     directories are under $prefix/lib not directly under $prefix.
10296    
10297 tkoester 403 2002-06-20 Jan-Oliver Wagner <[email protected]>
10298 jan 199
10299     * Thuban/Model/extension.py: new module to handle extension objects.
10300     * Thuban/Model/messages.py: new messages for extensions.
10301     * Thuban/Model/session.py (Session.Extensions, Session.HasExtensions,
10302     Session.AddExtension): new for handling extensions.
10303     Also some other minor changes to round up extension handling.
10304     * Thuban/UI/tree.py (SessionTreeCrtl:update_tree): Added visualization
10305     of Extension titles and title and names of its objects.
10306    
10307 bh 194 2002-05-29 Bernhard Herzog <[email protected]>
10308    
10309     * Thuban/UI/mainwindow.py (MainWindow.bind_command_events): Bind
10310 bh 202 the events for a command.
10311 bh 194 (MainWindow.add_toolbar_command, MainWindow.add_menu_command):
10312     Call bind_command_events to bind the events. add_toolbar_command
10313     can now bind events too so that it's possible to have commands
10314     that are only available through the toolbar.
10315     (MainWindow.init_ids): New instance variable events_bound to keep
10316     track of for which commands events have been bound.
10317    
10318 bh 190 2002-05-28 Bernhard Herzog <[email protected]>
10319    
10320     * Thuban/UI/menu.py: New module to build and manage menus.
10321    
10322     * Thuban/UI/mainwindow.py: Remove some unused imports.
10323     (MainWindow.__init__, main_menu): move the definition of the main
10324     menu from __init__ to the Menu instance main_menu.
10325     (MainWindow.build_menu_bar, MainWindow.build_menu): New methods to
10326     build the menu bar and sub-menus from a menu description.
10327    
10328     * Thuban/UI/application.py (ThubanApplication.OnInit): Read the
10329     startup file
10330     (ThubanApplication.read_startup_files): New method to run
10331     ~/.thuban/thubanstart.py
10332    
10333 bh 192 * Thuban/UI/mainwindow.py (MainWindow.__init__, main_toolbar):
10334     Move the toolbar definition to the Menu instance main_toolbar.
10335     (MainWindow.build_toolbar): New method to build the toolbar
10336     similar to the build_menu methods
10337    
10338 bh 184 2002-05-23 Bernhard Herzog <[email protected]>
10339    
10340 bh 186 * Thuban/UI/mainwindow.py (MainWindow.__init__): Fix spelling of
10341     layer_outline_color. Fix it in the definition of the command too.
10342    
10343 bh 184 * Thuban/UI/command.py (Command): Fix typo in doc string
10344    
10345 bh 182 2002-05-22 Bernhard Herzog <[email protected]>
10346    
10347     * Thuban/UI/mainwindow.py (MainWindow.RunMessageBox): Fix a typo
10348     in the docstring
10349    
10350 bh 175 2002-05-15 Bernhard Herzog <[email protected]>
10351    
10352 bh 180 * Thuban/Model/layer.py (Layer.open_shapefile): Set bbox to None
10353     when the shapefile is empty.
10354     (Layer.BoundingBox, Layer.LatLongBoundingBox): Both methods may
10355     now return None for empty shapefiles. Update doc-strings.
10356    
10357     * Thuban/Model/map.py (Map.BoundingBox): Add doc-string. Deal with
10358     the layer's bbox being None.
10359    
10360     * Thuban/UI/tree.py (SessionTreeCtrl.update_tree): Deal with the
10361     layer's bbox being None.
10362    
10363 bh 175 * Thuban/UI/view.py (MapCanvas.shape_selected): Only redraw when
10364     necessary.
10365     (MapCanvas.__init__): New instance variables, last_selected_layer
10366     and last_selected_shape to determine how the selection has
10367     changed.
10368    
10369     * Thuban/UI/tableview.py (TableGrid.__init__): Do not call
10370     AutoSizeColumns because it will cause a traversal of the entire
10371     table which for large .dbf files will take a very long time.
10372    
10373 bh 172 2002-05-14 Bernhard Herzog <[email protected]>
10374    
10375     * Thuban/Model/layer.py (Layer.open_shapefile): Choose a better
10376     maximum depth for the tree than shapelib does by default.
10377    
10378 bh 165 2002-05-10 Bernhard Herzog <[email protected]>
10379    
10380     * setup.py (py_modules): The shptree modules doesn't have a
10381     wrapper, so don't include it in the py_modules
10382    
10383 bh 163 2002-05-08 Bernhard Herzog <[email protected]>
10384    
10385     * extensions/shapelib/shptree.c (compare_ints): Make arguments
10386     const void * as in the qsort prototype
10387     (SHPTreeFindLikelyShapes): Remove some unused variables.
10388    
10389     * Thuban/UI/view.py (PanTool.MouseMove): Use the bitmap the view
10390     maintains to redraw the window during a drag.
10391     (MapCanvas.unprojected_rect_around_point): New method to determine
10392     a small region around a point for hit-testing.
10393     (MapCanvas.find_shape_at): Only test the shapes in a small region
10394     around the point.
10395    
10396     * setup.py: Increment the version to 0.1.2
10397    
10398     * Thuban/UI/tree.py (SessionTreeCtrl.unsubscribe_all): Remove a
10399     debug print and set session to None after unsubscribing
10400    
10401 bh 146 2002-05-07 Bernhard Herzog <[email protected]>
10402    
10403 bh 154 * Data/iceland_sample.session, Data/iceland_sample.thuban: Rename
10404     the file to have a .thuban extension.
10405    
10406 bh 152 * Thuban/UI/tree.py (session_channels): New class constant with
10407     all the session channels to subscribe to to update the tree
10408     (SessionTreeCtrl.session_changed): Remember the session so that we
10409     can unsubscribe properly. Use the new class constant to
10410     unsubscribe from the old session and subscribe to the new one.
10411     (SessionTreeCtrl.unsubscribe_all): New method to unsubscribe all
10412     subscriptions of the SessionTreeCtrl.
10413     (SessionTreeView.OnClose): Call the tree's unsubscribe_all method.
10414    
10415     * Thuban/UI/mainwindow.py (MainWindow.__init__): Add the "Show
10416     Session Tree" command to the file menu.
10417    
10418     * Thuban/UI/view.py (MapCanvas.do_redraw): Pass the entire bitmap
10419     as update_region to the renderer.
10420    
10421     * Thuban/UI/renderer.py
10422     (ScreenRenderer.layer_ids, ScreenRenderer.draw_shape_layer): The
10423     update box is now directly a tuple, not a wxRect anymore.
10424    
10425     * Thuban/Model/layer.py (Layer.ShapesInRegion): Remove some debug
10426     prints.
10427    
10428     2002-05-07 Bernhard Herzog <[email protected]>
10429    
10430 bh 146 * setup.py: Add the shptree extension module. See
10431     extensions/pyshapelib/ChangeLog for more details.
10432    
10433     * extensions/shapelib/shpopen.c, extensions/shapelib/shapefil.h,
10434     extensions/shapelib/dbfopen.c: Really update to the versions of
10435     shapelib 1.2.9. For some reason it wasn't really done on
10436     2002-04-11.
10437    
10438     * extensions/shapelib/shptree.c: Modified version of shptree.c of
10439     shapelib 1.2.9. The only real difference is the use of qsort
10440     instead of a bubble sort implementation
10441    
10442     * Thuban/Model/layer.py (Layer.__init__): New instance variable
10443     shapetree to hold the shapelib quadtree for the shapefile
10444     (Layer.open_shapefile): Create the quad tree.
10445     (Layer.ShapesInRegion): New method to return the ids of shapes in
10446     a given region using the quad tree.
10447    
10448     * extensions/thuban/wxproj.cpp (project_points): Fix some typos in
10449     comment
10450     (draw_polygon_shape): Accept both arcs and polygons.
10451     (initwxproj): Use the new PYSHAPELIB_IMPORT_API macro to import
10452     the api.
10453    
10454     * Thuban/UI/renderer.py (MapRenderer.layer_ids): New method to
10455     return the shape ids to be rendered in a given layer.
10456     (MapRenderer.draw_shape_layer): Call layer_ids to get the list of
10457     ids. Use draw_polygon_shape to draw arc shapes as well.
10458     (ScreenRenderer.RenderMap): New parameter for the rectangle that
10459     has to be updated
10460     (ScreenRenderer.layer_ids): Make use of the layer's quadtree by
10461     calling it's ShapesInRegion method.
10462    
10463     * Thuban/UI/view.py (MapCanvas.__init__): New instance variable
10464     update_region for the update region.
10465     (MapCanvas.OnPaint): Maintain the update region
10466     (MapCanvas.do_redraw): Pass the bounding box of the update_region
10467     to the renderer when drawing the bitmap. Reset the update_region.
10468    
10469 bh 129 2002-05-03 Bernhard Herzog <[email protected]>
10470    
10471 bh 131 * Thuban/UI/mainwindow.py (MainWindow.SaveSessionAs,
10472     MainWindow.OpenSession): Change the file extension of the session
10473     files to .thuban
10474    
10475 bh 129 * Thuban/Model/session.py (Session.AddMap, forwarded_channels):
10476     Move the map channels to be forwarded by the session into the
10477 bh 146 class constant with forwarded_channels. Also add
10478     LAYER_PROJECTION_CHANGED and LAYER_VISIBILITY_CHANGED to
10479     forwarded_channels
10480 bh 129
10481     * Thuban/Model/base.py (Modifiable.changed): Fix doc-string (a
10482     typo and some rewording).
10483    
10484 bh 126 2002-05-02 Bernhard Herzog <[email protected]>
10485    
10486     * Thuban/UI/view.py: Keep the temporary bitmap used during drawing
10487     around to speed up most redraws:
10488     (MapCanvas.__init__): New instance variable bitmap which holds the
10489     bitmap
10490     (MapCanvas.do_redraw): Redraw self.bitmap if necessary. Use
10491     self.bitmap to draw.
10492     (MapCanvas.full_redraw): New method to force a full redraw
10493     including the bitmap
10494     (MapCanvas.SetMap): Subscribe full_redraw instead of redraw to
10495     make sure the bitmap is redrawn.
10496     (MapCanvas.projection_changed, MapCanvas.set_view_transform,
10497     MapCanvas.shape_selected): Call full_redraw instead of readraw to
10498     make sure the bitmap is redrawn.
10499     (MapCanvas.OnSize): New method to handle size events so that the
10500     bitmap can be redrawn.
10501    
10502 bh 124 2002-04-29 Bernhard Herzog <[email protected]>
10503    
10504     * Thuban/UI/mainwindow.py (MainWindow.__init__): Subscribe to the
10505     canvas' VIEW_POSITION event
10506     (MainWindow.view_position_changed): Handler for VIEW_POSITION.
10507     Update the text in the status-bar accordingly.
10508    
10509     * Thuban/UI/view.py (MapCanvas): Derive from Publisher as well
10510     (MapCanvas.__del__): Implement because Publisher.__del__ has to be
10511     called.
10512     (MapCanvas.__init__): Bind EVT_LEAVE_WINDOW too. Initialize
10513     current_position
10514     (MapCanvas.set_current_position): New method to set
10515     current_position. Issue a VIEW_POSITION event
10516     (MapCanvas.CurrentPosition): New public method to return the value
10517     of current_position. Should be called when the VIEW_POSITION event
10518     is processed.
10519     (MapCanvas.OnLeftDown, MapCanvas.OnLeftUp, MapCanvas.OnMotion):
10520     Update the position.
10521     (MapCanvas.OnLeaveWindow): Set the position to None.
10522    
10523     * Thuban/UI/messages.py (VIEW_POSITION): New message for the
10524     position in the statusbar
10525    
10526 tkoester 403 2002-04-26 Frank Koormann <[email protected]>
10527 frank 120
10528     * Thuban/UI/mainwindow.py: AddLayer, Dialog title s/session/data
10529    
10530 tkoester 403 2002-04-24 Frank Koormann <[email protected]>
10531    
10532 frank 118 * Resources/Bitmaps/identify.xpm: shadow added
10533    
10534     * Resources/Bitmaps/fullextent.xpm: new
10535 jan 116
10536 tkoester 403 2002-04-22 Jan-Oliver Wagner <[email protected]>
10537 jan 116
10538 tkoester 403 * Thuban/UI/tree.py (update_tree): added test for None on map bounding
10539     box
10540 jan 114
10541 tkoester 403 2002-04-21 Jan-Oliver Wagner <[email protected]>
10542    
10543 jan 114 * Thuban/UI/proj4dialog.py (UTMProposeZoneDialog): new
10544    
10545     * Thuban/UI/tree.py (update_tree): added added map extent
10546    
10547     * Thuban/UI/mainwindow.py (_method_command): extended by parameter
10548 tkoester 403 icon; added map_full_extend as tool
10549 jan 114
10550 tkoester 403 2002-04-19 Jan-Oliver Wagner <[email protected]>
10551 jan 107
10552     * Thuban/UI/mainwindow.py (SaveSession): launch save as dialog for
10553     saving _new_ sessions
10554    
10555     * Thuban/Model/session.py (create_empty_session): new session
10556     don't have a filename (set to None)
10557    
10558     * Thuban/UI/tree.py (update_tree): added filename and modified flag
10559    
10560     * Thuban/Model/load.py (ProcessSession): convert projection
10561     parameters from unicode to regular string
10562    
10563     * Data/iceland_sample.session: Added UTM Zone 26 projection.
10564    
10565 bh 100 2002-04-11 Bernhard Herzog <[email protected]>
10566    
10567     * extensions/shapelib/shapefil.h, extensions/shapelib/shpopen.c,
10568     extensions/shapelib/dbfopen.c: Update to the versions of shapelib
10569     1.2.9
10570    
10571     * setup.py (Lib.wxproj extension): Don't link shpopen.c and put
10572     the pyshapelib directoy into the list of include dirs, so that
10573     pyshapelib_api.h can be found.
10574    
10575     * extensions/thuban/wxproj.cpp (pyshapelib_api): New variable that
10576     holds the pyshapelib C-API
10577     (draw_polygon_shape, point_in_polygon_shape, shape_centroid): Use
10578     pyshapelib_api to access the shapelib functions.
10579     (initwxproj): Import the c_api from the shapelib module and
10580     initialize pyshapelib_api.
10581    
10582 bh 89 2002-04-04 Bernhard Herzog <[email protected]>
10583    
10584 bh 91 * setup.py (thuban_bdist_rpm.initialize_options): Use
10585     initialize_options to create the scripts for the rpm.
10586    
10587 bh 89 * extensions/pyprojection/setup.py (PROJ4_PREFIX): Just use /
10588    
10589 bh 85 2002-04-03 Bernhard Herzog <[email protected]>
10590    
10591 bh 87 * setup.py: Increment version to 0.1.1
10592    
10593 bh 85 * Thuban/UI/mainwindow.py (MainWindow.__init__): Move the "Add
10594     Layer" and "Remove Layer" commands from the layer menu to the map
10595     menu
10596    
10597 bh 83 2002-02-15 Bernhard Herzog <[email protected]>
10598    
10599     * Thuban/Model/layer.py (Layer.Shape): list append only takes one
10600     argument (python <= 1.5.2 erroneously accepted multiuple
10601     arguments)
10602    
10603 bh 81 2002-02-04 Bernhard Herzog <[email protected]>
10604    
10605     * Thuban/UI/identifyview.py (IdentifyGridCtrl): New class to use a
10606     RecordGrid in the identifyview.
10607     (IdentifyView.__init__): Use IdentifyGridCtrl instead of
10608     IdentifyListCtrl. The grid allows editing of the values.
10609    
10610     * Thuban/UI/controls.py (RecordTable, RecordGridCtrl): New classes
10611     implementing a grid for a single row of a thuban table.
10612    
10613     * Thuban/UI/view.py (MapCanvas.SelectShapeAt): Search through all
10614     layers by default. Easier to use than the previous default of only
10615     searching through the select layer which meant that if no layer
10616     was selected, you couldn't select a shape.
10617    
10618     * Thuban/UI/tableview.py (TableGrid.__init__): Fix typo
10619    
10620     * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Honour the
10621     stroke_width attribute
10622    
10623     * Thuban/Model/save.py (save_session): Write the new stroke_width
10624     attribute
10625    
10626     * Thuban/Model/load.py (ProcessSession.startElement): Read the
10627     stroke_width attribute
10628    
10629     * Thuban/Model/layer.py (Layer.__init__): New parameter and
10630     instance variable stroke_width
10631     (Layer.SetStrokeWidth): Set the stroke_width.
10632    
10633 bh 72 2002-02-01 Bernhard Herzog <[email protected]>
10634    
10635     * extensions/thuban/wxproj.cpp (project_points): Fix two
10636     off-by-one errors in the last loop that joins the various parts
10637     together.
10638    
10639 bh 71 2002-01-14 Bernhard Herzog <[email protected]>
10640    
10641     * setup.py (data_dist.make_distribution): Fix some typos
10642    
10643 bh 70 2001-09-18 Bernhard Herzog <[email protected]>
10644    
10645     * README: Slight tweaking in preparation for the 0.1 release
10646    
10647     * setup.cfg: Add section for sdist to create both tgz and zip
10648     archives
10649    
10650     * setup.py: increase version number to 0.1
10651     (data_dist): New command class for data distribution
10652    
10653 bh 64 2001-09-14 Bernhard Herzog <[email protected]>
10654    
10655 bh 70 * Thuban/UI/identifyview.py (IdentifyListCtrl.selected_shape):
10656     Handle the case of no layer (i.e. layer is None) properly.
10657    
10658 tkoester 403 * Thuban/UI/proj4dialog.py (UTMDialog.__init__, Proj4Dialog.__init__):
10659 bh 70 Set the initial selection of the combo boxes to reflect the
10660     projection we're starting with in a way that works on windows,
10661     too.
10662    
10663 bh 64 * Thuban/Lib/connector.py (Connector.print_connections): Print the
10664     puiblisher's ids in hex to make it easier to compare them to the
10665     standard repr of python methods
10666    
10667     * Thuban/Model/map.py (Map.Destroy): Unsubscribe the label_layer
10668     messages
10669    
10670 bh 59 2001-09-13 Bernhard Herzog <[email protected]>
10671    
10672 bh 64 * Thuban/UI/tree.py (SessionTreeCtrl.OnSelChanged): Make sure to
10673     deselect the layer if no layer is selected
10674    
10675 bh 59 * Thuban/UI/view.py (MapCanvas.OnPaint): Only delay drawing to
10676     idle time when there actually is something to draw. If there's
10677     nothing to draw simply clear the window
10678     (MapCanvas.do_redraw): Call dc.EndDrawing and add some comments.
10679     (MapCanvas.SetMap): force a redraw in all cases because
10680     FitMapToWindow doesn't always do it.
10681     (MapCanvas.ZoomFactor): Add an optional parameter, center, to
10682     specify the point to move into the center of the window
10683     (ZoomOutTool.MouseUp, ZoomInTool.MouseUp): If the mouse wasn't
10684     dragged, zoon in/out by a factor of 2
10685 bh 64 (MapCanvas.find_shape_at): Iterate backwards (i.e. with decreasing
10686     index, i.e. reversed drawing order) so that objects appearing to
10687     be in from of others are selected first. This is probably mostly
10688     relevant for point shapes where the symbols used may overlap
10689 bh 59
10690     * Thuban/Model/session.py (create_empty_session): Unset the
10691     modified bit before returning it
10692    
10693     * Thuban/UI/mainwindow.py (MainWindow.NewSession): Use
10694     create_empty_session session to create the new, empty session.
10695    
10696     * Thuban/UI/mainwindow.py (MainWindow.__init__): Set the size of
10697     the tool bitmaps.
10698     (MainWindow.OnClose, MainWindow.save_modified_session): Separate
10699     the code that asks whether the session should be saved into the
10700     new method save_modified_session.
10701     (MainWindow.OpenSession, MainWindow.NewSession): Use the new
10702     method to save modified session here too.
10703    
10704 bh 55 2001-09-11 Bernhard Herzog <[email protected]>
10705    
10706     * setup.py (InnoIconItem): fix typo
10707    
10708     (thuban_bdist_inno.run):
10709     (bdist_inno.run): Move the decision not to create symlinks on
10710     non-nt platforms to thuban_bdist_inno and do it unconditinally
10711     since we never want to create the symlinks here
10712    
10713 bh 48 2001-09-10 Bernhard Herzog <[email protected]>
10714    
10715 bh 53 * Thuban/UI/mainwindow.py (MainWindow.IdentifyTool): Popup the
10716     identify view immediately
10717    
10718     * Thuban/UI/controls.py: New file with two classes RecordListCtrl
10719     and SelectableRecordListCtrl that implement the code shared by the
10720     identify view and the label dialog
10721    
10722     * Thuban/UI/identifyview.py (IdentifyListCtrl): Derive from the
10723     new class RecordListCtrl
10724    
10725     * Thuban/UI/labeldialog.py (LabelDialog.OnOK): Check whether the
10726     return value of GetValue is None instead of using it as a boolean
10727     directly so that Zero numbers are handled properly.
10728     (LabelListCtrl): Derive from the new class
10729     SelectableRecordListCtrl
10730    
10731 bh 48 * Thuban/UI/proj4dialog.py (Proj4Dialog.__init__):
10732     (Proj4Dialog.dialogLayout): Make the window resizable and set the
10733     size of the text control explicitly to make the sizers work on
10734     both Windows and X.
10735    
10736 bh 44 2001-09-07 Bernhard Herzog <[email protected]>
10737    
10738     * Thuban/UI/view.py (MapCanvas.find_shape_at):Add a new parameter
10739     that can limit the search to the currently selected layer.
10740     (MapCanvas.SelectShapeAt): Make sure that the currently selected
10741     layer stays selected even when no shape is found
10742 bh 46 (MapCanvas.FitRectToWindow): If the rect has zero with or zero
10743     height do nothing (avoids zero division errors)
10744 bh 44
10745 bh 32 2001-09-06 Bernhard Herzog <[email protected]>
10746    
10747 bh 42 * Thuban/UI/tree.py (SessionTreeCtrl, SessionTreeView.__init__):
10748     Correct the spelling of SessionTreeCtrl. dabbrev is too damn
10749     convenient :-)
10750     (SessionTreeCtrl.__init__, SessionTreeCtrl.update_tree): Introduce
10751     a new instvar layer_to_item to map layers to tree items
10752     (SessionTreeCtrl.layer_selected): Select the appropriate tree item
10753     to match the current selection in the interactor
10754    
10755 bh 40 * Thuban/UI/interactor.py (Interactor.SelectedLayer):
10756     (Interactor.HasSelectedLayer): New methods to query the current
10757     selection
10758    
10759     * Thuban/UI/mainwindow.py (MainWindow.current_layer):
10760     (MainWindow.has_selected_layer): Simply call the appropriate
10761     interactor method
10762    
10763     * Thuban/UI/mainwindow.py (MainWindow.__init__):
10764     (MainWindow.LayerShowTable):
10765     (MainWindow.identify_view_on_demand): Store the interactor in an
10766     instvar and use that reference instead of going through main.app
10767    
10768 tkoester 403 * Thuban/UI/mainwindow.py (MainWindow.ShowSessionTree):
10769     * Thuban/UI/application.py (ThubanApplication.OnInit):
10770 bh 40 * Thuban/UI/main.py (main): Create the session tree view in main
10771     with the new mainwindow method ShowSessionTree and not directly
10772     the application's OnInit method
10773    
10774     * Thuban/UI/tree.py (myTreeCtrlPanel):
10775     (SessioinTreeCtrl): Rename to SessioinTreeCtrl and turn it into a
10776     TreeCtrl isntead of a panel. This affects most method since we now
10777     refer to self instead of self.tree
10778     (SessionTreeView): New class implementing a non-modal dialog
10779     showing the session tree.
10780    
10781 bh 35 * Thuban/UI/mainwindow.py (MainWindow.LayerShowTable): Pass the
10782     layer to the tableview dialog.
10783    
10784     * Thuban/UI/tableview.py: Add some doc-strings
10785 tkoester 403 (TableGrid):
10786 bh 35 (TableGrid.OnRangeSelect):
10787     (TableGrid.OnSelectCell):
10788     (TableFrame.__init__):
10789     (TableFrame.row_selected):
10790     Selecting rows in the grid view now updates the selected shapes
10791     through the TableFrame. To achieve this we derive TableGrid from
10792     Publisher and introduce the message type ROW_SELECTED which the
10793     TableFrame subscribes to and which is issued by OnRangeSelect and
10794     OnSelectCell
10795    
10796     (DataTable.SelectRow): Removed because it's no longer needed in
10797     the row/shape selection scheme
10798    
10799 bh 32 * Thuban/UI/dialogs.py: New file implementing common classes for
10800     dialogs
10801    
10802     * Thuban/UI/tableview.py (TableGrid.__init__): Don't subscribe to
10803     the SELECTED_SHAPE message anymore. This is now handled by the
10804     parent.
10805     (TableGrid.select_shape): Only update the selection if the shape
10806     is not None.
10807     (TableFrame): Inherit from the new NonModalDialog class.
10808     (TableFrame.__init__, TableFrame.select_shape): Handle the
10809     SELECT_SHAPE message.
10810     (TableFrame.OnClose): Extend the inherited method to unsubscribe
10811     SELECT_SHAPE
10812    
10813     * Thuban/UI/mainwindow.py (MainWindow.init_dialogs):
10814     (MainWindow.add_dialog):
10815     (MainWindow.dialog_open):
10816     (MainWindow.remove_dialog):
10817     (MainWindow.get_open_dialog): New methods to maintain a dictionary
10818     of opened non-modal dialogs.
10819    
10820     (MainWindow.__init__): Initialize the new non-modal dictionary
10821     management code
10822     (MainWindow.LayerShowTable): maintain separate dialogs for each
10823     table using the non-modal dialog management code to only open a
10824     view once for each table.
10825    
10826     (MainWindow.IdentifyTool):
10827     (MainWindow.__init__):
10828     (MainWindow.identify_view_on_demand): Don't open the identify view
10829     in IdentifyTool anymore. This will be done automatically by the
10830     new method identify_view_on_demand which handles the
10831     SELECTED_SHAPE message so that the identify view will be opened on
10832     demand
10833    
10834     * Thuban/UI/identifyview.py (IdentifyListCtrl.__init__): Remove
10835     the interactor argument. The SELECTED_SHAPE message is now handled
10836     by the parent.
10837     (IdentifyView.__init__): Add the interactor argument so that we
10838     can handle the SELECTED_SHAPE message here
10839     (IdentifyView.selected_shape): New method to handle the
10840     SELECTED_SHAPE messages
10841    
10842     * Thuban/UI/identifyview.py (IdentifyView): Derive from the new
10843     NonModalDialog class
10844     (IdentifyView.OnClose): Extend the inherited version to
10845     unsubscribe SELECT_SHAPE
10846    
10847     * Thuban/Model/session.py (Session.UnsetModified): Remove debug prints
10848    
10849 bh 26 2001-09-05 Bernhard Herzog <[email protected]>
10850    
10851     * Thuban/UI/view.py (MapCanvas.__init__): New argument, interactor.
10852 tkoester 403
10853 bh 26 * Thuban/UI/mainwindow.py (MainWindow.__init__): New argument
10854     interactor to pass through to the MapCanvas
10855 tkoester 403
10856 bh 26 * Thuban/UI/application.py (ThubanApplication.OnInit): Use the new
10857     argument to the MainWindow constructor to get rid of the ugly hack
10858     that made main.app available early just so that the mapcanvas
10859     could access the interactor object.
10860    
10861 bh 19 2001-09-04 Bernhard Herzog <[email protected]>
10862    
10863 bh 22 * Thuban/UI/mainwindow.py (MainWindow.RunMessageBox): New method
10864     that runs a modal message box
10865     (MainWindow.OnClose): Use the new method
10866     (MainWindow.RemoveLayer): Just do nothing in case no layer is
10867     selected. The command should be grayed out anyway, so there's no
10868     need to pop up a message box.
10869     (MainWindow.AddLayer): Pop up a message box with an error message
10870     if the shape file can't be opened
10871    
10872     * Thuban/Model/layer.py (Layer.__init__): Open the shapefile
10873     immediately. This will cause an exception in case the file can't
10874     be opened and we can display an appropriate message.
10875    
10876 bh 19 * MANIFEST.in: Add extensions/pyprojection/LICENSE
10877    
10878     * setup.py (thuban_bdist_rpm): New class implementing a Thuban
10879     specific bdist_rpm command.
10880    
10881     * Thuban/UI/main.py: Catch ImportError exceptions when importing
10882     the locale module because it may not be available on some
10883     installations.
10884    
10885     * extensions/pyprojection/LICENSE: Copy of the license text in
10886     Projection.i. Having it in a separate file makes it easier to
10887     refer to license text in e.g. RPMs
10888    
10889 bh 18 2001-09-03 Bernhard Herzog <[email protected]>
10890    
10891 bh 19 * setup.py: use wx-config instead of wxgtk-config because it's
10892     more generic
10893    
10894     * setup.py (ThubanInstall.get_outputs): Add the symlink in
10895     <prefix>/bin to the outputs
10896     (ThubanInstall.link_file): New method to link files. We need this
10897     because the standard copy_files refuses to link non-existing
10898     files.
10899     (ThubanInstall.run): Remove the leading install root from the
10900     script filename if an install root was specified and use the new
10901     link_file method
10902 tkoester 403
10903 bh 18 * Thuban/UI/mainwindow.py (MainWindow.AddLayer): Fit the map to
10904     the window when the first layer is added to the map.
10905    
10906     * setup.py (ThubanInstall.run): Honor the build root (self.root)
10907     when linking thuban.py to <prefix>/bin
10908    
10909 bh 16 2001-08-31 Bernhard Herzog <[email protected]>
10910    
10911     * setup.py: In the setup call, the install parameters shouldn't
10912     have trailing slashes because distutils on non-posix platforms
10913     doesn't like that. The same applies to other directories like
10914     "Resources/Bitmaps"
10915    
10916     In the configuration section for nt, move the wxWindows directory
10917     optins into the part clearly marked as editable.
10918    
10919     (InstallLocal.initialize_options):
10920     (InstallLocal.user_options): remove the currently unused debug
10921     flag
10922     (thuban_build_py.find_all_modules): Add this method so that it
10923     works for our case of having packages and modules in one
10924     distribution as well.
10925     (ThubanInstall.initialize_options):
10926     (ThubanInstall.finalize_options):
10927     (ThubanInstall.user_options):
10928     (ThubanInstall.boolean_options): Add new options, do-symlink and
10929     extra files. Since these are the first ThubanInstall specific
10930     options, override user_options and boolean_options
10931     (ThubanInstall.run): Honor the new do-symlink and extra-files
10932     options.
10933     (ThubanInstall.get_outputs): Add to override the base-class's
10934     version and add the extra-files to the outputs
10935     (bdist_inno): New class for windows distributions with Inno Setup
10936     (InnoIconItem): Helper class for bdist_inno
10937     (thuban_bdist_inno): Thuban specific version of bdist_inno. Added
10938     this together with the appropriate parameters, to the setup call.
10939 tkoester 403
10940 bh 16 * setup.cfg (bdist_inno): added new section for the inno setup
10941     installer
10942    
10943     * Thuban/UI/tree.py (myTreeCtrlPanel.__init__): New inst var
10944     changing_selection to avoid recursive selection events when
10945     modifying the selection in response to a selection event.
10946     (myTreeCtrlPanel.normalize_selection): Set the new inst var when
10947     changing the tree's selection.
10948     (myTreeCtrlPanel.OnSelChanged): Only normalize the selection when
10949     we're not being called indirectly from normalize_selection.
10950    
10951     * Thuban/UI/mainwindow.py (MainWindow.update_command_ui): Call
10952     event.Check only if the command is actuall checkable.
10953     (MainWindow.__init__): Call the toolbar's Realize method to make
10954     sure that the items are actually shown
10955    
10956 bh 7 2001-08-28 Bernhard Herzog <[email protected]>
10957    
10958 bh 9 * setup.py: Fix some doc strings
10959    
10960 bh 7 * ChangeLog: started
10961    

Properties

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

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26