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

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

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26