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

Legend:
Removed from v.514  
changed lines
  Added in v.2713

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26