/[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 311 by bh, Tue Sep 10 16:45:32 2002 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]>
7701    
7702            * Resources/Bitmaps/fulllayerextent.xpm,
7703            Resources/Bitmaps/fullselextent.xpm: Replaced the place holders with
7704            new icons.
7705    
7706    2003-05-06  Bernhard Herzog  <[email protected]>
7707    
7708            * Thuban/Model/transientdb.py (AutoTransientTable.SimpleQuery):
7709            New. Simply delegate to the transient table's version.
7710    
7711            * test/test_transientdb.py
7712            (TestTransientTable.test_auto_transient_table_query): New. Test
7713            case for AutoTransientTable's SimpleQuery
7714    
7715    2003-05-06  Bernhard Herzog  <[email protected]>
7716    
7717            * Thuban/Model/transientdb.py (TransientTableBase.SimpleQuery):
7718            Implement a simple query method for the query dialog
7719            (TransientTableBase.create): Add an INTEGER PRIMARY KEY that holds
7720            the row index or shapeid.
7721            (TransientTable.create): Insert the right value of the row index
7722            (TransientJoinedTable.create): Copy the row index of the left
7723            table to the joined result table
7724    
7725            * test/test_transientdb.py
7726            (TestTransientTable.test_transient_table_read_twice): Fix
7727            doc-string
7728            (TestTransientTable.test_transient_table_query): New. Test for the
7729            SimpleQuery method
7730    
7731    2003-05-06  Bernhard Herzog  <[email protected]>
7732    
7733            Convert all table users to use the new table interface. This only
7734            covers Thuban itself, not GREAT-ER or other applications built on
7735            Thuban yet, so the compatibility interface stays in place for the
7736            time being but it now issues DeprecationWarnings.
7737    
7738            Finally, the new Table interface has a new method, HasColumn.
7739    
7740            * Thuban/Model/table.py (OldTableInterfaceMixin): All methods
7741            issue deprecation warnings when they're. The warnings refer to the
7742            caller of the method.
7743            (OldTableInterfaceMixin.__deprecation_warning): New. Helper method
7744            for the deprecation warnings
7745    
7746            * test/test_table.py: Ignore the deprecation warnings for the old
7747            table in the tests in this module. The purpose of the tests is to
7748            test the old interface, after all.
7749    
7750            * test/test_transientdb.py
7751            (TestTransientTable.run_iceland_political_tests): Use the
7752            constants for the types. Add a test for HasColumn
7753            (TestTransientTable.test_transient_joined_table): Adapt to new
7754            table interface. Add a test for HasColumn
7755            (TestTransientTable.test_transient_table_read_twice): Adapt to new
7756            table interface
7757    
7758            * Thuban/UI/tableview.py (DataTable.SetTable, DataTable.GetValue):
7759            Adapt to new table interface
7760    
7761            * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Adapt to
7762            new table interface
7763    
7764            * Thuban/UI/controls.py (RecordListCtrl.fill_list)
7765            (RecordTable.SetTable): Adapt to new table interface
7766    
7767            * Thuban/UI/classifier.py (Classifier.__init__)
7768            (Classifier.__init__): Adapt to new table interface
7769    
7770            * Thuban/UI/classgen.py (ClassGenDialog.__init__)
7771            (GenUniformPanel._OnRetrieve, GenUniquePanel._OnRetrieve): Adapt
7772            to new table interface
7773    
7774            * Thuban/Model/transientdb.py (TransientTableBase.HasColumn)
7775            (AutoTransientTable.HasColumn): Implement the new table interface
7776            method
7777            (AutoTransientTable.ReadRowAsDict, AutoTransientTable.ValueRange)
7778            (AutoTransientTable.UniqueValues): Adapt to new table interface
7779    
7780            * Thuban/Model/layer.py (Layer.SetShapeStore, Layer.GetFieldType):
7781            Adapt to new table interface
7782    
7783            * test/test_layer.py (TestLayer.open_shapefile): Helper method to
7784            simplify opening shapefiles a bit easier.
7785            (TestLayer.test_arc_layer, TestLayer.test_polygon_layer)
7786            (TestLayer.test_point_layer): Use the new helper method
7787            (TestLayer.test_get_field_type): New. Test for the GetFieldType
7788            method
7789    
7790            * test/test_dbf_table.py (TestDBFTable.test_has_column): Test for
7791            the new table method
7792    
7793            * test/test_memory_table.py (TestMemoryTable.test_has_column):
7794            Test for the new table method HasColumn
7795    
7796    2003-05-06  Jonathan Coles   <[email protected]>
7797    
7798            Addresses the "Selection Extent" wish of RTbug #1787.
7799    
7800            * Resources/Bitmaps/fulllayerextent.xpm,
7801            Resources/Bitmaps/fullselextent.xpm: Bitmaps for layer and selection
7802            extent. These are just place holders for the real bitmaps.
7803    
7804            * Thuban/Model/layer.py (Shape): Since a Shape is immutable only
7805            calculate the bounding box once (the first time compute_bbox() is
7806            called).
7807            (Layer.ShapesBoundingBox): New. Given a list of shape ids, return
7808            the bounding box for the shapes in lat/long coordinates.
7809    
7810            * Thuban/UI/mainwindow.py: Added new "Full selection extent" menu
7811            option.
7812            (MainWindow.has_selected_shapes): New. Returns true if there are
7813            any selected shapes.
7814            (MainWindow.FullSelectionExtent): New. Calls
7815            MapCanvas.FitSelectedToWindow() when the user selects the menu option.
7816            (_has_selected_shapes): New. Returns true if there are any
7817            selected shapes.
7818    
7819            * Thuban/UI/selection.py (Selection.HasSelectedShapes): New. Returns
7820            true if there are any selected shapes.
7821    
7822            * Thuban/UI/view.py (MapCanvas): Added delegated method
7823            HasSelectedShapes.
7824            (MapCanvas.FitSelectedToWindow): New. Centers and scales any selected
7825            shapes on the canvas using the map projection (if any).
7826    
7827            * test/test_layer.py (TestLayer.test_arc_layer): Add some tests
7828            for Layer.ShapesBoundingBox().
7829    
7830    2003-05-06  Bernhard Herzog  <[email protected]>
7831    
7832            * Resources/Projections/defaults.proj: Fix spelling of Mercator
7833    
7834    2003-05-05  Jonathan Coles   <[email protected]>
7835    
7836            Addresses the "Full Layer Extent" wish of RTbug #1787.
7837    
7838            * Resources/Projections/defaults.proj: Added UK National Grid.
7839    
7840            * Thuban/UI/mainwindow.py: Added new "Full layer extent" menu option.
7841            (MainWindow.FullLayerExtent): New. Calls MapCanvas.FitLayerToWindow()
7842            when the user selects the menu option.
7843    
7844            * Thuban/UI/view.py (MapCanvas.FitLayerToWindow): New. Centers and
7845            scales the given layer on the canvas using the map projection.
7846    
7847    2003-05-05  Bernhard Herzog  <[email protected]>
7848    
7849            Convert the table implementations to a new table interface. All
7850            tables use a common mixin class to provide backwards compatibility
7851            until all table users have been updated.
7852    
7853            * Thuban/Model/table.py (OldTableInterfaceMixin): Mixin class to
7854            provide backwards compatibility for table classes implementing the
7855            new interface
7856            (DBFTable, MemoryTable): Implement the new table interface. Use
7857            OldTableInterfaceMixin as base for compatibility
7858            (DBFColumn, MemoryColumn): New. Column description for DBFTable
7859            and MemoryTable resp.
7860    
7861            * test/test_dbf_table.py: New. Test cases for the DBFTable with
7862            the new table interface.
7863    
7864            * test/test_memory_table.py: New. Test cases for the MemoryTable
7865            with the new table interface.
7866    
7867            * test/test_table.py: Document the all tests in this file as only
7868            for backwards compatibility. The equivalent tests for the new
7869            interface are in test_memory_table.py and test_dbf_table.py
7870            (MemoryTableTest.test_read): field_info should be returning tuples
7871            with four items
7872            (MemoryTableTest.test_write): Make doc-string a more precise.
7873    
7874            * Thuban/Model/transientdb.py (TransientTableBase): Convert to new
7875            table interface. Derive from from OldTableInterfaceMixin for
7876            compatibility.
7877            (TransientTableBase.create): New intance variable column_map to
7878            map from names and indices to column objects
7879            (TransientTable.create): Use the new table interface of the input
7880            table
7881            (AutoTransientTable): Convert to new table interface. Derive from
7882            from OldTableInterfaceMixin for compatibility.
7883            (AutoTransientTable.write_record): Removed. It's not implemented
7884            yet and we still have to decide how to handle writing with the new
7885            table and data framework.
7886    
7887            * test/test_transientdb.py
7888            (TestTransientTable.run_iceland_political_tests)
7889            (TestTransientTable.test_transient_joined_table): Use the new
7890            table interface
7891    
7892    2003-05-05  Jonathan Coles   <[email protected]>
7893    
7894            This is namely a collection of UI updates to improve user interactivity.
7895            Tabbing between controls now exists and you can use ESC to close dialog
7896            boxes; ENTER will active the default button.
7897    
7898            * Thuban/UI/classgen.py (ClassGenDialog.__init__): Rearrange the
7899            order that the controls are created so that tabbing works correctly.
7900            (ClassGenDialog.OnOK): Renamed from _OnGenerate() so that the
7901            wxDialog can handle the default button correctly.
7902            (ClassGenDialog.OnCancel): Renamed from _OnCloseBtn() for the
7903            same reasons as for OnOK.
7904            (GenUniformPanel._OnRetrieve): Call wxBeginBusyCursor/wxEndBusyCursor
7905            when we ask the table for the maximum/minimum values of a field
7906            which could take a very long time.
7907    
7908            * Thuban/UI/classifier.py (Classifier.__init__): Rearrange the
7909            order that the controls are created so that tabbing works correctly.
7910            (SelectPropertiesDialog.__init__): Rearrange the order that the
7911            controls are created so that tabbing works correctly.
7912    
7913            * Thuban/UI/dialogs.py: Copied NonModalDialog box and changed it
7914            to derive from a wxDialog but behave like the original implementation
7915            which was derived from a wxFrame. wxDialog provides useful key
7916            handling functionality like ESC calling OnCancel and ENTER calling
7917            OnOK which is lost with wxFrame.
7918    
7919            * Thuban/UI/mainwindow.py: Add "..." to menu items that will open
7920            new dialogs.
7921    
7922            * Thuban/UI/projdialog.py (ProjFrame.__init__): Rearrange the
7923            order that the controls are created so that tabbing works correctly.
7924            (ProjFrame.OnApply): Renamed from _OnTry() to use wxDialog behaviour.
7925            (ProjFrame.OnOK): Renamed from _OnOK() to use wxDialog behaviour.
7926            (ProjFrame.OnCancel): Renamed from _OnClose() to use wxDialog behaviour.
7927            (ProjPanel.__init__): Add "Airy" to the list of ellipsoids so we
7928            can provide the "UK National Grid" as a default projection.
7929            (UTMPanel.__init__): Rearrange the order that the controls are
7930            created so that tabbing works correctly.
7931    
7932    2003-05-05  Bernhard Herzog  <[email protected]>
7933    
7934            * extensions/thuban/wxproj.cpp: Fix some of the comments.
7935            (project_point): If a map projection but no layer projection is
7936            given, convert degrees to radians before applying the map
7937            projection.
7938    
7939            * Thuban/UI/tableview.py (TableGrid.disallow_messages)
7940            (TableGrid.allow_messages): New methods to make it possible to
7941            inhibit message sending.
7942            (TableGrid.issue): Only send the message if not inhibited.
7943            (LayerTableGrid.select_shape): Use the new methods to make sure
7944            that no ROW_SELECTED message is sent while we're updating the
7945            selected rows to match the selected shapes.
7946    
7947    2003-05-02  Jan-Oliver Wagner <[email protected]>
7948    
7949            Implementation of MemoryTable.
7950    
7951            * Thuban/Model/table.py (MemoryTable): New. Quite simple table
7952            implementation that operates on a list of tuples. All of the data
7953            are kept in the memory.
7954    
7955            * test/test_table.py (MemoryTableTest): New.
7956    
7957            * test/test_transientdb.py (SimpleTable): Removed.
7958            (TestTransientTable.test_transient_joined_table,
7959            (TestTransientTable.test_transient_table_read_twice): Replaced
7960            SimpleTable by MemoryTable.
7961    
7962    2003-04-30  Jonathan Coles   <[email protected]>
7963    
7964            * Data/iceland_sample.thuban: Now contains correct projections
7965            for each of the layers.
7966    
7967            * Resources/Projections/defaults.proj: Geographic projection
7968            contains unit conversion parameter.
7969    
7970    2003-04-30  Jonathan Coles   <[email protected]>
7971    
7972            The most important part of this putback is the projection changes.
7973            It should now be possible to specify the projection that a layer
7974            is in and then specify a different projection for the map. The
7975            projection dialog has an extra parameter for a geographic projection
7976            which lets the user select if the input is in degrees or radians.
7977    
7978            * Thuban/Model/layer.py (Layer.ShapesInRegion): Fix docstring
7979            to say that the parameter is a tuple of unprojected
7980            points (which is what the callers to this method were assuming).
7981            Also, since the points are unprojected we need to projected them.
7982    
7983            * Thuban/UI/legend.py (LegendTree.MoveCurrentItemUp,
7984            LegendTree.MoveCurrentItemDown): If the layer or any of the layer's
7985            groups are selected, move the layer up/down. Fixes RTbug #1833.
7986    
7987            * Thuban/UI/mainwindow.py: Move menu item map_rename up.
7988    
7989            * Thuban/UI/projdialog.py (ProjFrame._OnSave): Add missing
7990            parameter in call to SetClientData.
7991            (GeoPanel): Add support for selecting the units that the
7992            source data is in (Radians or Degrees).
7993    
7994            * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Optimize
7995            the rendering loop by reducing the number of if's, removing the
7996            unnecessary try/except block, and checking if the old group
7997            is the same as the new one (which happens a lot if there is
7998            no classification, or lots of shapes are in the same group).
7999    
8000            * Thuban/UI/view.py (MapCanvas.OnPaint): Add a try/except block
8001            around the redraw routine to try to catch problems that the user
8002            may create by selecting invalid projections for the data set and
8003            map. Clears the display if there are any problems and prints the
8004            error.
8005            (MapCanvas.do_redraw): Use DC.Clear() instead of drawing a filled
8006            rectangle.
8007    
8008            * extensions/thuban/wxproj.cpp (project_point): First invert the
8009            supplied point (which should be in projected coordinates) using
8010            the layer's projection and then project the point using the
8011            map's projection.
8012            (project_points): Use project_point() to project each point.
8013    
8014    2003-04-30  Jan-Oliver Wagner <[email protected]>
8015    
8016            * Thuban/Model/layer.py (Layer.SetShapeStore): Fixed a bug:
8017            don't set the Classification to None if the classfication field
8018            is None (ie only a DEFAULT).
8019    
8020    2003-04-30  Bernhard Herzog  <[email protected]>
8021    
8022            * Thuban/UI/view.py: Fix some typos.
8023    
8024            * Thuban/UI/mainwindow.py (MainWindow.identify_view_on_demand): Do
8025            not pop up the dialog if the selection becomes empty (this could
8026            happen if e.g. a new selection is opened while the identify tool
8027            is active and dialog had been closed)
8028    
8029    2003-04-30  Bernhard Herzog  <[email protected]>
8030    
8031            * Thuban/Model/transientdb.py (TransientTableBase.__init__): New
8032            instance variable read_record_last_result
8033            (TransientTableBase.read_record): Make sure reading the same
8034            record twice works. The implementation uses the new instance
8035            variable read_record_last_result
8036    
8037            * test/test_transientdb.py
8038            (TestTransientTable.test_transient_table_read_twice): New test
8039            case for the above bug-fix.
8040    
8041    2003-04-29  Jonathan Coles   <[email protected]>
8042    
8043            * Thuban/common.py: Removed. No longer needed Str2Num. RTbug #1832.
8044    
8045            * Thuban/UI/classgen.py: Remove all uses of Str2Num.
8046    
8047            * Thuban/UI/classifier.py: Remove all uses of Str2Num.
8048            (ClassTable.SetValueAsCustom): Rename keyword argument in
8049            ClassGroup* constructors to match argument name.
8050    
8051    2003-04-29  Bernhard Herzog  <[email protected]>
8052    
8053            * Thuban/Model/session.py (Session.Destroy): Explicitly close the
8054            transient DB if it exists to make sure it doesn't leave a journal
8055            file in the temp directory.
8056    
8057            * Thuban/Model/transientdb.py (TransientDatabase.close): Set
8058            self.conn to None after closing the connection to make sure it's
8059            not closed twice
8060    
8061    2003-04-29  Jonathan Coles   <[email protected]>
8062    
8063            Add a visible parameter in the layer XML tag. The default value is
8064            "true". If anything other than "false" is specified we also assume
8065            "true". Addresses RTbug #1025.
8066    
8067            * Doc/thuban.dtd: Add visible parameter to a layer.
8068    
8069            * Thuban/Model/layer.py (BaseLayer.__init__): Change default value
8070            of visible from 1 to True.
8071            (Layer.__init__): Change default value of visible from 1 to True.
8072    
8073            * Thuban/Model/load.py (SessionLoader.start_layer): Read visible
8074            parameter.
8075    
8076            * Thuban/Model/save.py (SessionSaver.write_layer): Save visible
8077            parameter.
8078    
8079            * test/test_load.py: Add new test data contents_test_visible.
8080            (LoadSessionTest.setUp): save test data.
8081            (LoadSessionTest.testLayerVisibility): Test if the visible flag
8082            is loaded correctly.
8083    
8084            * test/test_save.py (SaveSessionTest.testSingleLayer): Add test
8085            for saving an invisible layer.
8086    
8087    2003-04-29  Jonathan Coles   <[email protected]>
8088    
8089            * Thuban/UI/mainwindow.py (MainWindow.SetMap): Look up the
8090            legend dialog box and tell it to change its map to the one
8091            supplied to SetMap(). Fixes RTbug #1770.
8092    
8093    2003-04-29  Bernhard Herzog  <[email protected]>
8094    
8095            Next step of table implementation. Introduce a transient database
8096            using SQLite that some of the data is copied to on demand. This
8097            allows us to do joins and other operations that require an index
8098            for good performance with reasonable efficiency. Thuban now needs
8099            SQLite 2.8.0 and pysqlite 0.4.1. Older versions may work but I
8100            haven't tested that.
8101            
8102            * Thuban/Model/transientdb.py: New. Transient database
8103            implementation.
8104    
8105            * test/test_transientdb.py: New. Tests for the transient DB
8106            classes.
8107    
8108            * Thuban/Model/session.py (AutoRemoveFile, AutoRemoveDir): New
8109            classes to help automatically remove temporary files and
8110            directories.
8111            (Session.__init__): New instance variables temp_dir for the
8112            temporary directory and transient_db for the SQLite database
8113            (Session.temp_directory): New. Create a temporary directory if not
8114            yet done and return its name. Use AutoRemoveDir to have it
8115            automatically deleted
8116            (Session.TransientDB): Instantiate the transient database if not
8117            done yet and return it.
8118    
8119            * Thuban/Model/data.py (ShapefileStore.__init__): Use an
8120            AutoTransientTable so that data is copied to the transient DB on
8121            demand.
8122            (SimpleStore): New class that simply combines a table and a
8123            shapefile
8124    
8125            * Thuban/Model/table.py (Table, DBFTable): Rename Table into
8126            DBFTable and update its doc-string to reflect the fact that this
8127            is only the table interface to a DBF file. Table is now an alias
8128            for DBFTable for temporary backwards compatibility.
8129    
8130            * Thuban/UI/application.py (ThubanApplication.OnExit): Make sure
8131            the last reference to the session goes away so that the temporary
8132            files are removed properly.
8133    
8134            * test/test_load.py (LoadSessionTest.tearDown): Remove the
8135            reference to the session to make sure the temporary files are
8136            removed.
8137    
8138    2003-04-29  Bernhard Herzog  <[email protected]>
8139    
8140            * Thuban/Model/load.py (XMLReader.__init__, XMLReader.read): Turn
8141            the __parser instance variable into a normal local variable in
8142            read. It's only used there and read will never be called more than
8143            once. Plus it introduces a reference cycle that keeps can keep the
8144            session object alive for a long time.
8145    
8146    2003-04-29  Jonathan Coles   <[email protected]>
8147    
8148            * Thuban/Model/proj.py (Projection): Removed Set*() methods to make
8149            Projection an immutable item. Fixes RTbug #1825.
8150            (Projection.__init__): Initialize instance variables here.
8151            (ProjFile.Replace): New. Replace the given projection object with
8152            the new projection object. This solves the problem of needing the
8153            mutator Projection.SetProjection() in the ProjFrame class and
8154            allows a projection to change parameters without changing its
8155            location in the file.
8156    
8157            * Thuban/UI/mainwindow.py (MainWindow.SaveSessionAs): Dialog should
8158            be of type wxSAVE and should verify overwriting a file.
8159    
8160            * Thuban/UI/projdialog.py (ProjFrame._OnSave): Use the new
8161            ProjFile.Replace() method instead of the mutator
8162            Projection.SetProjection(). Also requires that we reassign the
8163            client data to the new projection.
8164    
8165            * test/test_proj.py (TestProjection.test): Test GetName() and
8166            GetAllParameters()
8167            (TestProjFile.test): Remove tests for Set*() methods. Add tests
8168            for Replace().
8169    
8170    2003-04-25  Jonathan Coles   <[email protected]>
8171    
8172            * Thuban/Model/save.py (SessionSaver.write_projection): Make sure
8173            to save the name of the projection.
8174    
8175            * test/test_save.py (SaveSessionTest.testLayerProjection): New
8176            test to verify layer projections are saved correctly.
8177    
8178    2003-04-25  Jonathan Coles   <[email protected]>
8179    
8180            * Thuban/Model/proj.py (Projection.SetName): Set the name
8181            to "Unknown" if name is None.
8182            (Projection.SetAllParameters): New. Set the projection's
8183            parameter list to the one supplied.
8184            (Projection.SetProjection): New. Set the projection's
8185            properties to those of the supplied Projection.
8186    
8187            * Thuban/UI/mainwindow.py (MainWindow.MapProjection): Set
8188            the dialog title to include the map's title.
8189            (MainWindow.LayerProjection): Set the dialog title to include
8190            the layer's title.
8191    
8192            * Thuban/UI/projdialog.py (ProjFrame.__ShowError): Consolidate
8193            error dialogs into a single method call.
8194            (ProjFrame.__VerifyButtons): Add more states to check.
8195            (ProjFrame.__GetProjection): Return the current state of an
8196            edited projection or None.
8197            (ProjFrame.__FillAvailList): Remove checks for states that
8198            shouldn't exist.
8199            (ProjFrame._OnNew): Clear all selected items and supply
8200            a projection panel if necessary.
8201    
8202            * test/test_proj.py (TestProjFile.test): Add tests for
8203            ProjFile.SetAllParameters, ProjFile.SetProjection,
8204            ProjFile.SetName.
8205    
8206    2003-04-25  Jonathan Coles   <[email protected]>
8207    
8208            * Thuban/UI/projdialog.py (ProjFrame.__FillAvailList): Now
8209            takes an optional argument to select the current projection.
8210            This does not guarantee that the item is visible due to
8211            limited wxWindows functionality. Fixes RTBug #1821.
8212    
8213    2003-04-25  Jonathan Coles   <[email protected]>
8214    
8215            * Thuban/Model/load.py (SessionLoader.start_projection): Remember
8216            the projection name and use it when constructing the Projection
8217            object.
8218    
8219            * Thuban/Model/proj.py (Projection.__init__): Change the default
8220            value for 'name' to None and then test if name is equal to None
8221            in the body of the constructor. This way the caller doesn't have to
8222            know what the default value should be. Namely, useful in load.py
8223            where we have to pick a default value if the 'name' parameter
8224            doesn't exist in the XML file.
8225    
8226            * test/test_load.py (LoadSessionTest.testLayerProjection): New.
8227            Tests a file where a layer has a projection.
8228    
8229    2003-04-25  Jonathan Coles   <[email protected]>
8230    
8231            * Thuban/Model/layer.py (Layer.TreeInfo): Add an item to the
8232            tree for projection information.
8233    
8234            * Thuban/Model/load.py (XMLReader.GetFilename): Renamed from
8235            XMLReader.GetFileName.
8236            (SessionLoader): Added support for loading projection tags that
8237            appear inside a layer.
8238    
8239            * Thuban/Model/proj.py (ProjFile): Document the class. Move
8240            back to using a list because the order of the projections in
8241            the file is important to maintain. Fixes RTbug #1817.
8242    
8243            * Thuban/Model/resource.py: Rename calls to ProjFile.GetFileName
8244            to ProjFile.GetFilename.
8245    
8246            * Thuban/Model/save.py (SessionSaver.write_layer): Save projection
8247            information.
8248    
8249            * Thuban/UI/projdialog.py (ProjFrame._OnAddToList): Renamed from
8250            ProjFrame._OnSaveAs. Removed old dead code from previous
8251            implementation.
8252            (ProjFrame._OnExport): Add support for exporting more than one
8253            projection to a single file.
8254            (ProjFrame.__FillAvailList): use string formatting (% operator)
8255            to build strings that are (partly) translated. Fixes RTbug #1818.
8256    
8257            * test/test_proj.py (TestProjFile.test): New. Tests the base ProjFile
8258            class.
8259    
8260    2003-04-24  Bernhard Herzog  <[email protected]>
8261    
8262            * po/es.po: Updated Spanish translation by Daniel Calvelo Aros
8263    
8264            * po/fr.po: New. French translation by Daniel Calvelo Aros
8265    
8266            * Thuban/UI/projdialog.py (ProjFrame._OnSaveAs): Don't translate
8267            empty strings.
8268    
8269    2003-04-24  Jonathan Coles   <[email protected]>
8270    
8271            * Thuban/Model/layer.py (Layer.GetProjection): New. Needed to
8272            implement the interface that the ProjFrame dialog expects.
8273    
8274            * Thuban/Model/proj.py (Projection.SetName): New. Allows the
8275            name of the projection to be changed.
8276            (ProjFile): Use a dictionary instead of a list so that removing
8277            projections is easier and we are sure about uniqueness.
8278            (ProjFile.Remove): Remove the given projection object.
8279    
8280            * Thuban/Model/resource.py (GetSystemProjFiles, GetUserProjFiles):
8281            Return a list with only one projection file instead of searching for
8282            any projection file. This simplifies many things if the user can
8283            only have one system file and one user file.
8284    
8285            * Thuban/UI/classgen.py: Change all references to
8286            genCombo to genChoice.
8287    
8288            * Thuban/UI/mainwindow.py: Add a Projection option under the
8289            layer menu.
8290            (MainWindow.LayerProjection): New. Open up a projection window
8291            for a layer.
8292    
8293            * Thuban/UI/projdialog.py: Large changes to how the dialog is
8294            laid out. Use three panels instead of one. One for the list of
8295            projections, one for the edit controls, and one for the buttons.
8296            Fixed resizing problems so that the dialog resizes correctly
8297            when the projection panel changes. Added import/export, save, and
8298            new buttons/functionality.
8299    
8300    2003-04-24  Bernhard Herzog  <[email protected]>
8301    
8302            First step towards table management. Introduce a simple data
8303            abstraction so that we replace the data a layer uses more easily
8304            in the next step.
8305    
8306            * Thuban/Model/data.py: New file with a simple data abstraction
8307            that bundles shapefile and dbffile into one object.
8308    
8309            * Thuban/Model/session.py (Session.OpenShapefile): New method to
8310            open shapefiles and return a shape store object
8311    
8312            * Thuban/Model/layer.py (Layer.__init__): Pass the data as a store
8313            object instead of a shapefile filename. This introduces a new
8314            instance variable store holding the datastore. For intermediate
8315            backwards compatibility keep the old instance variables.
8316            (open_shapefile): Removed. No longer needed with the shape store.
8317            (Layer.SetShapeStore, Layer.ShapeStore): New methods to set and
8318            get the shape store used by a layer.
8319            (Layer.Destroy): No need to explicitly destroy the shapefile or
8320            table anymore.
8321    
8322            * Thuban/UI/mainwindow.py (MainWindow.AddLayer)
8323            (MainWindow.AddLayer): Use the session's OpenShapefile method to
8324            open shapefiles
8325    
8326            * Thuban/Model/load.py (ProcessSession.start_layer): Use the
8327            session's OpenShapefile method to open shapefiles
8328    
8329            * test/test_classification.py
8330            (TestClassification.test_classification): Use the session's
8331            OpenShapefile method to open shapefiles and build the filename in
8332            a more platform independed way
8333    
8334            * test/test_layer.py (TestLayer.setUp, TestLayer.tearDown):
8335            Implement to have a session to use in the tests
8336            (TestLayer.test_arc_layer, TestLayer.test_polygon_layer)
8337            (TestLayer.test_point_layer, TestLayer.test_empty_layer): Use the
8338            session's OpenShapefile method to open shapefiles
8339            (TestLayerLegend.setUp): Instantiate a session so that we can use
8340            it to open shapefiles.
8341            (TestLayerLegend.tearDown): Make sure that all references to
8342            layers and session are removed otherwise we may get a resource
8343            leak
8344    
8345            * test/test_map.py (TestMapAddLayer.test_add_layer)
8346            (TestMapWithContents.setUp): Instantiate a session so that we can
8347            use it to open shapefiles.
8348            (TestMapWithContents.tearDown): Make sure that all references to
8349            layers, maps and sessions are removed otherwise we may get a
8350            resource leak
8351            ("__main__"): use support.run_tests() so that more info about
8352            uncollected garbage is printed
8353    
8354            * test/test_save.py (SaveSessionTest.testSingleLayer): Use the
8355            session's OpenShapefile method to open shapefiles
8356            ("__main__"): use support.run_tests() so that more info about
8357            uncollected garbage is printed
8358    
8359            * test/test_selection.py (TestSelection.tearDown): Make sure that
8360            all references to the session and the selection are removed
8361            otherwise we may get a resource leak
8362            (TestSelection.get_layer): Instantiate a session so that we can
8363            use it to open shapefiles.
8364            ("__main__"): use support.run_tests() so that more info about
8365            uncollected garbage is printed
8366    
8367            * test/test_session.py (TestSessionBase.tearDown)
8368            (TestSessionWithContent.tearDown): Make sure that all references
8369            to the session and layers are removed otherwise we may get a
8370            resource leak
8371            (TestSessionWithContent.setUp): Use the session's OpenShapefile
8372            method to open shapefiles
8373    
8374    2003-04-24  Jonathan Coles   <[email protected]>
8375    
8376            * Thuban/Model/load.py (XMLReader.read): Should have been checking
8377            if the file_or_filename object had the 'read' attribute.
8378    
8379    2003-04-23  Jonathan Coles   <[email protected]>
8380    
8381            * Thuban/Model/resource.py: Fixes RTbug #1813.
8382            (ReadProjFile): Add documentation about which exceptions are raised.
8383            Always pass the exceptions up to the caller.
8384            (GetProjFiles): If the directory can't be read return an empty list.
8385            If any of the proj files can't be read skip that file and go
8386            on to the next one.
8387    
8388            * test/test_proj.py: Added test cases to handle nonexistent files,
8389            unreadable files, and files that don't parse correctly.
8390    
8391    2003-04-23  Jonathan Coles   <[email protected]>
8392    
8393            Projection dialog. Allows the user to select from a list
8394            of projection templates and optionally edit them and save new ones.
8395    
8396            * Thuban/UI/projdialog.py (ProjFrame): New. Main dialog.
8397            (ProjPanel): Base class for projection specific panels.
8398            (TMPanel): Projection panel for Transverse Mercartor.
8399            (UTMPanel): Projection panel for Universal Transverse Mercartor.
8400            (LCCPanel): Projection panel for Lambert Conic Conformal.
8401            (GeoPanel): Projetion panel for Geographic Projection.
8402    
8403    2003-04-23  Jonathan Coles   <[email protected]>
8404    
8405            * Thuban/Model/load.py (XMLReader): Renamed from XMLProcessor to
8406            promote symmetry. There now exists XMLReader and XMLWriter.
8407            (XMLReader.read): New. Call to read the given file descriptor or
8408            filename.
8409            (XMLReader.close): New. Make sure the file is closed.
8410            (XMLReader.GetFileName): New. Return just the file name that is being
8411            read from.
8412            (XMLReader.GetDirectory): New. Return just the directory of the file
8413            that is being read.
8414            (XMLReader.AddDispatchers): New. Take a dictionary which contains
8415            the names of functions to call as the XML tree is parsed.
8416            (XMLReader.startElementNS): Updated to use new dispatcher dictionary.
8417            (XMLReader.endElementNS): Updated to use new dispatcher dictionary.
8418            (SessionLoader): Removed class variables start_dispatcher and
8419            end_dispatcher since this functionality is now part of a class
8420            instance. Fixes RTbug #1808.
8421            (SessionLoader.__init__): Add dispatcher functions.
8422            (load_xmlfile): Code was moved into the XMLReader.read().
8423            (load_session): Use modified SessionLoader.
8424    
8425            * Thuban/Model/map.py (Map.GetProjection): New. Returns the
8426            map's projection.
8427    
8428            * Thuban/Model/proj.py (Projection.GetParameters): Renamed to
8429            GetAllParameters.
8430            (Projection.GetParameter): Returns the value for the given parameter.
8431    
8432            * Thuban/Model/resource.py: Use XMLReader and XMLWriter.
8433            (GetProjFiles): Renamed from GetProjections. Now returns a list
8434            of ProjFile objects.
8435            (GetSystemProjFiles): Renamed from GetSuppliedProjections. Returns
8436            a list of ProjFile objects whose files are not user defined.
8437            (GetUserProjFiles): Renamed from GetUserProjections. Returns a
8438            list of ProjFile objects whose files are user defined.
8439            (ProjFileReader): Extend new XMLReader.
8440    
8441            * Thuban/Model/save.py (XMLWriter): Renamed from XMLSaver to
8442            promote symmetry.
8443    
8444            * Thuban/UI/classgen.py (ClassGenDialog.__init__): Use a wxChoice
8445            control instead of a wxComboBox. wxChoice controls do not generate
8446            events as the uses highlights possible choices which fixes problems
8447            with resizing the dialog when the use selects an option.
8448    
8449            * Thuban/UI/classifier.py (Classifier.__init__): Use a wxChoice
8450            control instead of a wxComboBox.
8451    
8452            * Thuban/UI/mainwindow.py (MainWindow.Projection): Use new projection
8453            dialog.
8454    
8455            * test/test_proj.py (TestProjection.test): New tests for GetParameter
8456            method.
8457    
8458    2003-04-22  Bernhard Herzog  <[email protected]>
8459    
8460            * Thuban/UI/mainwindow.py: Remove some unused imports and global
8461            constants
8462    
8463            * Thuban/UI/identifyview.py (IdentifyListCtrl.selected_shape)
8464            (IdentifyGridCtrl.selected_shape): Use table, not shapetable.
8465    
8466    2003-04-17  Bernhard Herzog  <[email protected]>
8467    
8468            * Thuban/Model/layer.py: Don't import LAYER_LEGEND_CHANGED.
8469            (Layer): Update doc-string since LAYER_LEGEND_CHANGED is not used
8470            anymore.
8471            (Layer.BoundingBox, Layer.GetFieldType, Layer.NumShapes)
8472            (Layer.ShapeType, Layer.Shape): No need to call
8473            self.open_shapefile since it's always called in __init__
8474    
8475            * Thuban/UI/application.py (ThubanApplication.MainLoop): Removed.
8476            In wxPython 2.4 there's no need to extend MainLoop anymore since
8477            wxPython itself makes sure OnExit is called.
8478    
8479    2003-04-16  Jonathan Coles   <[email protected]>
8480    
8481            Initial putback of projection management code. Includes new
8482            classes to read and write projection files. The current load
8483            and save classes were abstracted a bit so they could be reused.
8484            The Projection class was extended to provide new methods and
8485            have a name.
8486    
8487            * Thuban/Model/load.py (XMLProcessor): New. Contains all the
8488            general XML reading methods that were part of ProcessSession.
8489    
8490            * Thuban/Model/proj.py (Projection.__init__): Accepts an optional
8491            name.
8492            (ProjFile): New. Represents a file that contains projection
8493            information.
8494    
8495            * Thuban/Model/resource.py: New. Contains general utilities
8496            for read and writing projection files.
8497    
8498            * Thuban/Model/save.py (XMLSaver): New. Contains all the
8499            general XML writing methods that were part of SessionSaver.
8500            (SessionSaver): Renamed from Saver.
8501    
8502            * test/test_proj.py: New test cases for the projection
8503            file read and write functions.
8504    
8505    2003-04-16  Jonathan Coles   <[email protected]>
8506    
8507            * Thuban/Model/classification.py: Use repr() around values
8508            in the ClassGroup*.__repr__() methods so it is clearer when
8509            a value is a string and when it is a number.
8510    
8511            * test/test_load.py: Rework the classification test to test
8512            that we can load old files.
8513            (testLabels): Test a file where the groups have labels.
8514    
8515    2003-04-16  Bernhard Herzog  <[email protected]>
8516    
8517            Safer implementation of the performance enhancements of the
8518            low-level renderer:
8519            
8520            * extensions/thuban/wxproj.cpp (extract_projection)
8521            (extract_pointer): Rename extract_projection to extract_pointer
8522            and redefine its purpose to return the pointer stored in a CObject
8523            returned by the object's cobject method. Update all callers.
8524            (s_draw_info, free_draw_info, draw_polygon_init): Implement the
8525            handling of these low-level parameters so that each s_draw_info
8526            instance is handled as a CObject at python level that also
8527            contains real references to the actual python objects which
8528            contain the values in the struct. Add free_draw_info as the
8529            destructor.
8530            (draw_polygon_shape): Add the py_draw_info parameter which must a
8531            cobject containing an s_draw_info pointer.
8532    
8533            * Thuban/UI/renderer.py (MapRenderer.polygon_render_param): New
8534            method to instantiat the low-level render parameter
8535            (MapRenderer.draw_shape_layer): Use the new method. Remove some
8536            commented out code.
8537            (MapRenderer.draw_polygon_shape): Make the first parameter not the
8538            layer but the low-level render parameter
8539            (ScreenRenderer.draw_shape_layer): Use the low-level render
8540            parameter.
8541    
8542    2003-04-15  Jonathan Coles   <[email protected]>
8543    
8544            * Thuban/Model/classification.py: Implemented __repr__ for
8545            the ClassGroup* classes to make debugging a bit easier.
8546            (ClassGroup.SetLabel): Check that the string is an instance
8547            of StringTypes not StringType. Accounts for Unicode strings.
8548    
8549            * Thuban/Model/color.py: Implemented __repr__ to make
8550            debugging a bit easier.
8551    
8552            * Thuban/Model/save.py (Saver.write_classification): Need to
8553            save the group label.
8554    
8555            * test/test_load.py (testClassification): New. Loads the
8556            iceland_sample_test.thuban file and checks if it was loaded
8557            correctly.
8558    
8559    2003-04-15  Jonathan Coles   <[email protected]>
8560    
8561            * extensions/thuban/wxproj.cpp (draw_polygon_init): New. Used
8562            to improve rendering performance by initializing the variables
8563            that are not change each time draw_polygon_shape() is called.
8564            The values are stored in a global struct draw_info.
8565            (draw_polygon_shape): Removed initialization code that is
8566            now in draw_polygon_init().
8567    
8568            * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Make
8569            drawing initialization call to draw_polygon_init()
8570            (MapRenderer.draw_polygon_shape): Use new signature of
8571            draw_polygon_shape.
8572    
8573            * Thuban/UI/classgen.py (GenUniformPanel): Fix spin control
8574            weirdness by setting the range to (1, maxint).
8575    
8576            * Thuban/Model/classification.py (ClassGroupProperties): Make
8577            instance variables private and optimize comparison operator
8578            by first checking if the color references are the same.
8579            (ClassGroupSingleton): Make instance variables private.
8580            (ClassGroupRange): Make instance variables private.
8581    
8582            * HOWTO-Release: Filled in missing steps for releasing packages.
8583    
8584    2003-04-15  Bernhard Herzog  <[email protected]>
8585    
8586            First stab at internationalized messages:
8587    
8588            * Thuban/__init__.py (_): Implement the translation function for
8589            real using the python gettext module.
8590    
8591            * Thuban/UI/classifier.py (ClassTable.GetRowLabelValue): Don't
8592            translate empty strings.
8593    
8594            * Thuban/UI/application.py (ThubanApplication.read_startup_files):
8595            Add a missing space to a warning message
8596    
8597            * po/README: New. Notes about the management of the translation
8598            files.
8599    
8600            * po/Makefile: New. Makefile to help manage the translation files.
8601    
8602            * po/es.po: New. Spanish translation by Daniel Calvelo Aros
8603    
8604            * MANIFEST.in: Include the *.mo files in Resources/Locale and the
8605            translations and support files in po/
8606    
8607            * setup.py (data_files): Add the *.mo files to the data_files too
8608    
8609            * README: Add note about the translations when building from CVS
8610    
8611    2003-04-14  Jonathan Coles   <[email protected]>
8612    
8613            * Thuban/UI/dock.py: Fixes some window resizing problems most
8614            noticable under windows. Always assume the button bitmaps will
8615            be there. Code clean up.
8616            (DockabelWindow.Dock, DockableWindow.UnDock): Force all the
8617            images for the dock/undock button to the same images.
8618            Work around for RTbug #1801.
8619    
8620            * Thuban/UI/legend.py (LegendPanel.__init__): The toolbar should
8621            be allowed to grow within the sizer. Fixes a bug under Windows
8622            where the toolbar wasn't being drawn.
8623    
8624    2003-04-14  Frank Koormann   <[email protected]>
8625    
8626            * Resources/Bitmaps/dock_12.xpm, Resources/Bitmaps/undock_12.xpm:
8627            Updated design to try to make the button functionality more
8628            transparent.
8629    
8630    2003-04-14  Jonathan Coles   <[email protected]>
8631    
8632            * Thuban/UI/legend.py (LegendPanel.__init__): Call Create() to
8633            finalize the intialization of the panel.
8634    
8635            * Thuban/UI/dock.py (DockPanel.Create): New. Finalizes the
8636            creation of the panel. Should be the last thing called in the
8637            initializer of a subclass.
8638    
8639            * Thuban/UI/classgen.py (ClassGenDialog.__init__): Actively
8640            set the current selections in the combo boxes. This is needed
8641            under Windows.
8642    
8643            * Thuban/UI/classifier.py (Classifier.__init__): Add a top
8644            level panel to the dialog so that the background colors are
8645            consistent under Windows.
8646    
8647    2003-04-11  Jonathan Coles   <[email protected]>
8648    
8649            * Thuban/UI/classgen.py: Change color ramps to start at white
8650            not black.
8651    
8652            * Thuban/UI/legend.py: Enable/disable the legend buttons when
8653            the legend changes. Fixes RTbug #1793.
8654    
8655            * test/test_classification.py: Added test for copying of
8656            classifications.
8657    
8658    2003-04-11  Jonathan Coles   <[email protected]>
8659    
8660            * Thuban/UI/resource.py: New. Centralize the loading of resources
8661            such as bitmaps.
8662    
8663            * Thuban/UI/classgen.py (GenUniquePanel.__init__): Reordered buttons,
8664            added images to the move buttons, added 'reverse' button.
8665            (CustomRampPanel.__init__): Added images to the move buttons.
8666            (GreyRamp): New. Generates a ramp from white to black.
8667            (HotToColdRamp): New. Generates a ramp from cold to hot colors.
8668    
8669            * Thuban/UI/classifier.py: Refactored ID's from ID_CLASSIFY_* to
8670            ID_PROPERTY_*.
8671            (Classifier.__init__): Minor changes to the layout.
8672            (Classifier._OnTitleChanged): Listen for when the user edits the
8673            title and update the dialog's title and the layer's title.
8674    
8675            * Thuban/UI/dock.py: Use new bitmaps for the control buttons.
8676    
8677            * Thuban/UI/legend.py: Use new bitmaps for the control buttons.
8678            (LegendTree._OnMsgLayerTitleChanged): Change the displayed title
8679            if the layer's title changes.
8680    
8681            * Thuban/UI/mainwindow.py: Added new menu item and associated code
8682            to open a dialog to rename the map.
8683            (MainWindow): Use new resource class to import bitmaps.
8684    
8685    2003-04-11  Jonathan Coles   <[email protected]>
8686    
8687            * Resources/Bitmaps/close_12.xpm, Resources/Bitmaps/dock_12.xpm,
8688            Resources/Bitmaps/group_use.xpm, Resources/Bitmaps/group_use_all.xpm,
8689            Resources/Bitmaps/group_use_none.xpm,
8690            Resources/Bitmaps/group_use_not.xpm,
8691            Resources/Bitmaps/hide_layer.xpm,
8692            Resources/Bitmaps/layer_properties.xpm,
8693            Resources/Bitmaps/lower_layer.xpm, Resources/Bitmaps/raise_layer.xpm,
8694            Resources/Bitmaps/show_layer.xpm, Resources/Bitmaps/undock_12.xpm:
8695            New.
8696    
8697    2003-04-10  Jonathan Coles   <[email protected]>
8698    
8699            * Thuban/Model/classification.py: (ClassGroupRange.__init__):
8700            Should pass group to ClassGroup constructor.
8701    
8702    2003-04-10  Jonathan Coles   <[email protected]>
8703    
8704            * Thuban/Model/classification.py: (ClassGroup): Move all the common
8705            methods of the derived classes ([Set|Get]Properties(), __eq__, __ne__)
8706            here. Implement SetVisible(), IsVisible().
8707            (ClassGroup.__init__): Add group parameter which acts as a copy
8708            constructor.
8709    
8710            * Thuban/UI/classifier.py (ClassTable): Add a new column for the
8711            "Visible" check boxes.
8712            (Classifier): Rename the buttons and refactor the code to match
8713            the new labels.
8714    
8715            * Thuban/UI/legend.py: Classify button is now called "Properties".
8716            Refactored the code to change variable names.
8717            (LegendTree.__FillTreeLayer): Only list a group if it is visible.
8718    
8719            * Thuban/UI/mainwindow.py: MainWindow.OpenClassifier renamed to
8720            MainWindow.OpenLayerProperties. MainWindow.LayerEditProperties
8721            renamed to MainWindow.LayerEditProperties.
8722            (MainWindow.ToggleLegend): Don't include map name in legend title.
8723            (MainWindow.SetMap): Added the map name to the window title.
8724            (MainWindow.LayerFillColor, MainWindow.LayerTransparentFill,
8725            MainWindow.LayerOutlineColor, MainWindow.LayerNoOutline): Removed.
8726            Functionality is found in the layer properties dialog.
8727    
8728            * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Only
8729            draw visible groups.
8730    
8731    2003-04-09  Jonathan Coles   <[email protected]>
8732    
8733            * Thuban/UI/classgen.py: Modifications to allow simple
8734            addition and selection of new color schemes.
8735            (MonochromaticRamp): New. Generates a ramp between two colors.
8736            (RedRamp): New. Generates a ramp of all red.
8737            (GreenRamp): New. Generates a ramp of all green.
8738            (BlueRamp): New. Generates a ramp of all blue.
8739    
8740    2003-04-09  Jonathan Coles   <[email protected]>
8741    
8742            * Thuban/Model/classification.py (Classification.__deepcopy__):
8743            Need to copy over field and fieldType attributes.
8744    
8745            * Thuban/Model/table.py (Table.field_range): New. Retrive the
8746            maximum and minimum values over the entire table for a given
8747            field.
8748            (Table.GetUniqueValues): New. Retrieve all the unique values
8749            in the table for a given field.
8750    
8751            * Thuban/UI/classgen.py: Renamed GenRangePanel to GenUniformPanel.
8752            (GenUniquePanel): New. Controls to allow the user to select
8753            which unique field values they would like in the classification.
8754            (CustomRampPanel): Code that was in ClassGenDialog that allows
8755            the user to select the properties for a custom ramp.
8756            (ClassGenerator.GenUniformDistribution): Was called GenerateRanges.
8757    
8758            * Thuban/UI/classifier.py: Removed a lot of debugging code.
8759            (Classifier._SetClassification): Callback method so that the
8760            class generator can set the classification in the grid.
8761            (ClassGroupPropertiesCtrl): New. Encapsulates the drawing and
8762            editing of a group properties class into a wxWindows control.
8763    
8764            * Thuban/UI/dock.py: It was decided that if the user closes
8765            a dockable window the window should simply hide itself. That
8766            way if the user wants to show the dock again it appears in the
8767            same place as it was when it was closed.
8768            (DockableWindow.Destroy): Call renamed method OnDockDestroy().
8769            (DockableWindow._OnButtonClose): Hide the window instead of
8770            destroying it.
8771            (DockableWindow._OnClose): Hide the window instead of
8772            destroying it.
8773    
8774            * Thuban/UI/legend.py (LegendTree): Use a private method to
8775            consistently set the font and style of the text. Fixes RTbug #1786.
8776    
8777            * Thuban/UI/mainwindow.py: Import just the Classifier class.
8778    
8779    2003-04-07  Bernhard Herzog  <[email protected]>
8780    
8781            * Thuban/UI/mainwindow.py (main_menu): Move the toggle_legend item
8782            to the map module
8783    
8784    2003-04-07  Bernhard Herzog  <[email protected]>
8785    
8786            * Thuban/UI/mainwindow.py (MainWindow.ShowSessionTree): Removed in
8787            favor of ToggleSessionTree
8788            (MainWindow.ToggleSessionTree): New method to toggle visibility of
8789            the session tree.
8790            (MainWindow.SessionTreeShown): New method to return whether the
8791            session tree is currently shown.
8792            (MainWindow.ToggleLegend): New method to toggle visibility of the
8793            legend
8794            (MainWindow.ShowLegend): Implement in terms of ToggleLegend and
8795            LegendShown
8796            (MainWindow.LegendShown): New method to return whether the legend
8797            is currently shown.
8798            (_method_command): Add checked parameter so we can define check
8799            menu items
8800            (_has_tree_window_shown, _has_legend_shown): Use the appropriate
8801            mainwindow methods.
8802            (show_session_tree, show_legend commands): Removed.
8803            (toggle_session_tree, toggle_legend commands): New commands to
8804            toggle the visibility of the dialogs
8805    
8806    2003-04-07  Jonathan Coles   <[email protected]>
8807    
8808            * Thuban/UI/classgen.py: Fix Windows problem.
8809    
8810            * Thuban/UI/dock.py: Fix Windows problem.
8811    
8812            * Thuban/UI/mainwindow.py: Use False instead of false.
8813            (MainWindow.ShowLegend): Remove unnecessary switch parameter.
8814    
8815    2003-04-07  Jonathan Coles   <[email protected]>
8816    
8817            Since we now say that the order of the groups in a classification
8818            matters, it makes sense to be able to manipulate that order. Most
8819            of the changes to Thuban/Model/classification.py are to that end.
8820    
8821            * Thuban/Model/classification.py (Classification.AppendGroup,
8822            Classification.InsertGroup, Classification.ReplaceGroup,
8823            Classification.RemoveGroup, Classification.GetGroup): Do as the
8824            names imply.
8825            (Classification.FindGroup): This was called GetGroup, but GetGroup
8826            takes an index, while FindGroup takes a value.
8827            (Classification.__deepcopy__): Copy all the groups, BUT NOT THE LAYER
8828            REFERENCE. Currently there is a cyclic reference between the layer
8829            and its classification. If the classification doesn't need to know
8830            its owning layer we can change this, since it may make sense to be
8831            able to use the same classification with different layers.
8832    
8833            * Thuban/Model/load.py: Use Classification.AppendGroup(), not AddGroup()
8834    
8835            * Thuban/UI/classgen.py: Use Classification.AppendGroup(),
8836            not AddGroup()
8837    
8838            * Thuban/UI/classifier.py: Now that we can depend on the order in
8839            a Classification and have methods to manipulate that order we don't
8840            need to use our own data structures in the grid. We can simply make
8841            the grid/table access the information they need from a copy of
8842            the classification object.
8843            (Classifier._OnCloseBtn): Event handler for when the user clicks
8844            'Close'. This is needed so if the user applies changes and then
8845            continues to change the table the user has the option of discarding
8846            the most recent changes and keeping what they applied.
8847    
8848            * Thuban/UI/mainwindow.py: Put "Show Legend" and "Show Session Tree"
8849            into the same group.
8850    
8851            * extensions/thuban/wxproj.cpp (check_version): If Thuban is compiled
8852            with a really old version of proj, PJ_VERSION won't even be defined.
8853            If it isn't defined then just compile so that the function always
8854            returns Py_False.
8855    
8856            * test/test_classification.py: Fix tests to use the renamed methods.
8857            Still need to write tests for the new methods.
8858    
8859    2003-04-04  Jonathan Coles   <[email protected]>
8860    
8861            * Thuban/UI/classifier.py (Classifier.__SelectField): Move the
8862            call to SetSelection out of the method and before the call
8863            to __SelectField in __init__. This prevents a recursion of events
8864            when _OnFieldSelect is triggered by the user.
8865    
8866    2003-04-04  Jonathan Coles   <[email protected]>
8867    
8868            * Thuban/Model/classification.py: Rename Color.None to
8869            Color.Transparent.
8870            (ClassGroupProperties.SetLineColori, ClassGroupProperties.SetFill):
8871            Don't bother copying the color, since Colors are immutable.
8872    
8873            * Thuban/Model/color.py, Thuban/Model/layer.py, Thuban/Model/load.py,
8874            Thuban/UI/classifier.py, Thuban/UI/mainwindow.py,
8875            Thuban/UI/renderer.py, Thuban/UI/view.py:
8876            Rename Color.None to Color.Transparent.
8877        
8878            * test/test_classification.py, test/test_load.py: Rename Color.None
8879            to Color.Transparent.
8880    
8881    2003-04-04  Jonathan Coles   <[email protected]>
8882    
8883            * Thuban/Model/classification.py: Fix assert calls.
8884            (ClassGroupProperties.SetLineColor, ClassGroupProperties.SetFill):
8885            Copy the color parameter rather than hold onto a reference.
8886    
8887            * Thuban/Model/color.py (Color.__copy__, Color.__deepcopy): Copy
8888            the color object.
8889            (NoColor.__copy__, NoColor.__deepcopy): Return 'self' so that we
8890            are sure there exists only one refernce to Color.None in the system.
8891            This allows us to use 'is' rather than the comparision functions.
8892            
8893            * Thuban/Model/save.py: Fix assert calls.
8894            
8895            * Thuban/UI/classifier.py: Fix assert calls.
8896            (ClassGrid._OnCellDClick): Call up to the classifier to open the
8897            dialog to edit the groups properties.
8898            (ClassGrid._OnCellResize): Make sure that the scollbars are drawn
8899            correctly if a cell is resized.
8900            (ClassTable.SetClassification): New. Changes the classification
8901            that is in the table.
8902            (ClassTable.__SetRow): Allow groups to be prepended.
8903            (Classifier): New code for opening the EditProperties and
8904            GenerateRanges dialogs.
8905            (SelectPropertiesDialog.__GetColor): Only set the color in the
8906            color dialog if the current color is not None.
8907            
8908            * Thuban/UI/dock.py: Fix assert calls.
8909            
8910            * Thuban/UI/legend.py: Fix assert calls.
8911            
8912            * Thuban/UI/renderer.py: Fix assert calls.
8913            
8914            * Thuban/UI/classgen.py (ClassGenDialog): Dialog for generating
8915            classifications.
8916            (GenRangePanel): Panel specific to range generation.
8917            (GenSingletonPanel): Panel specific to singleton generation.
8918            (ClassGenerator): Class responsible for actually generating
8919            the classification from the data gathered in the dialog box.
8920            (PropertyRamp): Generates properties whose values range from
8921            a starting property to an ending property.
8922    
8923    2003-04-03  Bernhard Herzog  <[email protected]>
8924    
8925            * test/support.py (print_garbage_information): New function that
8926            prints information about still connected messages and memory
8927            leaks.
8928            (run_suite): Removed.
8929            (run_tests): New function for use as a replacement of
8930            unittest.main in the test_* files. This one calls
8931            print_garbage_information at the end.
8932    
8933            * test/runtests.py (main): Use support.print_garbage_information
8934    
8935            * test/test_layer.py: Use support.run_tests instead of
8936            unittest.main so we get memory leak information
8937            (TestLayer.test_arc_layer, TestLayer.test_polygon_layer)
8938            (TestLayer.test_point_layer, TestLayer.test_empty_layer)
8939            (TestLayerLegend.test_visibility): Call the layer's Destroy method
8940            to fix a memory leak.
8941    
8942            * test/test_classification.py: Use support.run_tests instead of
8943            unittest.main so we get memory leak information
8944            (TestClassification.test_classification): Call the layer's Destroy
8945            method to fix a memory leak.
8946    
8947    2003-04-02  Bernhard Herzog  <[email protected]>
8948    
8949            * extensions/thuban/wxproj.cpp (check_version, check_version_gtk):
8950            Handle the reference counts of the return value and errors in
8951            PyArg_ParseTuple correctly.
8952    
8953            * Thuban/UI/application.py (ThubanApplication.OpenSession): Make
8954            sure the filename is absolute to avoid problems when saving the
8955            session again
8956    
8957            * Thuban/Model/table.py: Remove unnecessary import. Fix a typo.
8958    
8959    2003-04-01  Jonathan Coles   <[email protected]>
8960    
8961            *  Thuban/UI/renderer.py (MapRenderer.draw_point_shape): Check
8962            that there actually are points in the returned list of points
8963            before trying to index into the list. The list may be empty if
8964            the shape is a Null Shape.
8965    
8966    2003-04-01  Bernhard Herzog  <[email protected]>
8967    
8968            * test/test_map.py: Don't use from <module> import *
8969    
8970    2003-04-01  Jonathan Coles   <[email protected]>
8971    
8972            * Thuban/Model/session.py: Use LAYER_CHANGED instead of
8973            LAYER_LEGEND_CHANGED
8974    
8975            * Thuban/UI/dock.py (DockableWindow._OnButtonClose): Call
8976            self.Destroy() to close the window after yesterday's changes.
8977    
8978            * test/test_map.py, test/test_session.py: Fix messages that
8979            are sent from maps and layers.
8980    
8981    2003-03-31  Jonathan Coles   <[email protected]>
8982    
8983            * Thuban/UI/classifier.py: Commented out some debugging statements.
8984            (ClassDataPreviewer.Draw): Draw rectangles for polygon layers per
8985            RTbug #1769.
8986    
8987            * Thuban/UI/dock.py (DockableWindow.UnDock): Restore size and
8988            position (although position doesn't work yet under GTK).
8989            (DockableWindow.Destroy): New. Called when the window must be
8990            closed. Namely needed when the DockFrame closes and must close
8991            its children.
8992            (DockFrame): Listen for EVT_CLOSE and destroy all children.
8993    
8994            * Thuban/UI/legend.py (LegendPanel.Destroy): New. Cleans up
8995            when then window is told to close.
8996            (LegendTree._OnMsgLayerChanged): Fixes a seg fault bug. See
8997            comment in source for more info.
8998    
8999            * Thuban/UI/main.py: Show the legend by default when Thuban starts.
9000    
9001            * Thuban/UI/mainwindow.py: Renamed OnClose to _OnClose for
9002            symmetry with other such methods.
9003            (MainWindow.ShowLegend): Show the legend docked by default.
9004    
9005    2003-03-28  Jonathan Coles   <[email protected]>
9006    
9007            * Thuban/UI/classifier.py: Support for highlighting a specific
9008            group within the grid when the classification dialog is opened.
9009            Also contains a lot of debugging printouts which will later
9010            be removed.
9011    
9012            * Thuban/UI/dock.py: Complete rework on the dock code so that
9013            that it is fairly removed from the rest of the Thuban application.
9014            It is easy to add new docks which the rest of the program having
9015            to be aware of them.
9016    
9017            * Thuban/UI/legend.py: Modifications to support selecting a
9018            specific group in the classification dialog. Changed how layers
9019            are drawn when the layer is visible/invisible.
9020    
9021            * Thuban/UI/mainwindow.py: Removed legend specific code and
9022            replaced it with calls to the new dock code.
9023    
9024            * Thuban/UI/renderer.py (MapRenderer.__init__): Added assert
9025            to check if scale > 0. Trying to track down a divide by zero.
9026    
9027    2003-03-26  Jonathan Coles   <[email protected]>
9028    
9029            * Thuban/UI/legend.py: Removed unnecessary LegendDialog class.
9030            (LegendPanel): Removed _OnDock()/_OnUnDock() methods which are
9031            now part of DockableWindow.
9032            (LegendPanel.DoOnSelChanged): Select the current layer in the
9033            map.
9034            (LegendTree._OnSelChanged): Call LegendPanel.DoOnSelChanged()
9035            with the selected layer and/or group.
9036    
9037    2003-03-26  Jonathan Coles   <[email protected]>
9038    
9039            This putback contains the code for dockable windows. There is
9040            no support in wxWindows as of this date for windows that can
9041            attach themselves to other windows.
9042    
9043            The current model contains a DockableWindow which has a parent
9044            window for when it is detached and a dock window that it puts
9045            its contents in when it is docked. The contents of a DockableWindow
9046            must be a DockPanel. DockPanel itself derives from wxPanel.
9047    
9048            * Thuban/Model/layer.py (Layer.ClassChanged): Send a LAYER_CHANGED
9049            message, not a LAYER_LEGEND_CHANGED message.
9050    
9051            * Thuban/Model/map.py (Map): Forward LAYER_CHANGED messages.
9052    
9053            * Thuban/UI/classifier.py (Classifier.__init__): Use wxADJUST_MINSIZE
9054            as one of the style properties for the fieldTypeText item to
9055            be sure that its size is correct when the text changes.
9056    
9057            * Thuban/UI/dock.py: New. Classes for the DockPanel and
9058            DockableWindow.
9059    
9060            * Thuban/UI/legend.py: Added some more buttons and made the
9061            LegendPanel a DockPanel.
9062    
9063            * Thuban/UI/mainwindow.py: Added sash windows to the main window
9064            and supporting functions for manipulating the sashes.
9065            (MainWindow.ShowLegend): Create a DockableWindow with the
9066            LegendPanel as the contents.
9067    
9068            * Thuban/UI/messages.py: Added DOCKABLE_* messages
9069    
9070            * Thuban/UI/view.py (MapCanves.SetMap): Listen for LAYER_CHANGED,
9071            not LAYER_LEGEND_CHANGED, messages.
9072    
9073    2003-03-25  Jonathan Coles   <[email protected]>
9074    
9075            * setup.py: Added custom script bdist_rpm_build_script so that
9076            when the rpm is built the path to wx-config is correct.
9077    
9078            * setup.cfg: Added line saying to use the custom build script
9079    
9080    2003-03-20  Jonathan Coles   <[email protected]>
9081    
9082            Initial implementation of the Legend.
9083    
9084            * Thuban/UI/legend.py: New. Creates a window that shows the map's
9085            Legend information and allows the user to add/modify classifications
9086            and how the layers are drawn on the map.
9087    
9088            * setup.py: New command 'build_docs' which currently uses
9089            happydoc to generate html documentation for Thuban.
9090    
9091            * Thuban/Model/classification.py (ClassGroup.GetDisplayText): New.
9092            Returns a string which is appropriately describes the group.
9093    
9094            * Thuban/Model/layer.py (Layer.SetClassification): Generate a
9095            LAYER_CHANGED event instead of a LAYER_LEGEND_CHANGED event.
9096    
9097            * Thuban/Model/map.py (Map): Rename messages and use new, more
9098            specific, messages.
9099    
9100            * Thuban/Model/messages.py: New message to indicate that a layer's
9101            data has changed (LAYER_CHANGED). New map messages to indicate
9102            when layers have been added/removed/changed or if the stacking order
9103            of the layers has changed.
9104    
9105            * Thuban/Model/session.py: Rename and use new messages.
9106    
9107            * Thuban/UI/classifier.py: Remember if any changes have actually
9108            been applied so that if the dialog is cancelled without an application
9109            of changes we don't have to set a new classification.
9110            (ClassDataPreviewer): Pulled out the window specific code and put it
9111            ClassDataPreviewWindow. ClassDataPreviewer can then be used to draw
9112            symbols on any DC.
9113            
9114            * Thuban/UI/mainwindow.py: New code to open the legend.
9115    
9116            * Thuban/UI/view.py: Use new message names.
9117    
9118    2003-03-19  Jonathan Coles   <[email protected]>
9119    
9120            * Thuban/UI/main.py (verify_versions): New. Checks the versions
9121            of Python, wxPython, and some other libraries.
9122    
9123            * extensions/thuban/wxproj.cpp (check_version): Checks the given
9124            version against what wxproj was compiled with.
9125            (check_version_gtk): If wxproj was compiled with gtk then check
9126            the given version against the version of the gtk library
9127            currently being used.
9128    
9129    2003-03-14  Bernhard Herzog  <[email protected]>
9130    
9131            * test/test_command.py: Run the tests when the module is run as a
9132            script
9133    
9134    2003-03-14  Bernhard Herzog  <[email protected]>
9135    
9136            Implement selection of multiple selected shapes in the same layer:
9137    
9138            - Introduce a new class to hold the selection. This basically
9139              replaces the interactor which was nothing more than the
9140              selection anyway. A major difference is of course that the new
9141              selection class supports multiple selected shapes in one layer
9142            
9143            - Move the object that represents the selection from the
9144              application to the canvas. The canvas is a better place than the
9145              application because the selection represents which shapes and
9146              layer of the map displayed by the canvas are selected and
9147              affects how the map is drawn.
9148    
9149            - Make the selection and its messages publicly available through
9150              the mainwindow.
9151    
9152            - The non-modal dialogs do not get a reference to the interactor
9153              anymore as they can simply refer to their parent, the
9154              mainwindow, for the what the interactor had to offer.
9155    
9156            * Thuban/UI/selection.py: New module with a class to represent the
9157            selection.
9158    
9159            * Thuban/UI/messages.py (SELECTED_TABLE, SELECTED_MAP): Remove
9160            these unused messages
9161    
9162            * Thuban/UI/application.py (ThubanApplication.OnInit)
9163            (ThubanApplication.OnExit, ThubanApplication.SetSession): The
9164            interactor is gone now.
9165            (ThubanApplication.CreateMainWindow): There is no interactor
9166            anymore so we pass None as the interactor argument for now for
9167            compatibility.
9168    
9169            * Thuban/UI/view.py (MapCanvas.delegated_messages)
9170            (MapCanvas.Subscribe, MapCanvas.Unsubscribe): In Subscribe and
9171            Unsubscribe, delegate messages according to the delegated_messages
9172            class variable.
9173            (MapCanvas.__getattr__, MapCanvas.delegated_methods): Get some
9174            attributes from instance variables as described with the
9175            delegated_methods class variable.
9176            (MapCanvas.__init__): New instance variable selection holding the
9177            current selection
9178            (MapCanvas.do_redraw): Deal with multiple selected shapes. Simply
9179            pass them on to the renderer
9180            (MapCanvas.SetMap): Clear the selection when a different map is
9181            selected.
9182            (MapCanvas.shape_selected): Simple force a complete redraw. The
9183            selection class now takes care of only issueing SHAPES_SELECTED
9184            messages when the set of selected shapes actually does change.
9185            (MapCanvas.SelectShapeAt): The selection is now managed in
9186            self.selection
9187    
9188            * Thuban/UI/mainwindow.py (MainWindow.delegated_messages)
9189            (MainWindow.Subscribe, MainWindow.Unsubscribe): In Subscribe and
9190            Unsubscribe, delegate messages according to the delegated_messages
9191            class variable.
9192            (MainWindow.delegated_methods, MainWindow.__getattr__): Get some
9193            attributes from instance variables as described with the
9194            delegated_methods class variable.
9195            (MainWindow.__init__): The interactor as ivar is gone. The
9196            parameter is still there for compatibility. The selection messages
9197            now come from the canvas.
9198            (MainWindow.current_layer, MainWindow.has_selected_layer):
9199            Delegate to the the canvas.
9200            (MainWindow.LayerShowTable, MainWindow.Classify)
9201            (MainWindow.identify_view_on_demand): The dialogs don't need the
9202            interactor parameter anymore.
9203    
9204            * Thuban/UI/tableview.py (TableFrame.__init__)
9205            (LayerTableFrame.__init__, LayerTableFrame.OnClose)
9206            (LayerTableFrame.row_selected): The interactor is gone. It's job
9207            from the dialog's point of view is now done by the mainwindow,
9208            i.e. the parent. Subscribe to SHAPES_SELECTED instead
9209            of SELECTED_SHAPE
9210            
9211            * Thuban/UI/dialogs.py (NonModalDialog.__init__): The interactor
9212            is gone. It's job from the dialog's point of view is now done by
9213            the mainwindow, i.e. the parent.
9214            
9215            * Thuban/UI/classifier.py (Classifier.__init__): The interactor is
9216            gone. It's job from the dialog's point of view is now done by the
9217            mainwindow, i.e. the parent.
9218    
9219            * Thuban/UI/tree.py (SessionTreeView.__init__): The interactor is
9220            gone. It's job from the dialog's point of view is now done by the
9221            mainwindow, i.e. the parent.
9222            (SessionTreeCtrl.__init__): New parameter mainwindow which is
9223            stored as self.mainwindow. The mainwindow is need so that the tree
9224            can still subscribe to the selection messages.
9225            (SessionTreeCtrl.__init__, SessionTreeCtrl.unsubscribe_all)
9226            (SessionTreeCtrl.update_tree, SessionTreeCtrl.OnSelChanged): The
9227            selection is now accessible through the mainwindow. Subscribe to
9228            SHAPES_SELECTED instead of SELECTED_SHAPE
9229    
9230            * Thuban/UI/identifyview.py (IdentifyView.__init__): Use the
9231            SHAPES_SELECTED message now.
9232            (IdentifyView.selected_shape): Now subscribed to SHAPES_SELECTED,
9233            so deal with multiple shapes
9234            (IdentifyView.__init__, IdentifyView.OnClose): The interactor is
9235            gone. It's job from the dialog's point of view is now done by the
9236            mainwindow, i.e. the parent.
9237    
9238            * Thuban/UI/controls.py (RecordListCtrl.fill_list): The second
9239            parameter is now a list of shape ids.
9240            (RecordTable.SetTable): The second parameter is now a list of
9241            indices.
9242    
9243            * Thuban/UI/renderer.py (ScreenRenderer.RenderMap): Rename the
9244            selected_shape parameter and ivar to selected_shapes. It's now a
9245            list of shape ids.
9246            (MapRenderer.draw_label_layer): Deal with multiple selected
9247            shapes. Rearrange the code a bit so that the setup and shape type
9248            distinctions are only executed once.
9249    
9250            * test/test_selection.py: Test cases for the selection class
9251    
9252    2003-03-11  Jonathan Coles   <[email protected]>
9253    
9254            * Thuban/Model/load.py: Temporary fix so that the xml reader
9255            doesn't cause Thuban to crash.
9256    
9257            * Thuban/Model/layer.py: Handle the cyclic references between
9258            a layer and its classification better, and be sure to disconnect
9259            the classification from the layer when the layer is destroyed
9260            so that we don't maintain a cyclic reference that may not be
9261            garbage collected.
9262    
9263            * Thuban/Model/classification.py: See comment for layer.py.
9264    
9265    2003-03-12  Jan-Oliver Wagner <[email protected]>
9266    
9267            * HOWTO-Release: New. Information on the steps for releasing
9268            a new version of Thuban.
9269    
9270    2003-03-11  Jonathan Coles   <[email protected]>
9271    
9272            * Thuban/UI/classifier.py: Add normal border to SelectPropertiesDialog.
9273            Use True instead of true.
9274            (Classifier): Should have a single panel in which all the controls lie.
9275    
9276            * Thuban/UI/proj4dialog.py: Add normal border.
9277    
9278            * Thuban/UI/tree.py: Fixed problem with bad item images under Windows.
9279    
9280            * Thuban/UI/mainwindow.py: Use True instead of true.
9281    
9282            * setup.py: Update some definitions to use wxWindows2.4 files
9283    
9284            * Data/iceland_sample_class.thuban: Fixed file so that the
9285            field_type information is present.
9286    
9287    2003-03-10  Jonathan Coles   <[email protected]>
9288    
9289            * Thuban/UI/classifier.py (Classifier.__init__): Make the
9290            field type label grow so that when the text changes the
9291            size is updated correctly. This may be a wxWindows bug.
9292    
9293    2003-03-10  Jonathan Coles   <[email protected]>
9294    
9295            * Thuban/UI/application.py: Changed SESSION_CHANGED to
9296            SESSION_REPLACED.
9297    
9298            * Thuban/UI/classifier.py: Wrap text with _().
9299            (ClassGrid.CreateTable): Set dimensions and size hints here,
9300            instead of in Reset, so we only set the size once.
9301    
9302            * Thuban/UI/dialogs.py: Don't need Shutdown(); just use Close()!
9303    
9304            * Thuban/UI/mainwindow.py (MainWindow.prepare_new_session):
9305            Call Close() instead of Shutdown().
9306    
9307            * Thuban/UI/messages.py: Changed SESSION_CHANGED to SESSION_REPLACED.
9308    
9309            * Thuban/UI/tree.py: Changed SESSION_CHANGED to SESSION_REPLACED.
9310            Go back to using OnClose() instead of Shutdown().
9311    
9312    2003-03-10  Jonathan Coles   <[email protected]>
9313    
9314            * Thuban/UI/classifier.py (Classifier): SelectField() needed
9315            to know the old field index as well as the new one.
9316    
9317    2003-03-10  Jonathan Coles   <[email protected]>
9318    
9319            * Thuban/UI/classifier.py (Classifier): Use __SelectField()
9320            to correctly set the table information and call this from
9321            __init__ and from _OnFieldSelect so that all the information
9322            is up to date when the dialog opens and when a field is changed.
9323    
9324    2003-03-10  Jonathan Coles   <[email protected]>
9325    
9326            * Thuban/Model/classification.py (Classification): Don't use
9327            layer's message function directly, use the ClassChanged() method
9328            when then classification changes. SetField/SetFieldType/SetLayer
9329            must keep the information about field name and field type in
9330            sync when an owning layer is set or removed.
9331    
9332            * Thuban/Model/layer.py: Added ClassChanged() so that the
9333            classification can tell the layer when its data has changed.
9334            (Layer.SetClassification): Accepts None as an arguement to
9335            remove the current classification and correctly handles
9336            adding a new classification.
9337    
9338            * Thuban/Model/load.py: Comment out print statement
9339    
9340            * test/test_classification.py, test/test_save.py: New and
9341            improved tests.
9342    
9343    2003-03-07  Jonathan Coles   <[email protected]>
9344    
9345            * Thuban/Model/classification.py: Implemented __copy__ and
9346            __deepcopy__ for ClassGroup* and ClassGroupProperites so
9347            they can easily be copied by the classifier dialog.
9348            (ClassGroupProperites.__init__): The default line color should
9349            have been Color.Black.
9350    
9351            * Thuban/UI/classifier.py: Setting and Getting table values now
9352            uses a consistent set of functions.
9353            (Classifier): Now non-modal. Has field type label which changes
9354            as the field changes. Keep track of buttons in a list so that
9355            we can enable/disable the buttons when the None field is selected.
9356            (SelectPropertiesDialog): Add buttons to make the colors transparent.
9357    
9358            * Thuban/UI/dialogs.py (NonModalDialog.Shutdown): New method which
9359            does what OnClose did, but can be called by the application to
9360            close a window. Needed when a session changes, and we have to
9361            close the classifier windows.
9362    
9363            * Thuban/UI/mainwindow.py (MainWindow.prepare_new_session):
9364            Shuts down open dialogs. Used when a new session is created
9365            or a session is opened.
9366            (MainWindow.SaveSession): Should only call application.SaveSession()
9367            if we don't call SaveSessionAs first.
9368            (MainWindow.Classify): Allow different classifier dialogs for
9369            different layers.
9370    
9371            * Thuban/UI/tree.py (SessionTreeView): Remove OnClose and let
9372            the parent class handle it. Add Shutdown() to unsubscibe from
9373            event notification and call the parent Shutdown(). This was
9374            necessary so the application can close the tree window.
9375    
9376    2003-03-06  Jonathan Coles   <[email protected]>
9377    
9378            * Thuban/Model/classification.py: Minor documentation changes,
9379            Addition of __eq__ and __ne__ methods.
9380            (Classification.SetLayer): prevent recursion between this method
9381            and Layer.SetClassification().
9382    
9383            * Thuban/Model/color.py: Addition of __eq__ and __ne__ methods.
9384    
9385            * Thuban/Model/layer.py (SetClassification): prevent recursion
9386            between this method and Classification.SetLayer().
9387    
9388            * test/test_classification.py, test/test_load.py,
9389            test/test_session.py: Fixed and added tests for the classification
9390            classes.
9391    
9392    2003-03-06  Bernhard Herzog  <[email protected]>
9393    
9394            * Thuban/UI/classifier.py (ClassGrid.__init__)
9395            (ClassGrid.CreateTable): Move the SetSelectionMode call to
9396            CreateTable because otherwise it triggers an assertion in
9397            wxPython/wxGTK 2.4.
9398    
9399    2003-03-05  Jonathan Coles   <[email protected]>
9400    
9401            * Thuban/common.py: Move FIELDTYPE constants back to table.py.
9402    
9403            * Thuban/Model/load.py: import FIELDTYPE constants from table.
9404    
9405            * Thuban/UI/classifier.py: import FIELDTYPE constants from table.
9406    
9407            * Thuban/Model/table.py: Put FIELDTYPE constants back.
9408    
9409    2003-03-05  Jonathan Coles   <[email protected]>
9410    
9411            * Thuban/UI/classifier.py: Added class documentation.
9412            Fixed RTbug #1713, #1714. Added Move[Up|Down] buttons.
9413            Store just the groups in the table and generate the other
9414            column information when it is requested. Add "None" field
9415            to pull-down to select no classification.
9416    
9417            * Thuban/common.py: Moved FIELDTYPE constants from table.py
9418            (Str2Num): Only catch ValueError exceptions.
9419    
9420            * Thuban/Model/classification.py: Class documentation. Renaming
9421            of methods with Stroke to Line. Groups are stored in a single
9422            list with the default as the first element. Groups are searched
9423            in the order they appear in the list.
9424    
9425            * Thuban/Model/color.py: Documentation.
9426    
9427            * Thuban/Model/layer.py (Layer): Add GetFieldType to retreive
9428            the kind of data represented by a field.
9429    
9430            * Thuban/Model/load.py (ProcessSession): Use proper string
9431            conversion function; fixes RTbug #1713.
9432    
9433            * Thuban/Model/save.py (Saver): Store field type information.
9434    
9435            * Thuban/Model/table.py: Put FIELDTYPE constants in common.py.
9436            (Table): Add field_info_by_name() to retrieve field information
9437            by specifying the field name, not the number.
9438    
9439            * Thuban/UI/mainwindow.py: Function name changes.
9440    
9441            * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Only
9442            get the layer classification once. Don't try to classify
9443            values when the field is None: just use the default properties.
9444    
9445            * Thuban/UI/view.py: Function name changes.
9446    
9447            * Doc/thuban.dtd: Add field_type attribute to a classification.
9448    
9449    2003-03-04  Bernhard Herzog  <[email protected]>
9450    
9451            * Doc/thuban.dtd: Use correct syntax for optional attributes. Make
9452            the fill and stroke layer attributes optional with suitable
9453            default values. Add the stroke_width layer attribute. Use correct
9454            syntax for empty elements. Make the attribute list for labels
9455            refer to the label element.
9456    
9457    2003-03-04  Bernhard Herzog  <[email protected]>
9458    
9459            * setup.py (thuban_build_py.build): Add a comment about distutils in
9460            Python 2.3 containing some of the functionality we implement in
9461            setup.py ourselves.
9462    
9463            * Thuban/UI/classifier.py (ClassGrid.__init__): Set the table
9464            before the selection mode. Doing it the other way round triggers
9465            an assertion in wxWindows.
9466    
9467            * Thuban/Model/save.py (escape): Fix typo in doc-string
9468    
9469            * Thuban/Model/classification.py: Remove unnecessary wxPython
9470            import
9471    
9472    2003-03-04  Jonathan Coles   <[email protected]>
9473    
9474            * Thuban/Model/classification.py (ClassGroupRange.GetProperties):
9475            Parameter 'value' should default to None.
9476    
9477            * Thuban/UI/mainwindow.py: Use Layer.GetClassification() since
9478            the class attribute __classification is now private.
9479    
9480            * Thuban/UI/classifier.py (ClassGrid): Moved OnCellDClick() from
9481            Classifier to ClassGrid. Added support for removing selected rows,
9482            which including code for keeping track of when cells are selected,
9483            and deselected.
9484            (ClassTable): Support for added/removing rows. Fixed a problem
9485            with __ParseInput whereby it would not allow strings (only numbers)
9486            to be entered.
9487            (Classifier): Added button and supporting code for removing
9488            selected rows.
9489    
9490    2003-02-27  Jonathan Coles   <[email protected]>
9491    
9492            * Thuban/common.py: Moved color conversion functions into
9493            Thuban/UI/common.py.
9494            (Str2Num): Now converts the float (not the string) to a long/int
9495            so that an exception isn't thrown.
9496    
9497            * Thuban/UI/common.py: Common functions used in several UI modules
9498    
9499            * Thuban/Model/classification.py: Changed the class hierarchy
9500            so that a Classification consists of Groups which return
9501            Properties when a value matches a Group.
9502    
9503            * Thuban/Model/layer.py: Fixed name resolution problem.
9504    
9505            * Thuban/Model/load.py: Use new Classification and Group functions.
9506    
9507            * Thuban/Model/save.py (Saver.write_attribs): Fixes a test case
9508            failure.
9509            (Saver.write_classification): Use new Classification and Group
9510            functions.
9511    
9512            * Thuban/UI/classifier.py: Changes to use new Classification and Group
9513            functions. Fix to create a tuple with a single value instead of
9514            simply returning the value.
9515    
9516            * Thuban/UI/renderer.py: Use new Classification and Group functions.
9517            Use common.py functions.
9518    
9519            * Thuban/UI/tree.py: Use common.py functions.
9520            
9521            * test/test_classification.py: Use new Classification and Group
9522            classes.
9523    
9524    2003-02-24  Jonathan Coles   <[email protected]>
9525    
9526            * Thuban/common.py (Color2wxColour, wxColour2Color): Conversion
9527            functions from Thuban color objects to wxWindow colour objects.
9528    
9529            * Thuban/Model/classification.py (Classification): Renamed
9530            GetProperties() to GetClassData(). Used the new iterator
9531            in TreeInfo().
9532            (ClassIterator): Iterator implementation to iterate over the
9533            ClassData objects in a classification object.
9534    
9535            * Thuban/Model/save.py (Saver.write_classificaton): Uses
9536            the new iterator to save the classification information.
9537    
9538            * Thuban/UI/classifier.py (SelectPropertiesDialog): Support
9539            for changing the stroke and fill colors and previewing the
9540            changes.
9541    
9542            * Thuban/UI/mainwindow.py (MainWindow.OpenSession,
9543            MainWindow.SaveSessionAs): Text string changes so the dialogs
9544            have more meaningful titles.
9545    
9546            * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Change
9547            Classification method name from GetProperties to GetClassData.
9548    
9549            * Thuban/UI/view.py (MapCanvas.find_shape_at): Use method calls
9550            instead of accessing now non-existent class variables.
9551    
9552    2003-02-24  Bernhard Herzog  <[email protected]>
9553    
9554            * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Remove
9555            unneeded Shape() call. Rendering is substantially faster without
9556            it and it avoids some problems with broken shape files.
9557    
9558    2003-02-20  Frank Koormann   <[email protected]>
9559    
9560            Force minimal size of identify and label dialogs. The autosizing
9561            looked too ugly.
9562    
9563            * Thuban/UI/controls.py (RecordListCtrl): Set minimal width for columns.
9564            * Thuban/UI/labeldialog.py (LabelDialog.dialog_layout):
9565            Set size of listctrl.
9566            * Thuban/UI/identifyview.py (IdentifyView.__init__):
9567            Set size of dialog.
9568    
9569    2003-02-19  Jonathan Coles   <[email protected]>
9570    
9571            * test/test_classification.py, test/test_layer.py,
9572            test/test_load.py, test/test_map.py, test/test_session.py:
9573            Updated the tests to use the new functions that are in the
9574            respective classes.
9575    
9576            * Thuban/Model/classification.py (Classification):
9577            Uses the new ClassData* classes. Modification messages are
9578            passed up to the parent layer (if it exists).
9579            (ClassData): New class to encapsulate the common data in each
9580            classification property.
9581            (ClassDataDefault): Represents the Default class. data.
9582            (ClassDataPoint): Represents a single class. data point
9583            (ClassDataRange): Represents a class. range
9584            (ClassDataMap): Represents a class. map (unused).
9585    
9586            * Thuban/Model/color.py: Added Color.None to represent something
9587            with no color. Color.Black represents the color black.
9588            (NoColor): Helper class derived from Color to represent something
9589            with no color.
9590    
9591            * Thuban/Model/layer.py (Layer): Removed references to fill, stroke,
9592            stroke_width attributes. Made the 'classification' attribute private.
9593            New methods for setting/getting the classification.
9594    
9595            * Thuban/Model/load.py (ProcessSession): Use new methods on Layer
9596            to get the classifcation and use the new ClassData* classes to
9597            hold the classification data. Use Str2Num to convert numbers
9598            properly.
9599    
9600            * Thuban/Model/save.py (Saver): Use new Color and Classification
9601            methods
9602    
9603            * Thuban/UI/classifier.py (ClassGrid): New class to represent a
9604            custom grid.
9605            (ClassTable): Support for editing Values and Labels and for
9606            changing what type (point or range) of data is stored in each
9607            property based on how the user enters the data.
9608            (Classifier): Support for saving the new classifications and
9609            launching the dialog to edit a property.
9610            (SelectPropertiesDialog): New class for editing the visual
9611            properties of a classification (stroke color, width, and fill color)
9612            (ClassPreviewer): Took the Draw method from ClassRenderer and
9613            made most of it into this new class. Intend to use this class in
9614            the SelectPropertiesDialog for previewing changes.
9615    
9616            * Thuban/UI/renderer.py: Use new Color and Classification methods.
9617    
9618            * Thuban/UI/tree.py: Formatting changes.
9619    
9620            * Doc/thuban.dtd: Add 'label' element
9621    
9622            * Thuban/common.py: New. Contains common routines used throughout
9623            the code.
9624            (Str2Num): Takes a string and converts it to the "best" type of
9625            number.
9626    
9627    2003-02-14  Bernhard Herzog  <[email protected]>
9628    
9629            * Thuban/UI/view.py (MapCanvas.OnLeftUp): Make sure that the
9630            dragging flag is always set to 0 even when the tool implementation
9631            raises an exception
9632    
9633    2003-02-11  Bernhard Herzog  <[email protected]>
9634    
9635            * Thuban/UI/application.py (ThubanApplication.splash_screen): New
9636            method to create a splash screen.
9637            (ThubanApplication.ShowMainWindow): New. Show the main window.
9638            Needed so the splash screen can display the mainwindow
9639            (ThubanApplication.OnInit): Call the
9640            new splash_screen method to determine whether the application
9641            should display a splash screen. If it displays a splash screen do
9642            not immediately show the main window.
9643    
9644    2003-02-11  Jonathan Coles  <[email protected]>
9645    
9646            * Thuban/Model/classification.py: Added import line to fix
9647            feature conflicts between running on python2.2 and python2.1.
9648    
9649            * Thuban/UI/classifier.py (ClassTable): Didn't need to hang
9650            onto the clinfo parameter, so removed the deepcopy().
9651    
9652    2003-02-10  Jonathan Coles  <[email protected]>
9653    
9654            * Thuban/Model/save.py (Saver.open_element, Saver.close_element):
9655            Added element_open variable to track opening and closing of tags
9656            so that tags that don't span more than one line are closed with
9657            /> instead of </tag_name>. Use the GetDefault*() methods of
9658            the Classification class.
9659    
9660            * Thuban/Model/classification.py (Classificaton): Added set and
9661            get methods for the default data. The class also takes a layer
9662            reference so that modification messages can be sent. Fixed the
9663            methods to use the new ClassData class.
9664            (ClassData): New class to encapsulate the classification data
9665    
9666            * Thuban/Model/layer.py (Layer): Remove the
9667            Set[Fill|Stroke|StrokeWidth]() methods. Code should call the
9668            SetDefault*() methods on the layer's classification object.
9669            (Layer.__init__): Use the new SetDefault*() methods in the
9670            Classification class.
9671    
9672            * Thuban/Model/load.py (ProcessSession): Use the new ClassData
9673            object instead of a dictionary.
9674    
9675            * Thuban/UI/classifier.py (ClassRenderer): New class to
9676            draw the classifications in the dialog box's table.
9677            (Classifier): Modified to use the ClassRenderer class.
9678    
9679            * Thuban/UI/mainwindow.py (MainWindow): Use the SetDefault*()
9680            methods of the Classification class.
9681    
9682            * Thuban/UI/renderer.py (MapRenderer): Use the Get*() methods
9683            of the ClassData class.
9684    
9685            * test/test_classification.py, test/test_layer.py,
9686            test/test_map.py, test/test_session.py: Fix the tests to work
9687            with the above code changes.
9688    
9689    2003-02-03  Jonathan Coles  <[email protected]>
9690    
9691            * Thuban/Model/classification.py (Classification): Added getNull()
9692            to return the NullData reference
9693    
9694            * Thuban/Model/layer.py (Layer.SetFill, Layer.SetStroke,
9695            Layer.SetStrokeWidth): Modified these functions to change the
9696            null data in the classification rather than keep these values
9697            directly in the Layer class. Menu options to change these values
9698            work again.
9699    
9700    2003-01-28  Jonathan Coles  <[email protected]>
9701    
9702            * Thuban/UI/classifier.py (Classifier): Resolved merging conflicts.
9703            Fixed crashing problem on some systems. Dialog box shows
9704            classification data.
9705    
9706            * Thuban/UI/tree.py (SessionTreeCtrl.add_items): Handle drawing
9707            Colors in the tree view.
9708    
9709            * Thuban/Model/layer.py (Layer.TreeInfo): Added a call to build
9710            the tree info for classifications. Commented out unnecessary lines.
9711    
9712            * Thuban/Model/classification.py (Classification.TreeInfo): New
9713            function to add information about the classification into the
9714            tree view.
9715    
9716    2003-01-27  Jan-Oliver Wagner <[email protected]>
9717    
9718            * Thuban/__init__.py (_): New.
9719    
9720            * Thuban/Model/classification.py, Thuban/Model/extension.py,
9721            Thuban/Model/layer.py, Thuban/Model/load.py, Thuban/Model/map.py,
9722            Thuban/Model/session.py, Thuban/UI/application.py,
9723            Thuban/UI/classifier.py, Thuban/UI/context.py, Thuban/UI/controls.py,
9724            Thuban/UI/identifyview.py, Thuban/UI/labeldialog.py,
9725            Thuban/UI/mainwindow.py, Thuban/UI/menu.py, Thuban/UI/proj4dialog.py,
9726            Thuban/UI/renderer.py, Thuban/UI/tree.py, Thuban/Lib/connector.py,
9727            Thuban/Lib/fileutil.py: Replace user string by _() for i18n.
9728    
9729    2003-01-27  Jonathan Coles  <[email protected]>
9730    
9731            * Thuban/Model/layer.py: Classification initialization calls.
9732    
9733            * Thuban/Model/classification.py: Created class to encapsulate
9734            a layer classification. Supports specific data points and
9735            ranges.
9736    
9737            * Thuban/Model/load.py: Added support for loading classification
9738            information.
9739    
9740            * Thuban/Model/save.py: Added support for saving classification
9741            information.
9742    
9743            * Thuban/UI/classifier.py: Initial class for a dialog box for
9744            specifying classification information.
9745    
9746            * Thuban/UI/mainwindows.py: Support for opening the classifier
9747            dialog.
9748    
9749            * Thuban/UI/renderer.py: Support for drawing a layer with the
9750            classification information.
9751    
9752            * Data/iceland_sample_class.thuban: iceland_sample with
9753            classification data.
9754    
9755            * test/test_classification: Tests for the Classification class.
9756    
9757    2002-12-09  Bernhard Herzog  <[email protected]>
9758    
9759            * test/test_command.py: New. Tests for the command classes.
9760    
9761            * Thuban/UI/command.py (ToolCommand): New class for tool commands.
9762            (Command.IsTool): New method to distinguish between command
9763            switching tools and other commands.
9764    
9765            * Thuban/UI/view.py (MapCanvas.SelectTool): New method to select
9766            the tool to avoid direct assignments to instance variables
9767            (MapCanvas.ZoomInTool, MapCanvas.ZoomOutTool, MapCanvas.PanTool)
9768            (MapCanvas.IdentifyTool, MapCanvas.LabelTool): Use SelectTool to
9769            change the tool
9770    
9771            * Thuban/UI/mainwindow.py (MainWindow.update_command_ui): If an
9772            active tool's command turns insensitive, disable the tool.
9773            (_tool_command): Use the new ToolCommand class
9774    
9775            * Examples/simple_extensions/simple_tool.py (simple_tool): Use the
9776            SelectTool method to change the tool
9777            (iconfile): Use the ToolCommand class
9778    
9779    2002-12-03  Bernhard Herzog  <[email protected]>
9780    
9781            * Thuban/UI/tree.py (SessionTreeCtrl.normalize_selection): Handle
9782            the case of selected items that are not children of Layers or Maps
9783            properly. Previously this bug would trigger an assertion in
9784            wxWindows.
9785    
9786    2002-11-06  Frank Koormann  <[email protected]>
9787    
9788            * Thuban/UI/mainwindow.py: Altered the order of tools in the
9789            toolbar: First now are all navigation tools (Zoom In/Out, Pan,
9790            Full Extent).
9791    
9792    2002-10-23  Bernhard Herzog  <[email protected]>
9793    
9794            * setup.py (setup call): version now 0.1.3
9795    
9796            * MANIFEST.in: Add the files in test/
9797    
9798            * test/README: Add note about tests requiring the iceland data
9799    
9800            * Thuban/UI/mainwindow.py (MainWindow.About): Add 2002 to
9801            copyright notice.
9802    
9803    2002-10-18  Bernhard Herzog  <[email protected]>
9804    
9805            * test/test_map.py
9806            (TestMapWithContents.test_projected_bounding_box): Use an explicit
9807            epsilon.
9808    
9809            * test/support.py (FloatComparisonMixin.assertFloatEqual)
9810            (FloatComparisonMixin.assertFloatSeqEqual): give a more useful
9811            message if the assertion fails and don't return the return value
9812            of self.assert_. In assertFloatSeqEqual the return meant that not
9813            all items of the sequence were compared.
9814    
9815    2002-09-20  Bernhard Herzog  <[email protected]>
9816    
9817            * test/test_fileutil.py: New. Test cases for Thuban.Lib.fileutil
9818    
9819            * Thuban/Lib/fileutil.py: Fixup some whitespace and typos
9820    
9821            * test/test_map.py (TestMapWithContents.test_tree_info): Create
9822            the string with the bounding box on the fly because of platform
9823            differences in the way %g is handled.
9824    
9825            * test/test_layer.py (TestLayer.test_empty_layer): Create an empty
9826            DBFfile too because Thuban layers can't yet cope missing DBF
9827            files.
9828    
9829    2002-09-20  Bernhard Herzog  <[email protected]>
9830    
9831            * test/test_menu.py: Use initthuban instead of
9832            add_thuban_dir_to_path to initialize Thuban.
9833    
9834            * test/support.py (FloatComparisonMixin.assertFloatEqual): New.
9835            Mixin class for float comparisons
9836            (SubscriberMixin): New. Mixin class to test messages sent through
9837            the Connector class
9838    
9839            * test/README: Fix a typo and add the -v flag to the command for
9840            individual tests
9841    
9842            * test/test_session.py: New. Test cases for Thuban.Model.session
9843    
9844            * test/test_proj.py: New. Test cases for Thuban.Model.proj
9845    
9846            * test/test_map.py: New. Test cases for Thuban.Model.map
9847    
9848            * test/test_layer.py: New. Test cases for Thuban.Model.layer
9849    
9850            * test/test_label.py: New. Test cases for Thuban.Model.label
9851    
9852            * test/test_connector.py: New. Test cases for Thuban.Lib.connector
9853    
9854            * test/test_color.py: New. Test cases for Thuban.Model.color
9855    
9856            * test/test_base.py: New. Test cases for Thuban.Model.base
9857    
9858    2002-09-13  Bernhard Herzog  <[email protected]>
9859    
9860            * Thuban/Model/session.py (Session.forwarded_channels): Forward
9861            the CHANGED channel too.
9862    
9863            * Thuban/Model/map.py (Map.forwarded_channels): Forward the
9864            CHANGED channel too.
9865            (Map.__init__): Call the Modifiable constructor as well.
9866    
9867            * Thuban/Model/base.py (Modifiable.UnsetModified): Issue a CHANGED
9868            event if the modified flag changes.
9869            (Modifiable.changed): Tweak the doc-string.
9870    
9871            * Thuban/UI/mainwindow.py (MainWindow.view_position_changed)
9872            (MainWindow.set_position_text): Put the code that puts the text
9873            with the mouse position into the status bar into the new method
9874            set_position_text so that it can overwritten in derived classes.
9875    
9876    2002-09-12  Bernhard Herzog  <[email protected]>
9877    
9878            * Thuban/UI/mainwindow.py (MainWindow.RunMessageBox): Center the
9879            message box on the main window.
9880    
9881    2002-09-11  Bernhard Herzog  <[email protected]>
9882    
9883            * Thuban/UI/mainwindow.py: Underline the 'x' in "Exit" instead of
9884            the 'E' because it's less likely to interfere with other menu
9885            entries.
9886            (MainWindow.build_menu): remove an incorrect comment.
9887    
9888  2002-09-10  Bernhard Herzog  <[email protected]>  2002-09-10  Bernhard Herzog  <[email protected]>
9889    
9890          * Thuban/UI/mainwindow.py (MainWindow.Map): New.          * Thuban/UI/mainwindow.py (MainWindow.Map): New.
# Line 12  Line 9899 
9899          * Thuban/UI/mainwindow.py (MainWindow.OnClose): Unsubscribe          * Thuban/UI/mainwindow.py (MainWindow.OnClose): Unsubscribe
9900          VIEW_POSITION          VIEW_POSITION
9901    
9902  2002-09-04  Frank Koormann   <[email protected]>  2002-09-04  Frank Koormann  <[email protected]>
9903    
9904          * Resources/Bitmaps/fullextent.xpm: Updated Icon (removed "potatoe")          * Resources/Bitmaps/fullextent.xpm: Updated Icon (removed "potatoe")
9905    
# Line 99  Line 9986 
9986    
9987          * Thuban/Model/table.py (Table.write_record): New method to write          * Thuban/Model/table.py (Table.write_record): New method to write
9988          records.          records.
9989          (Table.__init__): Open the DBF file for writing too.          (Table.__init__): Open the DBF file for writing too.
9990    
9991          * Thuban/UI/controls.py (RecordTable.SetValue): Write the value          * Thuban/UI/controls.py (RecordTable.SetValue): Write the value
9992          into the underlying table.          into the underlying table.
# Line 137  Line 10024 
10024          * setup.py (ThubanInstall.run): Don't repr install_lib_orig          * setup.py (ThubanInstall.run): Don't repr install_lib_orig
10025          because thubaninit_contents will do it for us.          because thubaninit_contents will do it for us.
10026    
10027  2002-08-16      Jan-Oliver Wagner <[email protected]>  2002-08-16  Jan-Oliver Wagner <[email protected]>
10028    
10029          * Thuban/UI/mainwindow.py: menu item 'show session tree' now disable if          * Thuban/UI/mainwindow.py: menu item 'show session tree' now disable if
10030          tree window already open          tree window already open
# Line 265  Line 10152 
10152          * Thuban/UI/tree.py: We can now simply subscribe to the session's          * Thuban/UI/tree.py: We can now simply subscribe to the session's
10153          CHANGED channel to be informed of changes.          CHANGED channel to be informed of changes.
10154          (SessionTreeCtrl.session_channels): Not needed any longer.          (SessionTreeCtrl.session_channels): Not needed any longer.
10155          (SessionTreeCtrl.unsubscribe_all, SessionTreeCtrl.session_changed):          (SessionTreeCtrl.unsubscribe_all, SessionTreeCtrl.session_changed):
10156          Only have to (un)subscribe CHANGED          Only have to (un)subscribe CHANGED
10157    
10158          * Thuban/Model/map.py (Map.TreeInfo): Deal better with empty maps.          * Thuban/Model/map.py (Map.TreeInfo): Deal better with empty maps.
# Line 326  Line 10213 
10213          * Thuban/Model/layer.py (Layer.TreeInfo),          * Thuban/Model/layer.py (Layer.TreeInfo),
10214          Thuban/Model/extension.py (Extension.TreeInfo),          Thuban/Model/extension.py (Extension.TreeInfo),
10215          Thuban/Model/map.py (Map.TreeInfo),          Thuban/Model/map.py (Map.TreeInfo),
10216          Thuban/Model/session.py (Session.TreeInfo):          Thuban/Model/session.py (Session.TreeInfo):
10217          Add TreeInfo methods to implement the new tree view update scheme          Add TreeInfo methods to implement the new tree view update scheme
10218    
10219  2002-07-16  Bernhard Herzog  <[email protected]>  2002-07-16  Bernhard Herzog  <[email protected]>
# Line 407  Line 10294 
10294          * setup.py: In the setup call, make sure that the library          * setup.py: In the setup call, make sure that the library
10295          directories are under $prefix/lib not directly under $prefix.          directories are under $prefix/lib not directly under $prefix.
10296    
10297  2002-06-20      Jan-Oliver Wagner <[email protected]>  2002-06-20  Jan-Oliver Wagner <[email protected]>
10298    
10299          * Thuban/Model/extension.py: new module to handle extension objects.          * Thuban/Model/extension.py: new module to handle extension objects.
10300          * Thuban/Model/messages.py: new messages for extensions.          * Thuban/Model/messages.py: new messages for extensions.
# Line 636  Line 10523 
10523          * Thuban/UI/messages.py (VIEW_POSITION): New message for the          * Thuban/UI/messages.py (VIEW_POSITION): New message for the
10524          position in the statusbar          position in the statusbar
10525    
10526  2002-04-26      Frank Koormann <[email protected]>  2002-04-26  Frank Koormann <[email protected]>
10527    
10528          * Thuban/UI/mainwindow.py: AddLayer, Dialog title s/session/data          * Thuban/UI/mainwindow.py: AddLayer, Dialog title s/session/data
10529    
10530  2002-04-24      Frank Koormann <[email protected]>  2002-04-24  Frank Koormann <[email protected]>
10531            
10532          * Resources/Bitmaps/identify.xpm: shadow added          * Resources/Bitmaps/identify.xpm: shadow added
10533    
10534          * Resources/Bitmaps/fullextent.xpm: new          * Resources/Bitmaps/fullextent.xpm: new
           
 2002-04-22      Jan-Oliver Wagner <[email protected]>  
10535    
10536          * Thuban/UI/tree.py (update_tree): added test for None on map bounding box  2002-04-22  Jan-Oliver Wagner <[email protected]>
10537    
10538  2002-04-21      Jan-Oliver Wagner <[email protected]>          * Thuban/UI/tree.py (update_tree): added test for None on map bounding
10539            box
10540    
10541    2002-04-21  Jan-Oliver Wagner <[email protected]>
10542    
10543          * Thuban/UI/proj4dialog.py (UTMProposeZoneDialog): new          * Thuban/UI/proj4dialog.py (UTMProposeZoneDialog): new
10544    
10545          * Thuban/UI/tree.py (update_tree): added added map extent          * Thuban/UI/tree.py (update_tree): added added map extent
10546    
10547          * Thuban/UI/mainwindow.py (_method_command): extended by parameter          * Thuban/UI/mainwindow.py (_method_command): extended by parameter
10548          icon; added map_full_extend as tool          icon; added map_full_extend as tool
10549    
10550  2002-04-19      Jan-Oliver Wagner <[email protected]>  2002-04-19  Jan-Oliver Wagner <[email protected]>
10551    
10552          * Thuban/UI/mainwindow.py (SaveSession): launch save as dialog for          * Thuban/UI/mainwindow.py (SaveSession): launch save as dialog for
10553          saving _new_ sessions          saving _new_ sessions
# Line 761  Line 10649 
10649    
10650          * setup.py: increase version number to 0.1          * setup.py: increase version number to 0.1
10651          (data_dist): New command class for data distribution          (data_dist): New command class for data distribution
           
10652    
10653  2001-09-14  Bernhard Herzog  <[email protected]>  2001-09-14  Bernhard Herzog  <[email protected]>
10654    
10655          * Thuban/UI/identifyview.py (IdentifyListCtrl.selected_shape):          * Thuban/UI/identifyview.py (IdentifyListCtrl.selected_shape):
10656          Handle the case of no layer (i.e. layer is None) properly.          Handle the case of no layer (i.e. layer is None) properly.
10657    
10658          * Thuban/UI/proj4dialog.py (UTMDialog.__init__, Proj4Dialog.__init__):          * Thuban/UI/proj4dialog.py (UTMDialog.__init__, Proj4Dialog.__init__):
10659          Set the initial selection of the combo boxes to reflect the          Set the initial selection of the combo boxes to reflect the
10660          projection we're starting with in a way that works on windows,          projection we're starting with in a way that works on windows,
10661          too.          too.
# Line 878  Line 10765 
10765          (MainWindow.identify_view_on_demand): Store the interactor in an          (MainWindow.identify_view_on_demand): Store the interactor in an
10766          instvar and use that reference instead of going through main.app          instvar and use that reference instead of going through main.app
10767    
10768          * Thuban/UI/mainwindow.py (MainWindow.ShowSessionTree):          * Thuban/UI/mainwindow.py (MainWindow.ShowSessionTree):
10769          * Thuban/UI/application.py (ThubanApplication.OnInit):          * Thuban/UI/application.py (ThubanApplication.OnInit):
10770          * Thuban/UI/main.py (main): Create the session tree view in main          * Thuban/UI/main.py (main): Create the session tree view in main
10771          with the new mainwindow method ShowSessionTree and not directly          with the new mainwindow method ShowSessionTree and not directly
10772          the application's OnInit method          the application's OnInit method
# Line 895  Line 10782 
10782          layer to the tableview dialog.          layer to the tableview dialog.
10783    
10784          * Thuban/UI/tableview.py: Add some doc-strings          * Thuban/UI/tableview.py: Add some doc-strings
10785          (TableGrid):          (TableGrid):
10786          (TableGrid.OnRangeSelect):          (TableGrid.OnRangeSelect):
10787          (TableGrid.OnSelectCell):          (TableGrid.OnSelectCell):
10788          (TableFrame.__init__):          (TableFrame.__init__):
# Line 962  Line 10849 
10849  2001-09-05  Bernhard Herzog  <[email protected]>  2001-09-05  Bernhard Herzog  <[email protected]>
10850    
10851          * Thuban/UI/view.py (MapCanvas.__init__): New argument, interactor.          * Thuban/UI/view.py (MapCanvas.__init__): New argument, interactor.
10852            
10853          * Thuban/UI/mainwindow.py (MainWindow.__init__): New argument          * Thuban/UI/mainwindow.py (MainWindow.__init__): New argument
10854          interactor to pass through to the MapCanvas          interactor to pass through to the MapCanvas
10855            
10856          * Thuban/UI/application.py (ThubanApplication.OnInit): Use the new          * Thuban/UI/application.py (ThubanApplication.OnInit): Use the new
10857          argument to the MainWindow constructor to get rid of the ugly hack          argument to the MainWindow constructor to get rid of the ugly hack
10858          that made main.app available early just so that the mapcanvas          that made main.app available early just so that the mapcanvas
# Line 1012  Line 10899 
10899          (ThubanInstall.run): Remove the leading install root from the          (ThubanInstall.run): Remove the leading install root from the
10900          script filename if an install root was specified and use the new          script filename if an install root was specified and use the new
10901          link_file method          link_file method
10902            
10903          * Thuban/UI/mainwindow.py (MainWindow.AddLayer): Fit the map to          * Thuban/UI/mainwindow.py (MainWindow.AddLayer): Fit the map to
10904          the window when the first layer is added to the map.          the window when the first layer is added to the map.
10905    
# Line 1049  Line 10936 
10936          (InnoIconItem): Helper class for bdist_inno          (InnoIconItem): Helper class for bdist_inno
10937          (thuban_bdist_inno): Thuban specific version of bdist_inno. Added          (thuban_bdist_inno): Thuban specific version of bdist_inno. Added
10938          this together with the appropriate parameters, to the setup call.          this together with the appropriate parameters, to the setup call.
10939            
10940          * setup.cfg (bdist_inno): added new section for the inno setup          * setup.cfg (bdist_inno): added new section for the inno setup
10941          installer          installer
10942    

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

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26