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

Legend:
Removed from v.370  
changed lines
  Added in v.2452

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26