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

Legend:
Removed from v.848  
changed lines
  Added in v.2481

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26