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

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

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26