/[thuban]/branches/WIP-pyshapelib-bramz/ChangeLog
ViewVC logotype

Diff of /branches/WIP-pyshapelib-bramz/ChangeLog

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

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

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

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26