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

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

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 762 by jonathan, Tue Apr 29 09:02:33 2003 UTC revision 2517 by frank, Sun Jan 9 12:32:35 2005 UTC
# Line 1  Line 1 
1  2003-04-25  Jonathan Coles   <[email protected]>  2005-01-09  Frank Koormann <[email protected]>
2    
3            * Thuban/UI/mainwindow.py (MainWindow.DuplicateLayer):
4            BugFix 2901: Explicitly copy layers ClassificationColumn since it
5            is not part of the layers Classification.
6    
7    2005-01-03  Frank Koormann <[email protected]>
8    
9            * Thuban/UI/renderer.py (ScreenRendererdraw_selection_incrementally):
10            BugFix 2883: Former implementation only worked on classified point
11            layers: KeyError was raised, now use the default size if field is None.
12    
13    2004-12-27  Bernhard Reiter <[email protected]>
14    
15            svgexport 1.0.0cvs: Fixed label export.
16    
17            * Extensions/svgexport/test/test_svgmapwriter.py:
18            class TestSVGRenderer(): New class; new test test_label_font().
19    
20            * Extensions/svgexport/svgmapwriter.py
21            (SVGRenderer.label_font()): initialised Font size with self.factor now,
22            makes test_label_font happy.
23    
24            * Extensions/svgexport/TODO: crossed out fixed label export item.
25            Added item for options.
26    
27            * Extensions/svgexport/__init__.py: Bumped version to 1.0.0cvs.
28    
29    2004-12-27  Russell Nelson  <[email protected]>
30    
31            Middle mouse button pans.
32    
33            * Thuban/UI/view.py (MapCanvas.__init__): Subscribe also
34            OnMiddleDown and OnMiddleUp events.
35            (MapCanvas.OnMiddleDown): New. Activate the pan tool and remember the
36            previously used tool.
37            (MapCanvas.OnMiddleUp): New. Reactivate the remebered tool used before
38            pressing the middle mouse button.
39    
40    2004-12-27  Jan-Oliver Wagner <[email protected]>
41    
42            * Doc/manual/thuban-manual-de.xml: More translations.
43    
44    2004-12-23  Jan-Oliver Wagner <[email protected]>
45    
46            * Thuban/UI/projdialog.py (ProjFrame.load_user_proj): Added a
47            \n to stderr after the warnings. Thanks to Russell Nelson.
48    
49    2004-12-20  Nina Hueffmeyer <[email protected]>
50    
51            * Extensions/ogr/ogrshapes.py: Fixed some issues from
52            Bernhard (coding guidelines etc.). Additionally it is now possible to
53            display shapefiles containing feature collections (e.g.polygons
54            with holes). Works with gdal 1.2.1 now.
55    
56            * Extensions/ogr/test/test_OGRShapestore.py: Fixed some issues
57            from Bernhard (coding guidelines etc.). If ogr can't be imported,
58            tests are skipped now.
59    
60            * Extensions/ogr/ogrstart.py: Fixed some typings.
61    
62    2004-12-20  Bernhard Reiter <[email protected]>
63    
64            * Extensions/svgexport/TODO: updated to add support for
65            raster layers and labels for 1.0.1.
66    
67            * Extensions/svgexport/svgmapwriter.py (draw_raster_layer):
68            Issue a warning now.
69    
70    2004-12-19  Bernhard Reiter <[email protected]>
71    
72            * Extensions/svgexport/TODO: Added idea to support triggering
73            the application down the pipe.
74    
75    2004-12-19  Bernhard Reiter <[email protected]>
76    
77            svgexport: Improved code quality, mainly by better naming.
78    
79            * Extensions/svgexport/svgmapwriter.py:
80            DrawPath() renamed to DrawPolygonPath(),
81            added documentation, improved comments and variable names.
82            
83            * Extensions/svgexport/svgmapwriter.py,
84              Extensions/svgexport/test/test_svgmapwriter.py:
85            All using DrawPolygonPath() now, the default parameter closed=True
86            omitted.
87    
88            * Extensions/svgexport/test/test_svgmapwriter.py:
89            renamed test_polygon_opened() to test_polyline()
90            renamed test_transparent_polygon() to test_transparent_polyline()
91    
92    2004-12-18  Jan-Oliver Wagner <[email protected]>
93    
94            Some fixes of gns2shp extension.
95    
96            * Extensions/gns2shp/test/__init__.py: New. Make this directory a
97            package.
98    
99            * Extensions/gns2shp/test/test_gns2shp.py: Add some import paths
100            dynamically.
101    
102            * Extensions/gns2shp/test/README: Simplified description how to test.
103    
104            * Extensions/gns2shp/gns2shp.py (gns2shp): Fixed doc-string,
105            fixed some dimensions of fields according to the GNS documentation
106            which seems to change undocumented.
107            Now killing trailing \n and/or \r from MODIFY_DATE.
108            This fixes RT#2453.
109    
110    2004-12-18  Bernhard Reiter <[email protected]>
111    
112            svgexport 1.0.0: Treats holes and islands nicely. Documentation added.
113    
114            * Extensions/svgexport/test/test_svgmapwriter.py:
115            Added new tests: test_export_polygon_with_hole()
116            and test_polygon_with_hole().
117    
118            * Extensions/svgexport/svgmapwriter.py
119            (draw_polygon_shape()): Uses DrawPath correctly now.
120    
121            * Doc/manual/thuban-manual.xml: Added documentation for stable
122            extention svgexport.    
123            * Doc/manual/thuban-manual-de.xml: Copied English section about
124            svexport over.
125    
126            * Extensions/svgexport/__init__.py: Bumped version number to 1.0.0.
127    
128            * Extensions/svgexport/svgsaver.py,maplegend.py:
129            Moved from experimental to stable extension menu.
130    
131            * Extensions/svgexport/TODO: updated.
132    
133    
134    2004-12-18  Bernhard Reiter <[email protected]>
135    
136            Added Extensions/svgexport/TODO
137    
138    2004-12-18  Bernhard Reiter <[email protected]>
139    
140            Refactored in svgexport:
141            DrawPath replaces DrawPolygon; added newline in front of "M" in paths.
142    
143            * Extensions/svgexport/svgmapwriter.py
144            Added verbosity level 3 to print out polygon points.
145            (class Point): added __repr__
146            (class Brush, __str__()): Added space after ,.
147            (DrawPolygon): Renamed to DrawPath()
148            (DrawPath): Takes list of polygons as input now, adds \n before "M"s.
149            (DrawLines): Using DrawPath now.
150    
151            * Extensions/svgexport/test/test_svgmapwriter.py:
152            Replaced DrawPolygon() calls with DrawPath() and put the first argument
153            inside another list. Adapted test data with a newline before "M".
154    
155    2004-12-18  Bernhard Reiter <[email protected]>
156            
157            Refactored svgexport tests: 9 double tests runs eliminated;
158            code size reduced by 8 lines.
159    
160            * Extensions/svgexport/test/test_svgmapwriter.py:
161            (class TestWithDC): Renamed to BaseTestWithDC, moved to top.
162            (class BaseWithDCtools): New, subclass from BaseTestWithDC.
163            (class TestDrawSplines): now subclass from BaseTestWithDCtools,
164            this fixed the double running of the nine tests of TestVirtualDC.
165            (class TestVirtualDC): Using self.dc and self.file from setUp().
166    
167    2004-12-17  Bernhard Herzog  <[email protected]>
168    
169            Two windows specific fixes ported from thuban-1�0-branch:
170    
171            * Thuban/UI/about.py (unicodeToLocale): Use getdefaultlocale
172            instead of getlocale because getlocale doesn't return a usable
173            encoding name on a german windows 2000
174    
175            * setup.py: windows build: Removed the absolute path names and
176            made all prfixes relative to the directory containing setup.py.
177            Makes it a little easier to adapt to a different system.
178    
179    2004-12-16  Bernhard Herzog  <[email protected]>
180    
181            Add support for PostGIS tables with LINESTRING geometries.
182            Fixes RT#2299
183    
184            * Thuban/Model/postgisdb.py (shapetype_map): Add LINESTRING
185    
186            * test/postgissupport.py
187            (PostgreSQLServer.get_default_static_data_db): Rename the "roads"
188            table to "roads-multi" because it now uses MULTILINESTRING
189            geometries and introduce a new "roads" table that uses LINESTRING
190            (coords_to_multilinestring): Make the doc string more precise
191            (coords_to_linestring): New.  Create a LINESTRING WKT
192            representatin
193            (wkt_converter): Add coords_to_linestring
194            (upload_shapefile): Rephrase the doc-string a bit.
195    
196            * test/test_postgis_db.py (TestPostGISShapestoreArc)
197            (LineStringTests)
198            (TestPostGISShapestoreLineString)
199            (TestPostGISShapestoreMultiLineString): Split
200            TestPostGISShapestoreArc into a base class LineStringTests and two
201            derived classes TestPostGISShapestoreLineString for LINESTRING
202            geometries and TestPostGISShapestoreMultiLineString for
203            MULTILINESTRING geometries.  Most test methods are in the base
204            class with the exception of tests that explicitly check the raw
205            format.
206    
207    2004-12-16  Bernhard Herzog  <[email protected]>
208    
209            Make the test suite work with PostGIS 0.8.2 and PostgreSQL 7.4
210    
211            * test/postgissupport.py (find_postgis_sql): Different postgis
212            versions put the postgis.sql file into slightly different places
213            so we have to look in both.  The updated doc string describes this
214            is more detail.
215    
216            * test/test_postgis_db.py
217            (TestPostGISSpecialCases.test_column_name_quoting): The return
218            value of UniqueValues is unsorted, so it has to be sorted for
219            comparison.
220    
221    2004-12-16  Bernhard Herzog  <[email protected]>
222    
223            Fix for RT#2237
224    
225            * Thuban/UI/projdialog.py (ProjFrame._show_proj_panel): If the
226            panel to be shown is the UnknownProjPanel disable the OK and Try
227            buttons.  Otherwise enable them.
228            (ProjFrame.__GetProjection): The UnknownProjPanel returns None for
229            the parameters.  In that case __GetProjection also returns None
230            now.
231    
232    2004-12-15  Bernhard Herzog  <[email protected]>
233    
234            * Thuban/UI/classgen.py (GenQuantilesPanel.__init__): Set the
235            minimum number of classes to 2.  The calculate_quantiles needs at
236            least two and raises an exception otherwise.  
237            Fixes RT#2549
238    
239    2004-12-15  Bernhard Herzog  <[email protected]>
240    
241            * test/postgissupport.py (PostgreSQLServer.execute_sql): Extend to
242            so that it returns a result for select statements.
243            (PostgreSQLServer.server_version): New.  Return the version of the
244            server software.
245            (PostgreSQLServer.require_authentication): The format of
246            pg_hba.conf has changed between PostgrSQL 7.2 and 7.3.  Check the
247            server version and generate the file in the correct format
248    
249    2004-12-15  Bernhard Herzog  <[email protected]>
250    
251            * test/postgissupport.py (PostgreSQLServer.is_running): Fix typo
252            in the doc string and rephrase it a little.
253    
254    2004-12-15  Frank Koormann <[email protected]>
255    
256            * test/test_load.py (TestAltPath.checkSession): New, extended checks if
257            session has been loaded successfully. The check is called by the relevant
258            tests after executing load_session().
259    
260    2004-12-13  Bernhard Herzog  <[email protected]>
261    
262            Make sure the region used to determine which shapes are visible
263            actually matches the region on the printed page.  If this isn't
264            done properly some shapes might not be printed.  
265            Fixes RT #2692
266    
267            * Thuban/UI/view.py (MapPrintout.draw_on_dc): The region for the
268            renderer has to be at the same position as the mapregion
269    
270            * Thuban/UI/renderer.py (ExportRenderer.RenderMap): self.region
271            has to be moved by (self.shiftx, self.shifty) too.
272    
273    2004-12-13  Bernhard Herzog  <[email protected]>
274    
275            * libraries/pyprojection/Projection.i: Work around a bug in the
276            generated python code which leads to exception in the __del__
277            method when the constructor fails.  See the comments in the code
278            for more details.
279    
280            * libraries/pyprojection/Projection.py: Updated from Projection.i
281            with SWIG.
282    
283    2004-12-13  Bernhard Herzog  <[email protected]>
284    
285            * test/test_load.py (TestAltPath.test_01_single_path_error_fix)
286            (TestAltPath.test_02_path_error_fix_from_list)
287            (TestAltPath.test_05_path_error_fix_from_list_changed)
288            (TestAltPath.test_06_path_error_fix_from_list_fails): self.session
289            is destroyed in tearDown, so there's no need to do it in a test
290            case.
291    
292            * Thuban/Model/load.py (SessionLoader.open_shapefile): Remove a
293            debug print
294    
295    2004-12-13  Bernhard Herzog  <[email protected]>
296    
297            * Extensions/svgexport/test/test_svgmapwriter.py
298            (TestDrawSplines.setUp): Do not use super with the unittest
299            classes because in Python 2.2 they're still old-style classes.
300    
301    2004-12-13  Frank Koormann <[email protected]>
302    
303        Alternative Path feature: When loading a (moved) session where
304            shapefiles cannot be found, ask the user. Use the specified path
305            if further shapefiles are missing. However, ask the usr for confirmation
306            in such cases.
307    
308            * test/test_load.py (TestAltPath): New, tests for alternative path feature
309            in load_session()
310            (Shapefile_CallBack): Helper, implements controllable callback.
311    
312            * Thuban/UI/application.py (ThubanApplication.OnInit):
313            Added "alt_path" to self.path
314            (ThubanApplication.OpenSession): Added shapefile_callback as second
315            callback similar to db_connection_callback.
316            (ThubanApplication.run_alt_path_dialog): New, implementaion of
317            shapefile_callback. In addition to raising the dialog the control of
318            self.path('alt_path') is implemented here.
319    
320            * Thuban/Model/load.py (SessionLoader.__init__): Added shapefile_callback.
321            (SessionLoader.open_shapefile): Open shapefile, eventually with
322            alternative path. This wrapps the "theSession.OpenShapefile(filename)"
323            formerly used in start_fileshapesource()/start_layer().
324            (SessionLoader.start_fileshapesource): Call open_shapefile().
325            (SessionLoader.start_layer): Call open_shapefile().
326            (load_session): Added shapefile_callback.
327    
328            * Thuban/UI/altpathdialog.py: New, implements dialogs for alternative path
329            feature (search / check).
330            
331            * Doc/manual/thuban-manual.xml: Added documentation of new feature.
332    
333    2004-12-11  Bernhard Reiter <[email protected]>
334    
335             svgexport 0.9.2: Point size supports for maps.
336    
337            * Extensions/svgexport/svgmapwriter.py: Added import of SHAPETYPE_POINT
338            (def draw_point_shape): new parameter size defaults to 2 as before.
339            (draw_shape_layer_incrementally): Moved draw_func log line higher.
340            Added draw_func call with size when dealing with a point layer.
341    
342            * Extensions/svgexport/__init__.py: bumped version to 0.9.2.
343            
344    2004-12-11  Bernhard Reiter <[email protected]>
345    
346            Made sure that newlines are inserted in the svg path d attributes
347            to raise the chance that the line length will be below 255 characters,
348            as recommended by REC SVG 1.1 in section 8.3.1.
349    
350            * Extensions/svgexport/svgmapwriter.py(DrawPolygon):
351            Adding \n before L's and changed whitespace handling.
352    
353            * Extensions/svgexport/test/test_svgmapwriter.py:
354            Adapted tests to new whitespace handling of DrawPolygon.
355    
356    2004-12-11  Bernhard Reiter <[email protected]>
357    
358            * Doc/technotes/coding_guidelines.txt: easy typo fixed.
359    
360            * Extensions/svgexport/test/test_svgmapwriter.py:
361            Removed test_drawbezier in favour of new test_drawspline3 and
362            test_drawspline4 within new class TestDrawSplines(TestVirtualDC).
363            All only to test DrawSpline.
364    
365            * Extensions/svgexport/svgmapwriter.py(DrawSpline):
366            New implementation now really using the strange algorithm of
367            xfig 3.1's approximated splines and its conversion to postscript
368            with one twist: SVG can do quadratic beziers, so skipped translation
369            to cubic beziers.
370            (TestWithDC): Typo in comment fixed.
371    
372    2004-12-09  Martin Schulze  <[email protected]>
373    
374            * Thuban/Model/classgen.py: Added missing character encoding
375    
376            * Extensions/wms/properties.py (OpenWMSProperties): removed
377    
378            * Extensions/wms/parser.py (WMSCapabilitiesParser.error): Dropped
379            support for get_srs_discrepancies() since there are no
380            discrepancies anymore (was a thinko)
381    
382            * Extensions/wms/layer.py (WMSLayer.GetMapImg): Improved graphic
383            format priority now that more formats are supported globally by
384            the render engine.
385    
386    2004-12-08  Silke Reimer <[email protected]>
387            * Extensions/ogr/ogrshapes.py: Substituted ogr-method CloseRings
388            because it is not available in all versions of ogr
389    
390    2004-12-08  Bernhard Reiter <[email protected]>
391            * Extensions/ogr/__init__.py: Added empty __init__.py to heal
392            global tests until a real one is commited.
393    
394    2004-12-07 Nina H�ffmeyer <[email protected]>
395    
396            * /Extensions/ogr/: Adding a new extension to read shapefiles with
397            ogr. It is planned to add other vector formats.
398    
399            * /test/runtests.py: Adding tests from /Extensions/ogr/test/.
400    
401    2004-12-07  Jan-Oliver Wagner <[email protected]>
402    
403            * /Extensions/svgexport/test/test_svgmapwriter.py: Reverting
404            part of a (non-)fix to renable that the tests are always
405            executed.
406    
407    2004-12-07  Bernhard Reiter <[email protected]>
408    
409            * Extensions/svgexport/test/test_svgmapwriter.py:
410            Added test_drawbezier() to test DrawSpline().
411    
412            * Extensions/svgexport/svgmapwriter.py(DrawSpline):
413            Really implemented bezier drawing.
414    
415            * Extensions/svgexport/__init__.py: Bumped version of svgexport
416            to 0.9.1 because now the legend examples lines styles
417            will be drawing with beziers.
418    
419    2004-12-05  Martin Schulze  <[email protected]>
420    
421            * Thuban/UI/renderer.py (raster_format_map): Added PNG, TIFF and
422            GIF as supported bitmap image formats (helpful for the WMS extension)
423    
424    2004-11-30  Martin Schulze  <[email protected]>
425    
426            * Extensions/wms/test/test_ogclib.py (TestOGCLib.test_compareURLs):
427            Improved the test for the internal compare method
428    
429    2004-11-27  Jan-Oliver Wagner <[email protected]>
430    
431            * Thuban/UI/about.py (About.__init__): Added
432            Norbert Solymosi for hungarian translation and Ole Rahn
433            as contrbutor. Moved Bernhard Reiter from Contributor
434            to Developer.
435    
436    2004-11-27  Bernhard Reiter <[email protected]>
437    
438            * Extensions/svgexport/test/test_svgmapwriter.py:
439            Removed Jan from author list as he did not change enough significant
440            lines yet.
441    
442            * Extensions/svgexport/__init__.py: Added Bernhard as author
443            of the Extension.
444    
445    2004-11-27  Jan-Oliver Wagner <[email protected]>
446    
447            * po/hu.po: New. Hungarian translation. Contributed
448            by Norbert Solymosi.
449    
450    2004-11-26  Bernhard Herzog  <[email protected]>
451    
452            * Extensions/svgexport/test/test_svgmapwriter.py
453            (Testobjectexport.test_transparent_polygon): Commented out some
454            debug prints
455    
456    2004-11-24  Jan-Oliver Wagner <[email protected]>
457    
458            Fix broken tests for svg extension and added svg legend
459            to Experimental menu.
460    
461            * Extensions/svgexport/test/test_svgmapwriter.py: Fix to have
462            the test run correctly even if the extension is a package.
463            Also removed the "import Thuban" which makes no sense.
464    
465            * Extensions/svgexport/__init__.py: Fix to have the extensions'
466            test module also be executed from the global test routine.
467            This is done by looking for the absense of the DISPLAY variable.
468    
469            * Extensions/svgexport/maplegend.py: Moved the menu entry from Extensions
470            to Experimental menu since this module has yet not reached a stable
471            status (ie. 1.0).
472    
473    2004-11-22  Bernhard Reiter <[email protected]>
474    
475            * Extensions/svgexport/svgmapwriter.py:
476            Added verbose variable and some logging depending on it.
477            (class VirtualDC(XMLWriter)): Minor improvement in the polygon loop,
478            because counting i is not necessary.
479            (class Pen, class Brush): Added simple __str__ methods.
480            (SVGRenderer.draw_polygone_shape): Fix #2698 (transparent polygons are
481            not exported to svg file) Note: holes still unhandled.
482    
483            * Extensions/svgexport/test/test_svgmapwriter.py:
484                    Made a baseclass TestWithDC for test needed a DC.
485                    Added tests for bug #2698 (transparent polygons are not
486                    exported to svg file):
487                    Testobjectexport.test_transparent_polygon()
488    
489            * Thuban/Model/base.py (UnsetModified):
490            Fixed some typos in docstring.
491    
492            * Thuban/UI/baserenderer.py (BaseRenderer.draw_polygon_shape()):
493            Added hints on the used algorithm for handling holes.
494    
495    2004-11-20  Jan-Oliver Wagner <[email protected]>
496    
497            Some face lifting for the examples.
498    
499            * Examples/__init__.py: Make this directory a package.
500    
501            * Examples/simple_extensions/__init__.py: Make this directory a package.
502    
503            * Examples/simple_extensions/hello_world.py: Moved entry from Extensions
504            menu to Examples menu.
505    
506            * Examples/simple_extensions/simple_command.py: Some more comments,
507            minor changes.
508    
509            * Examples/simple_extensions/simple_tool.py: Minor changes.
510    
511    2004-11-20  Jan-Oliver Wagner <[email protected]>
512    
513            Changed way of extension registry for wms and added extension
514            registry for umn_mapserver extension.
515    
516            * Extensions/wms/__init__.py: Added registry entry and the importing
517            of the actual wms module. Included a test for the required PyOGCLib.
518    
519            * Extensions/wms/wms.py: Removed registry entry (moved to __init__.py).
520    
521            * Extensions/umn_mapserver/__init__.py: Added registry entry and the
522            importing of the actual umn mapserver management modules.
523            Included a test for the required Python MapScript.
524    
525    2004-11-20  Jan-Oliver Wagner <[email protected]>
526    
527            Changed way of extension registry for importAPR, bboxdump
528            and added extension registry for svgexport.extension registry for
529            svgexport.
530    
531            * Extensions/importAPR/__init__.py: Added registry entry and the importing
532            of the actual importAPR module.
533    
534            * Extensions/importAPR/importAPR.py: Removed registry entry (moved to
535            __init__.py).
536    
537            * Extensions/bboxdump/__init__.py: Added registry entry and the importing
538            ����of the actual bboxdump module.
539    
540            * Extensions/bboxdump/bboxdump.py: Removed registry entry (moved to
541            ����__init__.py).
542    
543            * Extensions/svgexport/__init__.py: Added registry entry and the importing
544            of the svgsaver module.
545    
546            * Extensions/svgexport/svgsaver.py: Moved the menu entry from Extensions
547            to Experimental menu since this module has yet not reached a stable
548            status (ie. 1.0).
549    
550    2004-11-18  Jan-Oliver Wagner <[email protected]>
551    
552            Now the hit test considers the size of point symbols.
553    
554            * Thuban/UI/viewport.py (ViewPort._hit_point): Added optional parameter
555            'size' defaulting to the previously fixed value 5.
556            Extended doc-string.
557            (Viewport._find_shape_in_layer): Resolved FIXME regarding flexibility
558            for symbols.
559            Now the size of the largest point symbol is determined to find out
560            about whether the point has been hit.
561            This fixes the problem that only clicks inside a fixed distance of
562            5 where found.
563    
564    2004-11-17  Jan-Oliver Wagner <[email protected]>
565    
566            Another open issue fixed regarding sizeable symbols: correct rendering of
567            selected symbols.
568    
569            * Thuban/UI/renderer.py (ScreenRenderer.draw_selection_incrementally):
570            Added consideration of the specific size of point symbols.
571            The property for each point symbol is retrieved and the size applied
572            for the rendering method.
573            Added doc-string.
574    
575    2004-11-16  Jan-Oliver Wagner <[email protected]>
576    
577            Changed way of Extension Registry for gns2shp and profiling.
578    
579            * Extensions/gns2shp/gns2shp.py: Removed registry entry (moved to
580            __init__.py).
581    
582            * Extensions/gns2shp/__init__.py: Added registry entry and the importing
583            of the actual gns2shp module.
584    
585            * Extensions/profiling/profiling.py: Removed registry entry (moved to
586            __init__.py).
587    
588            * Extensions/profiling/__init__.py: Added registry entry and the importing
589            of the actual profiling module.
590    
591    2004-10-28  Bernhard Reiter <[email protected]>
592    
593            * Extensions/svgexport/: Minor improvements to doc strings.
594    
595    2004-10-07  Jan-Oliver Wagner <[email protected]>
596    
597            Further elements for sizable point objects now
598            making this feature usable though not yet complete.
599    
600            * Thuban/Model/save.py (SessionSaver.write_classification): Write
601            attribute 'size' for cldata when the shape layer is of point type.
602            This also now make the test_load.py tests happy.
603    
604            * Thuban/Model/classgen.py (CustomRamp.GetProperties): Added size
605            gradient.
606    
607            * Thuban/UI/classifier.py (ID_SELPROP_SPINCTRL): Renamed to
608            ID_SELPROP_SPINCTRL_LINEWIDTH.
609            (ID_SELPROP_SPINCTRL_LINEWIDTH): New Id replaces ID_SELPROP_SPINCTRL.
610            (ID_SELPROP_SPINCTRL_SIZE): New Id.
611            (SelectPropertiesDialog.__init__): Added a second spin control
612            for the size in case the corresponding layer is of point type.
613            (SelectPropertiesDialog._OnSpin): Renamed to _OnSpinLineWidth.
614            (SelectPropertiesDialog._OnSpinLineWidth): New. Former _OnSpin.
615            (SelectPropertiesDialog._OnSpinSize): New. Set size of property
616            and refresh preview.
617    
618    
619    
620    2004-10-04  Martin Schulze  <[email protected]>
621    
622            * Extensions/wms/test/test_parser.py
623            (TestWMSCapabilitiesParser.test_compareLists): Added missing
624            self-test for compareLists()
625            (TestWMSCapabilitiesParser.test_compareDicts): Added missing
626            self-test for compareDicts()
627            (TestWMSCapabilitiesParser.test_compareLists): Adding more tests
628            to verify the test routine fails with non-equal arguments
629            (TestWMSCapabilitiesParser.test_compareDicts): Adding more tests
630            to verify the test routine fails with non-equal arguments
631    
632    2004-10-03  Jan-Oliver Wagner <[email protected]>
633    
634            First elements for sizeable point objects.
635    
636            * Resources/XML/thuban-1.1.dtd: Added size attribute to cldata.
637    
638            * Data/iceland_sample_size.thuban: New. Sample for sized point objects.
639    
640            * test/test_load.py (ClassificationTest.TestLayers): Added SetSize in case
641            of a corresponding argument is given.
642            (TestSymbolSize): New. Test the size attribute of cldata.
643    
644            * Thuban/Model/classification.py: Removed some trailing whitespaces.
645            (ClassGroupProperties.__init__): Set default size.
646            (ClassGroupProperties.SetProperties): Set the size.
647            (ClassGroupProperties.GetSize): New. Return the size.
648            (ClassGroupProperties.SetSize): New. Set the size.
649            (ClassGroupProperties__eq__): Compare also size.
650            (ClassGroupProperties__repr__): Print also size.
651    
652            * Thuban/Model/load.py (SessionLoader.start_cldata): Also parse
653            the size attribute.
654    
655            * Thuban/UI/classifier.py (ClassDataPreviewer.Draw): Added doc-string.
656            Also, now there is a return value that indicates whether the drawing
657            size exceeded the given rect extent and if so the new extent.
658            Finally, point objects are drawn depending on the size. If either
659            the width or height is exceeded, the new extent is returned.
660            (ClassRenderer.Draw): Now when calling the previewer drawing function,
661            evaluate the return value and, if not None, adapt the grid widget size
662            accordingly and redraw again.
663    
664            * Thuban/UI/baserenderer.py (BaseRenderer.draw_shape_layer_incrementally):
665            If the draw function is for points, call it with the size as additional
666            parameter.
667            (BaseRenderer.draw_point_shape): Added additional, optional parameter for
668            the size. Compute the radius using the size.
669    
670            * Extensions/importAPR/apr.py (APR_BMkSym.GetThubanProp): Now
671            that Thuban supports size, apply this correctly.
672    
673            * Extensions/importAPR/importAPR.py: Bumped version to 0.1.1.
674    
675    2004-10-03  Jan-Oliver Wagner <[email protected]>
676    
677            * Doc/manual/thuban-manual-de.xml: Started translation of
678            Map chapter.
679    
680    2004-10-01  Martin Schulze  <[email protected]>
681    
682            * Extensions/wms/properties.py (wmsProperties.__init__): Extended
683            argument for general use through properties-dialog selector
684            
685            * Thuban/UI/classifier.py: Register properties dialog classes for
686            both provided layer classes/types.
687    
688            * Thuban/UI/mainwindow.py (MainWindow.OpenLayerProperties): The
689            map can be retrieved through the parent which is passed to the
690            constructor anyway and doesn't require an argument of its own,
691            required for the unification of arguments for general use through
692            properties-dialog selector.
693            (MainWindow.OpenOrRaiseDialog): Move the logic for checking
694            whether a dialog is already opened (and raising it to the users
695            attention) and creating a new dialog into a function of its own
696            (MainWindow.OpenLayerProperties): Use the new OpenOrRaiseDialog()
697            method
698            (MainWindow.OpenLayerProperties): Utilise the new ClassMapper for
699            global registration of properties dialog classes (which are indeed
700            layer-specific).
701    
702            * Thuban/UI/classifier.py (Classifier.__init__): Unify arguments
703            for general use through properties-dialog selector, the map can be
704            retrieved through the parent and doesn't require an argument of
705            its own.
706    
707            * Extensions/wms/wms.py: Register the properties dialog class for
708            the provided WMS layer
709    
710    2004-09-28  Jan-Oliver Wagner <[email protected]>
711    
712            New feature: Registry for Extensions.
713    
714            * Thuban/UI/extensionregistry.py: This module defines a registry for
715            Extensions.
716    
717            * Thuban/UI/about.py (About.__init__): Added description
718            of the registered extensions with all of the information.
719    
720            * Thuban/Model/extension.py (Extension): Improved doc-string.
721    
722            * Extensions/gns2shp/gns2shp.py, Extensions/importAPR/importAPR.py,
723            Extensions/bboxdump/bboxdump.py, Extensions/profiling/profiling.py,
724            Extensions/wms/wms.py: Added registration of the extension.
725    
726    2004-09-27  Bernhard Reiter <[email protected]>
727    
728            More fixes to svgexport to make used ids unique and
729            conforming to XML's Name production.
730    
731            * Extensions/svgexport/test/test_svgmapwriter.py: Added new tests
732            test_xml_id_constraints(), test_make_ide_nosetbaseid() and
733            test_make_id_nonintegersetid().  Switched SetID and SetBaseID.
734            Added Bernhard R. as author.
735            * Extensions/svgexport/svgmapwriter.py (make_id): Using "_" as
736            concatenation char now (makes test_make_ide_nosetbaseid() valid).
737            Also transform second id part with "%d" and catch the TypeError
738            to raise SVGMapWriterError (making test_make_id_nonintegersetid() ok).
739            Corrected typo inBernhard's author line.
740            (SetBaseID): Return the transformed base id. Transform characters
741            which are not alnum() or in ".-_" to binascii.b2a_hex(). Added
742            import binascii. If to be set string starts with "xml" or so, add "t".
743            (draw_shape_layer_incrementally): use the returned value of SetBaseID
744            for used_baseids checks.
745    
746    2004-09-25  Bernhard Herzog  <[email protected]>
747    
748            * test/test_layer.py (TestLayer.test_arc_layer_with_projection):
749            Remove a debug print and some tab characters.
750    
751    2004-09-25  Bernhard Reiter <[email protected]>
752    
753            * Extensions/svgexport/svgmapwriter.py: Added Bernhard R. as Author.
754            (SetBaseID, SetID, make_id): Improved docstring comments to explain
755            the interaction of the three functions and the XML id contrains.
756    
757    
758    2004-09-23  Jan-Oliver Wagner <[email protected]>
759    
760            * Doc/ThubanModel.xmi: New. UML file for Thuban Model
761            Module.
762    
763            * Doc/README: Added info on ThubanModel.xmi.
764    
765    2004-09-23  Jan-Oliver Wagner <[email protected]>
766    
767            * Doc/README: New. Some info about how to generate technical
768            documentation from the source code.
769            This text was send to the Thuban developer mailing list on
770            September 21st 2004 by Bernhard Reiter.
771    
772    2004-09-21  Bernhard Reiter <[email protected]>
773    
774            Improved the svgexport to only use unique ids. Will issues
775            an error message dialoge when two layer names are the same.
776            ShapeIDs are now added with a dash within the svg ids.
777    
778            * Extensions/svgexport/svgmapwriter.py (SVGMapWriterError): New.
779            * Extensions/svgexport/test/test_svgmapwriter.py: Added imports
780            (TestSVGRenderer): New test class with test_make_in() and
781            test_check_for_layer_name_clash()
782            * Extensions/svgexport/svgmapwriter.py (SVGRenderer): Fixed __init__()
783            and draw_shape_layer_incrementally() to not use a baseid twice,
784            satisfying test_check_for_layer_name_clash()
785            (VirtualDC.make_id): Use a dash between baseit and id, satisfies
786            test_make_in().
787            * Extensions/svexport/svgsaver.py: Import SVGMapWriterError, wxOK
788            and wxICON_HAND.
789            (write_to_svg): Put dc and rendering in a try statement and on
790            catching SVGmapWriterError notify the user and delete the target file.
791    
792    2004-09-20  Bernhard Reiter <[email protected]>
793    
794            * Model/base.by, Model/layer.py: Fixed typos in docstrings.
795    
796    2004-09-03  Jan Sch�ngel  <[email protected]>
797    
798            * Extensions/umn_mapserver/mapfile(MF_Class.add_thubanstyle): Fix a
799            small bug with the line color. Now the line color will now only set
800            if it is set in Thuban an not Transparent.
801            
802            * Extensions/umn_mapserver/mf_export(tblayer_to_map): Fixed a bug with
803            deleting the layers from mapfile. Now all layers will delete backwards
804            from the last.
805    
806    2004-08-20  Silke Reimer <[email protected]>
807    
808            * Thuban/Model/layer.py:
809            Fixes bug in projection handling: Otherwise very large region might not
810            have valid values in the layer's projection.
811    
812    2004-08-20  Silke Reimer <[email protected]>
813    
814            * Thuban/UI/about.py:
815            small changes to be consistent with coding style.
816              
817    2004-08-13  Martin Schulze  <[email protected]>
818    
819            * Extensions/wms/test/test_ogclib.py (TestOGCLib.compare_URLs):
820            Adjusted a comment
821    
822    2004-08-11  Silke Reimer <[email protected]>
823    
824            * Thuban/UI/about.py: Small changes to encoding related stuff to avoid
825                    too many and too enhanced imports of locale
826    
827    2004-08-10  Silke Reimer <[email protected]>
828    
829            * Thuban/UI/about.py: Fixed encoding problem of about dialog: Added
830                    function unicodeToLocale() to convert special characters to users
831                    locale encoding
832    
833    2004-08-10  Jan-Oliver Wagner <[email protected]>
834    
835            * Doc/technotes/coding_guidelines.txt: Added rule 'Method names start with
836            lower case letter'
837    
838    2004-08-09  Jan Sch�ngel  <[email protected]>
839    
840            * ChangeLog: Rewrite the last ChangeLog entry to follow
841            the standard way.
842    
843            * Extensions/umn_mapserver/mapfile: Moved the import AnnotationLayer to
844            the function where it is needed, because it don't works if it stands
845            at the beginning.
846            (MF_Layer.__init__): Removed the extra numclassed variable. Now
847            numclasses from the mapscript will be used.
848            (MF_Layer.get_index): New. Return the index of the layer in mapfile.
849            (MF_Layer.set_classes): New. A Classlist will be set to the layer.
850            (MF_Layer.set_metadata): New. A Metadata mapscript object will set.
851            (MF_Layer.remove_allclasses): New. All class of the layer will remove.
852            (MF_Map.create_new_layer): New. A new Layer is created and associated
853            with the mapscript object.
854            (MF_Map.set_layerorder): New. The Layer order like in thuban is set in
855            the mapscript.
856            (MF_Map.add_thubanlayer): Now a new layerobj is created if no one is
857            linked to the layer in thuban, else the layerobject linked to the
858            thubanlayer will be used.
859            AnnotationLayer will now store the filename of the shapefile.
860            (MF_Map.remove_layer): If a layer is removed the associated object
861            must be set new.
862            
863            * Extensions/umn_mapserver/mf_export.py(tb_layer_to_map): Add all
864            layers which are exists in thuban to the mapobj. All removed Layers
865            will be removed from the mapobj.
866            Added comments to all functions.
867            (thuban_to_map): No layer will be removed here.
868            
869            * Extensions/umn_mapserver/mf_handle.py
870            (_has_umn_mapobj_and_selectedlayer): Activating the layer menu. Now
871            Layersettings for the mapserver kann be edited.
872    
873            * Extensions/umn_mapserver/mf_import.py: Now all layers which are
874            imported, will be linked with the associated MF_Layer.
875            (import_mapfile): All layers, which are not selected, will be removed.
876            Disable the "import layer from mapfile" menu option.
877    
878            * Extensions/umn_mapserver/sample/iceland.map: Set the status of the
879            Annotation Layer from DEFAULT to OFF. The DEFAULT setting turns the
880            layer on permanently.
881    
882    2004-08-03  Jan Sch�ngel  <[email protected]>
883    
884            * Extensions/umn_mapserver/mapfile.py(MF_Metadata.remove_allmetadata):
885            New. This function removes all metadata
886            (MF_Layer.set_group): New. Set the group setting.
887            (MF_Layer.get_group): New. Get the group setting.
888            (MF_Map): Removed the extra numlayers variable, used the mapscript
889            parameter instead.
890            (MF_Map.get_numlayers): New. This get numlayers.
891            (MF_Map.remove_all_layers): New. Removes all layers from the mapobj.
892            (MF_Map.add_thubanlayer): Replaced the exception handling by a check
893            if the object is an instance. Also added the annotation layer here to
894            export, but only the layer is created in the mapfile.
895    
896            * Extensions/umn_mapserver/mf_export.py(export_mapfile): Removed
897            the check if a mapobj exist, because its not needed anymore. The
898            export function is only available if a mapobj exist.
899            Use the new function to remove all layers.
900            
901            * Extensions/umn_mapserver/mf_handle.py(Layer_Dialog): Added a group
902            option and the metadata button. The layer dialog is temporary disabled.
903            (Metadata_CustomDataTable): Added some functions to show the grid
904            correct.
905    
906            * Extensions/umn_mapserver/mf_import.py: Moved the code for showing
907            the number of layer from import_mapfile to this function.
908            (AnnotationLayer): New. This Class shows the Annotation layer in
909            thuban. The layer don't do anything. It's only to show the layer
910            and to save the layer order.
911            (add_annotationlayer): New. Import an annotation layer to thuban.
912            (select_layer2import): New. Import only layers to thuban and not
913            the other settings like projection or scalebar.
914            (create_new_mapfile): Moved the _has_umn_mapobj function and the
915            create_new_mapfile functions from mf_handle.py to mf_import.py.
916            
917            * Extensions/umn_mapserver/sample/iceland.map: Added the group
918            parameter to the roads and cultural layers. Also added a new
919            Annotation Layer for the cultural points.
920    
921            * Extensions/umn_mapserver/sample/iceland.html: Added the select
922            option for the annotation layer.
923    
924            * Extensions/umn_mapserver/sample/index.html: Added the start
925            parameter for the annotation layer.
926    
927    2004-08-01  Jan-Oliver Wagner <[email protected]>
928    
929            * Doc/manual/thuban-manual-de.xml (Chapter Session Management):
930            translation completed.
931    
932            * Doc/manual/thuban-manual.xml (Chapter Session Management):
933            Fixed unprecise description for Save Session.
934    
935    2004-07-31  Jan-Oliver Wagner <[email protected]>
936    
937            Started translation of Users Manual into german.
938    
939            * Doc/manual/thuban-manual-de.xml: New. German Users Manual.
940    
941            * Doc/manual/Makefile: Added build instructions for german
942            users manual.
943    
944            * Doc/manual/thuban-manual.xml: Minor corrections in Introduction.
945    
946    2004-07-28  Jan Sch�ngel  <[email protected]>
947    
948            * Extensions/umn_mapserver/mapfile.py(MF_Metadata): Changed all class
949            functions. Now all metadata will handle by the function and its not
950            needed to initialize it from outside. Therefor the associated mapobj
951            will be stored in the Metadata Object. So we can use the special
952            functions from the associated mapobj to get the Metadata.
953            Therefor all initialization code for the metadata is removed from the
954            other classes.
955            (MF_Layer): Added a function to get the metadata object.
956            (MF_Map): Added a function to set the mappath, the path where
957            the mapfile ist stored.
958    
959            * Extensions/umn_mapserver/mf_export.py(thuban_to_map): Changed the code
960            to set the extent in the mapfile. Now the code is set by the displayed
961            data in the Thuban-view.
962            (export_mapfile): The shapepath is now set empty, until relative
963            pathnames are supported.
964    
965            * Extension/umn_mapserver/mf_handle.py: Added a dialog to handle
966            metadata. Yet only mapfile metadata are supported. Layer and class
967            supported are not implemented.
968            Added a dialog to handle layer informations. The dialog only shows the
969            selected layer at the moment.
970    
971            * Extensions/umn_mapserver/mf_import.py(import_mapfile): Changed the
972            code for setting the extent in thuban. Now the extent is set to the
973            given extent from the mapfile.
974            Fixed a logical mistake. Now the extent is set when realy a layer is
975            loaded, and not if one is selected to load.
976    
977            * Extensions/umn_mapserver/sample/iceland.html: Added code to zoom and
978            move the shown map in the browser.
979    
980            * Extensions/umn_mapserver/sample/iceland.map: Added a new metadata
981            line to the mapobj and added metadata to the political layer.
982    
983            * Extensions/umn_mapserver/test/test_mapserver.py: Changed the test
984            for Metadata.
985    
986    2004-07-26  Martin Schulze  <[email protected]>
987    
988            * Thuban/Lib/classmapper.py (ClassMapper.has): Added the new
989            ClassMapper
990    
991            * test/test_classmapper.py (TestMapping.test_mapper): Added a Test
992            case for the new ClassMapper
993    
994    
995    2004-07-22  Bernhard Herzog  <[email protected]>
996    
997            * Thuban/UI/viewport.py (ViewPort.VisibleExtent): New.  Return the
998            visible extent of the map in projected coordinates
999    
1000            * test/test_viewport.py (SimpleViewPortTest.test_default_size)
1001            (SimpleViewPortTest.test_init_with_size): Add some VisibleExtent()
1002            tests.
1003            (SimpleViewPortTest.test_visible_extent): New. The real test for
1004            VisibleExtent()
1005    
1006    2004-07-22  Bernhard Herzog  <[email protected]>
1007    
1008            * test/test_viewport.py: Use support.run_tests as the main
1009            function when running asa script.
1010    
1011    2004-07-22  Jan Sch�ngel <[email protected]>
1012    
1013            * Extensions/umn_mapserver/mf_export.py: Added "import os"
1014            Removed the old "import Thuban.UI.mainwindow" code.
1015            (tbextent_to_map): Removed the extra function and at the code direct
1016            to "thuban_to_map" function.
1017            (write_creatorcomment): Added. Now a short comment is added to the
1018            beginning of an generated mapfile.
1019            (export_mapfile): Now the Path and filename are saved in to variables,
1020            and not together in one variable. This is needed for the new
1021            write_creatorcomment function.
1022                    
1023            * Extensions/umn_mapserver/mf_import.py (import_mapfile): Added the
1024            import module "re". Also added Range and the ClassGroupRange import
1025            from Thuban. Both are needed for the new range expression import.
1026            (create_rangeexpression): Added. Creates a Range Expression in Thuban
1027            style from a given mapfile expression.
1028            (added_rasterlayer): Make some small code changes. The shapepath is
1029            now stored in an extra variable and the clazz_name is set empty if no
1030            class name set in the mapfile.
1031            Changed the Error message for Range Expressions, becaus the new
1032            function create a error string which will be shown in the dialog.
1033    
1034            * Extensions/umn_mapserver/test/test_mapserver.py: Added a test for the
1035            range expression import.
1036    
1037    2004-07-21  Jan-Oliver Wagner <[email protected]>
1038    
1039            * Extensions/umn_mapserver/README: Added hint that
1040            installation as root can be avoided. Removed all tabs.
1041    
1042    2004-07-16  Bernhard Herzog  <[email protected]>
1043    
1044            * test/test_viewport.py
1045            (ViewPortTest.test_changing_map_projection): Check that changing
1046            the projection of an empty map shown in a viewport doesn't lead to
1047            exceptions in the viewport's handler for the
1048            MAP_PROJECTION_CHANGED messages
1049    
1050            * Thuban/UI/viewport.py (ViewPort.map_projection_changed): Only
1051            try to keep the same region visible when the map actually contains
1052            something
1053    
1054    2004-07-15  Jan Sch�ngel <[email protected]>
1055    
1056            * Extensions/umn_mapserver/mapfile.py: Added a function to get the
1057            mappath directly from the mapobj. Is needed because of the changes
1058            in mf_import.py.
1059            (MF_Layer.add_thubanclass): Added a new comment.
1060            (MF_Map.set_extent): Fixed a bug with exporting empty mapobj. If the
1061            mapobj is empty there is no extent get from thuban an so no one can
1062            set to th mapobj.
1063            
1064            * Extensions/umn_mapserver/mf_import.py (import_mapfile): Updated
1065            the discription.
1066            Split the funktion in to three smaller ones. The new functions are
1067            add_rasterlayer, add_polygonlayer and select_layer2import.
1068            Removed the mapfilepath and filepath initialisation, because its know
1069            include in the new functions.
1070            Now nothing will be imported if cancel is pressed in the
1071            layer choice dialog.
1072    
1073    2004-07-14  Jan Sch�ngel <[email protected]>
1074    
1075            * Extensions/umn_mapserver/mapfile.py: Added ClassGroupDefault to
1076            import.
1077            (MF_Symbolset): Removed the extra variable for numsymbols.
1078            (MF_Class.__init__): Added a comment to the exception clause.
1079            Removed the extent init, because it was not needed anymore.
1080            (MF_Layer.add_thubanclass): Added the code to set the class name to
1081            the expression value from thuban if no label is defined.
1082            Added the code to export Range expressions from thuban to the mapfile.
1083            (MF_Map.set_extent): Removed the exception and replace it by some if
1084            code. If the size of a map is not defined the size will be set to 1,1.
1085            This is necessary because if the extent is set, mapscript checks if
1086            the size is greater than zero.
1087            (MF_Web): Added the get and set function for the template.
1088    
1089            * Extensions/umn_mapserver/mf_export.py: Added the function to check
1090            if a mapobject exists and used it to set the status of the menu items.
1091            If no mapfile exists the settings could not be edditied.
1092            Define after which menuitem the exportitem will include.
1093            
1094            * Extensions/umn_mapserver/mf_handle.py: Removed the import
1095            Thuban.UI.mainwindow clause, because it is not needed.
1096            Added the command Refresh() to all "OnChangeColor()" functions,
1097            because the color preview window was not updated on a color change.
1098            Added the function to check if a mapobject exists and used it to set the
1099            status of the menu items. If no mapobject exists the settings could not
1100            be edditied.
1101            (Map_Dialog): Moved the imagetype selector from the
1102            Outputformat_Dialog to Map_Dialog and removed Outputformat_Dialog.
1103            (Web_Dialog): Removed the name label and added the template textbox.
1104    
1105            * Extensions/umn_mapserver/mf_import.py (import_mapfile): Replace
1106            the exception handling on loading the layers by an if statement. It
1107            is not necessary to us the exception there.
1108            The Filepath creation now use os.path.join to build the path.
1109    
1110            * Extensions/umn_mapserver/test/test_mapserver.py: Moved the testMap
1111            definition from global to the setUp function. Now the testMap will
1112            initialize new on each test.
1113    
1114            * Extensions/umn_mapserver/sample/iceland.map: Include three new
1115            classes in the Line Layer, to test logical Expressions.
1116            Set the status of the class "Point9" in the Point Layer to off
1117            
1118    2004-07-13  Bernhard Herzog  <[email protected]>
1119    
1120            * Thuban/UI/baserenderer.py
1121            (BaseRenderer.render_map_incrementally): Fix a logic bug in the
1122            optimization that tries not to draw layers under a raster layer.
1123            The bug was harmless.  All it effectively did was to produce The a
1124            strange messages about not being able to draw Layer instances for
1125            all vector layers below a raster layer which would be invisible
1126            anyway because the raster layer currently always covers the entire
1127            window
1128    
1129    2004-07-08  Jan Sch�ngel <[email protected]>
1130    
1131            * Extensions/umn_mapserver/mapfile.py: Added code to generade and get
1132            a list of supported outputformats. This formats are not alle supported
1133            because there is no possibility to get the outputformat without the
1134            name known. Make some formal changes to the code.
1135            (MF_Map.set_name()): Fixed a bug if the name is None.
1136    
1137            * Extensions/umn_mapserver/mf_handle.py: Removed the image_type import
1138            statement, because its not needed anymore. The Outputformat is now
1139            given as string from the object. Make some formal changes to the code.
1140    
1141            * Extensions/umn_mapserver/test/test_mapserver.py: Added new test for
1142            most of the new setting which were added during the last changes.
1143            Removed the MF_Size Test.
1144            
1145            * Extensions/umn_mapserver/test/test.map: Added a new class to the
1146            cultural Layer to test expressions and the the status of that layer
1147            from on to default.
1148            Changed the data path the the correct Thuban Data
1149            Added the Outputformat Object and Symbol Object
1150            
1151    2004-07-07  Jan Sch�ngel <[email protected]>
1152    
1153            * Extensions/umn_mapserver/mapfile.py: Added some new
1154            settings to edit (outputformat, label, imagetype)
1155    
1156            * Extensions/umn_mapserver/mf_handle.py: Added some setting to
1157            the Label Dialog and add the OutputDialog.
1158            Make some changes to the code order.
1159    
1160    2004-07-06  Jan Sch�ngel <[email protected]>
1161    
1162            * Extensions/umn_mapserver/mapfile.py: Added the symbolObj, pointObj
1163            and line Obj and add the scalebar_status_type, scalebar_style_type and
1164            scalebar_position_type.
1165            Added the symbol- and symbolsetObject (MF_Symbol,MF_Symbolset). The
1166            are only used to create a Symbol like the circle in Thuban.
1167            Added the scalebarObject (MF_Scalebar)
1168            (MF_Class): Added set_status and get_status.
1169            (MF_Layer.add_thubanclass): Added code to set the class status
1170            (MF_Map): Added code to handle the symbols and scalebar
1171            (MF_Label): Added the set_partials and get_partials functions
1172            
1173            * Extensions/umn_mapserver/mf_export.py: Added MF_Symbol to import
1174            from mapfile. Added a function to create a circle object like the one
1175            from thuban if no one exists.
1176            
1177            * Extensions/umn_mapserver/mf_handle.py: All colors are now set when
1178            press ok in the assosiated dialog and not at the end of the
1179            colordialog.
1180            Added the Dialog for the Scalebar.
1181            (Label_Dialog): Added the offset option
1182    
1183            * Extensions/umn_mapserver/mf_import.py: Added code to import the
1184            status of the Classes.
1185            Fixed a bug with the projection. Now the to_meter parameter will be
1186            added to the Projection only if it doesn't exists.
1187    
1188    2004-07-01  Jan Sch�ngel <[email protected]>
1189    
1190            Added the functionality to handle the content thuban is not
1191            able to handle directly.
1192    
1193            * Extensions/umn_mapserver/mf_handle.py: New. This module extents
1194            Thuban with the possibility to edit the mapfile content.        
1195            
1196            * Extensions/umn_mapserver/mf_import.py: Added the possibility
1197            to import mapfiles without any layer selected. So it is possible
1198            to edit the other settings in a mapfile.
1199            (import_mapfile): Added code to use the editing functions.
1200            Added the possibility to import the projection to a layer if one
1201            is defined.
1202            Status settings (On,Off) will now set in thuban (visible, invisible).
1203            fixed a bug with with classnames. If no classname is set in mapfile
1204            the value in Thuban will set to the expression.
1205            
1206            * Extensions/umn_mapserver/mf_export.py(export_mapfile): Added the
1207            possibility to save a new mapfile or use the old one which is
1208            imported or new created.
1209            Added code to use the editing functions.
1210            Remove some not needed import statements
1211    
1212            * Extensions/umn_mapserver/mapfile.py: Added new types which are
1213            need for the editing functions.
1214            Added needed set-functions for the editing functions.
1215            Added the possibility to export rasterimages.
1216            Added new classes (MF_Web, MF_Label, MF_Legend, MF_Symbol,
1217            MF_SymbolSet). MF_Symbol and MF_SymbolSet are not needed at the
1218            moment.
1219            (MF_Class.set_thubanstyle): Now point layers will set to a default
1220            symbol to show a circle in mapserver and not only a 1px dot.
1221            (MF_Style.__init__): Fixed a bug with the color. Color was not set
1222            correct before.
1223            (MF_Size): Removed, because it is not needed.
1224            
1225            * Extensions/umn_mapserver/README: Added the hints to use the
1226            export and editing functions, too.
1227    
1228            * Extensions/umn_mapserver/sample/iceland.map: Added the
1229            new parameter "UNITS METERS".
1230            Change the political layer to status OFF.
1231    
1232            * Extensions/umn_mapserver/sample/README: Added some
1233            more details to setup the sample in the MapServer.
1234            
1235    2004-06-26  Bernhard Reiter <[email protected]>
1236    
1237            * Extensions/svgexport/test/test_svgmapwriter.py:
1238            Removed class VFile and used standard StringIO instead.
1239    
1240    2004-06-23  Jan Sch�ngel  <[email protected]>
1241    
1242            Add the export function to the umn_mapserver extension.
1243    
1244            * Extension/umn_mapserver/mf_export.py: New. This module extents
1245            Thuban with the possibility to export the Thuban content.
1246    
1247            * Extensions/umn_mapserver/mapfile.py: Expand the classes to use
1248            with the export module. Especially added the possibility to
1249            add thuban objects directly to the map objects.
1250    
1251            * Extensions/umn_mapserver/mf_import.py: Removed the wxCHANGE_DIR,
1252            because of the hint from Bernhard Herzog.
1253            Corrected the handling of absolute pathnames.
1254            Changed the Text of the Menu-Item, now the beginning is upper case.
1255    
1256            * Extensions/umn_mapserver/README: Added the --with-tiff statement.
1257    
1258    2004-06-16  Jan Sch�ngel  <[email protected]>
1259    
1260            Add a sample and make some changes.
1261    
1262            * Extension/umn_mapserver/mf_import.py: Changed the wxPython.wx
1263            import from * to explicit used statements. Changed the
1264            Thuban.UI.mainwindow import phrase, too.
1265            (import_mapfile):Corrected a clerical mistake.
1266            Added wxCHANGE_DIR in OpenFile Dialog.
1267            Added a MultipleChoiceDialog, to select the layers to load from
1268            mapfile into thuban. Thereby the projection is only set if one layer
1269            is selected.
1270            Added the possibility to handle relative pathnames which uses
1271            up-level references.
1272            Removed some doubled code.
1273            Corrected an error with integer values used as label in thuban
1274            ClassGroup.
1275            
1276            * Extensions/umn_mapserver/sample: New.
1277    
1278            * Extensions/umn_mapserver/sample/README: New. Describes the
1279            usage of the sample files.
1280    
1281            * Extensions/umn_mapserver/sample/iceland.map: New. This is
1282            a suitable .map-file for the iceland data.
1283    
1284            * Extensions/umn_mapserver/sample/index.html: New. The template
1285            for the mapfile.  
1286    
1287            * Extensions/umn_mapserver/sample/iceland.html: New. Initialisation
1288            file for the Iceland Application on web.
1289    
1290            * Extensions/umn_mapserver/README: Corrected a inaccuracy and added
1291            some details.
1292    
1293            * Extensions/umn_mapserver/test/test_mapserver
1294            (mapserver_import_Test_generalClasses.test_MF_Color):
1295            Corrected the thubancolor test.
1296    
1297    2004-06-15  Jan Sch�ngel  <[email protected]>
1298    
1299            * Extensions/umn_mapserver/README: New. Install instruction.
1300    
1301    2004-06-14  Bernhard Reiter <[email protected]>
1302    
1303            * libraries/thuban/cpl_mfile.h: Added copyright header.
1304    
1305            * libraries/thuban/ cpl_mfile.cpp, cpl_mfile.h: Added non-protecting
1306            Free Software License so that it is most useful with gdalwarp
1307            and bmpdataset.
1308    
1309    2004-06-14  Bernhard Herzog  <[email protected]>
1310    
1311            * Thuban/UI/multiplechoicedialog.py (__version__): Add missing
1312            import of wxPython.wx itself (as opposed to the contents of
1313            wxPython.wx).  For some reason wxPython.wx is available as
1314            wxPython.wx.wx in at least some 2.4 releases.  Fixes RT#2482
1315            wrt. wxPython 2.4.
1316    
1317    2004-06-10  Jan Sch�ngel  <[email protected]>
1318    
1319            Initial version of new extension "umn_mapserver".  This extension aims
1320            to manage configuration for the UMN MapServer application.  This
1321            inital version just imports the .map-files and displays all, Thuban is
1322            capable of.
1323    
1324            * Extensions/umn_mapserver, Extensions/umn_mapserver/test: New.
1325    
1326            * Extensions/umn_mapserver/test/README: New. Describes how to run the
1327            tests.
1328    
1329            * Extensions/umn_mapserver/test/test.map: New. This is a test
1330            .map-file for automated tests of the umn_mapserver extension of
1331            Thuban.
1332    
1333            * Extensions/umn_mapserver/test/test_mapserver.py: New. Tests for
1334            UMN Mapserver classes.
1335    
1336            * Extensions/umn_mapserver/__init__.py: New. Init to make this
1337            directory a package.
1338    
1339            * Extensions/umn_mapserver/mapfile.py: New. Classes to represent
1340            '.map'-file objects.
1341    
1342            * Extensions/umn_mapserver/mf_import.py: New. This module extends
1343            Thuban with the possibility to handle UMN MapServer mapfiles.
1344    
1345    2004-06-03  Bernhard Herzog  <[email protected]>
1346    
1347            * Thuban/Model/layer.py (Layer.TreeInfo): Convert the bounding box
1348            to a tuple before using it as arguments to the % operator.  This
1349            fixes the formatting issue filed in RT#2239 on 2004-01-13 and
1350            reported today on thuban-list by Jan Sch�ngel
1351    
1352            * test/test_layer.py (TestLayerModification.setUp): Save the
1353            filename as an instance variable so we can refer to it in tests
1354            (TestLayerModification.test_tree_info): Uncomment this method
1355            again and make it work.  This tests for the formatting issue
1356            filed in RT#2239 on 2004-01-13
1357    
1358    2004-05-28  Bernhard Herzog  <[email protected]>
1359    
1360            * Thuban/UI/baserenderer.py: Fix some typos.
1361    
1362    2004-05-18  Jan-Oliver Wagner <[email protected]>
1363    
1364            * Extensions/gns2shp/gns2shp.py (gns2shp): Fixed a bug
1365            by increasing a field size.
1366    
1367    2004-05-17  Bernhard Herzog  <[email protected]>
1368    
1369            Update to newest shapelib and get rid of Thuban specific
1370            extensions, i.e. use the new DBFUpdateHeader instead of our
1371            DBFCommit kludge
1372    
1373            * libraries/shapelib/shpopen.c: Update to version from current
1374            shapelib CVS.
1375    
1376            * libraries/shapelib/shapefil.h: Update to version from current
1377            shapelib CVS.
1378    
1379            * libraries/shapelib/dbfopen.c: Update to version from current
1380            shapelib CVS.
1381            (DBFCommit): Effectively removed since shapelib itself has
1382            DBFUpdateHeader now which is better for what DBFCommit wanted to
1383            achieve.  
1384            We're now using an unmodified version of dbfopen.
1385    
1386            * setup.py (extensions): Add the HAVE_UPDATE_HEADER macro with
1387            value '1' to the Lib.dbflibc extension.  This simply reflects the
1388            shapelib and pyshapelib updates
1389    
1390    2004-05-16  Jan-Oliver Wagner <[email protected]>
1391    
1392            Finished introduction of Menu.FindOrInsertMenu.
1393    
1394            * Extensions/drawshape/drawshape.py: Add the command
1395            to the experimental menu additionally to the toolbar.
1396    
1397            * Extensions/svgexport/svgsaver.py: Use FindOrInsertMenu() instead of
1398            finding menu on its own.
1399    
1400            * Doc/manual/thuban-manual.xml: updated sample file
1401            to use FindOrInsertMenu().
1402    
1403            * Examples/simple_extensions/hello_world.py: Use FindOrInsertMenu()
1404            instead of finding menu on its own.
1405    
1406    2004-05-11  Jan-Oliver Wagner <[email protected]>
1407    
1408            * test/test_menu.py (MenuTest.test): Added testing
1409            of method Menu.FindOrInsertMenu.
1410    
1411    2004-05-10  Jan-Oliver Wagner <[email protected]>
1412    
1413            Introduce and use Menu.FindOrInsertMenu.
1414    
1415            * Thuban/UI/menu.py (Menu.FindOrInsertMenu): New. Find a
1416              given menu or, if not found, insert it.
1417    
1418            * Extensions/bboxdump/bboxdump.py, /Extensions/gns2shp/gns2shp.py,
1419            /Extensions/importAPR/importAPR.py, Extensions/profiling/profiling.py,
1420            /Extensions/wms/wms.py: Use FindOrInsertMenu() instead of finding
1421            menu on its own.
1422    
1423    2004-05-06  Jan-Oliver Wagner <[email protected]>
1424    
1425            Introduce a abstract ColorDialog class and remove
1426            and outdated file.
1427    
1428            * Thuban/UI/proj4dialog.py: Removed. It is has been
1429            replaced by projdialog for quite a while and is not used
1430            anymore.
1431    
1432            * Thuban/UI/colordialog.py: New. Abstraction for color selection
1433            dialog(s).
1434    
1435            * Thuban/UI/classifier.py (SelectPropertiesDialog.__GetColor):
1436            Now calls the abstract ColorDialog instead of wxColourDialog.
1437            This also removed the dependency to Color class conversion
1438            from this function.
1439    
1440    2004-05-04  Frank Koormann  <[email protected]>
1441    
1442            * Extensions/bboxdump/__init__.py: Fixed string left over from
1443            copying.
1444    
1445            * Extensions/bboxdump/bboxdump.py (bboxdump):
1446            Use layer.ShapeStore().AllShapes() to loop over shapes instead of
1447            xrange(layer.NumShapes()). Compile the bboxmessage from a list
1448            of formatted outputs (string.join) instead of appending to the
1449            message. Two progress bar dialogs to report progress on the sometimes
1450            lenghty processing.
1451    
1452    2004-04-22  Frank Koormann  <[email protected]>
1453    
1454            New Extension to dump bounding boxes of all shapes of the selected
1455            layer. An optional column can be specified to group the objects,
1456            in this case the bounding box is a union of the separate boxes.
1457            Dump can be displayed in a ScrolledMessageDialog or written to file.
1458            The Extension is simply a combination of available and well tested
1459            Thuban functionality.
1460    
1461            * Extensions/bboxdump/__init__.py: New: Init to make this
1462            directory a package.
1463    
1464            * Extensions/bboxdump/bboxdump.py: New: Dump bounding boxes of
1465            all shapes of the selected layer.
1466    
1467    2004-04-22  Jan-Oliver Wagner <[email protected]>
1468    
1469            * Thuban/UI/classgen.py (GenUniquePanel.__init__): Fixed two
1470            strings to be i18n now.
1471    
1472    2004-04-18  Jan-Oliver Wagner <[email protected]>
1473    
1474            Changing popup menu of legend from direct building
1475            to using the Menu construction as used for the mainwindow.
1476    
1477            * Thuban/UI/mainwindow.py: New method commands: layer_to_top,
1478            layer_to_bottom, layer_visibility
1479            (MainWindow.LayerToTop): New. Put current layer to the top.
1480            (MainWindow.LayerToBottom): New. Put current layer to bottom.
1481            (MainWindow.HideLayer, MainWindow.ShowLayer, _has_visible_map):
1482            Replace 1,0 by True, False.
1483            (MainWindow.ToggleLayerVisibility): New. Toggle visibility of
1484            current layer.
1485            (MainWindow.LayerShowTable): Removed raising of dialog.
1486            (_has_selected_layer_visible): New. Support function.
1487    
1488            * Thuban/UI/legend.py: ID_POP_xxx: removed.
1489            (LegendPanel.__init__): Removed EVT_MENU bindings.
1490            (LegendTree._OnRightClick): Replace direct creation of
1491            menu via wx Classes by applying the menu definition
1492            as of Menu class of menu.py.
1493            
1494    2004-04-16  Jan-Oliver Wagner <[email protected]>
1495    
1496            * Thuban/UI/exceptiondialog.py (ExceptionDialog.dialog_layout): Improved
1497        button string to stronger clearify that Thuban will be closed when hitting
1498            the button.
1499    
1500            * Thuban/UI/mainwindow.py (MainWindow.LayerShowTable): Added docstring.
1501            Now for layers without a ShapeStore a corresponding message is given
1502            to the user, that this layer has no table to show.
1503    
1504    2004-04-15  Martin Schulze  <[email protected]>
1505    
1506            * Extensions/wms/layer.py (WMSLayer.setWMSFormat): Need to
1507            recalculate the format for the internal render engine as well.
1508    
1509            * Extensions/wms/properties.py (wmsProperties): First start for a
1510            properties dialog.  It's functional for a first selection of
1511            layers, but still has some weired wxWidgets/GTK problems but
1512            beautification can be done later.
1513    
1514            * Extensions/wms/layer.py: Added more documentation
1515            (WMSLayer.getFormats): New: Return list of supported image formats
1516            by the WMS server
1517            (WMSLayer.getLayers): New: Return the list of layer names
1518            supported by the WMS server
1519            (WMSLayer.getLayerTitle): New: Return the title of the named layer
1520            (WMSLayer.getWMSFormat): New: Return the image format that is used
1521            for WMS GetMap requests
1522            (WMSLayer.setWMSFormat): New: Set the image format that is used
1523            for WMS GetMap requests
1524            (WMSLayer.__init__): Move away from using only one layer to using
1525            a list of layers (unsorted at the moment, though).
1526            (WMSLayer.getVisibleLayers): New: Return the list of names for all
1527            visible layers
1528            (WMSLayer.setVisibleLayers): New: Set the list of names for all
1529            visible layers
1530    
1531            * Extensions/wms/wms.py: Moved the WMS layer into layer.py in
1532            order to establish a clean structure.
1533    
1534            * Extensions/wms/layer.py: Moved the WMS layer into a file on its
1535            own in order to establish a clean structure.
1536    
1537    2004-04-13  Martin Schulze  <[email protected]>
1538    
1539            * Extensions/wms/parser.py (WMSCapabilitiesParser.grok): Added
1540            support for oldstyle (WMS 1.0 apparently) image format
1541            specification.
1542    
1543            * Extensions/wms/wms.py (WMSLayer.calcFormat): Reduce the list of
1544            supported graphic formats back to JPEG and BMP, PNG and others are
1545            too *cough* experimental...  Sorry, I meant to filter this out
1546            before I committed this part.  This should make the WMS extension
1547            run from CVS again.
1548            (wms_dialog): Reset an empty URL to None so that the subsequent
1549            program can depend on this, since the dialog will indeed return an
1550            empty URL, causing another declaration of love by Python.
1551    
1552            * Extensions/wms/parser.py (WMSCapabilitiesParser.getLayerBBox):
1553            Whenever a native BoundingBox request cannot be fulfilled, check
1554            whether the requested SRS is EPSG:3426, in which case return the
1555            LatLonBoundingBox values.
1556    
1557            * Extensions/wms/test/test_parser.py
1558            (TestWMSCapabilitiesParser.test_LayerSRS): Added a test for
1559            ignoring AUTO:* SRS.
1560            (TestWMSCapabilitiesParser.test_LatLonBoundingBoxes_as_bboxes):
1561            Added another test method to test whether the LatLonBoundingBox
1562            values will be returned if BoundingBox values are requested with
1563            SRS set to EPSG:3426.
1564    
1565            * Extensions/wms/parser.py (WMSCapabilitiesParser.peekLayers):
1566            Added rudimentary support for non-EPSG SRS, i.e. ignore them for
1567            the moment by placing them into a variable which is currently
1568            unused.  Also test whether the EPSG SRS is numerical as it should
1569            be and add an error message if it is not.
1570    
1571            * Extensions/wms/test/sample.xml: Added AUTO:* SRS since they
1572            appear in the real world as well.  Since we cannot handle them yet
1573            (OGCLib can't either), we will ignore them for the moment.
1574    
1575            * Extensions/wms/parser.py: Use a variable for denoting the sample
1576            filename
1577            (WMSCapabilitiesParser.peekLayers): Added support for error
1578            messages during grok().  They will be aggregated in an array and
1579            may be displayed later.  We may have to add a classification
1580            "Warning" and "Error" to this.  That requires more experience,
1581            though, since not every error may be lethal.
1582    
1583            * Thuban/UI/mainwindow.py (MainWindow.LayerShowTable): Raise the
1584            ShowTable() dialog/frame when the user attempts to display it
1585            while it has been opened before already and not closed again.
1586    
1587    2004-04-11  Martin Schulze  <[email protected]>
1588    
1589            * Extensions/wms/infodialog.py: Adjusted the class documentation
1590    
1591            * Extensions/wms/wms.py (WMSLayer.__init__, WMSLayer.GetMapImg):
1592            Switch to using Thuban{Begin,End}BusyCursor instead of the pure
1593            wxWidgets variants.
1594            (WMSLayer.__init__): The epsg_id variable is named top_srs now.
1595    
1596            * Extensions/wms/infodialog.py: Added an information dialog that
1597            will display various information about the WMS current resource,
1598            so that additional information such as the title, the abstract,
1599            fees and access constraints can be displayed for the user if they
1600            are documented in the WMS XML.
1601    
1602    2004-04-10  Martin Schulze  <[email protected]>
1603    
1604            * Extensions/wms/parser.py (WMSCapabilitiesParser.grok): Adjusted
1605            string handling.  It's "foo".lower() and not lower(foo) without
1606            lower imported from strings or something.
1607    
1608            * Extensions/wms/wms.py (WMSLayer): Incorporated WMSCapabilities
1609            from capabilities.py and parser.py.  Implement priority list for
1610            supported graphics formats, take care of wbmp != bmp.  PNG, TIFF
1611            and GIF are supported here, but not yet by main Thuban.  Hence,
1612            support for them may be removed later.  Special contribution to
1613            usability: get wxWidgets to change the cursor when we're waiting
1614            for data from the network so the user won't start to worry.  This
1615            causes a redrawing error/warning, though.
1616    
1617            * Extensions/wms/parser.py (WMSCapabilitiesParser.grok): Unlink
1618            the DOM object.
1619    
1620    2004-04-01  Martin Schulze  <[email protected]>
1621    
1622            * Extensions/wms/capabilities.py: Adjusted documentation
1623            (WMSCapabilities.__init__): Improved documentation, fixed syntax
1624            (WMSCapabilities.saveCapabilities): Only catch IOError when
1625            handling files
1626            (WMSCapabilities.loadCapabilities): Only catch IOError when
1627            handling files
1628            __main__: corrected variable naming
1629            (WMSCapabilities.fetchCapabilities,loadCapabilities): Make this
1630            class a specialisation of WMSCapabilitiesParser as well.  Also
1631            execute grok() after loading or fetching capabilities, if that
1632            went well, so that subsequent calls can already access the data.
1633            (WMSCapabilities.getVersion): Export the used version of the
1634            GetCapabilities request, so we can use it for subsequent calls,
1635            i.e. for GetMap requests.
1636            (WMSCapabilities.fetchCapabilities): Added proper error handling
1637            when the GetCapabilities request failed, so that the surrounding
1638            program can act accordingly.
1639    
1640    2004-03-30  Martin Schulze  <[email protected]>
1641    
1642            * Extensions/wms/parser.py (WMSCapabilitiesParser.getLayerSRS):
1643            Adjusted the getLayerSRS method to return the list of SRSes
1644            extracted from <SRS> elements instead of <BoundingBox> elements.
1645            Added a bit of documentation as well.
1646            (WMSCapabilitiesParser.checkLayerSRS): Removed integrity test
1647            since it was only implemented due to a misunderstanding.
1648    
1649            * Extensions/wms/test/test_parser.py
1650            (TestWMSCapabilitiesParser.test_LayerSRS): Adjust the tests to
1651            reflect the corrected interpretation of the standard: i.e. a layer
1652            does not have to define a BoundingBox for all SRSes it supports.
1653            Hence the <SRS></SRS> specification is authoritative, not the list
1654            of BoundingBoxes.
1655            (TestWMSCapabilitiesParser.test_BoundingBoxes): Added a new test
1656            to ensure None is returned for a non-existing SRS.
1657            (TestWMSCapabilitiesParser.test_grok): Removed test_grok method
1658            since it is not applicable anymore.  Listing more SRSes in <SRS>
1659            elements is valid according to the specs.
1660    
1661    2004-03-26  Bernhard Reiter <[email protected]>
1662    
1663            * README: Nicer formatting of text. Improved descriptions.
1664            Reflected wxWidgets name change.
1665            
1666            * Thuban/UI/about.py: Extended copyright to 2004 and added
1667            information about the thuban-devel mailinglist.
1668    
1669    2004-03-24  Martin Schulze  <[email protected]>
1670    
1671            * Extensions/wms/capabilities.py: Renamed the class to contain
1672            'WMS', also added a linebreak where required
1673    
1674            * Extensions/wms/parser.py: Finally added the XML parser for the
1675            GetCapabilities response.
1676    
1677            * Extensions/wms/test/sample.xml: Adjusted the sample file so that
1678            <SRS> elements match the <BoundingBox> elements, except for the
1679            layer 'beschriftung'.
1680    
1681            * Extensions/wms/test/test_parser.py: Encode non-ascii strings
1682            since Python uses unicode strings internally, otherwise
1683            comparisons will fail.  Removed tests for getLayerBBoxSRS() since
1684            the SRS will be calculated anyway and this method is obsoleted by
1685            getLayerSRS().  Denote SRS as strings and not as cardinal numbers.
1686            Move loading the sample file into the setUp method.  Added a test
1687            for finding the integrity problem in the sample response.
1688            Improved formatting.
1689    
1690            * Extensions/wms/domutils.py: Added convenience routines for
1691            handling of Document Object Model (DOM) nodes.
1692    
1693            * Extensions/wms/test/test_domutils.py: Added a test for the
1694            domutils module
1695    
1696    2004-03-19  Martin Schulze  <[email protected]>
1697    
1698            * Extensions/wms/test/test_parser.py (TestWMSCapabilitiesParser):
1699            Moved path detection and adding into a module of its own,
1700            adjustpath, which exports thubandir as main Thuban directory.
1701    
1702            * Extensions/wms/test/test_ogclib.py (TestWMSLib): Moved path
1703            detection and adding into a module of its own, adjustpath, which
1704            exports thubandir as main Thuban directory.  Reorganised the
1705            module in order to support the SkipTest feature for Thuban test
1706            cases.
1707    
1708            * Extensions/wms/test/adjustpath.py: Moved path detection and
1709            adding into a module of its own.
1710    
1711    2004-03-18  Martin Schulze  <[email protected]>
1712    
1713            * Extensions/wms/test/test_parser.py: Added another test for
1714            checking whether the WMS XML parser (to be implemented) returns
1715            the information we expect.  This requires a sample WMS WML file
1716            (sample.xml) which has been extracted from the frida server and
1717            "improved" manually.
1718    
1719            * Extensions/wms/test/test_ogclib.py: Added legacy code to add the
1720            main Thuban directory to the path in order to be able to import
1721            random modules.  Adjusted the PyOGCLib detection to reuse the
1722            information gathered.  Also added a note about the PYTHONPATH
1723            environment variable.
1724    
1725            * Extensions/wms/test/test_ogclib.py: The format specification is
1726            a mime-type, not a graphic format, hence image/jpeg wou ld be the
1727            proper format and not JPEG.  We'll also have to take care of the
1728            encoding of / as %2F.
1729    
1730    2004-03-16  Martin Schulze  <[email protected]>
1731    
1732            * Extensions/wms/test/test_ogclib.py: Added a (hopefully)
1733            comprehensive test for the getMapURL method, built compare URLs
1734            according to the documentation in OGC 01-068r3
1735    
1736            * Extensions/wms/capabilities.py (WMSCapabilities): Added the
1737            class WMSCapabilities to manage capabilites, will incorporate
1738            parsing the capabilities response and provide details for other
1739            classes.
1740    
1741    2004-03-12  Bernhard Herzog  <[email protected]>
1742    
1743            Support views in addition to normal tables in the postgis
1744            shapestore
1745    
1746            * Thuban/Model/postgisdb.py
1747            (PostGISShapeStore._fetch_table_information): Add a fallback for
1748            the case where the table name is not in the geometry_columns
1749            table.  This is usually the case for views.  Also, set
1750            self.shapestore here.
1751            (PostGISShapeStore.ShapeType): No need to query the database all
1752            the time.  The shape type is now determined in
1753            _fetch_table_information
1754    
1755            * test/postgissupport.py (PostgreSQLServer.new_postgis_db)
1756            (PostgreSQLServer.get_static_data_db, PostGISDatabase.__init__):
1757            New parameter to specify views.
1758            (PostGISDatabase.has_data): Also compare the views.  New views
1759            parameter
1760            (PostGISDatabase.initdb): Create the views.
1761            (PostgreSQLServer.get_default_static_data_db): Add the v_landmarks
1762            view
1763    
1764            * test/test_postgis_db.py
1765            (TestPostGISShapestorePointFromViews): New.  Test a
1766            PostGISShapeStore with a view
1767            (TestPostGISShapestorePointOIDAsGIDColumn.setUp): Pass the name of
1768            the geometry_column explicitly to test whether that works
1769    
1770    2004-03-12  Bernhard Herzog  <[email protected]>
1771    
1772            Final step for explicit id/geometry columns: Loading and saving
1773    
1774            * Resources/XML/thuban-1.1.dtd: New.  Derived from thuban-1.0.dtd
1775            with the following changes:
1776            (dbshapesource): Two new attributes id_column and geometry_column
1777    
1778            * Thuban/Model/save.py (SessionSaver.write): Use the new dtd
1779            (SessionSaver.write_session): Use the new namespace
1780            (SessionSaver.write_data_containers): Write the new dbshapesource
1781            parameters
1782    
1783            * Thuban/Model/load.py (SessionLoader.__init__): New namespace for
1784            the new file format version
1785            (SessionLoader.start_dbshapesource): Handle the new db parameters
1786    
1787            * test/test_save.py: Update to the new dtd and namespace
1788            (SaveSessionTest.test_save_postgis): Update the NonConnectionStore
1789            mock object to provide a working IDColumn method.
1790    
1791            * test/test_load_1_0.py: New.  Copy of the test_load.py before
1792            today's changes but with the round-trip tests removed.
1793    
1794            * test/test_load_0_9.py: Update doc-string.
1795    
1796            * test/test_load.py: Update all .thuban files to the new dtd and
1797            namespace.
1798            (TestPostGISLayer.file_contents): Add the new dbshapesource
1799            paramters
1800    
1801    2004-03-11  Bernhard Herzog  <[email protected]>
1802    
1803            Next step for explicit id/geometry columns: User interaction
1804    
1805            * Thuban/UI/dbdialog.py (ChooseDBTableDialog.__init__): Rework how
1806            the dialog is constructed. Add combo boxes to select id and
1807            geometry column.  Rename some instance variables.
1808            (ChooseDBTableDialog.GetTable): Return id and geometry column
1809            names
1810            (ChooseDBTableDialog.OnTableSelect): New. Event handler for
1811            selections in the table list
1812    
1813            * Thuban/UI/mainwindow.py (MainWindow.AddDBLayer): Use id_column
1814            and geometry_column
1815    
1816            * Thuban/Model/session.py (Session.OpenDBShapeStore): Add the new
1817            parameters for id_column and geometry column of PostGISShapeStore
1818            here as well.
1819    
1820            * Thuban/Model/postgisdb.py (type_map): Add ROWID psycog type.
1821            (_raw_type_map): New. Map raw PostgreSQL type ints to thuban types
1822            (PostGISConnection.GeometryTables): Use a better query to
1823            determine which relations in the database might be usable for
1824            shapestores.  Now supports views as well but is more PostgreSQL
1825            specific
1826            (PostGISConnection.table_columns): New. Somewhat experimental
1827            method to let the db dialogs provide lists of columns to users so
1828            that they can select id and geometry columns.
1829            (PostGISTable.__init__): The default value of the id_column
1830            parameter is now None it still means "gid" effectively, though.
1831            (PostGISTable.IDColumn): New introspection method to return a
1832            column object for the id column
1833            (PostGISShapeStore.GeometryColumn): New introspection method to
1834            return a column object for the geometry column
1835    
1836            * test/test_postgis_db.py
1837            (TestPostGISConnection.test_gis_tables_non_empty):
1838            Removed. Subsumed by the new:
1839            (TestPostGISConnection.test_gis_tables_with_views_and_tables):
1840            New. Tes the GeometryTables and table_columns methods with actual
1841            tables and views.
1842            (PointTests.test_id_column, PointTests.test_geometry_column):
1843            New. tests for the new methods.
1844            (TestPostGISShapestorePoint.setUp)
1845            (TestPostGISShapestorePointSRID.setUp)
1846            (TestPostGISShapestorePointExplicitGIDColumn.setUp): Fill the
1847            instance variables needed by the new tests
1848    
1849    2004-03-11  Bernhard Herzog  <[email protected]>
1850    
1851            * Thuban/UI/classgen.py (GenQuantilesPanel.GetList): The row
1852            numbers given to ReadValue are ordinals.
1853    
1854    2004-03-11  Bernhard Herzog  <[email protected]>
1855    
1856            Elimiate the requirement for PostGIS tables to have a column
1857            called "gid".
1858    
1859            * Thuban/Model/postgisdb.py (PostGISTable.__init__): New parameter
1860            id_column to specify which column to use to identify rows.  Also
1861            new instance variables id_column and quoted_id_column
1862            (PostGISTable.RowIdToOrdinal, PostGISTable.RowOrdinalToId)
1863            (PostGISTable.ReadRowAsDict, PostGISTable.ReadValue)
1864            (PostGISTable.SimpleQuery): Use the id column name provided to the
1865            constructor instead of "gid"
1866            (PostGISShapeStore.__init__): New parameter id_column analogously
1867            to PostGISTable.__init__.  This parameter is simply passed through
1868            to the base class constructor
1869            (PostGISShapeStore._create_col_from_description): Fix typo in
1870            doc-string
1871            (PostGISShapeStore.Shape, PostGISShapeStore.AllShapes)
1872            (PostGISShapeStore.ShapesInRegion): Use the id column name
1873            provided to the constructor instead of "gid"
1874    
1875            * test/postgissupport.py
1876            (PostgreSQLServer.get_default_static_data_db): New static table
1877            landmarks_point_id with an id column != "gid.  Update the comments
1878            a bit.
1879            (skip_if_addgeometrycolumn_does_not_use_quote_ident): Fix typo in
1880            doc-
1881            (upload_shapefile): New parameter gid_column to use a name other
1882            than "gid" for the column to store the shape ids
1883    
1884            * test/test_postgis_db.py (TableTests): New.  Mixin-class
1885            containing all tests previously in TestPostGISTable.  The actual
1886            tests are the same but the code is a bit more configurable to
1887            allow for different id columns etc.
1888            (TestPostGISTable): Derive from TableTests now for the actual
1889            tests.
1890            (TestPostGISTableExplicitGIDColumn): New. Like TestPostGISTable
1891            except that it the landmarks_point_id table to test the id_column
1892            parameter
1893            (PointTests): Extend the doc-string
1894            (TestPostGISShapestorePointExplicitGIDColumn)
1895            (TestPostGISShapestorePointOIDAsGIDColumn): New classes derived
1896            from PointTests to test the explicit id_column parameter.  One
1897            tests with the name of the column holding the shape ids, the other
1898            uses PostgreSQL's OID column.  For the latter a number of methods
1899            have to be overwritten to make them independent of the actual id
1900            values.
1901    
1902    2004-03-08  Silke Reimer  <[email protected]>
1903    
1904            Update debian directory:
1905    
1906            * debian/changelog: Added new version.
1907            * deiban/rules: Updated management of patches (with cbds)
1908            * debian/control: Added cbds to dependencies
1909            * debian/patches/*: New. Adds better support for patches of thuban in
1910                            debian
1911            * debian/menu: Syntax of menu changed slightly
1912            * debian/setup.py.patch: removed because it has been moved to
1913                            debian/patechs/setup.py.patch
1914            
1915    
1916    2004-02-26  Bernhard Herzog  <[email protected]>
1917    
1918            Create the Doc/technotes directory for text files with information
1919            for developers
1920    
1921            * Doc/technotes/README: New. README for the technotes
1922    
1923            * Doc/technotes/coding_guidelines.txt: New. Coding guidelines for
1924            Thuban
1925    
1926            * Doc/technotes/release_process.txt: New. Used to be
1927            HOWTO-Release.  Now slightly adapted to technote formatting style.
1928    
1929            * HOWTO-Release: Removed.  It's contents are now in
1930            Doc/technotes/release_process.txt
1931    
1932    2004-02-25  Bernhard Herzog  <[email protected]>
1933    
1934            * libraries/thuban/wxproj.cpp (get_wx_version): New.  Return the
1935            version of wxWindows the module was compiled with so we can check
1936            that against the wxPython version.
1937    
1938            * Thuban/version.py (thuban_branch, thuban_release): New variables
1939            controlling which and how Thuban versions are shown.  See the
1940            comments for details.
1941            (verify_versions): Also check that the wx version that wxproj is
1942            compiled against matches that of the wxPython we use at runtime
1943    
1944    2004-02-20  Bernhard Herzog  <[email protected]>
1945    
1946            * Extensions/wms/wms.py (epsg_code_to_projection): Use
1947            get_system_proj_file to read the epsg projections.  The old way
1948            depended on the current directory being the top Thuban directory.
1949    
1950    2004-02-20  Bernhard Herzog  <[email protected]>
1951    
1952            * Extensions/svgexport/test/test_svgmapwriter.py
1953            (TestVirtualDC.test_clippath): Remove a debug print
1954    
1955    2004-02-20  Bernhard Herzog  <[email protected]>
1956    
1957            * Extensions/svgexport/__init__.py: New.  Turn
1958            Extensions/svgexport into a package.
1959    
1960            * Extensions/svgexport/svgmapwriter.py: Reorder the imports and
1961            doc-string a bit.  The doc-string must come first, otherwise it's
1962            not a doc-string.  The __future__ import must be the first thing
1963            after the doc-string.  Use only double quotes in doc-strings.
1964            Single quotes trip up emacs syntax highlighting if the text
1965            contains apostrophes.
1966    
1967    2004-02-20  Bernhard Herzog  <[email protected]>
1968    
1969            * Extensions/svgexport/test/__init__.py,
1970            Extensions/svgexport/test/test_svgmapwriter.py: New. Initial test
1971            suite for svgexport
1972    
1973            * test/runtests.py (find_test_modules): New. Function with the
1974            module finding code from main.
1975            (main): Use find_test_modules to figure out the default test
1976            modules and take modules from Extensions.svgexport.test too.
1977    
1978    2004-02-19  Bernhard Herzog  <[email protected]>
1979    
1980            * Thuban/UI/application.py (ThubanApplication.OnInit): Make sure
1981            the mainwindow has a reference to the map of the initial session.
1982            This fixes a bug introduced with the fix for RT#2245
1983    
1984    2004-02-19  Bernhard Herzog  <[email protected]>
1985    
1986            * Extensions/svgexport/svgsaver.py,
1987            Extensions/svgexport/svgmapwriter.py,
1988            Extensions/svgexport/maplegend.py: Added again.  This time in the
1989            correct place.
1990    
1991    2004-02-17  Bernhard Herzog  <[email protected]>
1992    
1993            Fix for RT#2245
1994    
1995            * Thuban/UI/application.py (ThubanApplication.OnInit): Initialize
1996            instance variables before trying to create any windows.  Creating
1997            windows can start an event loop if e.g. message boxes are popped
1998            up for some reason, and event handlers, especially EVT_UPDATE_UI
1999            may want to access things from the application.
2000            (ThubanApplication.maps_changed): The mainwindow may not have been
2001            created yet, so check whether it has been created before calling
2002            its methods
2003    
2004            * Thuban/UI/view.py (MapCanvas.OnIdle): Only try to redraw if we
2005            have a map
2006    
2007    2004-02-17  Bernhard Herzog  <[email protected]>
2008    
2009            * test/test_svgmapwriter.py, Extensions/svgsaver.py,
2010            Extensions/svgmapwriter.py, Extensions/maplegend.py,
2011            extensions/svgexport/svgsaver.py,
2012            extensions/svgexport/svgmapwriter.py,
2013            extensions/svgexport/maplegend.py: Removed.  These files were in
2014            the wrong places or didn't work at all.
2015    
2016    2004-02-16  Bernhard Herzog  <[email protected]>
2017    
2018            * Thuban/UI/view.py (MapCanvas.Export): Remove accidentally added
2019            line
2020    
2021    2004-02-16  Bernhard Herzog  <[email protected]>
2022    
2023            * Thuban/UI/view.py (MapCanvas.Export): Avoid UnboundLocalError.
2024    
2025    2004-02-15  Markus Rechtien  <[email protected]>
2026            
2027            * Extensions/svgexport/svgmapwriter.py: New. Adds the capability
2028            to write a session to a file in SVG format.
2029            * Extensions/svgexport/svgsaver.py: New. Uses svgmapwriter.py
2030            to write a SVG map of a session.
2031            * Extensions/svgexport/maplegend: New. Writes a basic maplegend
2032            in SVG format for the current session.
2033    
2034    2004-02-13  Bernhard Herzog  <[email protected]>
2035    
2036            * Thuban/UI/mainwindow.py (MainWindow.AddDBLayer): When the layer
2037            can't be created, return immediately after displaying the error
2038            message.
2039    
2040    2004-02-11  Bernhard Herzog  <[email protected]>
2041    
2042            Handle postgis tables with more than one geometry column.
2043    
2044            * Thuban/Model/postgisdb.py
2045            (PostGISTable._fetch_table_information): Delegate the creation of
2046            column objects to a different method so that we can extend that in
2047            derived classes
2048            (PostGISTable._create_col_from_description): New. Column object
2049            creation part of _fetch_table_information
2050            (PostGISShapeStore._create_col_from_description): New. Extend
2051            inherited method to handle geometry columns
2052            (PostGISShapeStore.__init__): New parameter geometry_column to
2053            specify which geometry column to use.  Optional but mandatory for
2054            tables with more than one geometry column
2055            (PostGISShapeStore._fetch_table_information): Also use the name of
2056            the geometry column when looking for the srid
2057            (PostGISShapeStore.ShapeType): Also use the name of the geometry
2058            column when looking for the shape type
2059    
2060            * test/test_save.py (SaveSessionTest.test_save_postgis): Adapt
2061            NonConnectionStore to changes in the PostGISShapeStore
2062    
2063            * test/test_postgis_db.py
2064            (TestPostGISSpecialCases.test_shapestore_two_geom_cols): Test
2065            PostGISShapeStore with tables having two geometry columns.
2066    
2067    2004-02-10  Bernhard Herzog  <[email protected]>
2068    
2069            Fix some postgis problems.  What remains to be done is real
2070            handling of SRIDs as they affect how reprojection is done
2071    
2072            * Thuban/Model/postgisdb.py (quote_identifier): Fix typo in
2073            doc-string
2074            (PostGISShapeStore._fetch_table_information): New. Extend
2075            inherited method to retrieve srid
2076            (PostGISShapeStore.BoundingBox): Handle tables without data.
2077            extent yields NULL for those
2078            (PostGISShapeStore.ShapesInRegion): Use the srid of the table.
2079    
2080            * test/test_postgis_db.py
2081            (TestPostGISSpecialCases.test_shapestore_empty_table): New test
2082            for the special case of a table without any data
2083            (TestPostGISShapestorePointSRID): New class with tests for a table
2084            that uses srids
2085            (PolygonTests): Fix a doc-string typo
2086    
2087            * test/postgissupport.py (PostGISDatabase.__init__): New parameter
2088            reference_systems with a specification of spacial reference
2089            systems to create in the new db.
2090            (PostgreSQLServer.new_postgis_db)
2091            (PostgreSQLServer.get_static_data_db): New parameter
2092            reference_systems to be passed through ultimately to
2093            PostGISDatabase.  In new_postgis_db also check whether an existing
2094            db already has the right srids
2095            (PostgreSQLServer.get_default_static_data_db): Add srids and a
2096            table that uses srids
2097            (PostGISDatabase.initdb): Create the entries for the reference
2098            systems
2099            (PostGISDatabase.has_data): Add reference_systems parameter to
2100            check for those too
2101            (upload_shapefile): New parameter srid to create tables with a
2102            specific srid
2103    
2104    2004-02-06  Frank Koormann  <[email protected]>
2105    
2106            * po/pt_BR.po: Fixed charset
2107    
2108    2004-02-05  Frank Koormann  <[email protected]>
2109    
2110            * po/pt_BR.po: Fixed format string for error message, missing %s
2111            added (Thuban/UI/application.py:273)
2112    
2113    2004-02-03  Frank Koormann  <[email protected]>
2114            
2115            First version of Portuguese (Brazilian) translation
2116    
2117            * po/pt_BR.po: New, translation of pot (2004-01-15 16:07+0300) for
2118            Brazilian Portuguese by Eduardo Patto Kanegae.
2119    
2120            * Thuban/UI/about.py (About.__init.py__): Added Eduardo to the list of
2121            translators.
2122    
2123    
2124    2004-01-22  Frank Koormann  <[email protected]>
2125    
2126            * Doc/manual/thuban-manual.xml: Added section on installation of
2127            Thuban under Win32 systems. Fixed image path references in the postgis
2128            section. Some minor source formattings.
2129    
2130    2004-01-21  Frank Koormann  <[email protected]>
2131    
2132            Make Thuban remember path selections (at least for one application run).
2133    
2134            * Thuban/UI/application.py (Application.OnInit): Initialize path as a
2135            attribute of application object. Path is a dictionary of
2136            strings, currently with the items "data" and "projection".  
2137            (Application.SetPath): New, stores path for the specified item.
2138            (Application.Path): New, return path for the specified item.
2139    
2140            * Thuban/UI/mainwindow.py
2141            (MainWindow.OpenSession, MainWindow.SaveSessionAs,
2142            MainWindow.AddLayer, MainWindow.AddRasterLayer,
2143            MainWindow.TableOpen): Access "data" path information of the
2144            application.
2145            
2146            * Thuban/UI/projdialog.py (ProjFrame._OnImport, ProjFrame._OnExport):
2147            Access "projection" path information of the application.
2148    
2149    2004-01-05  Bernhard Herzog  <[email protected]>
2150    
2151            * po/ru.po: Updated translations from Alex Shevlakov
2152    
2153    2004-01-05  Bernhard Herzog  <[email protected]>
2154    
2155            * po/Makefile, po/README: Move the description of how to generate
2156            the translation statistics to the README.
2157    
2158    2003-12-23  Bernhard Herzog  <[email protected]>
2159    
2160            * NEWS: Update for 1.0.0
2161    
2162            * po/it.po: Another update from Maurizio Napolitano
2163    
2164    2003-12-23  Bernhard Herzog  <[email protected]>
2165    
2166            * po/it.po: Updated translation from Maurizio Napolitano
2167    
2168    2003-12-23  Bernhard Herzog  <[email protected]>
2169    
2170            * Thuban/UI/join.py (JoinDialog.__init__): Mark one more string
2171            for translation
2172    
2173            * Thuban/UI/mainwindow.py (MainWindow.TableRename)
2174            (MainWindow.RenameMap, MainWindow.RenameLayer): Mark some more
2175            strings for translation
2176    
2177            * po/de.po: Update with the newly marked strings.
2178    
2179    2003-12-22  Bernhard Herzog  <[email protected]>
2180    
2181            * HOWTO-Release: Fix the places where version numbers have to be
2182            updated
2183    
2184    2003-12-22  Bernhard Herzog  <[email protected]>
2185    
2186            * setup.py (setup call): 1.0.0, yeah!
2187    
2188            * Thuban/version.py (longversion): 1.0.0, yeah!
2189    
2190            * Thuban/Model/load.py (SessionLoader.__init__): Accept the
2191            1.0.0 namespace too
2192    
2193            * Thuban/Model/save.py (SessionSaver.write_session): Save with
2194            1.0.0 namespace
2195    
2196            * test/test_load.py (LoadSessionTest.dtd)
2197            (TestSingleLayer.file_contents)
2198            (TestNonAsciiColumnName.file_contents)
2199            (TestLayerVisibility.file_contents)
2200            (TestClassification.file_contents, TestLabels.file_contents)
2201            (TestLayerProjection.file_contents)
2202            (TestRasterLayer.file_contents, TestJoinedTable.file_contents)
2203            (TestLabelLayer.file_contents, TestPostGISLayer.file_contents)
2204            (TestPostGISLayerPassword.file_contents)
2205            (TestLoadError.file_contents, TestLoadError.test): Update for
2206            1.0.0 namespace
2207    
2208            * test/test_save.py (SaveSessionTest.dtd)
2209            (SaveSessionTest.testEmptySession)
2210            (SaveSessionTest.testSingleLayer)
2211            (SaveSessionTest.testLayerProjection)
2212            (SaveSessionTest.testRasterLayer)
2213            (SaveSessionTest.testClassifiedLayer)
2214            (SaveSessionTest.test_dbf_table)
2215            (SaveSessionTest.test_joined_table)
2216            (SaveSessionTest.test_save_postgis): Update for 1.0.0 namespace
2217    
2218    2003-12-22  Bernhard Herzog  <[email protected]>
2219    
2220            * Thuban/Model/load.py (SessionLoader.start_label): Make sure the
2221            alignment flags are byte strings not unicode and that they have
2222            valid values
2223    
2224            * test/test_load.py (TestLabelLayer): New. Test loading (and
2225            indirectly saving) of maps with labels.
2226    
2227    2003-12-22  Bernhard Herzog  <[email protected]>
2228    
2229            * Thuban/UI/tableview.py (TableGrid.OnDestroy)
2230            (TableGrid.__init__): Handle EVT_WINDOW_DESTROY in the grid to
2231            unsubscribe all subscribers.
2232            (LayerTableFrame.OnDestroy): Do not unsubscribe any messages from
2233            self.grid since it may already have been destroyed.
2234            Fixes RT #2256
2235    
2236    2003-12-19  Bernhard Herzog  <[email protected]>
2237    
2238            * po/fr.po, po/es.po: Updated translations from Daniel Calvelo
2239    
2240    2003-12-16  Bernhard Herzog  <[email protected]>
2241            
2242            * debian/bitmappath.patch, debian/setup.py.patch:
2243                    added to ensure compliance with FHS for debian
2244            * debian/rules, debian/changelog:
2245                added patches in rules to ensure compliance with FHS for debian
2246    
2247    2003-12-16  Bernhard Herzog  <[email protected]>
2248    
2249            * po/Makefile (mo): Make the output a bit nicer so that it prints
2250            statistics about the translations. Add a comment how produce even
2251            nicer statistics with sed.
2252    
2253    2003-12-09  Frank Koormann   <[email protected]>
2254    
2255            * Resources/Projections/defaults.proj:
2256            French projection sample with correct accents (UNICODE).
2257    
2258    2003-12-05  Bernhard Herzog  <[email protected]>
2259    
2260            * MANIFEST.in: Add the devtools directory
2261    
2262            * setup.py (setup call): Use license instead of licence. This
2263            silences a deprecation warning on Python 2.3
2264    
2265    2003-12-05  Frank Koormann   <[email protected]>
2266    
2267            Documentation synced with 1.0rc1
2268    
2269            * Doc/manual/thuban-manual.xml:
2270            Minor formatting changes and references to database layers .
2271            Introduction.Internationalization: New section on i18n.
2272            MapManagement.AddingandRemovingLayers: Added item on database layers.  
2273            MapManagement.TheLegend: Added section and screenshot on popup menu.
2274            ProjectionManagement: Updated screenshot and sentence on EPSG.
2275            Appendix.SupportedDataSources: Added PostGIS.
2276            Appendix.WorkingwithPostGIS: New section.
2277    
2278            * Doc/manual/images/6_projection.png: Updated screenshot including
2279            EPSG checkboxes.
2280    
2281            * Doc/manual/images/3_5_popup_menu.png: New, popup menu screenshot.
2282    
2283            * Doc/manual/images/app_postgis_add_layer.png,
2284            Doc/manual/images/app_postgis_db_add.png,
2285            Doc/manual/images/app_postgis_db_management.png:
2286            New screenshots focussing on database layers
2287    
2288    2003-12-05  Frank Koormann   <[email protected]>
2289    
2290            * Thuban/UI/projdialog.py (load_user_proj): If user.proj is missing
2291            write warning to stderr instead of rising a warning dialog
2292    
2293    2003-12-03  Bernhard Herzog  <[email protected]>
2294    
2295            Fix for RT #2243
2296    
2297            * Thuban/UI/mainwindow.py (MainWindow.has_selected_shape_layer):
2298            New. Like has_selected_layer but for shape layers only
2299            (_has_selected_shape_layer): New. Like _has_selected_layer but for
2300            shape layers only
2301            (layer_show_table command, layer_jointable command): Use these
2302            commands should only be available for shape layers
2303    
2304    2003-12-03  Bernhard Herzog  <[email protected]>
2305    
2306            * Thuban/UI/mainwindow.py (MainWindow.Unsubscribe): Deal with
2307            publishers that are wx objects and may have been destroyed by wx
2308            already. Fixes RT #2242.
2309    
2310    2003-12-03  Bernhard Herzog  <[email protected]>
2311    
2312            * po/ru.po: Updates from Alex Shevlakov
2313    
2314    2003-12-03  Silke Reimer <silkeintevation.de>
2315    
2316            * debian/control, debian/changelog: Added gdal-support to
2317                    debian package, updated to new thuban version
2318    
2319    
2320    2003-12-03  Bernhard Herzog  <[email protected]>
2321    
2322            * Thuban/Lib/version.py: New. Module for version number
2323            manipulations. The version of make_tuple here also deals better
2324            with more unusual version number strings, such as e.g.
2325            "1.2+cvs20031111"
2326    
2327            * Thuban/version.py (make_tuple): Removed. It's now in
2328            Thuban.Lib.version. Use that implementation instead.
2329    
2330            * test/test_lib_version.py: New. Tests for Thuban/Lib/version.py
2331    
2332    2003-12-02  Bernhard Herzog  <[email protected]>
2333    
2334            * MANIFEST.in: Add debian files
2335    
2336            * setup.py (setup call): Add packages for the Extensions so that
2337            they're installed too
2338            (data_files): Add READMEs and sample data from some Extensions
2339    
2340            * NEWS: Add note about the extensions in binary packages
2341    
2342    2003-12-02  Bernhard Herzog  <[email protected]>
2343    
2344            * Thuban/Model/save.py (SessionSaver.write_session): Save files
2345            with the thuban-1.0rc1
2346    
2347            * Thuban/Model/load.py (SessionLoader.__init__): Recognize the
2348            thuban-1.0rc1 namespace too
2349    
2350            * test/test_save.py (SaveSessionTest.dtd)
2351            (SaveSessionTest.testEmptySession)
2352            (SaveSessionTest.testSingleLayer)
2353            (SaveSessionTest.testLayerProjection)
2354            (SaveSessionTest.testRasterLayer)
2355            (SaveSessionTest.testClassifiedLayer)
2356            (SaveSessionTest.test_dbf_table)
2357            (SaveSessionTest.test_joined_table)
2358            (SaveSessionTest.test_save_postgis): Update to thuban-1.0rc1
2359            namespace
2360    
2361            * test/test_load.py (LoadSessionTest.dtd): Update to thuban-1.0rc1
2362            namespace
2363            (TestSingleLayer.file_contents)
2364            (TestNonAsciiColumnName.file_contents)
2365            (TestLayerVisibility.file_contents)
2366            (TestClassification.file_contents, TestLabels.file_contents)
2367            (TestLayerProjection.file_contents)
2368            (TestRasterLayer.file_contents, TestJoinedTable.file_contents)
2369            (TestPostGISLayer.file_contents)
2370            (TestPostGISLayerPassword.file_contents)
2371            (TestLoadError.file_contents, TestLoadError.test): Update to
2372            thuban-1.0rc1 namespace
2373    
2374    2003-12-01  Bernhard Herzog  <[email protected]>
2375    
2376            * setup.py (proj4_prefix, wx_prefix, gdal_prefix): Fix these for
2377            nt to better match Intevation's current w32 setup
2378    
2379            * HOWTO-Release: Add note about updating MANIFEST.in
2380    
2381            * MANIFEST.in: Add the Extensions
2382    
2383            * NEWS: Update for 1.0rc1
2384    
2385    2003-12-01  Bernhard Herzog  <[email protected]>
2386    
2387            * Thuban/UI/mainwindow.py (MainWindow.AddLayer): Change the wild
2388            cards for the dialog so that shapefiles ending in all uppercase
2389            SHP are listed too
2390    
2391    2003-11-28  Bernhard Herzog  <[email protected]>
2392    
2393            * Thuban/version.py (longversion): Update to 1.0rc1
2394    
2395            * setup.py (setup call): Update version to 1.0rc1. Use the
2396            [email protected] email address as author email instead of my
2397            personal one.
2398    
2399    2003-11-28  Bernhard Herzog  <[email protected]>
2400    
2401            * po/de.po: Update german translation.
2402    
2403    2003-11-28  Bernhard Herzog  <[email protected]>
2404    
2405            Unify the filenames stored in .thuban files so that the .thuban
2406            files are more platform independend
2407    
2408            * Thuban/Model/save.py (unify_filename): New. Unify filenames so
2409            that they can be used on both windows and unix
2410            (SessionSaver.prepare_filename): New. Handle all filename
2411            transformations for filenames stored in the thuban file
2412            (SessionSaver.write_data_containers, SessionSaver.write_layer):
2413            Use prepare_filename
2414    
2415            * test/test_save.py (SaveSessionTest.testSingleLayer)
2416            (SaveSessionTest.testLayerProjection)
2417            (SaveSessionTest.testRasterLayer)
2418            (SaveSessionTest.testClassifiedLayer)
2419            (SaveSessionTest.test_dbf_table)
2420            (SaveSessionTest.test_joined_table): Filenames are always stored
2421            with slashes on all currently supported platforms so adapt all
2422            tests to this
2423    
2424            * test/test_load.py (LoadSessionTest.filenames): With the new
2425            filename scheme the filenames in the tests should be
2426            understandable on all currently supported platforms so we turn
2427            this into an empty list because we don't have to normalize them
2428            anymore
2429    
2430    2003-11-28  Bernhard Herzog  <[email protected]>
2431    
2432            * test/test_layer.py (TestLayer.test_arc_layer_with_projection):
2433            Add the ellipsoid to the projection since some Proj versions
2434            complain if it's missing.
2435    
2436    2003-11-27  Bernhard Herzog  <[email protected]>
2437    
2438            Corect some bounding box projection problems
2439    
2440            * Thuban/Model/proj.py (Projection.InverseBBox): New. Inverse
2441            version of ForwardBBox
2442            (Projection._transform_bbox): New. common implementation of
2443            ForwardBBox and InverseBBox
2444            (Projection.ForwardBBox): Use _transform_bbox.
2445    
2446            * test/test_proj.py (TestProjection.test): Add test for
2447            InverseBBox
2448    
2449            * Thuban/Model/layer.py (Layer.LatLongBoundingBox)
2450            (Layer.ShapesBoundingBox, RasterLayer.LatLongBoundingBox): Use the
2451            new InverseBBox method to determine the unprojected bounding box
2452            (Layer.ShapesInRegion): Use the ForwardBBox method to project the
2453            bbox.
2454    
2455            * test/test_layer.py (TestLayer.test_point_layer_with_projection):
2456            Removed.
2457            (TestLayer.test_arc_layer_with_projection): New. This test is
2458            better able to test whether bounding boxes are projected correctly
2459            than test_point_layer_with_projection
2460    
2461            * Thuban/UI/viewport.py (ViewPort.map_projection_changed): Use
2462            InverseBBox to unproject bboxes
2463    
2464    2003-11-25  Bernhard Herzog  <[email protected]>
2465    
2466            * Thuban/UI/about.py (About.__init__): Make sure we have ASCII
2467            source code.
2468    
2469    2003-11-25  Bernhard Herzog  <[email protected]>
2470    
2471            * Thuban/Model/layer.py (Layer.__getattr__): Removed. It was only
2472            there for backwards compatibility and all code relying on that
2473            should have been updated by now.
2474    
2475    2003-11-25  Bernhard Herzog  <[email protected]>
2476    
2477            * test/test_load.py (TestClassification.test): Add the missing
2478            round trip test.
2479            (TestClassification.file_contents): Update to the newest file
2480            format
2481    
2482    2003-11-25  Bernhard Herzog  <[email protected]>
2483    
2484            Add very experimental (and possibly dangerous) extension to draw
2485            polygons:
2486    
2487            * Extensions/drawshape/README: New. Brief installation
2488            instructions
2489    
2490            * Extensions/drawshape/drawshape.py: New. Implementation of the
2491            drawshape extensions
2492    
2493            * Extensions/drawshape/patch.diff: Patch to apply before the
2494            extension can be used.
2495    
2496    2003-11-24  Bernhard Herzog  <[email protected]>
2497    
2498            * Thuban/Model/data.py (ShapefileStore._open_shapefile)
2499            (ShapefileStore.__init__): Factor opening the shapefile into a
2500            separate method (the new _open_shapefile). This makes the code a
2501            bit more readable but the real reason is that it makes some evil
2502            hacks easier. :-)
2503    
2504    2003-11-24  Bernhard Herzog  <[email protected]>
2505    
2506            * Thuban/Model/load.py (SessionLoader.check_attrs): If no
2507            converter is specified for an attribute assume it's a string
2508            containing only Latin1 characters. Update doc-string accordingly.
2509            This change should fix many places where unicode objects might
2510            accidentally enter Thuban.
2511    
2512            * test/test_load.py (TestNonAsciiColumnName): New test to check
2513            what happens with column names in DBF files that contain non-ascii
2514            characters
2515    
2516    2003-11-21  Bernhard Herzog  <[email protected]>
2517    
2518            Enable the experimental attribute editing again and introduce a
2519            command line switch to actually activate it
2520    
2521            * Thuban/UI/main.py (options): New. Container for options set on
2522            the commmand line
2523            (main): Add the --enable-attribute-editing flag.
2524    
2525            * Thuban/UI/identifyview.py (IdentifyView.__init__): If attribute
2526            editing is enabled use the grid ctrl which allows editing of the
2527            values
2528    
2529            * Thuban/Model/transientdb.py (AutoTransientTable.write_record):
2530            New. Just delegate this to the underlying table.
2531    
2532    2003-11-20  Bernhard Herzog  <[email protected]>
2533    
2534            * test/test_proj.py (ProjFileReadTests.test_read_unreadable_file):
2535            Skip this test if run under non-posix systems since it only works
2536            there
2537    
2538    2003-11-19  Bernhard Herzog  <[email protected]>
2539    
2540            * Thuban/Model/resource.py: Rework the way gdal support is
2541            determined so that we can give a reason in the about why gdal is
2542            not supported.
2543            (gdal_support_status): New. Variable holding a string with the
2544            reason for no gdal support
2545    
2546            * Thuban/UI/about.py (About.__init__): Add the reason why gdal is
2547            not supported to the message
2548    
2549    2003-11-19  Bernhard Herzog  <[email protected]>
2550    
2551            Remove the old table interface and its test cases
2552    
2553            * Thuban/Model/table.py (OldTableInterfaceMixin): Removed.
2554            (DBFTable, MemoryTable): Do not derive from OldTableInterfaceMixin
2555            anymore
2556    
2557            * Thuban/Model/transientdb.py (TransientTableBase)
2558            (AutoTransientTable): Do not derive from OldTableInterfaceMixin
2559            anymore
2560    
2561            * test/test_table.py: Removed since the old interface it tests is
2562            gone.
2563    
2564            * test/runtests.py (main): The old table interface is gone and
2565            with it the deprecation warnings so remove the code that turns
2566            these warnings into errors
2567    
2568    2003-11-19  Bernhard Herzog  <[email protected]>
2569    
2570            * test/test_table.py: Revert to revision 1.5 again. Changing the
2571            tests to use the new table interface is completely wrong since the
2572            whole purpose of the tests in this module is to test the old
2573            interface.
2574    
2575    2003-11-18  Bernhard Herzog  <[email protected]>
2576    
2577            * Thuban/Model/postgisdb.py (PostGISConnection.MatchesParameters):
2578            New. Test whether the connection matches a set of connection
2579            parameters
2580    
2581            * Thuban/UI/dbdialog.py (DBFrame.conns_changed): Fix doc-string
2582            (DBFrame.OnAdd): Use the new MatchesParameters method when looking
2583            for existing connections with the same parameters and break out of
2584            the loop correctly.
2585    
2586            * test/test_postgis_db.py (TestBriefDescription)
2587            (TestPostGISSimple.test_brief_description): Rename
2588            TestBriefDescription to TestPostGISSimple and the test method to
2589            test_brief_description so that we can add more test methods.
2590            (TestPostGISSimple.test_matches_parameters): New. Test the new
2591            MatchesParameters method
2592    
2593    2003-11-18  Bernhard Herzog  <[email protected]>
2594    
2595            * Thuban/Lib/connector.py (Publisher): Introduce a new flag,
2596            _was_destroyed, to indicate whether an publisher instance has
2597            already been destroyed.
2598            (Publisher.Unsubscribe): Only disconnect if the publisher has not
2599            been destroyed yet.
2600            (Publisher.Destroy): Set the _was_destroyed flag to true.
2601    
2602            * test/test_connector.py
2603            (TestPublisher.test_unsubscribe_after_destroy): New. Test that
2604            calling Unsubscribe after Destroy doesn't raise an exception
2605    
2606    2003-11-14  Bernhard Herzog  <[email protected]>
2607    
2608            * Thuban/UI/identifyview.py (IdentifyView.selected_shape): Fix
2609            typo in doc-string
2610    
2611    2003-11-13  Bernhard Herzog  <[email protected]>
2612    
2613            Quote table and column names properly for postgis.
2614    
2615            * Thuban/Model/postgisdb.py (quote_identifier): New. Function to
2616            quote an identifier for use in an sql statement
2617            (PostGISColumn.__init__): Add the quoted_name attribute
2618            (PostGISTable.__init__): New instance variable quoted_tablename
2619            (PostGISTable._fetch_table_information): Use the quoted table
2620            name. New isntance variable quoted_geo_col with a quoted version
2621            of geometry_column
2622            (PostGISTable.NumRows, PostGISTable.RowIdToOrdinal)
2623            (PostGISTable.RowOrdinalToId): Use the quoted table name
2624            (PostGISTable.ReadValue, PostGISTable.ValueRange)
2625            (PostGISTable.UniqueValues, PostGISTable.SimpleQuery)
2626            (PostGISShapeStore.BoundingBox, PostGISShapeStore.Shape)
2627            (PostGISShapeStore.AllShapes, PostGISShapeStore.ShapesInRegion):
2628            Use quoted table and column names
2629    
2630            * test/test_postgis_db.py (TestPostGISSpecialCases)
2631            (TestPostGISIgnoredColumns): Rename the class to
2632            TestPostGISSpecialCases because that better describes the new
2633            cases
2634            (TestPostGISSpecialCases.test_unsupported_types)
2635            (TestPostGISSpecialCases.test): Rename the method to
2636            test_unsupported_types because we need a more descriptive name now
2637            that there are more methods
2638            (TestPostGISSpecialCases.test_table_name_quoting)
2639            (TestPostGISSpecialCases.test_column_name_quoting)
2640            (TestPostGISSpecialCases.test_shapestore_name_quoting): New test
2641            cases to test quoting of table and column names in PostGISTable
2642            and PostGISShapeStore
2643    
2644            * test/postgissupport.py
2645            (skip_if_addgeometrycolumn_does_not_use_quote_ident): New. Skip if
2646            AddGeometryColumn desn't support table or column names with sapces
2647            or double quotes
2648    
2649    2003-11-12  Jan-Oliver Wagner <[email protected]>
2650    
2651            * Extensions/wms/__init__.py: New: Init to make this
2652            directory a package.
2653    
2654            * Extensions/wms/wms.py: New: Provide layers via OGC WMS.
2655    
2656    2003-11-11  Bernhard Herzog  <[email protected]>
2657    
2658            * Thuban/Model/resource.py (EPSG_DEPRECATED_PROJ_FILE): New.
2659            Constant for the file woth deprecated epsg projections
2660            (get_system_proj_file): Update doc-string
2661    
2662            * Thuban/UI/projdialog.py (ProjFrame.build_dialog): Add a space
2663            above the EPS widgets, introduce a check box for the deprecated
2664            eps projections and a label for the epsg widgets
2665            (ProjFrame._OnShowEPSG): Handle the deprecated EPSG projections
2666            too
2667    
2668    2003-11-11  Bernhard Herzog  <[email protected]>
2669    
2670            Avoid warnings when run under Python 2.3
2671    
2672            * Thuban/UI/baserenderer.py (BaseRenderer.draw_point_shape)
2673            (BaseRenderer.draw_label_layer): Coordinates must be ints.
2674    
2675            * Thuban/UI/renderer.py (MapRenderer.make_point): Turn this into a
2676            real method so that we can convert to int.
2677            (MapRenderer.label_font): The font size mist be an int.
2678    
2679            * Thuban/UI/common.py (Color2wxColour): The color values must be
2680            ints. Also, remove the unnecessary asserts.
2681    
2682            * test/test_load_0_8.py (TestUnicodeStrings.file_contents)
2683            (TestUnicodeStrings.test): Python source code should not contain
2684            non-ascii characters unless an encoding is specified in the file.
2685            Therefore use \x escapes in the string literals for non-ascii
2686            characters.
2687    
2688    2003-11-11  Bernhard Herzog  <[email protected]>
2689    
2690            * Thuban/Model/resource.py (get_system_proj_file): Add a filename
2691            parameter so that this function can be used for all proj files in
2692            Resource/Projections
2693            (DEFAULT_PROJ_FILE, EPSG_PROJ_FILE): New. Predefined filenames for
2694            get_system_proj_file
2695    
2696            * Thuban/UI/projdialog.py (ProjFrame.__init__): Instead of one
2697            ProjFile self.__sysProjFile use a dictionary of system ProjFile
2698            objects self._sys_proj_files
2699            (ProjFrame.build_dialog): Adapt to the new changes in the
2700            ProjectionList constructor. Add a check button to toggle whether
2701            EPSG projections are shown
2702            (ProjFrame._OnShowEPSG): New. Handler for the epsg check button
2703            events.
2704            (ProjFrame.load_user_proj, ProjFrame.load_system_proj): Only show
2705            the busy cursor if the files have not yet been loaded by the
2706            dialog.
2707            (ProjFrame.load_system_proj): Add a parameter for the name of the
2708            proj file. Maintain the dictionary of system projections
2709            self._sys_proj_files
2710    
2711            * Thuban/UI/projlist.py (ProjectionList): Merge the system_projs,
2712            user_projs parameters into one parameter proj_files which is a
2713            list of proj files.
2714            (ProjectionList._subscribe_proj_files)
2715            (ProjectionList._unsubscribe_proj_files): New. Move
2716            subscription/unsubscription of projfile messages to separate
2717            methods
2718            (ProjectionList.Destroy): The unsubscribe is now done in
2719            _unsubscribe_proj_files
2720            (ProjectionList.update_projections): We now have a list of proj
2721            file objects
2722            (ProjectionList.SetProjFiles): New method to set a new list of
2723            proj file objects
2724    
2725            * test/test_proj.py (ProjFileReadTests.test_get_system_proj_file):
2726            Specify explicitly which system proj file to load.
2727    
2728    2003-11-11  Bernhard Herzog  <[email protected]>
2729    
2730            * Thuban/Model/load.py (SessionLoader.Destroy): New. Clear all
2731            instance variables to cut cyclic references. The GC would have
2732            collected the loader eventually but it can happen that it doesn't
2733            run at all until thuban is closed (2.3 but not 2.2 tries a bit
2734            harder and forces a collection when the interpreter terminates)
2735            (load_session): Call the handler's Destroy method to make sure
2736            that it gets garbage collected early. Otherwise it will be
2737            collected very late if at all and it holds some references to e.g.
2738            shapestores and the session which can lead to leaks (of e.g. the
2739            temporary files)
2740    
2741            * test/test_load.py (TestSingleLayer.test_leak): New. test for the
2742            resource leak in load_session
2743    
2744    2003-11-10  Bernhard Herzog  <[email protected]>
2745    
2746            * Thuban/UI/baserenderer.py: Add a way to specify how layers in
2747            extensions are to be rendered.
2748            (_renderer_extensions): New. List with renderer for layers in
2749            extensions
2750            (add_renderer_extension): New. Add a renderer extension
2751            (init_renderer_extensions): New. Init the renderer extensions
2752            (BaseRenderer.render_map_incrementally): Search
2753            _renderer_extensions for how to draw unknown layer types
2754            (BaseRenderer.draw_raster_data): Add format parameter so that
2755            formats other than BMP can be drawn
2756            (BaseRenderer.draw_raster_layer): Pass an explicit format to
2757            draw_raster_data
2758    
2759            * Thuban/UI/renderer.py (raster_format_map): New. Mapping form the
2760            strings of the format parameter of draw_raster_data method to wx
2761            constants
2762            (MapRenderer.draw_raster_data): Add the format parameter and use
2763            raster_format_map to map it to the right wxwindows constant for
2764            wxImageFromStream
2765    
2766            * test/test_baserenderer.py (SimpleRenderer.draw_raster_data): Add
2767            the format parameter and record it
2768            (TestBaseRenderer.test_raster_no_projection): check the format
2769            paramter of the draw_raster_data method
2770            (TestBaseRenderer.test_renderer_extension): New. Test the renderer
2771            extension facility
2772    
2773    2003-11-07  Bernhard Herzog  <[email protected]>
2774    
2775            Tweak the usage of the sqlite database to make common use cases
2776            more responsive. In most cases copying the data to the sqlite
2777            database takes so long that using sqlite doesn't have enough
2778            advantages.
2779    
2780            * Thuban/Model/transientdb.py (TransientTableBase.ValueRange): Add
2781            comments about performance and query the min and max in separate
2782            statements because only that way will indexes be used.
2783            (TransientTableBase.UniqueValues): Add some comments about
2784            performance.
2785            (AutoTransientTable.ValueRange, AutoTransientTable.UniqueValues):
2786            Do not copy the data to the transient DB but use the transient
2787            copy if it exists. See the new comments for the performance trade
2788            offs
2789    
2790            * test/test_transientdb.py
2791            (TestTransientTable.test_auto_transient_table): Make sure that the
2792            data is copied to the transient database at some point.
2793    
2794    2003-11-03  Bernhard Herzog  <[email protected]>
2795    
2796            * Thuban/Model/data.py (ShapefileStore.ShapesInRegion): Bind some
2797            globals to locals so that it's a bit faster
2798    
2799    2003-11-03  Bernhard Herzog  <[email protected]>
2800    
2801            * Thuban/UI/baserenderer.py
2802            (BaseRenderer.draw_shape_layer_incrementally): Use the ReadValue
2803            method. ReadValue is faster than ReadRowAsDict since it only reads
2804            one cell especially now that the dbf file objects actually
2805            implement it.
2806    
2807            * Thuban/Model/table.py (DBFTable.ReadValue): Use the new
2808            read_attribute method of the dbf objects
2809    
2810    2003-11-03  Bernhard Herzog  <[email protected]>
2811    
2812            * Extensions/profiling/profiling.py (popup_dialog_box): New config
2813            variable to indicate whether the result should be shown in a
2814            dialog box
2815            (profile_screen_renderer, time_screen_renderer): Only show a
2816            dialog box if popup_dialog_box is true.
2817            (profile_screen_renderer): Flush stdout after the printing the
2818            first part of the "profiling..." message
2819    
2820            * Thuban/UI/baserenderer.py
2821            (BaseRenderer.draw_shape_layer_incrementally): Cache the pens and
2822            brushes for the groups so that they're not created over and over
2823            again
2824    
2825            * Thuban/Model/classification.py (Classification.__getattr__)
2826            (Classification._compile_classification)
2827            (Classification._clear_compiled_classification): New. Methods to
2828            manage a 'compiled' representation of the classification groups
2829            which is created on demand
2830            (Classification.InsertGroup, Classification.RemoveGroup)
2831            (Classification.ReplaceGroup): reset the compiled representation
2832            (Classification.FindGroup): Use the compiled representation to
2833            find the matching group
2834            (ClassGroupRange.GetRangeTuple): New. Return the range as a tuple
2835    
2836    2003-10-31  Bernhard Herzog  <[email protected]>
2837    
2838            * Thuban/Model/classification.py (Classification.SetDefaultGroup):
2839            Send a CLASS_CHANGED message
2840            (Classification.RemoveGroup): Send a CLASS_CHANGED message and do
2841            not return the removed group since it wasn't used.
2842    
2843            * test/test_classification.py
2844            (TestClassification.test_set_default_group): New. Test the
2845            SetDefaultGroup method
2846            (TestClassification.test_insert_group): New. Test the InsertGroup
2847            method
2848            (TestClassification.test_remove_group): New. Test the RemoveGroup
2849            method
2850            (TestClassification.test_replace_group): New. Test the
2851            ReplaceGroup method
2852    
2853    2003-10-31  Bernhard Herzog  <[email protected]>
2854    
2855            * test/test_classification.py (TestClassification.setUp):
2856            Subscribe to the CLASS_CHANGED messages
2857            (TestClassification.tearDown): New. Destroy the classification
2858            properly
2859            (TestClassification.test_defaults): Add tests for the default line
2860            width and whether no messages were sent yet
2861            (TestClassification.test_set_default_properties): Add tests for
2862            messages and setting the default line width
2863            (TestClassification.test_add_singleton)
2864            (TestClassification.test_add_range)
2865            (TestClassification.test_multiple_groups): Add tests for messages
2866    
2867    2003-10-31  Bernhard Herzog  <[email protected]>
2868    
2869            Some more refactoring in preparation for new tests:
2870    
2871            * test/test_classification.py (TestClassification.setUp): New.
2872            Instantiate the classification here. Update the test methods
2873            accordingly.
2874            (TestClassification.test_multiple_groups): Make sure that the two
2875            singletons matching 1 are considered different.
2876    
2877    2003-10-31  Bernhard Herzog  <[email protected]>
2878    
2879            * test/test_classification.py (red, green, blue): New. These
2880            constants were used in several cases. Update the relevant methods.
2881            (TestClassification.test_defaults)
2882            (TestClassification.test_set_default_properties)
2883            (TestClassification.test_add_singleton)
2884            (TestClassification.test_add_range)
2885            (TestClassification.test_multiple_groups)
2886            (TestClassification.test_deepcopy): New. These were formerly all
2887            part of the single method test.
2888            (TestClassification.test_deepcopy): Removed.
2889            (TestClassIterator): Removed. The test case is now a method of
2890            TestClassification since it tests part of the public interface of
2891            Classification
2892            (TestClassification.test_iterator): New. Used to be
2893            TestClassIterator effectively
2894    
2895    2003-10-31  Jan-Oliver Wagner <[email protected]>
2896    
2897            GUIfied the functions of the profiling extension.
2898    
2899            * /Extensions/profiling/__init__.py: New: Init to make this
2900            directory a package.
2901    
2902            * Extensions/profiling/profiling.py: Moved menu entries to
2903            the Extensions menu. Applied _() for strings.
2904            (profile_screen_renderer): Catch the detailed printout and present
2905            it in a dialog.
2906            (time_screen_renderer): Raise a dialog to present the result instead
2907            of printing it to stdout.
2908    
2909    2003-10-31  Bernhard Herzog  <[email protected]>
2910    
2911            * test/test_classification.py (TestClassGroupProperties)
2912            (TestClassGroup, TestClassGroupDefault, TestClassGroupRange)
2913            (TestClassGroupSingleton, TestClassIterator, TestClassification):
2914            Split TestClassification into several classes, one for each class
2915            being tested. TestClassification itself now only tests
2916            Classification. This split makes changes to the tests a bit easier
2917    
2918    2003-10-31  Bernhard Herzog  <[email protected]>
2919    
2920            * Extensions/profiling/profiling.py: New. Extension to measure
2921            Thuban performance
2922    
2923    2003-10-31  Frank Koormann <[email protected]>
2924    
2925            Added two items to legend popup menu: Remove Layer and Show Layer Table
2926    
2927            * Thuban/UI/legend.py (LegendPanel._OnRemoveLayer,
2928            LegendPanel._OnShowTable): New event handlers, call the corresponding
2929            mainwindow methods.
2930            (LegendTree._OnRightClick): Added items to popup menu.
2931    
2932    2003-10-30  Bernhard Herzog  <[email protected]>
2933    
2934            * Thuban/UI/dialogs.py (ThubanFrame.__init__): Handle
2935            EVT_WINDOW_DESTROY
2936            (ThubanFrame.OnDestroy): New. Handler for EVT_WINDOW_DESTROY. Does
2937            nothing but is convenient for the derived classes.
2938    
2939            * Thuban/UI/tableview.py
2940            (TableFrame.OnDestroy, LayerTableFrame.OnDestroy): New.
2941            Unsubscribe the messages here not in OnClose because that might
2942            get called multiple times. Fixes RT #2196
2943            (TableFrame.OnClose, LayerTableFrame.OnClose): Removed. Not needed
2944            anymore.
2945    
2946            * README: Update the minimum requirement for wxPython. Since we
2947            now use the EVT_WINDOW_DESTROY event, we need at least 2.4.0.4,
2948            the version in which that was introduced for all platforms
2949    
2950    2003-10-30  Frank Koormann <[email protected]>
2951    
2952            * Thuban/UI/join.py (JoinDialog.OnJoin): Wrapped the major parts of
2953            the join process in a ThubanBeginBusyCursor, ThubanEndBusyCursor
2954            frame.
2955    
2956    2003-10-30  Jan-Oliver Wagner <[email protected]>
2957    
2958            Improved APR import extension, added further EPSG definitions
2959            and some cleanup regarding string class.
2960    
2961            * test/test_proj.py (TestProjection.test_get_projection_units_geo):
2962            Added test for alias 'longlat'.
2963    
2964            * Resources/Projections/epsg-deprecated.proj: New. Contains
2965            deprecated EPSG definitions.
2966    
2967            * Extensions/importAPR/odb.py (ODBBaseObject.TreeInfo): Added
2968            the variable names for objects.
2969    
2970            * Extensions/importAPR/apr.py (APR_BLnSym, APR_BMkSym, APR_BShSym): New.
2971            Copied from importAPR and provided with documentation.
2972    
2973            * Extensions/importAPR/importAPR.py (APR_BLnSym, APR_BMkSym, APR_BShSym):
2974            Moved to apr.py.
2975            (APR_View): Added object ref 'ITheme'.
2976    
2977            * Thuban/Lib/fileutil.py, Thuban/UI/proj4dialog.py: Replaced string
2978            split function by corresponding use of the string class method.
2979    
2980            * Thuban/Model/xmlwriter.py: Replaced string replace function by
2981            corresponding string method.
2982    
2983    2003-10-29  Bernhard Herzog  <[email protected]>
2984    
2985            * Thuban/UI/baserenderer.py
2986            (BaseRenderer.draw_shape_layer_incrementally): Speed up the
2987            special case of a classification that only has the default group
2988    
2989    2003-10-27  Bernhard Herzog  <[email protected]>
2990    
2991            * po/fr.po, po/es.po: Updated translations from Daniel Calvelo
2992    
2993            * po/de.po: Update.
2994    
2995            * Thuban/UI/application.py
2996            (ThubanApplication.ShowExceptionDialog): Handle translation of the
2997            dialog message properly
2998    
2999    2003-10-27  Bernhard Herzog  <[email protected]>
3000    
3001            Rework how localization works so that we use wx's translation
3002            functions when running Thuban as a normal application but not when
3003            we don't need any UI, such as in the test suite. See the comment
3004            in Thuban/__init__.py for details
3005    
3006            * Thuban/__init__.py (_): Add one level of indirection to make the
3007            translation handling more flexible and to make it possible to use
3008            either wx's translation services or not.
3009            (gettext_identity, translation_function_installed)
3010            (install_translation_function): New function to help with this
3011    
3012            * Thuban/UI/__init__.py: Install the wx specific translation
3013            function if it's OK to do that
3014    
3015            * test/support.py (initthuban): Install a dummy translation
3016            function so that importing Thuban.UI doesn't install a wx specific
3017            one for which would need to import wxPython
3018    
3019    2003-10-27  Bernhard Herzog  <[email protected]>
3020    
3021            * HOWTO-Release: Source archives should be created first and the
3022            binary packages should be created from the source archives.
3023            There's an official debian package now so there's no need to test
3024            the rpm on debian anymore
3025    
3026    2003-10-27  Bernhard Herzog  <[email protected]>
3027    
3028            Several rendering changes:
3029    
3030             - Render the selection into a separate bitmap so that only that
3031               bitmap needs to be redrawn when the selection changes
3032    
3033             - Render incrementally showing previews and allowing interaction
3034               before rendering is complete
3035    
3036             - Update the renderer interface a bit. Most parameters of
3037               RenderMap are now parameters of the constructor
3038    
3039            * Thuban/UI/baserenderer.py (BaseRenderer.__init__): Add the map
3040            and the update region as parameters. Update the doc-string
3041            (BaseRenderer.render_map_incrementally): New. Generator function
3042            to renders the map incrementally
3043            (BaseRenderer.render_map): Remove the map argument (it's now in
3044            the constructor) and simply iterate over the
3045            render_map_incrementally generator to draw the map.
3046            (BaseRenderer.draw_shape_layer_incrementally)
3047            (BaseRenderer.draw_shape_layer): Renamed to
3048            draw_shape_layer_incrementally and changed into a generator that
3049            yields True every 500 shapes. Used by render_map_incrementally to
3050            render shape layers incrementally
3051    
3052            * Thuban/UI/renderer.py (ScreenRenderer.RenderMap): Removed the
3053            map and region parameters which are now in the constructor
3054            (ScreenRenderer.RenderMapIncrementally): New. Public frontend for
3055            the inherited render_map_incrementally.
3056            (BaseRenderer.draw_shape_layer): Removed.
3057            (ScreenRenderer.draw_selection_incrementally): New. The selection
3058            drawing part of the removed draw_shape_layer as a generator
3059            (ScreenRenderer.layer_shapes): Update because of the region
3060            parameter change
3061            (ExportRenderer.__init__): New. Extend the inherited constructor
3062            with the destination region for the drawing
3063            (ExportRenderer.RenderMap): Removed the map and region parameters
3064            which are now in the constructor
3065    
3066            * Thuban/UI/view.py (MapCanvas.PreviewBitmap): New. Return a
3067            bitmap suitable for a preview in a tool
3068            (CanvasPanTool.MouseMove): Use the PreviewBitmap method to get the
3069            bitmap
3070            (MapPrintout.draw_on_dc): Adapt to new renderer interface
3071            (MapCanvas.OnPaint): Handle drawing the selection bitmap if it
3072            exists
3073            (MapCanvas.OnIdle): Update the logic to deal with incremental
3074            rendering and the selection bitmap
3075            (MapCanvas._do_redraw): Handle the instantiation of the render
3076            iterator and the redraws during rendering
3077            (MapCanvas._render_iterator): New. Generator to incrementally
3078            redraw both bitmaps
3079            (MapCanvas.Export): Adapt to new renderer interface.
3080            (MapCanvas.full_redraw): Reset the selection bitmap and the
3081            renderer iterator too
3082            (MapCanvas.redraw_selection): New. Force a redraw of the selection
3083            bitmap
3084            (MapCanvas.shape_selected): Only redraw the selection bitmap
3085    
3086            * test/test_baserenderer.py
3087            (TestBaseRenderer.test_polygon_no_projection)
3088            (TestBaseRenderer.test_raster_no_projection)
3089            (TestBaseRenderer.test_point_map_projection)
3090            (TestBaseRenderer.test_point_layer_and_map_projection)
3091            (TestBaseRenderer.test_point_layer_projection)
3092            (TestBaseRenderer.test_point_with_classification): Adapt to new
3093            renderer interface
3094    
3095    2003-10-24  Bernhard Herzog  <[email protected]>
3096    
3097            * libraries/thuban/wxproj.cpp (draw_polygon_shape)
3098            (point_in_polygon_shape, shape_centroid): Raise an exception if
3099            the shape can't be read. Previously invalid shape ids would lead
3100            to a segfault.
3101    
3102            * test/test_wxproj.py (TestShapeCentroid.test_invalid_shape_id):
3103            New. test whether an exception is raised for invalid shape ids
3104    
3105    2003-10-24  Jan-Oliver Wagner <[email protected]>
3106    
3107            * Thuban/Model/proj.py (Projection.GetProjectedUnits): Added 'longlat'
3108            as alias for 'latlong'.
3109    
3110            * Thuban/UI/projdialog.py (ProjFrame.__init__): Added 'longlat'
3111            as alias for 'latlong'.
3112    
3113    2003-10-24  Jan-Oliver Wagner <[email protected]>
3114    
3115            * Thuban/UI/projdialog.py (ProjFrame.proj_selection_changed): Set
3116            the projection even for the UnknownPanel.
3117            (UnknownProjPanel.__init__): Define the text and create the textctrl
3118            widget.
3119            (UnknownProjPanel._DoLayout): Replaced static text widget by the
3120            textctrl created in __init__.
3121            (UnknownProjPanel.SetProjection): Set the text for the text ctrl
3122            including the parameters of the projection.
3123            
3124    2003-10-24  Jan-Oliver Wagner <[email protected]>
3125    
3126            * Resources/Projections/epsg.proj: New. This is a list of
3127            EPSG codes with parameters for proj. The list has been
3128            generated using devtools/create_epsg.py based on the
3129            file nad/epsg of the proj 4.4.7 package. Four projection
3130            definitions have been deleted as they are not accepted by proj:
3131            "CH1903+ / LV95", "Bern 1898 (Bern) / LV03C", "CH1903 / LV03"
3132            and "HD72 / EOV".
3133    
3134    2003-10-22  Bernhard Herzog  <[email protected]>
3135    
3136            Some more tweaks to the projection dialog which should fix RT
3137            #1886.
3138    
3139            * Thuban/UI/projlist.py (ProjectionList.Destroy): Unsubscribe from
3140            the ProjFile's messages and call the base class methods correctly
3141            (ProjectionList.SelectProjection): Set the wxLIST_STATE_FOCUSED
3142            flag on the newly selected item too. Otherwise some other item is
3143            focused and the first time the focus is moved with the keyboard
3144            the selection moves in unexpected ways.
3145    
3146            * Thuban/UI/projdialog.py (ProjFrame.__init__): Do not set the
3147            focus on the OK button, only on the projection list. That way the
3148            list really has the focus initially
3149            (ProjFrame.OnClose): Call the projection list's Destroy method to
3150            make it unsubscribe all messages
3151    
3152    2003-10-21  Bernhard Herzog  <[email protected]>
3153    
3154            Rework the projection dialog to fix a few bugs, including RT 2166
3155            and most of 2168
3156    
3157            * Thuban/UI/projlist.py: New. The class ProjectionList is a
3158            special wxListCtrl to show a list of projections in a more MVC
3159            fashion
3160    
3161            * Thuban/UI/projdialog.py (ProjFrame): Substantial changes
3162            throughout the class. The main change is to use the ProjectionList
3163            class instead of a normal wxListBox. Also, add an explicit
3164            "Unknown" projection to the projection choice control.
3165            (ProjPanel.__init__): Add an "unknown" ellipsoid
3166            (TMPanel.__init__, LCCPanel.__init__): Tweak the order of
3167            instantiation of the panel's controls to make the tab-order more
3168            natural
3169    
3170    2003-10-21  Bernhard Herzog  <[email protected]>
3171    
3172            * test/test_load.py (TestSingleLayer.file_contents)
3173            (TestSingleLayer.test): Add non-ascii characters to the titles of
3174            session, map and layer. This is effectively a port of the
3175            TestUnicodeStrings test in test_load_0_8.py which for some reason
3176            was only added there.
3177    
3178            * test/test_load_0_9.py (TestSingleLayer.file_contents)
3179            (TestSingleLayer.test): Same as in test_load.py: add non-ascii
3180            characters to the titles of session, map and layer,.
3181    
3182    2003-10-21  Bernhard Herzog  <[email protected]>
3183    
3184            Add EPSG projection handling to .thuban files
3185    
3186            * test/test_save.py (SaveSessionTest.dtd)
3187            (SaveSessionTest.testEmptySession)
3188            (SaveSessionTest.testLayerProjection)
3189            (SaveSessionTest.testRasterLayer)
3190            (SaveSessionTest.testClassifiedLayer)
3191            (SaveSessionTest.test_dbf_table)
3192            (SaveSessionTest.test_joined_table)
3193            (SaveSessionTest.test_save_postgis): Update to 1.0-dev namespace
3194            (SaveSessionTest.testSingleLayer): Update to 1.0-dev namespace and
3195            use a and epsg projection to test saving them
3196    
3197            * test/test_load.py (LoadSessionTest.dtd): Update to 1.0-dev
3198            namespace
3199            (TestLayerVisibility.file_contents, TestLabels.file_contents)
3200            (TestLayerProjection.file_contents)
3201            (TestRasterLayer.file_contents, TestJoinedTable.file_contents)
3202            (TestPostGISLayer.file_contents)
3203            (TestPostGISLayerPassword.file_contents)
3204            (TestLoadError.file_contents, TestLoadError.test): Update to use
3205            1.0-dev namespace
3206            (TestSingleLayer.file_contents, TestSingleLayer.test): Update to
3207            use 1.0-dev namespace and use an EPSG projection to test whether
3208            loading it works
3209    
3210            * test/test_load_0_9.py: New. Effectively a copy of test_load.py
3211            as of Thuban 0.9. These are now tests to determine whether Thuban
3212            can still read files generated by Thuban 0.9
3213    
3214            * Thuban/Model/save.py (SessionSaver.write)
3215            (SessionSaver.write_session): Use the 1.0 dtd and 1.0-dev
3216            namespace
3217            (SessionSaver.write_projection): Write the projection's epsg
3218            attribute
3219    
3220            * Thuban/Model/load.py (SessionLoader.__init__): Also accept the
3221            thuban-1.0-dev.dtd namespace
3222            (SessionLoader.check_attrs): Allow a callable object as conversion
3223            too
3224            (SessionLoader.start_projection, SessionLoader.end_projection)
3225            (SessionLoader.start_parameter): Handle the epsg attribute and
3226            rename a few instance variables to lower case
3227    
3228            * Resources/XML/thuban-1.0.dtd: New. Only difference to
3229            thuban-0.9.dtd is the epsg attribute for projections.
3230    
3231    2003-10-21  Bernhard Herzog  <[email protected]>
3232    
3233            * test/runtests.py (main): Let the user specify which tests to run
3234            on the command line
3235    
3236            * test/support.py (ThubanTestResult.getDescription): Override to
3237            give a better short description. The description can be used as a
3238            parameter to run_tests to run that particular test in isolation.
3239    
3240    2003-10-21  Frank Koormann   <[email protected]>
3241    
3242            Popup menu for legend. Scheduled for the 1.2 release this was too
3243            simple to implement: The popup menu is bound to the legend tree, while
3244            the events are hanlded by its anchestor, the legend panel. This
3245            allows reuse of all the event handlers already implemented for the
3246            legend toolbar buttons.
3247    
3248            * Thuban/UI/legend.py (LegendPanel.__init__): EVT_MENU macros
3249            to add handlers for the events issued by the popup menu.
3250            (LegendPanel._OnToggleVisibility): Handler for toggling layer
3251            visibility event
3252            (LegendPanel._OnProjection): Handler for layer projection event.
3253            (LegendTree.__init__): Added EVT_TREE_ITEM_RIGHT_CLICK
3254            (LegendTree._OnRightClick): Event handler for right click, select item
3255            and pop up menu.
3256            (LegendTree.ToggleVisibility): Toggle layer visibility
3257            (LegendTree.LayerProjection): Raise layer projection dialog for
3258            current layer.
3259    
3260    2003-10-21  Bernhard Herzog  <[email protected]>
3261    
3262            * Resources/Projections/defaults.proj: Use correct DOCTYPE
3263            declaration. The top-level element is projectionlist not projfile
3264    
3265    2003-10-20  Bernhard Herzog  <[email protected]>
3266    
3267            * Thuban/UI/projdialog.py (ProjFrame.write_proj_file): New. helper
3268            method to write a projfile and display a busy cursor and error
3269            dialogs.
3270            (ProjFrame._OnSave, ProjFrame._OnAddToList, ProjFrame._OnImport)
3271            (ProjFrame._OnExport, ProjFrame._OnRemove): Use write_proj_file
3272            (ProjFrame.__FillAvailList): Translate "<None>" too and display a
3273            busy cursor while loading the user and system prj files.
3274    
3275    2003-10-16  Bernhard Herzog  <[email protected]>
3276    
3277            * Thuban/Model/resource.py (projfile_cache): Introduce a cache for
3278            ProjFile objects
3279            (clear_proj_file_cache): New function to clear the cache. Mainly
3280            useful for use by the test suite
3281            (read_proj_file): Use the cache.
3282    
3283            * test/test_proj.py (TestProjFile): Clarify the doc-string
3284            (ProjFileReadTests): Update doc-string
3285            (ProjFileReadTests.test_get_system_proj_file): Check whether the
3286            system proj files is cached.
3287            (ProjFileLoadTestCase): New base class for the proj file tests
3288            derived from support.FileLoadTestCase to provide some common
3289            behavior.
3290            (TestLoadingProjFile)
3291            (TestLoadingProjFileWithEmptyProjectionlist.file_contents)
3292            (TestProjFileWithInvalidParameters.file_contents): Derive from
3293            ProjFileLoadTestCase
3294            (TestLoadingProjFile.test_caching): New. Test whether the cache
3295            works
3296    
3297    2003-10-16      Silke Reimer    <[email protected]>
3298    
3299            * debian/*: New directory with configuration files for building a thuban
3300              deb-package.
3301    
3302    2003-10-14  Bernhard Herzog  <[email protected]>
3303    
3304            * test/test_proj.py: Execute support.run_tests when run as
3305            __main__ so that missing unsubscribes are detected
3306            (TestProjFile.tearDown): Destroy the proj_file properly
3307    
3308    2003-10-14  Bernhard Herzog  <[email protected]>
3309    
3310            * Thuban/Model/messages.py (PROJECTION_ADDED)
3311            (PROJECTION_REPLACED, PROJECTION_REMOVED): New message types for
3312            the ProjFile objects
3313    
3314            * Thuban/Model/proj.py (ProjFile): Derive from Publisher so we can
3315            easily send messages when the projections change
3316            (ProjFile.Add, ProjFile.Remove, ProjFile.Replace): Issue messages
3317            when the change was successful
3318    
3319            * test/test_proj.py (TestProjFile.setUp): Subscribe to some of the
3320            proj file messages
3321            (TestProjFile.test_add_remove)
3322            (TestProjFile.test_remove_non_existing)
3323            (TestProjFile.test_replace)
3324            (TestProjFile.test_replace_non_existing): Test whether the right
3325            messages are sent
3326    
3327    2003-10-14  Bernhard Herzog  <[email protected]>
3328    
3329            * test/test_proj.py (TestProjFile.test): Refactor into several
3330            tests
3331            (TestProjFile.test_add_remove)
3332            (TestProjFile.test_remove_non_existing)
3333            (TestProjFile.test_replace)
3334            (TestProjFile.test_replace_non_existing): Some of the new
3335            individual test cases
3336            (TestProjFileSimple): New class for the rest of the test cases
3337            that came out of the refactoring
3338            (ProjFileTest): Derive from xmlsupport.ValidationTest so that the
3339            derived classes don't have to
3340    
3341    2003-10-13  Bernhard Herzog  <[email protected]>
3342    
3343            Add an optional EPSG code to the projection objects and extend the
3344            .proj file format accordingly.
3345    
3346            * Resources/XML/projfile.dtd (element projection): Add epsg
3347            attribute
3348    
3349            * Thuban/Model/proj.py (Projection.__init__): New parameter and
3350            instance variable epsg. Update doc-string
3351            (Projection.EPSGCode, Projection.Label): New methods to provide
3352            access to EPSG code and a label for use in dialogs
3353    
3354            * Thuban/Model/resource.py (ProjFileReader.start_projection)
3355            (ProjFileReader.end_projection, ProjFileSaver.write_projfile):
3356            Handle the epsg code attribute when reading or writing proj files
3357    
3358            * Thuban/UI/projdialog.py (ProjFrame._OnSave)
3359            (ProjFrame._OnAddToList, ProjFrame.__DoOnProjAvail)
3360            (ProjFrame.__FillAvailList): Use the projection's Label method to
3361            get the string for the list box
3362    
3363            * test/test_proj.py (TestProjection.test_label)
3364            (TestProjection.test_label_epsg)
3365            (TestProjection.test_epsgcode_for_non_epsg_projection)
3366            (TestProjection.test_epsgcode_for_real_epsg_projection): New tests
3367            for the label and EPSGCode methods
3368            (WriteProjFileTests.doTestWrite, WriteProjFileTests.test_write)
3369            (WriteProjFileTests.test_write_empty_file): Create the ProjFile
3370            objects in the test cases and put the expected contents into the
3371            test case methods too. Update doTestWrite accordingly
3372            (TestLoadingProjFile)
3373            (TestLoadingProjFileWithEmptyProjectionlist): New classes with the
3374            read tests from TestProjFile.
3375            (TestProjFile.doTestRead, TestProjFile.testRead): Removed. These
3376            tests are now in the new classes.
3377            (sample_projfile, sample_projfile_data)
3378            (sample_projfile2, sample_projfile_data2): Removed. Not used
3379            anymore.
3380            (TestProjFile.test_read_unreadable_file): No need to reset the
3381            permissions at the end anymore since we use a unique filename
3382    
3383    2003-10-13  Bernhard Herzog  <[email protected]>
3384    
3385            * test/test_proj.py: Some more refactoring of the test cases
3386            (ProjFileTest): New base class for the proj file tests.
3387            (TestProjFile): Derive from ProjFileTest
3388            (TestProjFile.test_read_unreadable_file)
3389            (TestProjFile.test_read_empty_file, TestProjFile.doTestRead): Use
3390            the new filename method to get a unique filename
3391            (TestProjFile.doTestWrite, TestProjFile.testWrite): Removed.
3392            (WriteProjFileTests): New class for proj file write tests.
3393            Contains the write test that were in TestProjFile originally.
3394    
3395    2003-10-13  Bernhard Herzog  <[email protected]>
3396    
3397            * test/test_proj.py (TestProjFile.testRead)
3398            (TestProjFile.test_read_non_existing_file)
3399            (TestProjFile.test_read_unreadable_file)
3400            (TestProjFile.test_read_empty_file): Split into several methods.
3401    
3402    2003-10-10  Bernhard Herzog  <[email protected]>
3403    
3404            * Thuban/UI/sizers.py: New file with custom sizers.
3405    
3406            * Thuban/UI/projdialog.py (ProjFrame.build_dialog): Instantiate
3407            all projection type specific panels and put them into a
3408            NotebookLikeSizer. This way the dialog doesn't change its size
3409            when a different projection is selected
3410            (ProjFrame.__init__): Rename projection_panels
3411            projection_panel_defs and reuse projection_panels for a list of
3412            the instantiated panels.
3413            (ProjFrame._show_proj_panel, ProjFrame.__DoOnProjAvail)
3414            (ProjFrame.__DoOnProjChoice): Changes due to the new handling of
3415            the panels
3416            (UnknownProjPanel._DoLayout): Place the newlines in the message
3417            differently to make the panel narrower.
3418            (TMPanel._DoLayout): Layout the parameters in one column.
3419    
3420    2003-10-10  Bernhard Herzog  <[email protected]>
3421    
3422            * Thuban/UI/projdialog.py (ProjFrame.build_dialog): New method
3423            that contains all the setup for the dialog's widgets, layout and
3424            event handling.
3425            (__): Call build_dialog to build the dialog.
3426            (ProjFrame.__set_properties, ProjFrame.__do_layout): Removed.
3427            Their functionality is now in build_dialog
3428            (ProjFrame.__VerifyButtons, ProjFrame.__VerifyButtons)
3429            (ProjFrame.__DoOnProjAvail, ProjFrame.__DoOnProjAvail)
3430            (ProjFrame.__DoOnProjChoice): Small updates due to slightly
3431            different widget names and hierarchy introduced with build_dialog.
3432    
3433    2003-10-10  Bernhard Herzog  <[email protected]>
3434    
3435            * README: Fix typo.
3436    
3437    2003-10-09  Bernhard Herzog  <[email protected]>
3438    
3439            * Thuban/Model/proj.py (ProjFile.Add): Do not check whether the
3440            projection is already in the list. This is *a lot* faster when
3441            loading files with hundreds of projections since it saves a linear
3442            search. OTOH this will allow adding the same projection to the
3443            user.proj file multiple times in the projection dialog but we'll
3444            deal with that later
3445    
3446    2003-10-09  Jan-Oliver Wagner <[email protected]>
3447    
3448            * devtools: New. Directory for developer tools that are not intended
3449            for the regular user.
3450    
3451            * devtools/create_epsg.py: New. Convert the epsg file of proj into
3452            a python .proj file.
3453    
3454    2003-10-09  Bernhard Herzog  <[email protected]>
3455    
3456            * test/test_proj.py
3457            (TestProjection.test_get_parameter_without_equals_sign): New. Test
3458            whether GetParameter handles parameters without "=" sign correctly
3459    
3460            * Thuban/Model/proj.py (Projection.GetParameter): Handle
3461            parameters that do not contain a "=". Update the doc-string
3462    
3463    2003-10-08  Bernhard Herzog  <[email protected]>
3464    
3465            * Thuban/UI/projdialog.py (ProjFrame.__set_properties): Remove the
3466            length limit on the projname text control
3467    
3468    2003-10-08  Bernhard Herzog  <[email protected]>
3469    
3470            * test/test_proj.py (TestProjection.test_get_projection_units_geo)
3471            (TestProjection.test_get_projection_units_normal): New. Tests for
3472            the Projection.GetProjectedUnits method
3473    
3474    2003-10-08  Jan-Oliver Wagner <[email protected]>
3475    
3476            * Thuban/Model/resource.py (get_user_proj_file): small bug-fix:
3477            Added missing 'val' parameter.
3478    
3479    2003-10-08  Bernhard Herzog  <[email protected]>
3480    
3481            * Thuban/UI/projdialog.py (ProjFrame.__DoOnProjAvail): When the
3482            projection type of the currently selected projection is not known,
3483            i.e. there's no panel for it, use the UnknownProjPanel
3484            (ProjFrame.__DoOnProjChoice, ProjFrame._show_proj_panel): Split
3485            the actual replacing of the proj panel into the new method
3486            _show_proj_panel.
3487            (UnknownProjPanel): Add doc-string.
3488            (UnknownProjPanel._DoLayout): Insert a newline into the text so
3489            that the panel is not so wide.
3490    
3491    2003-10-08  Bernhard Herzog  <[email protected]>
3492    
3493            * Thuban/Model/resource.py (read_proj_file): Return the warnings
3494            too. Update the doc-string
3495            (get_proj_files): Removed. It wasn't used anywhere
3496            (get_system_proj_files, get_system_proj_file): Rename to
3497            get_system_proj_file and return the ProjFile object and not a list
3498            of ProjFile objects. Update the callers.
3499            (get_user_proj_files, get_user_proj_file): Rename to
3500            get_user_proj_file return the ProjFile object and not a list of
3501            ProjFile objects. Update the callers.
3502            (ProjFileReader.__init__): New instance variable for the warnings.
3503            Rename the __pf ivar to projfile. Update the methods referring to
3504            __pf
3505            (ProjFileReader.end_projection): Catch any errors raised when
3506            instantiating the projection and record that as an error. The
3507            projection will not be in the final ProjFile object.
3508            (ProjFileReader.GetWarnings): New method to return the warnings.
3509    
3510            * Thuban/UI/projdialog.py (ProjFrame.show_warnings): New method to
3511            show the warnings from the projfile reader
3512            (ProjFrame._OnImport): Deal with any warnings returned by
3513            read_proj_file
3514            (ProjFrame.__FillAvailList): Deal with any warnings returned by
3515            get_system_proj_file or get_user_proj_file.
3516    
3517            * test/test_proj.py (TestProjFile.doTestRead): Check the warnings.
3518            (TestProjFileWithInvalidParameters.file_contents): New test cases
3519            to test whether read_proj_file handles invalid projection
3520            parameters correctly
3521            (TestProjFile.test_get_system_proj_file): New. Simple test for
3522            resource.get_system_proj_file
3523    
3524    2003-10-07  Bernhard Herzog  <[email protected]>
3525    
3526            * test/test_derivedshapestore.py
3527            (TestDerivedShapeStoreExceptions.tearDown): Clear the session
3528            properly so that the temporary directories get deleted correctly
3529    
3530    2003-10-06  Bernhard Herzog  <[email protected]>
3531    
3532            Handle the title changes in a proper MVC way.
3533    
3534            * Thuban/UI/mainwindow.py (MainWindow.__init__): Subscribe to the
3535            canvas' TITLE_CHANGED messages
3536            (MainWindow.update_title): New. Update the main window's title
3537            (MainWindow.__SetTitle): Removed. Use update_title instead.
3538            (MainWindow.SetMap): Use update_title instead of __SetTitle
3539            (MainWindow.RenameMap): Do change the window title explicitly
3540            here. That's handled in a proper MVC way now.
3541            (MainWindow.title_changed): New. Subscriber for the TITLE_CHANGED
3542            messages
3543    
3544            * Thuban/Lib/connector.py (Conduit): New class to help classes
3545            that forward messages
3546    
3547            * Thuban/UI/viewport.py: Forward the map's TITLE_CHANGED messages
3548            (ViewPort): Derive from Conduit instead of Publisher
3549            (ViewPort.Subscribe, ViewPort.Unsubscribe): Use the new base class
3550            when calling the inherited versions
3551            (ViewPort._subscribe_map, ViewPort._unsubscribe_map): New helper
3552            methods to subscribe and unsubscribe map messages
3553            (ViewPort.SetMap, ViewPort.Destroy): Use the new helper methods to
3554            handle the map subscriptions
3555            (ViewPort.Map, ViewPort.map_projection_changed)
3556            (ViewPort.layer_projection_changed): Add or update doc-strings
3557    
3558            * test/test_connector.py (TestPublisher.test_issue_simple): Fix
3559            typo
3560            (MyConduit): Helper class for the Conduit test.
3561            (TestConduit): Test cases for Conduit
3562    
3563            * test/test_connector.py: Use support.run_tests as main.
3564    
3565            * test/test_viewport.py (ViewPortTest.setUp): Also subscribe to
3566            the TITLE_CHANGED messages
3567            (ViewPortTest.test_forwarding_title_changed): New test to check
3568            whether the viewport forwards the map's TITLE_CHANGED messages
3569            (TestViewportWithPostGIS.tearDown): Call the map's Destroy method
3570            after the port's because the latter may require a still functional
3571            map.
3572    
3573    2003-10-06  Bernhard Herzog  <[email protected]>
3574    
3575            * Thuban/UI/application.py (ThubanApplication.maps_changed): Add
3576            doc-string
3577    
3578    2003-10-06  Bernhard Herzog  <[email protected]>
3579    
3580            * test/test_viewport.py (ViewPortTest.setUp)
3581            (SimpleViewPortTest.test_init_with_size): Move the test for the
3582            initial size as a constructor parameter from ViewPortTest.setUp
3583            method to a new separate test in SimpleViewPortTest.
3584    
3585    2003-10-06  Bernhard Herzog  <[email protected]>
3586    
3587            * test/test_viewport.py (MockView): New class derived from
3588            ViewPort with a mock implementation of GetTextExtent to be used in
3589            the test cases
3590            (ViewPortTest.setUp): Use MockView instead of ViewPort
3591    
3592            * Thuban/UI/viewport.py (ViewPort.GetTextExtent): Turn this method
3593            into what would be a "pure virtual function" in C++: always raise
3594            NotImplementedError. Mock implementations for test cases don't
3595            belong into the real code
3596    
3597    2003-10-02  Bernhard Herzog  <[email protected]>
3598    
3599            * test/test_layer.py (TestLayer.test_empty_layer): Explicitly
3600            close the dbf file we create so that it's contents have been
3601            written properly.
3602    
3603            * libraries/shapelib/shptree.c, libraries/shapelib/shpopen.c,
3604            libraries/shapelib/shapefil.h, libraries/shapelib/dbfopen.c:
3605            Update to shapelib 1.2.10
3606    
3607    2003-10-01  Jan-Oliver Wagner <[email protected]>
3608    
3609            * Thuban/UI/tree.py, Thuban/UI/main.py: Remove the #! line as
3610            it annoys lintian which warns about these files not being
3611            executable. The #! isn't necessary here since if you absolutely
3612            must execute them you can always say "python <filename>".
3613    
3614    2003-09-26  Bernhard Herzog  <[email protected]>
3615    
3616            * Thuban/Model/classgen.py (GenQuantiles0): Removed since it's
3617            only used in GREAT-ER but not used in Thuban itself. When GREAT-ER
3618            is ported to a newer the import will fail, so it should be noticed
3619            immediately that this function is gone.
3620            Fixes RT#1919
3621    
3622    2003-09-26  Bernhard Herzog  <[email protected]>
3623    
3624            Add a DTD for the projection files and make thuban write valid
3625            projection files
3626    
3627            * Resources/XML/projfile.dtd: New. DTD for thuban's projection
3628            files
3629    
3630            * Thuban/Model/resource.py (ProjFileSaver.write): Use
3631            'projectionlist' as the name in the document type declaration so
3632            that it matches the element type of the root element.
3633    
3634            * test/test_proj.py (sample_projfile, sample_projfile2): Use
3635            'projectionlist' as the name in the document type declaration just
3636            as it is done now in the files thuban would write
3637            (sample_projfile, sample_projfile_data): Fix spelling of
3638            "Mercator"
3639            (TestProjFile.doTestWrite): Validate the written and the expected
3640            XML data
3641            (TestProjFile): Derive from ValidationTest so that we can run xml
3642            validation tests
3643    
3644    2003-09-24  Bernhard Herzog  <[email protected]>
3645    
3646            * Thuban/UI/renderer.py (ExportRenderer.render_legend): Do not
3647            modify the list returned by map.Layers() in place since it is the
3648            actual list of layers used by the map.
3649    
3650    2003-09-23  Jan-Oliver Wagner <[email protected]>
3651    
3652            * Doc/manual/thuban-manual.xml: Added subsection to chapter
3653            Extensions to describe the extensions coming with the Thuban
3654            standard package (gns2shp and importAPR).
3655    
3656    2003-09-23  Bernhard Herzog  <[email protected]>
3657    
3658            * libraries/thuban/wxproj.cpp (project_point): if there's an
3659            inverse but no forward projection, convert to degrees after
3660            applying the inverse projection. Fixes RT#2096
3661    
3662            * test/test_wxproj.py: New. Test cases for wxproj.so. One test
3663            implicitly tests for the fix to RT#2096
3664    
3665            * test/support.py (FloatComparisonMixin.assertFloatSeqEqual):
3666            Check that the sequences have the same lengths
3667    
3668            * Resources/Projections/defaults.proj (Geographic projection): Use
3669            a much more precise value for the to_meter attribute.
3670    
3671    2003-09-22  Bernhard Herzog  <[email protected]>
3672    
3673            * test/support.py (initthuban): Make sure to unset the LANG env.
3674            var. so that tests that compare translated strings work. Solves RT
3675            #2094
3676    
3677    2003-09-22  Jan-Oliver Wagner <[email protected]>
3678    
3679            Small improvement of APR import.
3680    
3681            * Extensions/importAPR/test/test_apr.py (aprTest.test_LClass):
3682            Added tests for text-ranges.
3683    
3684            * Extensions/importAPR/apr.py (APR_LClass.GetThubanRange): Now
3685            returns a string object if the range is based on text.
3686    
3687            * Extensions/importAPR/importAPR.py (import_apr_dialog): Unified
3688            range retrieval.
3689    
3690    2003-09-22  Jan-Oliver Wagner <[email protected]>
3691    
3692            Initial version of the importAPR extension which is in
3693            experimental state.
3694    
3695            * /Extensions/importAPR/, /Extensions/importAPR/samples/,
3696            /Extensions/importAPR/test/: New directories.
3697    
3698            * /Extensions/importAPR/samples/README: New: Howto load the samples.
3699    
3700            * /Extensions/importAPR/samples/iceland.apr: New: A sample APR
3701            file which refers to the Thuban Iceland demo data.
3702    
3703            * /Extensions/importAPR/test/README: New: Howto execute the tests.
3704    
3705            * /Extensions/importAPR/test/test_apr.py: New: Tests for APR classes.
3706    
3707            * /Extensions/importAPR/apr.py: New: Classes for ArcView Objects
3708            as in '.apr'-files.
3709    
3710            * /Extensions/importAPR/odb.py: New: Classes for generic ArcView
3711            ODB Objects as in '.apr', '.avl' and other files.
3712    
3713            * /Extensions/importAPR/__init__.py: New: Init to make this
3714            directory a package.
3715    
3716            * /Extensions/importAPR/importAPR.py: New: Import a ArcView
3717            project file (.apr) and convert it to Thuban.
3718    
3719    2003-09-22  Jan-Oliver Wagner <[email protected]>
3720    
3721            * Extensions/gns2shp.gns2shp.py: The main module of gns2shp.
3722    
3723    2003-09-19  Jan-Oliver Wagner <[email protected]>
3724    
3725            * Doc/manual/thuban-manual.xml: Extended section 'Installation'
3726            with description on RPM installation and RPM binary package
3727            creation.
3728    
3729    2003-09-18  Bernhard Herzog  <[email protected]>
3730    
3731            * setup.py (data_files): Only add the mo files if the Locales
3732            directory actually exists, so that setup.py works with a fresh CVS
3733            checkout
3734    
3735    2003-09-12  Jan-Oliver Wagner <[email protected]>
3736    
3737            * Examples/simple_extensions/simple_tool.py: bugfix: Tool is now
3738            in viewport, not anymore in view
3739    
3740    2003-09-04  Jan-Oliver Wagner <[email protected]>
3741    
3742            Introducing first Extension (gns2shp).
3743    
3744            * Extensions, Extensions/gns2shp, Extensions/gns2shp/test: New.
3745    
3746            * Extensions/__init__.py: New. init to make this dir a package.
3747    
3748            * Extensions/gns2shp/__init__.py: New. init to make this dir a package.
3749    
3750            * Extensions/gns2shp/test/README: New. some info on this test directory.
3751    
3752            * Extensions/gns2shp/test/ls.txt: New. test data set (Liechtenstein).
3753    
3754            * Extensions/gns2shp/test/test_gns2shp.py: New. Test for correct creation
3755            of Shapefile from GNS text file format
3756    
3757    2003-09-03  Jan-Oliver Wagner <[email protected]>
3758    
3759            Fix/workaround for bug #2019:
3760            https://intevation.de/rt/webrt?serial_num=2019
3761    
3762            * Thuban/UI/identifyview.py (IdentifyView.ID_STOP): New.
3763            (IdentifyView.__init__): Added another button that allows to
3764            stop the identify mode.
3765            (IdentifyView.OnStop): New. Stops the identify mode.
3766    
3767    2003-09-03  Jan-Oliver Wagner <[email protected]>
3768    
3769            Introducing a new exception dialog that allows to exit the
3770            application immediately.
3771            This fixes bug #2060: https://intevation.de/rt/webrt?serial_num=2060
3772    
3773            * Thuban/UI/exceptiondialog.py: New. A special exception dialog.
3774    
3775            * Thuban/UI/application.py (ThubanApplication.ShowExceptionDialog):
3776            Made strings available to translations. Exchanged the simple
3777            ScrolledMessageDialog by the new ExceptionDialog.
3778    
3779    2003-09-01  Bernhard Herzog  <[email protected]>
3780    
3781            * NEWS: New. Summary of changes and release notes.
3782    
3783            * MANIFEST.in: Add NEWS
3784    
3785    2003-09-01  Bernhard Herzog  <[email protected]>
3786    
3787            * MANIFEST.in: Correct the include statement for the mo-files and
3788            include the documentation too.
3789    
3790            * setup.py (data_files): Add the .mo files
3791            (setup call): Up to version 0.9.0
3792    
3793    2003-09-01  Bernhard Herzog  <[email protected]>
3794    
3795            * Thuban/UI/dbdialog.py (ChooseDBTableDialog.__init__): Change the
3796            parameter list to just parent and session
3797            (ChooseDBTableDialog.__set_properties): Removed. Setting the
3798            selection of empty list boxes is not allowed (and produces C++
3799            assertion errors) and the rest of the setup is better done in
3800            __init__ anyway.
3801            (ChooseDBTableDialog.OnCancel, ChooseDBTableDialog.OnOK)
3802            (ChooseDBTableDialog.OnLBDClick, DBDialog.OnOK): Use the Python
3803            builtins True/False for booleans to avoid warnings from wxPython
3804    
3805            * Thuban/UI/mainwindow.py (MainWindow.AddDBLayer): Adapt to new
3806            ChooseDBTableDialog constructor parameters.
3807    
3808    2003-09-01  Bernhard Herzog  <[email protected]>
3809    
3810            * Thuban/Model/postgisdb.py
3811            (PostGISTable): Extend doc-string
3812            (PostGISTable._fetch_table_information): Set the column index
3813            correctly, pretending ignored columns don't exist.
3814    
3815            * test/test_postgis_db.py (TestPostGISIgnoredColumns): New tests
3816            for postgis tables with data types not yet supported by thuban.
3817    
3818    2003-08-29  Bernhard Herzog  <[email protected]>
3819    
3820            * HOWTO-Release: Tweak item about running the tests.
3821    
3822    2003-08-29  Jan-Oliver Wagner <[email protected]>
3823    
3824            * /Doc/manual/thuban-manual.xml: updated to version 1.0pre2.
3825    
3826    2003-08-29  Bernhard Herzog  <[email protected]>
3827    
3828            Add some missing parameters to projections. Proj complains about
3829            them on windows but for some reason not on Linux.
3830    
3831            * test/test_save.py (SaveSessionTest.testLayerProjection): Add
3832            missing required projection parameters
3833    
3834            * test/test_proj.py (TestProjFile.test): Add missing required
3835            projection parameters
3836    
3837            * test/test_load_0_8.py (TestLayerProjection.file_contents)
3838            (TestLayerProjection.test): Add missing required projection
3839            parameters and tests for them
3840    
3841            * test/test_load.py (TestLayerProjection.file_contents)
3842            (TestLayerProjection.test): Add missing required projection
3843            parameters and tests for them
3844    
3845            * test/test_layer.py (TestLayer.test_base_layer): Add missing
3846            required projection parameters
3847    
3848    2003-08-29  Bernhard Herzog  <[email protected]>
3849    
3850            * libraries/pyprojection/Projection.i: Use pj_get_errno_ref to
3851            access the pj_errno because directly accessing pj_errno doesn't
3852            work on windows if the proj library is in a DLL
3853    
3854            * libraries/pyprojection/Projection_wrap.c: Update from Projection.i
3855    
3856    2003-08-28  Bernhard Herzog  <[email protected]>
3857    
3858            * test/test_proj.py: Import things from Thuban after calling
3859            initthuban
3860    
3861            * test/test_load.py (LoadSessionTest.filenames): New class
3862            variable with the filename attributes to normalize
3863            (LoadSessionTest.check_format): Pass self.filenames to
3864            sax_eventlist to normalize the filename attributes
3865    
3866            * test/xmlsupport.py: Add cvs keywords
3867            (SaxEventLister.__init__): New parameter filenames which indicates
3868            attributes that contain filenames
3869            (SaxEventLister.startElementNS): Normalize the filename attributes
3870            with os.path.normpath
3871            (sax_eventlist): New parameter filenames to pass through to
3872            SaxEventLister
3873    
3874            * test/test_derivedshapestore.py: Make this file callable as a
3875            program to execute the tests
3876            (TestDerivedShapeStoreExceptions.test_table_with_wrong_size): Bind
3877            the session to self.session so that it gets destroyed properly
3878    
3879            * test/test_layer.py (TestLayer.tearDown): Call the session's
3880            Destroy method
3881    
3882            * test/test_map.py (TestMapBase.tearDown): Destroy self.session
3883            too if it exists
3884            (TestMapAddLayer.test_add_layer): Bind the session to self.session
3885            so that it gets destroyed properly
3886    
3887            * test/postgissupport.py (reason_for_not_running_tests): Add a
3888            test for the existence of popen2.Popen4.
3889    
3890            * test/test_save.py (SaveSessionTest.tearDown): New. Provide a
3891            reliable way to destroy the sessions created in the test cases
3892            (SaveSessionTest.test_dbf_table): Bind the session to self.session
3893            so that it gets destroyed properly
3894            (SaveSessionTest.testLayerProjection): Bind the session to
3895            self.session so that it gets destroyed properly
3896    
3897            * test/test_session.py (UnreferencedTablesTests.tearDown): Make
3898            sure that the session is destroyed properly
3899    
3900            * test/test_shapefilestore.py: Make this callable as a program to
3901            execute the tests
3902    
3903            * test/test_scalebar.py: Remove unnecessary import of _ from
3904            Thuban
3905    
3906            * test/support.py (print_garbage_information): Call initthuban
3907            here because it may be called indirectly from test cases that test
3908            test support modules which do not use anything from thuban itself
3909            (ThubanTestProgram.runTests): Remove unnecessary debug print
3910    
3911    2003-08-28  Bernhard Herzog  <[email protected]>
3912    
3913            * Thuban/version.py (longversion): Update to 0.9
3914    
3915            * Thuban/UI/mainwindow.py: Remove some unused imports
3916    
3917            * README: Add section about required additional software. Add date
3918            and revision CVS keywords
3919    
3920            * HOWTO-Release: Add item about the translations. Add date and
3921            revision CVs keywords and change formatting to match README a bit
3922            better
3923    
3924            * po/de.po: Update for 0.9
3925    
3926            * test/README: Tweak the wording a little because many tests are
3927            not really unittest.
3928    
3929    2003-08-27  Bernhard Herzog  <[email protected]>
3930    
3931            As preparation for the 0.9 release, switch thuban files to a
3932            non-dev namespace
3933    
3934            * Thuban/Model/save.py (SessionSaver.write_session): Write files
3935            with the http://thuban.intevation.org/dtds/thuban-0.9.dtd
3936            namespace
3937    
3938            * Thuban/Model/load.py (SessionLoader.__init__): Accept the
3939            http://thuban.intevation.org/dtds/thuban-0.9.dtd namespace too
3940    
3941            * test/test_save.py (SaveSessionTest.dtd)
3942            (SaveSessionTest.testEmptySession)
3943            (SaveSessionTest.testSingleLayer)
3944            (SaveSessionTest.testLayerProjection)
3945            (SaveSessionTest.testRasterLayer)
3946            (SaveSessionTest.testClassifiedLayer)
3947            (SaveSessionTest.test_dbf_table)
3948            (SaveSessionTest.test_joined_table)
3949            (SaveSessionTest.test_save_postgis): Update for new namespace
3950    
3951            * test/test_load.py (LoadSessionTest.dtd, TestSingleLayer)
3952            (TestLayerVisibility.file_contents, TestLabels.file_contents)
3953            (TestLayerProjection.file_contents)
3954            (TestRasterLayer.file_contents, TestJoinedTable.file_contents)
3955            (TestPostGISLayer.file_contents)
3956            (TestPostGISLayerPassword.file_contents)
3957            (TestLoadError.file_contents, TestLoadError.test): Update for new
3958            namespace
3959    
3960    2003-08-27  Bernhard Herzog  <[email protected]>
3961    
3962            Make the table interface distinguish between row ids (an integer
3963            that uniquely identifies a row) and row ordinals (a simple row
3964            count from 0 to NumRows() - 1)
3965    
3966            * Thuban/Model/postgisdb.py (PostGISTable.RowIdToOrdinal)
3967            (PostGISTable.RowOrdinalToId): New methods to conver between row
3968            ids and row ordinals
3969            (PostGISTable.ReadRowAsDict, PostGISTable.ReadValue): New keyword
3970            parameter row_is_ordinal to indicate whether the row parameter is
3971            the row id or the ordinal
3972    
3973            * Thuban/Model/transientdb.py (TransientTableBase.RowIdToOrdinal)
3974            (TransientTableBase.RowOrdinalToId)
3975            (AutoTransientTable.RowIdToOrdinal)
3976            (AutoTransientTable.RowOrdinalToId): Same new methods as in
3977            PostGISTable.
3978            (TransientTableBase.ReadRowAsDict, TransientTableBase.ReadValue)
3979            (AutoTransientTable.ReadRowAsDict, AutoTransientTable.ReadValue):
3980            Same new parameter as in PostGISTable.
3981    
3982            * Thuban/Model/table.py (DBFTable.RowIdToOrdinal)
3983            (DBFTable.RowOrdinalToId, MemoryTable.RowIdToOrdinal)
3984            (MemoryTable.RowOrdinalToId): Same new methods as in PostGISTable.
3985            (DBFTable.ReadValue, DBFTable.ReadRowAsDict)
3986            (MemoryTable.ReadValue, MemoryTable.ReadRowAsDict): Same new
3987            parameter as in PostGISTable.
3988    
3989            * Thuban/UI/tableview.py (DataTable.RowIdToOrdinal)
3990            (DataTable.RowOrdinalToId): New methods to convert between row ids
3991            and row ordinals.
3992            (TableGrid.SelectRowById): New method to select a row based on its
3993            ID as opposed to its ordinal
3994            (DataTable.GetValue, TableGrid.OnRangeSelect)
3995            (TableGrid.OnSelectCell, LayerTableGrid.select_shapes)
3996            (QueryTableFrame.OnQuery, QueryTableFrame.get_selected)
3997            (LayerTableFrame.__init__): Convert between row ids and row
3998            ordinals as appropriate
3999    
4000            * test/postgissupport.py (PostGISDatabase.__init__): Add
4001            doc-string.
4002            (PostGISDatabase.initdb): The optional third item in a tuple in
4003            tables is now a (key, value) list with additional arguments to
4004            pass to upload_shapefile
4005            (upload_shapefile): New parameter gid_offset to allow gids that
4006            are not the same as the shapeids in the shapefile
4007            (PostgreSQLServer.get_default_static_data_db): Use the new
4008            gid_offset to make the gids in landmarks 1000 higher than the
4009            shapeids in the shapefile
4010    
4011            * test/test_viewport.py
4012            (TestViewportWithPostGIS.test_find_shape_at_point): Adapt to the
4013            new shapeids in the landmarks table
4014    
4015            * test/test_transientdb.py
4016            (TestTransientTable.run_iceland_political_tests)
4017            (TestTransientTable.test_transient_joined_table): Add tests for
4018            the new table methods and new keywords arguments.
4019    
4020            * test/test_postgis_db.py
4021            (TestPostGISTable.test_read_row_as_dict_row_count_mode)
4022            (TestPostGISTable.test_read_value_row_count_mode)
4023            (TestPostGISTable.test_row_id_to_ordinal)
4024            (TestPostGISTable.test_row_oridnal_to_id): New test for the new
4025            table methods and the new arguments
4026            (TestPostGISShapestorePoint.test_shapes_in_region)
4027            (TestPostGISShapestorePoint.test_shape_raw_data)
4028            (TestPostGISShapestorePoint.test_shape_points)
4029            (TestPostGISShapestorePoint.test_shape_shapeid)
4030            (TestPostGISShapestorePoint.test_all_shapes)
4031            (TestPostGISTable.test_simple_query)
4032            (TestPostGISTable.test_simple_query)
4033            (TestPostGISTable.test_simple_query)
4034            (TestPostGISTable.test_read_value)
4035            (TestPostGISTable.test_read_row_as_dict): Adapt to the new
4036            shapeids in the landmarks table
4037    
4038            * test/test_memory_table.py
4039            (TestMemoryTable.test_read_row_as_dict_row_count_mode)
4040            (TestMemoryTable.test_read_value_row_count_mode)
4041            (TestMemoryTable.test_row_id_to_ordinal)
4042            (TestMemoryTable.test_row_oridnal_to_id): New test for the new
4043            table methods and the new arguments
4044    
4045            * test/test_dbf_table.py
4046            (TestDBFTable.test_read_row_as_dict_row_count_mode)
4047            (TestDBFTable.test_read_value_row_count_mode)
4048            (TestDBFTable.test_row_id_to_ordinal)
4049            (TestDBFTable.test_row_oridnal_to_id): New test for the new table
4050            methods and the new arguments
4051    
4052    2003-08-26  Bernhard Herzog  <[email protected]>
4053    
4054            * Thuban/Model/postgisdb.py (PostGISShapeStore.BoundingBox): Use a
4055            more postgis specific but much faster method to get the bounding
4056            box
4057    
4058    2003-08-26  Bernhard Herzog  <[email protected]>
4059    
4060            * Thuban/Model/postgisdb.py (PostGISTable.Title)
4061            (PostGISShapeStore.AllShapes): Add these missing methods.
4062            (PostGISShapeStore.ShapesInRegion): No need to raise
4063            StopIteration. We can simply return
4064    
4065            * test/test_postgis_db.py (TestPostGISTable.test_title)
4066            (TestPostGISShapestorePoint.test_all_shapes): New tests for the
4067            new methods
4068    
4069    2003-08-25  Bernhard Herzog  <[email protected]>
4070    
4071            * Thuban/Model/postgisdb.py (shapetype_map): Add MUTLIPOLYGON.
4072    
4073            * test/test_postgis_db.py (PolygonTests): New class containing
4074            those tests from TestPostGISShapestorePolygon that can also be
4075            used to test MUTLIPOLYGON tables
4076            (TestPostGISShapestorePolygon): Most tests are now in PolygonTests
4077            so derive from that
4078            (TestPostGISShapestoreMultiPolygon): New class with tests for
4079            MUTLIPOLYGON tables
4080    
4081            * test/postgissupport.py (PostGISDatabase.initdb): Allow the
4082            tables argument to have tuples with three items to override the
4083            WKT type used.
4084            (PostgreSQLServer.get_default_static_data_db): Use the above to
4085            create a polygon table with MUTLIPOLYGONs
4086            (point_to_wkt, coords_to_point, polygon_to_wkt, coords_to_polygon)
4087            (arc_to_wkt, coords_to_multilinestring): Rename from *_to_wkt to
4088            coords_to*
4089            (coords_to_multipolygon): New. Convert to MUTLIPOLYGON
4090            (wkt_converter): New. Map WKT types to converters
4091            (upload_shapefile): New parameter force_wkt_type to use a
4092            different WKT type than the default
4093    
4094    2003-08-25  Bernhard Herzog  <[email protected]>
4095    
4096            * Thuban/UI/application.py
4097            (ThubanApplication.run_db_param_dialog): New. Suitable as a
4098            db_connection_callback. Main difference is that the dialog run
4099            from this method doesn't have a parent so it can be used even when
4100            there is no main window
4101            (ThubanApplication.OpenSession): Use self.run_db_param_dialog if
4102            no db_connection_callback was given. This way the dialog pops up
4103            even when the .thuban file was given as a command line parameter.
4104    
4105    2003-08-25  Bernhard Herzog  <[email protected]>
4106    
4107            * Thuban/UI/view.py (MapCanvas.OnLeftUp): Release the the mouse
4108            before calling MouseLeftUp. MouseLeftUp may pop up modal dialogs
4109            which leads to an effectively frozen X session because the user
4110            can only interact with the dialog but the mouse is still grabbed
4111            by the canvas.
4112            Also, call the tool's Hide method before MouseLeftUp because
4113            MouseLeftUp may change the tool's coordinates.
4114    
4115    2003-08-25  Bernhard Herzog  <[email protected]>
4116    
4117            * Thuban/UI/application.py (ThubanApplication.OpenSession): Catch
4118            LoadCancelled exceptions and handle them by returning immediately.
4119    
4120    2003-08-25  Bernhard Herzog  <[email protected]>
4121    
4122            GUI part of loading sessions with postgis connections which may
4123            require user interaction to get passwords or updated parameters
4124    
4125            * Thuban/UI/dbdialog.py (DBDialog): Reimplement to make it look a
4126            bit nucer and be more generic.
4127            (DBFrame.OnAdd): Adapt to new DBDialog interface
4128    
4129            * Thuban/UI/application.py (ThubanApplication.OpenSession): New
4130            optional parameter db_connection_callback which is passed to
4131            load_session.
4132    
4133            * Thuban/UI/mainwindow.py (MainWindow.run_db_param_dialog): New.
4134            Suitable as a db_connection_callback
4135            (MainWindow.OpenSession): Use self.run_db_param_dialog as the
4136            db_connection_callback of the application's OpenSession method
4137    
4138    
4139    2003-08-25  Bernhard Herzog  <[email protected]>
4140    
4141            Basic loading of sessions containing postgis connections:
4142    
4143            * Thuban/Model/load.py (LoadError): Add doc-string
4144            (LoadCancelled): New exception class to indicate a cancelled load
4145            (SessionLoader.__init__): Add the db_connection_callback parameter
4146            which will be used by the loader to get updated parameters and a
4147            password for a database connection
4148            (SessionLoader.__init__): Add the new XML elements to the
4149            dispatchers dictionary
4150            (SessionLoader.check_attrs): Two new conversions, ascii to convert
4151            to a byte-string object and idref as a generic id reference
4152            (SessionLoader.start_dbconnection)
4153            (SessionLoader.start_dbshapesource): New. Handlers for the new XML
4154            elements
4155            (load_session): Add the db_connection_callback to pass through the
4156            SessionLoader
4157    
4158            * test/test_load.py (TestPostGISLayer, TestPostGISLayerPassword):
4159            New classes to test loading of sessions with postgis database
4160            connections.
4161    
4162    2003-08-25  Bernhard Herzog  <[email protected]>
4163    
4164            * Thuban/UI/mainwindow.py (__ThubanVersion__): Remove this and
4165            replace it and the comment with __BuildDate__ by the Source: and
4166            Id: cvs keywords as used in the other files.
4167    
4168    2003-08-25  Bernhard Herzog  <[email protected]>
4169    
4170            * Thuban/Model/load.py (SessionLoader.check_attrs): Raise a
4171            LoadError when a required attribute is missing. The code used to
4172            be commented out for some reason, but probably should have been
4173            active.
4174    
4175            * test/test_load.py (TestLoadError.test): Test the message in the
4176            LoadError too to make sure it really is about the missing
4177            attribute
4178    
4179    2003-08-22  Bernhard Herzog  <[email protected]>
4180    
4181            * test/test_save.py (SaveSessionTest.test_dbf_table)
4182            (SaveSessionTest.test_joined_table): Add XML validation tests.
4183    
4184    2003-08-22  Bernhard Herzog  <[email protected]>
4185    
4186            Implement saving a session with a postgis connection
4187    
4188            * Resources/XML/thuban-0.9.dtd (dbconnection, dbshapesource) New
4189            elements for database connections and shapestores using db
4190            connections
4191            (session): Add the dbconnections to the content model
4192    
4193            * Thuban/Model/save.py (SessionSaver.write_db_connections): New.
4194            Write the db connections
4195            (SessionSaver.write_session): Call write_db_connections to write
4196            the connection before the data sources
4197            (SessionSaver.write_data_containers): Handle postgis shapestores
4198    
4199            * test/test_save.py (SaveSessionTest.thubanids)
4200            (SaveSessionTest.thubanidrefs): Update for new DTD
4201            (SaveSessionTest.test_save_postgis): New. Test saving a session
4202            with postgis connections
4203    
4204            * Thuban/Model/postgisdb.py (PostGISTable.DBConnection)
4205            (PostGISTable.TableName): New accessor methods for the connection
4206            and table name
4207    
4208            * test/test_postgis_db.py (TestPostGISTable.test_dbconn)
4209            (TestPostGISTable.test_dbname): New methods to test the new
4210            PostGISConnection methods
4211    
4212    2003-08-22  Bernhard Herzog  <[email protected]>
4213    
4214            * Thuban/Model/postgisdb.py (ConnectionError): New exception class
4215            for exceptions occurring when establishing a Database connection
4216            (PostGISConnection.connect): Catch psycopg.OperationalError during
4217            connects and raise ConnectionError.
4218    
4219            * test/test_postgis_db.py (TestPostgisDBExceptions): New class for
4220            tests for database exceptions
4221    
4222    2003-08-22  Bernhard Herzog  <[email protected]>
4223    
4224            Prepare the test suite for tests with required authentication
4225    
4226            * test/postgissupport.py (PostgreSQLServer.__init__): Add instance
4227            variables with two predefined users/passwords, one for the admin
4228            and one for a non-privileged user.
4229            (PostgreSQLServer.createdb): Pass the admin name to initdb and add
4230            the non-privileged user to the database and set the admin password
4231            (PostgreSQLServer.wait_for_postmaster): Use the admin user name.
4232            Better error reporting
4233            (PostgreSQLServer.connection_params)
4234            (PostgreSQLServer.connection_string): New methods to return
4235            information about how to connect to the server
4236            (PostgreSQLServer.execute_sql): New. Convenience method to execute
4237            SQL statements
4238            (PostgreSQLServer.require_authentication): Toggle whether the
4239            server requires authentication
4240            (PostgreSQLServer.create_user, PostgreSQLServer.alter_user): New.
4241            Add or alter users
4242            (PostGISDatabase.initdb): Pass the admin name one the
4243            subprocesses' command lines. Grant select rights on
4244            geometry_columns to everybody.
4245            (upload_shapefile): Use the admin name and password when
4246            connecting. Grant select rights on the new table to everybody.
4247    
4248            * test/test_viewport.py (TestViewportWithPostGIS.setUp): Use the
4249            server's new methods to get the connection parameters.
4250    
4251            * test/test_postgis_session.py (TestSessionWithPostGIS.setUp)
4252            (TestSessionWithPostGIS.test_remove_dbconn_exception): Use the
4253            server's new methods to get the connection parameters.
4254    
4255            * test/test_postgis_db.py
4256            (TestPostGISConnection.test_gis_tables_empty)
4257            (TestPostGISConnection.test_gis_tables_non_empty)
4258            (PostGISStaticTests.setUp): Use the server's new methods to get
4259            the connection parameters.
4260    
4261    2003-08-22  Bernhard Herzog  <[email protected]>
4262    
4263            * Thuban/UI/about.py (About.__init__): Add the psycopg version.
4264    
4265            * Thuban/version.py: Add psycopg version
4266    
4267            * Thuban/Model/postgisdb.py (psycopg_version): New. Return the
4268            version of the psycopg module
4269    
4270    2003-08-22  Bernhard Herzog  <[email protected]>
4271    
4272            * Thuban/UI/dbdialog.py (DBPwdDlg): Removed because it's not used.
4273            (DBFrame.OnEdit): Removed because it's not used and wouldn't work
4274            at the moment. The functionality should probably be implemented
4275            some time, though.
4276            (DBFrame.OnRemove): Display a message if the connection can't be
4277            removed because it's still in use.
4278    
4279    2003-08-22  Jan-Oliver Wagner <[email protected]>
4280    
4281            * Thuban/UI/about.py (About.__init__): split up the huge about
4282            text into elements/lists for easier translation. This fixes bug
4283            https://intevation.de/rt/webrt?serial_num=2058
4284            Also, made some forgotten string available for the i18n.
4285    
4286    2003-08-21  Bernhard Herzog  <[email protected]>
4287    
4288            Make postgis support really optional including insensitive menu
4289            items.
4290    
4291            * Thuban/Model/postgisdb.py (has_postgis_support): New. Return
4292            whether the postgis is supported.
4293    
4294            * Thuban/UI/dbdialog.py: Put the psycopg import into try..except
4295            to make postgis support optional
4296    
4297            * Thuban/UI/mainwindow.py (_has_postgis_support): New. Context
4298            version of Thuban.Model.postgisdb.has_postgis_support
4299            (database_management command): Make it only sensitive if postgis
4300            is supported.
4301    
4302    2003-08-21  Jan-Oliver Wagner <[email protected]>
4303    
4304            * Doc/manual/thuban-manual.xml: Added CVS revision for rev-history.
4305            (section Adding and Removing Layers): Added text and described
4306            multi-selection.
4307            (chapter Extensions): New.
4308    
4309    2003-08-21  Jan-Oliver Wagner <[email protected]>
4310    
4311            * Thuban/UI/mainwindow.py (MainWindow.AddLayer): Changed dialog
4312            settings to allow multiple files to load into the map.
4313            Also reduced selection to *.shp as a default.
4314    
4315    2003-08-20  Bernhard Herzog  <[email protected]>
4316    
4317            Add dialogs and commands to open database connections and add
4318            database layers.
4319    
4320            * Thuban/UI/mainwindow.py (MainWindow.DatabaseManagement): New
4321            method to open the database connection management dialog
4322            (MainWindow.AddDBLayer): New method to add a layer from a database
4323            (_has_dbconnections): New helper function to use for sensitivity
4324            (database_management command, layer_add_db command): New commands
4325            that call the above new methods.
4326            (main_menu): Add the new commands to the menu.
4327    
4328            * Thuban/Model/postgisdb.py (PostGISConnection.__init__)
4329            (PostGISConnection.connect): Establish the actual connection in a
4330            separate method and call it in __init__. This makes it easier to
4331            override the behavior in test cases
4332            (PostGISConnection.BriefDescription): New method to return a brief
4333            description for use in dialogs.
4334    
4335            * test/test_postgis_db.py (NonConnection): DB connection that
4336            doesn't actually connect
4337            (TestBriefDescription): New class with tests for the new
4338            BriefDescription method
4339    
4340    2003-08-19  Jan-Oliver Wagner <[email protected]>
4341    
4342            Moved anything from extensions to libraries.
4343    
4344            * libraries: New.
4345    
4346            * libraries/ pyprojection, pyshapelib, shapelib, thuban: New.
4347    
4348            * libraries/pyprojection/ LICENSE, MANIFEST.in, Projection.i,
4349            Projection.py, Projection_wrap.c, setup.py, swighelp.txt: These files have
4350            been moved here from thuban/extensions/pyprojection/
4351            See there in the Attic for the older history.
4352    
4353            * libraries/pyshapelib/ COPYING, ChangeLog, NEWS, README, dbflib.i,
4354            dbflib.py, dbflib_wrap.c, pyshapelib_api.h, pytest.py, setup.py,
4355            shapelib.i, shapelib.py, shapelib_wrap.c, shptreemodule.c: These files
4356            have been moved here from thuban/extensions/pyshapelib/
4357            See there in the Attic for the older history.
4358    
4359            * libraries/shapelib/ dbfopen.c, shapefil.h, shpopen.c, shptree.c: These
4360            files have been moved here from thuban/extensions/shapelib/
4361            See there in the Attic for the older history.
4362    
4363            * libraries/thuban/ bmpdataset.cpp, cpl_mfile.cpp, cpl_mfile.h,
4364            gdalwarp.cpp, wxproj.cpp: These files have been moved here from
4365            thuban/extensions/thuban/
4366            See there in the Attic for the older history.
4367    
4368            * MANIFEST.in, setup.cfg, setup.py: renamed extensions to libraries.
4369    
4370            * extensions/thuban/ bmpdataset.cpp, cpl_mfile.cpp, cpl_mfile.h,
4371            gdalwarp.cpp, wxproj.cpp: Moved to libraries/thuban.
4372    
4373            * extensions/shapelib/ dbfopen.c, shapefil.h, shpopen.c, shptree.c:
4374            Moved to libraries/shapelib.
4375    
4376            * extensions/pyshapelib/ COPYING, NEWS, dbflib.py, pytest.py,
4377            shapelib.py, README, dbflib_wrap.c, setup.py, shapelib_wrap.c,
4378            ChangeLog, dbflib.i, pyshapelib_api.h, shapelib.i, shptreemodule.c:
4379            Moved to libraries/pyshapelib.
4380    
4381            * extensions/pyprojection/ MANIFEST.in, Projection.py, setup.py,
4382            LICENSE, Projection.i, Projection_wrap.c, swighelp.txt:
4383            Moved to libraries/pyprojection.
4384    
4385            * extensions/ pyprojection, pyshapelib, shapelib, thuban: Removed.
4386    
4387            * extensions: Removed.
4388    
4389    2003-08-19  Bernhard Herzog  <[email protected]>
4390    
4391            * test/test_viewport.py (ViewPortTest): We don't use the
4392            facilities of FileTestMixin so don't derive from it.
4393            (TestViewportWithPostGIS): New class with tests for using a
4394            viewport on a map with postgis layers.
4395    
4396    2003-08-19  Bernhard Herzog  <[email protected]>
4397    
4398            Add the db connection management to the session.
4399    
4400            * Thuban/Model/session.py (Session.__init__): New instance
4401            variable db_connections
4402            (Session.AddDBConnection, Session.DBConnections)
4403            (Session.HasDBConnections, Session.CanRemoveDBConnection)
4404            (Session.RemoveDBConnection): New methods to manage and query the
4405            db connections managed by the session
4406            (Session.OpenDBShapeStore): New method to open a shapestore from a
4407            db connection
4408    
4409            * Thuban/Model/messages.py (DBCONN_REMOVED, DBCONN_ADDED): New
4410            messages for the db connection handling in the session
4411    
4412            * test/test_postgis_session.py: New. test cases for the session's
4413            db connection handling with postgis connections
4414    
4415    2003-08-19  Bernhard Herzog  <[email protected]>
4416    
4417            Add very basic postgis database support and the corresponding test
4418            cases. The test cases require a PostgreSQL + postgis installation
4419            but no existing database. The database will be created
4420            automatically by the test cases
4421    
4422            * test/README: Add note about skipped tests and the requirements
4423            of the postgis tests.
4424    
4425            * Thuban/Model/postgisdb.py: New. Basic postgis database support.
4426    
4427            * test/test_postgis_db.py: New. Test cases for the postgis
4428            support.
4429    
4430            * Thuban/Model/wellknowntext.py: New. Parser for well-known-text
4431            format
4432    
4433            * test/test_wellknowntext.py: New. Test cases for the
4434            wellknowntext parser
4435    
4436            * test/postgissupport.py: New. Support module for tests involving
4437            a postgis database.
4438    
4439            * test/support.py (execute_as_testsuite): Shut down the postmaster
4440            if it's still running after the tests
4441    
4442            * Thuban/Model/data.py (RAW_WKT): New constant for raw data in
4443            well known text format
4444    
4445    2003-08-19  Jan-Oliver Wagner <[email protected]>
4446    
4447            * Examples/simple_extensions/hello_world.py: New. Raises a Hello World
4448            message dialog.
4449    
4450    2003-08-18  Bernhard Herzog  <[email protected]>
4451    
4452            * test/support.py (ThubanTestResult.printErrors): Indent the
4453            reason for the skips in the output to make it a bit more readable.
4454            (execute_as_testsuite): New helper function to run a test suite
4455            and print some more information.
4456            (run_tests): Use execute_as_testsuite to run the tests
4457    
4458            * test/runtests.py (main): Use execute_as_testsuite to run the
4459            tests
4460    
4461    2003-08-18  Bernhard Herzog  <[email protected]>
4462    
4463            Fix some bugs in Thuban and the test suite that were uncovered by
4464            changes introduced in Python 2.3:
4465    
4466            * Thuban/Model/table.py (DBFTable.__init__): Make sure the
4467            filename is an absolute name
4468    
4469            * Thuban/Model/layer.py (RasterLayer.__init__): Make sure the
4470            filename is an absolute name
4471    
4472            * test/test_save.py (SaveSessionTest.testRasterLayer): Use a
4473            unique filename to save to and use the correct relative filename
4474            in the expected output.
4475            (SaveSessionTest.test_dbf_table): Use the correct relative
4476            filename in the expected output.
4477    
4478            * test/test_layer.py (TestLayer.test_raster_layer): Update the
4479            test to check whether the filename is absolute.
4480    
4481    2003-08-18  Jan-Oliver Wagner <[email protected]>
4482    
4483            * Thuban/UI/about.py (About.__init__): Added Silke Reimer.
4484    
4485    2003-08-15  Bernhard Herzog  <[email protected]>
4486    
4487            Change the way shapes are returned by a shape store. The
4488            ShapesInRegion method returns an iterator over actual shape
4489            objects instead of a list of shape ids.
4490    
4491            * Thuban/Model/data.py (ShapefileShape.ShapeID): New. Return shape
4492            id.
4493            (ShapefileStore.ShapesInRegion): Return an iterator over the
4494            shapes which yields shape objects instead of returning a list of
4495            shape ids
4496            (ShapefileStore.AllShapes): New. Return an iterator over all
4497            shapes in the shape store
4498            (DerivedShapeStore.AllShapes): New. Like in ShapefileStore
4499    
4500            * Thuban/Model/layer.py (Layer.ShapesInRegion): Update
4501            doc-string.
4502    
4503            * Thuban/UI/baserenderer.py
4504            (BaseRenderer.layer_ids, BaseRenderer.layer_shapes): Rename to
4505            layer_shapes and make it return an iterator containg shapes
4506            instead of a list of ids.
4507            (BaseRenderer.draw_shape_layer): Update doc-string; Adapt to
4508            layer_shapes() change
4509    
4510            * Thuban/UI/renderer.py (ScreenRenderer.layer_ids)
4511            (ScreenRenderer.layer_shapes): Rename as in BaseRenderer
4512    
4513            * Thuban/UI/viewport.py (ViewPort._find_shape_in_layer): Adapt to
4514            changes in the ShapesInRegion return value.
4515            (ViewPort._get_hit_tester): Remove commented out code
4516    
4517            * test/mockgeo.py (SimpleShapeStore.ShapesInRegion): Adapt to the
4518            new return value.
4519            (SimpleShapeStore.AllShapes): New. Implement this method too.
4520    
4521            * test/test_layer.py (TestLayer.test_arc_layer)
4522            (TestLayer.test_polygon_layer, TestLayer.test_point_layer)
4523            (TestLayer.test_point_layer_with_projection)
4524            (TestLayer.test_derived_store): Adapt to changes in the
4525            ShapesInRegion return value.
4526    
4527            * test/test_shapefilestore.py
4528            (TestShapefileStoreArc.test_shapes_in_region)
4529            (TestShapefileStorePolygon.test_shapes_in_region)
4530            (TestShapefileStorePoint.test_shapes_in_region): Adapt to changes
4531            in the ShapesInRegion return value.
4532            (TestShapefileStorePoint.test_all_shapes)
4533            (TestShapefileStoreArc.test_shape_shapeid): New tests for the new
4534            methods
4535    
4536            * test/test_derivedshapestore.py
4537            (TestDerivedShapeStore.test_shapes_in_region): Adapt to changes in
4538            the ShapesInRegion return value.
4539            (TestDerivedShapeStore.test_all_shapes)
4540            (TestDerivedShapeStore.test_shape_shapeid): New tests for the new
4541            methods
4542    
4543    2003-08-15  Bernhard Herzog  <[email protected]>
4544    
4545            Make the renderers deal correctly with raw vs. python level
4546            representation of shape geometries
4547    
4548            * Thuban/UI/baserenderer.py (BaseRenderer.low_level_renderer):
4549            Return a flag useraw in addition to the callable and the parameter
4550            to indicate whether the callable can deal with the raw shape data
4551            or uses the higher level python lists of coordinates. The callable
4552            now should accept either the raw data or the return value of the
4553            shape's Points() method.
4554            (BaseRenderer.draw_shape_layer): Adapt to the low_level_renderer
4555            change
4556            (BaseRenderer.projected_points): Instead of the shape id use the
4557            points list as parameter.
4558            (BaseRenderer.draw_polygon_shape, BaseRenderer.draw_arc_shape)
4559            (BaseRenderer.draw_point_shape): Adapt to projected_points()
4560            change and accept the points list as parameter instead of the
4561            shape id.
4562    
4563            * Thuban/UI/renderer.py (MapRenderer.low_level_renderer): Return
4564            the useraw flag as required by the BaseRenderer
4565            (ScreenRenderer.draw_shape_layer): Adapt to low-level renderer
4566            changes.
4567    
4568            * test/test_baserenderer.py
4569            (TestBaseRenderer.test_point_with_classification): New test for
4570            rendering a map with classifications.
4571    
4572    2003-08-15  Bernhard Herzog  <[email protected]>
4573    
4574            * Thuban/UI/viewport.py (ViewPort.find_shape_at)
4575            (ViewPort._find_shape_in_layer, ViewPort._find_shape_in_layer)
4576            (ViewPort._get_hit_tester, ViewPort.projected_points)
4577            (ViewPort._hit_point, ViewPort._hit_arc, ViewPort._hit_polygon)
4578            (ViewPort._find_label_at): Split the find_shape_at method into
4579            several new methods and use the functions in the hit-test module.
4580    
4581            * Thuban/UI/hittest.py: New module with Python-level hit-testing
4582            functions
4583    
4584            * test/test_hittest.py: New. Test for the new hittest module
4585    
4586    2003-08-15  Bernhard Herzog  <[email protected]>
4587    
4588            * Thuban/Model/layer.py (Layer.ShapesInRegion): Apply the layer
4589            projection to all corners of the bounding box to get a better
4590            approximation of the projected bounding box
4591    
4592            * test/test_layer.py (TestLayer.test_point_layer_with_projection):
4593            New. Test coordinate handling of a layer with a projection.
4594            Catches the bug fixed in Layer.ShapesInRegion
4595    
4596    2003-08-15  Bernhard Herzog  <[email protected]>
4597    
4598            Move some of the mock objects in test_baserenderer into their own
4599            module so they can easily be used from other tests
4600    
4601            * test/mockgeo.py: New test helper module with some mock objects
4602            for geometry related things like shapes, shapestores and
4603            projections.
4604    
4605            * test/test_mockgeo.py: New. Tests for the new helper module
4606    
4607            * test/test_baserenderer.py: Some of the mock-objects are in
4608            mockgeo now.
4609    
4610    2003-08-12  Jan-Oliver Wagner <[email protected]>
4611    
4612            * Thuban/UI/about.py (About.__init__): Added Bj�rn Broscheit.
4613    
4614    2003-08-12  Bernhard Herzog  <[email protected]>
4615    
4616            * po/de.po: New. German translations by Bjoern Broscheit
4617    
4618    2003-08-12  Bernhard Herzog  <[email protected]>
4619    
4620            * Thuban/UI/projdialog.py (UnknownProjPanel._DoLayout): Translated
4621            strings have to be one string literal.
4622    
4623    2003-08-11  Bernhard Herzog  <[email protected]>
4624    
4625            * test/support.py (FloatComparisonMixin.assertPointListEquals):
4626            New. This method was used in various derived classes, but it's
4627            better to have it here.
4628    
4629            * test/test_shapefilestore.py
4630            (ShapefileStoreTests.assertPointListEquals): Removed. It's now in
4631            FloatComparisonMixin
4632    
4633            * test/test_layer.py (TestLayer.assertPointListEquals): Removed.
4634            It's now in FloatComparisonMixin
4635    
4636            * test/test_derivedshapestore.py
4637            (TestDerivedShapeStore.assertPointListEquals): Removed. It's now
4638            in FloatComparisonMixin
4639    
4640    2003-08-11  Bernhard Herzog  <[email protected]>
4641    
4642            * Thuban/UI/join.py (JoinDialog.OnJoin): Add missing space to
4643            error message
4644    
4645    2003-08-08  Jan-Oliver Wagner <[email protected]>
4646    
4647            * Doc/manual/thuban-manual.xml: Now use authorgroup. Added revhistory
4648            with version number.
4649            Changed title to reflect version number of Thuban.
4650    
4651    2003-08-08  Jan-Oliver Wagner <[email protected]>
4652    
4653            * Thuban/UI/about.py (About.__init__): Reworked the hall of fame. Now
4654            the list corresponds to the "About" web page.
4655    
4656    2003-08-08  Bernhard Herzog  <[email protected]>
4657    
4658            * Thuban/UI/projdialog.py (UTMProposeZoneDialog.dialogLayout):
4659            Make sure translated strings are recognized as one string literal.
4660    
4661            * Thuban/UI/proj4dialog.py (UTMProposeZoneDialog.dialogLayout):
4662            Make sure translated strings are recognized as one string literal.
4663    
4664            * Thuban/UI/classgen.py (ClassGenDialog.OnOK): Make sure
4665            translated strings are recognized as one string literal.
4666    
4667            * Thuban/UI/application.py (ThubanApplication.OpenSession): Make
4668            sure translated strings are recognized as one string literal.
4669    
4670    2003-08-07  Bernhard Herzog  <[email protected]>
4671    
4672            * Thuban/Model/data.py (DerivedShapeStore.RawShapeFormat): New.
4673            Simply delegates to the original shapestore.
4674    
4675            * test/test_derivedshapestore.py
4676            (TestDerivedShapeStore.test_raw_format): New. Test case for
4677            DerivedShapeStore.RawShapeFormat
4678    
4679    2003-08-07  Bernhard Herzog  <[email protected]>
4680    
4681            Add raw data interface to shape objects.
4682    
4683            * Thuban/Model/data.py (ShapefileShape, Shape): Rname the shape
4684            class to ShapefileShape which now holds shapefile specific
4685            information.
4686            (ShapefileShape.compute_bbox): Simplified to not cache any
4687            information. The way this method is used that shouldn't matter
4688            performance wise.
4689            (ShapefileShape.RawData): New. Return the shapeid which is the raw
4690            data format for shapes from shapefiles.
4691            (ShapefileStore.RawShapeFormat): New. Return the raw datatype used
4692            in the shape objects returned by a shapestore. For a
4693            ShapefileStore this is always RAW_SHAPEFILE.
4694            (RAW_PYTHON, RAW_SHAPEFILE): Constants for the RawShapeFormat
4695            method.
4696    
4697            * test/test_shapefilestore.py
4698            (TestShapefileStore.test_raw_format): New test to test the raw
4699            format feature of shapes.
4700    
4701            * Thuban/Model/layer.py: Remove the unused import of Shape from
4702            data. It was only there for interface compatibility but it's not
4703            used inside of Thuban and the generic Shape class has gone away.
4704    
4705            * Thuban/UI/renderer.py (MapRenderer.low_level_renderer): Check
4706            the raw data format and only use an optimized version of its a
4707            shapefile.
4708    
4709    2003-08-07  Bernhard Herzog  <[email protected]>
4710    
4711            * test/test_baserenderer.py (SimpleShape): Shape class for the
4712            tests.
4713            (SimpleShapeStore.Shape): Use SimpleShape instead of
4714            Thuban.Model.data.Shape to make the tests independed of the coming
4715            changes.
4716    
4717    2003-08-07  Bernhard Herzog  <[email protected]>
4718    
4719            * test/support.py (SkipTest, ThubanTestResult, ThubanTestRunner)
4720            (ThubanTestProgram): New classes that extend the respective
4721            classes from unittest. These new version support skipping tests
4722            under certain expected conditions. In the Thuban test suite we
4723            uses this for tests that require the optional gdal support.
4724            (run_tests): Use ThubanTestProgram instead of the unittest.main()
4725    
4726            * test/runtests.py (main): Use the new ThubanTestRunner instead of
4727            the normal one from unittest
4728    
4729            * test/test_layer.py (TestLayer.test_raster_layer): If this test
4730            is not run because gdal support isn't available report this to the
4731            runner.
4732    
4733            * test/test_baserenderer.py
4734            (TestBaseRenderer.test_raster_no_projection): Do not run this test
4735            if gdal support isn't available and report this to the runner.
4736    
4737    2003-08-06  Bernhard Herzog  <[email protected]>
4738    
4739            Rearrange the renderers a bit, partly in preparation for changes
4740            required for the postgis merge, partly to make it more testable.
4741            Also make the representation of coordinates in Shapes more
4742            consistent.
4743    
4744            * Thuban/UI/renderer.py (MapRenderer): Most of the code/methods in
4745            this class is now in BaseRenderer. This class is now practically
4746            only a specialization of BaseRenderer for rendering to an actual
4747            wx DC.
4748            (ScreenRenderer.draw_shape_layer): Use self.low_level_renderer()
4749            to get the shapetype specific rendering functions.
4750    
4751            * Thuban/UI/baserenderer.py: New file with the basic rendering
4752            logic. The code in this file is completely independend of wx.
4753            (BaseRenderer): Class with the basic rendering logic
4754    
4755            * test/test_baserenderer.py: New. Test cases for BaseRenderer
4756    
4757            * Thuban/UI/view.py (MapCanvas.__init__): New instance variable
4758            error_on_redraw to guard agains endless loops and stack overflows
4759            when there's a bug in the rendering code that raises exceptions.
4760            (MapCanvas.OnIdle, MapCanvas._do_redraw): Split the actual
4761            rendering into a separate method _do_redraw so that error handling
4762            is a bit easier. When an exception occurs, set error_on_redraw to
4763            true. When it's true on entry to OnIdle do nothing and return
4764            immediately.
4765    
4766            * Thuban/Model/data.py (ShapefileStore.Shape): For consistency, a
4767            Shape object will always have the coordinates as a list of list of
4768            coordinate pairs (tuples).
4769            (Shape.compute_bbox): Adapt to new representation.
4770    
4771            * Thuban/UI/viewport.py (ViewPort.find_shape_at)
4772            (ViewPort.LabelShapeAt): Adapt to new coordinate representation in
4773            Shape objects.
4774    
4775            * test/test_shapefilestore.py
4776            (ShapefileStoreTests.assertFloatTuplesEqual)
4777            (ShapefileStoreTests.assertPointListEquals): Rename to
4778            assertPointListEquals and change purpose to checking equality of
4779            the lists returned by Shape.Points().
4780            (TestShapefileStoreArc.test_shape)
4781            (TestShapefileStorePolygon.test_shape)
4782            (TestShapefileStorePoint.test_shape): Use the new
4783            assertPointListEquals instead of assertFloatTuplesEqual
4784    
4785            * test/test_layer.py (TestLayer.assertFloatTuplesEqual)
4786            (TestLayer.assertPointListEquals): Rename to assertPointListEquals
4787            and change purpose to checking equality of the lists returned by
4788            Shape.Points().
4789            (TestLayer.test_arc_layer, TestLayer.test_arc_layer)
4790            (TestLayer.test_polygon_layer, TestLayer.test_point_layer)
4791            (TestLayer.test_derived_store): Use the new assertPointListEquals
4792            instead of assertFloatTuplesEqual
4793    
4794            * test/test_derivedshapestore.py
4795            (TestDerivedShapeStore.assertFloatTuplesEqual)
4796            (TestDerivedShapeStore.assertPointListEquals): Rename to
4797            assertPointListEquals and change purpose to checking equality of
4798            the lists returned by Shape.Points().
4799            (TestDerivedShapeStore.test_shape): Use the new
4800            assertPointListEquals instead of assertFloatTuplesEqual
4801    
4802    2003-08-06  Jan-Oliver Wagner <[email protected]>
4803    
4804            * Thuban/UI/projdialog.py (UTMPanel._OnPropose): Added test for
4805            a bounding box. A dialog is raised in case, no bounding box
4806            is found. This fixes bug #2043:
4807            https://intevation.de/rt/webrt?serial_num=2043
4808    
4809    2003-08-05  Bernhard Herzog  <[email protected]>
4810    
4811            * Thuban/Model/color.py (Color.__repr__): Make the repr of a color
4812            object look like a Color instantiation. Formerly it looked like a
4813            tuple.
4814    
4815            * test/test_color.py (TestColor.test_repr)
4816            (TestColor.test_equality, TestColor.test_inequality): New. test
4817            some more apects of the Color class
4818            (TestTransparent.test_repr, TestTransparent.test_hex)
4819            (TestTransparent.test_equality): New. Test cases for the
4820            Transparent object.
4821    
4822    2003-08-04  Jan-Oliver Wagner <[email protected]>
4823    
4824            * Doc/manual/thuban-manual.xml: a number of small improvements.
4825            The resulting file is the version submitted for GREAT-ER II.
4826    
4827    2003-08-01  Bernhard Herzog  <[email protected]>
4828    
4829            * Thuban/UI/resource.py, Thuban/UI/projdialog.py,
4830            Thuban/UI/join.py, Thuban/UI/classgen.py, Thuban/UI/about.py,
4831            Thuban/Model/resource.py: Insert cvs keywords and doc-strings.
4832    
4833            * Thuban/UI/common.py: Insert cvs keywords and doc-strings.
4834            (Color2wxColour, wxColour2Color, ThubanBeginBusyCursor)
4835            (ThubanEndBusyCursor): Add doc-strings
4836    
4837    2003-08-01  Bernhard Herzog  <[email protected]>
4838    
4839            First step towards PostGIS integration. More abstraction by movin
4840            more code from the layer to the shapestore. More methods of the
4841            layer are now simply delegated to the equivalent method of the
4842            shapestore. The SHAPETYPE_* constants are now in data not in
4843            layer.
4844    
4845            * Thuban/Model/data.py (SHAPETYPE_POLYGON, SHAPETYPE_ARC)
4846            (SHAPETYPE_POINT, Shape): Move these constants and classes from
4847            layer.py to data.py
4848            (ShapefileStore.__init__): More Initialization for the new methods
4849            and functionality.
4850            (ShapefileStore.ShapeType, ShapefileStore.NumShapes)
4851            (ShapefileStore.BoundingBox, ShapefileStore.ShapesInRegion)
4852            (ShapefileStore.Shape): New methods that were formerly implemented
4853            in the layer.
4854            (DerivedShapeStore.Shape, DerivedShapeStore.ShapesInRegion)
4855            (DerivedShapeStore.ShapeType, DerivedShapeStore.NumShapes)
4856            (DerivedShapeStore.BoundingBox): New. DerivedShapeStore
4857            equivalents of the new shape methods. These versions are simply
4858            delegated to the original shapstore.
4859    
4860            * Thuban/Model/layer.py (SHAPETYPE_POLYGON, SHAPETYPE_ARC)
4861            (SHAPETYPE_POINT, Shape): Removed. They're now in data.py
4862            (Layer.SetShapeStore): Removed the initializatin of instance
4863            variables that were needed for the stuff that's now in
4864            ShapefileStore
4865            (Layer.BoundingBox, Layer.NumShapes, Layer.ShapeType)
4866            (Layer.Shape, Layer.ShapesInRegion): Simply delegate to the
4867            shapestore.
4868    
4869            * Thuban/UI/classifier.py, Thuban/UI/renderer.py,
4870            Thuban/UI/viewport.py: Import the SHAPETYPE_* constants from data
4871            instead of layer.
4872    
4873            * test/test_shapefilestore.py: New. Tests for ShapefileStore.
4874    
4875            * test/test_derivedshapestore.py: New. Tests for DerivedShapeStore.
4876    
4877            * test/test_layer.py: Import the SHAPETYPE_* constants from data
4878            instead of layer.
4879            (TestLayer.test_derived_store): Remove the test for the exception
4880            when instantiating the DerivedShapeStore with an incompatible
4881            table which is now in test_derivedshapestore.py. Add some more
4882            tests of the layer methods to determine whether they work for a
4883            DerivedShapeStore as well.
4884    
4885    2003-07-31  Jonathan Coles   <[email protected]>
4886    
4887            * Doc/manual/thuban-manual.xml: Fix the list of required packages
4888            by just listing the name and where they can be found.
4889    
4890    2003-07-31  Frank Koormann   <[email protected]>
4891    
4892            * Doc/manual/thuban-manual.xml:
4893            Changed the screenshot elements to figure.
4894            Changed some variablelist elements to itemizedlist.
4895            Added section on GDAL formats.
4896    
4897    2003-07-31  Jonathan Coles   <[email protected]>
4898    
4899            * Doc/manual/thuban-manual.xml: Added a few sentences about
4900            the Fix Border Color option when generating classes.
4901    
4902    2003-07-30  Jonathan Coles   <[email protected]>
4903    
4904            * Thuban/Model/classgen.py: Add docstrings. Rename specific
4905            Ramp instances to use lower_case_style.
4906    
4907            * Thuban/UI/classgen.py: Use renamed Ramp instances.
4908            
4909            * Thuban/UI/classifier.py: Add docstrings.
4910    
4911            * Thuban/UI/dock.py: Add docstrings.
4912    
4913            * test/test_classgen.py: Use renamed Ramp instances.
4914    
4915    2003-07-30  Bernhard Herzog  <[email protected]>
4916    
4917            * Thuban/Lib/connector.py (QueueingPublisher): Removed. This class
4918            was never used in Thuban.
4919    
4920    2003-07-30  Bernhard Herzog  <[email protected]>
4921    
4922            * Thuban/UI/join.py (JoinDialog.__init__): Use the table's Title()
4923            method directly instead of going through the transient_table
4924            method. This faster because transient_table may force the copy of
4925            a DBF file into the transient database and setting a table's title
4926            doesnm't affect the title of the associated transient table, so
4927            this fixes RT #2042
4928    
4929            * Thuban/UI/main.py (__version__): Don't import the already
4930            removed show_exception_dialog.
4931    
4932    2003-07-29  Jonathan Coles   <[email protected]>
4933    
4934            * Thuban/UI/application.py (ThubanApplication.ShowExceptionDialog):
4935            Put back this method and remove the equivalent function since we
4936            are setting the exception hook from within this class (OnInit).
4937    
4938    2003-07-29  Jonathan Coles   <[email protected]>
4939    
4940            * Doc/manual/images/5_2_custom_ramp.png,
4941            Doc/manual/images/5_2_quantiles.png,
4942            Doc/manual/images/5_2_uniform_dist.png,
4943            Doc/manual/images/5_2_unique_values.png,
4944            Doc/manual/images/8_int_error.png: New screen shots.
4945    
4946            * Doc/manual/thuban-manual.xml: Fixed typos and wording, clarified
4947            some points, and added more screen shots.
4948    
4949    2003-07-29  Bernhard Herzog  <[email protected]>
4950    
4951            * Thuban/Model/data.py: Remove the now unused import of warnings
4952    
4953    2003-07-29  Bernhard Herzog  <[email protected]>
4954    
4955            * Thuban/Model/data.py (SimpleStore): Removed. This class has been
4956            deprecated since before the 0.8 release and isn't used in Thuban
4957            itself anymore.
4958    
4959            * Thuban/Model/transientdb.py: Remove some unnecessary imports
4960    
4961    2003-07-29  Jonathan Coles   <[email protected]>
4962    
4963            * Thuban/UI/application.py (ThubanApplication.OnInit): set the
4964            python exception hook here so that we are sure to catch any
4965            Thuban exception that happen during initialization.
4966    
4967            * Thuban/UI/main.py (main): Don't set the exception hook here,
4968            it will get set in ThubanApplication.OnInit.
4969    
4970    2003-07-29  Jonathan Coles   <[email protected]>
4971                                                                                
4972            * Thuban/UI/application.py (ThubanApplication.ShowExceptionDialog):
4973            Removed and called it show_exception_dialog() so that the exception
4974            handler can be set before the class is created.
4975                                                                                
4976            * Thuban/UI/main.py (main): Install the exception handler before
4977            a ThubanApplication is created.
4978                                                                                    
4979    2003-07-29  Bernhard Herzog  <[email protected]>
4980    
4981            * po/it.po: New. Italian translation by Maurizio Napolitano
4982    
4983            * po/ru.po: New. Russian translation by Alex Shevlakov
4984    
4985    2003-07-29  Frank Koormann   <[email protected]>
4986    
4987            * Doc/manual/thuban-manual.xml: Extended section on supported
4988            projections.
4989            
4990    2003-07-29  Frank Koormann   <[email protected]>
4991    
4992            * Doc/manual/thuban-manual.xml: gaspell-checked.
4993    
4994    2003-07-29  Jonathan Coles   <[email protected]>
4995    
4996            * Doc/manual/images/3_5_legend.png: Added border to improve look
4997            on white background.
4998    
4999    2003-07-29  Jonathan Coles   <[email protected]>
5000    
5001            * Doc/manual/thuban-manual.xml: Fixed grammar and typos. Added
5002            descriptions for the legend toolbar.
5003    
5004            * Doc/manual/images/4_2_raster_layer_properties.png: Removed
5005            cursor from dialog box.
5006    
5007    2003-07-28  Jonathan Coles   <[email protected]>
5008    
5009            * Doc/manual/thuban-manual.xml: More screenshots and more chapters.
5010    
5011            * Doc/manual/images/2_4_session_tree.png,
5012            Doc/manual/images/3_5_legend.png, Doc/manual/images/3_rename_map.png,
5013            Doc/manual/images/4_2_layer_properties.png,
5014            Doc/manual/images/4_2_raster_layer_properties.png,
5015            Doc/manual/images/5_3_genclass.png,
5016            Doc/manual/images/5_classification.png,
5017            Doc/manual/images/6_projection.png,
5018            Doc/manual/images/7_1_table_view.png,
5019            Doc/manual/images/7_2_5_join.png: New screenshots.
5020    
5021    2003-07-24  Jonathan Coles   <[email protected]>
5022    
5023            * Doc/manual/thuban-manual.xml: Chapter on Projection Management.
5024    
5025    2003-07-24  Jonathan Coles   <[email protected]>
5026    
5027            * Doc/manual/thuban-manual.xml: Added EPS images and wrote
5028            chapter on Layer Management.
5029    
5030            * Doc/manual/Makefile: New. Makefile to generate all formats for the
5031            manual and images.
5032    
5033    2003-07-24  Bernhard Herzog  <[email protected]>
5034    
5035            * Thuban/Model/range.py, Thuban/version.py: Remove the #! line as
5036            it annoys lintian which warns about these files not being
5037            executable. The #! isn't necessary here since if you absolutely
5038            must execute them you can always say "python <filename>".
5039    
5040            * Thuban/UI/renderer.py (ScreenRenderer.draw_shape_layer): Remove
5041            superfluous code to set brush and pen for point shapes
5042    
5043            * Thuban/UI/viewport.py: Remove commented out code that wouldn't
5044            belong in viewport anyway
5045    
5046    2003-07-24  Frank Koormann   <[email protected]>
5047    
5048            * Doc/manual/thuban-manual.xml: Added section on table management.
5049    
5050    2003-07-24  Bernhard Herzog  <[email protected]>
5051    
5052            * test/runtests.py (main): Recognize the long "verbose" option
5053            correctly.
5054    
5055    2003-07-22  Jonathan Coles   <[email protected]>
5056    
5057            * Doc/manual/thuban-manual.xml: Continue to write first revision
5058            of the manual.
5059    
5060            * Thuban/UI/renderer.py (MapRenderer.render_map): Wrap method
5061            with Begin/EndDrawing() calls to ensure we aren't doing to
5062            many updates to the dc during rendering.
5063            (ScreenRenderer.draw_shape_layer): self.draw_point_shape takes
5064            a pen and brush argument so they need to be passed to the function.
5065    
5066            * Thuban/UI/viewport.py (ViewPort.calc_min_max_scales): New.
5067            Calculates the minimum and maximum scale values. Factored out
5068            of set_view_transform so that it could be used to zoom all the
5069            way into a single point.
5070            (ViewPort.set_view_transform): Call calc_min_max_scales().
5071            (ViewPort.FitSelectedToWindow): Zoom to the maximum scale
5072            if only a single point is selected.
5073    
5074            * Doc/manual/images/1_2_legend_close.png,
5075            Doc/manual/images/1_2_legend_dock.png,
5076            Doc/manual/images/1_2_mainwindow.png,
5077            Doc/manual/images/1_2_mainwindow.ps,
5078            Doc/manual/images/1_2_mainwindow.sk,
5079            Doc/manual/images/3_2_fullextent.png,
5080            Doc/manual/images/3_2_fulllayerextent.png,
5081            Doc/manual/images/3_2_fullshapeextent.png,
5082            Doc/manual/images/3_2_pan.png,
5083            Doc/manual/images/3_2_zoomin.png,
5084            Doc/manual/images/3_2_zoomout.png,
5085            Doc/manual/images/3_3_identify.png,
5086            Doc/manual/images/3_3_label.png,
5087            Doc/manual/images/3_5_invisible.png,
5088            Doc/manual/images/3_5_movedown.png,
5089            Doc/manual/images/3_5_moveup.png,
5090            Doc/manual/images/3_5_props.png,
5091            Doc/manual/images/3_5_tobottom.png,
5092            Doc/manual/images/3_5_totop.png,
5093            Doc/manual/images/3_5_visible.png: New. Images for the documentation.
5094    
5095    2003-07-18  Bernhard Herzog  <[email protected]>
5096    
5097            * Thuban/UI/messages.py (MAP_REPLACED): New message.
5098    
5099            * Thuban/UI/viewport.py (ViewPort.SetMap): Issue MAP_REPLACED
5100            after the new map has been assigned
5101    
5102            * Thuban/UI/mainwindow.py (MainWindow.delegated_messages):
5103            Delegate MAP_REPLACED to the canvas too
5104            (MainWindow.prepare_new_session): Removed. Thanks to the new
5105            MAP_REPLACED message it's no longer needed
5106            (MainWindow.OpenSession, MainWindow.NewSession):
5107            prepare_new_session has been removed.
5108    
5109            * Thuban/UI/classifier.py (Classifier.__init__): Subscribe to
5110            MAP_REPLACED so that we can close the dialog if a new map is set.
5111            (Classifier.unsubscribe_messages): Unsubscribe from MAP_REPLACED
5112            (Classifier.map_replaced): Handle MAP_REPLACED by closing the
5113            dialog
5114    
5115            * test/test_viewport.py (SimpleViewPortTest)
5116            (SimpleViewPortTest.test_default_size): Add doc-strings
5117            (ViewPortTest.setUp): Bind map to self.map so we can use it in
5118            tests. Subscribe to MAP_REPLACED messages too.
5119            (ViewPortTest.tearDown): No need to explicitly unsubscribe
5120            (ViewPortTest.test_set_map): New test for the SetMap method.
5121    
5122    2003-07-18  Bernhard Herzog  <[email protected]>
5123    
5124            * test/test_viewport.py (SimpleViewPortTest.test_default_size):
5125            Move this test from ViewPortTest.setUp to this new separate test
5126            case. setUp is not the place for the actual tests.
5127            (ViewPortTest.test_inital_settings, ViewPortTest.setUp): Move some
5128            more of the test from setUp to the new test test_inital_settings.
5129            (ViewPortTest.test_win_to_proj, ViewPortTest.test_proj_to_win)
5130            (ViewPortTest.test_proj_conv): Split test_proj_conv into
5131            test_win_to_proj and test_proj_to_win and make the tests easier to
5132            understand
5133            (ViewPortTest.testFitRectToWindow, ViewPortTest.testZoomFactor)
5134            (ViewPortTest.testZoomOutToRect, ViewPortTest.testTranslate)
5135            (ViewPortTest.test_unprojected_rect_around_point)
5136            (ViewPortTest.test_find_shape_at, ViewPortTest.testTools):
5137            Reformat to increase readability.
5138    
5139    2003-07-18  Bernhard Herzog  <[email protected]>
5140    
5141            * Thuban/UI/view.py (MapCanvas.OnLeftDown): Capture the mouse.
5142    
5143    2003-07-18  Bernhard Herzog  <[email protected]>
5144    
5145            * test/runtests.py: The test suite can now be run without an X
5146            connection. To make sure this remains true, remove the DISPLAY
5147            environment variable so that an error occurs if the wxGTK is
5148            imported accidentally
5149    
5150    2003-07-18  Bernhard Herzog  <[email protected]>
5151    
5152            * Thuban/UI/viewport.py: Remove unused imports
5153    
5154            * Thuban/UI/view.py: Remove unused imports
5155    
5156    2003-07-18  Bernhard Herzog  <[email protected]>
5157    
5158            * test/test_export.py Remove unused imports. The OutputTransform
5159            function is now in viewport.py and is called output_transform
5160            (TestScalebar.test_output_transform)
5161            (TestScalebar.test_OutputTransform): Renamed to
5162            test_output_transform and updated to use output_transform instead
5163            of OutputTransform
5164    
5165            * Thuban/UI/view.py (OutputTransform): Moved to viewport.py and
5166            renamed.
5167            (MapCanvas.Export, MapPrintout.draw_on_dc): OutputTransform was
5168            renamed to output_transform
5169    
5170            * Thuban/UI/viewport.py (OutputTransform, output_transform):
5171            Rename to output_transform
5172    
5173    2003-07-18  Bernhard Herzog  <[email protected]>
5174    
5175            * Thuban/Model/layer.py (Layer.__init__): Rename
5176            classificationField to classificatin_column and init it here so
5177            that it can be used in SetClassificationColumn
5178            (Layer.GetClassificationColumn, Layer.GetClassificationField):
5179            Rename to GetClassificationColumn.
5180            (Layer.SetClassificationColumn, Layer.SetClassificationField):
5181            Rename to SetClassificationColumn and issue a LAYER_CHANGED
5182            message if the column changes.
5183            (Layer._classification_changed, Layer.ClassChanged): Rename to
5184            _classification_changed. Update the callers.
5185            (Layer.SetShapeStore): Further field->column renames.
5186    
5187            * Thuban/Model/load.py (SessionLoader.start_classification)
5188            (SessionLoader.start_clpoint): Updates because of
5189            field->column method name changes in the Layer class
5190    
5191            * Thuban/Model/save.py (SessionSaver.write_classification): Updates
5192            because of field->column method name changes in the Layer class
5193    
5194            * Thuban/UI/classifier.py (Classifier.__init__)
5195            (Classifier._OnTry, Classifier._OnRevert): Updates because of
5196            field->column method name changes in the Layer class
5197    
5198            * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Updates
5199            because of field->column method name changes in the Layer class
5200    
5201            * Thuban/UI/viewport.py (ViewPort.find_shape_at): Updates because
5202            of field->column method name changes in the Layer class
5203    
5204            * test/test_save.py (SaveSessionTest.testClassifiedLayer)
5205            (SaveSessionTest.testClassifiedLayer): Update because of
5206            field->column method name changes in the Layer class
5207    
5208            * test/test_layer.py (SetShapeStoreTests.setUp)
5209            (SetShapeStoreTests.test_sanity): Update because of field->column
5210            method name changes in the Layer class
5211            (TestLayerModification.setUp): Subscribe to LAYER_CHANGED as well
5212            (TestLayerModification.test_sanity)
5213            (TestLayerModification.test_initial_settings): remove unsued code
5214            and rename to test_sanity.
5215            (TestLayerModification.test_set_classification): New test for
5216            SetClassification and SetClassificationField.
5217    
5218    2003-07-18  Bernhard Herzog  <[email protected]>
5219    
5220            * test/test_classgen.py (TestFixedRamp.test): Extend test to check
5221            the non-fixed values as well. The old test would have accepted a
5222            fixed ramp that only returnes the fixed properties
5223    
5224    2003-07-17  Jonathan Coles   <[email protected]>
5225    
5226            * Doc/manual/mainwindow.png, Doc/manual/mainwindow.xcf: Screen
5227            shots for the manual. The XCF file is the source image and
5228            has additional layers to support changes.
5229    
5230            * Doc/manual/thuban-manual.xml: Wrote an initial Introduction.
5231    
5232            * Thuban/UI/classifier.py (Classifier.__BuildClassification):
5233            Return both the new class and the field name.
5234    
5235            * Thuban/UI/mainwindow.py (MainWindow.ToggleLegend): Don't
5236            fit the map to the window as this changes any zoom level that
5237            the user may have set.
5238    
5239    2003-07-16  Jonathan Coles   <[email protected]>
5240    
5241            * Thuban/Model/classgen.py (generate_singletons,
5242            generate_uniform_distribution, generate_quantiles): Remove
5243            fixes parameter, but maintain the same functionality by having
5244            the calling function pass a FixedRamp object for the ramp.
5245            (FixedRamp): New. Adapts a ramp to have fixed property values.
5246    
5247            * Thuban/Model/classification.py: Use new CLASS_CHANGED message.
5248            (Classification): Inherit from Publisher.
5249            (Classification.__init__): Remove the layer parameter.
5250            Classifications no longer need to have a parent layer.
5251            (Classification.GetField, Classification.GetFieldType,
5252            Classification.SetFieldInfo): Removed. The field name is stored
5253            in the layer, and the type can be retreived by calling
5254            Layer.GetFieldType().
5255            (Classification._set_layer, Classification.GetLayer): Removed.
5256            Classifications no longer have a parent layer.
5257    
5258            * Thuban/Model/layer.py (Layer.Destroy): Unsubscribe from the
5259            classification.
5260            (Layer.SetShapeStore): Reset the classification first while
5261            we still have the old shape store to work with.
5262            (Layer.GetClassificationField, Layer.SetClassificationField):
5263            New. Method for getting/setting the field to classify on.
5264            (Layer.SetClassification): Simplified now that the layer
5265            simply has to hold a reference to the classification and not
5266            tell the classification who owns it.
5267            Fixes RTbug #2023.
5268    
5269            * Thuban/Model/load.py (SessionLoader.start_classification):
5270            Set the field name on the layer, not the classification.
5271    
5272            * Thuban/Model/messages.py: Add CLASS_CHANGED for when a
5273            classification is modified.
5274    
5275            * Thuban/Model/save.py (SessionSaver.write_classification):
5276            Get the field name and type from the layer.
5277    
5278            * Thuban/Model/table.py (table_to_dbf, table_to_csv): Renamed
5279            parameter records to rows and add docstring. Fixes RTbug #1997.
5280    
5281            * Thuban/UI/classgen.py (ClassGenDialog.OnOK): Use a fixed
5282            ramp when we need to fix certain values of a ramp rather than
5283            using the old fixes parameter. Fixes RTbug #2024.
5284    
5285            * Thuban/UI/classifier.py (ClassGrid.CreateTable): Add fieldType
5286            parameter.
5287            (ClassTable.Reset): Add fieldType parameter and use it, rather
5288            than asking the classification.
5289            (Classifier.__init__): Remember the original class's field
5290            and ask the layer for the field type, rather than the classification.
5291            (Classifier.__SetGridTable): Retrieve the field and field type
5292            for the table because they are not in the classification.
5293            (Classifier._OnTry, Classifier._OnRevert): Set the classification
5294            field on the layer in addition to the classification itself.
5295    
5296            * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Get the
5297            classification field from layer.
5298    
5299            * Thuban/UI/viewport.py (ViewPort.find_shape_at): Get the
5300            classification field from layer. Split up tests and remove
5301            *-imports. Fixes RTbug #1992.
5302    
5303            * test/test_classgen.py (TestFixedRamp): Test for the FixedRamp class.
5304    
5305            * test/test_classification.py
5306            (TestClassification.test_classification): Remove tests for methods
5307            that no longer exist.
5308    
5309            * test/test_layer.py (SetShapeStoreTests.setUp): Classification
5310            __init__ no longer has a field parameter, use SetClassificationField.
5311            (SetShapeStoreTests.test_sanity): Use layer object to get class
5312            field info.
5313    
5314            * test/test_save.py (SaveSessionTest.testClassifiedLayer): Use
5315            SetClassificationField on layer to set class field info.
5316    
5317            * test/test_viewport.py: Renamed from test/test_view.py.
5318    
5319    2003-07-16  Jan-Oliver Wagner <[email protected]>
5320    
5321            * Doc/manual/thuban-manual.xml: Added authors and an initial
5322            coarse structure.
5323    
5324    2003-07-15  Bernhard Herzog  <[email protected]>
5325    
5326            * test/support.py (FloatComparisonMixin): This is a mix-in class
5327            and therefore should not be derived from any other class.
5328    
5329            * test/test_range.py (RangeTest): FloatComparisonMixin is a
5330            mix-in, so derive from TestCase as well.
5331    
5332    2003-07-15  Bernhard Herzog  <[email protected]>
5333    
5334            * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Rework the
5335            draw_func handling a bit to remove one layer of indirection. This
5336            makes the renderer about 10% faster in the non-classifying case
5337            and the code a bit cleaner
5338            (MapRenderer.draw_point_shape): Add the pen and brush parameters
5339            and set them in the dc. Now the draw_point_shape method and
5340            wxproj's draw_polygon_shape function have basically the same
5341            signature so that both can be directly used as draw_func
5342    
5343    2003-07-15  Bernhard Herzog  <[email protected]>
5344    
5345            * Thuban/Model/save.py (SessionSaver.write_classification): Encode
5346            string values (in addition to the labels) as UTF 8
5347    
5348            * Thuban/Model/load.py (SessionLoader.start_clpoint): Decode the
5349            values if the field type is string
5350    
5351            * test/test_save.py (SaveSessionTest.testClassifiedLayer): Test
5352            saving a session with non-ascii string classification values.
5353    
5354            * test/test_load.py (TestClassification.file_contents)
5355            (TestClassification.test): Check for non-ascii values in string
5356            classifications
5357    
5358    2003-07-14  Jonathan Coles   <[email protected]>
5359    
5360            * test/test_view.py: New. Tests for ViewPort.
5361    
5362    2003-07-14  Frank Koormann   <[email protected]>
5363    
5364            * Thuban/Model/load.py (SessionLoader.start_map): Encode map
5365            title to latin1.  Fixes https://intevation.de/rt/webrt?serial_num=2013
5366    
5367            * test/test_load_0_8.py (TestUnicodeStrings): New, test load of
5368            unicode strings from session file: session title, map title and
5369            projection name.
5370            
5371    2003-07-10  Jonathan Coles   <[email protected]>
5372    
5373            * Thuban/UI/viewport.py (Tool.MouseUp): Should have called
5374            drag_stop, not drag_move when the mouse is released.
5375    
5376    2003-07-10  Jonathan Coles   <[email protected]>
5377    
5378            The most important part of this is the seperation of view.py into
5379            two pieces. viewport.py now has a class called ViewPort which
5380            contains all the non-wx parts of view.py and can therefore be
5381            tested. view.py contains only the wx-specific parts and is fairly
5382            simple.
5383    
5384            * Thuban/UI/view.py: Stripped out all non-wx functionality. Fixes
5385            RTTbug #1992.
5386            * Thuban/UI/viewport.py: New. Contains non-wx view functionality.
5387            RTTbug #1992.
5388    
5389            * Thuban/Model/classgen.py (generate_singletons,
5390            generate_uniform_distribution, generate_quantiles):
5391            Added 'fixes' parameter so that property attributes can
5392            be held constant over the generated classification groups.
5393            (CustomRamp.GetProperties): Remove unused variables.
5394    
5395            * Thuban/Model/map.py (Map.SetProjection): Send the old
5396            projection as an argument to listeners of the MAP_PROJECTION_CHANGED
5397            event.
5398    
5399            * Thuban/Model/table.py (table_to_dbf, table_to_csv): Added 'records'
5400            parameter which is a list of records that restricts which
5401            records are saved. Fixes RTbug #1997.
5402    
5403            * Thuban/UI/application.py (ThubanApplication.ShowExceptionDialog):
5404            Port exception dialog from GREAT-ER. Fixes RTbug #1993.
5405    
5406            * Thuban/UI/classgen.py (ClassGenDialog.__init__): Add controls
5407            to allow the user to fix line color/width on generated groups.
5408            (ClassGenDialog.OnOK): Use new 'fixes' parameter of the generate_*
5409            functions to optionally fix group properties.
5410    
5411            * Thuban/UI/main.py (main): Set exception hook to the
5412            ShowExceptionDialog. Fixes RTbug #1993.
5413    
5414            * Thuban/UI/mainwindow.py (MainWindow.ShowTableView): Raise
5415            the table window when it is selectd to be shown.
5416    
5417            * Thuban/UI/tableview.py (QueryTableFrame.__init__): Add an
5418            Export Selection button and move the export buttons underneath
5419            the table.
5420            (QueryTableFrame.UpdateStatusText): Added event argument so
5421            that it can respond to grid selection events. The status text
5422            is now updated even when the table is not associated with a
5423            layer as was previously assumed.
5424            (QueryTableFrame.OnGridSelectRange, OnGridSelectCell): Removed.
5425            UpdateStatusText responds to these events.
5426            (QueryTableFrame.OnSaveAs): Renamed to doExport.
5427            (QueryTableFrame.doExport): Helper function that saves the
5428            entire table, or selected rows, to a file.
5429            (QueryTableFrame.OnExport, QueryTableFrame.OnExportSel): New.
5430            Respond to export button events and call doExport.
5431    
5432            * extensions/thuban/gdalwarp.cpp (ProjectRasterFile): Make sure
5433            the function doesn't return NULL without first setting a Python
5434            Error.
5435    
5436            * test/runtests.py (main): Only print "Unknown option" for
5437            unsupported options.
5438    
5439            * test/support.py (FloatComparisonMixin.assertFloatEqual): Take
5440            optional epsilon argument to specify floating point accuracy.
5441            (FloatComparisonMixin.assertFloatSeqEqual): Call assertFloatEqual
5442            for each item test.
5443    
5444            * test/test_csv_table.py (TestCSVTable.test_table_to_cvs): Add
5445            tests for saving selected records.
5446    
5447            * test/test_dbf_table.py (TestTableToDBF.test_table_to_dbf): Add
5448            tests for saving selected records.
5449    
5450            * test/test_map.py (TestMapWithContents.test_set_projection):
5451            MAP_PROJECTION_CHANGED events send the old projection.
5452    
5453            * test/test_session.py
5454            (TestSessionWithContent.test_forward_map_projection):
5455            MAP_PROJECTION_CHANGED events send the old projection.
5456    
5457            * test/test_table.py (TableTest): Update tests to use non-deprecated
5458            functions.
5459    
5460    2003-07-08  Bernhard Herzog  <[email protected]>
5461    
5462            * Thuban/Model/transientdb.py (TransientTableBase.Width): The type
5463            constants in the column objects are the standard ones defined in
5464            the table module.
5465    
5466            * test/test_transientdb.py
5467            (TestTransientTable.test_transienttable_to_dbf): New. Test whether
5468            exporting transient tables as DBF works. This should catch the bug
5469            just fixed in TransientTableBase.Width.
5470    
5471    2003-07-08  Bernhard Herzog  <[email protected]>
5472    
5473            * Thuban/Model/classgen.py (CustomRamp.GetProperties): Compute the
5474            interpolated colors correctly.
5475    
5476            * test/test_classgen.py (TestCustomRamp.test_color_interpolation):
5477            New. Test case for the fix in classgen.py
5478    
5479    2003-07-08  Bernhard Herzog  <[email protected]>
5480    
5481            * test/runtests.py (main): Make the default output less verbose
5482            and add a verbosity option (-v) to get the old output
5483    
5484    2003-07-08  Bernhard Herzog  <[email protected]>
5485    
5486            * Resources/XML/thuban-0.9.dtd: New. This will become the DTD for
5487            0.9.
5488    
5489            * Thuban/Model/transientdb.py (TransientJoinedTable.JoinType):
5490            New. Return the join type
5491    
5492            * Thuban/Model/save.py (SessionSaver.write_session): Use new 0.9
5493            DTD
5494            (SessionSaver.write_data_containers): Save the join type for
5495            joined tables
5496    
5497            * Thuban/Model/load.py (SessionLoader.__init__): Add the new 0.9
5498            namespace
5499            (SessionLoader.start_jointable): Handle the jointype attribute
5500    
5501            * test/test_load_0_8.py: New. Effectively a copy of test_load.py
5502            as of Thuban 0.8. These are now tests to determine whether Thuban
5503            can still read files generated by Thuban 0.8
5504    
5505            * test/test_load.py (LoadSessionTest.dtd)
5506            (TestSingleLayer.file_contents)
5507            (TestLayerVisibility.file_contents, TestLabels.file_contents)
5508            (TestLayerProjection.file_contents)
5509            (TestRasterLayer.file_contents, TestJoinedTable.file_contents)
5510            (TestJoinedTable.file_contents)
5511            (TestLoadError.file_contents): Update for new DTD
5512            (TestJoinedTable.file_contents, TestJoinedTable.setUp): Add test
5513            for new join type attribute
5514    
5515            * test/test_save.py (SaveSessionTest.dtd)
5516            (SaveSessionTest.testEmptySession)
5517            (SaveSessionTest.testSingleLayer)
5518            (SaveSessionTest.testLayerProjection)
5519            (SaveSessionTest.testRasterLayer)
5520            (SaveSessionTest.testClassifiedLayer)
5521            (SaveSessionTest.test_dbf_table)
5522            (SaveSessionTest.test_joined_table): Update for new DTD
5523            (SaveSessionTest.test_joined_table): Add test for new join type
5524            attribute
5525    
5526    2003-07-04  Bernhard Herzog  <[email protected]>
5527    
5528            * Thuban/Model/table.py (_find_dbf_column_names): New. Helper
5529            function for table_to_dbf
5530            (table_to_dbf): Deal with names longer than the 10 character limit
5531    
5532            * test/test_dbf_table.py (TestTableToDBF.test_table_to_dbf): Add
5533            doc-string
5534            (TestTableToDBF.test_table_to_dbf_long_col_names): New test for
5535            long column names
5536    
5537    2003-07-03  Bernhard Herzog  <[email protected]>
5538    
5539            * Doc/manual/thuban-manual.xml: Fix the CVS Revision Tag syntax
5540    
5541    2003-07-03  Bernhard Herzog  <[email protected]>
5542    
5543            * Doc/manual/thuban-manual.xml, Doc/manual/README: New. Skeleton
5544            for the Thuban manual and README with some basic information about
5545            the manual
5546    
5547    2003-07-03  Bernhard Herzog  <[email protected]>
5548    
5549            * Thuban/Model/transientdb.py (TransientJoinedTable.__init__):
5550            Update doc-string
5551            (TransientJoinedTable.create): Do not modify the column objects of
5552            the input tables in place and copy all columns of the input tables
5553            into the joined table after all.
5554    
5555            * test/test_transientdb.py
5556            (TestTransientTable.test_transient_joined_table_same_column_name):
5557            Update to reflect the new behavior
5558            (TestTransientTable.test_transient_joined_table_with_equal_column_names):
5559            Update to reflect the new behavior
5560            (TestTransientTable.test_transient_joined_table_name_collisions_dont_modify_in_place):
5561            New test case for a bug which modified the column objects in place
5562    
5563    2003-07-02  Jonathan Coles   <[email protected]>
5564    
5565            * Thuban/Model/classgen.py (generate_singletons,
5566            generate_uniform_distribution, generate_quantiles,
5567            GenQuantiles0): Make sure maxValue isn't less than
5568            one, otherwise we could divide by zero.
5569    
5570            * test/test_classgen.py (ClassGenTest.doClassRangeTest,
5571            ClassGenTest.doClassSingleTest): Call doBoundsTest to
5572            check the end classification groups against the
5573            proper property values.
5574            (ClassGenTest.doBoundsTest): New. Checks the first and
5575            last classification groups to make sure their properties
5576            are the correct upper and lower bounds for a color ramp.
5577    
5578    2003-07-02  Jonathan Coles   <[email protected]>
5579    
5580            * Thuban/Model/classgen.py (generate_singletons,
5581            generate_uniform_distribution, generate_quantiles,
5582            GenQuantiles0): The denominator was one to high when
5583            calculating the index for the ramp causing the index
5584            to never to reach one.
5585    
5586    2003-07-02  Jonathan Coles   <[email protected]>
5587    
5588            Changed the singature of ClassGroupRange.__init__ and
5589            ClassGroupRange.SetRange() so that the min/max values are
5590            passed as a tuple. This makes a better calling scheme for
5591            when a Range object is passed instead.
5592    
5593            * Thuban/Model/classgen.py: Fixed parameters to
5594            ClassGroupRange constructor.
5595    
5596            * Thuban/Model/classification.py (ClassGroupRange.__init__):
5597            Consolidate the min/max parameters into a single _range which
5598            can either be a tuple or a Range object.
5599            (ClassGroupRange.SetRange): Consolidate the min/max parameters
5600            into a single _range which can either be a tuple or a Range object.
5601    
5602            * Thuban/Model/load.py (SessionLoader.start_clrange): Fix
5603            call to ClassGroupRange constructor to use a tuple.
5604    
5605            * Thuban/Model/layer.py (Layer.SetClassification): Switch
5606            the classification instance variable to the new class
5607            before calling _set_layer otherwise subscribers to a
5608            LAYER_CHANGED event will not see any difference.
5609    
5610            * test/test_classification.py: Fix tests of ClassGroupRange
5611            so that they use the new signature.
5612    
5613            * test/test_load.py: Fix use of ClassGroupRange so that it
5614            uses the new signature.
5615    
5616            * test/test_load_0_2.py: Fix use of ClassGroupRange so that it
5617            uses the new signature.
5618    
5619            * test/test_save.py: Fix use of ClassGroupRange so that it
5620            uses the new signature.
5621    
5622    
5623    2003-07-01  Jonathan Coles   <[email protected]>
5624    
5625            * Thuban/Model/classgen.py: Fixes RTbug #1972, 1971.
5626            Import used objects/class from color.
5627            (generate_singletons): We don't
5628            need the numGroups parameter anymore because we are using
5629            the new ramps with GetProperties().
5630            (generate_uniform_distribution): Use new ramp method
5631            GetProperties().
5632            (generate_quantiles, GenQuantiles0): Use new ramp method
5633            GetProperties().
5634            (CustomRamp.SetNumGroups): Removed. The ramps now map
5635            a value from 0 to 1 to class properties so the number
5636            of groups is not needed ahead of time.
5637            (CustomRamp.next): Removed. CustomRamp does not support
5638            interation anymore.
5639            (CustomRamp.GetProperties): Returns a ClassGroupProperties
5640            object based on the index value from 0 to 1 that is
5641            passed to it.
5642            (GreyRamp, RedRamp, GreenRamp, BlueRamp, GreenToRedRamp):
5643            Made into instances of Monochromatic class instread of
5644            deriving from it.
5645            (HotToCold.SetNumGroups): Removed. See CustomRamp.
5646            (HotToCold.next): Removed. See CustomRamp.
5647    
5648            * Thuban/Model/classification.py: Fixes RTbug #1973, 1971.
5649            (Classification.SetField, Classification.SetFieldType):
5650            Replaced with SetFieldInfo.
5651            (Classification.SetFieldInfo): New. Does a better job of
5652            what SetField and SetFieldType used to do by combining
5653            their function since they should really always be done
5654            at the same time.
5655            (Classification.SetLayer): Renamed to _set_layer.
5656            (Classification._set_layer): Should only be called from
5657            Layer's SetClassification. This does not cause a recursive
5658            call as SetLayer did because we know that Layer knows about
5659            the classification.
5660    
5661            * Thuban/Model/color.py: Fixes RTbug #1971.
5662            (_Transparent): Renamed from Transparent so it doesn't
5663            conflict with the module variable.
5664            (Transparent, Black): Renamed from Color.Transparent,
5665            Color.Black so they are not class variables.
5666    
5667            * Thuban/Model/layer.py: Fixes RTbug #1971, 1973.
5668            (Layer.Destroy): We don't need to call SetClassification
5669            anymore to clear out the back reference in the classifcation
5670            to the layer. It's better to set it to None using _set_layer,
5671            and we won't be creating another clas object too.
5672            (Layer.SetClassification): Classification._set_layer is not
5673            recursive so remove all the locking variables. Also clean
5674            up the code so that it remains unchanged if something fails.
5675    
5676            * Thuban/Model/load.py: Fixes RTbug #1971.
5677            (SessionLoader.start_classification): Call
5678            Classification.SetFieldInfo().
5679    
5680            * Thuban/Model/save.py: Removed import of Color which wasn't
5681            being used.
5682    
5683            * Thuban/UI/classgen.py: Fixes RTbug #1972.
5684            (ClassGenDialog.__init__): Color ramps are now instances
5685            already so we don't need to create any new objects.
5686            (ClassGenDialog.OnOK): Check for numGroups is no longer
5687            necessary because we never use it.
5688    
5689            * Thuban/UI/classifier.py: Fixes RTbug #1971.
5690            (Classifier.__BuildClassification, Classifier.__SetGridTable):
5691            Call Classification.SetFieldInfo() instead of SetFieldType.
5692    
5693            * Thuban/UI/renderer.py: Fixes RTbug #1971.
5694    
5695            * Thuban/UI/view.py: Fixes RTbug #1974, 1971.
5696            (MapCanvas.__init__): Subscribe to the idle time event. Set
5697            background color to white.
5698            (MapCanvas.OnPaint): Set a flag indicating that we should
5699            render the map during idle time. If we already have a bitmap
5700            just draw it now.
5701            (MapCanvas.OnIdle): New. Render the map only during idle time.
5702            This also fixes a problem with the busy cursor under gtk.
5703    
5704            * test/test_classgen.py (ClassGenTest.test_generate_singletons):
5705            Fix calls to generate_singletons because the signature changed.
5706    
5707            * test/test_classification.py: Fix color references and
5708            change calls to Classification.[SetField|SetFieldType] to
5709            SetFieldInfo.
5710    
5711            * test/test_load.py: Fix color references.
5712    
5713            * test/test_load_0_2.py: Fix color references.
5714    
5715            * test/test_save.py (SaveSessionTest.testClassifiedLayer):
5716            Change calls to Classification.[SetField|SetFieldType] to
5717            SetFieldInfo.
5718    
5719    2003-07-01  Frank Koormann   <[email protected]>
5720    
5721            MERGE from the greater-ms3 branch.
5722    
5723            * test/test_transientdb.py
5724            (TestTransientTable.test_transient_joined_table_with_equal_column_names):
5725            New. Test join of two tables with partly equal column names.
5726    
5727            * Thuban/Model/transientdb.py (TransientJoinedTable.create):
5728            If duplicates in left and right tables column names are found,
5729            append '_' (underscores) to the name until it is unique.
5730            Create always new internal names for the resulting table and reference
5731            columns in the join statement with <table>.<column>
5732    
5733    2003-07-01  Bernhard Herzog  <[email protected]>
5734    
5735            * test/test_transientdb.py
5736            (TestTransientTable.test_transient_joined_table_same_column_name):
5737            New. Test whether joining on columns with the same names in both
5738            tables works.
5739            
5740            * Thuban/Model/transientdb.py (TransientJoinedTable.create): Make
5741            sure to use the right internal names even when joining on field
5742            with the same names in both tables. Also, detect duplicate names
5743            in the joined table correctly.
5744    
5745    2003-07-01  Frank Koormann   <[email protected]>
5746    
5747            * Thuban/UI/renderer.py (ExportRenderer.render_legend):
5748            Reverse List of layers to render in same order as in desktop legend.
5749    
5750    2003-06-30  Jonathan Coles   <[email protected]>
5751    
5752            * Thuban/version.py (make_tuple): Takes a version string
5753            and splits it into a tuple of at most three integers.
5754            Used make_tuple() to make tuple versions of the version
5755            numbers.
5756    
5757            * Thuban/UI/about.py: Add Thuban email addresses.
5758    
5759    2003-06-30  Jonathan Coles   <[email protected]>
5760    
5761            * Thuban/version.py: SQLite/PySQLite version dependencies
5762            were too high.
5763    
5764    2003-06-30  Jonathan Coles   <[email protected]>
5765    
5766            * Thuban/version.py: Update version to 0.8.1
5767            
5768            * MANIFEST.in: Added Projections so that default.proj is
5769            included.
5770    
5771    2003-06-26  Jonathan Coles   <[email protected]>
5772    
5773            New About box with lots more information including library
5774            versions and credits. More/better version checking before
5775            Thuban starts.
5776    
5777            * Thuban/UI/about.py: New. New About box that displays
5778            library version information and credits.
5779    
5780            * Thuban/version.py: Added new 'versions' dictionary which
5781            contains the verions of various libraries which are checked
5782            when the module loads.
5783            (verify_versions): Check all version numbers and returns
5784            a list of errors.
5785    
5786            * Thuban/UI/classifier.py (Classifier.__EnableButtons):
5787            Reset the status of the buttons as the situation warrants,
5788            but in a better more reliable way by not relying on the
5789            current status to determine what needs to change.
5790    
5791            * Thuban/UI/main.py (wxCHECK_VERSION): Removed. Not needed.
5792            (verify_versions): Remove most of the code since it is
5793            now in Thuban.version.verify_versions.o
5794    
5795            * Thuban/UI/mainwindow.py (MainWindow.About): Call new
5796            About box in Thuban.UI.about.
5797    
5798            * extensions/thuban/gdalwarp.cpp (get_gdal_version): New.
5799            Returns the version of gdal library being used as a string.
5800    
5801            * extensions/thuban/wxproj.cpp (check_version, check_version_gtk):
5802            Removed.
5803            (get_proj_version): Return the version of PROJ that the file
5804            was compiled with.
5805            (get_gtk_version): Return th version of GTK that the file
5806            was compiled with.
5807    
5808    2003-06-25  Jonathan Coles   <[email protected]>
5809    
5810            * Thuban/UI/classifier.py (Classifier.EditSymbol): The parent
5811            of the SelectPropertiesDialog should be self so the window
5812            appears on top.
5813            (ClassGroupPropertiesCtrl.DoEdit): The parent
5814            of the SelectPropertiesDialog should be self so the window
5815            appears on top.
5816    
5817            * Thuban/UI/resource.py: Cleaned up how we determine file
5818            extensions.
5819            (GetImageResource): Return an wxImage from our Resources.
5820    
5821    2003-06-24  Jonathan Coles   <[email protected]>
5822    
5823            * Thuban/UI/renderer.py (ExportRenderer.render_legend):
5824            Check that a layer has a classification before trying
5825            to get it. Raster layers don't have classifications.
5826    
5827    2003-06-23  Jonathan Coles   <[email protected]>
5828            
5829            * setup.py: Add Resources/XML to resource list.
5830        
5831    2003-06-23  Jonathan Coles   <[email protected]>
5832    
5833            * setup.cfg: Fix copyright dates
5834        
5835    2003-06-23  Jonathan Coles   <[email protected]>
5836    
5837            * MANIFEST.in: Update with Resources/XML
5838    
5839            * setup.py: Don't include Locale resources yet as we don't
5840            have any and it causes problems building the distribution
5841            for Windows. Update version to 0.8.0.
5842    
5843            * Doc/thuban.dtd: Removed since it is now in Resources/XML.
5844    
5845            * Thuban/UI/mainwindow.py: Add blank line at the end because
5846            file was not being read correctly building the Windows
5847            distribution.
5848    
5849    2003-06-23  Jonathan Coles   <[email protected]>
5850    
5851            * Thuban/UI/mainwindow.py (MainWindow.About): Fix text.
5852    
5853            * Thuban/version.py: Temporarily update longversion for
5854            the 0.8 release so that it doesn't have the cvs revision.
5855    
5856    2003-06-23  Jonathan Coles   <[email protected]>
5857    
5858            * Thuban/UI/common.py (ThubanBeginBusyCursor): Call wxSafeYield
5859            to make sure that we don't create reentrant possibilities with
5860            wxYield.
5861    
5862            * Thuban/UI/view.py (MapCanvas.OnPaint): Call wxBeginBusyCursor()
5863            directly to avoid the wxSafeYield() call which generates an
5864            OnPaint event causing infinite recursion. Don't try to catch
5865            exception anymore. This was for before there were limits on map
5866            scaling.
5867    
5868    2003-06-23  Bernhard Herzog  <[email protected]>
5869    
5870            Bug fix for RT #1961:
5871    
5872            * Thuban/Model/load.py (SessionLoader.start_derivedshapesource):
5873            Register DerivedShapestores with the session
5874    
5875            * Thuban/Model/session.py (Session.Tables): Make sure each table
5876            is only listed once.
5877    
5878            * test/test_load.py (TestJoinedTable.test): Add check_format call.
5879            Update file contents to match the one written out.
5880    
5881    2003-06-20  Bernhard Herzog  <[email protected]>
5882    
5883            * test/xmlsupport.py (SaxEventLister.startElementNS)
5884            (SaxEventLister.endElementNS): Do not include the qname. Python
5885            2.2.1 and 2.2.2 and 2.2.3 differ in this regard. In 2.2.1 qname it
5886            is (presumably incorrectly) None, whereas it's a string with the
5887            element name in the later versions.
5888    
5889            * test/test_xmlsupport.py (TestEventList.test_even_list_simple)
5890            (TestEventList.test_even_list_namespace): Update tests to reflect
5891            the new behaviour
5892            (TestEventList.test_even_list_id_normalization): Fix doc-string
5893    
5894    2003-06-20  Jonathan Coles   <[email protected]>
5895    
5896            * Thuban/Model/layer.py (BaseLayer.HasShapes): New. Overridden
5897            by deriving classes to determine if that layer supports shapes.
5898            (Layer): Override HasShapes and return true.
5899    
5900            * Thuban/UI/classgen.py: Use Thuban[Begin|End]BusyCursor()
5901            instead of a direct call to wx[Begin|End]CusyCursor().
5902            (GenUniquePanel._OnRetrieve): Set busy cursor while retrieving
5903            table data.
5904    
5905            * Thuban/UI/common.py (ThubanBeginBusyCursor, ThubanEndBusyCursor):
5906            New. Wrappers around the wxWindows functions that allow us to
5907            make additional calls such as wxYield which gives the native
5908            system a chance to update the cursor correctly.
5909    
5910            * Thuban/UI/tableview.py: Use Thuban[Begin|End]BusyCursor()
5911            instead of a direct call to wx[Begin|End]CusyCursor().
5912    
5913            * Thuban/UI/view.py: Use Thuban[Begin|End]BusyCursor()
5914            instead of a direct call to wx[Begin|End]CusyCursor().
5915            (MapCanvas.find_shape_at): Check if the current search layer
5916            support shapes, otherwise go on to the next layer.
5917    
5918            * test/test_layer.py: Add tests in each type of layer for
5919            HasClassification() and HasShapes()
5920    
5921    2003-06-20  Jonathan Coles   <[email protected]>
5922    
5923            * Thuban/UI/view.py (MapCanvas.OnPaint): Call wxYield after
5924            turning on the busy cursor to allow the system to change the
5925            cursor before we begin painting. This fixes a problem that
5926            was occuring only under GTK. Fixes RTbug #1840.
5927    
5928    2003-06-20  Bernhard Herzog  <[email protected]>
5929    
5930            * Resources/XML/thuban-0.8.dtd: New DTD for the new file format
5931            version.
5932    
5933            * Thuban/Model/save.py (sort_data_stores): New. Make topological
5934            sort of the data sources so they can be written with sources that
5935            data sources that depend on other data sources come after the
5936            sources they depend on.
5937            (SessionSaver.__init__): Add idmap instance variable to map from
5938            objects to the ids used in the file.
5939            (SessionSaver.get_id, SessionSaver.define_id)
5940            (SessionSaver.has_id): New. Methods to manage the idmap
5941            (SessionSaver.write): Use thuban-0.8.dtd
5942            (SessionSaver.write_session): Add a namespace on the session and
5943            write out the data sources before the maps.
5944            (SessionSaver.write_data_containers): New. Write the data
5945            containers.
5946            (SessionSaver.write_layer): Layer elements now refer to a
5947            shapestore and don't contain filenames anymore.
5948    
5949            * Thuban/Model/load.py (LoadError): Exception class to raise when
5950            errors in the files are discovered
5951            (SessionLoader.__init__): Define dispatchers for elements with a
5952            thuban-0.8 namespace too.
5953            (SessionLoader.check_attrs): New helper method to check and
5954            convert attributes
5955            (AttrDesc): New. Helper class for SessionLoader.check_attrs
5956            (SessionLoader.start_fileshapesource)
5957            (SessionLoader.start_derivedshapesource)
5958            (SessionLoader.start_filetable, SessionLoader.start_jointable):
5959            Handlers for the new elements in the new fileformat
5960            (SessionLoader.start_layer): Handle the shapestore attribute in
5961            addition to filename.
5962            (SessionLoader.start_table, SessionLoader.end_table): Removed.
5963            They were never used in the old formats and aren't needed for the
5964            new.
5965    
5966            * Thuban/Model/session.py (Session.DataContainers): New method to
5967            return all "data containers", i.e. shapestores and tables
5968    
5969            * test/xmlsupport.py (SaxEventLister.__init__)
5970            (SaxEventLister.startElementNS, sax_eventlist): Add support to
5971            normalize IDs.
5972    
5973            * test/test_xmlsupport.py
5974            (TestEventList.test_even_list_id_normalization): New test case for
5975            id normalization
5976    
5977            * test/test_load.py (LoadSessionTest.check_format): Use ID
5978            normalization
5979            (LoadSessionTest.thubanids, LoadSessionTest.thubanidrefs): New
5980            class atrributes used for ID normalization
5981            (TestSingleLayer, TestLayerVisibility, TestLabels.test)
5982            (TestLayerProjection.test, TestRasterLayer.test): Adapt to new
5983            file format
5984            (TestJoinedTable): New test for loading sessions with joined
5985            tables.
5986            (TestLoadError): New. Test whether missing required attributes
5987            cause a LoadError.
5988    
5989            * test/test_save.py (SaveSessionTest.thubanids)
5990            (SaveSessionTest.thubanidrefs): New class attributes for ID
5991            normalization in .thuban files.
5992            (SaveSessionTest.compare_xml): Use id-normalization.
5993            (SaveSessionTest.testEmptySession)
5994            (SaveSessionTest.testLayerProjection)
5995            (SaveSessionTest.testRasterLayer)
5996            (SaveSessionTest.testClassifiedLayer): Adapt to new file format.
5997            (SaveSessionTest.testLayerProjection): The filename used was the
5998            same as for testSingleLayer. Use a different one.
5999            (SaveSessionTest.test_dbf_table)
6000            (SaveSessionTest.test_joined_table): New test cases for saving the
6001            new data sources structures.
6002            (TestStoreSort, MockDataStore): Classes to test the sorting of the
6003            data stores for writing.
6004    
6005            * test/runtests.py: Add CVS keywords
6006    
6007    2003-06-20  Jonathan Coles   <[email protected]>
6008    
6009            * test/test_session.py
6010            (UnreferencedTablesTests.test_unreferenced_tables_with_joins):
6011            Use the cultural_landmark-point.dbf file for the store so that
6012            the table rows and shape count match.
6013    
6014    2003-06-20  Jonathan Coles   <[email protected]>
6015    
6016            * Thuban/Model/data.py (DerivedShapeStore.__init__): Raise
6017            an exception if the number of shapes is different from the
6018            number of rows in the table. Address RTbug #1933.
6019    
6020            * test/test_layer.py (TestLayer.test_derived_store): Add
6021            a test for the new exception in DerivedShapeStore.__init__.
6022    
6023            * test/support.py (FloatTestCase): Removed since there is
6024            already FloatComparisonMixin. Fixes RTbug #1954.
6025            (FloatComparisonMixin.assertFloatEqual): Include test for
6026            infinity that was part of FloatTestCase.
6027    
6028            * test/test_range.py (RangeTest): Inherit from
6029            support.FloatComparisonMixin now that we don't have
6030            support.FloatTestCase.
6031    
6032    2003-06-20  Bernhard Herzog  <[email protected]>
6033    
6034            * test/test_save.py (SaxEventLister, sax_eventlist): Removed. Use
6035            the implementation in xmlsupport instead.
6036            (SaveSessionTest.compare_xml): sax_eventlist is now in xmlsupport
6037    
6038            * test/test_proj.py: Import sax_eventlist from xmlsupport instead
6039            of test_save
6040    
6041    2003-06-20  Bernhard Herzog  <[email protected]>
6042    
6043            * test/test_load.py (LoadSessionTest.check_format): New helper
6044            method to make sure the test files we load might have been written
6045            by the current thuban version.
6046            (ClassificationTest.TestLayers, TestSingleLayer.test)
6047            (TestLayerVisibility.test, TestClassification.test)
6048            (TestLabels.test, TestLayerProjection.test, TestRasterLayer.test):
6049            Add check_format() calls and fix the thuban data to match the data
6050            that would be written by saving the session loaded from it.
6051    
6052            * test/xmlsupport.py (SaxEventLister, sax_eventlist): Copies of
6053            the same class and function in test_save.
6054    
6055            * test/test_xmlsupport.py (TestEventList): New. test cases for
6056            sax_eventlist
6057    
6058    2003-06-20  Bernhard Herzog  <[email protected]>
6059    
6060            * Resources/XML/thuban.dtd: Add comment about which versions of
6061            Thuban are covered by this DTD
6062            (map): Fix content model for layers and raster layers. There can
6063            be any number or layers and raster layers in any order.
6064    
6065    2003-06-20  Jonathan Coles   <[email protected]>
6066    
6067            This is mainly about fixing RTbug #1949.
6068    
6069            * Thuban/Model/classification.py: Remove "from __future__"
6070            import statement since python 2.2 is the earliest supported
6071            version.
6072    
6073            * Thuban/Model/proj.py (Projection.GetProjectedUnits): New.
6074            Currently returns PROJ_UNITS_METERS or PROJ_UNITS_DEGREES
6075            depending on the units this projection *forwards* into.
6076    
6077            * Thuban/Model/save.py (SessionSaver.write_classification):
6078            Remove unnecessary use of lambdas and nested functions.
6079    
6080            * Thuban/UI/legend.py (ScaleBarBitmap.__SetScale): Do scale
6081            adjustment here if the map projection uses degrees.
6082    
6083            * Thuban/UI/scalebar.py (ScaleBar.DrawScaleBar): Remove
6084            scale adjust code since it is now done before calling
6085            this method. Don't do anything if the map projection
6086            is None.
6087    
6088    2003-06-19  Bernhard Herzog  <[email protected]>
6089    
6090            Move version specific load tests to their own file.
6091    
6092            * test/test_load.py: Expand the doc-string to explain a bit how to
6093            handle file format changes.
6094            (TestClassification.test): Update the docstring as this test is
6095            not about Thuban 0.2 anymore.
6096    
6097            * test/test_load_0_2.py: New file with the load tests for thuban
6098            files created with Thuban 0.2 and earlier.
6099    
6100    2003-06-19  Bernhard Herzog  <[email protected]>
6101    
6102            Add XML validation to some of the tests. Validation will only be
6103            done if pyRXP is installed (http://reportlab.com/xml/pyrxp.html).
6104            To make the DTD available to the test cases it's moved into
6105            Resources/XML
6106    
6107            * Resources/XML/thuban.dtd: New. This is now the real Thuban DTD
6108            for versions up to and including 0.2. Two slight changes: added an
6109            encoding specification and fixed the comment which refered to
6110            GRASS, not Thuban
6111    
6112            * test/xmlsupport.py: New support module for tests involving XML.
6113            Currently there's a mix-in class for XML validation.
6114    
6115            * test/test_xmlsupport.py: New. Tests for the xmlsupport module
6116    
6117            * test/test_save.py (SaveSessionTest): Derive from ValidationTest
6118            so that we can validate the
6119            (SaveSessionTest.testEmptySession)
6120            (SaveSessionTest.testSingleLayer)
6121            (SaveSessionTest.testSingleLayer)
6122            (SaveSessionTest.testLayerProjection)
6123            (SaveSessionTest.testRasterLayer)
6124            (SaveSessionTest.testClassifiedLayer): Validate the generated XML
6125    
6126            * test/runtests.py (main): Call print_additional_summary instead
6127            of print_garbage_information
6128    
6129            * test/support.py (resource_dir): New function to return the
6130            "Resource" subdirectory
6131            (print_additional_summary): New function to combine several
6132            summary functions
6133            (run_tests): Use print_additional_summary instead of calling
6134            print_garbage_information directly
6135    
6136    2003-06-19  Bernhard Herzog  <[email protected]>
6137    
6138            * Doc/thuban.dtd (classification): Correct the content model of
6139            the classification element.
6140            (projection): Add the "name" attribute
6141    
6142    2003-06-19  Frank Koormann   <[email protected]>
6143    
6144            MERGE from the greater-ms3 branch.
6145    
6146            * Thuban/UI/scalebar.py (ScaleBar.DrawScaleBar): Apply conversion to
6147            scale if projection is latlong to get better estimate.
6148    
6149            Fix problem of hidden properties dialog under windows after double
6150            click on layer tree:
6151            The tree control always gets an Expanded / Collapsed event after
6152            the ItemActivated  on double click, which raises the main window again.
6153            We add a second ItemActivated event to the queue, which simply
6154            raises the already displayed window.
6155    
6156            * Thuban/UI/legend.py (LegendTree.__init__): Instance variable
6157            raiseProperties initialized to prevent endless loops
6158            (LegendTree._OnItemActivated): Depending on self.raiseProperties
6159            simply raise the properties or open the dialog and issue a second
6160            event.
6161    
6162    2003-06-18  Jonathan Coles   <[email protected]>
6163    
6164            * setup.py: Fix a few problems that occured under Windows.
6165    
6166    2003-06-18  Jonathan Coles   <[email protected]>
6167    
6168            When Thuban loaded the map was redrawn twice because the
6169            legend was being opened after the mainwindow was created
6170            and not during its creation. This meant the map was drawn
6171            initially and then had to be redrawn when the legend
6172            caused the display to change. Now the legend is opened
6173            in the mainwindow constructor which resolves this issue.
6174    
6175            Also, although we were checking for the existence of
6176            gdal and gdalwarp modules, the gdalwarp extension was
6177            still being compiled (which may fail if the system doesn't
6178            have gdal installed). the build_ext command to setup.py
6179            now accepts the flags --with-gdal and --without-gdal.
6180            If --without-gdal is specified setup.py will try to
6181            use the gdal parameters specified by gdal-config. Under
6182            windows, those parameters have to be set in setup.py
6183            as with proj4 an wxWindows.
6184    
6185            * setup.py: Use a list instead of seperate variables for
6186            extension parameters so we can create a generic function
6187            that runs an appropriate *-config script.
6188            (run_cs_script): Renamed from run_wx_script and modified
6189            to accept a second argument which is a list of lists to
6190            be filled in by the values returned from running the command.
6191            (thuban_build_ext): New. Extends the build_ext command and
6192            provides the options --with-gdal/--without-gdal which then
6193            optionally includes the gdalwarp extension.
6194    
6195            * Thuban/Model/resource.py: First check if we can import
6196            the gdalwarp Thuban extension before checking for gdal.
6197            Also added some comments.
6198            
6199            * Thuban/UI/legend.py (ScaleBarBitmap.__SetScale): Check if
6200            the map is None which may be the case if none has been loaded
6201            yet.
6202    
6203            * Thuban/UI/main.py (main): Remove call to ShowLegend.
6204    
6205            * Thuban/UI/mainwindow.py (MainWindow.__init__): Call ShowLegend().
6206    
6207            * Thuban/UI/renderer.py: Check for gdal support before importing
6208            gdalwarp.
6209            (MapRenderer.render_map): Only try to optimize if we have gdal
6210            support otherwise nothing will get drawn.
6211    
6212            * Thuban/UI/view.py (MapCanvas.FitMapToWindow): This may be called
6213            during startup before a map has been created. Check if map is None
6214            before using it and do nothing if it is.
6215    
6216    2003-06-17  Jonathan Coles   <[email protected]>
6217    
6218            Fix the problem with raster layers under Windows that caused
6219            Thuban to crash. The view should respond to layer projection
6220            changed events to update the display. Changes to a projection
6221            should not cause the map to be set to full extent.
6222            
6223            * Thuban/UI/view.py (MapCanvas.__init__): New instance variable
6224            current_map_proj to remember the current map projection so that
6225            when the projection changes we know what the previous projection
6226            was.
6227            (MapCanvas.SetMap): Unsubscribe and subscribe to
6228            LAYER_PROJECTION_CHANGED events.
6229            (MapCanvas.projection_changed): Split into two methods that respond
6230            to map and layer projection changes.
6231            (MapCanvas.map_projection_changed): New. Takes the current view and
6232            projects it using the new projection. This does not cause the
6233            map to be redrawn at full extent.
6234            (MapCanvas.layer_projection_changed): New. Cause a redraw which
6235            will draw each layer in its new projection.
6236            
6237            * extensions/thuban/bmpdataset.cpp (BMPDataset::Open): Call
6238            VSIFClose() not VSIFCloseL() to close the file. Fixes a crash
6239            under Windows.
6240            
6241            * extensions/thuban/gdalwarp.cpp (MFILENAME): Padding should be
6242            to twice sizeof(void*) because there are two digits for each
6243            hex byte.
6244    
6245    2003-06-16  Bernhard Herzog  <[email protected]>
6246    
6247            Update to the layer interface: Direct access to the table,
6248            shapetable, shapefile and filename attributes is now actively
6249            deprecated by issuing deprecation warnings for all places where
6250            this happens.
6251    
6252            * Thuban/Model/layer.py (Layer.__getattr__): New. Implement access
6253            to the instance variables table, shapetable, shapefile and
6254            filename via __getattr__ so that we can issue a deprecation
6255            warning.
6256            (Layer.SetShapeStore): Don't set the deprecated instance variables
6257            any more
6258            (Layer.SetShapeStore): Don't use deprecated layer instance
6259            variables
6260            (Layer.Destroy): No need to explicitly remove the instance
6261            variables any more
6262            (Layer.GetFieldType, Layer.Shape): Don't use deprecated layer
6263            instance variables
6264    
6265            * Thuban/UI/classgen.py (ClassGenDialog.__init__)
6266            (GenUniformPanel._OnRetrieve, GenUniquePanel._OnRetrieve)
6267            (GenQuantilesPanel.GetList, GenQuantilesPanel.OnRetrieve): Don't
6268            use deprecated layer instance variables
6269    
6270            * Thuban/UI/classifier.py (Classifier.__init__): Don't use
6271            deprecated layer instance variables
6272    
6273            * Thuban/UI/identifyview.py (IdentifyListCtrl.selected_shape)
6274            (IdentifyGridCtrl.selected_shape): Don't set the deprecated layer
6275            instance variables
6276    
6277            * Thuban/UI/tableview.py (LayerTableGrid.select_shapes): Don't use
6278            deprecated layer instance variables
6279    
6280            * Thuban/UI/mainwindow.py (MainWindow.LayerShowTable): Don't use
6281            deprecated layer instance variables
6282    
6283            * Thuban/Model/save.py (SessionSaver.write_layer): Don't use
6284            deprecated layer instance variables
6285    
6286            * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer)
6287            (MapRenderer.polygon_render_param): Don't use deprecated layer instance
6288            variables
6289    
6290            * test/runtests.py (main): Turn Thuban's deprecation warnings into
6291            errors so that they're cought by the tests
6292    
6293            * test/test_load.py (TestSingleLayer.test): Don't use deprecated
6294            layer instance variables
6295    
6296    2003-06-16  Jonathan Coles   <[email protected]>
6297    
6298            Fix a problem under Windows whereby if the user double-clicks on a
6299            layer in the legend that tree item will expand or collapse as well
6300            as open the layer properties dialog. The state of the tree item
6301            should not be affected.
6302    
6303            * Thuban/UI/legend.py (LegendTree.__init__): Add instance variable
6304            preventExpandCollapse and subscribe to expanding and collapsing
6305            events.
6306            (LegendTree.OnItemExpandCollapse): New. Responds to expanding and
6307            collapsing events and will veto the event if it has been triggered
6308            by the user double clicking on a layer.
6309            (LegendTree._OnItemActivated): Set preventExpandCollapse to indicate
6310            that an expanding/collapsing event should be vetoed.
6311    
6312    2003-06-13  Bernhard Herzog  <[email protected]>
6313    
6314            * Thuban/UI/classifier.py (Classifier.OnClose)
6315            (Classifier.map_layers_removed)
6316            (Classifier.layer_shapestore_replaced): Unsubscribe the messages
6317            in OnClose and not in map_layers_removed or
6318            layer_shapestore_replaced to make sure it always happens when the
6319            dialog is closed
6320    
6321    2003-06-13  Jonathan Coles   <[email protected]>
6322    
6323            This puts back a fix for Windows where a panel is needed so that
6324            the background of the table view appears correctly.
6325    
6326            * Thuban/UI/tableview.py (TableFrame.__init__): Add a panel
6327            object that can be used by derived classes to place any
6328            controls (including the grid) onto.
6329            (QueryTableFrame.__init__): Use the panel as the parent window
6330            for all the controls. Reparent the grid so that the panel is
6331            the parent. Call UpdateStatusText() to correctly initialize
6332            the status bar.
6333    
6334    2003-06-13  Jonathan Coles   <[email protected]>
6335    
6336            * Thuban/UI/dialogs.py (ThubanFrame): New: a class that inherits
6337            from wxFrame (as opposed to wxDialog like the other classes)
6338            but otherwise behaves like the other classes. This is needed
6339            for the TableView which isn't really a dialog and needs to
6340            have a status bar and control buttons.
6341    
6342            * Thuban/UI/tableview.py (TableGrid.__init__): Create an
6343            instance variable to keep track of how many rows are selected.
6344            Subscribe once to the the events we are interested in.
6345            (ThubanGrid.OnRangeSelect): Only handle event if event handling
6346            hasn't been turned off.
6347            (ThubanGrid.OnSelectCell): Only handle event if event handling
6348            hasn't been turned off.
6349            (ThubanGrid.ToggleEventListeners): Rather than subscribe None
6350            as an event listener (which changes the event handler stack)
6351            simply set an instance variable to False. This is checked in
6352            the event handlers.
6353            (ThubanGrid.GetNumberSelected): Return the number of currently
6354            selected rows.
6355            (TableFrame): Inherit from ThubanFrame so we can have a
6356            status bar and control buttons.
6357            (QueryTableFrame.__init__): Create a status bar. Fixes RTbug #1942.
6358            Explicitly set which items are selected in the operator choice and
6359            action choice so there is always a valid selection. Fixes RTbug #1941.
6360            Subscribe to grid cell selection events so we can update the
6361            status bar.
6362            (QueryTableFrame.UpdateStatusText): Update the status bar with
6363            how many rows are in the grid, how many columns, and how many
6364            rows are selected.
6365            (QueryTableFrame.OnGridSelectRange, QueryTableFrame.OnGridSelectCell):
6366            Call UpdateStatusText when cells are (de)selected.
6367            (QueryTableFrame.OnQuery): Use the string value in the value
6368            combo if either the selected item index is 0 or if the string
6369            cannot be found in the predefined list (this happens if the
6370            user changes the text). Fixes RTbug #1940.
6371            Only turn off the grid event listeners if there a query comes
6372            back with a none empty list of ids. in the case that the list
6373            is empty this causes a grid.ClearSelection() call to actually
6374            clear the grid selection which causes the selected items in
6375            the map to be deselected. Fixes RTbug #1939.
6376    
6377            * test/test_save.py (XMLWriterTest.Encode): Check return values.
6378            Fixes RTbug #1851.
6379    
6380    2003-06-13  Bernhard Herzog  <[email protected]>
6381    
6382            * Thuban/UI/identifyview.py (IdentifyView.__init__): Call
6383            self.selected_shape with the current selection to make sure the
6384            contents of the dialog are up to date when it's shown for the
6385            first time.
6386            The dialog used to work without this by luck. The recent fix to
6387            the connector module 'broke' a 'feature' the identify view was
6388            relying on, i.e that subscribing to a message in response to
6389            receiving a message of that type would mean that the new
6390            subscriber would also be called for the same message.
6391            
6392    2003-06-12  Jonathan Coles   <[email protected]>
6393    
6394            * extensions/thuban/gdalwarp.cpp: Removed debug printing as
6395            the image is rendered. Fixes RTbug #1937.
6396    
6397    2003-06-12  Jonathan Coles   <[email protected]>
6398    
6399            * Thuban/Lib/fileutil.py: As is done under Windows, create the
6400            user directory if it doesn't exist on a posix system.
6401            Fixes RTbug #1815.
6402    
6403            * Thuban/Model/resource.py (get_user_proj_files): Moved the
6404            called to get_application_dir here, so that the directory
6405            will only be called if this method is invoked.
6406    
6407            * Thuban/UI/projdialog.py (ProjFrame.__DoOnProjAvail): Clear
6408            the projfilepath if no projection is selected.
6409    
6410    2003-06-12  Jonathan Coles   <[email protected]>
6411    
6412            * Thuban/UI/legend.py (ScaleBarBitmap.__SetScale): Don't draw
6413            the scalebar if the current map has no projection set.
6414    
6415            * Thuban/UI/projdialog.py (ProjFrame.__DoOnProjAvail): Set the
6416            projfilepath label to just the basename of the projection file
6417            rather than include the entire path.
6418    
6419            * Thuban/Model/resource.py: Fix missed proj functions that
6420            needed to be renamed.
6421    
6422    2003-06-12  Jonathan Coles   <[email protected]>
6423    
6424            * Thuban/Model/classification.py: Removed assert statements that
6425            tested if the variable was an instance of Color.
6426    
6427            * Thuban/Model/color.py (Color): Remove commented code that isn't
6428            used.
6429            (Transparent): Renamed from NoColor. Doesn't inherit from Color.
6430            Fixes RTbug #1835.
6431            (Transparent.__eq__, Transparent.__ne, Transparent.__repr): New.
6432            Needed now that the class doesn't inherit from Color.
6433    
6434    2003-06-12  Jonathan Coles   <[email protected]>
6435    
6436            * test/test_save.py (XMLWriterTest.testEncode): Explicitly
6437            check unicode strings.
6438    
6439            * test/test_layer.py: Check for existence of gdal.
6440    
6441    2003-06-12  Jonathan Coles   <[email protected]>
6442        
6443            * Thuban/Model/xmlreader.py: New. Contains the XMLReader class
6444            that was in load.py
6445    
6446            * Thuban/Model/xmlwriter.py: New. Contains the XMLWriter class
6447            that was in save.py
6448    
6449    2003-06-12  Jonathan Coles   <[email protected]>
6450    
6451            This is largely a collection of bug fixes. We also handle the
6452            case where gdal is not on the system. The XMLReader and XMLWriter
6453            classes were moved into there own files to resolve some circular
6454            import references and because they shouldn't really be in the
6455            file that is dediciated to reading/writing session files since
6456            they are also used elsewhere.
6457    
6458            * Thuban/Model/classgen.py: Renamed functions to follow the
6459            function_names_with_underscores style. Fixes RTbug #1903.
6460            (calculate_quantiles): Raise ValueError if 'percents' is invalid.
6461    
6462            * Thuban/Model/layer.py: Import gdal only if it available.
6463            (RasterLayer): Handle the case where the gdal library is unavailable.
6464            Addresses RTbug #1877.
6465    
6466            * Thuban/Model/load.py (XMLReader): Moved into seperate file
6467            xmlreader.py.
6468    
6469    2003-06-12  Jonathan Coles   <[email protected]>
6470    
6471            This is largely a collection of bug fixes. We also handle the
6472            case where gdal is not on the system. The XMLReader and XMLWriter
6473            classes were moved into there own files to resolve some circular
6474            import references and because they shouldn't really be in the
6475            file that is dediciated to reading/writing session files since
6476            they are also used elsewhere.
6477    
6478            * Thuban/Model/classgen.py: Renamed functions to follow the
6479            function_names_with_underscores style. Fixes RTbug #1903.
6480            (calculate_quantiles): Raise ValueError if 'percents' is invalid.
6481    
6482            * Thuban/Model/layer.py: Import gdal only if it available.
6483            (RasterLayer): Handle the case where the gdal library is unavailable.
6484            Addresses RTbug #1877.
6485    
6486            * Thuban/Model/load.py (XMLReader): Moved into seperate file
6487            xmlreader.py.
6488    
6489            * Thuban/Model/save.py (escape, XMLWriter): Moved into seperate
6490            file xmlwriter.py.
6491    
6492            * Thuban/Model/resource.py: Renamed functions to following the
6493            function_names_with_underscores style.
6494            (has_gdal_support): New function that returns true if the gdal
6495            library is available. Addresses RTbug #1877.
6496    
6497            * Thuban/UI/application.py (ThubanApplication.OpenSession):
6498            Display a message box if the gdal library is not available, but
6499            only if there are any layers that would use it. Addresses RTbug #1877.
6500    
6501            * Thuban/UI/classgen.py: Use renamed projection resource functions.
6502            (GenUniformPanel.__CalcStepping): Fix a slight discrepency
6503            when using integers versus floats.
6504    
6505            * Thuban/UI/mainwindow.py (_has_gdal_support): New. Used to
6506            determine if the "Add Image Layer" menu option should be
6507            greyed out or not. Addresses RTbug #1877.
6508    
6509            * Thuban/UI/projdialog.py: Use renamed projection resource functions.
6510    
6511            * Thuban/UI/renderer.py (MapRenderer.render_map): Only try to
6512            optimize if a raster layer is visible. Fixes RTbug #1931.
6513            Only draw the raster layer if the gdal library is available.
6514            Addresses RTbug #1877.
6515    
6516            * test/test_classgen.py: Add tests for generate_singletons,
6517            generate_uniform_distribution, generate_quantiles. Fixes RTbug #1903.
6518            (test_calculate_quantiles): Fix some tests to catch the new
6519            ValueError that is raised.
6520    
6521            * test/test_proj.py: Use renamed projection resource functions.
6522    
6523            * test/test_save.py (SaveSessionTest.testClassifiedLayer): New
6524            test for saving classified layers. Fixes RTbug #1902.
6525            (XMLWriterTest): New. Tests the XMLWriter class. Fixes RTbug #1851.
6526    
6527    2003-06-12  Jan-Oliver Wagner <[email protected]>
6528    
6529            Fix for http://intevation.de/rt/webrt?serial_num=1900.
6530    
6531            * Thuban/UI/multiplechoicedialog.py: New. A multiple choice dialog.
6532    
6533            * Thuban/UI/mainwindow.py: import wxMultipleChoiceDialog from
6534            multiplechoicedialog.py rather than from the wxPython library.
6535    
6536    2003-06-11  Frank Koormann  <[email protected]>
6537    
6538            * Thuban/Lib/fileutil.py (get_application_dir): Minor stability
6539            update.
6540    
6541    2003-06-11  Frank Koormann  <[email protected]>
6542    
6543            * Thuban/Lib/fileutil.py (get_application_dir): New function to
6544            determine the absolute .thuban/thuban directory under
6545            "posix" (os.expanduser) and "nt" (read AppData registry key).
6546    
6547            * Thuban/Model/resource.py: Use get_application_dir
6548    
6549            * Thuban/UI/application.py (ThubanApplication.read_startup_files):
6550            Use get_application_dir.
6551    
6552    2003-06-10  Bernhard Herzog  <[email protected]>
6553    
6554            * Thuban/UI/tableview.py (LayerTableFrame.__init__): Subscribe to
6555            the messages MAP_LAYERS_REMOVED messages
6556            (LayerTableFrame.OnClose): Unsubscribe from it.
6557            (LayerTableFrame.map_layers_removed): New. Receiver for
6558            MAP_LAYERS_REMOVED. Close the dialog when the layer whose the
6559            dialog is showing is removed.
6560    
6561    2003-06-10  Bernhard Herzog  <[email protected]>
6562    
6563            * Thuban/Lib/connector.py (Connector.Issue): Iterate over a copy
6564            of the receivers list so that unsubscribing in a receiver doesn't
6565            modify it while iterating over it.
6566    
6567            * test/test_connector.py
6568            (ConnectorTest.test_disconnect_in_receiver): New. Test whether
6569            unsubscribing in a receiver works correctly. See docstring for
6570            details
6571    
6572    2003-06-10  Bernhard Herzog  <[email protected]>
6573    
6574            * Thuban/Model/messages.py (LAYER_SHAPESTORE_REPLACED): New
6575            message.
6576    
6577            * Thuban/Model/layer.py (Layer.SetShapeStore): Send
6578            LAYER_SHAPESTORE_REPLACED when the shapestore changes. A
6579            LAYER_CHANGED will still be sent if the classification changes.
6580    
6581            * Thuban/UI/classifier.py (Classifier.__init__): Add the map as
6582            parameter so we can subscribe to some of its messages
6583            (Classifier.__init__): Subscribe to the map's MAP_LAYERS_REMOVED
6584            and the layer's LAYER_SHAPESTORE_REPLACED
6585            (Classifier.unsubscribe_messages): New. Unsubscribe from message
6586            subscribed to in __init__
6587            (Classifier.map_layers_removed)
6588            (Classifier.layer_shapestore_replaced): receivers for the messages
6589            subscribed to in __init__. Unsubscribe and close the dialog
6590    
6591            * Thuban/UI/mainwindow.py (MainWindow.OpenLayerProperties): Pass
6592            the map to the Classifier dialog
6593    
6594            * test/test_layer.py (SetShapeStoreTests): Derive from
6595            SubscriberMixin as well so we can test messages
6596            (SetShapeStoreTests.setUp): Subscribe to some of the layer's
6597            messages
6598            (SetShapeStoreTests.tearDown): Clear the messages again
6599            (SetShapeStoreTests.test_sanity): Expand the doc-string and check
6600            for the modified flag too
6601            (SetShapeStoreTests.test_set_shape_store_modified_flag): New test
6602            to check whether SetShapeStore sets the modified flag
6603            (SetShapeStoreTests.test_set_shape_store_different_field_name)
6604            (SetShapeStoreTests.test_set_shape_store_same_field)
6605            (SetShapeStoreTests.test_set_shape_store_same_field_different_type):
6606            Add tests for the messages. This checks both the new
6607            LAYER_SHAPESTORE_REPLACED and the older LAYER_CHANGED
6608    
6609    2003-06-06  Jan-Oliver Wagner <[email protected]>
6610    
6611            * Thuban/UI/mainwindow.py: Improved and partly added help texts for
6612            the menu items.
6613    
6614    2003-06-05  Frank Koormann  <[email protected]>
6615    
6616            * Thuban/UI/identifyview.py (IdentifyView.__init__):
6617            Layout reimplemented without panel. Make life easier to fit the list
6618            in the dialog.
6619    
6620    2003-06-05  Frank Koormann  <[email protected]>
6621    
6622            * Thuban/UI/projdialog.py (ProjFrame.__init__): Fill the projchoice
6623            once on initialisation (Former implementation resulted in multiple
6624            entries for each projection).
6625            (ProjFrame.__FillAvailList): selectProj as second optional parameter,
6626            if set, select the projection found under the specified name. This
6627            overwrites any other selection estimate.
6628            Removed projchoice filling from this method.
6629            (ProjFrame._OnSave, ProjFrame._OnAddToList):
6630            Updated call of ProjFrame.__FillAvailList
6631            (LCCPanel._DoLayout): Moved parameter controls in more common order.
6632    
6633            * Resources/Projections/defaults.proj: Extended defaults representing
6634            various common European projections.
6635    
6636    2003-06-05  Frank Koormann  <[email protected]>
6637    
6638            * Thuban/UI/identifyview.py (IdentifyView.__init__):
6639            Use ListCtrl instead of GridCtrl
6640    
6641            * Thuban/Model/resource.py:
6642            Guess location of .thuban directory from tempdir parent directory.
6643    
6644            * Thuban/UI/application.py (ThubanApplication.read_startup_files):
6645            Guess location of .thuban directory from tempdir parent directory.
6646    
6647    2003-06-04  Bernhard Herzog  <[email protected]>
6648    
6649            Do not cache the values returned by the tree widget's
6650            GetFirstChild and GetNextChild methods because it led to lots of
6651            segfaults. The new way requires more brute force but is more
6652            reliable.
6653    
6654            * Thuban/UI/legend.py (LegendTree.__init__): Remove instance
6655            variable layer2id
6656            (LegendTree.find_layer): New method to do with brute force what
6657            layer2id tried to accomplish
6658            (LegendTree._OnMsgLayerChanged)
6659            (LegendTree._OnMsgLayerTitleChanged, LegendTree.__ShowHideLayer):
6660            Use find_layer instead of layer2id
6661            (LegendTree.__RemoveLayer, LegendTree.__AddLayer): No need to
6662            update layer2id anymore
6663            (LegendTree._OnMsgMapLayersRemoved)
6664            (LegendTree._OnMsgMapLayersAdded): Get by without layer2id.
6665    
6666    2003-06-03  Thomas Koester  <[email protected]>
6667    
6668            * Thuban/Model/classgen.py (GenQuantiles0): New function.
6669    
6670    2003-06-02  Bernhard Herzog  <[email protected]>
6671    
6672            * Thuban/UI/mainwindow.py (layer_rename command, table_rename command):
6673            New commands.
6674            (main_menu): Add the new commands.
6675            (MainWindow.TableRename): New. Implementation of the table_rename
6676            command.
6677            (MainWindow.RenameLayer): New. Implementation of the layer_rename
6678            command.
6679    
6680            * Thuban/Model/session.py (Session.AddTable): call self.changed to
6681            set the modified flag
6682    
6683            * test/test_session.py (TestSessionSimple.test_add_table): Test
6684            whether the modified flag is set properly
6685    
6686            * Thuban/Model/base.py (TitledObject.SetTitle): Call changed
6687            instead of issue so that the modified flags get updated.
6688    
6689            * test/test_base.py (SomeTitledObject): Derive from Modifiable
6690            instead of Publisher to reflect reality better and to accomodate
6691            the fact that SetTitle now calls changed instead of issue
6692    
6693    2003-06-02  Bernhard Herzog  <[email protected]>
6694    
6695            * Thuban/UI/classgen.py (GenQuantilesPanel.GetList): Resource
6696            acquisition has to happen before the try in a try-finally.
6697    
6698    2003-06-02  Bernhard Herzog  <[email protected]>
6699    
6700            * Thuban/UI/legend.py (LegendTree._OnMsgMapLayersRemoved): It's
6701            possible that a layer is removed that is not currently selected in
6702            the legend so don't check for this.
6703    
6704    2003-05-30  Bernhard Herzog  <[email protected]>
6705    
6706            * Thuban/Model/layer.py (Layer.Destroy): Set all instance
6707            variables to None that have direct or indirect references to
6708            shapefiles or dbf files to make sure that they do go away and the
6709            files are closed.
6710    
6711    2003-05-30  Bernhard Herzog  <[email protected]>
6712    
6713            * Thuban/UI/legend.py (LegendTree.GetRootItem): Reset
6714            availImgListIndices when a new image list is created
6715            
6716    2003-05-30  Bernhard Herzog  <[email protected]>
6717    
6718            * Thuban/UI/legend.py (LegendTree.__init__): New instance variable
6719            changing_selection to indicate whether the LegendTree code itself
6720            is currently changing the selection
6721            (LegendTree.normalize_selection): New method to normalize the
6722            selection by selecting the layer item even if the user clicked on
6723            the classification.
6724            (LegendTree._OnSelChanged): normalize the selection. This works
6725            around a bug in wx which doesn't keep track of the selection
6726            properly when subtrees are deleted.
6727    
6728    2003-05-30  Bernhard Herzog  <[email protected]>
6729    
6730            * Thuban/UI/view.py (MapCanvas.set_view_transform): Limit the
6731            maximum and minimum scale factors.
6732    
6733            * test/test_classgen.py (ClassGenTest.test): Update to reflect the
6734            changes in classgen.py
6735    
6736    2003-05-30  Jonathan Coles   <[email protected]>
6737    
6738            * Thuban/Model/classgen.py: Remove ClassGenerator class but make
6739            all the methods functions. Fixes RTBug #1903.
6740    
6741            * Thuban/Model/map.py (Map.TopLayer, Map.BottomLayer): Renamed
6742            to MoveLayerToTop and MoveLayerToBottom respectively. Fixes
6743            RTBug #1907.
6744    
6745            * Thuban/UI/classgen.py: Use classgen functions that were part
6746            of the ClassGenerator class. Put try/finally blocks around
6747            code that uses wxBeginBusyCursor()/wxEndBusyCursor(). Fixes
6748            RTBug #1904.
6749    
6750            * Thuban/UI/classifier.py: Remove unused import of ClassGenerator.
6751    
6752            * Thuban/UI/legend.py: The legend was cleared and repopulated any
6753            time something changed which caused some state to be lost such
6754            as which children were expanded or collapsed. Fixes RTBug #1901.
6755            (LegendTree._OnMsgMapLayersAdded): Add only new layers.
6756            (LegendTree.__OnMsgMapLayersRemoved): Remove layers that exist in
6757            the legend but not in the map.
6758            (LegendTree.__FillTree): Move main functionality out into smaller
6759            methods that can be used by other methods.
6760            (LegendTree.__FillTreeLayer): Reuse old slots in the image list
6761            if they are available.
6762            (LegendTree.DeleteAllItems): Renamed from __DeleteAllItems so
6763            that we override the wxTreeCtrl method. Iterate over children
6764            and call __RemoveLayer.
6765            (LegendTree.__AddLayer): New. Add a new layer to the legend.
6766            (LegendTree.__RemoveLayer): Remove a layer from the legend.
6767            (LegendTree.DeleteChildren): New, overrides wxTreeCtrl method.
6768            Should only be called with the id of a layer branch.
6769            (LegendTree.GetRootItem): New, overrides wxTreeCtrl method.
6770            Returns the root item or creates one if necessary.
6771    
6772            * Thuban/UI/renderer.py (MapRenderer.draw_raster_layer): Call
6773            ProjectRasterFile with tuple arguments instead of strings.
6774    
6775            * Thuban/UI/tableview.py (QueryTableFrame.OnQuery): Wrap code
6776            with try/finally. Fixes RTBug #1904.
6777    
6778            * Thuban/UI/view.py (MapCanvas.OnPaint): Wrap code
6779            with try/finally. Fixes RTBug #1904.
6780            (MapCanvas.FitSelectedToWindow): If a single point is selected
6781            simply center it on the display. Fixes RTBug #1849.
6782    
6783            * extensions/thuban/gdalwarp.cpp: Removed code that allowed gdalwarp
6784            to be compiled as a standalone app. Now the code can only be
6785            called from Python which simplifies the parameter passing.
6786            (ProjectRasterFile): Handle Python arguments. Remove code that
6787            checks for a destination dataset. Add more clean up code.
6788    
6789            * test/test_map.py (TestMapWithContents.test_raise_layer_top,
6790            TestMapWithContents.test_lower_layer_bottom):
6791            Test Map.MoveLayerToTop() and Map.MoveLayerToBottom() respectively.
6792            Fixes RTBug #1907.
6793    
6794            * Thuban/UI/mainwindow.py (MainWindow.ToggleLegend): Apply a full
6795            extent to the map when the legend is toggled. Fixes RTBug #1881.
6796    
6797    2003-05-29  Jan-Oliver Wagner <[email protected]>
6798    
6799            * Thuban/UI/tableview.py (LayerTableFrame.OnClose): Bug-fix: Now
6800            unsubscribes all that is subcribed in __init__.
6801    
6802    2003-05-28  Bernhard Herzog  <[email protected]>
6803    
6804            * Thuban/UI/mainwindow.py (MainWindow.DuplicateLayer)
6805            (MainWindow.CanDuplicateLayer): New methods to implement the
6806            Layer/Duplicate command.
6807            (layer_duplicate command): New.
6808            (main_menu): Add layer_duplicate to the Layer menu.
6809    
6810    2003-05-28  Bernhard Herzog  <[email protected]>
6811    
6812            * Thuban/UI/tableview.py (NullRenderer.Draw): New. Our own
6813            renderer so that NULL/None values get displayed differently (by a
6814            gray rectangle).
6815            (TableGrid.__init__): Override the default renderers
6816    
6817    2003-05-28  Bernhard Herzog  <[email protected]>
6818    
6819            * Thuban/Model/layer.py (Layer.SetShapeStore): Set the
6820            classification to "None" if the type of the field has changed.
6821    
6822            * test/test_layer.py (SetShapeStoreTests): New. Class with a few
6823            test for the Layer.SetShapeStore method
6824    
6825    2003-05-28  Jan-Oliver Wagner <[email protected]>
6826    
6827            * Thuban/Model/layer.py (Layer.TreeInfo): Fixed a bug (a layer
6828            does not necessarily have a filename).
6829    
6830    2003-05-28  Jan-Oliver Wagner <[email protected]>
6831    
6832            * Thuban/UI/mainwindow.py (MainWindow.TableClose, MainWindow.TableShow):
6833            sort the selection list for the dialog.
6834    
6835    2003-05-28  Frank Koormann  <[email protected]>
6836    
6837            * extensions/thuban/wxproj.cpp
6838            (project_point): Removed cast to int for projected point coordinates.
6839            (shape_centroid): Return last point if all polygon vertices fall
6840            to one point.
6841    
6842    2003-05-28  Bernhard Herzog  <[email protected]>
6843    
6844            * Thuban/UI/mainwindow.py (_can_unjoin): Add doc-string and cope
6845            with layers that don't have shapestores, i.e. raster layers.
6846    
6847    2003-05-28  Bernhard Herzog  <[email protected]>
6848    
6849            * Thuban/Model/table.py (DBFTable.__init__): Omit the extension
6850            when determining the title from the filename.
6851    
6852            * test/test_dbf_table.py (TestDBFTable.test_title): Update to
6853            reflect changes in the way the title is derived from the filename
6854    
6855    2003-05-28  Frank Koormann  <[email protected]>
6856    
6857            * Thuban/UI/mainwindow.py (MainWindow.TableShow):
6858            Added wxDEFAULT_DIALOG_STYLE to show table dialog styles.
6859    
6860    2003-05-27  Bernhard Herzog  <[email protected]>
6861    
6862            * Thuban/UI/mainwindow.py (MainWindow.delegated_messages): Also
6863            delegate SelectedLayer.
6864            (MainWindow.LayerUnjoinTable): Implement.
6865            (_can_unjoin): New. Helper function for the sensitivity of the
6866            layer/unjoin command.
6867    
6868            * Thuban/Model/data.py (ShapefileStore.OrigShapeStore)
6869            (DerivedShapeStore.OrigShapeStore): New. Return the original
6870            shapestore. Used to figure out how to unjoin.
6871            (DerivedShapeStore.Shapefile): Fix a typo.
6872    
6873    2003-05-27  Bernhard Herzog  <[email protected]>
6874    
6875            * Thuban/UI/join.py (JoinDialog): Extend to handle layer joins as
6876            well
6877            (JoinDialog.__init__): Use the layer parameter and only build the
6878            left choice when a layer is given
6879            (JoinDialog.OnJoin): Handle layer joins as well
6880            (JoinDialog.OnLeftTable, JoinDialog.OnRightTable): Handle the case
6881            that the user selects the "Select..." item. The sensitivitly
6882            updating is now in update_sensitivity
6883            (JoinDialog.y): New method to refactor the sensitivity update of
6884            the join button into its own method.
6885    
6886            * Thuban/UI/mainwindow.py (MainWindow.LayerJoinTable): Implement.
6887    
6888    2003-05-27  Bernhard Herzog  <[email protected]>
6889    
6890            * Thuban/UI/mainwindow.py (table_close command): Make it sensitive
6891            iff there are unreferenced tables in the session
6892    
6893    2003-05-27  Bernhard Herzog  <[email protected]>
6894    
6895            * Thuban/Model/messages.py (TABLE_REMOVED): New message.
6896    
6897            * Thuban/Model/session.py (Session.UnreferencedTables): New method
6898            to return tables that are not referenced by other tables or shape
6899            stores and can be removed.
6900            (Session.RemoveTable): Issue a TABLE_REMOVED message after
6901            removing the table
6902    
6903            * Thuban/UI/mainwindow.py: Remove unused imports
6904            (MainWindow.TableClose): Implement.
6905    
6906            * Thuban/UI/tableview.py (TableFrame.__init__): Subscribe to some
6907            messages so that the frame will be automatically closed when a new
6908            session is opened or the table is removed.
6909            (TableFrame.OnClose): Unsubscribe the Subscriptions made in
6910            __init__
6911            (TableFrame.close_on_session_replaced)
6912            (TableFrame.close_on_table_removed): New. Subscribers that close
6913            the window
6914    
6915            * test/test_session.py (TestSessionMessages.test_remove_table)
6916            (TestSessionSimple.test_remove_table): Move the test to
6917            TestSessionSimple and add test for the TABLE_REMOVED message
6918            (TestSessionBase.setUp): Also subscribe to TABLE_REMOVED
6919            (TestSessionSimple.test_unreferenced_tables) New. Test for the
6920            UnreferencedTables method.
6921            (UnreferencedTablesTests): New. Class with some more sophisticated
6922            tests for UnreferencedTables.
6923    
6924    2003-05-27  Frank Koormann  <[email protected]>
6925    
6926            * Thuban/UI/tableview.py (QueryTableFrame.__init__): The "_S_election"
6927            display has some unwanted side effects. Removed again.
6928    
6929    2003-05-27  Frank Koormann  <[email protected]>
6930    
6931            * Resources/Bitmaps/legend_icon_layer.xpm: New, icon for legend.
6932    
6933            * Thuban/UI/legend.py (LegendTree.__FillTree): Use "legend_icon_layer"
6934    
6935    2003-05-27  Jan-Oliver Wagner <[email protected]>
6936    
6937            * test/test_menu.py (MenuTest.test): Added test for
6938            Menu.RemoveItem().
6939    
6940            * Thuban/UI/menu.py (Menu.RemoveItem): New. Remove an item from
6941            the menu.
6942    
6943    2003-05-27  Frank Koormann  <[email protected]>
6944            
6945            Nonmodal dialogs without parent (i.e. they can fall behind the main
6946            window)
6947    
6948            * Thuban/UI/mainwindow.py (MainWindow.OnClose): Explicitly destroy
6949            all dialogs in the dialogs dictionary and the canvas.
6950    
6951            * Thuban/UI/dialogs.py (NonModalNonParentDialog): New class, without
6952            parent, i.e. can fall behind other windows.
6953            (NonModalDialog.OnClose): Check is dialog is in mainwindow.dialog
6954            dictionary before removing it.
6955    
6956            * Thuban/UI/classifier.py: Dialog derived from NonModalNonParentDialog
6957    
6958            * Thuban/UI/projdialog.py: Dialog derived from NonModalNonParentDialog
6959            * Thuban/UI/tableview.py: Dialog derived from NonModalNonParentDialog
6960            * Thuban/UI/tree.py: Dialog derived from NonModalNonParentDialog
6961    
6962    2003-05-27  Bernhard Herzog  <[email protected]>
6963    
6964            * Thuban/UI/mainwindow.py (MainWindow.ShowTableView): New. Open a
6965            tableview dialog
6966            (MainWindow.TableShow): Use ShowTableView to open the dialogs.
6967            Also, don't use the table's titles as the dialog names. The titles
6968            aren't guaranteed to be unique.
6969            (MainWindow.TableOpen): Open a table view dialog after opening the
6970            table
6971    
6972    2003-05-27  Bernhard Herzog  <[email protected]>
6973    
6974            * Thuban/UI/mainwindow.py: Remove the Table/Hide menu item. Its
6975            effect can be achieved by simply closing the window showing the
6976            table.
6977            (MainWindow.TableHide): Removed.
6978            (main_menu): Removed "table_hide"
6979    
6980    2003-05-27  Frank Koormann  <[email protected]>
6981    
6982            Fix legend tree display problems under Win32
6983    
6984            * Thuban/UI/legend.py:  BMP_SIZE_W = 15
6985            (LegendTree.__FillTree): Display "legend_icon_map.xpm" with layer title.
6986            (LegendTree.__FillTreeLayer): Explicitely set SelectedImage.
6987    
6988            * Resources/Bitmaps/legend_icon_map.xpm: New icon for legend.
6989    
6990    2003-05-27  Jan-Oliver Wagner <[email protected]>
6991    
6992            * Thuban/UI/menu.py (Menu.InsertSeparator): Additional optional parameter
6993            'after' now allows to insert separators almost anywhere in the menu.
6994    
6995    2003-05-27  Frank Koormann  <[email protected]>
6996    
6997            * Thuban/UI/tableview.py (QueryTableFrame.__init__): Underline the
6998            "S" of selection box label to hint on hot key (Alt-S). Works under
6999            Win32 but is ignored under GTK.
7000    
7001    2003-05-26  Frank Koormann  <[email protected]>
7002    
7003            * Thuban/UI/projdialog.py (ProjFrame.__do_layout, ProjPanel._DoLayout):
7004            Center Choices.
7005    
7006    2003-05-26  Bernhard Herzog  <[email protected]>
7007    
7008            Remove the Precision methods again. They're too DBF specific to be
7009            part of the table interface and they're only used in table_to_dbf
7010            anyway.
7011            
7012            * Thuban/Model/transientdb.py (TransientTableBase.Width):Use a
7013            fixed precision of 12 for doubles.
7014            (TransientTableBase.Precision): Removed
7015            (AutoTransientTable.Width): Delegate to self.table.
7016    
7017            * Thuban/Model/table.py (DBFTable.Precision)
7018            (MemoryTable.Precision): Removed.
7019            (MemoryTable.Width): Use a fixed precision of 12 for doubles.
7020            (table_to_dbf): Use a fixed precision of 12 for floats unless the
7021            column object specifies something else.
7022    
7023            * test/test_dbf_table.py (TestTableToDBF.test_table_to_dbf): New.
7024            test for table_to_dbf
7025    
7026    2003-05-26  Bernhard Herzog  <[email protected]>
7027    
7028            * test/test_transientdb.py
7029            (TestTransientTable.run_iceland_political_tests): Fix a comment.
7030    
7031    2003-05-26  Bernhard Herzog  <[email protected]>
7032    
7033            * Thuban/UI/mainwindow.py (MainWindow.TableOpen): Real
7034            implementation. Mark parts of the file format strings for
7035            localization.
7036    
7037            * Thuban/Model/session.py (Session.OpenTableFile): New. Open a dbf
7038            file and add the table to the tables managed by the session
7039    
7040            * test/test_session.py (TestSessionSimple.test_open_table_file):
7041            New. test case for OpenTableFile
7042    
7043    2003-05-26  Jan-Oliver Wagner <[email protected]>
7044    
7045            * Thuban/UI/controls.py, Thuban/UI/identifyview.py, Thuban/UI/join.py,
7046            Thuban/UI/labeldialog.py, Thuban/UI/mainwindow.py,
7047            Thuban/UI/proj4dialog.py, Thuban/UI/tableview.py, Thuban/UI/view.py:
7048            Replace the true/false of wxWindows by True/False of Python 2.2.1.
7049    
7050    2003-05-26  Jan-Oliver Wagner <[email protected]>
7051    
7052            * Thuban/UI/tableview.py (LayerTableFrame.__init__): If there is
7053            already a selection present, update the grid accordingly.
7054    
7055            * Thuban/UI/mainwindow.py (MainWindow.TableShow): Make the dialog
7056            resizeable and increase its initial size.
7057    
7058    2003-05-26  Frank Koormann  <[email protected]>
7059    
7060            Table export functionality
7061    
7062            * Thuban/Model/table.py (DBFTable.Width, MemoryTable.Width):
7063            Return width (in characters) for a column.
7064            (DBFTable.Precision, MemoryTable.Precision): Return decimal precision.
7065            (table_to_dbf): Write table to dbf file.
7066            (table_to_csv): Write table to csv file.
7067    
7068            * Thuban/Model/transientdb.py (TransientTableBase.Width,
7069            TransientTableBase.Precision): Return column width and precision.
7070    
7071            * Thuban/UI/tableview.py (QueryTableFrame.OnSaveAs): Call table_to_dbf
7072            or table_to_csv depending on file selection.
7073    
7074            * test/test_dbf_table.py:
7075            Test table_to_dbf (extension of former part of test).
7076    
7077            * test/test_csv_table.py:
7078            Test table_to_csv.
7079    
7080    2003-05-23  Jan-Oliver Wagner <[email protected]>
7081    
7082            * Thuban/UI/join.py (JoinDialog.OnJoin): Use _() for strings.
7083            Use QueryTableFrame instead of TableFrame.
7084    
7085            * Thuban/UI/mainwindow.py (MainWindow.LayerShowTable): Prefix the
7086            table window with 'Layer Table:' instead of 'Table:'.
7087    
7088    2003-05-23  Jan-Oliver Wagner <[email protected]>
7089    
7090            Give all tables a title via mix-in TitledObject.LayerShowTable
7091    
7092            * Thuban/Model/base.py (TitledObject.SetTitle): Call method 'issue'
7093            only if it exists.
7094    
7095            * Thuban/Model/table.py (DBFTable, MemoryTable): mix-in TitledObject
7096            and call its init-method with a default title. Remove Title() method.
7097    
7098            * Thuban/Model/transientdb.py (TransientTable, TransientJoinedTable,
7099            AutoTransientTable): mix-in TitledObject and call its init-method with
7100            a default title. Remove Title() method.
7101    
7102    2003-05-23  Bernhard Herzog  <[email protected]>
7103    
7104            * Thuban/Model/session.py (Session.AddShapeStore): Define
7105            AddShapeStore analogously to AddTable.
7106    
7107            * test/test_session.py (TestSessionSimple.test_add_shapestore):
7108            New. Test for AddShapeStore
7109    
7110    2003-05-23  Jan-Oliver Wagner <[email protected]>
7111    
7112            Introducing QueryTableFrame and a very coarse ShowTable implementation.
7113    
7114            * Thuban/UI/tableview.py (LayerTableFrame, QueryTableFrame): Split the
7115            class LayerTableFrame into two classes, LayerTableFrame and QueryTableFrame.
7116            The latter implements the selection GUI without dependency on a layer.
7117            LayerTableFrame now is derived from QueryTableFrame and connects
7118            to a layer.
7119    
7120            * Thuban/UI/mainwindow.py (MainWindow.TableShow): A very coarse
7121            implementation that still needs work.
7122    
7123            * Thuban/Model/layer.py (Layer.TreeInfo): Added filename.
7124    
7125    2003-05-22  Frank Koormann  <[email protected]>
7126    
7127            * Thuban/Model/transientdb.py (TransientJoinedTable.__init__):
7128            Added "outer_join = False" as optional parameter.
7129            (TransientJoinedTable.create): If outer join is true, perform a
7130            "LEFT OUTER JOIN" instead of "JOIN", which preserves all records of
7131            the left table. Records not matching are filled with 0 / None.
7132    
7133            * Thuban/UI/join.py (JoinDialog.__init__): Checkbox for outer join.
7134            (JoinDialog.OnJoin): Consider outer join check box.
7135    
7136    2003-05-22  Bernhard Herzog  <[email protected]>
7137    
7138            * Thuban/UI/join.py (JoinDialog.OnJoin): Use exc_info in a
7139            somewhat safer way. Storing the traceback in a local variable can
7140            lead to memory leaks
7141    
7142    2003-05-22  Bernhard Herzog  <[email protected]>
7143    
7144            * Thuban/UI/join.py (JoinDialog.OnJoin): Make sure to really call
7145            the wxMessageDialog's Destroy() method.
7146    
7147    2003-05-22  Frank Koormann  <[email protected]>
7148    
7149            * Thuban/UI/join.py (JoinDialog.__init__): Make use of
7150            TransientTable.Title()
7151    
7152    2003-05-22  Frank Koormann  <[email protected]>
7153    
7154            Join Dialog, initial version.
7155    
7156            * Thuban/UI/mainwindow.py (MainWindow.TableJoin): Removed print.
7157    
7158            * Thuban/UI/join.py (JoinDialog): Functional implementation of
7159            former framework. Renamed Table1/Table2 to LeftTable/RightTable
7160            in all occurences.
7161    
7162            * Thuban/Model/transientdb.py (TransientJoinedTable.__doc__):
7163            Typo fixed.
7164    
7165    2003-05-22  Bernhard Herzog  <[email protected]>
7166    
7167            Give the tables titles so that the GUI can display more meaningful
7168            names. For now the titles are fixed but depend on e.g. filenames
7169            or the titles of the joined tables.
7170    
7171            * Thuban/Model/transientdb.py (TransientTable.Title)
7172            (TransientJoinedTable.Title, AutoTransientTable.Title): New.
7173    
7174            * Thuban/Model/table.py (DBFTable.Title, MemoryTable.Title): New.
7175    
7176            * test/test_transientdb.py
7177            (TestTransientTable.test_auto_transient_table_title): New. Test
7178            for the Title method
7179            (TestTransientTable.test_transient_joined_table)
7180            (TestTransientTable.test_transient_table): Add test for the Title
7181            methods
7182    
7183            * test/test_memory_table.py (TestMemoryTable.test_title): New.
7184            Test for the Title method
7185    
7186            * test/test_dbf_table.py (TestDBFTable.test_title): New. Test for
7187            the Title method
7188    
7189    2003-05-22  Bernhard Herzog  <[email protected]>
7190    
7191            * test/test_layer.py (TestLayer.setUp, TestLayer.tearDown):
7192            Provide a better way to destroy the layers
7193            (TestLayer.test_base_layer, TestLayer.test_arc_layer)
7194            (TestLayer.test_point_layer, TestLayer.test_empty_layer)
7195            (TestLayer.test_polygon_layer, TestLayer.test_get_field_type): Use
7196            the new way to destroy the layers.
7197            (TestLayer.test_derived_store): New. Test for using a layer with a
7198            DerivedShapeStore
7199    
7200            * Thuban/Model/layer.py (Layer.SetShapeStore): Only set the
7201            filename if the shape store actually has one.
7202    
7203    2003-05-22  Bernhard Herzog  <[email protected]>
7204    
7205            * Thuban/Model/table.py (DBFTable.FileName): New. Accessor method
7206            for the filename
7207    
7208            * test/test_dbf_table.py (TestDBFTable.test_filename): New. Test
7209            for the FileName method
7210            (TestDBFTableWriting.test_write): Fix spelling of filename
7211    
7212    2003-05-22  Thomas Koester  <[email protected]>
7213    
7214            * Thuban/Model/range.py, test/test_range.py: Brought over new Range
7215            from SciParam that now really is immutable.
7216    
7217    2003-05-22  Frank Koormann  <[email protected]>
7218    
7219            Layer Top/Bottom placement added to legend.
7220    
7221            * Thuban/UI/legend.py
7222            (LegendPanel._OnMoveTop(), LayerPanel._OnMoveBottom): New, methods
7223            bound to tool events.
7224            (LegendTree.MoveCurrentItemTop(), LegendTree.MoveCurrentItemBottom):
7225            New, methods binding the event methods with the map methods.
7226    
7227            * Thuban/Model/map.py (Map.TopLayer(), Map.BottomLayer()): New, place
7228            layer at top/bottom of layer stack.
7229    
7230            * Resources/Bitmaps/top_layer.xpm: New button icon.
7231    
7232            * Resources/Bitmaps/bottom_layer.xpm: New button icon.
7233    
7234    2003-05-22  Bernhard Herzog  <[email protected]>
7235    
7236            * Thuban/Model/session.py (Session.RemoveTable): New method to
7237            remove tables
7238    
7239            * test/test_session.py (TestSessionSimple.test_remove_table): New.
7240            Test for RemoveTable
7241    
7242    2003-05-22  Thomas Koester  <[email protected]>
7243    
7244            * Thuban/Model/classgen.py: Added short module doc string and CVS id.
7245            (ClassGenerator.GenUniformDistribution): Use new Range __init__, too.
7246    
7247    2003-05-22  Bernhard Herzog  <[email protected]>
7248    
7249            Implement a way to discover dependencies between tables and
7250            shapestores.
7251    
7252            * Thuban/Model/transientdb.py (TransientTableBase.Dependencies)
7253            (TransientJoinedTable.Dependencies)
7254            (AutoTransientTable.SimpleQuery): New. Implement the dependencies
7255            interface
7256            (TransientJoinedTable.__init__): Keep tack of the original table
7257            objects in addition to the corresponding transient tables.
7258    
7259            * Thuban/Model/table.py (DBFTable.Dependencies)
7260            (MemoryTable.Dependencies): New. Implement the dependencies
7261            interface
7262    
7263            * Thuban/Model/data.py (ShapeTable): New. Helper class for
7264            ShapefileStore
7265            (ShapefileStore.__init__): Use ShapeTable instead of
7266            AutoTransientTable
7267            (ShapefileStore.Table, ShapefileStore.Shapefile): Add doc-strings
7268            (ShapefileStore.FileName, ShapefileStore.FileType): New. Accessor
7269            methods for filename and type
7270            (ShapefileStore.Dependencies): New. Implement the dependencies
7271            interface
7272            (DerivedShapeStore): New class to replace SimpleStore. The main
7273            difference to SimpleStore is that it depends not on a shapefile
7274            but another shapestore which expresses the dependencies a bit
7275            better
7276            (SimpleStore.__init__): Add deprecation warning.
7277    
7278            * test/test_dbf_table.py (TestDBFTable.test_dependencies): New.
7279            Test for the Dependencies method.
7280    
7281            * test/test_memory_table.py (TestMemoryTable.test_dependencies):
7282            New. Test for the Dependencies method.
7283    
7284            * test/test_transientdb.py
7285            (TestTransientTable.test_auto_transient_table_dependencies): New.
7286            Test for the Dependencies method.
7287            (TestTransientTable.test_transient_joined_table): Add test for the
7288            Dependencies method.
7289    
7290            * test/test_session.py (TestSessionSimple.setUp)
7291            (TestSessionSimple.tearDown): New. Implement a better way to
7292            destroy the sessions.
7293            (TestSessionSimple.test_initial_state)
7294            (TestSessionSimple.test_add_table): Bind session to self.session
7295            so that it's destroyed by tearDown
7296            (TestSessionSimple.test_open_shapefile): New. Test for
7297            OpenShapefile and the object it returns
7298    
7299    2003-05-22  Bernhard Herzog  <[email protected]>
7300    
7301            * Thuban/Model/session.py (Session.AddTable): New method to
7302            register tables with the session.
7303            (Session.Tables): Return the tables registered with AddTable too.
7304    
7305            * test/test_session.py (TestSessionSimple.test_add_table): New.
7306            Test case for the AddTable method
7307    
7308    2003-05-22  Frank Koormann  <[email protected]>
7309    
7310            UI polishing updates: Place main buttons (OK, Cancel, etc) in the
7311            lower right corner, center labels for selections, initialize controls
7312            in reasonable order for keyboard navigation.
7313    
7314            * Thuban/UI/projdialog.py (ProjFrame.__init__, ProjFrame.__doLayout)
7315            (ProjFrame.__DoOnProjAvail): Determine position of current projection
7316            using the wxListBox.FindString() method. Still a problem (#1886)
7317    
7318            * Thuban/UI/classifier.py
7319            (Classifier.__init__, SelectPropertiesDialog.__init__)
7320    
7321            * Thuban/UI/classgen.py (ClassGenDialog.__init__,
7322            (ClassGenDialog.__DoOnGenTypeSelect): Moved initialization of the
7323            different classification types from here to __init__.
7324            (GenUniquePanel.__init__): Set the column width of the first field
7325            in the Field ListCtrl to the full width.
7326    
7327            * Thuban/UI/tableview.py (LayerTableFrame.__init__): Rename 'Save As'
7328            Button to 'Export'. Center Buttons in Selection Box, set Focus to
7329            Grid.
7330            (LayerTableFrame.OnKeyDown()): New, bound to the grid with EVT_KEY_DOWN,
7331            changes focus to the Selection when pressing "Alt-S".
7332    
7333            * Thuban/UI/legend.py (LegendTree.__SetVisibilityStyle): Only gray out
7334            the text if not visible. The italic font sometimes exceeds the
7335            rendering area.
7336    
7337    2003-05-21  Jonathan Coles   <[email protected]>
7338    
7339            * Thuban/UI/dock.py (DockFrame): Rename references to _OnClose
7340            to OnClose so that Thuban closes correctly.
7341    
7342            * Thuban/UI/mainwindow.py (MainWindow.OnClose): Call
7343            DockFrame.OnClose, not DockFrame._OnClose.
7344    
7345    2003-05-21  Jonathan Coles   <[email protected]>
7346    
7347            * Thuban/Model/classgen.py (ClassGenerator.GenQuantiles): Remove
7348            references to 'inf' and use new Range __init__ to pass floats
7349            directly rather than converting them to strings first.
7350            Fixes RTBug #1876.
7351    
7352            * Thuban/Model/classification.py (ClassGroupRange.SetRange):
7353            Use new Range ___init__ to pass floats.
7354    
7355            * Thuban/Model/layer.py (RasterLayer.__init__): Test if the
7356            filename is a valid image file. Throw IOError otherwise.
7357    
7358            * Thuban/Model/range.py: Brought over new Range from SciParam that
7359            is immutable and has an __init__ which can accept floats.
7360    
7361            * Thuban/UI/mainwindow.py (MainWindow.AddLayer): Move OpenShapefile
7362            into try block. AddLayer doesn't throw any exceptions anymore.
7363            (MainWindow.AddRasterLayer): Move constructor of RasterLayer into
7364            try block.
7365    
7366            * Thuban/UI/projdialog.py (GeoPanel.__init__): Put Degrees as
7367            the first item in choices. Fixes RTBug #1882.
7368    
7369            * Thuban/UI/renderer.py (MapRenderer.render_map): Check if scale
7370            has gone to 0 which is a serious problem. abort.
7371            (MapRenderer.draw_raster_layer): Catch IOError seperately and
7372            print the error from GDAL.
7373    
7374            * Thuban/UI/tableview.py (TableGrid.__init__): Call
7375            ToggleEventListeners to turn on listening.
7376            (TableGrid.ToggleEventListeners): New. Turns event listening on
7377            and off so as to prevent excessive messages.
7378            (LayerTableFrame.OnQuery): Use TableGrid.ToggleEventListeners
7379            to suppress excessive messages when selecting many rows.
7380            Fixes RTBug #1880.
7381    
7382            * Thuban/UI/view.py: Added checks against if scale == 0. This
7383            is a serious problem that can occur when an image without
7384            geo data is loading and causes the map projection bounds to
7385            go to infinity. Right now, the solution is to simply try
7386            to recover.
7387    
7388            * extensions/thuban/cpl_mfile.cpp (MFILEClose): Make sure
7389            to set the MFILEReceiver attributes even if the data is NULL.
7390    
7391            * extensions/thuban/gdalwarp.cpp: Improved the error handling
7392            and passed GDAL messages back up to the Python layer. Also
7393            tried to fix some memory leaks that were present in the original
7394            utility but didn't matter because the program aborted.
7395    
7396            * test/test_range.py: Copied over tests from SciParam. Removed
7397            tests against importing. Fixes RTBug #1867.
7398    
7399    2003-05-21  Bernhard Herzog  <[email protected]>
7400    
7401            * test/test_load.py: Remove unused imports and restructure the
7402            test code
7403            (LoadSessionTest): Split into one class for each test and turn
7404            LoadSessionTest itself into the base class for all such session
7405            tests.
7406            (ClassificationTest): New base class for load tests that test
7407            classifications
7408            (TestSingleLayer, TestLayerVisibility, TestClassification)
7409            (TestLabels, TestLayerProjection, TestRasterLayer): New classes
7410            for the individual tests
7411    
7412            * test/support.py (FileLoadTestCase.filename): New base class for
7413            file loading tests
7414    
7415    2003-05-21  Jan-Oliver Wagner <[email protected]>
7416    
7417            * Resources/Projections/defaults.proj: Renamed 'Universal Transverse
7418            Mercator' to 'UTM Zone 32' as a more convenient example.
7419            Added 'Gauss Krueger Zone 6'.
7420    
7421            * Data/iceland_sample_raster.thuban: political polygon now
7422            filled transparent to have the raster image visible at once.
7423    
7424    2003-05-21  Frank Koormann  <[email protected]>
7425    
7426            * Thuban/UI/mainwindow.py (MainWindow): Renamed _OnClose() back to
7427            OnClose() to keep in sync with extensions. Internally Thuban
7428            still uses "underscored" names.
7429    
7430    2003-05-20  Jonathan Coles   <[email protected]>
7431    
7432            This puts back Raster layer support. These layers support projections
7433            through the GDAL library. Currently, the CVS version is being used.
7434            There are no Debian packages available although this may change soon.
7435            A GDAL driver was extended to support writing to memory rather to
7436            files.
7437    
7438            There is still some work that needs to be done, such as some error
7439            handling when loading invalid images or when there is a problem
7440            projecting the image. This putback simply checks in the majority
7441            of the work.
7442    
7443            * setup.py: Add gdalwarp library extension.
7444    
7445            * Thuban/Model/layer.py (BaseLayer.HasClassification): New.
7446            Defaults to False, but can be overridden by subclasses if they
7447            support classification.
7448            (RasterLayer): New. Defines a new layer that represents an
7449            image.
7450    
7451            * Thuban/Model/load.py (SessionLoader.__init__): Add rasterlayer
7452            tag handler.
7453            (SessionLoader.start_layer): Encode the filename.
7454            (SessionLoader.start_rasterlayer, SessionLoader.end_rasterlayer):
7455            New. Supports reading a rasterlayer tag.
7456    
7457            * Thuban/Model/map.py (Map.BoundingBox): Fix typo in comment.
7458    
7459            * Thuban/Model/save.py (XMLWriter.encode): Don't assume that we
7460            get a string in Latin1. If we get such as string convert it to
7461            unicode first, otherwise leave if alone before encoding.
7462            (SessionSaver.write_layer): Add support for writing both Layers
7463            and RasterLayers.
7464    
7465            * Thuban/Model/transientdb.py (AutoTransientTable.SimpleQuery):
7466            The right argument may not be a string, it could also be a Column.
7467    
7468            * Thuban/UI/application.py (ThubanApplication.CreateMainWindow):
7469            Make initial window size 600x400. Fixes RTBug #1872.
7470    
7471            * Thuban/UI/classifier.py (Classifier.__init__): Rearrange how
7472            the dialog is constructed so that we can support layers that
7473            do not have classifications.
7474            (Classifier._OnTry): Only build a classification if the layer
7475            supports one.
7476    
7477            * Thuban/UI/legend.py: Change all checks that a layer is an
7478            instance of Layer into checks against BaseLayer.
7479            (LegendTree.__FillTreeLayer): Only add children to a branch if
7480            the layer supports classification.
7481    
7482            * Thuban/UI/mainwindow.py (MainWindow.NewSession,
7483            MainWindow.OpenSession): Don't proceed with an action if the
7484            user chooses Cancel when they are asked to save changes.
7485            (MainWindow.AddRasterLayer): New. Open a dialog to allow the
7486            user to select an image file. Create a new RasterLayer and add
7487            it to the map.
7488    
7489            * Thuban/UI/renderer.py (MapRenderer.render_map): Add support
7490            for rendering RasterLayer layers.
7491            (MapRenderer.draw_raster_layer): Actually method that calls
7492            the GDALWarp python wrapper and constructs an image from the
7493            data returned.
7494    
7495            * Thuban/UI/tableview.py (LayerTableFrame.__init__): Change the
7496            Choices symbols to match those used in the table query method.
7497            Replace deprecated method calls on table with new method names.
7498    
7499            * Thuban/UI/view.py (MapCanvas.set_view_transform): Try to limit
7500            how small the scale can get. This still needs more testing.
7501    
7502            * extensions/thuban/bmpdataset.cpp: New, but copied from GDAL.
7503            Provides a driver to output in .bmp format.
7504    
7505            * extensions/thuban/cpl_mfile.cpp, extensions/thuban/cpl_mfile.h:
7506            New. Provides IO routines which write to memory, rather than a file.
7507    
7508            * extensions/thuban/gdalwarp.cpp: New, but basically a direct copy
7509            of the gdalwarp utility provided in GDAL. Added function calls
7510            that can be accessed from python.
7511    
7512            * Data/iceland_sample_raster.thuban: New. Sample file that uses
7513            a raster layer.
7514    
7515            * Data/iceland/island.tfw, Data/iceland/island.tif: New. Raster
7516            layer image data.
7517    
7518            * Doc/thuban.dtd: Added rasterlayer attribute definition.
7519    
7520            * test/test_layer.py, test/test_load.py, test/test_save.py: Added
7521            tests associated with the raster layer code.
7522    
7523            * test/test_transientdb.py
7524            (TestTransientTable.test_auto_transient_table_query): Added a test
7525            for using a Column object as the "right" parameter to a query.
7526    
7527    2003-05-19  Frank Koormann  <[email protected]>
7528    
7529            * Thuban/version.py (get_changelog_date):
7530            Catch exceptions if ChangeLog does not exist.
7531    
7532            * Thuban/UI/view.py (MapCanvas.Export): Bugfix
7533    
7534    2003-05-19  Frank Koormann  <[email protected]>
7535    
7536            Extended version information for Thuban
7537    
7538            * Thuban/version.py: New, version information for Thuban: Last
7539            modification date and last ChangeLog entry date.
7540    
7541            * Thuban/UI/mainwindow.py (MainWindow.About()): Extended version
7542            information: Display Thuban, wxPython and Python version.
7543    
7544    2003-05-16  Bernhard Herzog  <[email protected]>
7545    
7546            * Thuban/Model/save.py: Remove some unused imports including the
7547            __future__ import for nested_scopes as Thuban relies on Python 2.2
7548            now.
7549            (XMLWriter.encode): Remove the special case for a None argument.
7550            In the saver encode is always called with a string argument.
7551    
7552    2003-05-16  Bernhard Herzog  <[email protected]>
7553    
7554            * Thuban/UI/__init__.py: Remove the work-around for the locale bug
7555            in wxPython (at least when usinvg wxGTK) prior to 2.4. The symptom
7556            of the bug was that e.g. float("1.2") would fail. Thuban now
7557            requires 2.4.x.
7558            
7559    2003-05-16  Frank Koormann   <[email protected]>
7560    
7561            Printing enhancement and WMF export (under Win32)
7562    
7563            * Thuban/UI/renderer.py (ExportRenderer): New, derived from
7564            ScreenRenderer. Renders Map, Legend and Scalebar for export.
7565            (PrinterRenderer): New, derived from ExportRenderer. Replaces the old
7566            PrintRender.
7567    
7568            * Thuban/UI/view.py (MapPrintout.__init__): Enhanced parameter set
7569            to fullfil information needed for PrinterRenderer.
7570            (MapCanvas.Export): New. Export Map (currently only to WMF on Win32).
7571            (MapCanvas.Print): Adapted to new MapPrintout.
7572            (OutputTransform): General calculations to transform from canvas
7573            coordinates to export/printing devices.
7574    
7575            * Thuban/UI/mainwindow.py (MainWindow.ExportMap()): New. Added also
7576            new method_command to call ExportMap, with platform dependency (only
7577            __WXMSW__)
7578      
7579            * Thuban/UI/scalebar.py (ScaleBar.DrawScaleBar): Position and Size
7580            of scalebar drawing area as new parameters.
7581            
7582            * Thuban/Model/scalebar.py (roundInterval): round long instead of int
7583    
7584            * Thuban/UI/legend.py (ScalebarBitmap.__SetScale):
7585            Update to extended scalebar.DrawScalebar header.
7586    
7587            * test/test_export.py: New, test Thuban.UI.view.OutputTransform()
7588    
7589            * test/test_scalebar.py: Made test executable as standalone.
7590    
7591    2003-05-16  Bernhard Herzog  <[email protected]>
7592    
7593            * Thuban/Model/table.py (Table): Remove this compatibility alias
7594            for DBFTable.
7595    
7596            * test/test_table.py: Import DBFTable as Table because that alias
7597            doesn't exist anymore.
7598    
7599            * Thuban/UI/classgen.py: Remove some unused imports
7600    
7601    2003-05-14  Jonathan Coles   <[email protected]>
7602    
7603            * Thuban/Model/classgen.py (ClassGenerator.GenSingletonsFromList):
7604            Fix docstring.
7605            (ClassGenerator.GenUniformDistribution): Fix spelling of method name.
7606            (ClassGenerator.GenQuantiles): Use the left/right brackets and min/max
7607            values of the supplied range to determine the beginning and end
7608            bounds of the generated classes.
7609    
7610            * Thuban/Model/range.py (Range.number_re): Now accepts floats that
7611            do not have a leading 0 (.5 is now accepted as well as 0.5).
7612    
7613            * Thuban/UI/classgen.py (ClassGenDialog.OnOK): Fix name of method
7614            call to ClassGenerator.GenUniformDistribution.
7615    
7616            * Thuban/UI/projdialog.py (ProjFrame.__do_layout): Fix Windows
7617            layout bug with the 'Projection' label.
7618    
7619            * test/support.py (FloatTestCase): New. Needed for the Range tests.
7620    
7621            * test/test_range.py: New. Imported from SciParam.
7622    
7623    2003-05-12  Jonathan Coles   <[email protected]>
7624    
7625            * Thuban/UI/classgen.py (GenQuantilesPanel.GetList): Replace call
7626            to table.UniqueValues() with calls that retrieve all the values
7627            from the table. This will need to be replaced by a method on table
7628            which can simply return the list (perhaps more efficiently).
7629    
7630    2003-05-12  Jonathan Coles   <[email protected]>
7631    
7632            The return value of ClassGenerator.CalculateQuantiles has changed.
7633            Refer to the documentation for details.
7634    
7635            * test/test_classgen.py: Modified Quantile tests to use the
7636            new return values.
7637    
7638            * Thuban/Model/classgen.py
7639            (ClassGenerator.GenQuantiles): Add comments describing the parameters,
7640            use new return values from CalculateQuantiles to produce the correct
7641            range bounds in the Classification.
7642            (ClassGenerator.CalculateQuantiles): Add more comments describing
7643            the return values and parameters. Make minor adjustments to improve
7644            the legibility of the code. Fix problem with adjusted not being set
7645            in most cases.
7646    
7647    2003-05-12  Frank Koormann <[email protected]>
7648            
7649            * Thuban/Model/save.py (XMLWriter.encode()): Explicite call to unicode
7650            and latin1. Fixes #1851 finally.
7651    
7652    2003-05-09  Jonathan Coles   <[email protected]>
7653    
7654            * test/test_classgen.py: New. Tests the Quantile algorithm.
7655    
7656            * Thuban/Model/classgen.py (ClassGenerator.CalculateQuantiles):
7657            Clean up debugging statement, add comments, fix a small bug in the
7658            returned adjusted percentiles.
7659            
7660    2003-05-09  Jonathan Coles   <[email protected]>
7661    
7662            Introduces Range class from SciParam into the ClassGroupRange class,
7663            and such ranges can now be saved and loaded from disk.
7664    
7665            Quantiles are now available in the Classification Generator.
7666    
7667            Initial support for building Queries on a table. Doesn't do anything
7668            but run some tests.
7669    
7670            * Thuban/Model/classification.py: Explicit imports.
7671            (ClassGroupRange): Use the Range class to store the underlying
7672            range information. The interface remains the same, except for
7673            GetRange(), and you can also supply a Range object as the min
7674            parameter to SetRange or __init__.
7675    
7676            * Thuban/Model/load.py (XMLReader.encode): New. Encodes the given
7677            string appropriately for use in Thuban. Fixes RTbug #1851.
7678            (SessionLoader.end_projection): Handle the context of the
7679            projection tag a bit better by looking at what objects are not
7680            None. There was an assumption that a projection tag for a map
7681            could occur before any layers.
7682            (SessionLoader.start_clrange): Provide backward compatibility for
7683            reading min/max values as well as the new range parameter.
7684    
7685            * Thuban/Model/map.py: Explicit imports.
7686    
7687            * Thuban/Model/resource.py: Import _.
7688            (ProjFileSaver.write): write header using projfile.dtd.
7689    
7690            * Thuban/Model/save.py: Explicit imports.
7691            (XMLWriter.encode): New. Encode the given string from a format
7692            used by Thuban into UTF-8. Fixes RTbug #1851.
7693    
7694            * Thuban/UI/classgen.py: Explicit imports.
7695            (ClassGenDialog.__init__): Clean up the code and add support
7696            for Quantiles.
7697            (ClassGenDialog.OnOK): Add support for Quantiles.
7698            (GenQuantilesPanel): New. Input panel for Quantiles.
7699            (ClassGenerator, CustomRamp, MonochromaticRamp, GreyRamp, RedRamp,
7700            GreenRamp, BlueRamp, HotToColdRamp): Move to Thuban/Model/classgen.py
7701    
7702            * Thuban/Model/classgen.py: New. Contains all the classes named above.
7703    
7704            * Thuban/UI/classifier.py: Explicit imports.
7705            (ClassTable.GetValueAsCust, ClassTable.__ParseInput,
7706            ClassTable.SetValueAsCustom): Reworked to use new Range class.
7707    
7708            * Thuban/UI/legend.py: Explicit imports.
7709    
7710            * Thuban/UI/mainwindow.py: Add support for the Join Dialog. Added
7711            a Table menu and associated method calls.
7712            (MainWindow.choose_color): Removed. No longer needed.
7713    
7714            * Thuban/UI/projdialog.py (ProjFrame.__VerifyButtons): Save button
7715            should be disabled if no projection is selected in the available
7716            list.
7717    
7718            * Thuban/UI/renderer.py: Explicit imports.
7719    
7720            * Thuban/UI/tableview.py (TableGrid.OnRangeSelect): Fix some issues
7721            with correctly selecting the rows and issuing the right events.
7722            Be sure to call Skip() to allow the grid to do some of its own
7723            handling which allows the rows to actually be selected.
7724            (LayerTableGrid.select_shapes): Rename from select_shape. Supports
7725            selecting multiple shapes.
7726            (LayerTableFrame): Support for building Queries.
7727            (LayerTableFrame.select_shapes): Allow multiple shapes to be selected.
7728    
7729            * Thuban/UI/tree.py: Explicit imports.
7730    
7731            * Thuban/UI/view.py (MapCanvas): Delegate "SelectedShapes" so the
7732            table view can call it.
7733    
7734            * test/test_classification.py: Explicit imports.
7735            (TestClassification.test_ClassGroupRange): Fix test for new
7736            Range class.
7737    
7738            * Doc/thuban.dtd: Add range parameter for clrange.
7739    
7740            * Thuban/Model/range.py: Taken from SciParam. Used as the underlying
7741            object in ClassGroupRange, and also uesd for inputting ranges in
7742            the classifer table and elsewhere.
7743    
7744            * Thuban/UI/join.py: New. Initial Join dialog. No real functionality
7745            yet.
7746    
7747    2003-05-09  Frank Koormann <[email protected]>
7748    
7749            * Thuban/UI/scalebar.py (DrawScaleBar): Draw only if interval > 0.0.
7750    
7751    2003-05-08  Frank Koormann <[email protected]>
7752    
7753            Coding style updates
7754    
7755            * test/test_scalebar.py: Replaced tab indentation by spaces.
7756    
7757            * Thuban/UI/scalebar.py: Explicit imports.
7758    
7759    2003-05-08  Frank Koormann <[email protected]>
7760    
7761            * Thuban/UI/scalebar.py
7762            (ScaleBar.DrawScalebar): Format string bug fixed.
7763    
7764    2003-05-08  Frank Koormann <[email protected]>
7765    
7766            Reorganization of scalebar component (no wx in Thuban/Model)
7767    
7768            * Thuban/Model/scalebar.py: Rendering moved to Thuban/UI/scalebar.py
7769            (deriveInterval):
7770            Calculate scalebar interval and unit which fits in width for scale.
7771            (roundInterval): Round float.
7772    
7773            * Thuban/UI/scalebar.py (ScaleBar): Scalebar rendering
7774    
7775            * test/test_scalebar.py: Test for Thuban/Model/scalebar.py methods.
7776    
7777            * Thuban/UI/legend.py: Import Thuban.UI.scalebar
7778    
7779    2003-05-08  Frank Koormann <[email protected]>
7780    
7781            * Thuban/UI/legend.py (ScalebarBitmap.SetCanvas):
7782            Initialize ScaleBar with canvas.map
7783    
7784            * Thuban/Model/scalebar.py (ScaleBar.roundInterval()): New,
7785            round intervals to display smarter lengths
7786            (ScaleBar.DrawScalebar): Draw Scalebar only if the map contains a
7787            layer. If the maps has no projection applied grey the scalebar.
7788    
7789    2003-05-07  Frank Koormann <[email protected]>
7790            
7791            Basic Scalebar features added.
7792    
7793            * Thuban/Model/scalebar.py (ScaleBar): New, scalebar rendering.
7794    
7795            * Thuban/UI/legend.py (LegendPanel): Added scalebar bitmap
7796            (ScaleBarBitmap): New, links the scalebar bitmap with view messages
7797            and the renderer.
7798    
7799            * Thuban/UI/view.py (MapCanvas.set_view_transform): Issue SCALE_CHANGED.
7800    
7801            * Thuban/UI/messages.py: SCALE_CHANGED added.
7802    
7803    2003-05-07  Bernhard Herzog  <[email protected]>
7804    
7805            * Thuban/Model/session.py (Session.__init__): New instance
7806            variable shapestores to hold a list of all open shapestore objects
7807            (Session.ShapeStores): New. Accessor method for the shapestores
7808            list.
7809            (Session._add_shapestore, Session._clean_weak_store_refs): New.
7810            Internal methods to maintain the shapestores list.
7811            (Session.Tables): New. Return all tables open in the session.
7812            (Session.OpenShapefile): Insert the new ShapeStore into the
7813            shapestores list.
7814    
7815            * test/test_session.py (TestSessionSimple.test_initial_state): Add
7816            tests for ShapeStores and Tables
7817            (TestSessionWithContent.test_shape_stores)
7818            (TestSessionWithContent.test_tables): New. Test cases for
7819            ShapeStores and Tables
7820    
7821    2003-05-07  Bernhard Herzog  <[email protected]>
7822    
7823            * Thuban/Model/transientdb.py (TransientTableBase.ReadRowAsDict):
7824            Add comments about the optimizations used.
7825            (AutoTransientTable.ReadValue, TransientTableBase.ReadValue): New.
7826            Implement the ReadValue table interface method.
7827    
7828            * test/test_transientdb.py
7829            (TestTransientTable.run_iceland_political_tests)
7830            (TestTransientTable.test_transient_joined_table): Add tests for
7831            ReadValue
7832    
7833    2003-05-07  Frank Koormann <[email protected]>
7834    
7835            * Resources/Bitmaps/fulllayerextent.xpm,
7836            Resources/Bitmaps/fullselextent.xpm: Replaced the place holders with
7837            new icons.
7838    
7839    2003-05-06  Bernhard Herzog  <[email protected]>
7840    
7841            * Thuban/Model/transientdb.py (AutoTransientTable.SimpleQuery):
7842            New. Simply delegate to the transient table's version.
7843    
7844            * test/test_transientdb.py
7845            (TestTransientTable.test_auto_transient_table_query): New. Test
7846            case for AutoTransientTable's SimpleQuery
7847    
7848    2003-05-06  Bernhard Herzog  <[email protected]>
7849    
7850            * Thuban/Model/transientdb.py (TransientTableBase.SimpleQuery):
7851            Implement a simple query method for the query dialog
7852            (TransientTableBase.create): Add an INTEGER PRIMARY KEY that holds
7853            the row index or shapeid.
7854            (TransientTable.create): Insert the right value of the row index
7855            (TransientJoinedTable.create): Copy the row index of the left
7856            table to the joined result table
7857    
7858            * test/test_transientdb.py
7859            (TestTransientTable.test_transient_table_read_twice): Fix
7860            doc-string
7861            (TestTransientTable.test_transient_table_query): New. Test for the
7862            SimpleQuery method
7863    
7864    2003-05-06  Bernhard Herzog  <[email protected]>
7865    
7866            Convert all table users to use the new table interface. This only
7867            covers Thuban itself, not GREAT-ER or other applications built on
7868            Thuban yet, so the compatibility interface stays in place for the
7869            time being but it now issues DeprecationWarnings.
7870    
7871            Finally, the new Table interface has a new method, HasColumn.
7872    
7873            * Thuban/Model/table.py (OldTableInterfaceMixin): All methods
7874            issue deprecation warnings when they're. The warnings refer to the
7875            caller of the method.
7876            (OldTableInterfaceMixin.__deprecation_warning): New. Helper method
7877            for the deprecation warnings
7878    
7879            * test/test_table.py: Ignore the deprecation warnings for the old
7880            table in the tests in this module. The purpose of the tests is to
7881            test the old interface, after all.
7882    
7883            * test/test_transientdb.py
7884            (TestTransientTable.run_iceland_political_tests): Use the
7885            constants for the types. Add a test for HasColumn
7886            (TestTransientTable.test_transient_joined_table): Adapt to new
7887            table interface. Add a test for HasColumn
7888            (TestTransientTable.test_transient_table_read_twice): Adapt to new
7889            table interface
7890    
7891            * Thuban/UI/tableview.py (DataTable.SetTable, DataTable.GetValue):
7892            Adapt to new table interface
7893    
7894            * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Adapt to
7895            new table interface
7896    
7897            * Thuban/UI/controls.py (RecordListCtrl.fill_list)
7898            (RecordTable.SetTable): Adapt to new table interface
7899    
7900            * Thuban/UI/classifier.py (Classifier.__init__)
7901            (Classifier.__init__): Adapt to new table interface
7902    
7903            * Thuban/UI/classgen.py (ClassGenDialog.__init__)
7904            (GenUniformPanel._OnRetrieve, GenUniquePanel._OnRetrieve): Adapt
7905            to new table interface
7906    
7907            * Thuban/Model/transientdb.py (TransientTableBase.HasColumn)
7908            (AutoTransientTable.HasColumn): Implement the new table interface
7909            method
7910            (AutoTransientTable.ReadRowAsDict, AutoTransientTable.ValueRange)
7911            (AutoTransientTable.UniqueValues): Adapt to new table interface
7912    
7913            * Thuban/Model/layer.py (Layer.SetShapeStore, Layer.GetFieldType):
7914            Adapt to new table interface
7915    
7916            * test/test_layer.py (TestLayer.open_shapefile): Helper method to
7917            simplify opening shapefiles a bit easier.
7918            (TestLayer.test_arc_layer, TestLayer.test_polygon_layer)
7919            (TestLayer.test_point_layer): Use the new helper method
7920            (TestLayer.test_get_field_type): New. Test for the GetFieldType
7921            method
7922    
7923            * test/test_dbf_table.py (TestDBFTable.test_has_column): Test for
7924            the new table method
7925    
7926            * test/test_memory_table.py (TestMemoryTable.test_has_column):
7927            Test for the new table method HasColumn
7928    
7929    2003-05-06  Jonathan Coles   <[email protected]>
7930    
7931            Addresses the "Selection Extent" wish of RTbug #1787.
7932    
7933            * Resources/Bitmaps/fulllayerextent.xpm,
7934            Resources/Bitmaps/fullselextent.xpm: Bitmaps for layer and selection
7935            extent. These are just place holders for the real bitmaps.
7936    
7937            * Thuban/Model/layer.py (Shape): Since a Shape is immutable only
7938            calculate the bounding box once (the first time compute_bbox() is
7939            called).
7940            (Layer.ShapesBoundingBox): New. Given a list of shape ids, return
7941            the bounding box for the shapes in lat/long coordinates.
7942    
7943            * Thuban/UI/mainwindow.py: Added new "Full selection extent" menu
7944            option.
7945            (MainWindow.has_selected_shapes): New. Returns true if there are
7946            any selected shapes.
7947            (MainWindow.FullSelectionExtent): New. Calls
7948            MapCanvas.FitSelectedToWindow() when the user selects the menu option.
7949            (_has_selected_shapes): New. Returns true if there are any
7950            selected shapes.
7951    
7952            * Thuban/UI/selection.py (Selection.HasSelectedShapes): New. Returns
7953            true if there are any selected shapes.
7954    
7955            * Thuban/UI/view.py (MapCanvas): Added delegated method
7956            HasSelectedShapes.
7957            (MapCanvas.FitSelectedToWindow): New. Centers and scales any selected
7958            shapes on the canvas using the map projection (if any).
7959    
7960            * test/test_layer.py (TestLayer.test_arc_layer): Add some tests
7961            for Layer.ShapesBoundingBox().
7962    
7963    2003-05-06  Bernhard Herzog  <[email protected]>
7964    
7965            * Resources/Projections/defaults.proj: Fix spelling of Mercator
7966    
7967    2003-05-05  Jonathan Coles   <[email protected]>
7968    
7969            Addresses the "Full Layer Extent" wish of RTbug #1787.
7970    
7971            * Resources/Projections/defaults.proj: Added UK National Grid.
7972    
7973            * Thuban/UI/mainwindow.py: Added new "Full layer extent" menu option.
7974            (MainWindow.FullLayerExtent): New. Calls MapCanvas.FitLayerToWindow()
7975            when the user selects the menu option.
7976    
7977            * Thuban/UI/view.py (MapCanvas.FitLayerToWindow): New. Centers and
7978            scales the given layer on the canvas using the map projection.
7979    
7980    2003-05-05  Bernhard Herzog  <[email protected]>
7981    
7982            Convert the table implementations to a new table interface. All
7983            tables use a common mixin class to provide backwards compatibility
7984            until all table users have been updated.
7985    
7986            * Thuban/Model/table.py (OldTableInterfaceMixin): Mixin class to
7987            provide backwards compatibility for table classes implementing the
7988            new interface
7989            (DBFTable, MemoryTable): Implement the new table interface. Use
7990            OldTableInterfaceMixin as base for compatibility
7991            (DBFColumn, MemoryColumn): New. Column description for DBFTable
7992            and MemoryTable resp.
7993    
7994            * test/test_dbf_table.py: New. Test cases for the DBFTable with
7995            the new table interface.
7996    
7997            * test/test_memory_table.py: New. Test cases for the MemoryTable
7998            with the new table interface.
7999    
8000            * test/test_table.py: Document the all tests in this file as only
8001            for backwards compatibility. The equivalent tests for the new
8002            interface are in test_memory_table.py and test_dbf_table.py
8003            (MemoryTableTest.test_read): field_info should be returning tuples
8004            with four items
8005            (MemoryTableTest.test_write): Make doc-string a more precise.
8006    
8007            * Thuban/Model/transientdb.py (TransientTableBase): Convert to new
8008            table interface. Derive from from OldTableInterfaceMixin for
8009            compatibility.
8010            (TransientTableBase.create): New intance variable column_map to
8011            map from names and indices to column objects
8012            (TransientTable.create): Use the new table interface of the input
8013            table
8014            (AutoTransientTable): Convert to new table interface. Derive from
8015            from OldTableInterfaceMixin for compatibility.
8016            (AutoTransientTable.write_record): Removed. It's not implemented
8017            yet and we still have to decide how to handle writing with the new
8018            table and data framework.
8019    
8020            * test/test_transientdb.py
8021            (TestTransientTable.run_iceland_political_tests)
8022            (TestTransientTable.test_transient_joined_table): Use the new
8023            table interface
8024    
8025    2003-05-05  Jonathan Coles   <[email protected]>
8026    
8027            This is namely a collection of UI updates to improve user interactivity.
8028            Tabbing between controls now exists and you can use ESC to close dialog
8029            boxes; ENTER will active the default button.
8030    
8031            * Thuban/UI/classgen.py (ClassGenDialog.__init__): Rearrange the
8032            order that the controls are created so that tabbing works correctly.
8033            (ClassGenDialog.OnOK): Renamed from _OnGenerate() so that the
8034            wxDialog can handle the default button correctly.
8035            (ClassGenDialog.OnCancel): Renamed from _OnCloseBtn() for the
8036            same reasons as for OnOK.
8037            (GenUniformPanel._OnRetrieve): Call wxBeginBusyCursor/wxEndBusyCursor
8038            when we ask the table for the maximum/minimum values of a field
8039            which could take a very long time.
8040    
8041            * Thuban/UI/classifier.py (Classifier.__init__): Rearrange the
8042            order that the controls are created so that tabbing works correctly.
8043            (SelectPropertiesDialog.__init__): Rearrange the order that the
8044            controls are created so that tabbing works correctly.
8045    
8046            * Thuban/UI/dialogs.py: Copied NonModalDialog box and changed it
8047            to derive from a wxDialog but behave like the original implementation
8048            which was derived from a wxFrame. wxDialog provides useful key
8049            handling functionality like ESC calling OnCancel and ENTER calling
8050            OnOK which is lost with wxFrame.
8051    
8052            * Thuban/UI/mainwindow.py: Add "..." to menu items that will open
8053            new dialogs.
8054    
8055            * Thuban/UI/projdialog.py (ProjFrame.__init__): Rearrange the
8056            order that the controls are created so that tabbing works correctly.
8057            (ProjFrame.OnApply): Renamed from _OnTry() to use wxDialog behaviour.
8058            (ProjFrame.OnOK): Renamed from _OnOK() to use wxDialog behaviour.
8059            (ProjFrame.OnCancel): Renamed from _OnClose() to use wxDialog behaviour.
8060            (ProjPanel.__init__): Add "Airy" to the list of ellipsoids so we
8061            can provide the "UK National Grid" as a default projection.
8062            (UTMPanel.__init__): Rearrange the order that the controls are
8063            created so that tabbing works correctly.
8064    
8065    2003-05-05  Bernhard Herzog  <[email protected]>
8066    
8067            * extensions/thuban/wxproj.cpp: Fix some of the comments.
8068            (project_point): If a map projection but no layer projection is
8069            given, convert degrees to radians before applying the map
8070            projection.
8071    
8072            * Thuban/UI/tableview.py (TableGrid.disallow_messages)
8073            (TableGrid.allow_messages): New methods to make it possible to
8074            inhibit message sending.
8075            (TableGrid.issue): Only send the message if not inhibited.
8076            (LayerTableGrid.select_shape): Use the new methods to make sure
8077            that no ROW_SELECTED message is sent while we're updating the
8078            selected rows to match the selected shapes.
8079    
8080    2003-05-02  Jan-Oliver Wagner <[email protected]>
8081    
8082            Implementation of MemoryTable.
8083    
8084            * Thuban/Model/table.py (MemoryTable): New. Quite simple table
8085            implementation that operates on a list of tuples. All of the data
8086            are kept in the memory.
8087    
8088            * test/test_table.py (MemoryTableTest): New.
8089    
8090            * test/test_transientdb.py (SimpleTable): Removed.
8091            (TestTransientTable.test_transient_joined_table,
8092            (TestTransientTable.test_transient_table_read_twice): Replaced
8093            SimpleTable by MemoryTable.
8094    
8095    2003-04-30  Jonathan Coles   <[email protected]>
8096    
8097            * Data/iceland_sample.thuban: Now contains correct projections
8098            for each of the layers.
8099    
8100            * Resources/Projections/defaults.proj: Geographic projection
8101            contains unit conversion parameter.
8102    
8103    2003-04-30  Jonathan Coles   <[email protected]>
8104    
8105            The most important part of this putback is the projection changes.
8106            It should now be possible to specify the projection that a layer
8107            is in and then specify a different projection for the map. The
8108            projection dialog has an extra parameter for a geographic projection
8109            which lets the user select if the input is in degrees or radians.
8110    
8111            * Thuban/Model/layer.py (Layer.ShapesInRegion): Fix docstring
8112            to say that the parameter is a tuple of unprojected
8113            points (which is what the callers to this method were assuming).
8114            Also, since the points are unprojected we need to projected them.
8115    
8116            * Thuban/UI/legend.py (LegendTree.MoveCurrentItemUp,
8117            LegendTree.MoveCurrentItemDown): If the layer or any of the layer's
8118            groups are selected, move the layer up/down. Fixes RTbug #1833.
8119    
8120            * Thuban/UI/mainwindow.py: Move menu item map_rename up.
8121    
8122            * Thuban/UI/projdialog.py (ProjFrame._OnSave): Add missing
8123            parameter in call to SetClientData.
8124            (GeoPanel): Add support for selecting the units that the
8125            source data is in (Radians or Degrees).
8126    
8127            * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Optimize
8128            the rendering loop by reducing the number of if's, removing the
8129            unnecessary try/except block, and checking if the old group
8130            is the same as the new one (which happens a lot if there is
8131            no classification, or lots of shapes are in the same group).
8132    
8133            * Thuban/UI/view.py (MapCanvas.OnPaint): Add a try/except block
8134            around the redraw routine to try to catch problems that the user
8135            may create by selecting invalid projections for the data set and
8136            map. Clears the display if there are any problems and prints the
8137            error.
8138            (MapCanvas.do_redraw): Use DC.Clear() instead of drawing a filled
8139            rectangle.
8140    
8141            * extensions/thuban/wxproj.cpp (project_point): First invert the
8142            supplied point (which should be in projected coordinates) using
8143            the layer's projection and then project the point using the
8144            map's projection.
8145            (project_points): Use project_point() to project each point.
8146    
8147    2003-04-30  Jan-Oliver Wagner <[email protected]>
8148    
8149            * Thuban/Model/layer.py (Layer.SetShapeStore): Fixed a bug:
8150            don't set the Classification to None if the classfication field
8151            is None (ie only a DEFAULT).
8152    
8153    2003-04-30  Bernhard Herzog  <[email protected]>
8154    
8155            * Thuban/UI/view.py: Fix some typos.
8156    
8157            * Thuban/UI/mainwindow.py (MainWindow.identify_view_on_demand): Do
8158            not pop up the dialog if the selection becomes empty (this could
8159            happen if e.g. a new selection is opened while the identify tool
8160            is active and dialog had been closed)
8161    
8162    2003-04-30  Bernhard Herzog  <[email protected]>
8163    
8164            * Thuban/Model/transientdb.py (TransientTableBase.__init__): New
8165            instance variable read_record_last_result
8166            (TransientTableBase.read_record): Make sure reading the same
8167            record twice works. The implementation uses the new instance
8168            variable read_record_last_result
8169    
8170            * test/test_transientdb.py
8171            (TestTransientTable.test_transient_table_read_twice): New test
8172            case for the above bug-fix.
8173    
8174    2003-04-29  Jonathan Coles   <[email protected]>
8175    
8176            * Thuban/common.py: Removed. No longer needed Str2Num. RTbug #1832.
8177    
8178            * Thuban/UI/classgen.py: Remove all uses of Str2Num.
8179    
8180            * Thuban/UI/classifier.py: Remove all uses of Str2Num.
8181            (ClassTable.SetValueAsCustom): Rename keyword argument in
8182            ClassGroup* constructors to match argument name.
8183    
8184    2003-04-29  Bernhard Herzog  <[email protected]>
8185    
8186            * Thuban/Model/session.py (Session.Destroy): Explicitly close the
8187            transient DB if it exists to make sure it doesn't leave a journal
8188            file in the temp directory.
8189    
8190            * Thuban/Model/transientdb.py (TransientDatabase.close): Set
8191            self.conn to None after closing the connection to make sure it's
8192            not closed twice
8193    
8194    2003-04-29  Jonathan Coles   <[email protected]>
8195    
8196            Add a visible parameter in the layer XML tag. The default value is
8197            "true". If anything other than "false" is specified we also assume
8198            "true". Addresses RTbug #1025.
8199    
8200            * Doc/thuban.dtd: Add visible parameter to a layer.
8201    
8202            * Thuban/Model/layer.py (BaseLayer.__init__): Change default value
8203            of visible from 1 to True.
8204            (Layer.__init__): Change default value of visible from 1 to True.
8205    
8206            * Thuban/Model/load.py (SessionLoader.start_layer): Read visible
8207            parameter.
8208    
8209            * Thuban/Model/save.py (SessionSaver.write_layer): Save visible
8210            parameter.
8211    
8212            * test/test_load.py: Add new test data contents_test_visible.
8213            (LoadSessionTest.setUp): save test data.
8214            (LoadSessionTest.testLayerVisibility): Test if the visible flag
8215            is loaded correctly.
8216    
8217            * test/test_save.py (SaveSessionTest.testSingleLayer): Add test
8218            for saving an invisible layer.
8219    
8220    2003-04-29  Jonathan Coles   <[email protected]>
8221    
8222            * Thuban/UI/mainwindow.py (MainWindow.SetMap): Look up the
8223            legend dialog box and tell it to change its map to the one
8224            supplied to SetMap(). Fixes RTbug #1770.
8225    
8226    2003-04-29  Bernhard Herzog  <[email protected]>
8227    
8228            Next step of table implementation. Introduce a transient database
8229            using SQLite that some of the data is copied to on demand. This
8230            allows us to do joins and other operations that require an index
8231            for good performance with reasonable efficiency. Thuban now needs
8232            SQLite 2.8.0 and pysqlite 0.4.1. Older versions may work but I
8233            haven't tested that.
8234            
8235            * Thuban/Model/transientdb.py: New. Transient database
8236            implementation.
8237    
8238            * test/test_transientdb.py: New. Tests for the transient DB
8239            classes.
8240    
8241            * Thuban/Model/session.py (AutoRemoveFile, AutoRemoveDir): New
8242            classes to help automatically remove temporary files and
8243            directories.
8244            (Session.__init__): New instance variables temp_dir for the
8245            temporary directory and transient_db for the SQLite database
8246            (Session.temp_directory): New. Create a temporary directory if not
8247            yet done and return its name. Use AutoRemoveDir to have it
8248            automatically deleted
8249            (Session.TransientDB): Instantiate the transient database if not
8250            done yet and return it.
8251    
8252            * Thuban/Model/data.py (ShapefileStore.__init__): Use an
8253            AutoTransientTable so that data is copied to the transient DB on
8254            demand.
8255            (SimpleStore): New class that simply combines a table and a
8256            shapefile
8257    
8258            * Thuban/Model/table.py (Table, DBFTable): Rename Table into
8259            DBFTable and update its doc-string to reflect the fact that this
8260            is only the table interface to a DBF file. Table is now an alias
8261            for DBFTable for temporary backwards compatibility.
8262    
8263            * Thuban/UI/application.py (ThubanApplication.OnExit): Make sure
8264            the last reference to the session goes away so that the temporary
8265            files are removed properly.
8266    
8267            * test/test_load.py (LoadSessionTest.tearDown): Remove the
8268            reference to the session to make sure the temporary files are
8269            removed.
8270    
8271    2003-04-29  Bernhard Herzog  <[email protected]>
8272    
8273            * Thuban/Model/load.py (XMLReader.__init__, XMLReader.read): Turn
8274            the __parser instance variable into a normal local variable in
8275            read. It's only used there and read will never be called more than
8276            once. Plus it introduces a reference cycle that keeps can keep the
8277            session object alive for a long time.
8278    
8279    2003-04-29  Jonathan Coles   <[email protected]>
8280    
8281          * Thuban/Model/proj.py (Projection): Removed Set*() methods to make          * Thuban/Model/proj.py (Projection): Removed Set*() methods to make
8282          Projection an immutable item. Fixes RTbug #1825.          Projection an immutable item. Fixes RTbug #1825.

Legend:
Removed from v.762  
changed lines
  Added in v.2517

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26