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

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

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

revision 370 by jonathan, Mon Jan 27 12:21:23 2003 UTC revision 2708 by bernhard, Sun Sep 24 20:01:23 2006 UTC
# Line 1  Line 1 
1    2006-09-24 Bernhard Reiter <[email protected]>
2    
3            * Thuban/Model/proj.py(_do_we_have_to_work_around_broken_proj):
4            Making the test more robust for observed python 2.3 problems
5            with setlocale().
6    
7            * test/runtests.py: Added new option ---setdecimalcommalocale
8            to run all tests with an LC_NUMERIC that uses comma as decimal_point.
9            Minor: Added (c) year 2006. Fixed typo in a docstring.
10    
11            * test/test_transientdb.py: Minor: Added (c) year 2006. Fixed typo in
12            a docstring.
13    
14    2006-09-23 Bernhard Reiter <[email protected]>
15    
16            * Extensions/ogr/test/test_OGRShapestore.py: fixed skip_if_no_ogr()
17            and added it to TestOGRTable.setUp() so that all tests get skipped
18            if ogr cannot be imported. Added (c) year 2006.
19    
20    2006-09-18 Didrik Pinte <[email protected]>
21            
22            * wxPython 2.6 update : wx 2.4 syntax has been updated to 2.6
23            
24    2006-09-18 Bernhard Reiter <[email protected]>
25    
26            Fixed proj behaviour with python >=2.4 when decimal_point != '.'.
27    
28            * Thuban/UI/application.py: Fixed warning dialog when gdal is missing.
29    
30            * test/test_proj.py: new test_lc_numeric_robustness(). Added author
31            Bernhard Reiter and new copyright year 2006.
32    
33            * Thuban/Model/proj.py: New _do_we_have_to_work_around_broken_proj()
34            and Projection.assuregoodlocale(), Projection.assureinitlocale().
35            Added author Bernhard Reiter and (c) 2006.
36    
37    2006-09-15 Bernhard Reiter <[email protected]>
38    
39            * README: added RXP and pyRXP as optional for tests.
40    
41            * test/localessupport.py: New. Contains a helper function
42            to find a locale with comma used as decimal_point.
43    
44    2006-08-31 Bernhard Reiter <[email protected]>
45    
46            * README: fixed URLs to sqlite and pysqlite.
47    
48            * Thuban/UI/about.py: Added Didrik Pinte as contributor. Extended
49              copyright range to include 2006.
50    
51    2006-06-29 Didrik Pinte <[email protected]>
52    
53            * Thuban/UI/main.py: circular import fix.
54    
55    2006-06-27 Frank Koormann <[email protected]>
56    
57            New Classification "Pattern": Classify text attributes by regexp.
58    
59            * Thuban/Model/classification.py (class ClassGroupPattern):
60            New, group is associated with a regular expression.
61            (Classification._compile_classification): Store compiled regexp and
62            original group for pattern.
63            (Classification.FindGroup): Added pattern.
64    
65            * Thuban/UI/classifier.py
66            (ClassGrid._OnLabelRightClicked, ClassGrid.labelPopup):
67            New, add popup to select singleton/pattern.
68            (ClassTable.GetRowLabelValue, ClassTable.GetValueAsCustom,
69            ClassTable.SetValueAsCustom): Added pattern.
70            (ClassTable.__ParseInput): Autodetect singleton/pattern.
71    
72            * Thuban/Model/save.py (SessionSaver.write_classification):
73            Added pattern.
74    
75            * Thuban/Model/load.py (SessionLoader.start_clpattern,
76            SessionLoader.end_clpattern): New, process pattern elements.
77    
78            * test/test_classification.py (class TestClassGroupPattern): New.
79            (TestClassification.test_add_pattern,
80            TestClassification.test_multiple_groups_textual,
81            TestClassification.test_deepcopy_textual): New.
82            (TestClassification.test_multiple_groups_numerical):
83            Renamed test_multiple_groups.
84            (TestClassification.test_deepcopy_numerical): Renamed test_deepcopy.
85    
86            * test/test_save.py (SaveSessionTest.testClassifiedLayer):
87            Added pattern.
88    
89            * test/test_load.py (ClassificationTest.TestLayers, TestClassification):
90            Added pattern.
91    
92            * test/test_layer.py
93            (TestLayerModification.test_set_classification_textual): New
94            (TestLayerModification.test_set_classification_numerical):
95            Renamed test_set_classification.
96    
97            * Doc/manual/thuban-manual.xml: Added pattern to layer classification
98            description.
99    
100            * Resources/XML/thuban-1.1.dtd: Added clpattern element and attribs.
101    
102    2006-06-29 Didrik Pinte <[email protected]>
103    
104            * Thuban/version.py: Bugfix determination of SQLite, the wright one !
105              
106    2006-06-28 Didrik Pinte <[email protected]>
107    
108            * packaging/windows/thubanstart.py: sample file loading all the stable
109            extensions
110            
111    2006-06-28 Didrik Pinte <[email protected]>
112    
113            * Thuban/version.py: Bugfix determination of SQLite on old and recent
114            systems (support pysqlite1 and pysqlite2)
115    
116    2006-06-27 Frank Koormann <[email protected]>
117    
118            * Thuban/version.py: Bugfix determination of SQLite on old systems.
119    
120    2006-05-17 Didrik Pinte <[email protected]>
121            * Extensions/ogr/__init__.py : updated test for win32 and correct
122            imports
123    
124    2006-05-15 Didrik Pinte <[email protected]>
125            Ashamed ... still some tabs in the files
126    
127      * Thuban/version.py : tabs removed    
128      * Thuban/Model/transientdb.py : tabs removed
129    
130    2006-05-15 Didrik Pinte <[email protected]>
131    
132      * Thuban/version.py : coding style correction
133      * Thuban/Model/transientdb.py : coding style correction
134    
135    2006-05-15 Didrik Pinte <[email protected]>
136    
137      * Thuban/version.py : Updated imports to support pysqlite2
138    
139      * Thuban/Model/transientdb.py : Updated imports to support pysqlite2
140            Patched the querying system to support the param style of pysqlite2
141    
142    2006-04-24 Didrik Pinte <[email protected]>
143            * Extensions/svgexport/__init__.py: The extension now works on win32
144            architecture. Bug #87 corrected.
145    
146    2006-04-20 Bernhard Reiter <[email protected]>
147            * Doc/technotes/coding_guidelines.txt: Changed text from CVS to SVN.
148            Removed emacs specific hint and replaced it with a general hint
149            that editors might support writing changelogs.
150    
151    2006-04-12 Bernhard Reiter <[email protected]>
152    
153            * Thuban/version.py: Changed thuban_release mechanism to use "svn"
154            instead of "cvs".
155    
156    2006-03-31  Bernhard Reiter <[email protected]>
157    
158            * libraries/thuban/wxproj.cpp: including proj_api.h instead of
159            projects.h now. According the Frank Warmerdam and man pj_init
160            this is the public interface to proj. Thus I have changed PJ to projPJ.
161            And I could remove the hack to avoid clashes with typedef PVALUE
162            and #define LP in projects.h clashing with symbols when trying to
163            build on windows. The file is cleaner and nicer now.
164    
165    2006-03-29  Bernhard Reiter <[email protected]>
166    
167            * libraries/thuban/wxproj.cpp: undef LP to avoid clash when
168            trying to build with mingw.
169    
170    2005-10-18  Bernhard Reiter <[email protected]>
171    
172            * Thuban/UI/about.py: remove unused import of getdefaultlocale.
173            Added display of internal encoding to the about dialog text.
174    
175            * Extensions/svgexport/__init__.py: changed version to "1.0.0+cvs".
176    
177    2005-10-18  Bernhard Reiter <[email protected]>
178    
179            Startup improved: We fail right away if the internal encoding could
180            not be determined.
181    
182            * Thuban/__init__.py (get_internal_encoding): new.
183    
184            * test/test_stringrepresentation.py (class TestInternalEncoding):
185            Preserve the internal encoding for the tests in this class.
186    
187    2005-10-17  Bernhard Reiter <[email protected]>
188    
189            * test/test_stringrepresentation.py: New file, for now testing
190            that set_internal_coding() is throwing an exception for bad exceptions.
191    
192            * Thuban/__init__.py (set_internal_encoding): added a forwards
193            and backward translation, so that we fail early if the
194            internal_encoding is bad.
195    
196    2005-10-17  Bernhard Reiter <[email protected]>
197    
198            svgexport 1.0.0cvs: Fixed ARC layer writing: No filling is done.
199            You could actually get polylines with filling in between,
200            when the classification for the lines had a fill color.
201            E.g. this happens when you generate a classification from a ramp.
202    
203            * Extensions/svgexport/test/test_svgmapwriter.py:
204            New test_export_arc_no_fill(). Extend copyright notice to 2005.
205    
206            * Extensions/svgexport/svgmapwriter.py
207            (SVGRenderer.draw_shape_layer_incrementally()):
208            Setting TRANSPARENT_BRUSH for shaptype ARC.
209            Extend copyright notice to 2005.
210    
211            * Extensions/svgexport/__init__.py: Extend copyright notice to 2005.
212    
213    2005-09-08  Frank Koormann <[email protected]>
214    
215            * Doc/manual/thuban-manual.xml (Map Management): Fixed typo reported
216            by Erik (sigra.at.home.se)
217    
218    2005-08-18  Jan-Oliver Wagner <[email protected]>
219    
220            * Thuban/UI/renderer.py (ScreenRenderer.draw_selection_incrementally):
221            Call the right method for the default size.
222    
223    2005-08-11  Jan-Oliver Wagner <[email protected]>
224    
225            * Extensions/export_shapefile: New.
226    
227            * Extensions/export_shapefile/__init__.py: New. Initialize
228            the export_shapefile extension.
229    
230            * Extensions/export_shapefile/export_shapefile.py: New.
231            Exports a layer as a Shapefile.
232    
233    2005-08-08  Jan-Oliver Wagner <[email protected]>
234    
235            * po/de.po: String fixes. This fixes Debian bug #313843.
236    
237    2005-07-27  Jan-Oliver Wagner <[email protected]>
238    
239            Remove the attributes from the layer element in
240            .thuban files for the save routine.
241            This also solves RT bug #3149,
242            https://intevation.de/rt/webrt?serial_num=3149
243    
244            * test/test_load.py: (TestSingleLayer, TestNonAsciiColumnName,
245            TestLayerVisibility, TestSymbolSize, TestClassification, TestLabels,
246            TestLayerProjection, TestJoinedTable, TestLabelLayer): Removed
247            attributes from layer element to classification clnull element.
248    
249            * test/test_save.py (SaveSessionTest.testSingleLayer,
250            SaveSessionTest.testLayerProjection,
251            SaveSessionTest.testClassifiedLayer,
252            SaveSessionTest.test_joined_table, SaveSessionTest.test_save_postgis):
253            Removed attributes from layer element to classification clnull element.
254            (test_save_postgis.NonConnectionStore._fetch_table_information):
255            added pretending to have a shape_type.
256    
257            * Resources/XML/thuban-1.1.dtd: Make the attributes field
258            and field_type of classification optional.
259    
260            * Thuban/Model/classification.py (Classification.TreeItem.build_info):
261            Added output of size.
262    
263            * Thuban/Model/load.py (SessionLoader.start_classification):
264            Change attribute 'field' and 'field_type' from obligatory to
265            optional to allow empty classes (ie.  only with a default=clnull).
266    
267            * Thuban/Model/save.py (SessionSaver.write_layer): Don't write
268            any attributes anymore for the layer element.
269            (SessionSaver.write_classification): Even if there is no
270            classification field, still write the classification because
271            the clnull (default) symbol will not be defined anymore as
272            part of the layer element.
273    
274    2005-07-05  Bernhard Herzog  <[email protected]>
275    
276            * setup.py (setup call): Version 1.1.0
277    
278            * NEWS: Update for 1.1.0
279    
280            * MANIFEST.in: Add *.txt to files taken from Doc.  Otherwise the
281            technores won't be included
282    
283            * Thuban/UI/about.py (About.__init__): Extend copyright notice to
284            2005
285    
286            * po/de.po: Updated.
287    
288    2005-07-05  Bernhard Herzog  <[email protected]>
289    
290            * README: gdal 1.1.8 is too old.  1.2.5 works.
291    
292    2005-07-05  Bernhard Herzog  <[email protected]>
293    
294            * Resources/XML/thuban-1.1.dtd (rasterlayer): Add the opacity and
295            masktype attributes.
296    
297    2005-07-05  Bernhard Herzog  <[email protected]>
298    
299            * Thuban/Model/layer.py (Layer.__mangle_bounding_box)
300            (Layer.ClipBoundingBox): Rename ClipBoundingBox to
301            __mangle_bounding_box.  See the comments in the code and RT #2845
302    
303            * test/test_layer.py (TestLayer.test_arc_layer_with_projection):
304            Remove the explicit test of ClipBoundingBox.  The method isn't
305            public anymore and the direct call in the test wasn't necessary in
306            the first place.  If ClipBoundingBox (now __mangle_bounding_box)
307            isn't called, the return value of ShapesInRegion will be
308            different.
309    
310    2005-07-05  Bernhard Herzog  <[email protected]>
311    
312            * Thuban/UI/viewport.py (ViewPort.set_view_transform): Handle
313            ZeroDivisionError exceptions.  I don't know when they happen
314            exactly.  It probably happens when the projections aren't set
315            properly.
316    
317    2005-07-01  Bernhard Herzog  <[email protected]>
318    
319            First step towards unicode.  With this roughly we're at step 1
320            string_representation.txt
321    
322            * Doc/technotes/string_representation.txt: New.  Document how
323            strings are represented in Thuban and how to get to a Unicode
324            Thuban.
325    
326            * Thuban/__init__.py (set_internal_encoding)
327            (unicode_from_internal, internal_from_unicode): New. The first few
328            functions for the internal string representation
329    
330            * Thuban/UI/about.py (unicodeToLocale): Removed.  Use
331            internal_from_unicode instead.
332    
333            * Thuban/UI/__init__.py (install_wx_translation): Determine the
334            encoding to use for the internal string representation.  Also,
335            change the translation function to return strings in internal
336            representation even on unicode builds of wxPython
337    
338            * Thuban/Model/load.py (SessionLoader.check_attrs): Decode
339            filenames too.
340            (SessionLoader.start_clrange): Use check_attrs to decode and check
341            the attributes.
342    
343            * Thuban/Model/xmlreader.py (XMLReader.encode): Use
344            internal_from_unicode to convert unicode strings.
345    
346            * Thuban/Model/xmlwriter.py (XMLWriter.encode): Use
347            unicode_from_internal when applicable
348    
349            * test/runtests.py (main): New command line option:
350            internal-encoding to specify the internal string encoding to use
351            in the tests.
352    
353            * test/support.py (initthuban): Set the internal encoding to
354            latin-1
355    
356            * test/test_load.py (TestSingleLayer.test, TestClassification.test)
357            (TestLabelLayer.test): Use the internal string representation when
358            dealing with non-ascii characters
359    
360            * test/test_load_1_0.py (TestSingleLayer.test)
361            (TestClassification.test, TestLabelLayer.test): Use the internal
362            string representation when dealing with non-ascii characters
363    
364            * test/test_load_0_9.py (TestSingleLayer.test)
365            (TestClassification.test): Use the internal string representation
366            when dealing with non-ascii characters
367    
368            * test/test_load_0_8.py (TestUnicodeStrings.test): Use the
369            internal string representation when dealing with non-ascii
370            characters
371    
372            * test/test_save.py (XMLWriterTest.testEncode)
373            (SaveSessionTest.testClassifiedLayer): Use the internal string
374            representation when dealing with non-ascii characters where
375            applicable
376    
377    2005-06-30  Bernhard Herzog  <[email protected]>
378    
379            * test/runtests.py: Untabify.
380    
381    2005-06-30  Bernhard Herzog  <[email protected]>
382    
383            * Thuban/UI/renderer.py (ScreenRenderer.draw_selection_incrementally):
384            untabify.
385    
386    2005-06-30  Bernhard Herzog  <[email protected]>
387    
388            * Extensions/ogr/test/__init__.py: Add missing coding directive
389    
390    2005-06-28  Jan-Oliver Wagner <[email protected]>
391    
392            * Thuban/UI/renderer.py (ScreenRenderer.draw_selection_incrementally):
393            Use the default size for rendering selected items of default type.
394            Fixes part 2 of https://intevation.de/rt/webrt?serial_num=3149
395    
396    2005-06-28  Jan-Oliver Wagner <[email protected]>
397    
398            * Extensions/importAPR/apr.py (APR_BShSym): Extend by 'Stripple'.
399            (APR_TClr.GetThubanColor): Fix bug in color interpretation.
400            Thanks to Frank Koormann who identified this problem.
401    
402            * Extensions/importAPR/importAPR.py (APR_VShSym): New. Just
403            another symbol identified.
404    
405    2005-06-27  Jan-Oliver Wagner <[email protected]>
406    
407            * Doc/manual/thuban-manual-de.xml: More translations.
408    
409    2005-05-12  Jonathan Coles <[email protected]>
410            
411            * Thuban/UI/projdialog.py: Add missing import, which led to an
412            exception when opening a layer's projection.
413    
414    2005-05-09  Bernhard Herzog  <[email protected]>
415    
416            * test/support.py (FileLoadTestCase.filename): Fix doc-string.
417    
418    2005-05-09  Bernhard Herzog  <[email protected]>
419    
420            * Thuban/Model/postgisdb.py (PostGISConnection.connect): Set the
421            connection to autoconnect.  Fixes RT#3148.
422    
423            * test/test_postgis_db.py
424            (TestPostGISSpecialCases.test_simple_error_handling): New test
425            that attempts to reproduce RT#3148.
426    
427    2005-05-06  Jonathan Coles <[email protected]>
428    
429            Add support for saving and loading the opacity and mask type
430            properties of RasterLayers. Also add support for proper use
431            of alpha information while drawing images not in 'RAW' format.
432            If transparency in an image format (e.g, PNG) is supported by
433            wxWidgets then the image would previously have been draw with
434            transparent regions, but the opaque regions would have been
435            unaffected by a change in the layer's opacity. This patch
436            corrects the problem.
437    
438            * Thuban/Model/layer.py (RasterLayer): Added opacity and
439            masktype parameters to the constructor, and set the
440            appropriate variables to those values.
441    
442            * Thuban/Model/load.py (SessionLoader.start_rasterlayer): Added
443            code to read the opacity and mask type of the layer and construct
444            a new layer with the additional parameters.
445    
446            * Thuban/Model/save.py (SessionSaver.write_layer): Added code
447            to save the opacity and mask type of a layer.
448    
449            * Thuban/UI/baserenderer.py (BaseRenderer.draw_raster_layer): Pass
450            the opacity of the layer to draw_raster_data rather than the layer.
451            (BaseRenderer.draw_raster_data): Remove the layer parameter because
452            the function doesn't need to know about the layer. Add the optional
453            opacity parameter whose default is 1.0. Add 'PNG' as a supported
454            graphics format.
455    
456            * Thuban/UI/renderer.py (MapRenderer.draw_raster_data): Fixed
457            signature to match that in BaseRenderer. Use the new opacity argument
458            in place of calling layer.Opacity(). In the case where the
459            format is not 'RAW', alpha_data is None and the loaded image has
460            alpha information, use the file's alpha information. This is
461            still subject to the layer's opacity setting.
462    
463            * test/test_baserenderer.py (SimpleRenderer.draw_raster_data):
464            Fixed signature to match that in BaseRenderer.
465    
466            * test/test_load.py (TestRasterLayer): Change file_contents to
467            include opacity and masktype variables.
468            (TestRasterLayer.test): Include tests for opacity and masktype
469            changes.
470    
471            * test/test_save.py (SaveSessionTest.testRasterLayer): Restructure
472            test to cover a variety of combinations of masktype and opacity
473            settings.
474    
475    2005-05-02  Jan-Oliver Wagner <[email protected]>
476    
477            * debian/rules: add --use-wx-python-swig-hack
478            to the build command.
479            Thanks to Moritz Lennert for pointing this out.
480    
481    2005-04-28  Jan-Oliver Wagner <[email protected]>
482    
483            Introduce OGRFileShapeStore in ogr extension.
484            This allows at least that loaded shapefile shape stores
485            can be saved correctly in the thuban session file
486            and reloaded again (reload is via core shapefile
487            routine, not OGR). For other types, .thuban files
488            can not be reloaded for the time being.
489    
490            * Extensions/ogr/ogrshapes.py (OGRFileShapeStore): New. This
491            class ist to be used for any file-based shape stores
492            accessed through OGR.
493    
494            * Extensions/ogr/ogrstart.py (open_with_ogr): Added
495            forgotten _ for i18n. Adapted call OpenFileShapestore
496            regarding new parameter.
497            (OpenFileShapestore): Use OGRFileShapeStore instead of
498            OGRShapeStore. Fix return value (None instead of null).
499            Add new parameter "mainwindow" to avoid accessing global
500            context.
501    
502    2005-04-27  Jan-Oliver Wagner <[email protected]>
503    
504            Introduce FileShapeStore as generalization for
505            file-based shape stores. In a first instance
506            this allows additional modules to handle shapefile
507            format as well, namely the OGR extension.
508    
509            * Thuban/Model/data.py: Various small fixes in doc-strings.
510            (FileShapeStore): New class.
511            (ShapefileStore): Derive from FileShapeStore.
512            (ShapefileStore.__init__): Call __init__ of FileShapeStore,
513            rename self.table to self._table, initialize self._bbox
514            (ShapefileStore._open_shapefile): Use self._bbox instead of self.bbox
515            and self.FileName() instead of self.filename.
516            (ShapefileStore.Table): Use self._table instead of self.table.
517            (ShapefileStore.FileName): Removed (moved to FileShapeStore).
518            (ShapefileStore.BoundingBox):  Use self._bbox instead of self.bbox.
519    
520            * Thuban/Model/save.py: Replace ShapefileStore by FileShapeStore.
521            (SessionSaver.write_data_containers): Only use methods of the
522            base class FileShapeStore.
523    
524    2005-04-26  Martin Schulze  <[email protected]>
525    
526            * Extensions/wms/wms.py (render_wms_layer): Adjusted the render
527            function to the modified render engine
528    
529    2005-04-25  Martin Schulze  <[email protected]>
530    
531            * Thuban/UI/renderer.py (MapRenderer.projected_raster_layer):
532            Added a description according to the CVS log message
533    
534    2005-04-23  Martin Schulze  <[email protected]>
535    
536            * Thuban/UI/renderer.py: Added a missing import
537    
538    2005-04-23  Russell Nelson  <[email protected]>
539    
540            * Thuban/UI/view.py (MapCanvas.OnMiddle{Up,Down}): Changed the
541            way the previous tool is remembered, so that middle-button
542            panning works even if you haven't selected a tool.
543    
544    2005-04-11  Bernhard Herzog  <[email protected]>
545    
546            * libraries/thuban/wxproj.cpp: Move the compatibility code that
547            deals with the wxPython 2.4 version of wxPython.h into the #ifdef
548            branch that includes wxPython.h because it's only needed when
549            wxPython.h is used.  Also, it won't compile when
550            USE_WX_PYTHON_SWIG_HACK is set otherwise.
551    
552    2005-04-07  Bernhard Herzog  <[email protected]>
553    
554            * Thuban/UI/classifier.py (ClassGrid.__init__): Use -1 as the ID.
555            (ID_CLASS_TABLE): Removed. It wasn't used anywhere except in
556            ClassGrid.__init__ and it's value is outside of the valid
557            range (must be < 32768).  wxPython 2.5 complains about it with an
558            exception.
559    
560    2005-04-05  Jan-Oliver Wagner <[email protected]>
561    
562            * Doc/manual/thuban-manual-de.xml: More translations.
563    
564    2005-04-05  Bernhard Herzog  <[email protected]>
565    
566            * libraries/thuban/wxproj.cpp: Make it work with a wxPython.h from
567            wxPython 2.4 as well.  Also, remove a now obsolete comment.
568    
569    2005-04-05  Bernhard Herzog  <[email protected]>
570    
571            Use wxPython.h by default but provide a workaround when it isn't
572            available.
573    
574            * setup.py (wxproj_extension): New variable.  Assign the Extension
575            instance for Lib.wxproj to this variable instead of putting it
576            directly into the listso that it can be accessed by other code
577            later.
578            (thuban_build_ext.user_options): Added boolean option
579            --use-wx-python-swig-hack.
580            (thuban_build_ext.initialize_options): Initialize the new option
581            to False.
582            (thuban_build_ext.finalize_options): If the new option was given,
583            define the preprocesser macro USE_WX_PYTHON_SWIG_HACK.
584            (thuban_build_ext): Update the doc-string
585    
586            * libraries/thuban/wxproj.cpp: Normally we use
587            wx/wxPython/wxPython.h now.  Only if USE_WX_PYTHON_SWIG_HACK is
588            defined, use swigPtrConvertHack.h instead.
589    
590            * libraries/thuban/swigPtrConvertHack.h: Remove the code that was
591            copied over from wxPython.h.
592            (decode_pointer_new): New.  Equivalent of decode_pointer for
593            wxPython 2.5.
594            (wxPyConvertSwigPtr): Modified to cope with wxPython 2.5 as well.
595    
596            * README: Add section on potential build problems which explains
597            how the work-around for a missing wxPython.h is activated.
598    
599    2005-03-29  Bernhard Herzog  <[email protected]>
600    
601            * test/postgissupport.py (find_postgis_sql): Added yet another
602            potential location for (lw)postgis.sql because the file has moved
603            again in postgis 1.0.0 rc4.
604    
605    2005-03-29  Bernhard Herzog  <[email protected]>
606    
607            * Thuban/UI/legend.py (BMP_SIZE_W, BMP_SIZE_H): Set both to 16 to
608            match the site of the legend_icon_layer icon.  Otherwise wxpython
609            2.5 complains when the legend is created with the error:
610    
611            PyAssertionError: C++ assertion "(bitmap.GetWidth() == m_width &&
612            bitmap.GetHeight() == m_height) || (m_width == 0 && m_height ==
613            0)" failed in ./src/generic/imaglist.cpp(81): invalid bitmap size
614            in wxImageList: this might work on this platform but definitely
615            won't under Windows.
616    
617    2005-03-23  Jonathan Coles <[email protected]>
618    
619            These changes add support for adjusting the opacity of a raster layer.
620    
621            * Thuban/Model/layer.py (RasterLayer.Opacity): Replaces AlphaOpacity.
622            (RasterLayer.SetOpacity): Replaces SetAlphaOpacity. Also triggers
623            a LAYER_CHANGED event if the opacity actually changes.
624    
625            * Thuban/UI/baserenderer.py (BaseRenderer.draw_raster_data): Added
626            layer parameter needed in the implementation of this method in
627            renderer.py.
628    
629            * Thuban/UI/layerproperties.py (LayerProperties.dialog_layout): Fixed
630            typo 00 -> 0.
631    
632            * Thuban/UI/rasterlayerproperties.py (RasterLayerProperties): Added
633            control to adjust opacity.
634    
635            * Thuban/UI/renderer.py (MapRenderer.draw_raster_data): Scale the
636            alpha data based on the opacity level of the layer.
637    
638            * test/test_baserenderer.py (SimpleRenderer.draw_raster_data): Now
639            accepts a layer parameter.
640    
641            * test/test_layer.py (TestLayerModification.test_raster_layer):
642            Rename opacity method calls and add test for LAYER_CHANGED.
643    
644    2005-03-16  Bernhard Herzog  <[email protected]>
645    
646            * test/test_connector.py (DeletionTestMixin.check_deletions)
647            (DeletionTestMixin.check_deletetions): renamed to check_deletions.
648            update the callers.
649    
650    2005-03-14  Jan-Oliver Wagner <[email protected]>
651    
652            * Doc/manual/thuban-manual-de.xml: More translations.
653    
654    2005-03-10  Jan-Oliver Wagner <[email protected]>
655    
656            Introducing initialization callbacks for extensions.
657    
658            * Thuban/UI/extensionregistry.py (ExtensionDesc.__init__): Added
659            optional parameter init_callback.
660            (ExtensionDesc.init_ext): New. Executes the callback and sets
661            a status.
662    
663            * Thuban/UI/application.py (ThubanApplication.OnInit): Add the
664            initialization of the extensions.
665            (ThubanApplication.init_extensions): Init all extensions.
666    
667            * Thuban/UI/about.py (About.__init__): Added status of the extensions
668            to the about text.
669    
670            * Extensions/gns2shp/__init__.py: Added init method for Extension
671            description.
672            (init): New. Contains the initialization of the module.
673    
674    2005-03-04  Nina H�ffmeyer <[email protected]>
675    
676            * Extensions/ogr/ogrdialog.py: Added a dialog, which asks for
677            OGRConnection to open a datasource. Removed dialog to display all
678            available drivers. Added some doc strings.
679    
680            * Extensions/ogr/ogrstart.py: Added menu entry for opening an
681            OGRDatasource with a string. Added two opening methods which return an
682            OGRDatasource (either data from file or from DB).
683    
684            * Extensions/ogr/ogrshapes.py: Added class OGRGeometry, which
685            represents a geometry reference of an OGRFeature. OGRShape now has a
686            list of referenced geometry objects (important for geometry
687            collections).
688            For OGRShapeStores loaded from a DB an ID column can be specified now.
689    
690    2005-02-22  Jan-Oliver Wagner <[email protected]>
691    
692            * test/test_map.py (TestMapWithContents.test_tree_info):
693            Added label layer for comparison.
694    
695    2005-02-18  Jonathan Coles <[email protected]>
696    
697            * libraries/thuban/gdalwarp.cpp (GetImageData): Optimize the loop
698            which builds a mask. Handle the majority of an image in a loop,
699            creating 8 bits at a time. Later, handle the edge case where less
700            than 8 bits are packed.
701    
702    2005-02-18  Bernhard Herzog  <[email protected]>
703    
704            * test/test_baserenderer.py (TestBaseRenderer.setUp): Fix
705            doc-string
706    
707    2005-02-18  Jonathan Coles <[email protected]>
708    
709            * setup.py: Remove wx_cs_params from gdal compile options.
710    
711    2005-02-18  Jonathan Coles <[email protected]>
712    
713            Refactored baserenderer.py and renderer.py to remove baserenderer.py's
714            dependencies on wxPython. Added a new method projected_raster_layer()
715            that returns a raster layer image in projected space. This must be
716            implemented in classes derived from BaseRenderer. This also eliminates
717            the dependency on gdal in baserenderer.py.
718    
719            * Thuban/UI/baserenderer.py (BaseRenderer.draw_raster_layer): Call
720            new projected_raster_layer() to get projected raster image instead
721            of directly calling ProjectRasterFile().
722            (BaseRenderer.projected_raster_layer): New. This must be implemented
723            by derived classes. It takes almost the same arguments as ProjectRasterFile
724            did and returns a projected image with mask and alpha data (if requested).
725            (BaseRenderer.render_map_incrementally): Remove the check for gdal since
726            that check will be done in MapRenderer.projected_raster_layer(). This
727            also allows other implementations to use different projection code.
728    
729            * Thuban/UI/renderer.py (MapRenderer.projected_raster_layer):
730            Implementation of BaseRenderer.projected_raster_layer. Checks for
731            gdal support and wxPython version. Also handles exceptions from
732            ProjectRasterFile.
733    
734            * libraries/thuban/gdalwarp.cpp: Removed checks for wxPython versions
735            and added a variable which can be set through the options argument
736            of ProjectRasterFile.
737    
738            * test/test_baserenderer.py (SimpleRenderer.projected_raster_layer): New.
739            Calls ProjectRasterFile and returns the result.
740            (TestBaseRenderer.test_projected_raster_layer): New. Tests the results
741            of calling projected_raster_layer() with different options.
742            (TestBaseRenderer.test_raster_no_projection): Removed tests based on
743            wxPython version and all tests of masks and alpha channels. These are
744            now in test_projected_raster_layer().
745    
746    2005-02-17  Jan-Oliver Wagner <[email protected]>
747    
748            * Thuban/Model/map.py, Thuban/Model/label.py: Fixed
749            doc-strings to comply with coding_guidelines.
750    
751    2005-02-17  Jan-Oliver Wagner <[email protected]>
752    
753            Docstring improvements and minor fixes for labellayer.
754    
755            * Thuban/Model/map.py:
756            (Map, Map.Destroy, Map.RemoveLayer, Map.ClearLayers,
757            Map.Layers, Map.HasLayers, Map.MoveLayerToTop,
758            Map.RaiseLayer, Map.LowerLayer, Map.MoveLayerToBottom,
759            Map.ProjectedBoundingBox, Map.GetProjection): Improved/added
760            doc string.
761            (Map.BoundingBox): Removed superfluous test for label_layer
762            and improved doc string.
763            (Map.TreeInfo): Added label_layer and improved sdo string.
764    
765            * Thuban/Model/label.py: Added import of _.
766            (Label, Label.__init__): Improved/added doc string.
767            (LabelLayer, LabelLayer.__init__, LabelLayer.Labels,
768            LabelLayer.RemoveLabel, LabelLayer.ClearLabels):
769            Improved/added doc string.
770            (LabelLayer.AddLabel): Use already defined names for
771            align strings and improved doc string.
772            (LabelLayer.TreeInfo): New. Return the object data for
773            the tree view.
774    
775    2005-02-16  Jonathan Coles <[email protected]>
776    
777            Further wxPython 2.5 changes using patches from Daniel Calvelo Aros
778            so that that wxproj doesn't crash. Added GUI support for selecting
779            alpha channel (opacity can't be selected yet).
780    
781            NOTE: If wxPython.h is including in future distribution packages
782            then it will not be necessary to have the files swigPtrConvertHack.h
783            and wxPython_int.h included with Thuban. This is hopefully
784            a temporary workaround.
785    
786            * setup.py (thuban_build_ext.finalize_options): gdalwarp needs
787            access to the macro wxCHECK_VERSION so that it will properly
788            generate a bit mask. There was a problem between wx2.4 and wx2.5
789            that this works around.
790    
791            * Thuban/Model/layer.py (RasterLayer.UseMask): Removed in favor
792            of RasterLayer.MaskType.
793            (RasterLayer.SetUseMask): Removed in favor of RasterLayer.SetMaskType
794            (RasterLayer.MaskType): New. Returns the type of mask to use. Can
795            specify none, a bitmap, or an alpha channel.
796            (RasterLayer.SetMaskType): New. Set what kind of mask to use.
797    
798            * Thuban/UI/baserenderer.py (BaseRenderer.draw_raster_layer):
799            Set the raster warping options for the mask based on the value
800            of RasterLayer.MaskType.
801    
802            * Thuban/UI/legend.py (LegendTree.__FillTreeLayer): Remove
803            deprecated calls to SetItemSelectedImage in favor of SetItemImage
804            with wxTreeItemIcon_Selected.
805    
806            * Thuban/UI/rasterlayerproperties.py: Support selecting to use
807            an alpha channel for the mask.
808    
809            * Thuban/UI/renderer.py (MapRenderer.draw_raster_data): Use alpha
810            data if it is available and an alpha channel is supported under
811            the current version of wxPython.
812    
813            * libraries/thuban/gdalwarp.cpp (GetImageData): Added compiler define
814            to select whether 1's or 0's select the desired portion of an image
815            in the bit mask. wx2.4 has a bug where the documentation is the opposite
816            from behavior.
817            (ProjectRasterFile): Only generate an alpha channel if the version
818            of wxPython is >= 2.5.3.
819    
820            * libraries/thuban/wxproj.cpp: Applied patches from Daniel Calvelo Aros.
821            When wxPython >= 2.5.3 use the special swig functions to decode an
822            object's address.
823    
824            * libraries/thuban/swigPtrConvertHack.h: Includes conditional code
825            based on the version of wxPython. If >= 2.5.3 use the special swig
826            functions from wxPython to decode wxPython objects, otherwise use
827            the old method of retrieving the address from the object __repr__ string.
828    
829            * libraries/thuban/wxPython_int.h: Copied from wxPython source.
830            Unnecessary code was removed to make it smaller.
831    
832            * test/test_baserenderer.py (TestBaseRenderer.test_raster_no_projection):
833            Add tests for returning an alpha channel.
834    
835            * test/test_layer.py (TestLayerModification.test_raster_layer): Fix
836            tests that used removed functions UseMask and SetUseMask
837    
838    
839    2005-02-08  Bernhard Herzog  <[email protected]>
840    
841            More wxPython 2.5 changes.  This time taken from a patch from
842            Daniel Calvelo Aros.
843    
844            * Thuban/UI/tableview.py (QueryTableFrame.__init__)
845            (QueryTableFrame.__init__): Pass the size of a spacer as a single
846            item.
847    
848            * Thuban/UI/projdialog.py (ProjFrame.build_dialog)
849            (ProjFrame.build_dialog): Pass the size of a spacer as a single
850            item.
851    
852            * Thuban/UI/dbdialog.py (ChooseDBTableDialog.__init__): Pass the
853            size of a spacer as a single item.
854    
855            * Thuban/UI/classifier.py (Classifier.dialog_layout): Pass the
856            size of a spacer as a single item.
857    
858    2005-02-08  Bernhard Herzog  <[email protected]>
859    
860            Compatibility with wxPython 2.5.  The changes should make it work
861            better with 2.5 while still keeping compatibility with 2.4.  There
862            are still problems with 2.5, though.
863    
864            * Thuban/UI/dock.py (DockableWindow.__CreateBorder): Pass the size
865            of a spacer as a single item.
866    
867            * Thuban/UI/classifier.py (ClassGroupPropertiesCtrl): Derive only
868            from wxControl
869    
870            * Thuban/UI/legend.py (LegendTree): When running with wxPython <
871            2.5, add an implementation of the GetFirstChild method that does
872            not require the second parameter.
873            (LegendTree.find_layer, LegendTree._OnMsgMapLayersAdded)
874            (LegendTree._OnMsgMapLayersRemoved, LegendTree.DeleteAllItems)
875            (LegendTree.DeleteChildren, LegendTree.__ShowHideLayer): Do not
876            pass the second parameter to GetFirstChild
877    
878    2005-02-08  Nina H�ffmeyer <[email protected]>
879    
880            * Extensions/ogr/ogrshapes.py: Removed some print commands.
881    
882            * Extensions/ogr/ogrstart.py: Changed the GUI. OGR is no longer an
883            additional menu but appears as a possibility in the menu Map.
884    
885    2005-02-07  Jonathan Coles <[email protected]>
886            * libraries/thuban/gdalwarp.cpp: Removed the macros PYTHON_ERR
887            and PYTHON_ERRF since they were no longer necessary.
888    
889    2005-02-07  Bernhard Reiter <[email protected]>
890            * Thuban/UI/classifier.py (ClassGrid.DeleteSelectedRows):
891            Enable translation for message string.
892    
893    2005-02-06  Martin Schulze  <[email protected]>
894    
895            * Extensions/wms/infodialog.py (wmsInfoDialog.__init__): Adjusted
896            the arguments of the contstructor to fit the global scheme
897    
898    2005-01-31  Nina H�ffmeyer <[email protected]>
899    
900            * Extensions/ogr/ogrdialog.py: Added class ogrdialog.py, which provides
901            some dialogs needed to start ogr.
902            
903            * Extensions/ogr/__init__.py: Changed comments to avoid encoding
904            warnings.
905    
906            * Extensions/ogr/test/test_OGRShapestore.py: Changed comments to avoid
907            encoding warnings.
908    
909    2005-01-28  Jonathan Coles <[email protected]>
910    
911            * libraries/thuban/gdalwarp.cpp (GetImageData): Recode how the
912            mask is packed into a bit array. It's now slightly faster.
913    
914    2005-01-28  Jonathan Coles <[email protected]>
915    
916            * Thuban/Model/layer.py (RasterLayer.__init__): Make use_mask
917            default to true.
918    
919            * Thuban/Model/load.py (SessionLoader.start_rasterlayer): Remove
920            code that loads the state of the layer's use_mask flag. Its
921            usefulness is still being debated.
922    
923            * Thuban/Model/save.py (SessionSaver.write_layer): Remove
924            code that saves the state of the layer's use_mask flag. Its
925            usefulness is still being debated.
926    
927            * Thuban/UI/baserenderer.py (BaseRenderer.draw_raster_layer): Pass
928            options to ProjectRasterFile based on the state of layer.UseMask().
929            Catch more exceptions from ProjectRasterFile so that Thuban doesn't
930            quit is there is a problem projecting.
931            (BaseRenderer.draw_raster_data): Change the documentation to
932            describe the new format (XBM) that the mask data will be in.
933    
934            * Thuban/UI/renderer.py (MapRenderer.draw_raster_data): The mask
935            data is in XBM format when format='RAW' which means it doesn't
936            need to be converted to a wxImage before being used as a mask
937            for a wxBitmap. Assume that if format != 'RAW' that the image
938            data and mask data are in the same format.
939    
940            * libraries/thuban/gdalwarp.cpp (GetImageData): If alpha is enabled
941            and a mask is requested, convert the alpha band to a bit array in
942            XBM format. if an alpha channel is requested, simply return the
943            data in the alpha band. Provide better error handling by returning
944            python error messages (also fixes RT #2947).
945            (ProjectRasterFile): Support multiple mask options, rather than simply
946            a flag indicating that a mask should or should not be used. Provide
947            better error handling by returning python error messages.
948    
949            * test/test_baserenderer.py (TestBaseRenderer.test_raster_no_projection):
950            Add mask data to test.
951    
952            * test/test_layer.py (TestLayer.test_raster_layer): Test that a layer
953            should use the mask by default.
954            (TestLayerModificaton.test_raster_layer): Test that a layer should use
955            the mask by default.
956    
957            * test/test_load.py (TestRasterLayer.test): Remove testing for
958            use_mask flag in file.
959    
960            * test/test_save.py (SaveSessionTest.testRasterLayer): Remove testing
961            for use_mask in file.
962    
963            * test/test_load_1_0_1.py: Removed. Shouldn't have been checked in.
964            
965    2005-01-26  Jonathan Coles <[email protected]>
966    
967            Add a new dialog box for raster layers. The dialog box allows
968            the user to toggle a mask that is generated by ProjectRasterFile
969            and is used to only draw the real parts of the projected image.
970    
971            * Thuban/UI/baserenderer.py (BaseRenderer.draw_raster_layer):
972            Instruct the warping code to generate a mask if the raster layer
973            requests one.
974            (BaseRenderer.draw_raster_data): Removed obsolete optional mask argument.
975    
976            * Thuban/UI/renderer.py (MapRenderer.draw_raster_data): Removed
977            obsolete optional mask argument.
978    
979            * Thuban/UI/classifier.py (Classifier): Change the parent class
980            to LayerProperties and rework the code to support layout calls
981            from the parent.
982            (Classifier.dialog_layout): New. Layout the dialog box.
983            (Classifier.map_layers_removed): Removed. Moved to parent class.
984            (Classifier.map_replaced): Removed. Moved to parent class.
985            (Classifier._OnTry): Renamed to OnTry to support parent class.
986            (Classifier.OnClose): Removed. Supplied in parent class.
987            (Classifier._OnCloseBtn): Removed. Supplied in parent class as OnCloseBtn.
988            (Classifier._OnOK): Renamed to OnOK to support parent class.
989            (Classifier._OnRevert): Renamed to OnRevert to support parent class.
990    
991            * Thuban/UI/layerproperties.py: New. Base class for layer properties
992            dialog boxes.
993    
994            * Thuban/UI/rasterlayerproperties.py: New. Class for displaying
995            raster layer properties.
996    
997            * libraries/thuban/gdalwarp.cpp: Replace the old gdalwarp.cpp code
998            with the non-simple version supplied with gdal. This allows added
999            features such as creating an alpha band.
1000            (GetImageData): Generate a mask array from the alpha band that is
1001            generated by gdal if the user has selected it. Try to support images
1002            that have more than three bands, such as images with RGB plus an
1003            alpha band.
1004            (ProjectRasterFile): Convert python argument for mask and tell
1005            gdal to enable or disable an alpha band.
1006    
1007            * Thuban/Model/layer.py (BaseLayer.Type): New. Returns a string
1008            describing what kind of layer the class is. Defaults to "Unknown",
1009            but should be overridden by subclasses.
1010            (Layer.Type): New. Override base class method.
1011            (RasterLayer.__init__): Create a flag for using a mask. Record extra
1012            data from gdal for display in the properties dialog.
1013            (RasterLayer.Type): New. Override base class method.
1014            (RasterLayer.UseMask): New. Returns True if the mask should be used.
1015            (RasterLayer.SetUseMask): New. Set if the mask should be used.
1016            (RasterLayer.ImageInfo): New. Return extra information about the image.
1017    
1018            * Thuban/Model/load.py (SessionLoader.start_rasterlayer): Load
1019            the mask information.
1020    
1021            * Thuban/Model/save.py (SessionSaver.write_layer): Save mask information.
1022    
1023            * Thuban/UI/mainwindow.py: Register the RasterLayerProperties and
1024            Classifier classes as dialogs to use with the proper layer types.
1025    
1026            * test/test_baserenderer.py (TestBaseRenderer.test_raster_no_projection):
1027            Fix test.
1028    
1029            * test/test_layer.py (TestLayer.test_raster_layer): Test new methods.
1030            (TestLayerModification.build_path): New. Support function.
1031            (TestLayerModification.test_raster_layer): New. Test new methods.
1032    
1033            * test/test_save.py (SaveSessionTest.testRasterLayer): Add tests for mask.
1034    
1035            * test/test_load.py (TestRasterLayer): Add tests for mask.
1036    
1037            * test/test_load_1_0_1.py: New. Copied from test_load.py.
1038    
1039            * test/test_baserenderer.py (SimpleRenderer.draw_raster_data): Removed
1040            obsolete optional mask argument.
1041    
1042    2005-01-26  Nina H�ffmeyer <[email protected]>
1043    
1044            * Extensions/ogr/ogrshapes.py: Added two dictionaries to ShapeStore
1045            which maps the ids and the ordinals. Fixed RowIdToOrdinal(),
1046            RowOrdinalToId() and ReadRowAsDict().
1047    
1048            * Extensions/ogr/ogrstart.py: Added menu item which opens database
1049            layers for existing database connections.
1050    
1051            * Extensions/ogr/test/test_OGRShapestore.py: Fixed a message string.
1052    
1053    
1054    2005-01-26  Jan-Oliver Wagner <[email protected]>
1055    
1056            * Doc/manual/thuban-manual-de.xml: More translations.
1057    
1058    2005-01-24  Bernhard Herzog  <[email protected]>
1059    
1060            Rework the status bar updates a bit to make sure the message about
1061            the projections is produced at the right times.
1062    
1063            * Thuban/UI/mainwindow.py (MainWindow.update_status_bar_messages):
1064            New class variable with messages that may require a status bar
1065            update.
1066            (MainWindow.view_position_changed)
1067            (MainWindow.update_status_bar): Rename from view_position_changed
1068            to update_status_bar.  It's meaning has changed now that it may
1069            also generate messages about problems with projection settings.
1070            (MainWindow.__init__): Use the new update_status_bar_messages
1071            class variable to subscribe update_status_bar
1072            (MainWindow.set_position_text): Update doc-string.  This method
1073            has to be renamed at some point.  See doc-string and comments.
1074            (MainWindow.OnClose): Unsubscribe update_status_bar from all
1075            messages in update_status_bar_messages
1076    
1077            * Thuban/UI/viewport.py (ViewPort.forwarded_map_messages): New
1078            class attribute.  map messages to be forwarded by the viewport.
1079            (ViewPort._subscribe_map, ViewPort._unsubscribe_map): (un)subscribe
1080            the messages in forwarded_map_messages
1081    
1082    2005-01-21  Bernhard Herzog  <[email protected]>
1083    
1084            * test/postgissupport.py (PostGISDatabase.__init__): Tweak
1085            doc-string
1086            (find_postgis_sql): Update for postgis-1.0.0-rc1, which uses a
1087            different name for the initialization SQL file.
1088    
1089    2005-01-21  Jonathan Coles <[email protected]>
1090    
1091            * Thuban/UI/baserenderer.py (proj_params_to_str): New. Takes
1092            a projection and returns a formatted string representing the
1093            parameters to feed to gdalwarp. This function eliminates
1094            redundancy in draw_raster_layer().
1095            (BaseRenderer.render_map_incrementally): Removed the optimization which
1096            drew the top most raster layer first and then only those vector-
1097            based layers that are above it. With the support for transparency
1098            this optimization breaks correct behaviour.
1099            (BaseRenderer.draw_raster_layer): Reorganize code to support possible
1100            future enhancements to raster layer bounding box. The old behaviour has
1101            not changed. Also, change calling parameters to draw_raster_data()
1102            to specify new RAW data format and mask.
1103            (BaseRenderer.draw_raster_data): Change signature to include an optional
1104            parameter for mask information. Change documentation to mention
1105            support for new parameter and added option for RAW data format.
1106            The data argument is now a list of [width, height, data].
1107    
1108            * Thuban/UI/renderer.py (MapRenderer.draw_raster_data): Add new optional
1109            mask parameter. Add new condition for RAW format, which
1110            significantly reduces rendering time. Add condition for
1111            mask parameter.
1112    
1113            * libraries/thuban/gdalwarp.cpp (GetImageData): New. Creates a
1114            data array of RGB values from the projected image returned from
1115            the gdal warping functions. In the case of palette based images, it
1116            converts the NO_DATA index to the mask color.
1117            (ProjectRasterFile): Removed all custom memory driver references
1118            and replaced it with the standard in-memory dataset provided
1119            by gdal. The return data is no longer a BMP file, but an array
1120            of RGB values, one set triple per pixel.
1121    
1122            * libraries/thuban/bmpdataset.cpp: Removed. Unnecessary.
1123            * libraries/thuban/cpl_mfile.h: Removed. Unnecessary.
1124            * libraries/thuban/cpl_mfile.cpp: Removed. Unnecessary.
1125    
1126            * setup.py (thuban_build_ext.finalize_options): Removed mention
1127            of cpl_mfile.cpp and bmpdataset.cpp files in the list of source
1128            files. These are obsolete with the new version of gdalwarp.cpp
1129    
1130            * test/test_baserenderer.py (SimpleRenderer.draw_raster_data):
1131            Updated signature.
1132            (TestBaseRenderer.test_raster_no_projection): Changed the test
1133            data to be data in the uncompressed RAW format returned from
1134            ProjectRasterFile.
1135    
1136    2005-01-21  Jan-Oliver Wagner <[email protected]>
1137    
1138            * Thuban/UI/mainwindow.py (MainWindow.view_position_changed): Made
1139            string available for i18n.
1140    
1141    2005-01-20  Russell Nelson  <[email protected]>
1142    
1143            * Resources/Projections/defaults.proj: Ruin the speling of the
1144            Lambert-93 projection so it doesn't run into the wx UTF-8 bug.
1145            It's the wrong thing to do in the long run, but it's necessary for
1146            those users until that bug is fixed.  Otherwise the projection
1147            dialog segfaults.  Better to annoy some Lambert-93 users with a
1148            spelling mistake than every Fedora Core 3 user of Thuban-CVS.
1149    
1150    2005-01-20  Bernhard Reiter <[email protected]>
1151    
1152            * Thuban/UI/mainwindow.py (MainWindow.view_position_changed): Added
1153            docstring and comment that the warning code here is a hack.
1154    
1155    2005-01-20  Russell Nelson  <[email protected]>
1156    
1157            * Thuban/UI/mainwindow.py (MainWindow.view_position_changed): Warn
1158            user about misprojected layers when their lat/lon bounding
1159            box exceeds rational lat/lon values.
1160    
1161    2005-01-20  Bernhard Reiter <[email protected]>
1162    
1163            * Thuban/UI/about.py (unicodeToLocale): Improved:
1164            Use 'ascii' and then 'replace' for other characters
1165            when getdefaultlocale returns None. Thanks to Bernhard H. .
1166    
1167    2005-01-20  Bernhard Reiter <[email protected]>
1168    
1169            * Thuban/UI/classgen.py (GenQuantilesPanel.OnRetrieve): Added a comment
1170            that OnRangeText might be called twice and using None as argument.
1171    
1172    2005-01-20  Bernhard Reiter <[email protected]>
1173    
1174            * Thuban/UI/classgen.py (GenQuantilesPanel.OnRetrieve): Add a
1175            OnRangeText(0) to work around a different in wx Behaviour noticed
1176            on MacOSX, thanks to Lorenzo Moretti and Daniel Calvelo for the fix.
1177    
1178    2005-01-20  Bernhard Reiter <[email protected]>
1179    
1180            * Thuban/UI/about.py: take iso-8859-15 when getdefaultlocale returns
1181            None. (Fixes rt#2910.)
1182            
1183    2005-01-18  Frank Koormann <[email protected]>
1184    
1185            New Extension: mouseposition
1186            Tool to collect mouse click positions (map coordinates) in a dialog.
1187    
1188            * Extensions/mouseposition/__init__.py: New, extension registration
1189    
1190            * Extensions/mouseposition/mouseposition.py: New, implements the
1191            dialog and adds a tool to Thuban mainwindow.
1192    
1193            * Extensions/mouseposition/position.xpm: New, icon for tool.
1194    
1195    2005-01-14  Jan-Oliver Wagner <[email protected]>
1196    
1197            * Doc/manual/thuban-manual-de.xml: More translations.
1198    
1199    2005-01-11  Frank Koormann <[email protected]>
1200    
1201            * Thuban/UI/mainwindow.py (MainWindow.DuplicateLayer):
1202            Fix indention bug.
1203    
1204    2005-01-09  Frank Koormann <[email protected]>
1205    
1206            * Thuban/UI/mainwindow.py (MainWindow.DuplicateLayer):
1207            BugFix 2901: Explicitly copy layers ClassificationColumn since it
1208            is not part of the layers Classification.
1209    
1210    2005-01-03  Frank Koormann <[email protected]>
1211    
1212            * Thuban/UI/renderer.py (ScreenRendererdraw_selection_incrementally):
1213            BugFix 2883: Former implementation only worked on classified point
1214            layers: KeyError was raised, now use the default size if field is None.
1215    
1216    2004-12-27  Bernhard Reiter <[email protected]>
1217    
1218            svgexport 1.0.0cvs: Fixed label export.
1219    
1220            * Extensions/svgexport/test/test_svgmapwriter.py:
1221            class TestSVGRenderer(): New class; new test test_label_font().
1222    
1223            * Extensions/svgexport/svgmapwriter.py
1224            (SVGRenderer.label_font()): initialised Font size with self.factor now,
1225            makes test_label_font happy.
1226    
1227            * Extensions/svgexport/TODO: crossed out fixed label export item.
1228            Added item for options.
1229    
1230            * Extensions/svgexport/__init__.py: Bumped version to 1.0.0cvs.
1231    
1232    2004-12-27  Russell Nelson  <[email protected]>
1233    
1234            Middle mouse button pans.
1235    
1236            * Thuban/UI/view.py (MapCanvas.__init__): Subscribe also
1237            OnMiddleDown and OnMiddleUp events.
1238            (MapCanvas.OnMiddleDown): New. Activate the pan tool and remember the
1239            previously used tool.
1240            (MapCanvas.OnMiddleUp): New. Reactivate the remebered tool used before
1241            pressing the middle mouse button.
1242    
1243    2004-12-27  Jan-Oliver Wagner <[email protected]>
1244    
1245            * Doc/manual/thuban-manual-de.xml: More translations.
1246    
1247    2004-12-23  Jan-Oliver Wagner <[email protected]>
1248    
1249            * Thuban/UI/projdialog.py (ProjFrame.load_user_proj): Added a
1250            \n to stderr after the warnings. Thanks to Russell Nelson.
1251    
1252    2004-12-20  Nina Hueffmeyer <[email protected]>
1253    
1254            * Extensions/ogr/ogrshapes.py: Fixed some issues from
1255            Bernhard (coding guidelines etc.). Additionally it is now possible to
1256            display shapefiles containing feature collections (e.g.polygons
1257            with holes). Works with gdal 1.2.1 now.
1258    
1259            * Extensions/ogr/test/test_OGRShapestore.py: Fixed some issues
1260            from Bernhard (coding guidelines etc.). If ogr can't be imported,
1261            tests are skipped now.
1262    
1263            * Extensions/ogr/ogrstart.py: Fixed some typings.
1264    
1265    2004-12-20  Bernhard Reiter <[email protected]>
1266    
1267            * Extensions/svgexport/TODO: updated to add support for
1268            raster layers and labels for 1.0.1.
1269    
1270            * Extensions/svgexport/svgmapwriter.py (draw_raster_layer):
1271            Issue a warning now.
1272    
1273    2004-12-19  Bernhard Reiter <[email protected]>
1274    
1275            * Extensions/svgexport/TODO: Added idea to support triggering
1276            the application down the pipe.
1277    
1278    2004-12-19  Bernhard Reiter <[email protected]>
1279    
1280            svgexport: Improved code quality, mainly by better naming.
1281    
1282            * Extensions/svgexport/svgmapwriter.py:
1283            DrawPath() renamed to DrawPolygonPath(),
1284            added documentation, improved comments and variable names.
1285            
1286            * Extensions/svgexport/svgmapwriter.py,
1287              Extensions/svgexport/test/test_svgmapwriter.py:
1288            All using DrawPolygonPath() now, the default parameter closed=True
1289            omitted.
1290    
1291            * Extensions/svgexport/test/test_svgmapwriter.py:
1292            renamed test_polygon_opened() to test_polyline()
1293            renamed test_transparent_polygon() to test_transparent_polyline()
1294    
1295    2004-12-18  Jan-Oliver Wagner <[email protected]>
1296    
1297            Some fixes of gns2shp extension.
1298    
1299            * Extensions/gns2shp/test/__init__.py: New. Make this directory a
1300            package.
1301    
1302            * Extensions/gns2shp/test/test_gns2shp.py: Add some import paths
1303            dynamically.
1304    
1305            * Extensions/gns2shp/test/README: Simplified description how to test.
1306    
1307            * Extensions/gns2shp/gns2shp.py (gns2shp): Fixed doc-string,
1308            fixed some dimensions of fields according to the GNS documentation
1309            which seems to change undocumented.
1310            Now killing trailing \n and/or \r from MODIFY_DATE.
1311            This fixes RT#2453.
1312    
1313    2004-12-18  Bernhard Reiter <[email protected]>
1314    
1315            svgexport 1.0.0: Treats holes and islands nicely. Documentation added.
1316    
1317            * Extensions/svgexport/test/test_svgmapwriter.py:
1318            Added new tests: test_export_polygon_with_hole()
1319            and test_polygon_with_hole().
1320    
1321            * Extensions/svgexport/svgmapwriter.py
1322            (draw_polygon_shape()): Uses DrawPath correctly now.
1323    
1324            * Doc/manual/thuban-manual.xml: Added documentation for stable
1325            extention svgexport.    
1326            * Doc/manual/thuban-manual-de.xml: Copied English section about
1327            svexport over.
1328    
1329            * Extensions/svgexport/__init__.py: Bumped version number to 1.0.0.
1330    
1331            * Extensions/svgexport/svgsaver.py,maplegend.py:
1332            Moved from experimental to stable extension menu.
1333    
1334            * Extensions/svgexport/TODO: updated.
1335    
1336    
1337    2004-12-18  Bernhard Reiter <[email protected]>
1338    
1339            Added Extensions/svgexport/TODO
1340    
1341    2004-12-18  Bernhard Reiter <[email protected]>
1342    
1343            Refactored in svgexport:
1344            DrawPath replaces DrawPolygon; added newline in front of "M" in paths.
1345    
1346            * Extensions/svgexport/svgmapwriter.py
1347            Added verbosity level 3 to print out polygon points.
1348            (class Point): added __repr__
1349            (class Brush, __str__()): Added space after ,.
1350            (DrawPolygon): Renamed to DrawPath()
1351            (DrawPath): Takes list of polygons as input now, adds \n before "M"s.
1352            (DrawLines): Using DrawPath now.
1353    
1354            * Extensions/svgexport/test/test_svgmapwriter.py:
1355            Replaced DrawPolygon() calls with DrawPath() and put the first argument
1356            inside another list. Adapted test data with a newline before "M".
1357    
1358    2004-12-18  Bernhard Reiter <[email protected]>
1359            
1360            Refactored svgexport tests: 9 double tests runs eliminated;
1361            code size reduced by 8 lines.
1362    
1363            * Extensions/svgexport/test/test_svgmapwriter.py:
1364            (class TestWithDC): Renamed to BaseTestWithDC, moved to top.
1365            (class BaseWithDCtools): New, subclass from BaseTestWithDC.
1366            (class TestDrawSplines): now subclass from BaseTestWithDCtools,
1367            this fixed the double running of the nine tests of TestVirtualDC.
1368            (class TestVirtualDC): Using self.dc and self.file from setUp().
1369    
1370    2004-12-17  Bernhard Herzog  <[email protected]>
1371    
1372            Two windows specific fixes ported from thuban-1�0-branch:
1373    
1374            * Thuban/UI/about.py (unicodeToLocale): Use getdefaultlocale
1375            instead of getlocale because getlocale doesn't return a usable
1376            encoding name on a german windows 2000
1377    
1378            * setup.py: windows build: Removed the absolute path names and
1379            made all prfixes relative to the directory containing setup.py.
1380            Makes it a little easier to adapt to a different system.
1381    
1382    2004-12-16  Bernhard Herzog  <[email protected]>
1383    
1384            Add support for PostGIS tables with LINESTRING geometries.
1385            Fixes RT#2299
1386    
1387            * Thuban/Model/postgisdb.py (shapetype_map): Add LINESTRING
1388    
1389            * test/postgissupport.py
1390            (PostgreSQLServer.get_default_static_data_db): Rename the "roads"
1391            table to "roads-multi" because it now uses MULTILINESTRING
1392            geometries and introduce a new "roads" table that uses LINESTRING
1393            (coords_to_multilinestring): Make the doc string more precise
1394            (coords_to_linestring): New.  Create a LINESTRING WKT
1395            representatin
1396            (wkt_converter): Add coords_to_linestring
1397            (upload_shapefile): Rephrase the doc-string a bit.
1398    
1399            * test/test_postgis_db.py (TestPostGISShapestoreArc)
1400            (LineStringTests)
1401            (TestPostGISShapestoreLineString)
1402            (TestPostGISShapestoreMultiLineString): Split
1403            TestPostGISShapestoreArc into a base class LineStringTests and two
1404            derived classes TestPostGISShapestoreLineString for LINESTRING
1405            geometries and TestPostGISShapestoreMultiLineString for
1406            MULTILINESTRING geometries.  Most test methods are in the base
1407            class with the exception of tests that explicitly check the raw
1408            format.
1409    
1410    2004-12-16  Bernhard Herzog  <[email protected]>
1411    
1412            Make the test suite work with PostGIS 0.8.2 and PostgreSQL 7.4
1413    
1414            * test/postgissupport.py (find_postgis_sql): Different postgis
1415            versions put the postgis.sql file into slightly different places
1416            so we have to look in both.  The updated doc string describes this
1417            is more detail.
1418    
1419            * test/test_postgis_db.py
1420            (TestPostGISSpecialCases.test_column_name_quoting): The return
1421            value of UniqueValues is unsorted, so it has to be sorted for
1422            comparison.
1423    
1424    2004-12-16  Bernhard Herzog  <[email protected]>
1425    
1426            Fix for RT#2237
1427    
1428            * Thuban/UI/projdialog.py (ProjFrame._show_proj_panel): If the
1429            panel to be shown is the UnknownProjPanel disable the OK and Try
1430            buttons.  Otherwise enable them.
1431            (ProjFrame.__GetProjection): The UnknownProjPanel returns None for
1432            the parameters.  In that case __GetProjection also returns None
1433            now.
1434    
1435    2004-12-15  Bernhard Herzog  <[email protected]>
1436    
1437            * Thuban/UI/classgen.py (GenQuantilesPanel.__init__): Set the
1438            minimum number of classes to 2.  The calculate_quantiles needs at
1439            least two and raises an exception otherwise.  
1440            Fixes RT#2549
1441    
1442    2004-12-15  Bernhard Herzog  <[email protected]>
1443    
1444            * test/postgissupport.py (PostgreSQLServer.execute_sql): Extend to
1445            so that it returns a result for select statements.
1446            (PostgreSQLServer.server_version): New.  Return the version of the
1447            server software.
1448            (PostgreSQLServer.require_authentication): The format of
1449            pg_hba.conf has changed between PostgrSQL 7.2 and 7.3.  Check the
1450            server version and generate the file in the correct format
1451    
1452    2004-12-15  Bernhard Herzog  <[email protected]>
1453    
1454            * test/postgissupport.py (PostgreSQLServer.is_running): Fix typo
1455            in the doc string and rephrase it a little.
1456    
1457    2004-12-15  Frank Koormann <[email protected]>
1458    
1459            * test/test_load.py (TestAltPath.checkSession): New, extended checks if
1460            session has been loaded successfully. The check is called by the relevant
1461            tests after executing load_session().
1462    
1463    2004-12-13  Bernhard Herzog  <[email protected]>
1464    
1465            Make sure the region used to determine which shapes are visible
1466            actually matches the region on the printed page.  If this isn't
1467            done properly some shapes might not be printed.  
1468            Fixes RT #2692
1469    
1470            * Thuban/UI/view.py (MapPrintout.draw_on_dc): The region for the
1471            renderer has to be at the same position as the mapregion
1472    
1473            * Thuban/UI/renderer.py (ExportRenderer.RenderMap): self.region
1474            has to be moved by (self.shiftx, self.shifty) too.
1475    
1476    2004-12-13  Bernhard Herzog  <[email protected]>
1477    
1478            * libraries/pyprojection/Projection.i: Work around a bug in the
1479            generated python code which leads to exception in the __del__
1480            method when the constructor fails.  See the comments in the code
1481            for more details.
1482    
1483            * libraries/pyprojection/Projection.py: Updated from Projection.i
1484            with SWIG.
1485    
1486    2004-12-13  Bernhard Herzog  <[email protected]>
1487    
1488            * test/test_load.py (TestAltPath.test_01_single_path_error_fix)
1489            (TestAltPath.test_02_path_error_fix_from_list)
1490            (TestAltPath.test_05_path_error_fix_from_list_changed)
1491            (TestAltPath.test_06_path_error_fix_from_list_fails): self.session
1492            is destroyed in tearDown, so there's no need to do it in a test
1493            case.
1494    
1495            * Thuban/Model/load.py (SessionLoader.open_shapefile): Remove a
1496            debug print
1497    
1498    2004-12-13  Bernhard Herzog  <[email protected]>
1499    
1500            * Extensions/svgexport/test/test_svgmapwriter.py
1501            (TestDrawSplines.setUp): Do not use super with the unittest
1502            classes because in Python 2.2 they're still old-style classes.
1503    
1504    2004-12-13  Frank Koormann <[email protected]>
1505    
1506        Alternative Path feature: When loading a (moved) session where
1507            shapefiles cannot be found, ask the user. Use the specified path
1508            if further shapefiles are missing. However, ask the usr for confirmation
1509            in such cases.
1510    
1511            * test/test_load.py (TestAltPath): New, tests for alternative path feature
1512            in load_session()
1513            (Shapefile_CallBack): Helper, implements controllable callback.
1514    
1515            * Thuban/UI/application.py (ThubanApplication.OnInit):
1516            Added "alt_path" to self.path
1517            (ThubanApplication.OpenSession): Added shapefile_callback as second
1518            callback similar to db_connection_callback.
1519            (ThubanApplication.run_alt_path_dialog): New, implementaion of
1520            shapefile_callback. In addition to raising the dialog the control of
1521            self.path('alt_path') is implemented here.
1522    
1523            * Thuban/Model/load.py (SessionLoader.__init__): Added shapefile_callback.
1524            (SessionLoader.open_shapefile): Open shapefile, eventually with
1525            alternative path. This wrapps the "theSession.OpenShapefile(filename)"
1526            formerly used in start_fileshapesource()/start_layer().
1527            (SessionLoader.start_fileshapesource): Call open_shapefile().
1528            (SessionLoader.start_layer): Call open_shapefile().
1529            (load_session): Added shapefile_callback.
1530    
1531            * Thuban/UI/altpathdialog.py: New, implements dialogs for alternative path
1532            feature (search / check).
1533            
1534            * Doc/manual/thuban-manual.xml: Added documentation of new feature.
1535    
1536    2004-12-11  Bernhard Reiter <[email protected]>
1537    
1538             svgexport 0.9.2: Point size supports for maps.
1539    
1540            * Extensions/svgexport/svgmapwriter.py: Added import of SHAPETYPE_POINT
1541            (def draw_point_shape): new parameter size defaults to 2 as before.
1542            (draw_shape_layer_incrementally): Moved draw_func log line higher.
1543            Added draw_func call with size when dealing with a point layer.
1544    
1545            * Extensions/svgexport/__init__.py: bumped version to 0.9.2.
1546            
1547    2004-12-11  Bernhard Reiter <[email protected]>
1548    
1549            Made sure that newlines are inserted in the svg path d attributes
1550            to raise the chance that the line length will be below 255 characters,
1551            as recommended by REC SVG 1.1 in section 8.3.1.
1552    
1553            * Extensions/svgexport/svgmapwriter.py(DrawPolygon):
1554            Adding \n before L's and changed whitespace handling.
1555    
1556            * Extensions/svgexport/test/test_svgmapwriter.py:
1557            Adapted tests to new whitespace handling of DrawPolygon.
1558    
1559    2004-12-11  Bernhard Reiter <[email protected]>
1560    
1561            * Doc/technotes/coding_guidelines.txt: easy typo fixed.
1562    
1563            * Extensions/svgexport/test/test_svgmapwriter.py:
1564            Removed test_drawbezier in favour of new test_drawspline3 and
1565            test_drawspline4 within new class TestDrawSplines(TestVirtualDC).
1566            All only to test DrawSpline.
1567    
1568            * Extensions/svgexport/svgmapwriter.py(DrawSpline):
1569            New implementation now really using the strange algorithm of
1570            xfig 3.1's approximated splines and its conversion to postscript
1571            with one twist: SVG can do quadratic beziers, so skipped translation
1572            to cubic beziers.
1573            (TestWithDC): Typo in comment fixed.
1574    
1575    2004-12-09  Martin Schulze  <[email protected]>
1576    
1577            * Thuban/Model/classgen.py: Added missing character encoding
1578    
1579            * Extensions/wms/properties.py (OpenWMSProperties): removed
1580    
1581            * Extensions/wms/parser.py (WMSCapabilitiesParser.error): Dropped
1582            support for get_srs_discrepancies() since there are no
1583            discrepancies anymore (was a thinko)
1584    
1585            * Extensions/wms/layer.py (WMSLayer.GetMapImg): Improved graphic
1586            format priority now that more formats are supported globally by
1587            the render engine.
1588    
1589    2004-12-08  Silke Reimer <[email protected]>
1590            * Extensions/ogr/ogrshapes.py: Substituted ogr-method CloseRings
1591            because it is not available in all versions of ogr
1592    
1593    2004-12-08  Bernhard Reiter <[email protected]>
1594            * Extensions/ogr/__init__.py: Added empty __init__.py to heal
1595            global tests until a real one is commited.
1596    
1597    2004-12-07 Nina H�ffmeyer <[email protected]>
1598    
1599            * /Extensions/ogr/: Adding a new extension to read shapefiles with
1600            ogr. It is planned to add other vector formats.
1601    
1602            * /test/runtests.py: Adding tests from /Extensions/ogr/test/.
1603    
1604    2004-12-07  Jan-Oliver Wagner <[email protected]>
1605    
1606            * /Extensions/svgexport/test/test_svgmapwriter.py: Reverting
1607            part of a (non-)fix to renable that the tests are always
1608            executed.
1609    
1610    2004-12-07  Bernhard Reiter <[email protected]>
1611    
1612            * Extensions/svgexport/test/test_svgmapwriter.py:
1613            Added test_drawbezier() to test DrawSpline().
1614    
1615            * Extensions/svgexport/svgmapwriter.py(DrawSpline):
1616            Really implemented bezier drawing.
1617    
1618            * Extensions/svgexport/__init__.py: Bumped version of svgexport
1619            to 0.9.1 because now the legend examples lines styles
1620            will be drawing with beziers.
1621    
1622    2004-12-05  Martin Schulze  <[email protected]>
1623    
1624            * Thuban/UI/renderer.py (raster_format_map): Added PNG, TIFF and
1625            GIF as supported bitmap image formats (helpful for the WMS extension)
1626    
1627    2004-11-30  Martin Schulze  <[email protected]>
1628    
1629            * Extensions/wms/test/test_ogclib.py (TestOGCLib.test_compareURLs):
1630            Improved the test for the internal compare method
1631    
1632    2004-11-27  Jan-Oliver Wagner <[email protected]>
1633    
1634            * Thuban/UI/about.py (About.__init__): Added
1635            Norbert Solymosi for hungarian translation and Ole Rahn
1636            as contrbutor. Moved Bernhard Reiter from Contributor
1637            to Developer.
1638    
1639    2004-11-27  Bernhard Reiter <[email protected]>
1640    
1641            * Extensions/svgexport/test/test_svgmapwriter.py:
1642            Removed Jan from author list as he did not change enough significant
1643            lines yet.
1644    
1645            * Extensions/svgexport/__init__.py: Added Bernhard as author
1646            of the Extension.
1647    
1648    2004-11-27  Jan-Oliver Wagner <[email protected]>
1649    
1650            * po/hu.po: New. Hungarian translation. Contributed
1651            by Norbert Solymosi.
1652    
1653    2004-11-26  Bernhard Herzog  <[email protected]>
1654    
1655            * Extensions/svgexport/test/test_svgmapwriter.py
1656            (Testobjectexport.test_transparent_polygon): Commented out some
1657            debug prints
1658    
1659    2004-11-24  Jan-Oliver Wagner <[email protected]>
1660    
1661            Fix broken tests for svg extension and added svg legend
1662            to Experimental menu.
1663    
1664            * Extensions/svgexport/test/test_svgmapwriter.py: Fix to have
1665            the test run correctly even if the extension is a package.
1666            Also removed the "import Thuban" which makes no sense.
1667    
1668            * Extensions/svgexport/__init__.py: Fix to have the extensions'
1669            test module also be executed from the global test routine.
1670            This is done by looking for the absense of the DISPLAY variable.
1671    
1672            * Extensions/svgexport/maplegend.py: Moved the menu entry from Extensions
1673            to Experimental menu since this module has yet not reached a stable
1674            status (ie. 1.0).
1675    
1676    2004-11-22  Bernhard Reiter <[email protected]>
1677    
1678            * Extensions/svgexport/svgmapwriter.py:
1679            Added verbose variable and some logging depending on it.
1680            (class VirtualDC(XMLWriter)): Minor improvement in the polygon loop,
1681            because counting i is not necessary.
1682            (class Pen, class Brush): Added simple __str__ methods.
1683            (SVGRenderer.draw_polygone_shape): Fix #2698 (transparent polygons are
1684            not exported to svg file) Note: holes still unhandled.
1685    
1686            * Extensions/svgexport/test/test_svgmapwriter.py:
1687                    Made a baseclass TestWithDC for test needed a DC.
1688                    Added tests for bug #2698 (transparent polygons are not
1689                    exported to svg file):
1690                    Testobjectexport.test_transparent_polygon()
1691    
1692            * Thuban/Model/base.py (UnsetModified):
1693            Fixed some typos in docstring.
1694    
1695            * Thuban/UI/baserenderer.py (BaseRenderer.draw_polygon_shape()):
1696            Added hints on the used algorithm for handling holes.
1697    
1698    2004-11-20  Jan-Oliver Wagner <[email protected]>
1699    
1700            Some face lifting for the examples.
1701    
1702            * Examples/__init__.py: Make this directory a package.
1703    
1704            * Examples/simple_extensions/__init__.py: Make this directory a package.
1705    
1706            * Examples/simple_extensions/hello_world.py: Moved entry from Extensions
1707            menu to Examples menu.
1708    
1709            * Examples/simple_extensions/simple_command.py: Some more comments,
1710            minor changes.
1711    
1712            * Examples/simple_extensions/simple_tool.py: Minor changes.
1713    
1714    2004-11-20  Jan-Oliver Wagner <[email protected]>
1715    
1716            Changed way of extension registry for wms and added extension
1717            registry for umn_mapserver extension.
1718    
1719            * Extensions/wms/__init__.py: Added registry entry and the importing
1720            of the actual wms module. Included a test for the required PyOGCLib.
1721    
1722            * Extensions/wms/wms.py: Removed registry entry (moved to __init__.py).
1723    
1724            * Extensions/umn_mapserver/__init__.py: Added registry entry and the
1725            importing of the actual umn mapserver management modules.
1726            Included a test for the required Python MapScript.
1727    
1728    2004-11-20  Jan-Oliver Wagner <[email protected]>
1729    
1730            Changed way of extension registry for importAPR, bboxdump
1731            and added extension registry for svgexport.extension registry for
1732            svgexport.
1733    
1734            * Extensions/importAPR/__init__.py: Added registry entry and the importing
1735            of the actual importAPR module.
1736    
1737            * Extensions/importAPR/importAPR.py: Removed registry entry (moved to
1738            __init__.py).
1739    
1740            * Extensions/bboxdump/__init__.py: Added registry entry and the importing
1741            ï¿½ï¿½ï¿½ï¿½of the actual bboxdump module.
1742    
1743            * Extensions/bboxdump/bboxdump.py: Removed registry entry (moved to
1744            ï¿½ï¿½ï¿½ï¿½__init__.py).
1745    
1746            * Extensions/svgexport/__init__.py: Added registry entry and the importing
1747            of the svgsaver module.
1748    
1749            * Extensions/svgexport/svgsaver.py: Moved the menu entry from Extensions
1750            to Experimental menu since this module has yet not reached a stable
1751            status (ie. 1.0).
1752    
1753    2004-11-18  Jan-Oliver Wagner <[email protected]>
1754    
1755            Now the hit test considers the size of point symbols.
1756    
1757            * Thuban/UI/viewport.py (ViewPort._hit_point): Added optional parameter
1758            'size' defaulting to the previously fixed value 5.
1759            Extended doc-string.
1760            (Viewport._find_shape_in_layer): Resolved FIXME regarding flexibility
1761            for symbols.
1762            Now the size of the largest point symbol is determined to find out
1763            about whether the point has been hit.
1764            This fixes the problem that only clicks inside a fixed distance of
1765            5 where found.
1766    
1767    2004-11-17  Jan-Oliver Wagner <[email protected]>
1768    
1769            Another open issue fixed regarding sizeable symbols: correct rendering of
1770            selected symbols.
1771    
1772            * Thuban/UI/renderer.py (ScreenRenderer.draw_selection_incrementally):
1773            Added consideration of the specific size of point symbols.
1774            The property for each point symbol is retrieved and the size applied
1775            for the rendering method.
1776            Added doc-string.
1777    
1778    2004-11-16  Jan-Oliver Wagner <[email protected]>
1779    
1780            Changed way of Extension Registry for gns2shp and profiling.
1781    
1782            * Extensions/gns2shp/gns2shp.py: Removed registry entry (moved to
1783            __init__.py).
1784    
1785            * Extensions/gns2shp/__init__.py: Added registry entry and the importing
1786            of the actual gns2shp module.
1787    
1788            * Extensions/profiling/profiling.py: Removed registry entry (moved to
1789            __init__.py).
1790    
1791            * Extensions/profiling/__init__.py: Added registry entry and the importing
1792            of the actual profiling module.
1793    
1794    2004-10-28  Bernhard Reiter <[email protected]>
1795    
1796            * Extensions/svgexport/: Minor improvements to doc strings.
1797    
1798    2004-10-07  Jan-Oliver Wagner <[email protected]>
1799    
1800            Further elements for sizable point objects now
1801            making this feature usable though not yet complete.
1802    
1803            * Thuban/Model/save.py (SessionSaver.write_classification): Write
1804            attribute 'size' for cldata when the shape layer is of point type.
1805            This also now make the test_load.py tests happy.
1806    
1807            * Thuban/Model/classgen.py (CustomRamp.GetProperties): Added size
1808            gradient.
1809    
1810            * Thuban/UI/classifier.py (ID_SELPROP_SPINCTRL): Renamed to
1811            ID_SELPROP_SPINCTRL_LINEWIDTH.
1812            (ID_SELPROP_SPINCTRL_LINEWIDTH): New Id replaces ID_SELPROP_SPINCTRL.
1813            (ID_SELPROP_SPINCTRL_SIZE): New Id.
1814            (SelectPropertiesDialog.__init__): Added a second spin control
1815            for the size in case the corresponding layer is of point type.
1816            (SelectPropertiesDialog._OnSpin): Renamed to _OnSpinLineWidth.
1817            (SelectPropertiesDialog._OnSpinLineWidth): New. Former _OnSpin.
1818            (SelectPropertiesDialog._OnSpinSize): New. Set size of property
1819            and refresh preview.
1820    
1821    
1822    
1823    2004-10-04  Martin Schulze  <[email protected]>
1824    
1825            * Extensions/wms/test/test_parser.py
1826            (TestWMSCapabilitiesParser.test_compareLists): Added missing
1827            self-test for compareLists()
1828            (TestWMSCapabilitiesParser.test_compareDicts): Added missing
1829            self-test for compareDicts()
1830            (TestWMSCapabilitiesParser.test_compareLists): Adding more tests
1831            to verify the test routine fails with non-equal arguments
1832            (TestWMSCapabilitiesParser.test_compareDicts): Adding more tests
1833            to verify the test routine fails with non-equal arguments
1834    
1835    2004-10-03  Jan-Oliver Wagner <[email protected]>
1836    
1837            First elements for sizeable point objects.
1838    
1839            * Resources/XML/thuban-1.1.dtd: Added size attribute to cldata.
1840    
1841            * Data/iceland_sample_size.thuban: New. Sample for sized point objects.
1842    
1843            * test/test_load.py (ClassificationTest.TestLayers): Added SetSize in case
1844            of a corresponding argument is given.
1845            (TestSymbolSize): New. Test the size attribute of cldata.
1846    
1847            * Thuban/Model/classification.py: Removed some trailing whitespaces.
1848            (ClassGroupProperties.__init__): Set default size.
1849            (ClassGroupProperties.SetProperties): Set the size.
1850            (ClassGroupProperties.GetSize): New. Return the size.
1851            (ClassGroupProperties.SetSize): New. Set the size.
1852            (ClassGroupProperties__eq__): Compare also size.
1853            (ClassGroupProperties__repr__): Print also size.
1854    
1855            * Thuban/Model/load.py (SessionLoader.start_cldata): Also parse
1856            the size attribute.
1857    
1858            * Thuban/UI/classifier.py (ClassDataPreviewer.Draw): Added doc-string.
1859            Also, now there is a return value that indicates whether the drawing
1860            size exceeded the given rect extent and if so the new extent.
1861            Finally, point objects are drawn depending on the size. If either
1862            the width or height is exceeded, the new extent is returned.
1863            (ClassRenderer.Draw): Now when calling the previewer drawing function,
1864            evaluate the return value and, if not None, adapt the grid widget size
1865            accordingly and redraw again.
1866    
1867            * Thuban/UI/baserenderer.py (BaseRenderer.draw_shape_layer_incrementally):
1868            If the draw function is for points, call it with the size as additional
1869            parameter.
1870            (BaseRenderer.draw_point_shape): Added additional, optional parameter for
1871            the size. Compute the radius using the size.
1872    
1873            * Extensions/importAPR/apr.py (APR_BMkSym.GetThubanProp): Now
1874            that Thuban supports size, apply this correctly.
1875    
1876            * Extensions/importAPR/importAPR.py: Bumped version to 0.1.1.
1877    
1878    2004-10-03  Jan-Oliver Wagner <[email protected]>
1879    
1880            * Doc/manual/thuban-manual-de.xml: Started translation of
1881            Map chapter.
1882    
1883    2004-10-01  Martin Schulze  <[email protected]>
1884    
1885            * Extensions/wms/properties.py (wmsProperties.__init__): Extended
1886            argument for general use through properties-dialog selector
1887            
1888            * Thuban/UI/classifier.py: Register properties dialog classes for
1889            both provided layer classes/types.
1890    
1891            * Thuban/UI/mainwindow.py (MainWindow.OpenLayerProperties): The
1892            map can be retrieved through the parent which is passed to the
1893            constructor anyway and doesn't require an argument of its own,
1894            required for the unification of arguments for general use through
1895            properties-dialog selector.
1896            (MainWindow.OpenOrRaiseDialog): Move the logic for checking
1897            whether a dialog is already opened (and raising it to the users
1898            attention) and creating a new dialog into a function of its own
1899            (MainWindow.OpenLayerProperties): Use the new OpenOrRaiseDialog()
1900            method
1901            (MainWindow.OpenLayerProperties): Utilise the new ClassMapper for
1902            global registration of properties dialog classes (which are indeed
1903            layer-specific).
1904    
1905            * Thuban/UI/classifier.py (Classifier.__init__): Unify arguments
1906            for general use through properties-dialog selector, the map can be
1907            retrieved through the parent and doesn't require an argument of
1908            its own.
1909    
1910            * Extensions/wms/wms.py: Register the properties dialog class for
1911            the provided WMS layer
1912    
1913    2004-09-28  Jan-Oliver Wagner <[email protected]>
1914    
1915            New feature: Registry for Extensions.
1916    
1917            * Thuban/UI/extensionregistry.py: This module defines a registry for
1918            Extensions.
1919    
1920            * Thuban/UI/about.py (About.__init__): Added description
1921            of the registered extensions with all of the information.
1922    
1923            * Thuban/Model/extension.py (Extension): Improved doc-string.
1924    
1925            * Extensions/gns2shp/gns2shp.py, Extensions/importAPR/importAPR.py,
1926            Extensions/bboxdump/bboxdump.py, Extensions/profiling/profiling.py,
1927            Extensions/wms/wms.py: Added registration of the extension.
1928    
1929    2004-09-27  Bernhard Reiter <[email protected]>
1930    
1931            More fixes to svgexport to make used ids unique and
1932            conforming to XML's Name production.
1933    
1934            * Extensions/svgexport/test/test_svgmapwriter.py: Added new tests
1935            test_xml_id_constraints(), test_make_ide_nosetbaseid() and
1936            test_make_id_nonintegersetid().  Switched SetID and SetBaseID.
1937            Added Bernhard R. as author.
1938            * Extensions/svgexport/svgmapwriter.py (make_id): Using "_" as
1939            concatenation char now (makes test_make_ide_nosetbaseid() valid).
1940            Also transform second id part with "%d" and catch the TypeError
1941            to raise SVGMapWriterError (making test_make_id_nonintegersetid() ok).
1942            Corrected typo inBernhard's author line.
1943            (SetBaseID): Return the transformed base id. Transform characters
1944            which are not alnum() or in ".-_" to binascii.b2a_hex(). Added
1945            import binascii. If to be set string starts with "xml" or so, add "t".
1946            (draw_shape_layer_incrementally): use the returned value of SetBaseID
1947            for used_baseids checks.
1948    
1949    2004-09-25  Bernhard Herzog  <[email protected]>
1950    
1951            * test/test_layer.py (TestLayer.test_arc_layer_with_projection):
1952            Remove a debug print and some tab characters.
1953    
1954    2004-09-25  Bernhard Reiter <[email protected]>
1955    
1956            * Extensions/svgexport/svgmapwriter.py: Added Bernhard R. as Author.
1957            (SetBaseID, SetID, make_id): Improved docstring comments to explain
1958            the interaction of the three functions and the XML id contrains.
1959    
1960    
1961    2004-09-23  Jan-Oliver Wagner <[email protected]>
1962    
1963            * Doc/ThubanModel.xmi: New. UML file for Thuban Model
1964            Module.
1965    
1966            * Doc/README: Added info on ThubanModel.xmi.
1967    
1968    2004-09-23  Jan-Oliver Wagner <[email protected]>
1969    
1970            * Doc/README: New. Some info about how to generate technical
1971            documentation from the source code.
1972            This text was send to the Thuban developer mailing list on
1973            September 21st 2004 by Bernhard Reiter.
1974    
1975    2004-09-21  Bernhard Reiter <[email protected]>
1976    
1977            Improved the svgexport to only use unique ids. Will issues
1978            an error message dialoge when two layer names are the same.
1979            ShapeIDs are now added with a dash within the svg ids.
1980    
1981            * Extensions/svgexport/svgmapwriter.py (SVGMapWriterError): New.
1982            * Extensions/svgexport/test/test_svgmapwriter.py: Added imports
1983            (TestSVGRenderer): New test class with test_make_in() and
1984            test_check_for_layer_name_clash()
1985            * Extensions/svgexport/svgmapwriter.py (SVGRenderer): Fixed __init__()
1986            and draw_shape_layer_incrementally() to not use a baseid twice,
1987            satisfying test_check_for_layer_name_clash()
1988            (VirtualDC.make_id): Use a dash between baseit and id, satisfies
1989            test_make_in().
1990            * Extensions/svexport/svgsaver.py: Import SVGMapWriterError, wxOK
1991            and wxICON_HAND.
1992            (write_to_svg): Put dc and rendering in a try statement and on
1993            catching SVGmapWriterError notify the user and delete the target file.
1994    
1995    2004-09-20  Bernhard Reiter <[email protected]>
1996    
1997            * Model/base.by, Model/layer.py: Fixed typos in docstrings.
1998    
1999    2004-09-03  Jan Sch�ngel  <[email protected]>
2000    
2001            * Extensions/umn_mapserver/mapfile(MF_Class.add_thubanstyle): Fix a
2002            small bug with the line color. Now the line color will now only set
2003            if it is set in Thuban an not Transparent.
2004            
2005            * Extensions/umn_mapserver/mf_export(tblayer_to_map): Fixed a bug with
2006            deleting the layers from mapfile. Now all layers will delete backwards
2007            from the last.
2008    
2009    2004-08-20  Silke Reimer <[email protected]>
2010    
2011            * Thuban/Model/layer.py:
2012            Fixes bug in projection handling: Otherwise very large region might not
2013            have valid values in the layer's projection.
2014    
2015    2004-08-20  Silke Reimer <[email protected]>
2016    
2017            * Thuban/UI/about.py:
2018            small changes to be consistent with coding style.
2019              
2020    2004-08-13  Martin Schulze  <[email protected]>
2021    
2022            * Extensions/wms/test/test_ogclib.py (TestOGCLib.compare_URLs):
2023            Adjusted a comment
2024    
2025    2004-08-11  Silke Reimer <[email protected]>
2026    
2027            * Thuban/UI/about.py: Small changes to encoding related stuff to avoid
2028                    too many and too enhanced imports of locale
2029    
2030    2004-08-10  Silke Reimer <[email protected]>
2031    
2032            * Thuban/UI/about.py: Fixed encoding problem of about dialog: Added
2033                    function unicodeToLocale() to convert special characters to users
2034                    locale encoding
2035    
2036    2004-08-10  Jan-Oliver Wagner <[email protected]>
2037    
2038            * Doc/technotes/coding_guidelines.txt: Added rule 'Method names start with
2039            lower case letter'
2040    
2041    2004-08-09  Jan Sch�ngel  <[email protected]>
2042    
2043            * ChangeLog: Rewrite the last ChangeLog entry to follow
2044            the standard way.
2045    
2046            * Extensions/umn_mapserver/mapfile: Moved the import AnnotationLayer to
2047            the function where it is needed, because it don't works if it stands
2048            at the beginning.
2049            (MF_Layer.__init__): Removed the extra numclassed variable. Now
2050            numclasses from the mapscript will be used.
2051            (MF_Layer.get_index): New. Return the index of the layer in mapfile.
2052            (MF_Layer.set_classes): New. A Classlist will be set to the layer.
2053            (MF_Layer.set_metadata): New. A Metadata mapscript object will set.
2054            (MF_Layer.remove_allclasses): New. All class of the layer will remove.
2055            (MF_Map.create_new_layer): New. A new Layer is created and associated
2056            with the mapscript object.
2057            (MF_Map.set_layerorder): New. The Layer order like in thuban is set in
2058            the mapscript.
2059            (MF_Map.add_thubanlayer): Now a new layerobj is created if no one is
2060            linked to the layer in thuban, else the layerobject linked to the
2061            thubanlayer will be used.
2062            AnnotationLayer will now store the filename of the shapefile.
2063            (MF_Map.remove_layer): If a layer is removed the associated object
2064            must be set new.
2065            
2066            * Extensions/umn_mapserver/mf_export.py(tb_layer_to_map): Add all
2067            layers which are exists in thuban to the mapobj. All removed Layers
2068            will be removed from the mapobj.
2069            Added comments to all functions.
2070            (thuban_to_map): No layer will be removed here.
2071            
2072            * Extensions/umn_mapserver/mf_handle.py
2073            (_has_umn_mapobj_and_selectedlayer): Activating the layer menu. Now
2074            Layersettings for the mapserver kann be edited.
2075    
2076            * Extensions/umn_mapserver/mf_import.py: Now all layers which are
2077            imported, will be linked with the associated MF_Layer.
2078            (import_mapfile): All layers, which are not selected, will be removed.
2079            Disable the "import layer from mapfile" menu option.
2080    
2081            * Extensions/umn_mapserver/sample/iceland.map: Set the status of the
2082            Annotation Layer from DEFAULT to OFF. The DEFAULT setting turns the
2083            layer on permanently.
2084    
2085    2004-08-03  Jan Sch�ngel  <[email protected]>
2086    
2087            * Extensions/umn_mapserver/mapfile.py(MF_Metadata.remove_allmetadata):
2088            New. This function removes all metadata
2089            (MF_Layer.set_group): New. Set the group setting.
2090            (MF_Layer.get_group): New. Get the group setting.
2091            (MF_Map): Removed the extra numlayers variable, used the mapscript
2092            parameter instead.
2093            (MF_Map.get_numlayers): New. This get numlayers.
2094            (MF_Map.remove_all_layers): New. Removes all layers from the mapobj.
2095            (MF_Map.add_thubanlayer): Replaced the exception handling by a check
2096            if the object is an instance. Also added the annotation layer here to
2097            export, but only the layer is created in the mapfile.
2098    
2099            * Extensions/umn_mapserver/mf_export.py(export_mapfile): Removed
2100            the check if a mapobj exist, because its not needed anymore. The
2101            export function is only available if a mapobj exist.
2102            Use the new function to remove all layers.
2103            
2104            * Extensions/umn_mapserver/mf_handle.py(Layer_Dialog): Added a group
2105            option and the metadata button. The layer dialog is temporary disabled.
2106            (Metadata_CustomDataTable): Added some functions to show the grid
2107            correct.
2108    
2109            * Extensions/umn_mapserver/mf_import.py: Moved the code for showing
2110            the number of layer from import_mapfile to this function.
2111            (AnnotationLayer): New. This Class shows the Annotation layer in
2112            thuban. The layer don't do anything. It's only to show the layer
2113            and to save the layer order.
2114            (add_annotationlayer): New. Import an annotation layer to thuban.
2115            (select_layer2import): New. Import only layers to thuban and not
2116            the other settings like projection or scalebar.
2117            (create_new_mapfile): Moved the _has_umn_mapobj function and the
2118            create_new_mapfile functions from mf_handle.py to mf_import.py.
2119            
2120            * Extensions/umn_mapserver/sample/iceland.map: Added the group
2121            parameter to the roads and cultural layers. Also added a new
2122            Annotation Layer for the cultural points.
2123    
2124            * Extensions/umn_mapserver/sample/iceland.html: Added the select
2125            option for the annotation layer.
2126    
2127            * Extensions/umn_mapserver/sample/index.html: Added the start
2128            parameter for the annotation layer.
2129    
2130    2004-08-01  Jan-Oliver Wagner <[email protected]>
2131    
2132            * Doc/manual/thuban-manual-de.xml (Chapter Session Management):
2133            translation completed.
2134    
2135            * Doc/manual/thuban-manual.xml (Chapter Session Management):
2136            Fixed unprecise description for Save Session.
2137    
2138    2004-07-31  Jan-Oliver Wagner <[email protected]>
2139    
2140            Started translation of Users Manual into german.
2141    
2142            * Doc/manual/thuban-manual-de.xml: New. German Users Manual.
2143    
2144            * Doc/manual/Makefile: Added build instructions for german
2145            users manual.
2146    
2147            * Doc/manual/thuban-manual.xml: Minor corrections in Introduction.
2148    
2149    2004-07-28  Jan Sch�ngel  <[email protected]>
2150    
2151            * Extensions/umn_mapserver/mapfile.py(MF_Metadata): Changed all class
2152            functions. Now all metadata will handle by the function and its not
2153            needed to initialize it from outside. Therefor the associated mapobj
2154            will be stored in the Metadata Object. So we can use the special
2155            functions from the associated mapobj to get the Metadata.
2156            Therefor all initialization code for the metadata is removed from the
2157            other classes.
2158            (MF_Layer): Added a function to get the metadata object.
2159            (MF_Map): Added a function to set the mappath, the path where
2160            the mapfile ist stored.
2161    
2162            * Extensions/umn_mapserver/mf_export.py(thuban_to_map): Changed the code
2163            to set the extent in the mapfile. Now the code is set by the displayed
2164            data in the Thuban-view.
2165            (export_mapfile): The shapepath is now set empty, until relative
2166            pathnames are supported.
2167    
2168            * Extension/umn_mapserver/mf_handle.py: Added a dialog to handle
2169            metadata. Yet only mapfile metadata are supported. Layer and class
2170            supported are not implemented.
2171            Added a dialog to handle layer informations. The dialog only shows the
2172            selected layer at the moment.
2173    
2174            * Extensions/umn_mapserver/mf_import.py(import_mapfile): Changed the
2175            code for setting the extent in thuban. Now the extent is set to the
2176            given extent from the mapfile.
2177            Fixed a logical mistake. Now the extent is set when realy a layer is
2178            loaded, and not if one is selected to load.
2179    
2180            * Extensions/umn_mapserver/sample/iceland.html: Added code to zoom and
2181            move the shown map in the browser.
2182    
2183            * Extensions/umn_mapserver/sample/iceland.map: Added a new metadata
2184            line to the mapobj and added metadata to the political layer.
2185    
2186            * Extensions/umn_mapserver/test/test_mapserver.py: Changed the test
2187            for Metadata.
2188    
2189    2004-07-26  Martin Schulze  <[email protected]>
2190    
2191            * Thuban/Lib/classmapper.py (ClassMapper.has): Added the new
2192            ClassMapper
2193    
2194            * test/test_classmapper.py (TestMapping.test_mapper): Added a Test
2195            case for the new ClassMapper
2196    
2197    
2198    2004-07-22  Bernhard Herzog  <[email protected]>
2199    
2200            * Thuban/UI/viewport.py (ViewPort.VisibleExtent): New.  Return the
2201            visible extent of the map in projected coordinates
2202    
2203            * test/test_viewport.py (SimpleViewPortTest.test_default_size)
2204            (SimpleViewPortTest.test_init_with_size): Add some VisibleExtent()
2205            tests.
2206            (SimpleViewPortTest.test_visible_extent): New. The real test for
2207            VisibleExtent()
2208    
2209    2004-07-22  Bernhard Herzog  <[email protected]>
2210    
2211            * test/test_viewport.py: Use support.run_tests as the main
2212            function when running asa script.
2213    
2214    2004-07-22  Jan Sch�ngel <[email protected]>
2215    
2216            * Extensions/umn_mapserver/mf_export.py: Added "import os"
2217            Removed the old "import Thuban.UI.mainwindow" code.
2218            (tbextent_to_map): Removed the extra function and at the code direct
2219            to "thuban_to_map" function.
2220            (write_creatorcomment): Added. Now a short comment is added to the
2221            beginning of an generated mapfile.
2222            (export_mapfile): Now the Path and filename are saved in to variables,
2223            and not together in one variable. This is needed for the new
2224            write_creatorcomment function.
2225                    
2226            * Extensions/umn_mapserver/mf_import.py (import_mapfile): Added the
2227            import module "re". Also added Range and the ClassGroupRange import
2228            from Thuban. Both are needed for the new range expression import.
2229            (create_rangeexpression): Added. Creates a Range Expression in Thuban
2230            style from a given mapfile expression.
2231            (added_rasterlayer): Make some small code changes. The shapepath is
2232            now stored in an extra variable and the clazz_name is set empty if no
2233            class name set in the mapfile.
2234            Changed the Error message for Range Expressions, becaus the new
2235            function create a error string which will be shown in the dialog.
2236    
2237            * Extensions/umn_mapserver/test/test_mapserver.py: Added a test for the
2238            range expression import.
2239    
2240    2004-07-21  Jan-Oliver Wagner <[email protected]>
2241    
2242            * Extensions/umn_mapserver/README: Added hint that
2243            installation as root can be avoided. Removed all tabs.
2244    
2245    2004-07-16  Bernhard Herzog  <[email protected]>
2246    
2247            * test/test_viewport.py
2248            (ViewPortTest.test_changing_map_projection): Check that changing
2249            the projection of an empty map shown in a viewport doesn't lead to
2250            exceptions in the viewport's handler for the
2251            MAP_PROJECTION_CHANGED messages
2252    
2253            * Thuban/UI/viewport.py (ViewPort.map_projection_changed): Only
2254            try to keep the same region visible when the map actually contains
2255            something
2256    
2257    2004-07-15  Jan Sch�ngel <[email protected]>
2258    
2259            * Extensions/umn_mapserver/mapfile.py: Added a function to get the
2260            mappath directly from the mapobj. Is needed because of the changes
2261            in mf_import.py.
2262            (MF_Layer.add_thubanclass): Added a new comment.
2263            (MF_Map.set_extent): Fixed a bug with exporting empty mapobj. If the
2264            mapobj is empty there is no extent get from thuban an so no one can
2265            set to th mapobj.
2266            
2267            * Extensions/umn_mapserver/mf_import.py (import_mapfile): Updated
2268            the discription.
2269            Split the funktion in to three smaller ones. The new functions are
2270            add_rasterlayer, add_polygonlayer and select_layer2import.
2271            Removed the mapfilepath and filepath initialisation, because its know
2272            include in the new functions.
2273            Now nothing will be imported if cancel is pressed in the
2274            layer choice dialog.
2275    
2276    2004-07-14  Jan Sch�ngel <[email protected]>
2277    
2278            * Extensions/umn_mapserver/mapfile.py: Added ClassGroupDefault to
2279            import.
2280            (MF_Symbolset): Removed the extra variable for numsymbols.
2281            (MF_Class.__init__): Added a comment to the exception clause.
2282            Removed the extent init, because it was not needed anymore.
2283            (MF_Layer.add_thubanclass): Added the code to set the class name to
2284            the expression value from thuban if no label is defined.
2285            Added the code to export Range expressions from thuban to the mapfile.
2286            (MF_Map.set_extent): Removed the exception and replace it by some if
2287            code. If the size of a map is not defined the size will be set to 1,1.
2288            This is necessary because if the extent is set, mapscript checks if
2289            the size is greater than zero.
2290            (MF_Web): Added the get and set function for the template.
2291    
2292            * Extensions/umn_mapserver/mf_export.py: Added the function to check
2293            if a mapobject exists and used it to set the status of the menu items.
2294            If no mapfile exists the settings could not be edditied.
2295            Define after which menuitem the exportitem will include.
2296            
2297            * Extensions/umn_mapserver/mf_handle.py: Removed the import
2298            Thuban.UI.mainwindow clause, because it is not needed.
2299            Added the command Refresh() to all "OnChangeColor()" functions,
2300            because the color preview window was not updated on a color change.
2301            Added the function to check if a mapobject exists and used it to set the
2302            status of the menu items. If no mapobject exists the settings could not
2303            be edditied.
2304            (Map_Dialog): Moved the imagetype selector from the
2305            Outputformat_Dialog to Map_Dialog and removed Outputformat_Dialog.
2306            (Web_Dialog): Removed the name label and added the template textbox.
2307    
2308            * Extensions/umn_mapserver/mf_import.py (import_mapfile): Replace
2309            the exception handling on loading the layers by an if statement. It
2310            is not necessary to us the exception there.
2311            The Filepath creation now use os.path.join to build the path.
2312    
2313            * Extensions/umn_mapserver/test/test_mapserver.py: Moved the testMap
2314            definition from global to the setUp function. Now the testMap will
2315            initialize new on each test.
2316    
2317            * Extensions/umn_mapserver/sample/iceland.map: Include three new
2318            classes in the Line Layer, to test logical Expressions.
2319            Set the status of the class "Point9" in the Point Layer to off
2320            
2321    2004-07-13  Bernhard Herzog  <[email protected]>
2322    
2323            * Thuban/UI/baserenderer.py
2324            (BaseRenderer.render_map_incrementally): Fix a logic bug in the
2325            optimization that tries not to draw layers under a raster layer.
2326            The bug was harmless.  All it effectively did was to produce The a
2327            strange messages about not being able to draw Layer instances for
2328            all vector layers below a raster layer which would be invisible
2329            anyway because the raster layer currently always covers the entire
2330            window
2331    
2332    2004-07-08  Jan Sch�ngel <[email protected]>
2333    
2334            * Extensions/umn_mapserver/mapfile.py: Added code to generade and get
2335            a list of supported outputformats. This formats are not alle supported
2336            because there is no possibility to get the outputformat without the
2337            name known. Make some formal changes to the code.
2338            (MF_Map.set_name()): Fixed a bug if the name is None.
2339    
2340            * Extensions/umn_mapserver/mf_handle.py: Removed the image_type import
2341            statement, because its not needed anymore. The Outputformat is now
2342            given as string from the object. Make some formal changes to the code.
2343    
2344            * Extensions/umn_mapserver/test/test_mapserver.py: Added new test for
2345            most of the new setting which were added during the last changes.
2346            Removed the MF_Size Test.
2347            
2348            * Extensions/umn_mapserver/test/test.map: Added a new class to the
2349            cultural Layer to test expressions and the the status of that layer
2350            from on to default.
2351            Changed the data path the the correct Thuban Data
2352            Added the Outputformat Object and Symbol Object
2353            
2354    2004-07-07  Jan Sch�ngel <[email protected]>
2355    
2356            * Extensions/umn_mapserver/mapfile.py: Added some new
2357            settings to edit (outputformat, label, imagetype)
2358    
2359            * Extensions/umn_mapserver/mf_handle.py: Added some setting to
2360            the Label Dialog and add the OutputDialog.
2361            Make some changes to the code order.
2362    
2363    2004-07-06  Jan Sch�ngel <[email protected]>
2364    
2365            * Extensions/umn_mapserver/mapfile.py: Added the symbolObj, pointObj
2366            and line Obj and add the scalebar_status_type, scalebar_style_type and
2367            scalebar_position_type.
2368            Added the symbol- and symbolsetObject (MF_Symbol,MF_Symbolset). The
2369            are only used to create a Symbol like the circle in Thuban.
2370            Added the scalebarObject (MF_Scalebar)
2371            (MF_Class): Added set_status and get_status.
2372            (MF_Layer.add_thubanclass): Added code to set the class status
2373            (MF_Map): Added code to handle the symbols and scalebar
2374            (MF_Label): Added the set_partials and get_partials functions
2375            
2376            * Extensions/umn_mapserver/mf_export.py: Added MF_Symbol to import
2377            from mapfile. Added a function to create a circle object like the one
2378            from thuban if no one exists.
2379            
2380            * Extensions/umn_mapserver/mf_handle.py: All colors are now set when
2381            press ok in the assosiated dialog and not at the end of the
2382            colordialog.
2383            Added the Dialog for the Scalebar.
2384            (Label_Dialog): Added the offset option
2385    
2386            * Extensions/umn_mapserver/mf_import.py: Added code to import the
2387            status of the Classes.
2388            Fixed a bug with the projection. Now the to_meter parameter will be
2389            added to the Projection only if it doesn't exists.
2390    
2391    2004-07-01  Jan Sch�ngel <[email protected]>
2392    
2393            Added the functionality to handle the content thuban is not
2394            able to handle directly.
2395    
2396            * Extensions/umn_mapserver/mf_handle.py: New. This module extents
2397            Thuban with the possibility to edit the mapfile content.        
2398            
2399            * Extensions/umn_mapserver/mf_import.py: Added the possibility
2400            to import mapfiles without any layer selected. So it is possible
2401            to edit the other settings in a mapfile.
2402            (import_mapfile): Added code to use the editing functions.
2403            Added the possibility to import the projection to a layer if one
2404            is defined.
2405            Status settings (On,Off) will now set in thuban (visible, invisible).
2406            fixed a bug with with classnames. If no classname is set in mapfile
2407            the value in Thuban will set to the expression.
2408            
2409            * Extensions/umn_mapserver/mf_export.py(export_mapfile): Added the
2410            possibility to save a new mapfile or use the old one which is
2411            imported or new created.
2412            Added code to use the editing functions.
2413            Remove some not needed import statements
2414    
2415            * Extensions/umn_mapserver/mapfile.py: Added new types which are
2416            need for the editing functions.
2417            Added needed set-functions for the editing functions.
2418            Added the possibility to export rasterimages.
2419            Added new classes (MF_Web, MF_Label, MF_Legend, MF_Symbol,
2420            MF_SymbolSet). MF_Symbol and MF_SymbolSet are not needed at the
2421            moment.
2422            (MF_Class.set_thubanstyle): Now point layers will set to a default
2423            symbol to show a circle in mapserver and not only a 1px dot.
2424            (MF_Style.__init__): Fixed a bug with the color. Color was not set
2425            correct before.
2426            (MF_Size): Removed, because it is not needed.
2427            
2428            * Extensions/umn_mapserver/README: Added the hints to use the
2429            export and editing functions, too.
2430    
2431            * Extensions/umn_mapserver/sample/iceland.map: Added the
2432            new parameter "UNITS METERS".
2433            Change the political layer to status OFF.
2434    
2435            * Extensions/umn_mapserver/sample/README: Added some
2436            more details to setup the sample in the MapServer.
2437            
2438    2004-06-26  Bernhard Reiter <[email protected]>
2439    
2440            * Extensions/svgexport/test/test_svgmapwriter.py:
2441            Removed class VFile and used standard StringIO instead.
2442    
2443    2004-06-23  Jan Sch�ngel  <[email protected]>
2444    
2445            Add the export function to the umn_mapserver extension.
2446    
2447            * Extension/umn_mapserver/mf_export.py: New. This module extents
2448            Thuban with the possibility to export the Thuban content.
2449    
2450            * Extensions/umn_mapserver/mapfile.py: Expand the classes to use
2451            with the export module. Especially added the possibility to
2452            add thuban objects directly to the map objects.
2453    
2454            * Extensions/umn_mapserver/mf_import.py: Removed the wxCHANGE_DIR,
2455            because of the hint from Bernhard Herzog.
2456            Corrected the handling of absolute pathnames.
2457            Changed the Text of the Menu-Item, now the beginning is upper case.
2458    
2459            * Extensions/umn_mapserver/README: Added the --with-tiff statement.
2460    
2461    2004-06-16  Jan Sch�ngel  <[email protected]>
2462    
2463            Add a sample and make some changes.
2464    
2465            * Extension/umn_mapserver/mf_import.py: Changed the wxPython.wx
2466            import from * to explicit used statements. Changed the
2467            Thuban.UI.mainwindow import phrase, too.
2468            (import_mapfile):Corrected a clerical mistake.
2469            Added wxCHANGE_DIR in OpenFile Dialog.
2470            Added a MultipleChoiceDialog, to select the layers to load from
2471            mapfile into thuban. Thereby the projection is only set if one layer
2472            is selected.
2473            Added the possibility to handle relative pathnames which uses
2474            up-level references.
2475            Removed some doubled code.
2476            Corrected an error with integer values used as label in thuban
2477            ClassGroup.
2478            
2479            * Extensions/umn_mapserver/sample: New.
2480    
2481            * Extensions/umn_mapserver/sample/README: New. Describes the
2482            usage of the sample files.
2483    
2484            * Extensions/umn_mapserver/sample/iceland.map: New. This is
2485            a suitable .map-file for the iceland data.
2486    
2487            * Extensions/umn_mapserver/sample/index.html: New. The template
2488            for the mapfile.  
2489    
2490            * Extensions/umn_mapserver/sample/iceland.html: New. Initialisation
2491            file for the Iceland Application on web.
2492    
2493            * Extensions/umn_mapserver/README: Corrected a inaccuracy and added
2494            some details.
2495    
2496            * Extensions/umn_mapserver/test/test_mapserver
2497            (mapserver_import_Test_generalClasses.test_MF_Color):
2498            Corrected the thubancolor test.
2499    
2500    2004-06-15  Jan Sch�ngel  <[email protected]>
2501    
2502            * Extensions/umn_mapserver/README: New. Install instruction.
2503    
2504    2004-06-14  Bernhard Reiter <[email protected]>
2505    
2506            * libraries/thuban/cpl_mfile.h: Added copyright header.
2507    
2508            * libraries/thuban/ cpl_mfile.cpp, cpl_mfile.h: Added non-protecting
2509            Free Software License so that it is most useful with gdalwarp
2510            and bmpdataset.
2511    
2512    2004-06-14  Bernhard Herzog  <[email protected]>
2513    
2514            * Thuban/UI/multiplechoicedialog.py (__version__): Add missing
2515            import of wxPython.wx itself (as opposed to the contents of
2516            wxPython.wx).  For some reason wxPython.wx is available as
2517            wxPython.wx.wx in at least some 2.4 releases.  Fixes RT#2482
2518            wrt. wxPython 2.4.
2519    
2520    2004-06-10  Jan Sch�ngel  <[email protected]>
2521    
2522            Initial version of new extension "umn_mapserver".  This extension aims
2523            to manage configuration for the UMN MapServer application.  This
2524            inital version just imports the .map-files and displays all, Thuban is
2525            capable of.
2526    
2527            * Extensions/umn_mapserver, Extensions/umn_mapserver/test: New.
2528    
2529            * Extensions/umn_mapserver/test/README: New. Describes how to run the
2530            tests.
2531    
2532            * Extensions/umn_mapserver/test/test.map: New. This is a test
2533            .map-file for automated tests of the umn_mapserver extension of
2534            Thuban.
2535    
2536            * Extensions/umn_mapserver/test/test_mapserver.py: New. Tests for
2537            UMN Mapserver classes.
2538    
2539            * Extensions/umn_mapserver/__init__.py: New. Init to make this
2540            directory a package.
2541    
2542            * Extensions/umn_mapserver/mapfile.py: New. Classes to represent
2543            '.map'-file objects.
2544    
2545            * Extensions/umn_mapserver/mf_import.py: New. This module extends
2546            Thuban with the possibility to handle UMN MapServer mapfiles.
2547    
2548    2004-06-03  Bernhard Herzog  <[email protected]>
2549    
2550            * Thuban/Model/layer.py (Layer.TreeInfo): Convert the bounding box
2551            to a tuple before using it as arguments to the % operator.  This
2552            fixes the formatting issue filed in RT#2239 on 2004-01-13 and
2553            reported today on thuban-list by Jan Sch�ngel
2554    
2555            * test/test_layer.py (TestLayerModification.setUp): Save the
2556            filename as an instance variable so we can refer to it in tests
2557            (TestLayerModification.test_tree_info): Uncomment this method
2558            again and make it work.  This tests for the formatting issue
2559            filed in RT#2239 on 2004-01-13
2560    
2561    2004-05-28  Bernhard Herzog  <[email protected]>
2562    
2563            * Thuban/UI/baserenderer.py: Fix some typos.
2564    
2565    2004-05-18  Jan-Oliver Wagner <[email protected]>
2566    
2567            * Extensions/gns2shp/gns2shp.py (gns2shp): Fixed a bug
2568            by increasing a field size.
2569    
2570    2004-05-17  Bernhard Herzog  <[email protected]>
2571    
2572            Update to newest shapelib and get rid of Thuban specific
2573            extensions, i.e. use the new DBFUpdateHeader instead of our
2574            DBFCommit kludge
2575    
2576            * libraries/shapelib/shpopen.c: Update to version from current
2577            shapelib CVS.
2578    
2579            * libraries/shapelib/shapefil.h: Update to version from current
2580            shapelib CVS.
2581    
2582            * libraries/shapelib/dbfopen.c: Update to version from current
2583            shapelib CVS.
2584            (DBFCommit): Effectively removed since shapelib itself has
2585            DBFUpdateHeader now which is better for what DBFCommit wanted to
2586            achieve.  
2587            We're now using an unmodified version of dbfopen.
2588    
2589            * setup.py (extensions): Add the HAVE_UPDATE_HEADER macro with
2590            value '1' to the Lib.dbflibc extension.  This simply reflects the
2591            shapelib and pyshapelib updates
2592    
2593    2004-05-16  Jan-Oliver Wagner <[email protected]>
2594    
2595            Finished introduction of Menu.FindOrInsertMenu.
2596    
2597            * Extensions/drawshape/drawshape.py: Add the command
2598            to the experimental menu additionally to the toolbar.
2599    
2600            * Extensions/svgexport/svgsaver.py: Use FindOrInsertMenu() instead of
2601            finding menu on its own.
2602    
2603            * Doc/manual/thuban-manual.xml: updated sample file
2604            to use FindOrInsertMenu().
2605    
2606            * Examples/simple_extensions/hello_world.py: Use FindOrInsertMenu()
2607            instead of finding menu on its own.
2608    
2609    2004-05-11  Jan-Oliver Wagner <[email protected]>
2610    
2611            * test/test_menu.py (MenuTest.test): Added testing
2612            of method Menu.FindOrInsertMenu.
2613    
2614    2004-05-10  Jan-Oliver Wagner <[email protected]>
2615    
2616            Introduce and use Menu.FindOrInsertMenu.
2617    
2618            * Thuban/UI/menu.py (Menu.FindOrInsertMenu): New. Find a
2619              given menu or, if not found, insert it.
2620    
2621            * Extensions/bboxdump/bboxdump.py, /Extensions/gns2shp/gns2shp.py,
2622            /Extensions/importAPR/importAPR.py, Extensions/profiling/profiling.py,
2623            /Extensions/wms/wms.py: Use FindOrInsertMenu() instead of finding
2624            menu on its own.
2625    
2626    2004-05-06  Jan-Oliver Wagner <[email protected]>
2627    
2628            Introduce a abstract ColorDialog class and remove
2629            and outdated file.
2630    
2631            * Thuban/UI/proj4dialog.py: Removed. It is has been
2632            replaced by projdialog for quite a while and is not used
2633            anymore.
2634    
2635            * Thuban/UI/colordialog.py: New. Abstraction for color selection
2636            dialog(s).
2637    
2638            * Thuban/UI/classifier.py (SelectPropertiesDialog.__GetColor):
2639            Now calls the abstract ColorDialog instead of wxColourDialog.
2640            This also removed the dependency to Color class conversion
2641            from this function.
2642    
2643    2004-05-04  Frank Koormann  <[email protected]>
2644    
2645            * Extensions/bboxdump/__init__.py: Fixed string left over from
2646            copying.
2647    
2648            * Extensions/bboxdump/bboxdump.py (bboxdump):
2649            Use layer.ShapeStore().AllShapes() to loop over shapes instead of
2650            xrange(layer.NumShapes()). Compile the bboxmessage from a list
2651            of formatted outputs (string.join) instead of appending to the
2652            message. Two progress bar dialogs to report progress on the sometimes
2653            lenghty processing.
2654    
2655    2004-04-22  Frank Koormann  <[email protected]>
2656    
2657            New Extension to dump bounding boxes of all shapes of the selected
2658            layer. An optional column can be specified to group the objects,
2659            in this case the bounding box is a union of the separate boxes.
2660            Dump can be displayed in a ScrolledMessageDialog or written to file.
2661            The Extension is simply a combination of available and well tested
2662            Thuban functionality.
2663    
2664            * Extensions/bboxdump/__init__.py: New: Init to make this
2665            directory a package.
2666    
2667            * Extensions/bboxdump/bboxdump.py: New: Dump bounding boxes of
2668            all shapes of the selected layer.
2669    
2670    2004-04-22  Jan-Oliver Wagner <[email protected]>
2671    
2672            * Thuban/UI/classgen.py (GenUniquePanel.__init__): Fixed two
2673            strings to be i18n now.
2674    
2675    2004-04-18  Jan-Oliver Wagner <[email protected]>
2676    
2677            Changing popup menu of legend from direct building
2678            to using the Menu construction as used for the mainwindow.
2679    
2680            * Thuban/UI/mainwindow.py: New method commands: layer_to_top,
2681            layer_to_bottom, layer_visibility
2682            (MainWindow.LayerToTop): New. Put current layer to the top.
2683            (MainWindow.LayerToBottom): New. Put current layer to bottom.
2684            (MainWindow.HideLayer, MainWindow.ShowLayer, _has_visible_map):
2685            Replace 1,0 by True, False.
2686            (MainWindow.ToggleLayerVisibility): New. Toggle visibility of
2687            current layer.
2688            (MainWindow.LayerShowTable): Removed raising of dialog.
2689            (_has_selected_layer_visible): New. Support function.
2690    
2691            * Thuban/UI/legend.py: ID_POP_xxx: removed.
2692            (LegendPanel.__init__): Removed EVT_MENU bindings.
2693            (LegendTree._OnRightClick): Replace direct creation of
2694            menu via wx Classes by applying the menu definition
2695            as of Menu class of menu.py.
2696            
2697    2004-04-16  Jan-Oliver Wagner <[email protected]>
2698    
2699            * Thuban/UI/exceptiondialog.py (ExceptionDialog.dialog_layout): Improved
2700        button string to stronger clearify that Thuban will be closed when hitting
2701            the button.
2702    
2703            * Thuban/UI/mainwindow.py (MainWindow.LayerShowTable): Added docstring.
2704            Now for layers without a ShapeStore a corresponding message is given
2705            to the user, that this layer has no table to show.
2706    
2707    2004-04-15  Martin Schulze  <[email protected]>
2708    
2709            * Extensions/wms/layer.py (WMSLayer.setWMSFormat): Need to
2710            recalculate the format for the internal render engine as well.
2711    
2712            * Extensions/wms/properties.py (wmsProperties): First start for a
2713            properties dialog.  It's functional for a first selection of
2714            layers, but still has some weired wxWidgets/GTK problems but
2715            beautification can be done later.
2716    
2717            * Extensions/wms/layer.py: Added more documentation
2718            (WMSLayer.getFormats): New: Return list of supported image formats
2719            by the WMS server
2720            (WMSLayer.getLayers): New: Return the list of layer names
2721            supported by the WMS server
2722            (WMSLayer.getLayerTitle): New: Return the title of the named layer
2723            (WMSLayer.getWMSFormat): New: Return the image format that is used
2724            for WMS GetMap requests
2725            (WMSLayer.setWMSFormat): New: Set the image format that is used
2726            for WMS GetMap requests
2727            (WMSLayer.__init__): Move away from using only one layer to using
2728            a list of layers (unsorted at the moment, though).
2729            (WMSLayer.getVisibleLayers): New: Return the list of names for all
2730            visible layers
2731            (WMSLayer.setVisibleLayers): New: Set the list of names for all
2732            visible layers
2733    
2734            * Extensions/wms/wms.py: Moved the WMS layer into layer.py in
2735            order to establish a clean structure.
2736    
2737            * Extensions/wms/layer.py: Moved the WMS layer into a file on its
2738            own in order to establish a clean structure.
2739    
2740    2004-04-13  Martin Schulze  <[email protected]>
2741    
2742            * Extensions/wms/parser.py (WMSCapabilitiesParser.grok): Added
2743            support for oldstyle (WMS 1.0 apparently) image format
2744            specification.
2745    
2746            * Extensions/wms/wms.py (WMSLayer.calcFormat): Reduce the list of
2747            supported graphic formats back to JPEG and BMP, PNG and others are
2748            too *cough* experimental...  Sorry, I meant to filter this out
2749            before I committed this part.  This should make the WMS extension
2750            run from CVS again.
2751            (wms_dialog): Reset an empty URL to None so that the subsequent
2752            program can depend on this, since the dialog will indeed return an
2753            empty URL, causing another declaration of love by Python.
2754    
2755            * Extensions/wms/parser.py (WMSCapabilitiesParser.getLayerBBox):
2756            Whenever a native BoundingBox request cannot be fulfilled, check
2757            whether the requested SRS is EPSG:3426, in which case return the
2758            LatLonBoundingBox values.
2759    
2760            * Extensions/wms/test/test_parser.py
2761            (TestWMSCapabilitiesParser.test_LayerSRS): Added a test for
2762            ignoring AUTO:* SRS.
2763            (TestWMSCapabilitiesParser.test_LatLonBoundingBoxes_as_bboxes):
2764            Added another test method to test whether the LatLonBoundingBox
2765            values will be returned if BoundingBox values are requested with
2766            SRS set to EPSG:3426.
2767    
2768            * Extensions/wms/parser.py (WMSCapabilitiesParser.peekLayers):
2769            Added rudimentary support for non-EPSG SRS, i.e. ignore them for
2770            the moment by placing them into a variable which is currently
2771            unused.  Also test whether the EPSG SRS is numerical as it should
2772            be and add an error message if it is not.
2773    
2774            * Extensions/wms/test/sample.xml: Added AUTO:* SRS since they
2775            appear in the real world as well.  Since we cannot handle them yet
2776            (OGCLib can't either), we will ignore them for the moment.
2777    
2778            * Extensions/wms/parser.py: Use a variable for denoting the sample
2779            filename
2780            (WMSCapabilitiesParser.peekLayers): Added support for error
2781            messages during grok().  They will be aggregated in an array and
2782            may be displayed later.  We may have to add a classification
2783            "Warning" and "Error" to this.  That requires more experience,
2784            though, since not every error may be lethal.
2785    
2786            * Thuban/UI/mainwindow.py (MainWindow.LayerShowTable): Raise the
2787            ShowTable() dialog/frame when the user attempts to display it
2788            while it has been opened before already and not closed again.
2789    
2790    2004-04-11  Martin Schulze  <[email protected]>
2791    
2792            * Extensions/wms/infodialog.py: Adjusted the class documentation
2793    
2794            * Extensions/wms/wms.py (WMSLayer.__init__, WMSLayer.GetMapImg):
2795            Switch to using Thuban{Begin,End}BusyCursor instead of the pure
2796            wxWidgets variants.
2797            (WMSLayer.__init__): The epsg_id variable is named top_srs now.
2798    
2799            * Extensions/wms/infodialog.py: Added an information dialog that
2800            will display various information about the WMS current resource,
2801            so that additional information such as the title, the abstract,
2802            fees and access constraints can be displayed for the user if they
2803            are documented in the WMS XML.
2804    
2805    2004-04-10  Martin Schulze  <[email protected]>
2806    
2807            * Extensions/wms/parser.py (WMSCapabilitiesParser.grok): Adjusted
2808            string handling.  It's "foo".lower() and not lower(foo) without
2809            lower imported from strings or something.
2810    
2811            * Extensions/wms/wms.py (WMSLayer): Incorporated WMSCapabilities
2812            from capabilities.py and parser.py.  Implement priority list for
2813            supported graphics formats, take care of wbmp != bmp.  PNG, TIFF
2814            and GIF are supported here, but not yet by main Thuban.  Hence,
2815            support for them may be removed later.  Special contribution to
2816            usability: get wxWidgets to change the cursor when we're waiting
2817            for data from the network so the user won't start to worry.  This
2818            causes a redrawing error/warning, though.
2819    
2820            * Extensions/wms/parser.py (WMSCapabilitiesParser.grok): Unlink
2821            the DOM object.
2822    
2823    2004-04-01  Martin Schulze  <[email protected]>
2824    
2825            * Extensions/wms/capabilities.py: Adjusted documentation
2826            (WMSCapabilities.__init__): Improved documentation, fixed syntax
2827            (WMSCapabilities.saveCapabilities): Only catch IOError when
2828            handling files
2829            (WMSCapabilities.loadCapabilities): Only catch IOError when
2830            handling files
2831            __main__: corrected variable naming
2832            (WMSCapabilities.fetchCapabilities,loadCapabilities): Make this
2833            class a specialisation of WMSCapabilitiesParser as well.  Also
2834            execute grok() after loading or fetching capabilities, if that
2835            went well, so that subsequent calls can already access the data.
2836            (WMSCapabilities.getVersion): Export the used version of the
2837            GetCapabilities request, so we can use it for subsequent calls,
2838            i.e. for GetMap requests.
2839            (WMSCapabilities.fetchCapabilities): Added proper error handling
2840            when the GetCapabilities request failed, so that the surrounding
2841            program can act accordingly.
2842    
2843    2004-03-30  Martin Schulze  <[email protected]>
2844    
2845            * Extensions/wms/parser.py (WMSCapabilitiesParser.getLayerSRS):
2846            Adjusted the getLayerSRS method to return the list of SRSes
2847            extracted from <SRS> elements instead of <BoundingBox> elements.
2848            Added a bit of documentation as well.
2849            (WMSCapabilitiesParser.checkLayerSRS): Removed integrity test
2850            since it was only implemented due to a misunderstanding.
2851    
2852            * Extensions/wms/test/test_parser.py
2853            (TestWMSCapabilitiesParser.test_LayerSRS): Adjust the tests to
2854            reflect the corrected interpretation of the standard: i.e. a layer
2855            does not have to define a BoundingBox for all SRSes it supports.
2856            Hence the <SRS></SRS> specification is authoritative, not the list
2857            of BoundingBoxes.
2858            (TestWMSCapabilitiesParser.test_BoundingBoxes): Added a new test
2859            to ensure None is returned for a non-existing SRS.
2860            (TestWMSCapabilitiesParser.test_grok): Removed test_grok method
2861            since it is not applicable anymore.  Listing more SRSes in <SRS>
2862            elements is valid according to the specs.
2863    
2864    2004-03-26  Bernhard Reiter <[email protected]>
2865    
2866            * README: Nicer formatting of text. Improved descriptions.
2867            Reflected wxWidgets name change.
2868            
2869            * Thuban/UI/about.py: Extended copyright to 2004 and added
2870            information about the thuban-devel mailinglist.
2871    
2872    2004-03-24  Martin Schulze  <[email protected]>
2873    
2874            * Extensions/wms/capabilities.py: Renamed the class to contain
2875            'WMS', also added a linebreak where required
2876    
2877            * Extensions/wms/parser.py: Finally added the XML parser for the
2878            GetCapabilities response.
2879    
2880            * Extensions/wms/test/sample.xml: Adjusted the sample file so that
2881            <SRS> elements match the <BoundingBox> elements, except for the
2882            layer 'beschriftung'.
2883    
2884            * Extensions/wms/test/test_parser.py: Encode non-ascii strings
2885            since Python uses unicode strings internally, otherwise
2886            comparisons will fail.  Removed tests for getLayerBBoxSRS() since
2887            the SRS will be calculated anyway and this method is obsoleted by
2888            getLayerSRS().  Denote SRS as strings and not as cardinal numbers.
2889            Move loading the sample file into the setUp method.  Added a test
2890            for finding the integrity problem in the sample response.
2891            Improved formatting.
2892    
2893            * Extensions/wms/domutils.py: Added convenience routines for
2894            handling of Document Object Model (DOM) nodes.
2895    
2896            * Extensions/wms/test/test_domutils.py: Added a test for the
2897            domutils module
2898    
2899    2004-03-19  Martin Schulze  <[email protected]>
2900    
2901            * Extensions/wms/test/test_parser.py (TestWMSCapabilitiesParser):
2902            Moved path detection and adding into a module of its own,
2903            adjustpath, which exports thubandir as main Thuban directory.
2904    
2905            * Extensions/wms/test/test_ogclib.py (TestWMSLib): Moved path
2906            detection and adding into a module of its own, adjustpath, which
2907            exports thubandir as main Thuban directory.  Reorganised the
2908            module in order to support the SkipTest feature for Thuban test
2909            cases.
2910    
2911            * Extensions/wms/test/adjustpath.py: Moved path detection and
2912            adding into a module of its own.
2913    
2914    2004-03-18  Martin Schulze  <[email protected]>
2915    
2916            * Extensions/wms/test/test_parser.py: Added another test for
2917            checking whether the WMS XML parser (to be implemented) returns
2918            the information we expect.  This requires a sample WMS WML file
2919            (sample.xml) which has been extracted from the frida server and
2920            "improved" manually.
2921    
2922            * Extensions/wms/test/test_ogclib.py: Added legacy code to add the
2923            main Thuban directory to the path in order to be able to import
2924            random modules.  Adjusted the PyOGCLib detection to reuse the
2925            information gathered.  Also added a note about the PYTHONPATH
2926            environment variable.
2927    
2928            * Extensions/wms/test/test_ogclib.py: The format specification is
2929            a mime-type, not a graphic format, hence image/jpeg wou ld be the
2930            proper format and not JPEG.  We'll also have to take care of the
2931            encoding of / as %2F.
2932    
2933    2004-03-16  Martin Schulze  <[email protected]>
2934    
2935            * Extensions/wms/test/test_ogclib.py: Added a (hopefully)
2936            comprehensive test for the getMapURL method, built compare URLs
2937            according to the documentation in OGC 01-068r3
2938    
2939            * Extensions/wms/capabilities.py (WMSCapabilities): Added the
2940            class WMSCapabilities to manage capabilites, will incorporate
2941            parsing the capabilities response and provide details for other
2942            classes.
2943    
2944    2004-03-12  Bernhard Herzog  <[email protected]>
2945    
2946            Support views in addition to normal tables in the postgis
2947            shapestore
2948    
2949            * Thuban/Model/postgisdb.py
2950            (PostGISShapeStore._fetch_table_information): Add a fallback for
2951            the case where the table name is not in the geometry_columns
2952            table.  This is usually the case for views.  Also, set
2953            self.shapestore here.
2954            (PostGISShapeStore.ShapeType): No need to query the database all
2955            the time.  The shape type is now determined in
2956            _fetch_table_information
2957    
2958            * test/postgissupport.py (PostgreSQLServer.new_postgis_db)
2959            (PostgreSQLServer.get_static_data_db, PostGISDatabase.__init__):
2960            New parameter to specify views.
2961            (PostGISDatabase.has_data): Also compare the views.  New views
2962            parameter
2963            (PostGISDatabase.initdb): Create the views.
2964            (PostgreSQLServer.get_default_static_data_db): Add the v_landmarks
2965            view
2966    
2967            * test/test_postgis_db.py
2968            (TestPostGISShapestorePointFromViews): New.  Test a
2969            PostGISShapeStore with a view
2970            (TestPostGISShapestorePointOIDAsGIDColumn.setUp): Pass the name of
2971            the geometry_column explicitly to test whether that works
2972    
2973    2004-03-12  Bernhard Herzog  <[email protected]>
2974    
2975            Final step for explicit id/geometry columns: Loading and saving
2976    
2977            * Resources/XML/thuban-1.1.dtd: New.  Derived from thuban-1.0.dtd
2978            with the following changes:
2979            (dbshapesource): Two new attributes id_column and geometry_column
2980    
2981            * Thuban/Model/save.py (SessionSaver.write): Use the new dtd
2982            (SessionSaver.write_session): Use the new namespace
2983            (SessionSaver.write_data_containers): Write the new dbshapesource
2984            parameters
2985    
2986            * Thuban/Model/load.py (SessionLoader.__init__): New namespace for
2987            the new file format version
2988            (SessionLoader.start_dbshapesource): Handle the new db parameters
2989    
2990            * test/test_save.py: Update to the new dtd and namespace
2991            (SaveSessionTest.test_save_postgis): Update the NonConnectionStore
2992            mock object to provide a working IDColumn method.
2993    
2994            * test/test_load_1_0.py: New.  Copy of the test_load.py before
2995            today's changes but with the round-trip tests removed.
2996    
2997            * test/test_load_0_9.py: Update doc-string.
2998    
2999            * test/test_load.py: Update all .thuban files to the new dtd and
3000            namespace.
3001            (TestPostGISLayer.file_contents): Add the new dbshapesource
3002            paramters
3003    
3004    2004-03-11  Bernhard Herzog  <[email protected]>
3005    
3006            Next step for explicit id/geometry columns: User interaction
3007    
3008            * Thuban/UI/dbdialog.py (ChooseDBTableDialog.__init__): Rework how
3009            the dialog is constructed. Add combo boxes to select id and
3010            geometry column.  Rename some instance variables.
3011            (ChooseDBTableDialog.GetTable): Return id and geometry column
3012            names
3013            (ChooseDBTableDialog.OnTableSelect): New. Event handler for
3014            selections in the table list
3015    
3016            * Thuban/UI/mainwindow.py (MainWindow.AddDBLayer): Use id_column
3017            and geometry_column
3018    
3019            * Thuban/Model/session.py (Session.OpenDBShapeStore): Add the new
3020            parameters for id_column and geometry column of PostGISShapeStore
3021            here as well.
3022    
3023            * Thuban/Model/postgisdb.py (type_map): Add ROWID psycog type.
3024            (_raw_type_map): New. Map raw PostgreSQL type ints to thuban types
3025            (PostGISConnection.GeometryTables): Use a better query to
3026            determine which relations in the database might be usable for
3027            shapestores.  Now supports views as well but is more PostgreSQL
3028            specific
3029            (PostGISConnection.table_columns): New. Somewhat experimental
3030            method to let the db dialogs provide lists of columns to users so
3031            that they can select id and geometry columns.
3032            (PostGISTable.__init__): The default value of the id_column
3033            parameter is now None it still means "gid" effectively, though.
3034            (PostGISTable.IDColumn): New introspection method to return a
3035            column object for the id column
3036            (PostGISShapeStore.GeometryColumn): New introspection method to
3037            return a column object for the geometry column
3038    
3039            * test/test_postgis_db.py
3040            (TestPostGISConnection.test_gis_tables_non_empty):
3041            Removed. Subsumed by the new:
3042            (TestPostGISConnection.test_gis_tables_with_views_and_tables):
3043            New. Tes the GeometryTables and table_columns methods with actual
3044            tables and views.
3045            (PointTests.test_id_column, PointTests.test_geometry_column):
3046            New. tests for the new methods.
3047            (TestPostGISShapestorePoint.setUp)
3048            (TestPostGISShapestorePointSRID.setUp)
3049            (TestPostGISShapestorePointExplicitGIDColumn.setUp): Fill the
3050            instance variables needed by the new tests
3051    
3052    2004-03-11  Bernhard Herzog  <[email protected]>
3053    
3054            * Thuban/UI/classgen.py (GenQuantilesPanel.GetList): The row
3055            numbers given to ReadValue are ordinals.
3056    
3057    2004-03-11  Bernhard Herzog  <[email protected]>
3058    
3059            Elimiate the requirement for PostGIS tables to have a column
3060            called "gid".
3061    
3062            * Thuban/Model/postgisdb.py (PostGISTable.__init__): New parameter
3063            id_column to specify which column to use to identify rows.  Also
3064            new instance variables id_column and quoted_id_column
3065            (PostGISTable.RowIdToOrdinal, PostGISTable.RowOrdinalToId)
3066            (PostGISTable.ReadRowAsDict, PostGISTable.ReadValue)
3067            (PostGISTable.SimpleQuery): Use the id column name provided to the
3068            constructor instead of "gid"
3069            (PostGISShapeStore.__init__): New parameter id_column analogously
3070            to PostGISTable.__init__.  This parameter is simply passed through
3071            to the base class constructor
3072            (PostGISShapeStore._create_col_from_description): Fix typo in
3073            doc-string
3074            (PostGISShapeStore.Shape, PostGISShapeStore.AllShapes)
3075            (PostGISShapeStore.ShapesInRegion): Use the id column name
3076            provided to the constructor instead of "gid"
3077    
3078            * test/postgissupport.py
3079            (PostgreSQLServer.get_default_static_data_db): New static table
3080            landmarks_point_id with an id column != "gid.  Update the comments
3081            a bit.
3082            (skip_if_addgeometrycolumn_does_not_use_quote_ident): Fix typo in
3083            doc-
3084            (upload_shapefile): New parameter gid_column to use a name other
3085            than "gid" for the column to store the shape ids
3086    
3087            * test/test_postgis_db.py (TableTests): New.  Mixin-class
3088            containing all tests previously in TestPostGISTable.  The actual
3089            tests are the same but the code is a bit more configurable to
3090            allow for different id columns etc.
3091            (TestPostGISTable): Derive from TableTests now for the actual
3092            tests.
3093            (TestPostGISTableExplicitGIDColumn): New. Like TestPostGISTable
3094            except that it the landmarks_point_id table to test the id_column
3095            parameter
3096            (PointTests): Extend the doc-string
3097            (TestPostGISShapestorePointExplicitGIDColumn)
3098            (TestPostGISShapestorePointOIDAsGIDColumn): New classes derived
3099            from PointTests to test the explicit id_column parameter.  One
3100            tests with the name of the column holding the shape ids, the other
3101            uses PostgreSQL's OID column.  For the latter a number of methods
3102            have to be overwritten to make them independent of the actual id
3103            values.
3104    
3105    2004-03-08  Silke Reimer  <[email protected]>
3106    
3107            Update debian directory:
3108    
3109            * debian/changelog: Added new version.
3110            * deiban/rules: Updated management of patches (with cbds)
3111            * debian/control: Added cbds to dependencies
3112            * debian/patches/*: New. Adds better support for patches of thuban in
3113                            debian
3114            * debian/menu: Syntax of menu changed slightly
3115            * debian/setup.py.patch: removed because it has been moved to
3116                            debian/patechs/setup.py.patch
3117            
3118    
3119    2004-02-26  Bernhard Herzog  <[email protected]>
3120    
3121            Create the Doc/technotes directory for text files with information
3122            for developers
3123    
3124            * Doc/technotes/README: New. README for the technotes
3125    
3126            * Doc/technotes/coding_guidelines.txt: New. Coding guidelines for
3127            Thuban
3128    
3129            * Doc/technotes/release_process.txt: New. Used to be
3130            HOWTO-Release.  Now slightly adapted to technote formatting style.
3131    
3132            * HOWTO-Release: Removed.  It's contents are now in
3133            Doc/technotes/release_process.txt
3134    
3135    2004-02-25  Bernhard Herzog  <[email protected]>
3136    
3137            * libraries/thuban/wxproj.cpp (get_wx_version): New.  Return the
3138            version of wxWindows the module was compiled with so we can check
3139            that against the wxPython version.
3140    
3141            * Thuban/version.py (thuban_branch, thuban_release): New variables
3142            controlling which and how Thuban versions are shown.  See the
3143            comments for details.
3144            (verify_versions): Also check that the wx version that wxproj is
3145            compiled against matches that of the wxPython we use at runtime
3146    
3147    2004-02-20  Bernhard Herzog  <[email protected]>
3148    
3149            * Extensions/wms/wms.py (epsg_code_to_projection): Use
3150            get_system_proj_file to read the epsg projections.  The old way
3151            depended on the current directory being the top Thuban directory.
3152    
3153    2004-02-20  Bernhard Herzog  <[email protected]>
3154    
3155            * Extensions/svgexport/test/test_svgmapwriter.py
3156            (TestVirtualDC.test_clippath): Remove a debug print
3157    
3158    2004-02-20  Bernhard Herzog  <[email protected]>
3159    
3160            * Extensions/svgexport/__init__.py: New.  Turn
3161            Extensions/svgexport into a package.
3162    
3163            * Extensions/svgexport/svgmapwriter.py: Reorder the imports and
3164            doc-string a bit.  The doc-string must come first, otherwise it's
3165            not a doc-string.  The __future__ import must be the first thing
3166            after the doc-string.  Use only double quotes in doc-strings.
3167            Single quotes trip up emacs syntax highlighting if the text
3168            contains apostrophes.
3169    
3170    2004-02-20  Bernhard Herzog  <[email protected]>
3171    
3172            * Extensions/svgexport/test/__init__.py,
3173            Extensions/svgexport/test/test_svgmapwriter.py: New. Initial test
3174            suite for svgexport
3175    
3176            * test/runtests.py (find_test_modules): New. Function with the
3177            module finding code from main.
3178            (main): Use find_test_modules to figure out the default test
3179            modules and take modules from Extensions.svgexport.test too.
3180    
3181    2004-02-19  Bernhard Herzog  <[email protected]>
3182    
3183            * Thuban/UI/application.py (ThubanApplication.OnInit): Make sure
3184            the mainwindow has a reference to the map of the initial session.
3185            This fixes a bug introduced with the fix for RT#2245
3186    
3187    2004-02-19  Bernhard Herzog  <[email protected]>
3188    
3189            * Extensions/svgexport/svgsaver.py,
3190            Extensions/svgexport/svgmapwriter.py,
3191            Extensions/svgexport/maplegend.py: Added again.  This time in the
3192            correct place.
3193    
3194    2004-02-17  Bernhard Herzog  <[email protected]>
3195    
3196            Fix for RT#2245
3197    
3198            * Thuban/UI/application.py (ThubanApplication.OnInit): Initialize
3199            instance variables before trying to create any windows.  Creating
3200            windows can start an event loop if e.g. message boxes are popped
3201            up for some reason, and event handlers, especially EVT_UPDATE_UI
3202            may want to access things from the application.
3203            (ThubanApplication.maps_changed): The mainwindow may not have been
3204            created yet, so check whether it has been created before calling
3205            its methods
3206    
3207            * Thuban/UI/view.py (MapCanvas.OnIdle): Only try to redraw if we
3208            have a map
3209    
3210    2004-02-17  Bernhard Herzog  <[email protected]>
3211    
3212            * test/test_svgmapwriter.py, Extensions/svgsaver.py,
3213            Extensions/svgmapwriter.py, Extensions/maplegend.py,
3214            extensions/svgexport/svgsaver.py,
3215            extensions/svgexport/svgmapwriter.py,
3216            extensions/svgexport/maplegend.py: Removed.  These files were in
3217            the wrong places or didn't work at all.
3218    
3219    2004-02-16  Bernhard Herzog  <[email protected]>
3220    
3221            * Thuban/UI/view.py (MapCanvas.Export): Remove accidentally added
3222            line
3223    
3224    2004-02-16  Bernhard Herzog  <[email protected]>
3225    
3226            * Thuban/UI/view.py (MapCanvas.Export): Avoid UnboundLocalError.
3227    
3228    2004-02-15  Markus Rechtien  <[email protected]>
3229            
3230            * Extensions/svgexport/svgmapwriter.py: New. Adds the capability
3231            to write a session to a file in SVG format.
3232            * Extensions/svgexport/svgsaver.py: New. Uses svgmapwriter.py
3233            to write a SVG map of a session.
3234            * Extensions/svgexport/maplegend: New. Writes a basic maplegend
3235            in SVG format for the current session.
3236    
3237    2004-02-13  Bernhard Herzog  <[email protected]>
3238    
3239            * Thuban/UI/mainwindow.py (MainWindow.AddDBLayer): When the layer
3240            can't be created, return immediately after displaying the error
3241            message.
3242    
3243    2004-02-11  Bernhard Herzog  <[email protected]>
3244    
3245            Handle postgis tables with more than one geometry column.
3246    
3247            * Thuban/Model/postgisdb.py
3248            (PostGISTable._fetch_table_information): Delegate the creation of
3249            column objects to a different method so that we can extend that in
3250            derived classes
3251            (PostGISTable._create_col_from_description): New. Column object
3252            creation part of _fetch_table_information
3253            (PostGISShapeStore._create_col_from_description): New. Extend
3254            inherited method to handle geometry columns
3255            (PostGISShapeStore.__init__): New parameter geometry_column to
3256            specify which geometry column to use.  Optional but mandatory for
3257            tables with more than one geometry column
3258            (PostGISShapeStore._fetch_table_information): Also use the name of
3259            the geometry column when looking for the srid
3260            (PostGISShapeStore.ShapeType): Also use the name of the geometry
3261            column when looking for the shape type
3262    
3263            * test/test_save.py (SaveSessionTest.test_save_postgis): Adapt
3264            NonConnectionStore to changes in the PostGISShapeStore
3265    
3266            * test/test_postgis_db.py
3267            (TestPostGISSpecialCases.test_shapestore_two_geom_cols): Test
3268            PostGISShapeStore with tables having two geometry columns.
3269    
3270    2004-02-10  Bernhard Herzog  <[email protected]>
3271    
3272            Fix some postgis problems.  What remains to be done is real
3273            handling of SRIDs as they affect how reprojection is done
3274    
3275            * Thuban/Model/postgisdb.py (quote_identifier): Fix typo in
3276            doc-string
3277            (PostGISShapeStore._fetch_table_information): New. Extend
3278            inherited method to retrieve srid
3279            (PostGISShapeStore.BoundingBox): Handle tables without data.
3280            extent yields NULL for those
3281            (PostGISShapeStore.ShapesInRegion): Use the srid of the table.
3282    
3283            * test/test_postgis_db.py
3284            (TestPostGISSpecialCases.test_shapestore_empty_table): New test
3285            for the special case of a table without any data
3286            (TestPostGISShapestorePointSRID): New class with tests for a table
3287            that uses srids
3288            (PolygonTests): Fix a doc-string typo
3289    
3290            * test/postgissupport.py (PostGISDatabase.__init__): New parameter
3291            reference_systems with a specification of spacial reference
3292            systems to create in the new db.
3293            (PostgreSQLServer.new_postgis_db)
3294            (PostgreSQLServer.get_static_data_db): New parameter
3295            reference_systems to be passed through ultimately to
3296            PostGISDatabase.  In new_postgis_db also check whether an existing
3297            db already has the right srids
3298            (PostgreSQLServer.get_default_static_data_db): Add srids and a
3299            table that uses srids
3300            (PostGISDatabase.initdb): Create the entries for the reference
3301            systems
3302            (PostGISDatabase.has_data): Add reference_systems parameter to
3303            check for those too
3304            (upload_shapefile): New parameter srid to create tables with a
3305            specific srid
3306    
3307    2004-02-06  Frank Koormann  <[email protected]>
3308    
3309            * po/pt_BR.po: Fixed charset
3310    
3311    2004-02-05  Frank Koormann  <[email protected]>
3312    
3313            * po/pt_BR.po: Fixed format string for error message, missing %s
3314            added (Thuban/UI/application.py:273)
3315    
3316    2004-02-03  Frank Koormann  <[email protected]>
3317            
3318            First version of Portuguese (Brazilian) translation
3319    
3320            * po/pt_BR.po: New, translation of pot (2004-01-15 16:07+0300) for
3321            Brazilian Portuguese by Eduardo Patto Kanegae.
3322    
3323            * Thuban/UI/about.py (About.__init.py__): Added Eduardo to the list of
3324            translators.
3325    
3326    
3327    2004-01-22  Frank Koormann  <[email protected]>
3328    
3329            * Doc/manual/thuban-manual.xml: Added section on installation of
3330            Thuban under Win32 systems. Fixed image path references in the postgis
3331            section. Some minor source formattings.
3332    
3333    2004-01-21  Frank Koormann  <[email protected]>
3334    
3335            Make Thuban remember path selections (at least for one application run).
3336    
3337            * Thuban/UI/application.py (Application.OnInit): Initialize path as a
3338            attribute of application object. Path is a dictionary of
3339            strings, currently with the items "data" and "projection".  
3340            (Application.SetPath): New, stores path for the specified item.
3341            (Application.Path): New, return path for the specified item.
3342    
3343            * Thuban/UI/mainwindow.py
3344            (MainWindow.OpenSession, MainWindow.SaveSessionAs,
3345            MainWindow.AddLayer, MainWindow.AddRasterLayer,
3346            MainWindow.TableOpen): Access "data" path information of the
3347            application.
3348            
3349            * Thuban/UI/projdialog.py (ProjFrame._OnImport, ProjFrame._OnExport):
3350            Access "projection" path information of the application.
3351    
3352    2004-01-05  Bernhard Herzog  <[email protected]>
3353    
3354            * po/ru.po: Updated translations from Alex Shevlakov
3355    
3356    2004-01-05  Bernhard Herzog  <[email protected]>
3357    
3358            * po/Makefile, po/README: Move the description of how to generate
3359            the translation statistics to the README.
3360    
3361    2003-12-23  Bernhard Herzog  <[email protected]>
3362    
3363            * NEWS: Update for 1.0.0
3364    
3365            * po/it.po: Another update from Maurizio Napolitano
3366    
3367    2003-12-23  Bernhard Herzog  <[email protected]>
3368    
3369            * po/it.po: Updated translation from Maurizio Napolitano
3370    
3371    2003-12-23  Bernhard Herzog  <[email protected]>
3372    
3373            * Thuban/UI/join.py (JoinDialog.__init__): Mark one more string
3374            for translation
3375    
3376            * Thuban/UI/mainwindow.py (MainWindow.TableRename)
3377            (MainWindow.RenameMap, MainWindow.RenameLayer): Mark some more
3378            strings for translation
3379    
3380            * po/de.po: Update with the newly marked strings.
3381    
3382    2003-12-22  Bernhard Herzog  <[email protected]>
3383    
3384            * HOWTO-Release: Fix the places where version numbers have to be
3385            updated
3386    
3387    2003-12-22  Bernhard Herzog  <[email protected]>
3388    
3389            * setup.py (setup call): 1.0.0, yeah!
3390    
3391            * Thuban/version.py (longversion): 1.0.0, yeah!
3392    
3393            * Thuban/Model/load.py (SessionLoader.__init__): Accept the
3394            1.0.0 namespace too
3395    
3396            * Thuban/Model/save.py (SessionSaver.write_session): Save with
3397            1.0.0 namespace
3398    
3399            * test/test_load.py (LoadSessionTest.dtd)
3400            (TestSingleLayer.file_contents)
3401            (TestNonAsciiColumnName.file_contents)
3402            (TestLayerVisibility.file_contents)
3403            (TestClassification.file_contents, TestLabels.file_contents)
3404            (TestLayerProjection.file_contents)
3405            (TestRasterLayer.file_contents, TestJoinedTable.file_contents)
3406            (TestLabelLayer.file_contents, TestPostGISLayer.file_contents)
3407            (TestPostGISLayerPassword.file_contents)
3408            (TestLoadError.file_contents, TestLoadError.test): Update for
3409            1.0.0 namespace
3410    
3411            * test/test_save.py (SaveSessionTest.dtd)
3412            (SaveSessionTest.testEmptySession)
3413            (SaveSessionTest.testSingleLayer)
3414            (SaveSessionTest.testLayerProjection)
3415            (SaveSessionTest.testRasterLayer)
3416            (SaveSessionTest.testClassifiedLayer)
3417            (SaveSessionTest.test_dbf_table)
3418            (SaveSessionTest.test_joined_table)
3419            (SaveSessionTest.test_save_postgis): Update for 1.0.0 namespace
3420    
3421    2003-12-22  Bernhard Herzog  <[email protected]>
3422    
3423            * Thuban/Model/load.py (SessionLoader.start_label): Make sure the
3424            alignment flags are byte strings not unicode and that they have
3425            valid values
3426    
3427            * test/test_load.py (TestLabelLayer): New. Test loading (and
3428            indirectly saving) of maps with labels.
3429    
3430    2003-12-22  Bernhard Herzog  <[email protected]>
3431    
3432            * Thuban/UI/tableview.py (TableGrid.OnDestroy)
3433            (TableGrid.__init__): Handle EVT_WINDOW_DESTROY in the grid to
3434            unsubscribe all subscribers.
3435            (LayerTableFrame.OnDestroy): Do not unsubscribe any messages from
3436            self.grid since it may already have been destroyed.
3437            Fixes RT #2256
3438    
3439    2003-12-19  Bernhard Herzog  <[email protected]>
3440    
3441            * po/fr.po, po/es.po: Updated translations from Daniel Calvelo
3442    
3443    2003-12-16  Bernhard Herzog  <[email protected]>
3444            
3445            * debian/bitmappath.patch, debian/setup.py.patch:
3446                    added to ensure compliance with FHS for debian
3447            * debian/rules, debian/changelog:
3448                added patches in rules to ensure compliance with FHS for debian
3449    
3450    2003-12-16  Bernhard Herzog  <[email protected]>
3451    
3452            * po/Makefile (mo): Make the output a bit nicer so that it prints
3453            statistics about the translations. Add a comment how produce even
3454            nicer statistics with sed.
3455    
3456    2003-12-09  Frank Koormann   <[email protected]>
3457    
3458            * Resources/Projections/defaults.proj:
3459            French projection sample with correct accents (UNICODE).
3460    
3461    2003-12-05  Bernhard Herzog  <[email protected]>
3462    
3463            * MANIFEST.in: Add the devtools directory
3464    
3465            * setup.py (setup call): Use license instead of licence. This
3466            silences a deprecation warning on Python 2.3
3467    
3468    2003-12-05  Frank Koormann   <[email protected]>
3469    
3470            Documentation synced with 1.0rc1
3471    
3472            * Doc/manual/thuban-manual.xml:
3473            Minor formatting changes and references to database layers .
3474            Introduction.Internationalization: New section on i18n.
3475            MapManagement.AddingandRemovingLayers: Added item on database layers.  
3476            MapManagement.TheLegend: Added section and screenshot on popup menu.
3477            ProjectionManagement: Updated screenshot and sentence on EPSG.
3478            Appendix.SupportedDataSources: Added PostGIS.
3479            Appendix.WorkingwithPostGIS: New section.
3480    
3481            * Doc/manual/images/6_projection.png: Updated screenshot including
3482            EPSG checkboxes.
3483    
3484            * Doc/manual/images/3_5_popup_menu.png: New, popup menu screenshot.
3485    
3486            * Doc/manual/images/app_postgis_add_layer.png,
3487            Doc/manual/images/app_postgis_db_add.png,
3488            Doc/manual/images/app_postgis_db_management.png:
3489            New screenshots focussing on database layers
3490    
3491    2003-12-05  Frank Koormann   <[email protected]>
3492    
3493            * Thuban/UI/projdialog.py (load_user_proj): If user.proj is missing
3494            write warning to stderr instead of rising a warning dialog
3495    
3496    2003-12-03  Bernhard Herzog  <[email protected]>
3497    
3498            Fix for RT #2243
3499    
3500            * Thuban/UI/mainwindow.py (MainWindow.has_selected_shape_layer):
3501            New. Like has_selected_layer but for shape layers only
3502            (_has_selected_shape_layer): New. Like _has_selected_layer but for
3503            shape layers only
3504            (layer_show_table command, layer_jointable command): Use these
3505            commands should only be available for shape layers
3506    
3507    2003-12-03  Bernhard Herzog  <[email protected]>
3508    
3509            * Thuban/UI/mainwindow.py (MainWindow.Unsubscribe): Deal with
3510            publishers that are wx objects and may have been destroyed by wx
3511            already. Fixes RT #2242.
3512    
3513    2003-12-03  Bernhard Herzog  <[email protected]>
3514    
3515            * po/ru.po: Updates from Alex Shevlakov
3516    
3517    2003-12-03  Silke Reimer <silkeintevation.de>
3518    
3519            * debian/control, debian/changelog: Added gdal-support to
3520                    debian package, updated to new thuban version
3521    
3522    
3523    2003-12-03  Bernhard Herzog  <[email protected]>
3524    
3525            * Thuban/Lib/version.py: New. Module for version number
3526            manipulations. The version of make_tuple here also deals better
3527            with more unusual version number strings, such as e.g.
3528            "1.2+cvs20031111"
3529    
3530            * Thuban/version.py (make_tuple): Removed. It's now in
3531            Thuban.Lib.version. Use that implementation instead.
3532    
3533            * test/test_lib_version.py: New. Tests for Thuban/Lib/version.py
3534    
3535    2003-12-02  Bernhard Herzog  <[email protected]>
3536    
3537            * MANIFEST.in: Add debian files
3538    
3539            * setup.py (setup call): Add packages for the Extensions so that
3540            they're installed too
3541            (data_files): Add READMEs and sample data from some Extensions
3542    
3543            * NEWS: Add note about the extensions in binary packages
3544    
3545    2003-12-02  Bernhard Herzog  <[email protected]>
3546    
3547            * Thuban/Model/save.py (SessionSaver.write_session): Save files
3548            with the thuban-1.0rc1
3549    
3550            * Thuban/Model/load.py (SessionLoader.__init__): Recognize the
3551            thuban-1.0rc1 namespace too
3552    
3553            * test/test_save.py (SaveSessionTest.dtd)
3554            (SaveSessionTest.testEmptySession)
3555            (SaveSessionTest.testSingleLayer)
3556            (SaveSessionTest.testLayerProjection)
3557            (SaveSessionTest.testRasterLayer)
3558            (SaveSessionTest.testClassifiedLayer)
3559            (SaveSessionTest.test_dbf_table)
3560            (SaveSessionTest.test_joined_table)
3561            (SaveSessionTest.test_save_postgis): Update to thuban-1.0rc1
3562            namespace
3563    
3564            * test/test_load.py (LoadSessionTest.dtd): Update to thuban-1.0rc1
3565            namespace
3566            (TestSingleLayer.file_contents)
3567            (TestNonAsciiColumnName.file_contents)
3568            (TestLayerVisibility.file_contents)
3569            (TestClassification.file_contents, TestLabels.file_contents)
3570            (TestLayerProjection.file_contents)
3571            (TestRasterLayer.file_contents, TestJoinedTable.file_contents)
3572            (TestPostGISLayer.file_contents)
3573            (TestPostGISLayerPassword.file_contents)
3574            (TestLoadError.file_contents, TestLoadError.test): Update to
3575            thuban-1.0rc1 namespace
3576    
3577    2003-12-01  Bernhard Herzog  <[email protected]>
3578    
3579            * setup.py (proj4_prefix, wx_prefix, gdal_prefix): Fix these for
3580            nt to better match Intevation's current w32 setup
3581    
3582            * HOWTO-Release: Add note about updating MANIFEST.in
3583    
3584            * MANIFEST.in: Add the Extensions
3585    
3586            * NEWS: Update for 1.0rc1
3587    
3588    2003-12-01  Bernhard Herzog  <[email protected]>
3589    
3590            * Thuban/UI/mainwindow.py (MainWindow.AddLayer): Change the wild
3591            cards for the dialog so that shapefiles ending in all uppercase
3592            SHP are listed too
3593    
3594    2003-11-28  Bernhard Herzog  <[email protected]>
3595    
3596            * Thuban/version.py (longversion): Update to 1.0rc1
3597    
3598            * setup.py (setup call): Update version to 1.0rc1. Use the
3599            [email protected] email address as author email instead of my
3600            personal one.
3601    
3602    2003-11-28  Bernhard Herzog  <[email protected]>
3603    
3604            * po/de.po: Update german translation.
3605    
3606    2003-11-28  Bernhard Herzog  <[email protected]>
3607    
3608            Unify the filenames stored in .thuban files so that the .thuban
3609            files are more platform independend
3610    
3611            * Thuban/Model/save.py (unify_filename): New. Unify filenames so
3612            that they can be used on both windows and unix
3613            (SessionSaver.prepare_filename): New. Handle all filename
3614            transformations for filenames stored in the thuban file
3615            (SessionSaver.write_data_containers, SessionSaver.write_layer):
3616            Use prepare_filename
3617    
3618            * test/test_save.py (SaveSessionTest.testSingleLayer)
3619            (SaveSessionTest.testLayerProjection)
3620            (SaveSessionTest.testRasterLayer)
3621            (SaveSessionTest.testClassifiedLayer)
3622            (SaveSessionTest.test_dbf_table)
3623            (SaveSessionTest.test_joined_table): Filenames are always stored
3624            with slashes on all currently supported platforms so adapt all
3625            tests to this
3626    
3627            * test/test_load.py (LoadSessionTest.filenames): With the new
3628            filename scheme the filenames in the tests should be
3629            understandable on all currently supported platforms so we turn
3630            this into an empty list because we don't have to normalize them
3631            anymore
3632    
3633    2003-11-28  Bernhard Herzog  <[email protected]>
3634    
3635            * test/test_layer.py (TestLayer.test_arc_layer_with_projection):
3636            Add the ellipsoid to the projection since some Proj versions
3637            complain if it's missing.
3638    
3639    2003-11-27  Bernhard Herzog  <[email protected]>
3640    
3641            Corect some bounding box projection problems
3642    
3643            * Thuban/Model/proj.py (Projection.InverseBBox): New. Inverse
3644            version of ForwardBBox
3645            (Projection._transform_bbox): New. common implementation of
3646            ForwardBBox and InverseBBox
3647            (Projection.ForwardBBox): Use _transform_bbox.
3648    
3649            * test/test_proj.py (TestProjection.test): Add test for
3650            InverseBBox
3651    
3652            * Thuban/Model/layer.py (Layer.LatLongBoundingBox)
3653            (Layer.ShapesBoundingBox, RasterLayer.LatLongBoundingBox): Use the
3654            new InverseBBox method to determine the unprojected bounding box
3655            (Layer.ShapesInRegion): Use the ForwardBBox method to project the
3656            bbox.
3657    
3658            * test/test_layer.py (TestLayer.test_point_layer_with_projection):
3659            Removed.
3660            (TestLayer.test_arc_layer_with_projection): New. This test is
3661            better able to test whether bounding boxes are projected correctly
3662            than test_point_layer_with_projection
3663    
3664            * Thuban/UI/viewport.py (ViewPort.map_projection_changed): Use
3665            InverseBBox to unproject bboxes
3666    
3667    2003-11-25  Bernhard Herzog  <[email protected]>
3668    
3669            * Thuban/UI/about.py (About.__init__): Make sure we have ASCII
3670            source code.
3671    
3672    2003-11-25  Bernhard Herzog  <[email protected]>
3673    
3674            * Thuban/Model/layer.py (Layer.__getattr__): Removed. It was only
3675            there for backwards compatibility and all code relying on that
3676            should have been updated by now.
3677    
3678    2003-11-25  Bernhard Herzog  <[email protected]>
3679    
3680            * test/test_load.py (TestClassification.test): Add the missing
3681            round trip test.
3682            (TestClassification.file_contents): Update to the newest file
3683            format
3684    
3685    2003-11-25  Bernhard Herzog  <[email protected]>
3686    
3687            Add very experimental (and possibly dangerous) extension to draw
3688            polygons:
3689    
3690            * Extensions/drawshape/README: New. Brief installation
3691            instructions
3692    
3693            * Extensions/drawshape/drawshape.py: New. Implementation of the
3694            drawshape extensions
3695    
3696            * Extensions/drawshape/patch.diff: Patch to apply before the
3697            extension can be used.
3698    
3699    2003-11-24  Bernhard Herzog  <[email protected]>
3700    
3701            * Thuban/Model/data.py (ShapefileStore._open_shapefile)
3702            (ShapefileStore.__init__): Factor opening the shapefile into a
3703            separate method (the new _open_shapefile). This makes the code a
3704            bit more readable but the real reason is that it makes some evil
3705            hacks easier. :-)
3706    
3707    2003-11-24  Bernhard Herzog  <[email protected]>
3708    
3709            * Thuban/Model/load.py (SessionLoader.check_attrs): If no
3710            converter is specified for an attribute assume it's a string
3711            containing only Latin1 characters. Update doc-string accordingly.
3712            This change should fix many places where unicode objects might
3713            accidentally enter Thuban.
3714    
3715            * test/test_load.py (TestNonAsciiColumnName): New test to check
3716            what happens with column names in DBF files that contain non-ascii
3717            characters
3718    
3719    2003-11-21  Bernhard Herzog  <[email protected]>
3720    
3721            Enable the experimental attribute editing again and introduce a
3722            command line switch to actually activate it
3723    
3724            * Thuban/UI/main.py (options): New. Container for options set on
3725            the commmand line
3726            (main): Add the --enable-attribute-editing flag.
3727    
3728            * Thuban/UI/identifyview.py (IdentifyView.__init__): If attribute
3729            editing is enabled use the grid ctrl which allows editing of the
3730            values
3731    
3732            * Thuban/Model/transientdb.py (AutoTransientTable.write_record):
3733            New. Just delegate this to the underlying table.
3734    
3735    2003-11-20  Bernhard Herzog  <[email protected]>
3736    
3737            * test/test_proj.py (ProjFileReadTests.test_read_unreadable_file):
3738            Skip this test if run under non-posix systems since it only works
3739            there
3740    
3741    2003-11-19  Bernhard Herzog  <[email protected]>
3742    
3743            * Thuban/Model/resource.py: Rework the way gdal support is
3744            determined so that we can give a reason in the about why gdal is
3745            not supported.
3746            (gdal_support_status): New. Variable holding a string with the
3747            reason for no gdal support
3748    
3749            * Thuban/UI/about.py (About.__init__): Add the reason why gdal is
3750            not supported to the message
3751    
3752    2003-11-19  Bernhard Herzog  <[email protected]>
3753    
3754            Remove the old table interface and its test cases
3755    
3756            * Thuban/Model/table.py (OldTableInterfaceMixin): Removed.
3757            (DBFTable, MemoryTable): Do not derive from OldTableInterfaceMixin
3758            anymore
3759    
3760            * Thuban/Model/transientdb.py (TransientTableBase)
3761            (AutoTransientTable): Do not derive from OldTableInterfaceMixin
3762            anymore
3763    
3764            * test/test_table.py: Removed since the old interface it tests is
3765            gone.
3766    
3767            * test/runtests.py (main): The old table interface is gone and
3768            with it the deprecation warnings so remove the code that turns
3769            these warnings into errors
3770    
3771    2003-11-19  Bernhard Herzog  <[email protected]>
3772    
3773            * test/test_table.py: Revert to revision 1.5 again. Changing the
3774            tests to use the new table interface is completely wrong since the
3775            whole purpose of the tests in this module is to test the old
3776            interface.
3777    
3778    2003-11-18  Bernhard Herzog  <[email protected]>
3779    
3780            * Thuban/Model/postgisdb.py (PostGISConnection.MatchesParameters):
3781            New. Test whether the connection matches a set of connection
3782            parameters
3783    
3784            * Thuban/UI/dbdialog.py (DBFrame.conns_changed): Fix doc-string
3785            (DBFrame.OnAdd): Use the new MatchesParameters method when looking
3786            for existing connections with the same parameters and break out of
3787            the loop correctly.
3788    
3789            * test/test_postgis_db.py (TestBriefDescription)
3790            (TestPostGISSimple.test_brief_description): Rename
3791            TestBriefDescription to TestPostGISSimple and the test method to
3792            test_brief_description so that we can add more test methods.
3793            (TestPostGISSimple.test_matches_parameters): New. Test the new
3794            MatchesParameters method
3795    
3796    2003-11-18  Bernhard Herzog  <[email protected]>
3797    
3798            * Thuban/Lib/connector.py (Publisher): Introduce a new flag,
3799            _was_destroyed, to indicate whether an publisher instance has
3800            already been destroyed.
3801            (Publisher.Unsubscribe): Only disconnect if the publisher has not
3802            been destroyed yet.
3803            (Publisher.Destroy): Set the _was_destroyed flag to true.
3804    
3805            * test/test_connector.py
3806            (TestPublisher.test_unsubscribe_after_destroy): New. Test that
3807            calling Unsubscribe after Destroy doesn't raise an exception
3808    
3809    2003-11-14  Bernhard Herzog  <[email protected]>
3810    
3811            * Thuban/UI/identifyview.py (IdentifyView.selected_shape): Fix
3812            typo in doc-string
3813    
3814    2003-11-13  Bernhard Herzog  <[email protected]>
3815    
3816            Quote table and column names properly for postgis.
3817    
3818            * Thuban/Model/postgisdb.py (quote_identifier): New. Function to
3819            quote an identifier for use in an sql statement
3820            (PostGISColumn.__init__): Add the quoted_name attribute
3821            (PostGISTable.__init__): New instance variable quoted_tablename
3822            (PostGISTable._fetch_table_information): Use the quoted table
3823            name. New isntance variable quoted_geo_col with a quoted version
3824            of geometry_column
3825            (PostGISTable.NumRows, PostGISTable.RowIdToOrdinal)
3826            (PostGISTable.RowOrdinalToId): Use the quoted table name
3827            (PostGISTable.ReadValue, PostGISTable.ValueRange)
3828            (PostGISTable.UniqueValues, PostGISTable.SimpleQuery)
3829            (PostGISShapeStore.BoundingBox, PostGISShapeStore.Shape)
3830            (PostGISShapeStore.AllShapes, PostGISShapeStore.ShapesInRegion):
3831            Use quoted table and column names
3832    
3833            * test/test_postgis_db.py (TestPostGISSpecialCases)
3834            (TestPostGISIgnoredColumns): Rename the class to
3835            TestPostGISSpecialCases because that better describes the new
3836            cases
3837            (TestPostGISSpecialCases.test_unsupported_types)
3838            (TestPostGISSpecialCases.test): Rename the method to
3839            test_unsupported_types because we need a more descriptive name now
3840            that there are more methods
3841            (TestPostGISSpecialCases.test_table_name_quoting)
3842            (TestPostGISSpecialCases.test_column_name_quoting)
3843            (TestPostGISSpecialCases.test_shapestore_name_quoting): New test
3844            cases to test quoting of table and column names in PostGISTable
3845            and PostGISShapeStore
3846    
3847            * test/postgissupport.py
3848            (skip_if_addgeometrycolumn_does_not_use_quote_ident): New. Skip if
3849            AddGeometryColumn desn't support table or column names with sapces
3850            or double quotes
3851    
3852    2003-11-12  Jan-Oliver Wagner <[email protected]>
3853    
3854            * Extensions/wms/__init__.py: New: Init to make this
3855            directory a package.
3856    
3857            * Extensions/wms/wms.py: New: Provide layers via OGC WMS.
3858    
3859    2003-11-11  Bernhard Herzog  <[email protected]>
3860    
3861            * Thuban/Model/resource.py (EPSG_DEPRECATED_PROJ_FILE): New.
3862            Constant for the file woth deprecated epsg projections
3863            (get_system_proj_file): Update doc-string
3864    
3865            * Thuban/UI/projdialog.py (ProjFrame.build_dialog): Add a space
3866            above the EPS widgets, introduce a check box for the deprecated
3867            eps projections and a label for the epsg widgets
3868            (ProjFrame._OnShowEPSG): Handle the deprecated EPSG projections
3869            too
3870    
3871    2003-11-11  Bernhard Herzog  <[email protected]>
3872    
3873            Avoid warnings when run under Python 2.3
3874    
3875            * Thuban/UI/baserenderer.py (BaseRenderer.draw_point_shape)
3876            (BaseRenderer.draw_label_layer): Coordinates must be ints.
3877    
3878            * Thuban/UI/renderer.py (MapRenderer.make_point): Turn this into a
3879            real method so that we can convert to int.
3880            (MapRenderer.label_font): The font size mist be an int.
3881    
3882            * Thuban/UI/common.py (Color2wxColour): The color values must be
3883            ints. Also, remove the unnecessary asserts.
3884    
3885            * test/test_load_0_8.py (TestUnicodeStrings.file_contents)
3886            (TestUnicodeStrings.test): Python source code should not contain
3887            non-ascii characters unless an encoding is specified in the file.
3888            Therefore use \x escapes in the string literals for non-ascii
3889            characters.
3890    
3891    2003-11-11  Bernhard Herzog  <[email protected]>
3892    
3893            * Thuban/Model/resource.py (get_system_proj_file): Add a filename
3894            parameter so that this function can be used for all proj files in
3895            Resource/Projections
3896            (DEFAULT_PROJ_FILE, EPSG_PROJ_FILE): New. Predefined filenames for
3897            get_system_proj_file
3898    
3899            * Thuban/UI/projdialog.py (ProjFrame.__init__): Instead of one
3900            ProjFile self.__sysProjFile use a dictionary of system ProjFile
3901            objects self._sys_proj_files
3902            (ProjFrame.build_dialog): Adapt to the new changes in the
3903            ProjectionList constructor. Add a check button to toggle whether
3904            EPSG projections are shown
3905            (ProjFrame._OnShowEPSG): New. Handler for the epsg check button
3906            events.
3907            (ProjFrame.load_user_proj, ProjFrame.load_system_proj): Only show
3908            the busy cursor if the files have not yet been loaded by the
3909            dialog.
3910            (ProjFrame.load_system_proj): Add a parameter for the name of the
3911            proj file. Maintain the dictionary of system projections
3912            self._sys_proj_files
3913    
3914            * Thuban/UI/projlist.py (ProjectionList): Merge the system_projs,
3915            user_projs parameters into one parameter proj_files which is a
3916            list of proj files.
3917            (ProjectionList._subscribe_proj_files)
3918            (ProjectionList._unsubscribe_proj_files): New. Move
3919            subscription/unsubscription of projfile messages to separate
3920            methods
3921            (ProjectionList.Destroy): The unsubscribe is now done in
3922            _unsubscribe_proj_files
3923            (ProjectionList.update_projections): We now have a list of proj
3924            file objects
3925            (ProjectionList.SetProjFiles): New method to set a new list of
3926            proj file objects
3927    
3928            * test/test_proj.py (ProjFileReadTests.test_get_system_proj_file):
3929            Specify explicitly which system proj file to load.
3930    
3931    2003-11-11  Bernhard Herzog  <[email protected]>
3932    
3933            * Thuban/Model/load.py (SessionLoader.Destroy): New. Clear all
3934            instance variables to cut cyclic references. The GC would have
3935            collected the loader eventually but it can happen that it doesn't
3936            run at all until thuban is closed (2.3 but not 2.2 tries a bit
3937            harder and forces a collection when the interpreter terminates)
3938            (load_session): Call the handler's Destroy method to make sure
3939            that it gets garbage collected early. Otherwise it will be
3940            collected very late if at all and it holds some references to e.g.
3941            shapestores and the session which can lead to leaks (of e.g. the
3942            temporary files)
3943    
3944            * test/test_load.py (TestSingleLayer.test_leak): New. test for the
3945            resource leak in load_session
3946    
3947    2003-11-10  Bernhard Herzog  <[email protected]>
3948    
3949            * Thuban/UI/baserenderer.py: Add a way to specify how layers in
3950            extensions are to be rendered.
3951            (_renderer_extensions): New. List with renderer for layers in
3952            extensions
3953            (add_renderer_extension): New. Add a renderer extension
3954            (init_renderer_extensions): New. Init the renderer extensions
3955            (BaseRenderer.render_map_incrementally): Search
3956            _renderer_extensions for how to draw unknown layer types
3957            (BaseRenderer.draw_raster_data): Add format parameter so that
3958            formats other than BMP can be drawn
3959            (BaseRenderer.draw_raster_layer): Pass an explicit format to
3960            draw_raster_data
3961    
3962            * Thuban/UI/renderer.py (raster_format_map): New. Mapping form the
3963            strings of the format parameter of draw_raster_data method to wx
3964            constants
3965            (MapRenderer.draw_raster_data): Add the format parameter and use
3966            raster_format_map to map it to the right wxwindows constant for
3967            wxImageFromStream
3968    
3969            * test/test_baserenderer.py (SimpleRenderer.draw_raster_data): Add
3970            the format parameter and record it
3971            (TestBaseRenderer.test_raster_no_projection): check the format
3972            paramter of the draw_raster_data method
3973            (TestBaseRenderer.test_renderer_extension): New. Test the renderer
3974            extension facility
3975    
3976    2003-11-07  Bernhard Herzog  <[email protected]>
3977    
3978            Tweak the usage of the sqlite database to make common use cases
3979            more responsive. In most cases copying the data to the sqlite
3980            database takes so long that using sqlite doesn't have enough
3981            advantages.
3982    
3983            * Thuban/Model/transientdb.py (TransientTableBase.ValueRange): Add
3984            comments about performance and query the min and max in separate
3985            statements because only that way will indexes be used.
3986            (TransientTableBase.UniqueValues): Add some comments about
3987            performance.
3988            (AutoTransientTable.ValueRange, AutoTransientTable.UniqueValues):
3989            Do not copy the data to the transient DB but use the transient
3990            copy if it exists. See the new comments for the performance trade
3991            offs
3992    
3993            * test/test_transientdb.py
3994            (TestTransientTable.test_auto_transient_table): Make sure that the
3995            data is copied to the transient database at some point.
3996    
3997    2003-11-03  Bernhard Herzog  <[email protected]>
3998    
3999            * Thuban/Model/data.py (ShapefileStore.ShapesInRegion): Bind some
4000            globals to locals so that it's a bit faster
4001    
4002    2003-11-03  Bernhard Herzog  <[email protected]>
4003    
4004            * Thuban/UI/baserenderer.py
4005            (BaseRenderer.draw_shape_layer_incrementally): Use the ReadValue
4006            method. ReadValue is faster than ReadRowAsDict since it only reads
4007            one cell especially now that the dbf file objects actually
4008            implement it.
4009    
4010            * Thuban/Model/table.py (DBFTable.ReadValue): Use the new
4011            read_attribute method of the dbf objects
4012    
4013    2003-11-03  Bernhard Herzog  <[email protected]>
4014    
4015            * Extensions/profiling/profiling.py (popup_dialog_box): New config
4016            variable to indicate whether the result should be shown in a
4017            dialog box
4018            (profile_screen_renderer, time_screen_renderer): Only show a
4019            dialog box if popup_dialog_box is true.
4020            (profile_screen_renderer): Flush stdout after the printing the
4021            first part of the "profiling..." message
4022    
4023            * Thuban/UI/baserenderer.py
4024            (BaseRenderer.draw_shape_layer_incrementally): Cache the pens and
4025            brushes for the groups so that they're not created over and over
4026            again
4027    
4028            * Thuban/Model/classification.py (Classification.__getattr__)
4029            (Classification._compile_classification)
4030            (Classification._clear_compiled_classification): New. Methods to
4031            manage a 'compiled' representation of the classification groups
4032            which is created on demand
4033            (Classification.InsertGroup, Classification.RemoveGroup)
4034            (Classification.ReplaceGroup): reset the compiled representation
4035            (Classification.FindGroup): Use the compiled representation to
4036            find the matching group
4037            (ClassGroupRange.GetRangeTuple): New. Return the range as a tuple
4038    
4039    2003-10-31  Bernhard Herzog  <[email protected]>
4040    
4041            * Thuban/Model/classification.py (Classification.SetDefaultGroup):
4042            Send a CLASS_CHANGED message
4043            (Classification.RemoveGroup): Send a CLASS_CHANGED message and do
4044            not return the removed group since it wasn't used.
4045    
4046            * test/test_classification.py
4047            (TestClassification.test_set_default_group): New. Test the
4048            SetDefaultGroup method
4049            (TestClassification.test_insert_group): New. Test the InsertGroup
4050            method
4051            (TestClassification.test_remove_group): New. Test the RemoveGroup
4052            method
4053            (TestClassification.test_replace_group): New. Test the
4054            ReplaceGroup method
4055    
4056    2003-10-31  Bernhard Herzog  <[email protected]>
4057    
4058            * test/test_classification.py (TestClassification.setUp):
4059            Subscribe to the CLASS_CHANGED messages
4060            (TestClassification.tearDown): New. Destroy the classification
4061            properly
4062            (TestClassification.test_defaults): Add tests for the default line
4063            width and whether no messages were sent yet
4064            (TestClassification.test_set_default_properties): Add tests for
4065            messages and setting the default line width
4066            (TestClassification.test_add_singleton)
4067            (TestClassification.test_add_range)
4068            (TestClassification.test_multiple_groups): Add tests for messages
4069    
4070    2003-10-31  Bernhard Herzog  <[email protected]>
4071    
4072            Some more refactoring in preparation for new tests:
4073    
4074            * test/test_classification.py (TestClassification.setUp): New.
4075            Instantiate the classification here. Update the test methods
4076            accordingly.
4077            (TestClassification.test_multiple_groups): Make sure that the two
4078            singletons matching 1 are considered different.
4079    
4080    2003-10-31  Bernhard Herzog  <[email protected]>
4081    
4082            * test/test_classification.py (red, green, blue): New. These
4083            constants were used in several cases. Update the relevant methods.
4084            (TestClassification.test_defaults)
4085            (TestClassification.test_set_default_properties)
4086            (TestClassification.test_add_singleton)
4087            (TestClassification.test_add_range)
4088            (TestClassification.test_multiple_groups)
4089            (TestClassification.test_deepcopy): New. These were formerly all
4090            part of the single method test.
4091            (TestClassification.test_deepcopy): Removed.
4092            (TestClassIterator): Removed. The test case is now a method of
4093            TestClassification since it tests part of the public interface of
4094            Classification
4095            (TestClassification.test_iterator): New. Used to be
4096            TestClassIterator effectively
4097    
4098    2003-10-31  Jan-Oliver Wagner <[email protected]>
4099    
4100            GUIfied the functions of the profiling extension.
4101    
4102            * /Extensions/profiling/__init__.py: New: Init to make this
4103            directory a package.
4104    
4105            * Extensions/profiling/profiling.py: Moved menu entries to
4106            the Extensions menu. Applied _() for strings.
4107            (profile_screen_renderer): Catch the detailed printout and present
4108            it in a dialog.
4109            (time_screen_renderer): Raise a dialog to present the result instead
4110            of printing it to stdout.
4111    
4112    2003-10-31  Bernhard Herzog  <[email protected]>
4113    
4114            * test/test_classification.py (TestClassGroupProperties)
4115            (TestClassGroup, TestClassGroupDefault, TestClassGroupRange)
4116            (TestClassGroupSingleton, TestClassIterator, TestClassification):
4117            Split TestClassification into several classes, one for each class
4118            being tested. TestClassification itself now only tests
4119            Classification. This split makes changes to the tests a bit easier
4120    
4121    2003-10-31  Bernhard Herzog  <[email protected]>
4122    
4123            * Extensions/profiling/profiling.py: New. Extension to measure
4124            Thuban performance
4125    
4126    2003-10-31  Frank Koormann <[email protected]>
4127    
4128            Added two items to legend popup menu: Remove Layer and Show Layer Table
4129    
4130            * Thuban/UI/legend.py (LegendPanel._OnRemoveLayer,
4131            LegendPanel._OnShowTable): New event handlers, call the corresponding
4132            mainwindow methods.
4133            (LegendTree._OnRightClick): Added items to popup menu.
4134    
4135    2003-10-30  Bernhard Herzog  <[email protected]>
4136    
4137            * Thuban/UI/dialogs.py (ThubanFrame.__init__): Handle
4138            EVT_WINDOW_DESTROY
4139            (ThubanFrame.OnDestroy): New. Handler for EVT_WINDOW_DESTROY. Does
4140            nothing but is convenient for the derived classes.
4141    
4142            * Thuban/UI/tableview.py
4143            (TableFrame.OnDestroy, LayerTableFrame.OnDestroy): New.
4144            Unsubscribe the messages here not in OnClose because that might
4145            get called multiple times. Fixes RT #2196
4146            (TableFrame.OnClose, LayerTableFrame.OnClose): Removed. Not needed
4147            anymore.
4148    
4149            * README: Update the minimum requirement for wxPython. Since we
4150            now use the EVT_WINDOW_DESTROY event, we need at least 2.4.0.4,
4151            the version in which that was introduced for all platforms
4152    
4153    2003-10-30  Frank Koormann <[email protected]>
4154    
4155            * Thuban/UI/join.py (JoinDialog.OnJoin): Wrapped the major parts of
4156            the join process in a ThubanBeginBusyCursor, ThubanEndBusyCursor
4157            frame.
4158    
4159    2003-10-30  Jan-Oliver Wagner <[email protected]>
4160    
4161            Improved APR import extension, added further EPSG definitions
4162            and some cleanup regarding string class.
4163    
4164            * test/test_proj.py (TestProjection.test_get_projection_units_geo):
4165            Added test for alias 'longlat'.
4166    
4167            * Resources/Projections/epsg-deprecated.proj: New. Contains
4168            deprecated EPSG definitions.
4169    
4170            * Extensions/importAPR/odb.py (ODBBaseObject.TreeInfo): Added
4171            the variable names for objects.
4172    
4173            * Extensions/importAPR/apr.py (APR_BLnSym, APR_BMkSym, APR_BShSym): New.
4174            Copied from importAPR and provided with documentation.
4175    
4176            * Extensions/importAPR/importAPR.py (APR_BLnSym, APR_BMkSym, APR_BShSym):
4177            Moved to apr.py.
4178            (APR_View): Added object ref 'ITheme'.
4179    
4180            * Thuban/Lib/fileutil.py, Thuban/UI/proj4dialog.py: Replaced string
4181            split function by corresponding use of the string class method.
4182    
4183            * Thuban/Model/xmlwriter.py: Replaced string replace function by
4184            corresponding string method.
4185    
4186    2003-10-29  Bernhard Herzog  <[email protected]>
4187    
4188            * Thuban/UI/baserenderer.py
4189            (BaseRenderer.draw_shape_layer_incrementally): Speed up the
4190            special case of a classification that only has the default group
4191    
4192    2003-10-27  Bernhard Herzog  <[email protected]>
4193    
4194            * po/fr.po, po/es.po: Updated translations from Daniel Calvelo
4195    
4196            * po/de.po: Update.
4197    
4198            * Thuban/UI/application.py
4199            (ThubanApplication.ShowExceptionDialog): Handle translation of the
4200            dialog message properly
4201    
4202    2003-10-27  Bernhard Herzog  <[email protected]>
4203    
4204            Rework how localization works so that we use wx's translation
4205            functions when running Thuban as a normal application but not when
4206            we don't need any UI, such as in the test suite. See the comment
4207            in Thuban/__init__.py for details
4208    
4209            * Thuban/__init__.py (_): Add one level of indirection to make the
4210            translation handling more flexible and to make it possible to use
4211            either wx's translation services or not.
4212            (gettext_identity, translation_function_installed)
4213            (install_translation_function): New function to help with this
4214    
4215            * Thuban/UI/__init__.py: Install the wx specific translation
4216            function if it's OK to do that
4217    
4218            * test/support.py (initthuban): Install a dummy translation
4219            function so that importing Thuban.UI doesn't install a wx specific
4220            one for which would need to import wxPython
4221    
4222    2003-10-27  Bernhard Herzog  <[email protected]>
4223    
4224            * HOWTO-Release: Source archives should be created first and the
4225            binary packages should be created from the source archives.
4226            There's an official debian package now so there's no need to test
4227            the rpm on debian anymore
4228    
4229    2003-10-27  Bernhard Herzog  <[email protected]>
4230    
4231            Several rendering changes:
4232    
4233             - Render the selection into a separate bitmap so that only that
4234               bitmap needs to be redrawn when the selection changes
4235    
4236             - Render incrementally showing previews and allowing interaction
4237               before rendering is complete
4238    
4239             - Update the renderer interface a bit. Most parameters of
4240               RenderMap are now parameters of the constructor
4241    
4242            * Thuban/UI/baserenderer.py (BaseRenderer.__init__): Add the map
4243            and the update region as parameters. Update the doc-string
4244            (BaseRenderer.render_map_incrementally): New. Generator function
4245            to renders the map incrementally
4246            (BaseRenderer.render_map): Remove the map argument (it's now in
4247            the constructor) and simply iterate over the
4248            render_map_incrementally generator to draw the map.
4249            (BaseRenderer.draw_shape_layer_incrementally)
4250            (BaseRenderer.draw_shape_layer): Renamed to
4251            draw_shape_layer_incrementally and changed into a generator that
4252            yields True every 500 shapes. Used by render_map_incrementally to
4253            render shape layers incrementally
4254    
4255            * Thuban/UI/renderer.py (ScreenRenderer.RenderMap): Removed the
4256            map and region parameters which are now in the constructor
4257            (ScreenRenderer.RenderMapIncrementally): New. Public frontend for
4258            the inherited render_map_incrementally.
4259            (BaseRenderer.draw_shape_layer): Removed.
4260            (ScreenRenderer.draw_selection_incrementally): New. The selection
4261            drawing part of the removed draw_shape_layer as a generator
4262            (ScreenRenderer.layer_shapes): Update because of the region
4263            parameter change
4264            (ExportRenderer.__init__): New. Extend the inherited constructor
4265            with the destination region for the drawing
4266            (ExportRenderer.RenderMap): Removed the map and region parameters
4267            which are now in the constructor
4268    
4269            * Thuban/UI/view.py (MapCanvas.PreviewBitmap): New. Return a
4270            bitmap suitable for a preview in a tool
4271            (CanvasPanTool.MouseMove): Use the PreviewBitmap method to get the
4272            bitmap
4273            (MapPrintout.draw_on_dc): Adapt to new renderer interface
4274            (MapCanvas.OnPaint): Handle drawing the selection bitmap if it
4275            exists
4276            (MapCanvas.OnIdle): Update the logic to deal with incremental
4277            rendering and the selection bitmap
4278            (MapCanvas._do_redraw): Handle the instantiation of the render
4279            iterator and the redraws during rendering
4280            (MapCanvas._render_iterator): New. Generator to incrementally
4281            redraw both bitmaps
4282            (MapCanvas.Export): Adapt to new renderer interface.
4283            (MapCanvas.full_redraw): Reset the selection bitmap and the
4284            renderer iterator too
4285            (MapCanvas.redraw_selection): New. Force a redraw of the selection
4286            bitmap
4287            (MapCanvas.shape_selected): Only redraw the selection bitmap
4288    
4289            * test/test_baserenderer.py
4290            (TestBaseRenderer.test_polygon_no_projection)
4291            (TestBaseRenderer.test_raster_no_projection)
4292            (TestBaseRenderer.test_point_map_projection)
4293            (TestBaseRenderer.test_point_layer_and_map_projection)
4294            (TestBaseRenderer.test_point_layer_projection)
4295            (TestBaseRenderer.test_point_with_classification): Adapt to new
4296            renderer interface
4297    
4298    2003-10-24  Bernhard Herzog  <[email protected]>
4299    
4300            * libraries/thuban/wxproj.cpp (draw_polygon_shape)
4301            (point_in_polygon_shape, shape_centroid): Raise an exception if
4302            the shape can't be read. Previously invalid shape ids would lead
4303            to a segfault.
4304    
4305            * test/test_wxproj.py (TestShapeCentroid.test_invalid_shape_id):
4306            New. test whether an exception is raised for invalid shape ids
4307    
4308    2003-10-24  Jan-Oliver Wagner <[email protected]>
4309    
4310            * Thuban/Model/proj.py (Projection.GetProjectedUnits): Added 'longlat'
4311            as alias for 'latlong'.
4312    
4313            * Thuban/UI/projdialog.py (ProjFrame.__init__): Added 'longlat'
4314            as alias for 'latlong'.
4315    
4316    2003-10-24  Jan-Oliver Wagner <[email protected]>
4317    
4318            * Thuban/UI/projdialog.py (ProjFrame.proj_selection_changed): Set
4319            the projection even for the UnknownPanel.
4320            (UnknownProjPanel.__init__): Define the text and create the textctrl
4321            widget.
4322            (UnknownProjPanel._DoLayout): Replaced static text widget by the
4323            textctrl created in __init__.
4324            (UnknownProjPanel.SetProjection): Set the text for the text ctrl
4325            including the parameters of the projection.
4326            
4327    2003-10-24  Jan-Oliver Wagner <[email protected]>
4328    
4329            * Resources/Projections/epsg.proj: New. This is a list of
4330            EPSG codes with parameters for proj. The list has been
4331            generated using devtools/create_epsg.py based on the
4332            file nad/epsg of the proj 4.4.7 package. Four projection
4333            definitions have been deleted as they are not accepted by proj:
4334            "CH1903+ / LV95", "Bern 1898 (Bern) / LV03C", "CH1903 / LV03"
4335            and "HD72 / EOV".
4336    
4337    2003-10-22  Bernhard Herzog  <[email protected]>
4338    
4339            Some more tweaks to the projection dialog which should fix RT
4340            #1886.
4341    
4342            * Thuban/UI/projlist.py (ProjectionList.Destroy): Unsubscribe from
4343            the ProjFile's messages and call the base class methods correctly
4344            (ProjectionList.SelectProjection): Set the wxLIST_STATE_FOCUSED
4345            flag on the newly selected item too. Otherwise some other item is
4346            focused and the first time the focus is moved with the keyboard
4347            the selection moves in unexpected ways.
4348    
4349            * Thuban/UI/projdialog.py (ProjFrame.__init__): Do not set the
4350            focus on the OK button, only on the projection list. That way the
4351            list really has the focus initially
4352            (ProjFrame.OnClose): Call the projection list's Destroy method to
4353            make it unsubscribe all messages
4354    
4355    2003-10-21  Bernhard Herzog  <[email protected]>
4356    
4357            Rework the projection dialog to fix a few bugs, including RT 2166
4358            and most of 2168
4359    
4360            * Thuban/UI/projlist.py: New. The class ProjectionList is a
4361            special wxListCtrl to show a list of projections in a more MVC
4362            fashion
4363    
4364            * Thuban/UI/projdialog.py (ProjFrame): Substantial changes
4365            throughout the class. The main change is to use the ProjectionList
4366            class instead of a normal wxListBox. Also, add an explicit
4367            "Unknown" projection to the projection choice control.
4368            (ProjPanel.__init__): Add an "unknown" ellipsoid
4369            (TMPanel.__init__, LCCPanel.__init__): Tweak the order of
4370            instantiation of the panel's controls to make the tab-order more
4371            natural
4372    
4373    2003-10-21  Bernhard Herzog  <[email protected]>
4374    
4375            * test/test_load.py (TestSingleLayer.file_contents)
4376            (TestSingleLayer.test): Add non-ascii characters to the titles of
4377            session, map and layer. This is effectively a port of the
4378            TestUnicodeStrings test in test_load_0_8.py which for some reason
4379            was only added there.
4380    
4381            * test/test_load_0_9.py (TestSingleLayer.file_contents)
4382            (TestSingleLayer.test): Same as in test_load.py: add non-ascii
4383            characters to the titles of session, map and layer,.
4384    
4385    2003-10-21  Bernhard Herzog  <[email protected]>
4386    
4387            Add EPSG projection handling to .thuban files
4388    
4389            * test/test_save.py (SaveSessionTest.dtd)
4390            (SaveSessionTest.testEmptySession)
4391            (SaveSessionTest.testLayerProjection)
4392            (SaveSessionTest.testRasterLayer)
4393            (SaveSessionTest.testClassifiedLayer)
4394            (SaveSessionTest.test_dbf_table)
4395            (SaveSessionTest.test_joined_table)
4396            (SaveSessionTest.test_save_postgis): Update to 1.0-dev namespace
4397            (SaveSessionTest.testSingleLayer): Update to 1.0-dev namespace and
4398            use a and epsg projection to test saving them
4399    
4400            * test/test_load.py (LoadSessionTest.dtd): Update to 1.0-dev
4401            namespace
4402            (TestLayerVisibility.file_contents, TestLabels.file_contents)
4403            (TestLayerProjection.file_contents)
4404            (TestRasterLayer.file_contents, TestJoinedTable.file_contents)
4405            (TestPostGISLayer.file_contents)
4406            (TestPostGISLayerPassword.file_contents)
4407            (TestLoadError.file_contents, TestLoadError.test): Update to use
4408            1.0-dev namespace
4409            (TestSingleLayer.file_contents, TestSingleLayer.test): Update to
4410            use 1.0-dev namespace and use an EPSG projection to test whether
4411            loading it works
4412    
4413            * test/test_load_0_9.py: New. Effectively a copy of test_load.py
4414            as of Thuban 0.9. These are now tests to determine whether Thuban
4415            can still read files generated by Thuban 0.9
4416    
4417            * Thuban/Model/save.py (SessionSaver.write)
4418            (SessionSaver.write_session): Use the 1.0 dtd and 1.0-dev
4419            namespace
4420            (SessionSaver.write_projection): Write the projection's epsg
4421            attribute
4422    
4423            * Thuban/Model/load.py (SessionLoader.__init__): Also accept the
4424            thuban-1.0-dev.dtd namespace
4425            (SessionLoader.check_attrs): Allow a callable object as conversion
4426            too
4427            (SessionLoader.start_projection, SessionLoader.end_projection)
4428            (SessionLoader.start_parameter): Handle the epsg attribute and
4429            rename a few instance variables to lower case
4430    
4431            * Resources/XML/thuban-1.0.dtd: New. Only difference to
4432            thuban-0.9.dtd is the epsg attribute for projections.
4433    
4434    2003-10-21  Bernhard Herzog  <[email protected]>
4435    
4436            * test/runtests.py (main): Let the user specify which tests to run
4437            on the command line
4438    
4439            * test/support.py (ThubanTestResult.getDescription): Override to
4440            give a better short description. The description can be used as a
4441            parameter to run_tests to run that particular test in isolation.
4442    
4443    2003-10-21  Frank Koormann   <[email protected]>
4444    
4445            Popup menu for legend. Scheduled for the 1.2 release this was too
4446            simple to implement: The popup menu is bound to the legend tree, while
4447            the events are hanlded by its anchestor, the legend panel. This
4448            allows reuse of all the event handlers already implemented for the
4449            legend toolbar buttons.
4450    
4451            * Thuban/UI/legend.py (LegendPanel.__init__): EVT_MENU macros
4452            to add handlers for the events issued by the popup menu.
4453            (LegendPanel._OnToggleVisibility): Handler for toggling layer
4454            visibility event
4455            (LegendPanel._OnProjection): Handler for layer projection event.
4456            (LegendTree.__init__): Added EVT_TREE_ITEM_RIGHT_CLICK
4457            (LegendTree._OnRightClick): Event handler for right click, select item
4458            and pop up menu.
4459            (LegendTree.ToggleVisibility): Toggle layer visibility
4460            (LegendTree.LayerProjection): Raise layer projection dialog for
4461            current layer.
4462    
4463    2003-10-21  Bernhard Herzog  <[email protected]>
4464    
4465            * Resources/Projections/defaults.proj: Use correct DOCTYPE
4466            declaration. The top-level element is projectionlist not projfile
4467    
4468    2003-10-20  Bernhard Herzog  <[email protected]>
4469    
4470            * Thuban/UI/projdialog.py (ProjFrame.write_proj_file): New. helper
4471            method to write a projfile and display a busy cursor and error
4472            dialogs.
4473            (ProjFrame._OnSave, ProjFrame._OnAddToList, ProjFrame._OnImport)
4474            (ProjFrame._OnExport, ProjFrame._OnRemove): Use write_proj_file
4475            (ProjFrame.__FillAvailList): Translate "<None>" too and display a
4476            busy cursor while loading the user and system prj files.
4477    
4478    2003-10-16  Bernhard Herzog  <[email protected]>
4479    
4480            * Thuban/Model/resource.py (projfile_cache): Introduce a cache for
4481            ProjFile objects
4482            (clear_proj_file_cache): New function to clear the cache. Mainly
4483            useful for use by the test suite
4484            (read_proj_file): Use the cache.
4485    
4486            * test/test_proj.py (TestProjFile): Clarify the doc-string
4487            (ProjFileReadTests): Update doc-string
4488            (ProjFileReadTests.test_get_system_proj_file): Check whether the
4489            system proj files is cached.
4490            (ProjFileLoadTestCase): New base class for the proj file tests
4491            derived from support.FileLoadTestCase to provide some common
4492            behavior.
4493            (TestLoadingProjFile)
4494            (TestLoadingProjFileWithEmptyProjectionlist.file_contents)
4495            (TestProjFileWithInvalidParameters.file_contents): Derive from
4496            ProjFileLoadTestCase
4497            (TestLoadingProjFile.test_caching): New. Test whether the cache
4498            works
4499    
4500    2003-10-16      Silke Reimer    <[email protected]>
4501    
4502            * debian/*: New directory with configuration files for building a thuban
4503              deb-package.
4504    
4505    2003-10-14  Bernhard Herzog  <[email protected]>
4506    
4507            * test/test_proj.py: Execute support.run_tests when run as
4508            __main__ so that missing unsubscribes are detected
4509            (TestProjFile.tearDown): Destroy the proj_file properly
4510    
4511    2003-10-14  Bernhard Herzog  <[email protected]>
4512    
4513            * Thuban/Model/messages.py (PROJECTION_ADDED)
4514            (PROJECTION_REPLACED, PROJECTION_REMOVED): New message types for
4515            the ProjFile objects
4516    
4517            * Thuban/Model/proj.py (ProjFile): Derive from Publisher so we can
4518            easily send messages when the projections change
4519            (ProjFile.Add, ProjFile.Remove, ProjFile.Replace): Issue messages
4520            when the change was successful
4521    
4522            * test/test_proj.py (TestProjFile.setUp): Subscribe to some of the
4523            proj file messages
4524            (TestProjFile.test_add_remove)
4525            (TestProjFile.test_remove_non_existing)
4526            (TestProjFile.test_replace)
4527            (TestProjFile.test_replace_non_existing): Test whether the right
4528            messages are sent
4529    
4530    2003-10-14  Bernhard Herzog  <[email protected]>
4531    
4532            * test/test_proj.py (TestProjFile.test): Refactor into several
4533            tests
4534            (TestProjFile.test_add_remove)
4535            (TestProjFile.test_remove_non_existing)
4536            (TestProjFile.test_replace)
4537            (TestProjFile.test_replace_non_existing): Some of the new
4538            individual test cases
4539            (TestProjFileSimple): New class for the rest of the test cases
4540            that came out of the refactoring
4541            (ProjFileTest): Derive from xmlsupport.ValidationTest so that the
4542            derived classes don't have to
4543    
4544    2003-10-13  Bernhard Herzog  <[email protected]>
4545    
4546            Add an optional EPSG code to the projection objects and extend the
4547            .proj file format accordingly.
4548    
4549            * Resources/XML/projfile.dtd (element projection): Add epsg
4550            attribute
4551    
4552            * Thuban/Model/proj.py (Projection.__init__): New parameter and
4553            instance variable epsg. Update doc-string
4554            (Projection.EPSGCode, Projection.Label): New methods to provide
4555            access to EPSG code and a label for use in dialogs
4556    
4557            * Thuban/Model/resource.py (ProjFileReader.start_projection)
4558            (ProjFileReader.end_projection, ProjFileSaver.write_projfile):
4559            Handle the epsg code attribute when reading or writing proj files
4560    
4561            * Thuban/UI/projdialog.py (ProjFrame._OnSave)
4562            (ProjFrame._OnAddToList, ProjFrame.__DoOnProjAvail)
4563            (ProjFrame.__FillAvailList): Use the projection's Label method to
4564            get the string for the list box
4565    
4566            * test/test_proj.py (TestProjection.test_label)
4567            (TestProjection.test_label_epsg)
4568            (TestProjection.test_epsgcode_for_non_epsg_projection)
4569            (TestProjection.test_epsgcode_for_real_epsg_projection): New tests
4570            for the label and EPSGCode methods
4571            (WriteProjFileTests.doTestWrite, WriteProjFileTests.test_write)
4572            (WriteProjFileTests.test_write_empty_file): Create the ProjFile
4573            objects in the test cases and put the expected contents into the
4574            test case methods too. Update doTestWrite accordingly
4575            (TestLoadingProjFile)
4576            (TestLoadingProjFileWithEmptyProjectionlist): New classes with the
4577            read tests from TestProjFile.
4578            (TestProjFile.doTestRead, TestProjFile.testRead): Removed. These
4579            tests are now in the new classes.
4580            (sample_projfile, sample_projfile_data)
4581            (sample_projfile2, sample_projfile_data2): Removed. Not used
4582            anymore.
4583            (TestProjFile.test_read_unreadable_file): No need to reset the
4584            permissions at the end anymore since we use a unique filename
4585    
4586    2003-10-13  Bernhard Herzog  <[email protected]>
4587    
4588            * test/test_proj.py: Some more refactoring of the test cases
4589            (ProjFileTest): New base class for the proj file tests.
4590            (TestProjFile): Derive from ProjFileTest
4591            (TestProjFile.test_read_unreadable_file)
4592            (TestProjFile.test_read_empty_file, TestProjFile.doTestRead): Use
4593            the new filename method to get a unique filename
4594            (TestProjFile.doTestWrite, TestProjFile.testWrite): Removed.
4595            (WriteProjFileTests): New class for proj file write tests.
4596            Contains the write test that were in TestProjFile originally.
4597    
4598    2003-10-13  Bernhard Herzog  <[email protected]>
4599    
4600            * test/test_proj.py (TestProjFile.testRead)
4601            (TestProjFile.test_read_non_existing_file)
4602            (TestProjFile.test_read_unreadable_file)
4603            (TestProjFile.test_read_empty_file): Split into several methods.
4604    
4605    2003-10-10  Bernhard Herzog  <[email protected]>
4606    
4607            * Thuban/UI/sizers.py: New file with custom sizers.
4608    
4609            * Thuban/UI/projdialog.py (ProjFrame.build_dialog): Instantiate
4610            all projection type specific panels and put them into a
4611            NotebookLikeSizer. This way the dialog doesn't change its size
4612            when a different projection is selected
4613            (ProjFrame.__init__): Rename projection_panels
4614            projection_panel_defs and reuse projection_panels for a list of
4615            the instantiated panels.
4616            (ProjFrame._show_proj_panel, ProjFrame.__DoOnProjAvail)
4617            (ProjFrame.__DoOnProjChoice): Changes due to the new handling of
4618            the panels
4619            (UnknownProjPanel._DoLayout): Place the newlines in the message
4620            differently to make the panel narrower.
4621            (TMPanel._DoLayout): Layout the parameters in one column.
4622    
4623    2003-10-10  Bernhard Herzog  <[email protected]>
4624    
4625            * Thuban/UI/projdialog.py (ProjFrame.build_dialog): New method
4626            that contains all the setup for the dialog's widgets, layout and
4627            event handling.
4628            (__): Call build_dialog to build the dialog.
4629            (ProjFrame.__set_properties, ProjFrame.__do_layout): Removed.
4630            Their functionality is now in build_dialog
4631            (ProjFrame.__VerifyButtons, ProjFrame.__VerifyButtons)
4632            (ProjFrame.__DoOnProjAvail, ProjFrame.__DoOnProjAvail)
4633            (ProjFrame.__DoOnProjChoice): Small updates due to slightly
4634            different widget names and hierarchy introduced with build_dialog.
4635    
4636    2003-10-10  Bernhard Herzog  <[email protected]>
4637    
4638            * README: Fix typo.
4639    
4640    2003-10-09  Bernhard Herzog  <[email protected]>
4641    
4642            * Thuban/Model/proj.py (ProjFile.Add): Do not check whether the
4643            projection is already in the list. This is *a lot* faster when
4644            loading files with hundreds of projections since it saves a linear
4645            search. OTOH this will allow adding the same projection to the
4646            user.proj file multiple times in the projection dialog but we'll
4647            deal with that later
4648    
4649    2003-10-09  Jan-Oliver Wagner <[email protected]>
4650    
4651            * devtools: New. Directory for developer tools that are not intended
4652            for the regular user.
4653    
4654            * devtools/create_epsg.py: New. Convert the epsg file of proj into
4655            a python .proj file.
4656    
4657    2003-10-09  Bernhard Herzog  <[email protected]>
4658    
4659            * test/test_proj.py
4660            (TestProjection.test_get_parameter_without_equals_sign): New. Test
4661            whether GetParameter handles parameters without "=" sign correctly
4662    
4663            * Thuban/Model/proj.py (Projection.GetParameter): Handle
4664            parameters that do not contain a "=". Update the doc-string
4665    
4666    2003-10-08  Bernhard Herzog  <[email protected]>
4667    
4668            * Thuban/UI/projdialog.py (ProjFrame.__set_properties): Remove the
4669            length limit on the projname text control
4670    
4671    2003-10-08  Bernhard Herzog  <[email protected]>
4672    
4673            * test/test_proj.py (TestProjection.test_get_projection_units_geo)
4674            (TestProjection.test_get_projection_units_normal): New. Tests for
4675            the Projection.GetProjectedUnits method
4676    
4677    2003-10-08  Jan-Oliver Wagner <[email protected]>
4678    
4679            * Thuban/Model/resource.py (get_user_proj_file): small bug-fix:
4680            Added missing 'val' parameter.
4681    
4682    2003-10-08  Bernhard Herzog  <[email protected]>
4683    
4684            * Thuban/UI/projdialog.py (ProjFrame.__DoOnProjAvail): When the
4685            projection type of the currently selected projection is not known,
4686            i.e. there's no panel for it, use the UnknownProjPanel
4687            (ProjFrame.__DoOnProjChoice, ProjFrame._show_proj_panel): Split
4688            the actual replacing of the proj panel into the new method
4689            _show_proj_panel.
4690            (UnknownProjPanel): Add doc-string.
4691            (UnknownProjPanel._DoLayout): Insert a newline into the text so
4692            that the panel is not so wide.
4693    
4694    2003-10-08  Bernhard Herzog  <[email protected]>
4695    
4696            * Thuban/Model/resource.py (read_proj_file): Return the warnings
4697            too. Update the doc-string
4698            (get_proj_files): Removed. It wasn't used anywhere
4699            (get_system_proj_files, get_system_proj_file): Rename to
4700            get_system_proj_file and return the ProjFile object and not a list
4701            of ProjFile objects. Update the callers.
4702            (get_user_proj_files, get_user_proj_file): Rename to
4703            get_user_proj_file return the ProjFile object and not a list of
4704            ProjFile objects. Update the callers.
4705            (ProjFileReader.__init__): New instance variable for the warnings.
4706            Rename the __pf ivar to projfile. Update the methods referring to
4707            __pf
4708            (ProjFileReader.end_projection): Catch any errors raised when
4709            instantiating the projection and record that as an error. The
4710            projection will not be in the final ProjFile object.
4711            (ProjFileReader.GetWarnings): New method to return the warnings.
4712    
4713            * Thuban/UI/projdialog.py (ProjFrame.show_warnings): New method to
4714            show the warnings from the projfile reader
4715            (ProjFrame._OnImport): Deal with any warnings returned by
4716            read_proj_file
4717            (ProjFrame.__FillAvailList): Deal with any warnings returned by
4718            get_system_proj_file or get_user_proj_file.
4719    
4720            * test/test_proj.py (TestProjFile.doTestRead): Check the warnings.
4721            (TestProjFileWithInvalidParameters.file_contents): New test cases
4722            to test whether read_proj_file handles invalid projection
4723            parameters correctly
4724            (TestProjFile.test_get_system_proj_file): New. Simple test for
4725            resource.get_system_proj_file
4726    
4727    2003-10-07  Bernhard Herzog  <[email protected]>
4728    
4729            * test/test_derivedshapestore.py
4730            (TestDerivedShapeStoreExceptions.tearDown): Clear the session
4731            properly so that the temporary directories get deleted correctly
4732    
4733    2003-10-06  Bernhard Herzog  <[email protected]>
4734    
4735            Handle the title changes in a proper MVC way.
4736    
4737            * Thuban/UI/mainwindow.py (MainWindow.__init__): Subscribe to the
4738            canvas' TITLE_CHANGED messages
4739            (MainWindow.update_title): New. Update the main window's title
4740            (MainWindow.__SetTitle): Removed. Use update_title instead.
4741            (MainWindow.SetMap): Use update_title instead of __SetTitle
4742            (MainWindow.RenameMap): Do change the window title explicitly
4743            here. That's handled in a proper MVC way now.
4744            (MainWindow.title_changed): New. Subscriber for the TITLE_CHANGED
4745            messages
4746    
4747            * Thuban/Lib/connector.py (Conduit): New class to help classes
4748            that forward messages
4749    
4750            * Thuban/UI/viewport.py: Forward the map's TITLE_CHANGED messages
4751            (ViewPort): Derive from Conduit instead of Publisher
4752            (ViewPort.Subscribe, ViewPort.Unsubscribe): Use the new base class
4753            when calling the inherited versions
4754            (ViewPort._subscribe_map, ViewPort._unsubscribe_map): New helper
4755            methods to subscribe and unsubscribe map messages
4756            (ViewPort.SetMap, ViewPort.Destroy): Use the new helper methods to
4757            handle the map subscriptions
4758            (ViewPort.Map, ViewPort.map_projection_changed)
4759            (ViewPort.layer_projection_changed): Add or update doc-strings
4760    
4761            * test/test_connector.py (TestPublisher.test_issue_simple): Fix
4762            typo
4763            (MyConduit): Helper class for the Conduit test.
4764            (TestConduit): Test cases for Conduit
4765    
4766            * test/test_connector.py: Use support.run_tests as main.
4767    
4768            * test/test_viewport.py (ViewPortTest.setUp): Also subscribe to
4769            the TITLE_CHANGED messages
4770            (ViewPortTest.test_forwarding_title_changed): New test to check
4771            whether the viewport forwards the map's TITLE_CHANGED messages
4772            (TestViewportWithPostGIS.tearDown): Call the map's Destroy method
4773            after the port's because the latter may require a still functional
4774            map.
4775    
4776    2003-10-06  Bernhard Herzog  <[email protected]>
4777    
4778            * Thuban/UI/application.py (ThubanApplication.maps_changed): Add
4779            doc-string
4780    
4781    2003-10-06  Bernhard Herzog  <[email protected]>
4782    
4783            * test/test_viewport.py (ViewPortTest.setUp)
4784            (SimpleViewPortTest.test_init_with_size): Move the test for the
4785            initial size as a constructor parameter from ViewPortTest.setUp
4786            method to a new separate test in SimpleViewPortTest.
4787    
4788    2003-10-06  Bernhard Herzog  <[email protected]>
4789    
4790            * test/test_viewport.py (MockView): New class derived from
4791            ViewPort with a mock implementation of GetTextExtent to be used in
4792            the test cases
4793            (ViewPortTest.setUp): Use MockView instead of ViewPort
4794    
4795            * Thuban/UI/viewport.py (ViewPort.GetTextExtent): Turn this method
4796            into what would be a "pure virtual function" in C++: always raise
4797            NotImplementedError. Mock implementations for test cases don't
4798            belong into the real code
4799    
4800    2003-10-02  Bernhard Herzog  <[email protected]>
4801    
4802            * test/test_layer.py (TestLayer.test_empty_layer): Explicitly
4803            close the dbf file we create so that it's contents have been
4804            written properly.
4805    
4806            * libraries/shapelib/shptree.c, libraries/shapelib/shpopen.c,
4807            libraries/shapelib/shapefil.h, libraries/shapelib/dbfopen.c:
4808            Update to shapelib 1.2.10
4809    
4810    2003-10-01  Jan-Oliver Wagner <[email protected]>
4811    
4812            * Thuban/UI/tree.py, Thuban/UI/main.py: Remove the #! line as
4813            it annoys lintian which warns about these files not being
4814            executable. The #! isn't necessary here since if you absolutely
4815            must execute them you can always say "python <filename>".
4816    
4817    2003-09-26  Bernhard Herzog  <[email protected]>
4818    
4819            * Thuban/Model/classgen.py (GenQuantiles0): Removed since it's
4820            only used in GREAT-ER but not used in Thuban itself. When GREAT-ER
4821            is ported to a newer the import will fail, so it should be noticed
4822            immediately that this function is gone.
4823            Fixes RT#1919
4824    
4825    2003-09-26  Bernhard Herzog  <[email protected]>
4826    
4827            Add a DTD for the projection files and make thuban write valid
4828            projection files
4829    
4830            * Resources/XML/projfile.dtd: New. DTD for thuban's projection
4831            files
4832    
4833            * Thuban/Model/resource.py (ProjFileSaver.write): Use
4834            'projectionlist' as the name in the document type declaration so
4835            that it matches the element type of the root element.
4836    
4837            * test/test_proj.py (sample_projfile, sample_projfile2): Use
4838            'projectionlist' as the name in the document type declaration just
4839            as it is done now in the files thuban would write
4840            (sample_projfile, sample_projfile_data): Fix spelling of
4841            "Mercator"
4842            (TestProjFile.doTestWrite): Validate the written and the expected
4843            XML data
4844            (TestProjFile): Derive from ValidationTest so that we can run xml
4845            validation tests
4846    
4847    2003-09-24  Bernhard Herzog  <[email protected]>
4848    
4849            * Thuban/UI/renderer.py (ExportRenderer.render_legend): Do not
4850            modify the list returned by map.Layers() in place since it is the
4851            actual list of layers used by the map.
4852    
4853    2003-09-23  Jan-Oliver Wagner <[email protected]>
4854    
4855            * Doc/manual/thuban-manual.xml: Added subsection to chapter
4856            Extensions to describe the extensions coming with the Thuban
4857            standard package (gns2shp and importAPR).
4858    
4859    2003-09-23  Bernhard Herzog  <[email protected]>
4860    
4861            * libraries/thuban/wxproj.cpp (project_point): if there's an
4862            inverse but no forward projection, convert to degrees after
4863            applying the inverse projection. Fixes RT#2096
4864    
4865            * test/test_wxproj.py: New. Test cases for wxproj.so. One test
4866            implicitly tests for the fix to RT#2096
4867    
4868            * test/support.py (FloatComparisonMixin.assertFloatSeqEqual):
4869            Check that the sequences have the same lengths
4870    
4871            * Resources/Projections/defaults.proj (Geographic projection): Use
4872            a much more precise value for the to_meter attribute.
4873    
4874    2003-09-22  Bernhard Herzog  <[email protected]>
4875    
4876            * test/support.py (initthuban): Make sure to unset the LANG env.
4877            var. so that tests that compare translated strings work. Solves RT
4878            #2094
4879    
4880    2003-09-22  Jan-Oliver Wagner <[email protected]>
4881    
4882            Small improvement of APR import.
4883    
4884            * Extensions/importAPR/test/test_apr.py (aprTest.test_LClass):
4885            Added tests for text-ranges.
4886    
4887            * Extensions/importAPR/apr.py (APR_LClass.GetThubanRange): Now
4888            returns a string object if the range is based on text.
4889    
4890            * Extensions/importAPR/importAPR.py (import_apr_dialog): Unified
4891            range retrieval.
4892    
4893    2003-09-22  Jan-Oliver Wagner <[email protected]>
4894    
4895            Initial version of the importAPR extension which is in
4896            experimental state.
4897    
4898            * /Extensions/importAPR/, /Extensions/importAPR/samples/,
4899            /Extensions/importAPR/test/: New directories.
4900    
4901            * /Extensions/importAPR/samples/README: New: Howto load the samples.
4902    
4903            * /Extensions/importAPR/samples/iceland.apr: New: A sample APR
4904            file which refers to the Thuban Iceland demo data.
4905    
4906            * /Extensions/importAPR/test/README: New: Howto execute the tests.
4907    
4908            * /Extensions/importAPR/test/test_apr.py: New: Tests for APR classes.
4909    
4910            * /Extensions/importAPR/apr.py: New: Classes for ArcView Objects
4911            as in '.apr'-files.
4912    
4913            * /Extensions/importAPR/odb.py: New: Classes for generic ArcView
4914            ODB Objects as in '.apr', '.avl' and other files.
4915    
4916            * /Extensions/importAPR/__init__.py: New: Init to make this
4917            directory a package.
4918    
4919            * /Extensions/importAPR/importAPR.py: New: Import a ArcView
4920            project file (.apr) and convert it to Thuban.
4921    
4922    2003-09-22  Jan-Oliver Wagner <[email protected]>
4923    
4924            * Extensions/gns2shp.gns2shp.py: The main module of gns2shp.
4925    
4926    2003-09-19  Jan-Oliver Wagner <[email protected]>
4927    
4928            * Doc/manual/thuban-manual.xml: Extended section 'Installation'
4929            with description on RPM installation and RPM binary package
4930            creation.
4931    
4932    2003-09-18  Bernhard Herzog  <[email protected]>
4933    
4934            * setup.py (data_files): Only add the mo files if the Locales
4935            directory actually exists, so that setup.py works with a fresh CVS
4936            checkout
4937    
4938    2003-09-12  Jan-Oliver Wagner <[email protected]>
4939    
4940            * Examples/simple_extensions/simple_tool.py: bugfix: Tool is now
4941            in viewport, not anymore in view
4942    
4943    2003-09-04  Jan-Oliver Wagner <[email protected]>
4944    
4945            Introducing first Extension (gns2shp).
4946    
4947            * Extensions, Extensions/gns2shp, Extensions/gns2shp/test: New.
4948    
4949            * Extensions/__init__.py: New. init to make this dir a package.
4950    
4951            * Extensions/gns2shp/__init__.py: New. init to make this dir a package.
4952    
4953            * Extensions/gns2shp/test/README: New. some info on this test directory.
4954    
4955            * Extensions/gns2shp/test/ls.txt: New. test data set (Liechtenstein).
4956    
4957            * Extensions/gns2shp/test/test_gns2shp.py: New. Test for correct creation
4958            of Shapefile from GNS text file format
4959    
4960    2003-09-03  Jan-Oliver Wagner <[email protected]>
4961    
4962            Fix/workaround for bug #2019:
4963            https://intevation.de/rt/webrt?serial_num=2019
4964    
4965            * Thuban/UI/identifyview.py (IdentifyView.ID_STOP): New.
4966            (IdentifyView.__init__): Added another button that allows to
4967            stop the identify mode.
4968            (IdentifyView.OnStop): New. Stops the identify mode.
4969    
4970    2003-09-03  Jan-Oliver Wagner <[email protected]>
4971    
4972            Introducing a new exception dialog that allows to exit the
4973            application immediately.
4974            This fixes bug #2060: https://intevation.de/rt/webrt?serial_num=2060
4975    
4976            * Thuban/UI/exceptiondialog.py: New. A special exception dialog.
4977    
4978            * Thuban/UI/application.py (ThubanApplication.ShowExceptionDialog):
4979            Made strings available to translations. Exchanged the simple
4980            ScrolledMessageDialog by the new ExceptionDialog.
4981    
4982    2003-09-01  Bernhard Herzog  <[email protected]>
4983    
4984            * NEWS: New. Summary of changes and release notes.
4985    
4986            * MANIFEST.in: Add NEWS
4987    
4988    2003-09-01  Bernhard Herzog  <[email protected]>
4989    
4990            * MANIFEST.in: Correct the include statement for the mo-files and
4991            include the documentation too.
4992    
4993            * setup.py (data_files): Add the .mo files
4994            (setup call): Up to version 0.9.0
4995    
4996    2003-09-01  Bernhard Herzog  <[email protected]>
4997    
4998            * Thuban/UI/dbdialog.py (ChooseDBTableDialog.__init__): Change the
4999            parameter list to just parent and session
5000            (ChooseDBTableDialog.__set_properties): Removed. Setting the
5001            selection of empty list boxes is not allowed (and produces C++
5002            assertion errors) and the rest of the setup is better done in
5003            __init__ anyway.
5004            (ChooseDBTableDialog.OnCancel, ChooseDBTableDialog.OnOK)
5005            (ChooseDBTableDialog.OnLBDClick, DBDialog.OnOK): Use the Python
5006            builtins True/False for booleans to avoid warnings from wxPython
5007    
5008            * Thuban/UI/mainwindow.py (MainWindow.AddDBLayer): Adapt to new
5009            ChooseDBTableDialog constructor parameters.
5010    
5011    2003-09-01  Bernhard Herzog  <[email protected]>
5012    
5013            * Thuban/Model/postgisdb.py
5014            (PostGISTable): Extend doc-string
5015            (PostGISTable._fetch_table_information): Set the column index
5016            correctly, pretending ignored columns don't exist.
5017    
5018            * test/test_postgis_db.py (TestPostGISIgnoredColumns): New tests
5019            for postgis tables with data types not yet supported by thuban.
5020    
5021    2003-08-29  Bernhard Herzog  <[email protected]>
5022    
5023            * HOWTO-Release: Tweak item about running the tests.
5024    
5025    2003-08-29  Jan-Oliver Wagner <[email protected]>
5026    
5027            * /Doc/manual/thuban-manual.xml: updated to version 1.0pre2.
5028    
5029    2003-08-29  Bernhard Herzog  <[email protected]>
5030    
5031            Add some missing parameters to projections. Proj complains about
5032            them on windows but for some reason not on Linux.
5033    
5034            * test/test_save.py (SaveSessionTest.testLayerProjection): Add
5035            missing required projection parameters
5036    
5037            * test/test_proj.py (TestProjFile.test): Add missing required
5038            projection parameters
5039    
5040            * test/test_load_0_8.py (TestLayerProjection.file_contents)
5041            (TestLayerProjection.test): Add missing required projection
5042            parameters and tests for them
5043    
5044            * test/test_load.py (TestLayerProjection.file_contents)
5045            (TestLayerProjection.test): Add missing required projection
5046            parameters and tests for them
5047    
5048            * test/test_layer.py (TestLayer.test_base_layer): Add missing
5049            required projection parameters
5050    
5051    2003-08-29  Bernhard Herzog  <[email protected]>
5052    
5053            * libraries/pyprojection/Projection.i: Use pj_get_errno_ref to
5054            access the pj_errno because directly accessing pj_errno doesn't
5055            work on windows if the proj library is in a DLL
5056    
5057            * libraries/pyprojection/Projection_wrap.c: Update from Projection.i
5058    
5059    2003-08-28  Bernhard Herzog  <[email protected]>
5060    
5061            * test/test_proj.py: Import things from Thuban after calling
5062            initthuban
5063    
5064            * test/test_load.py (LoadSessionTest.filenames): New class
5065            variable with the filename attributes to normalize
5066            (LoadSessionTest.check_format): Pass self.filenames to
5067            sax_eventlist to normalize the filename attributes
5068    
5069            * test/xmlsupport.py: Add cvs keywords
5070            (SaxEventLister.__init__): New parameter filenames which indicates
5071            attributes that contain filenames
5072            (SaxEventLister.startElementNS): Normalize the filename attributes
5073            with os.path.normpath
5074            (sax_eventlist): New parameter filenames to pass through to
5075            SaxEventLister
5076    
5077            * test/test_derivedshapestore.py: Make this file callable as a
5078            program to execute the tests
5079            (TestDerivedShapeStoreExceptions.test_table_with_wrong_size): Bind
5080            the session to self.session so that it gets destroyed properly
5081    
5082            * test/test_layer.py (TestLayer.tearDown): Call the session's
5083            Destroy method
5084    
5085            * test/test_map.py (TestMapBase.tearDown): Destroy self.session
5086            too if it exists
5087            (TestMapAddLayer.test_add_layer): Bind the session to self.session
5088            so that it gets destroyed properly
5089    
5090            * test/postgissupport.py (reason_for_not_running_tests): Add a
5091            test for the existence of popen2.Popen4.
5092    
5093            * test/test_save.py (SaveSessionTest.tearDown): New. Provide a
5094            reliable way to destroy the sessions created in the test cases
5095            (SaveSessionTest.test_dbf_table): Bind the session to self.session
5096            so that it gets destroyed properly
5097            (SaveSessionTest.testLayerProjection): Bind the session to
5098            self.session so that it gets destroyed properly
5099    
5100            * test/test_session.py (UnreferencedTablesTests.tearDown): Make
5101            sure that the session is destroyed properly
5102    
5103            * test/test_shapefilestore.py: Make this callable as a program to
5104            execute the tests
5105    
5106            * test/test_scalebar.py: Remove unnecessary import of _ from
5107            Thuban
5108    
5109            * test/support.py (print_garbage_information): Call initthuban
5110            here because it may be called indirectly from test cases that test
5111            test support modules which do not use anything from thuban itself
5112            (ThubanTestProgram.runTests): Remove unnecessary debug print
5113    
5114    2003-08-28  Bernhard Herzog  <[email protected]>
5115    
5116            * Thuban/version.py (longversion): Update to 0.9
5117    
5118            * Thuban/UI/mainwindow.py: Remove some unused imports
5119    
5120            * README: Add section about required additional software. Add date
5121            and revision CVS keywords
5122    
5123            * HOWTO-Release: Add item about the translations. Add date and
5124            revision CVs keywords and change formatting to match README a bit
5125            better
5126    
5127            * po/de.po: Update for 0.9
5128    
5129            * test/README: Tweak the wording a little because many tests are
5130            not really unittest.
5131    
5132    2003-08-27  Bernhard Herzog  <[email protected]>
5133    
5134            As preparation for the 0.9 release, switch thuban files to a
5135            non-dev namespace
5136    
5137            * Thuban/Model/save.py (SessionSaver.write_session): Write files
5138            with the http://thuban.intevation.org/dtds/thuban-0.9.dtd
5139            namespace
5140    
5141            * Thuban/Model/load.py (SessionLoader.__init__): Accept the
5142            http://thuban.intevation.org/dtds/thuban-0.9.dtd namespace too
5143    
5144            * test/test_save.py (SaveSessionTest.dtd)
5145            (SaveSessionTest.testEmptySession)
5146            (SaveSessionTest.testSingleLayer)
5147            (SaveSessionTest.testLayerProjection)
5148            (SaveSessionTest.testRasterLayer)
5149            (SaveSessionTest.testClassifiedLayer)
5150            (SaveSessionTest.test_dbf_table)
5151            (SaveSessionTest.test_joined_table)
5152            (SaveSessionTest.test_save_postgis): Update for new namespace
5153    
5154            * test/test_load.py (LoadSessionTest.dtd, TestSingleLayer)
5155            (TestLayerVisibility.file_contents, TestLabels.file_contents)
5156            (TestLayerProjection.file_contents)
5157            (TestRasterLayer.file_contents, TestJoinedTable.file_contents)
5158            (TestPostGISLayer.file_contents)
5159            (TestPostGISLayerPassword.file_contents)
5160            (TestLoadError.file_contents, TestLoadError.test): Update for new
5161            namespace
5162    
5163    2003-08-27  Bernhard Herzog  <[email protected]>
5164    
5165            Make the table interface distinguish between row ids (an integer
5166            that uniquely identifies a row) and row ordinals (a simple row
5167            count from 0 to NumRows() - 1)
5168    
5169            * Thuban/Model/postgisdb.py (PostGISTable.RowIdToOrdinal)
5170            (PostGISTable.RowOrdinalToId): New methods to conver between row
5171            ids and row ordinals
5172            (PostGISTable.ReadRowAsDict, PostGISTable.ReadValue): New keyword
5173            parameter row_is_ordinal to indicate whether the row parameter is
5174            the row id or the ordinal
5175    
5176            * Thuban/Model/transientdb.py (TransientTableBase.RowIdToOrdinal)
5177            (TransientTableBase.RowOrdinalToId)
5178            (AutoTransientTable.RowIdToOrdinal)
5179            (AutoTransientTable.RowOrdinalToId): Same new methods as in
5180            PostGISTable.
5181            (TransientTableBase.ReadRowAsDict, TransientTableBase.ReadValue)
5182            (AutoTransientTable.ReadRowAsDict, AutoTransientTable.ReadValue):
5183            Same new parameter as in PostGISTable.
5184    
5185            * Thuban/Model/table.py (DBFTable.RowIdToOrdinal)
5186            (DBFTable.RowOrdinalToId, MemoryTable.RowIdToOrdinal)
5187            (MemoryTable.RowOrdinalToId): Same new methods as in PostGISTable.
5188            (DBFTable.ReadValue, DBFTable.ReadRowAsDict)
5189            (MemoryTable.ReadValue, MemoryTable.ReadRowAsDict): Same new
5190            parameter as in PostGISTable.
5191    
5192            * Thuban/UI/tableview.py (DataTable.RowIdToOrdinal)
5193            (DataTable.RowOrdinalToId): New methods to convert between row ids
5194            and row ordinals.
5195            (TableGrid.SelectRowById): New method to select a row based on its
5196            ID as opposed to its ordinal
5197            (DataTable.GetValue, TableGrid.OnRangeSelect)
5198            (TableGrid.OnSelectCell, LayerTableGrid.select_shapes)
5199            (QueryTableFrame.OnQuery, QueryTableFrame.get_selected)
5200            (LayerTableFrame.__init__): Convert between row ids and row
5201            ordinals as appropriate
5202    
5203            * test/postgissupport.py (PostGISDatabase.__init__): Add
5204            doc-string.
5205            (PostGISDatabase.initdb): The optional third item in a tuple in
5206            tables is now a (key, value) list with additional arguments to
5207            pass to upload_shapefile
5208            (upload_shapefile): New parameter gid_offset to allow gids that
5209            are not the same as the shapeids in the shapefile
5210            (PostgreSQLServer.get_default_static_data_db): Use the new
5211            gid_offset to make the gids in landmarks 1000 higher than the
5212            shapeids in the shapefile
5213    
5214            * test/test_viewport.py
5215            (TestViewportWithPostGIS.test_find_shape_at_point): Adapt to the
5216            new shapeids in the landmarks table
5217    
5218            * test/test_transientdb.py
5219            (TestTransientTable.run_iceland_political_tests)
5220            (TestTransientTable.test_transient_joined_table): Add tests for
5221            the new table methods and new keywords arguments.
5222    
5223            * test/test_postgis_db.py
5224            (TestPostGISTable.test_read_row_as_dict_row_count_mode)
5225            (TestPostGISTable.test_read_value_row_count_mode)
5226            (TestPostGISTable.test_row_id_to_ordinal)
5227            (TestPostGISTable.test_row_oridnal_to_id): New test for the new
5228            table methods and the new arguments
5229            (TestPostGISShapestorePoint.test_shapes_in_region)
5230            (TestPostGISShapestorePoint.test_shape_raw_data)
5231            (TestPostGISShapestorePoint.test_shape_points)
5232            (TestPostGISShapestorePoint.test_shape_shapeid)
5233            (TestPostGISShapestorePoint.test_all_shapes)
5234            (TestPostGISTable.test_simple_query)
5235            (TestPostGISTable.test_simple_query)
5236            (TestPostGISTable.test_simple_query)
5237            (TestPostGISTable.test_read_value)
5238            (TestPostGISTable.test_read_row_as_dict): Adapt to the new
5239            shapeids in the landmarks table
5240    
5241            * test/test_memory_table.py
5242            (TestMemoryTable.test_read_row_as_dict_row_count_mode)
5243            (TestMemoryTable.test_read_value_row_count_mode)
5244            (TestMemoryTable.test_row_id_to_ordinal)
5245            (TestMemoryTable.test_row_oridnal_to_id): New test for the new
5246            table methods and the new arguments
5247    
5248            * test/test_dbf_table.py
5249            (TestDBFTable.test_read_row_as_dict_row_count_mode)
5250            (TestDBFTable.test_read_value_row_count_mode)
5251            (TestDBFTable.test_row_id_to_ordinal)
5252            (TestDBFTable.test_row_oridnal_to_id): New test for the new table
5253            methods and the new arguments
5254    
5255    2003-08-26  Bernhard Herzog  <[email protected]>
5256    
5257            * Thuban/Model/postgisdb.py (PostGISShapeStore.BoundingBox): Use a
5258            more postgis specific but much faster method to get the bounding
5259            box
5260    
5261    2003-08-26  Bernhard Herzog  <[email protected]>
5262    
5263            * Thuban/Model/postgisdb.py (PostGISTable.Title)
5264            (PostGISShapeStore.AllShapes): Add these missing methods.
5265            (PostGISShapeStore.ShapesInRegion): No need to raise
5266            StopIteration. We can simply return
5267    
5268            * test/test_postgis_db.py (TestPostGISTable.test_title)
5269            (TestPostGISShapestorePoint.test_all_shapes): New tests for the
5270            new methods
5271    
5272    2003-08-25  Bernhard Herzog  <[email protected]>
5273    
5274            * Thuban/Model/postgisdb.py (shapetype_map): Add MUTLIPOLYGON.
5275    
5276            * test/test_postgis_db.py (PolygonTests): New class containing
5277            those tests from TestPostGISShapestorePolygon that can also be
5278            used to test MUTLIPOLYGON tables
5279            (TestPostGISShapestorePolygon): Most tests are now in PolygonTests
5280            so derive from that
5281            (TestPostGISShapestoreMultiPolygon): New class with tests for
5282            MUTLIPOLYGON tables
5283    
5284            * test/postgissupport.py (PostGISDatabase.initdb): Allow the
5285            tables argument to have tuples with three items to override the
5286            WKT type used.
5287            (PostgreSQLServer.get_default_static_data_db): Use the above to
5288            create a polygon table with MUTLIPOLYGONs
5289            (point_to_wkt, coords_to_point, polygon_to_wkt, coords_to_polygon)
5290            (arc_to_wkt, coords_to_multilinestring): Rename from *_to_wkt to
5291            coords_to*
5292            (coords_to_multipolygon): New. Convert to MUTLIPOLYGON
5293            (wkt_converter): New. Map WKT types to converters
5294            (upload_shapefile): New parameter force_wkt_type to use a
5295            different WKT type than the default
5296    
5297    2003-08-25  Bernhard Herzog  <[email protected]>
5298    
5299            * Thuban/UI/application.py
5300            (ThubanApplication.run_db_param_dialog): New. Suitable as a
5301            db_connection_callback. Main difference is that the dialog run
5302            from this method doesn't have a parent so it can be used even when
5303            there is no main window
5304            (ThubanApplication.OpenSession): Use self.run_db_param_dialog if
5305            no db_connection_callback was given. This way the dialog pops up
5306            even when the .thuban file was given as a command line parameter.
5307    
5308    2003-08-25  Bernhard Herzog  <[email protected]>
5309    
5310            * Thuban/UI/view.py (MapCanvas.OnLeftUp): Release the the mouse
5311            before calling MouseLeftUp. MouseLeftUp may pop up modal dialogs
5312            which leads to an effectively frozen X session because the user
5313            can only interact with the dialog but the mouse is still grabbed
5314            by the canvas.
5315            Also, call the tool's Hide method before MouseLeftUp because
5316            MouseLeftUp may change the tool's coordinates.
5317    
5318    2003-08-25  Bernhard Herzog  <[email protected]>
5319    
5320            * Thuban/UI/application.py (ThubanApplication.OpenSession): Catch
5321            LoadCancelled exceptions and handle them by returning immediately.
5322    
5323    2003-08-25  Bernhard Herzog  <[email protected]>
5324    
5325            GUI part of loading sessions with postgis connections which may
5326            require user interaction to get passwords or updated parameters
5327    
5328            * Thuban/UI/dbdialog.py (DBDialog): Reimplement to make it look a
5329            bit nucer and be more generic.
5330            (DBFrame.OnAdd): Adapt to new DBDialog interface
5331    
5332            * Thuban/UI/application.py (ThubanApplication.OpenSession): New
5333            optional parameter db_connection_callback which is passed to
5334            load_session.
5335    
5336            * Thuban/UI/mainwindow.py (MainWindow.run_db_param_dialog): New.
5337            Suitable as a db_connection_callback
5338            (MainWindow.OpenSession): Use self.run_db_param_dialog as the
5339            db_connection_callback of the application's OpenSession method
5340    
5341    
5342    2003-08-25  Bernhard Herzog  <[email protected]>
5343    
5344            Basic loading of sessions containing postgis connections:
5345    
5346            * Thuban/Model/load.py (LoadError): Add doc-string
5347            (LoadCancelled): New exception class to indicate a cancelled load
5348            (SessionLoader.__init__): Add the db_connection_callback parameter
5349            which will be used by the loader to get updated parameters and a
5350            password for a database connection
5351            (SessionLoader.__init__): Add the new XML elements to the
5352            dispatchers dictionary
5353            (SessionLoader.check_attrs): Two new conversions, ascii to convert
5354            to a byte-string object and idref as a generic id reference
5355            (SessionLoader.start_dbconnection)
5356            (SessionLoader.start_dbshapesource): New. Handlers for the new XML
5357            elements
5358            (load_session): Add the db_connection_callback to pass through the
5359            SessionLoader
5360    
5361            * test/test_load.py (TestPostGISLayer, TestPostGISLayerPassword):
5362            New classes to test loading of sessions with postgis database
5363            connections.
5364    
5365    2003-08-25  Bernhard Herzog  <[email protected]>
5366    
5367            * Thuban/UI/mainwindow.py (__ThubanVersion__): Remove this and
5368            replace it and the comment with __BuildDate__ by the Source: and
5369            Id: cvs keywords as used in the other files.
5370    
5371    2003-08-25  Bernhard Herzog  <[email protected]>
5372    
5373            * Thuban/Model/load.py (SessionLoader.check_attrs): Raise a
5374            LoadError when a required attribute is missing. The code used to
5375            be commented out for some reason, but probably should have been
5376            active.
5377    
5378            * test/test_load.py (TestLoadError.test): Test the message in the
5379            LoadError too to make sure it really is about the missing
5380            attribute
5381    
5382    2003-08-22  Bernhard Herzog  <[email protected]>
5383    
5384            * test/test_save.py (SaveSessionTest.test_dbf_table)
5385            (SaveSessionTest.test_joined_table): Add XML validation tests.
5386    
5387    2003-08-22  Bernhard Herzog  <[email protected]>
5388    
5389            Implement saving a session with a postgis connection
5390    
5391            * Resources/XML/thuban-0.9.dtd (dbconnection, dbshapesource) New
5392            elements for database connections and shapestores using db
5393            connections
5394            (session): Add the dbconnections to the content model
5395    
5396            * Thuban/Model/save.py (SessionSaver.write_db_connections): New.
5397            Write the db connections
5398            (SessionSaver.write_session): Call write_db_connections to write
5399            the connection before the data sources
5400            (SessionSaver.write_data_containers): Handle postgis shapestores
5401    
5402            * test/test_save.py (SaveSessionTest.thubanids)
5403            (SaveSessionTest.thubanidrefs): Update for new DTD
5404            (SaveSessionTest.test_save_postgis): New. Test saving a session
5405            with postgis connections
5406    
5407            * Thuban/Model/postgisdb.py (PostGISTable.DBConnection)
5408            (PostGISTable.TableName): New accessor methods for the connection
5409            and table name
5410    
5411            * test/test_postgis_db.py (TestPostGISTable.test_dbconn)
5412            (TestPostGISTable.test_dbname): New methods to test the new
5413            PostGISConnection methods
5414    
5415    2003-08-22  Bernhard Herzog  <[email protected]>
5416    
5417            * Thuban/Model/postgisdb.py (ConnectionError): New exception class
5418            for exceptions occurring when establishing a Database connection
5419            (PostGISConnection.connect): Catch psycopg.OperationalError during
5420            connects and raise ConnectionError.
5421    
5422            * test/test_postgis_db.py (TestPostgisDBExceptions): New class for
5423            tests for database exceptions
5424    
5425    2003-08-22  Bernhard Herzog  <[email protected]>
5426    
5427            Prepare the test suite for tests with required authentication
5428    
5429            * test/postgissupport.py (PostgreSQLServer.__init__): Add instance
5430            variables with two predefined users/passwords, one for the admin
5431            and one for a non-privileged user.
5432            (PostgreSQLServer.createdb): Pass the admin name to initdb and add
5433            the non-privileged user to the database and set the admin password
5434            (PostgreSQLServer.wait_for_postmaster): Use the admin user name.
5435            Better error reporting
5436            (PostgreSQLServer.connection_params)
5437            (PostgreSQLServer.connection_string): New methods to return
5438            information about how to connect to the server
5439            (PostgreSQLServer.execute_sql): New. Convenience method to execute
5440            SQL statements
5441            (PostgreSQLServer.require_authentication): Toggle whether the
5442            server requires authentication
5443            (PostgreSQLServer.create_user, PostgreSQLServer.alter_user): New.
5444            Add or alter users
5445            (PostGISDatabase.initdb): Pass the admin name one the
5446            subprocesses' command lines. Grant select rights on
5447            geometry_columns to everybody.
5448            (upload_shapefile): Use the admin name and password when
5449            connecting. Grant select rights on the new table to everybody.
5450    
5451            * test/test_viewport.py (TestViewportWithPostGIS.setUp): Use the
5452            server's new methods to get the connection parameters.
5453    
5454            * test/test_postgis_session.py (TestSessionWithPostGIS.setUp)
5455            (TestSessionWithPostGIS.test_remove_dbconn_exception): Use the
5456            server's new methods to get the connection parameters.
5457    
5458            * test/test_postgis_db.py
5459            (TestPostGISConnection.test_gis_tables_empty)
5460            (TestPostGISConnection.test_gis_tables_non_empty)
5461            (PostGISStaticTests.setUp): Use the server's new methods to get
5462            the connection parameters.
5463    
5464    2003-08-22  Bernhard Herzog  <[email protected]>
5465    
5466            * Thuban/UI/about.py (About.__init__): Add the psycopg version.
5467    
5468            * Thuban/version.py: Add psycopg version
5469    
5470            * Thuban/Model/postgisdb.py (psycopg_version): New. Return the
5471            version of the psycopg module
5472    
5473    2003-08-22  Bernhard Herzog  <[email protected]>
5474    
5475            * Thuban/UI/dbdialog.py (DBPwdDlg): Removed because it's not used.
5476            (DBFrame.OnEdit): Removed because it's not used and wouldn't work
5477            at the moment. The functionality should probably be implemented
5478            some time, though.
5479            (DBFrame.OnRemove): Display a message if the connection can't be
5480            removed because it's still in use.
5481    
5482    2003-08-22  Jan-Oliver Wagner <[email protected]>
5483    
5484            * Thuban/UI/about.py (About.__init__): split up the huge about
5485            text into elements/lists for easier translation. This fixes bug
5486            https://intevation.de/rt/webrt?serial_num=2058
5487            Also, made some forgotten string available for the i18n.
5488    
5489    2003-08-21  Bernhard Herzog  <[email protected]>
5490    
5491            Make postgis support really optional including insensitive menu
5492            items.
5493    
5494            * Thuban/Model/postgisdb.py (has_postgis_support): New. Return
5495            whether the postgis is supported.
5496    
5497            * Thuban/UI/dbdialog.py: Put the psycopg import into try..except
5498            to make postgis support optional
5499    
5500            * Thuban/UI/mainwindow.py (_has_postgis_support): New. Context
5501            version of Thuban.Model.postgisdb.has_postgis_support
5502            (database_management command): Make it only sensitive if postgis
5503            is supported.
5504    
5505    2003-08-21  Jan-Oliver Wagner <[email protected]>
5506    
5507            * Doc/manual/thuban-manual.xml: Added CVS revision for rev-history.
5508            (section Adding and Removing Layers): Added text and described
5509            multi-selection.
5510            (chapter Extensions): New.
5511    
5512    2003-08-21  Jan-Oliver Wagner <[email protected]>
5513    
5514            * Thuban/UI/mainwindow.py (MainWindow.AddLayer): Changed dialog
5515            settings to allow multiple files to load into the map.
5516            Also reduced selection to *.shp as a default.
5517    
5518    2003-08-20  Bernhard Herzog  <[email protected]>
5519    
5520            Add dialogs and commands to open database connections and add
5521            database layers.
5522    
5523            * Thuban/UI/mainwindow.py (MainWindow.DatabaseManagement): New
5524            method to open the database connection management dialog
5525            (MainWindow.AddDBLayer): New method to add a layer from a database
5526            (_has_dbconnections): New helper function to use for sensitivity
5527            (database_management command, layer_add_db command): New commands
5528            that call the above new methods.
5529            (main_menu): Add the new commands to the menu.
5530    
5531            * Thuban/Model/postgisdb.py (PostGISConnection.__init__)
5532            (PostGISConnection.connect): Establish the actual connection in a
5533            separate method and call it in __init__. This makes it easier to
5534            override the behavior in test cases
5535            (PostGISConnection.BriefDescription): New method to return a brief
5536            description for use in dialogs.
5537    
5538            * test/test_postgis_db.py (NonConnection): DB connection that
5539            doesn't actually connect
5540            (TestBriefDescription): New class with tests for the new
5541            BriefDescription method
5542    
5543    2003-08-19  Jan-Oliver Wagner <[email protected]>
5544    
5545            Moved anything from extensions to libraries.
5546    
5547            * libraries: New.
5548    
5549            * libraries/ pyprojection, pyshapelib, shapelib, thuban: New.
5550    
5551            * libraries/pyprojection/ LICENSE, MANIFEST.in, Projection.i,
5552            Projection.py, Projection_wrap.c, setup.py, swighelp.txt: These files have
5553            been moved here from thuban/extensions/pyprojection/
5554            See there in the Attic for the older history.
5555    
5556            * libraries/pyshapelib/ COPYING, ChangeLog, NEWS, README, dbflib.i,
5557            dbflib.py, dbflib_wrap.c, pyshapelib_api.h, pytest.py, setup.py,
5558            shapelib.i, shapelib.py, shapelib_wrap.c, shptreemodule.c: These files
5559            have been moved here from thuban/extensions/pyshapelib/
5560            See there in the Attic for the older history.
5561    
5562            * libraries/shapelib/ dbfopen.c, shapefil.h, shpopen.c, shptree.c: These
5563            files have been moved here from thuban/extensions/shapelib/
5564            See there in the Attic for the older history.
5565    
5566            * libraries/thuban/ bmpdataset.cpp, cpl_mfile.cpp, cpl_mfile.h,
5567            gdalwarp.cpp, wxproj.cpp: These files have been moved here from
5568            thuban/extensions/thuban/
5569            See there in the Attic for the older history.
5570    
5571            * MANIFEST.in, setup.cfg, setup.py: renamed extensions to libraries.
5572    
5573            * extensions/thuban/ bmpdataset.cpp, cpl_mfile.cpp, cpl_mfile.h,
5574            gdalwarp.cpp, wxproj.cpp: Moved to libraries/thuban.
5575    
5576            * extensions/shapelib/ dbfopen.c, shapefil.h, shpopen.c, shptree.c:
5577            Moved to libraries/shapelib.
5578    
5579            * extensions/pyshapelib/ COPYING, NEWS, dbflib.py, pytest.py,
5580            shapelib.py, README, dbflib_wrap.c, setup.py, shapelib_wrap.c,
5581            ChangeLog, dbflib.i, pyshapelib_api.h, shapelib.i, shptreemodule.c:
5582            Moved to libraries/pyshapelib.
5583    
5584            * extensions/pyprojection/ MANIFEST.in, Projection.py, setup.py,
5585            LICENSE, Projection.i, Projection_wrap.c, swighelp.txt:
5586            Moved to libraries/pyprojection.
5587    
5588            * extensions/ pyprojection, pyshapelib, shapelib, thuban: Removed.
5589    
5590            * extensions: Removed.
5591    
5592    2003-08-19  Bernhard Herzog  <[email protected]>
5593    
5594            * test/test_viewport.py (ViewPortTest): We don't use the
5595            facilities of FileTestMixin so don't derive from it.
5596            (TestViewportWithPostGIS): New class with tests for using a
5597            viewport on a map with postgis layers.
5598    
5599    2003-08-19  Bernhard Herzog  <[email protected]>
5600    
5601            Add the db connection management to the session.
5602    
5603            * Thuban/Model/session.py (Session.__init__): New instance
5604            variable db_connections
5605            (Session.AddDBConnection, Session.DBConnections)
5606            (Session.HasDBConnections, Session.CanRemoveDBConnection)
5607            (Session.RemoveDBConnection): New methods to manage and query the
5608            db connections managed by the session
5609            (Session.OpenDBShapeStore): New method to open a shapestore from a
5610            db connection
5611    
5612            * Thuban/Model/messages.py (DBCONN_REMOVED, DBCONN_ADDED): New
5613            messages for the db connection handling in the session
5614    
5615            * test/test_postgis_session.py: New. test cases for the session's
5616            db connection handling with postgis connections
5617    
5618    2003-08-19  Bernhard Herzog  <[email protected]>
5619    
5620            Add very basic postgis database support and the corresponding test
5621            cases. The test cases require a PostgreSQL + postgis installation
5622            but no existing database. The database will be created
5623            automatically by the test cases
5624    
5625            * test/README: Add note about skipped tests and the requirements
5626            of the postgis tests.
5627    
5628            * Thuban/Model/postgisdb.py: New. Basic postgis database support.
5629    
5630            * test/test_postgis_db.py: New. Test cases for the postgis
5631            support.
5632    
5633            * Thuban/Model/wellknowntext.py: New. Parser for well-known-text
5634            format
5635    
5636            * test/test_wellknowntext.py: New. Test cases for the
5637            wellknowntext parser
5638    
5639            * test/postgissupport.py: New. Support module for tests involving
5640            a postgis database.
5641    
5642            * test/support.py (execute_as_testsuite): Shut down the postmaster
5643            if it's still running after the tests
5644    
5645            * Thuban/Model/data.py (RAW_WKT): New constant for raw data in
5646            well known text format
5647    
5648    2003-08-19  Jan-Oliver Wagner <[email protected]>
5649    
5650            * Examples/simple_extensions/hello_world.py: New. Raises a Hello World
5651            message dialog.
5652    
5653    2003-08-18  Bernhard Herzog  <[email protected]>
5654    
5655            * test/support.py (ThubanTestResult.printErrors): Indent the
5656            reason for the skips in the output to make it a bit more readable.
5657            (execute_as_testsuite): New helper function to run a test suite
5658            and print some more information.
5659            (run_tests): Use execute_as_testsuite to run the tests
5660    
5661            * test/runtests.py (main): Use execute_as_testsuite to run the
5662            tests
5663    
5664    2003-08-18  Bernhard Herzog  <[email protected]>
5665    
5666            Fix some bugs in Thuban and the test suite that were uncovered by
5667            changes introduced in Python 2.3:
5668    
5669            * Thuban/Model/table.py (DBFTable.__init__): Make sure the
5670            filename is an absolute name
5671    
5672            * Thuban/Model/layer.py (RasterLayer.__init__): Make sure the
5673            filename is an absolute name
5674    
5675            * test/test_save.py (SaveSessionTest.testRasterLayer): Use a
5676            unique filename to save to and use the correct relative filename
5677            in the expected output.
5678            (SaveSessionTest.test_dbf_table): Use the correct relative
5679            filename in the expected output.
5680    
5681            * test/test_layer.py (TestLayer.test_raster_layer): Update the
5682            test to check whether the filename is absolute.
5683    
5684    2003-08-18  Jan-Oliver Wagner <[email protected]>
5685    
5686            * Thuban/UI/about.py (About.__init__): Added Silke Reimer.
5687    
5688    2003-08-15  Bernhard Herzog  <[email protected]>
5689    
5690            Change the way shapes are returned by a shape store. The
5691            ShapesInRegion method returns an iterator over actual shape
5692            objects instead of a list of shape ids.
5693    
5694            * Thuban/Model/data.py (ShapefileShape.ShapeID): New. Return shape
5695            id.
5696            (ShapefileStore.ShapesInRegion): Return an iterator over the
5697            shapes which yields shape objects instead of returning a list of
5698            shape ids
5699            (ShapefileStore.AllShapes): New. Return an iterator over all
5700            shapes in the shape store
5701            (DerivedShapeStore.AllShapes): New. Like in ShapefileStore
5702    
5703            * Thuban/Model/layer.py (Layer.ShapesInRegion): Update
5704            doc-string.
5705    
5706            * Thuban/UI/baserenderer.py
5707            (BaseRenderer.layer_ids, BaseRenderer.layer_shapes): Rename to
5708            layer_shapes and make it return an iterator containg shapes
5709            instead of a list of ids.
5710            (BaseRenderer.draw_shape_layer): Update doc-string; Adapt to
5711            layer_shapes() change
5712    
5713            * Thuban/UI/renderer.py (ScreenRenderer.layer_ids)
5714            (ScreenRenderer.layer_shapes): Rename as in BaseRenderer
5715    
5716            * Thuban/UI/viewport.py (ViewPort._find_shape_in_layer): Adapt to
5717            changes in the ShapesInRegion return value.
5718            (ViewPort._get_hit_tester): Remove commented out code
5719    
5720            * test/mockgeo.py (SimpleShapeStore.ShapesInRegion): Adapt to the
5721            new return value.
5722            (SimpleShapeStore.AllShapes): New. Implement this method too.
5723    
5724            * test/test_layer.py (TestLayer.test_arc_layer)
5725            (TestLayer.test_polygon_layer, TestLayer.test_point_layer)
5726            (TestLayer.test_point_layer_with_projection)
5727            (TestLayer.test_derived_store): Adapt to changes in the
5728            ShapesInRegion return value.
5729    
5730            * test/test_shapefilestore.py
5731            (TestShapefileStoreArc.test_shapes_in_region)
5732            (TestShapefileStorePolygon.test_shapes_in_region)
5733            (TestShapefileStorePoint.test_shapes_in_region): Adapt to changes
5734            in the ShapesInRegion return value.
5735            (TestShapefileStorePoint.test_all_shapes)
5736            (TestShapefileStoreArc.test_shape_shapeid): New tests for the new
5737            methods
5738    
5739            * test/test_derivedshapestore.py
5740            (TestDerivedShapeStore.test_shapes_in_region): Adapt to changes in
5741            the ShapesInRegion return value.
5742            (TestDerivedShapeStore.test_all_shapes)
5743            (TestDerivedShapeStore.test_shape_shapeid): New tests for the new
5744            methods
5745    
5746    2003-08-15  Bernhard Herzog  <[email protected]>
5747    
5748            Make the renderers deal correctly with raw vs. python level
5749            representation of shape geometries
5750    
5751            * Thuban/UI/baserenderer.py (BaseRenderer.low_level_renderer):
5752            Return a flag useraw in addition to the callable and the parameter
5753            to indicate whether the callable can deal with the raw shape data
5754            or uses the higher level python lists of coordinates. The callable
5755            now should accept either the raw data or the return value of the
5756            shape's Points() method.
5757            (BaseRenderer.draw_shape_layer): Adapt to the low_level_renderer
5758            change
5759            (BaseRenderer.projected_points): Instead of the shape id use the
5760            points list as parameter.
5761            (BaseRenderer.draw_polygon_shape, BaseRenderer.draw_arc_shape)
5762            (BaseRenderer.draw_point_shape): Adapt to projected_points()
5763            change and accept the points list as parameter instead of the
5764            shape id.
5765    
5766            * Thuban/UI/renderer.py (MapRenderer.low_level_renderer): Return
5767            the useraw flag as required by the BaseRenderer
5768            (ScreenRenderer.draw_shape_layer): Adapt to low-level renderer
5769            changes.
5770    
5771            * test/test_baserenderer.py
5772            (TestBaseRenderer.test_point_with_classification): New test for
5773            rendering a map with classifications.
5774    
5775    2003-08-15  Bernhard Herzog  <[email protected]>
5776    
5777            * Thuban/UI/viewport.py (ViewPort.find_shape_at)
5778            (ViewPort._find_shape_in_layer, ViewPort._find_shape_in_layer)
5779            (ViewPort._get_hit_tester, ViewPort.projected_points)
5780            (ViewPort._hit_point, ViewPort._hit_arc, ViewPort._hit_polygon)
5781            (ViewPort._find_label_at): Split the find_shape_at method into
5782            several new methods and use the functions in the hit-test module.
5783    
5784            * Thuban/UI/hittest.py: New module with Python-level hit-testing
5785            functions
5786    
5787            * test/test_hittest.py: New. Test for the new hittest module
5788    
5789    2003-08-15  Bernhard Herzog  <[email protected]>
5790    
5791            * Thuban/Model/layer.py (Layer.ShapesInRegion): Apply the layer
5792            projection to all corners of the bounding box to get a better
5793            approximation of the projected bounding box
5794    
5795            * test/test_layer.py (TestLayer.test_point_layer_with_projection):
5796            New. Test coordinate handling of a layer with a projection.
5797            Catches the bug fixed in Layer.ShapesInRegion
5798    
5799    2003-08-15  Bernhard Herzog  <[email protected]>
5800    
5801            Move some of the mock objects in test_baserenderer into their own
5802            module so they can easily be used from other tests
5803    
5804            * test/mockgeo.py: New test helper module with some mock objects
5805            for geometry related things like shapes, shapestores and
5806            projections.
5807    
5808            * test/test_mockgeo.py: New. Tests for the new helper module
5809    
5810            * test/test_baserenderer.py: Some of the mock-objects are in
5811            mockgeo now.
5812    
5813    2003-08-12  Jan-Oliver Wagner <[email protected]>
5814    
5815            * Thuban/UI/about.py (About.__init__): Added Bj�rn Broscheit.
5816    
5817    2003-08-12  Bernhard Herzog  <[email protected]>
5818    
5819            * po/de.po: New. German translations by Bjoern Broscheit
5820    
5821    2003-08-12  Bernhard Herzog  <[email protected]>
5822    
5823            * Thuban/UI/projdialog.py (UnknownProjPanel._DoLayout): Translated
5824            strings have to be one string literal.
5825    
5826    2003-08-11  Bernhard Herzog  <[email protected]>
5827    
5828            * test/support.py (FloatComparisonMixin.assertPointListEquals):
5829            New. This method was used in various derived classes, but it's
5830            better to have it here.
5831    
5832            * test/test_shapefilestore.py
5833            (ShapefileStoreTests.assertPointListEquals): Removed. It's now in
5834            FloatComparisonMixin
5835    
5836            * test/test_layer.py (TestLayer.assertPointListEquals): Removed.
5837            It's now in FloatComparisonMixin
5838    
5839            * test/test_derivedshapestore.py
5840            (TestDerivedShapeStore.assertPointListEquals): Removed. It's now
5841            in FloatComparisonMixin
5842    
5843    2003-08-11  Bernhard Herzog  <[email protected]>
5844    
5845            * Thuban/UI/join.py (JoinDialog.OnJoin): Add missing space to
5846            error message
5847    
5848    2003-08-08  Jan-Oliver Wagner <[email protected]>
5849    
5850            * Doc/manual/thuban-manual.xml: Now use authorgroup. Added revhistory
5851            with version number.
5852            Changed title to reflect version number of Thuban.
5853    
5854    2003-08-08  Jan-Oliver Wagner <[email protected]>
5855    
5856            * Thuban/UI/about.py (About.__init__): Reworked the hall of fame. Now
5857            the list corresponds to the "About" web page.
5858    
5859    2003-08-08  Bernhard Herzog  <[email protected]>
5860    
5861            * Thuban/UI/projdialog.py (UTMProposeZoneDialog.dialogLayout):
5862            Make sure translated strings are recognized as one string literal.
5863    
5864            * Thuban/UI/proj4dialog.py (UTMProposeZoneDialog.dialogLayout):
5865            Make sure translated strings are recognized as one string literal.
5866    
5867            * Thuban/UI/classgen.py (ClassGenDialog.OnOK): Make sure
5868            translated strings are recognized as one string literal.
5869    
5870            * Thuban/UI/application.py (ThubanApplication.OpenSession): Make
5871            sure translated strings are recognized as one string literal.
5872    
5873    2003-08-07  Bernhard Herzog  <[email protected]>
5874    
5875            * Thuban/Model/data.py (DerivedShapeStore.RawShapeFormat): New.
5876            Simply delegates to the original shapestore.
5877    
5878            * test/test_derivedshapestore.py
5879            (TestDerivedShapeStore.test_raw_format): New. Test case for
5880            DerivedShapeStore.RawShapeFormat
5881    
5882    2003-08-07  Bernhard Herzog  <[email protected]>
5883    
5884            Add raw data interface to shape objects.
5885    
5886            * Thuban/Model/data.py (ShapefileShape, Shape): Rname the shape
5887            class to ShapefileShape which now holds shapefile specific
5888            information.
5889            (ShapefileShape.compute_bbox): Simplified to not cache any
5890            information. The way this method is used that shouldn't matter
5891            performance wise.
5892            (ShapefileShape.RawData): New. Return the shapeid which is the raw
5893            data format for shapes from shapefiles.
5894            (ShapefileStore.RawShapeFormat): New. Return the raw datatype used
5895            in the shape objects returned by a shapestore. For a
5896            ShapefileStore this is always RAW_SHAPEFILE.
5897            (RAW_PYTHON, RAW_SHAPEFILE): Constants for the RawShapeFormat
5898            method.
5899    
5900            * test/test_shapefilestore.py
5901            (TestShapefileStore.test_raw_format): New test to test the raw
5902            format feature of shapes.
5903    
5904            * Thuban/Model/layer.py: Remove the unused import of Shape from
5905            data. It was only there for interface compatibility but it's not
5906            used inside of Thuban and the generic Shape class has gone away.
5907    
5908            * Thuban/UI/renderer.py (MapRenderer.low_level_renderer): Check
5909            the raw data format and only use an optimized version of its a
5910            shapefile.
5911    
5912    2003-08-07  Bernhard Herzog  <[email protected]>
5913    
5914            * test/test_baserenderer.py (SimpleShape): Shape class for the
5915            tests.
5916            (SimpleShapeStore.Shape): Use SimpleShape instead of
5917            Thuban.Model.data.Shape to make the tests independed of the coming
5918            changes.
5919    
5920    2003-08-07  Bernhard Herzog  <[email protected]>
5921    
5922            * test/support.py (SkipTest, ThubanTestResult, ThubanTestRunner)
5923            (ThubanTestProgram): New classes that extend the respective
5924            classes from unittest. These new version support skipping tests
5925            under certain expected conditions. In the Thuban test suite we
5926            uses this for tests that require the optional gdal support.
5927            (run_tests): Use ThubanTestProgram instead of the unittest.main()
5928    
5929            * test/runtests.py (main): Use the new ThubanTestRunner instead of
5930            the normal one from unittest
5931    
5932            * test/test_layer.py (TestLayer.test_raster_layer): If this test
5933            is not run because gdal support isn't available report this to the
5934            runner.
5935    
5936            * test/test_baserenderer.py
5937            (TestBaseRenderer.test_raster_no_projection): Do not run this test
5938            if gdal support isn't available and report this to the runner.
5939    
5940    2003-08-06  Bernhard Herzog  <[email protected]>
5941    
5942            Rearrange the renderers a bit, partly in preparation for changes
5943            required for the postgis merge, partly to make it more testable.
5944            Also make the representation of coordinates in Shapes more
5945            consistent.
5946    
5947            * Thuban/UI/renderer.py (MapRenderer): Most of the code/methods in
5948            this class is now in BaseRenderer. This class is now practically
5949            only a specialization of BaseRenderer for rendering to an actual
5950            wx DC.
5951            (ScreenRenderer.draw_shape_layer): Use self.low_level_renderer()
5952            to get the shapetype specific rendering functions.
5953    
5954            * Thuban/UI/baserenderer.py: New file with the basic rendering
5955            logic. The code in this file is completely independend of wx.
5956            (BaseRenderer): Class with the basic rendering logic
5957    
5958            * test/test_baserenderer.py: New. Test cases for BaseRenderer
5959    
5960            * Thuban/UI/view.py (MapCanvas.__init__): New instance variable
5961            error_on_redraw to guard agains endless loops and stack overflows
5962            when there's a bug in the rendering code that raises exceptions.
5963            (MapCanvas.OnIdle, MapCanvas._do_redraw): Split the actual
5964            rendering into a separate method _do_redraw so that error handling
5965            is a bit easier. When an exception occurs, set error_on_redraw to
5966            true. When it's true on entry to OnIdle do nothing and return
5967            immediately.
5968    
5969            * Thuban/Model/data.py (ShapefileStore.Shape): For consistency, a
5970            Shape object will always have the coordinates as a list of list of
5971            coordinate pairs (tuples).
5972            (Shape.compute_bbox): Adapt to new representation.
5973    
5974            * Thuban/UI/viewport.py (ViewPort.find_shape_at)
5975            (ViewPort.LabelShapeAt): Adapt to new coordinate representation in
5976            Shape objects.
5977    
5978            * test/test_shapefilestore.py
5979            (ShapefileStoreTests.assertFloatTuplesEqual)
5980            (ShapefileStoreTests.assertPointListEquals): Rename to
5981            assertPointListEquals and change purpose to checking equality of
5982            the lists returned by Shape.Points().
5983            (TestShapefileStoreArc.test_shape)
5984            (TestShapefileStorePolygon.test_shape)
5985            (TestShapefileStorePoint.test_shape): Use the new
5986            assertPointListEquals instead of assertFloatTuplesEqual
5987    
5988            * test/test_layer.py (TestLayer.assertFloatTuplesEqual)
5989            (TestLayer.assertPointListEquals): Rename to assertPointListEquals
5990            and change purpose to checking equality of the lists returned by
5991            Shape.Points().
5992            (TestLayer.test_arc_layer, TestLayer.test_arc_layer)
5993            (TestLayer.test_polygon_layer, TestLayer.test_point_layer)
5994            (TestLayer.test_derived_store): Use the new assertPointListEquals
5995            instead of assertFloatTuplesEqual
5996    
5997            * test/test_derivedshapestore.py
5998            (TestDerivedShapeStore.assertFloatTuplesEqual)
5999            (TestDerivedShapeStore.assertPointListEquals): Rename to
6000            assertPointListEquals and change purpose to checking equality of
6001            the lists returned by Shape.Points().
6002            (TestDerivedShapeStore.test_shape): Use the new
6003            assertPointListEquals instead of assertFloatTuplesEqual
6004    
6005    2003-08-06  Jan-Oliver Wagner <[email protected]>
6006    
6007            * Thuban/UI/projdialog.py (UTMPanel._OnPropose): Added test for
6008            a bounding box. A dialog is raised in case, no bounding box
6009            is found. This fixes bug #2043:
6010            https://intevation.de/rt/webrt?serial_num=2043
6011    
6012    2003-08-05  Bernhard Herzog  <[email protected]>
6013    
6014            * Thuban/Model/color.py (Color.__repr__): Make the repr of a color
6015            object look like a Color instantiation. Formerly it looked like a
6016            tuple.
6017    
6018            * test/test_color.py (TestColor.test_repr)
6019            (TestColor.test_equality, TestColor.test_inequality): New. test
6020            some more apects of the Color class
6021            (TestTransparent.test_repr, TestTransparent.test_hex)
6022            (TestTransparent.test_equality): New. Test cases for the
6023            Transparent object.
6024    
6025    2003-08-04  Jan-Oliver Wagner <[email protected]>
6026    
6027            * Doc/manual/thuban-manual.xml: a number of small improvements.
6028            The resulting file is the version submitted for GREAT-ER II.
6029    
6030    2003-08-01  Bernhard Herzog  <[email protected]>
6031    
6032            * Thuban/UI/resource.py, Thuban/UI/projdialog.py,
6033            Thuban/UI/join.py, Thuban/UI/classgen.py, Thuban/UI/about.py,
6034            Thuban/Model/resource.py: Insert cvs keywords and doc-strings.
6035    
6036            * Thuban/UI/common.py: Insert cvs keywords and doc-strings.
6037            (Color2wxColour, wxColour2Color, ThubanBeginBusyCursor)
6038            (ThubanEndBusyCursor): Add doc-strings
6039    
6040    2003-08-01  Bernhard Herzog  <[email protected]>
6041    
6042            First step towards PostGIS integration. More abstraction by movin
6043            more code from the layer to the shapestore. More methods of the
6044            layer are now simply delegated to the equivalent method of the
6045            shapestore. The SHAPETYPE_* constants are now in data not in
6046            layer.
6047    
6048            * Thuban/Model/data.py (SHAPETYPE_POLYGON, SHAPETYPE_ARC)
6049            (SHAPETYPE_POINT, Shape): Move these constants and classes from
6050            layer.py to data.py
6051            (ShapefileStore.__init__): More Initialization for the new methods
6052            and functionality.
6053            (ShapefileStore.ShapeType, ShapefileStore.NumShapes)
6054            (ShapefileStore.BoundingBox, ShapefileStore.ShapesInRegion)
6055            (ShapefileStore.Shape): New methods that were formerly implemented
6056            in the layer.
6057            (DerivedShapeStore.Shape, DerivedShapeStore.ShapesInRegion)
6058            (DerivedShapeStore.ShapeType, DerivedShapeStore.NumShapes)
6059            (DerivedShapeStore.BoundingBox): New. DerivedShapeStore
6060            equivalents of the new shape methods. These versions are simply
6061            delegated to the original shapstore.
6062    
6063            * Thuban/Model/layer.py (SHAPETYPE_POLYGON, SHAPETYPE_ARC)
6064            (SHAPETYPE_POINT, Shape): Removed. They're now in data.py
6065            (Layer.SetShapeStore): Removed the initializatin of instance
6066            variables that were needed for the stuff that's now in
6067            ShapefileStore
6068            (Layer.BoundingBox, Layer.NumShapes, Layer.ShapeType)
6069            (Layer.Shape, Layer.ShapesInRegion): Simply delegate to the
6070            shapestore.
6071    
6072            * Thuban/UI/classifier.py, Thuban/UI/renderer.py,
6073            Thuban/UI/viewport.py: Import the SHAPETYPE_* constants from data
6074            instead of layer.
6075    
6076            * test/test_shapefilestore.py: New. Tests for ShapefileStore.
6077    
6078            * test/test_derivedshapestore.py: New. Tests for DerivedShapeStore.
6079    
6080            * test/test_layer.py: Import the SHAPETYPE_* constants from data
6081            instead of layer.
6082            (TestLayer.test_derived_store): Remove the test for the exception
6083            when instantiating the DerivedShapeStore with an incompatible
6084            table which is now in test_derivedshapestore.py. Add some more
6085            tests of the layer methods to determine whether they work for a
6086            DerivedShapeStore as well.
6087    
6088    2003-07-31  Jonathan Coles   <[email protected]>
6089    
6090            * Doc/manual/thuban-manual.xml: Fix the list of required packages
6091            by just listing the name and where they can be found.
6092    
6093    2003-07-31  Frank Koormann   <[email protected]>
6094    
6095            * Doc/manual/thuban-manual.xml:
6096            Changed the screenshot elements to figure.
6097            Changed some variablelist elements to itemizedlist.
6098            Added section on GDAL formats.
6099    
6100    2003-07-31  Jonathan Coles   <[email protected]>
6101    
6102            * Doc/manual/thuban-manual.xml: Added a few sentences about
6103            the Fix Border Color option when generating classes.
6104    
6105    2003-07-30  Jonathan Coles   <[email protected]>
6106    
6107            * Thuban/Model/classgen.py: Add docstrings. Rename specific
6108            Ramp instances to use lower_case_style.
6109    
6110            * Thuban/UI/classgen.py: Use renamed Ramp instances.
6111            
6112            * Thuban/UI/classifier.py: Add docstrings.
6113    
6114            * Thuban/UI/dock.py: Add docstrings.
6115    
6116            * test/test_classgen.py: Use renamed Ramp instances.
6117    
6118    2003-07-30  Bernhard Herzog  <[email protected]>
6119    
6120            * Thuban/Lib/connector.py (QueueingPublisher): Removed. This class
6121            was never used in Thuban.
6122    
6123    2003-07-30  Bernhard Herzog  <[email protected]>
6124    
6125            * Thuban/UI/join.py (JoinDialog.__init__): Use the table's Title()
6126            method directly instead of going through the transient_table
6127            method. This faster because transient_table may force the copy of
6128            a DBF file into the transient database and setting a table's title
6129            doesnm't affect the title of the associated transient table, so
6130            this fixes RT #2042
6131    
6132            * Thuban/UI/main.py (__version__): Don't import the already
6133            removed show_exception_dialog.
6134    
6135    2003-07-29  Jonathan Coles   <[email protected]>
6136    
6137            * Thuban/UI/application.py (ThubanApplication.ShowExceptionDialog):
6138            Put back this method and remove the equivalent function since we
6139            are setting the exception hook from within this class (OnInit).
6140    
6141    2003-07-29  Jonathan Coles   <[email protected]>
6142    
6143            * Doc/manual/images/5_2_custom_ramp.png,
6144            Doc/manual/images/5_2_quantiles.png,
6145            Doc/manual/images/5_2_uniform_dist.png,
6146            Doc/manual/images/5_2_unique_values.png,
6147            Doc/manual/images/8_int_error.png: New screen shots.
6148    
6149            * Doc/manual/thuban-manual.xml: Fixed typos and wording, clarified
6150            some points, and added more screen shots.
6151    
6152    2003-07-29  Bernhard Herzog  <[email protected]>
6153    
6154            * Thuban/Model/data.py: Remove the now unused import of warnings
6155    
6156    2003-07-29  Bernhard Herzog  <[email protected]>
6157    
6158            * Thuban/Model/data.py (SimpleStore): Removed. This class has been
6159            deprecated since before the 0.8 release and isn't used in Thuban
6160            itself anymore.
6161    
6162            * Thuban/Model/transientdb.py: Remove some unnecessary imports
6163    
6164    2003-07-29  Jonathan Coles   <[email protected]>
6165    
6166            * Thuban/UI/application.py (ThubanApplication.OnInit): set the
6167            python exception hook here so that we are sure to catch any
6168            Thuban exception that happen during initialization.
6169    
6170            * Thuban/UI/main.py (main): Don't set the exception hook here,
6171            it will get set in ThubanApplication.OnInit.
6172    
6173    2003-07-29  Jonathan Coles   <[email protected]>
6174                                                                                
6175            * Thuban/UI/application.py (ThubanApplication.ShowExceptionDialog):
6176            Removed and called it show_exception_dialog() so that the exception
6177            handler can be set before the class is created.
6178                                                                                
6179            * Thuban/UI/main.py (main): Install the exception handler before
6180            a ThubanApplication is created.
6181                                                                                    
6182    2003-07-29  Bernhard Herzog  <[email protected]>
6183    
6184            * po/it.po: New. Italian translation by Maurizio Napolitano
6185    
6186            * po/ru.po: New. Russian translation by Alex Shevlakov
6187    
6188    2003-07-29  Frank Koormann   <[email protected]>
6189    
6190            * Doc/manual/thuban-manual.xml: Extended section on supported
6191            projections.
6192            
6193    2003-07-29  Frank Koormann   <[email protected]>
6194    
6195            * Doc/manual/thuban-manual.xml: gaspell-checked.
6196    
6197    2003-07-29  Jonathan Coles   <[email protected]>
6198    
6199            * Doc/manual/images/3_5_legend.png: Added border to improve look
6200            on white background.
6201    
6202    2003-07-29  Jonathan Coles   <[email protected]>
6203    
6204            * Doc/manual/thuban-manual.xml: Fixed grammar and typos. Added
6205            descriptions for the legend toolbar.
6206    
6207            * Doc/manual/images/4_2_raster_layer_properties.png: Removed
6208            cursor from dialog box.
6209    
6210    2003-07-28  Jonathan Coles   <[email protected]>
6211    
6212            * Doc/manual/thuban-manual.xml: More screenshots and more chapters.
6213    
6214            * Doc/manual/images/2_4_session_tree.png,
6215            Doc/manual/images/3_5_legend.png, Doc/manual/images/3_rename_map.png,
6216            Doc/manual/images/4_2_layer_properties.png,
6217            Doc/manual/images/4_2_raster_layer_properties.png,
6218            Doc/manual/images/5_3_genclass.png,
6219            Doc/manual/images/5_classification.png,
6220            Doc/manual/images/6_projection.png,
6221            Doc/manual/images/7_1_table_view.png,
6222            Doc/manual/images/7_2_5_join.png: New screenshots.
6223    
6224    2003-07-24  Jonathan Coles   <[email protected]>
6225    
6226            * Doc/manual/thuban-manual.xml: Chapter on Projection Management.
6227    
6228    2003-07-24  Jonathan Coles   <[email protected]>
6229    
6230            * Doc/manual/thuban-manual.xml: Added EPS images and wrote
6231            chapter on Layer Management.
6232    
6233            * Doc/manual/Makefile: New. Makefile to generate all formats for the
6234            manual and images.
6235    
6236    2003-07-24  Bernhard Herzog  <[email protected]>
6237    
6238            * Thuban/Model/range.py, Thuban/version.py: Remove the #! line as
6239            it annoys lintian which warns about these files not being
6240            executable. The #! isn't necessary here since if you absolutely
6241            must execute them you can always say "python <filename>".
6242    
6243            * Thuban/UI/renderer.py (ScreenRenderer.draw_shape_layer): Remove
6244            superfluous code to set brush and pen for point shapes
6245    
6246            * Thuban/UI/viewport.py: Remove commented out code that wouldn't
6247            belong in viewport anyway
6248    
6249    2003-07-24  Frank Koormann   <[email protected]>
6250    
6251            * Doc/manual/thuban-manual.xml: Added section on table management.
6252    
6253    2003-07-24  Bernhard Herzog  <[email protected]>
6254    
6255            * test/runtests.py (main): Recognize the long "verbose" option
6256            correctly.
6257    
6258    2003-07-22  Jonathan Coles   <[email protected]>
6259    
6260            * Doc/manual/thuban-manual.xml: Continue to write first revision
6261            of the manual.
6262    
6263            * Thuban/UI/renderer.py (MapRenderer.render_map): Wrap method
6264            with Begin/EndDrawing() calls to ensure we aren't doing to
6265            many updates to the dc during rendering.
6266            (ScreenRenderer.draw_shape_layer): self.draw_point_shape takes
6267            a pen and brush argument so they need to be passed to the function.
6268    
6269            * Thuban/UI/viewport.py (ViewPort.calc_min_max_scales): New.
6270            Calculates the minimum and maximum scale values. Factored out
6271            of set_view_transform so that it could be used to zoom all the
6272            way into a single point.
6273            (ViewPort.set_view_transform): Call calc_min_max_scales().
6274            (ViewPort.FitSelectedToWindow): Zoom to the maximum scale
6275            if only a single point is selected.
6276    
6277            * Doc/manual/images/1_2_legend_close.png,
6278            Doc/manual/images/1_2_legend_dock.png,
6279            Doc/manual/images/1_2_mainwindow.png,
6280            Doc/manual/images/1_2_mainwindow.ps,
6281            Doc/manual/images/1_2_mainwindow.sk,
6282            Doc/manual/images/3_2_fullextent.png,
6283            Doc/manual/images/3_2_fulllayerextent.png,
6284            Doc/manual/images/3_2_fullshapeextent.png,
6285            Doc/manual/images/3_2_pan.png,
6286            Doc/manual/images/3_2_zoomin.png,
6287            Doc/manual/images/3_2_zoomout.png,
6288            Doc/manual/images/3_3_identify.png,
6289            Doc/manual/images/3_3_label.png,
6290            Doc/manual/images/3_5_invisible.png,
6291            Doc/manual/images/3_5_movedown.png,
6292            Doc/manual/images/3_5_moveup.png,
6293            Doc/manual/images/3_5_props.png,
6294            Doc/manual/images/3_5_tobottom.png,
6295            Doc/manual/images/3_5_totop.png,
6296            Doc/manual/images/3_5_visible.png: New. Images for the documentation.
6297    
6298    2003-07-18  Bernhard Herzog  <[email protected]>
6299    
6300            * Thuban/UI/messages.py (MAP_REPLACED): New message.
6301    
6302            * Thuban/UI/viewport.py (ViewPort.SetMap): Issue MAP_REPLACED
6303            after the new map has been assigned
6304    
6305            * Thuban/UI/mainwindow.py (MainWindow.delegated_messages):
6306            Delegate MAP_REPLACED to the canvas too
6307            (MainWindow.prepare_new_session): Removed. Thanks to the new
6308            MAP_REPLACED message it's no longer needed
6309            (MainWindow.OpenSession, MainWindow.NewSession):
6310            prepare_new_session has been removed.
6311    
6312            * Thuban/UI/classifier.py (Classifier.__init__): Subscribe to
6313            MAP_REPLACED so that we can close the dialog if a new map is set.
6314            (Classifier.unsubscribe_messages): Unsubscribe from MAP_REPLACED
6315            (Classifier.map_replaced): Handle MAP_REPLACED by closing the
6316            dialog
6317    
6318            * test/test_viewport.py (SimpleViewPortTest)
6319            (SimpleViewPortTest.test_default_size): Add doc-strings
6320            (ViewPortTest.setUp): Bind map to self.map so we can use it in
6321            tests. Subscribe to MAP_REPLACED messages too.
6322            (ViewPortTest.tearDown): No need to explicitly unsubscribe
6323            (ViewPortTest.test_set_map): New test for the SetMap method.
6324    
6325    2003-07-18  Bernhard Herzog  <[email protected]>
6326    
6327            * test/test_viewport.py (SimpleViewPortTest.test_default_size):
6328            Move this test from ViewPortTest.setUp to this new separate test
6329            case. setUp is not the place for the actual tests.
6330            (ViewPortTest.test_inital_settings, ViewPortTest.setUp): Move some
6331            more of the test from setUp to the new test test_inital_settings.
6332            (ViewPortTest.test_win_to_proj, ViewPortTest.test_proj_to_win)
6333            (ViewPortTest.test_proj_conv): Split test_proj_conv into
6334            test_win_to_proj and test_proj_to_win and make the tests easier to
6335            understand
6336            (ViewPortTest.testFitRectToWindow, ViewPortTest.testZoomFactor)
6337            (ViewPortTest.testZoomOutToRect, ViewPortTest.testTranslate)
6338            (ViewPortTest.test_unprojected_rect_around_point)
6339            (ViewPortTest.test_find_shape_at, ViewPortTest.testTools):
6340            Reformat to increase readability.
6341    
6342    2003-07-18  Bernhard Herzog  <[email protected]>
6343    
6344            * Thuban/UI/view.py (MapCanvas.OnLeftDown): Capture the mouse.
6345    
6346    2003-07-18  Bernhard Herzog  <[email protected]>
6347    
6348            * test/runtests.py: The test suite can now be run without an X
6349            connection. To make sure this remains true, remove the DISPLAY
6350            environment variable so that an error occurs if the wxGTK is
6351            imported accidentally
6352    
6353    2003-07-18  Bernhard Herzog  <[email protected]>
6354    
6355            * Thuban/UI/viewport.py: Remove unused imports
6356    
6357            * Thuban/UI/view.py: Remove unused imports
6358    
6359    2003-07-18  Bernhard Herzog  <[email protected]>
6360    
6361            * test/test_export.py Remove unused imports. The OutputTransform
6362            function is now in viewport.py and is called output_transform
6363            (TestScalebar.test_output_transform)
6364            (TestScalebar.test_OutputTransform): Renamed to
6365            test_output_transform and updated to use output_transform instead
6366            of OutputTransform
6367    
6368            * Thuban/UI/view.py (OutputTransform): Moved to viewport.py and
6369            renamed.
6370            (MapCanvas.Export, MapPrintout.draw_on_dc): OutputTransform was
6371            renamed to output_transform
6372    
6373            * Thuban/UI/viewport.py (OutputTransform, output_transform):
6374            Rename to output_transform
6375    
6376    2003-07-18  Bernhard Herzog  <[email protected]>
6377    
6378            * Thuban/Model/layer.py (Layer.__init__): Rename
6379            classificationField to classificatin_column and init it here so
6380            that it can be used in SetClassificationColumn
6381            (Layer.GetClassificationColumn, Layer.GetClassificationField):
6382            Rename to GetClassificationColumn.
6383            (Layer.SetClassificationColumn, Layer.SetClassificationField):
6384            Rename to SetClassificationColumn and issue a LAYER_CHANGED
6385            message if the column changes.
6386            (Layer._classification_changed, Layer.ClassChanged): Rename to
6387            _classification_changed. Update the callers.
6388            (Layer.SetShapeStore): Further field->column renames.
6389    
6390            * Thuban/Model/load.py (SessionLoader.start_classification)
6391            (SessionLoader.start_clpoint): Updates because of
6392            field->column method name changes in the Layer class
6393    
6394            * Thuban/Model/save.py (SessionSaver.write_classification): Updates
6395            because of field->column method name changes in the Layer class
6396    
6397            * Thuban/UI/classifier.py (Classifier.__init__)
6398            (Classifier._OnTry, Classifier._OnRevert): Updates because of
6399            field->column method name changes in the Layer class
6400    
6401            * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Updates
6402            because of field->column method name changes in the Layer class
6403    
6404            * Thuban/UI/viewport.py (ViewPort.find_shape_at): Updates because
6405            of field->column method name changes in the Layer class
6406    
6407            * test/test_save.py (SaveSessionTest.testClassifiedLayer)
6408            (SaveSessionTest.testClassifiedLayer): Update because of
6409            field->column method name changes in the Layer class
6410    
6411            * test/test_layer.py (SetShapeStoreTests.setUp)
6412            (SetShapeStoreTests.test_sanity): Update because of field->column
6413            method name changes in the Layer class
6414            (TestLayerModification.setUp): Subscribe to LAYER_CHANGED as well
6415            (TestLayerModification.test_sanity)
6416            (TestLayerModification.test_initial_settings): remove unsued code
6417            and rename to test_sanity.
6418            (TestLayerModification.test_set_classification): New test for
6419            SetClassification and SetClassificationField.
6420    
6421    2003-07-18  Bernhard Herzog  <[email protected]>
6422    
6423            * test/test_classgen.py (TestFixedRamp.test): Extend test to check
6424            the non-fixed values as well. The old test would have accepted a
6425            fixed ramp that only returnes the fixed properties
6426    
6427    2003-07-17  Jonathan Coles   <[email protected]>
6428    
6429            * Doc/manual/mainwindow.png, Doc/manual/mainwindow.xcf: Screen
6430            shots for the manual. The XCF file is the source image and
6431            has additional layers to support changes.
6432    
6433            * Doc/manual/thuban-manual.xml: Wrote an initial Introduction.
6434    
6435            * Thuban/UI/classifier.py (Classifier.__BuildClassification):
6436            Return both the new class and the field name.
6437    
6438            * Thuban/UI/mainwindow.py (MainWindow.ToggleLegend): Don't
6439            fit the map to the window as this changes any zoom level that
6440            the user may have set.
6441    
6442    2003-07-16  Jonathan Coles   <[email protected]>
6443    
6444            * Thuban/Model/classgen.py (generate_singletons,
6445            generate_uniform_distribution, generate_quantiles): Remove
6446            fixes parameter, but maintain the same functionality by having
6447            the calling function pass a FixedRamp object for the ramp.
6448            (FixedRamp): New. Adapts a ramp to have fixed property values.
6449    
6450            * Thuban/Model/classification.py: Use new CLASS_CHANGED message.
6451            (Classification): Inherit from Publisher.
6452            (Classification.__init__): Remove the layer parameter.
6453            Classifications no longer need to have a parent layer.
6454            (Classification.GetField, Classification.GetFieldType,
6455            Classification.SetFieldInfo): Removed. The field name is stored
6456            in the layer, and the type can be retreived by calling
6457            Layer.GetFieldType().
6458            (Classification._set_layer, Classification.GetLayer): Removed.
6459            Classifications no longer have a parent layer.
6460    
6461            * Thuban/Model/layer.py (Layer.Destroy): Unsubscribe from the
6462            classification.
6463            (Layer.SetShapeStore): Reset the classification first while
6464            we still have the old shape store to work with.
6465            (Layer.GetClassificationField, Layer.SetClassificationField):
6466            New. Method for getting/setting the field to classify on.
6467            (Layer.SetClassification): Simplified now that the layer
6468            simply has to hold a reference to the classification and not
6469            tell the classification who owns it.
6470            Fixes RTbug #2023.
6471    
6472            * Thuban/Model/load.py (SessionLoader.start_classification):
6473            Set the field name on the layer, not the classification.
6474    
6475            * Thuban/Model/messages.py: Add CLASS_CHANGED for when a
6476            classification is modified.
6477    
6478            * Thuban/Model/save.py (SessionSaver.write_classification):
6479            Get the field name and type from the layer.
6480    
6481            * Thuban/Model/table.py (table_to_dbf, table_to_csv): Renamed
6482            parameter records to rows and add docstring. Fixes RTbug #1997.
6483    
6484            * Thuban/UI/classgen.py (ClassGenDialog.OnOK): Use a fixed
6485            ramp when we need to fix certain values of a ramp rather than
6486            using the old fixes parameter. Fixes RTbug #2024.
6487    
6488            * Thuban/UI/classifier.py (ClassGrid.CreateTable): Add fieldType
6489            parameter.
6490            (ClassTable.Reset): Add fieldType parameter and use it, rather
6491            than asking the classification.
6492            (Classifier.__init__): Remember the original class's field
6493            and ask the layer for the field type, rather than the classification.
6494            (Classifier.__SetGridTable): Retrieve the field and field type
6495            for the table because they are not in the classification.
6496            (Classifier._OnTry, Classifier._OnRevert): Set the classification
6497            field on the layer in addition to the classification itself.
6498    
6499            * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Get the
6500            classification field from layer.
6501    
6502            * Thuban/UI/viewport.py (ViewPort.find_shape_at): Get the
6503            classification field from layer. Split up tests and remove
6504            *-imports. Fixes RTbug #1992.
6505    
6506            * test/test_classgen.py (TestFixedRamp): Test for the FixedRamp class.
6507    
6508            * test/test_classification.py
6509            (TestClassification.test_classification): Remove tests for methods
6510            that no longer exist.
6511    
6512            * test/test_layer.py (SetShapeStoreTests.setUp): Classification
6513            __init__ no longer has a field parameter, use SetClassificationField.
6514            (SetShapeStoreTests.test_sanity): Use layer object to get class
6515            field info.
6516    
6517            * test/test_save.py (SaveSessionTest.testClassifiedLayer): Use
6518            SetClassificationField on layer to set class field info.
6519    
6520            * test/test_viewport.py: Renamed from test/test_view.py.
6521    
6522    2003-07-16  Jan-Oliver Wagner <[email protected]>
6523    
6524            * Doc/manual/thuban-manual.xml: Added authors and an initial
6525            coarse structure.
6526    
6527    2003-07-15  Bernhard Herzog  <[email protected]>
6528    
6529            * test/support.py (FloatComparisonMixin): This is a mix-in class
6530            and therefore should not be derived from any other class.
6531    
6532            * test/test_range.py (RangeTest): FloatComparisonMixin is a
6533            mix-in, so derive from TestCase as well.
6534    
6535    2003-07-15  Bernhard Herzog  <[email protected]>
6536    
6537            * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Rework the
6538            draw_func handling a bit to remove one layer of indirection. This
6539            makes the renderer about 10% faster in the non-classifying case
6540            and the code a bit cleaner
6541            (MapRenderer.draw_point_shape): Add the pen and brush parameters
6542            and set them in the dc. Now the draw_point_shape method and
6543            wxproj's draw_polygon_shape function have basically the same
6544            signature so that both can be directly used as draw_func
6545    
6546    2003-07-15  Bernhard Herzog  <[email protected]>
6547    
6548            * Thuban/Model/save.py (SessionSaver.write_classification): Encode
6549            string values (in addition to the labels) as UTF 8
6550    
6551            * Thuban/Model/load.py (SessionLoader.start_clpoint): Decode the
6552            values if the field type is string
6553    
6554            * test/test_save.py (SaveSessionTest.testClassifiedLayer): Test
6555            saving a session with non-ascii string classification values.
6556    
6557            * test/test_load.py (TestClassification.file_contents)
6558            (TestClassification.test): Check for non-ascii values in string
6559            classifications
6560    
6561    2003-07-14  Jonathan Coles   <[email protected]>
6562    
6563            * test/test_view.py: New. Tests for ViewPort.
6564    
6565    2003-07-14  Frank Koormann   <[email protected]>
6566    
6567            * Thuban/Model/load.py (SessionLoader.start_map): Encode map
6568            title to latin1.  Fixes https://intevation.de/rt/webrt?serial_num=2013
6569    
6570            * test/test_load_0_8.py (TestUnicodeStrings): New, test load of
6571            unicode strings from session file: session title, map title and
6572            projection name.
6573            
6574    2003-07-10  Jonathan Coles   <[email protected]>
6575    
6576            * Thuban/UI/viewport.py (Tool.MouseUp): Should have called
6577            drag_stop, not drag_move when the mouse is released.
6578    
6579    2003-07-10  Jonathan Coles   <[email protected]>
6580    
6581            The most important part of this is the seperation of view.py into
6582            two pieces. viewport.py now has a class called ViewPort which
6583            contains all the non-wx parts of view.py and can therefore be
6584            tested. view.py contains only the wx-specific parts and is fairly
6585            simple.
6586    
6587            * Thuban/UI/view.py: Stripped out all non-wx functionality. Fixes
6588            RTTbug #1992.
6589            * Thuban/UI/viewport.py: New. Contains non-wx view functionality.
6590            RTTbug #1992.
6591    
6592            * Thuban/Model/classgen.py (generate_singletons,
6593            generate_uniform_distribution, generate_quantiles):
6594            Added 'fixes' parameter so that property attributes can
6595            be held constant over the generated classification groups.
6596            (CustomRamp.GetProperties): Remove unused variables.
6597    
6598            * Thuban/Model/map.py (Map.SetProjection): Send the old
6599            projection as an argument to listeners of the MAP_PROJECTION_CHANGED
6600            event.
6601    
6602            * Thuban/Model/table.py (table_to_dbf, table_to_csv): Added 'records'
6603            parameter which is a list of records that restricts which
6604            records are saved. Fixes RTbug #1997.
6605    
6606            * Thuban/UI/application.py (ThubanApplication.ShowExceptionDialog):
6607            Port exception dialog from GREAT-ER. Fixes RTbug #1993.
6608    
6609            * Thuban/UI/classgen.py (ClassGenDialog.__init__): Add controls
6610            to allow the user to fix line color/width on generated groups.
6611            (ClassGenDialog.OnOK): Use new 'fixes' parameter of the generate_*
6612            functions to optionally fix group properties.
6613    
6614            * Thuban/UI/main.py (main): Set exception hook to the
6615            ShowExceptionDialog. Fixes RTbug #1993.
6616    
6617            * Thuban/UI/mainwindow.py (MainWindow.ShowTableView): Raise
6618            the table window when it is selectd to be shown.
6619    
6620            * Thuban/UI/tableview.py (QueryTableFrame.__init__): Add an
6621            Export Selection button and move the export buttons underneath
6622            the table.
6623            (QueryTableFrame.UpdateStatusText): Added event argument so
6624            that it can respond to grid selection events. The status text
6625            is now updated even when the table is not associated with a
6626            layer as was previously assumed.
6627            (QueryTableFrame.OnGridSelectRange, OnGridSelectCell): Removed.
6628            UpdateStatusText responds to these events.
6629            (QueryTableFrame.OnSaveAs): Renamed to doExport.
6630            (QueryTableFrame.doExport): Helper function that saves the
6631            entire table, or selected rows, to a file.
6632            (QueryTableFrame.OnExport, QueryTableFrame.OnExportSel): New.
6633            Respond to export button events and call doExport.
6634    
6635            * extensions/thuban/gdalwarp.cpp (ProjectRasterFile): Make sure
6636            the function doesn't return NULL without first setting a Python
6637            Error.
6638    
6639            * test/runtests.py (main): Only print "Unknown option" for
6640            unsupported options.
6641    
6642            * test/support.py (FloatComparisonMixin.assertFloatEqual): Take
6643            optional epsilon argument to specify floating point accuracy.
6644            (FloatComparisonMixin.assertFloatSeqEqual): Call assertFloatEqual
6645            for each item test.
6646    
6647            * test/test_csv_table.py (TestCSVTable.test_table_to_cvs): Add
6648            tests for saving selected records.
6649    
6650            * test/test_dbf_table.py (TestTableToDBF.test_table_to_dbf): Add
6651            tests for saving selected records.
6652    
6653            * test/test_map.py (TestMapWithContents.test_set_projection):
6654            MAP_PROJECTION_CHANGED events send the old projection.
6655    
6656            * test/test_session.py
6657            (TestSessionWithContent.test_forward_map_projection):
6658            MAP_PROJECTION_CHANGED events send the old projection.
6659    
6660            * test/test_table.py (TableTest): Update tests to use non-deprecated
6661            functions.
6662    
6663    2003-07-08  Bernhard Herzog  <[email protected]>
6664    
6665            * Thuban/Model/transientdb.py (TransientTableBase.Width): The type
6666            constants in the column objects are the standard ones defined in
6667            the table module.
6668    
6669            * test/test_transientdb.py
6670            (TestTransientTable.test_transienttable_to_dbf): New. Test whether
6671            exporting transient tables as DBF works. This should catch the bug
6672            just fixed in TransientTableBase.Width.
6673    
6674    2003-07-08  Bernhard Herzog  <[email protected]>
6675    
6676            * Thuban/Model/classgen.py (CustomRamp.GetProperties): Compute the
6677            interpolated colors correctly.
6678    
6679            * test/test_classgen.py (TestCustomRamp.test_color_interpolation):
6680            New. Test case for the fix in classgen.py
6681    
6682    2003-07-08  Bernhard Herzog  <[email protected]>
6683    
6684            * test/runtests.py (main): Make the default output less verbose
6685            and add a verbosity option (-v) to get the old output
6686    
6687    2003-07-08  Bernhard Herzog  <[email protected]>
6688    
6689            * Resources/XML/thuban-0.9.dtd: New. This will become the DTD for
6690            0.9.
6691    
6692            * Thuban/Model/transientdb.py (TransientJoinedTable.JoinType):
6693            New. Return the join type
6694    
6695            * Thuban/Model/save.py (SessionSaver.write_session): Use new 0.9
6696            DTD
6697            (SessionSaver.write_data_containers): Save the join type for
6698            joined tables
6699    
6700            * Thuban/Model/load.py (SessionLoader.__init__): Add the new 0.9
6701            namespace
6702            (SessionLoader.start_jointable): Handle the jointype attribute
6703    
6704            * test/test_load_0_8.py: New. Effectively a copy of test_load.py
6705            as of Thuban 0.8. These are now tests to determine whether Thuban
6706            can still read files generated by Thuban 0.8
6707    
6708            * test/test_load.py (LoadSessionTest.dtd)
6709            (TestSingleLayer.file_contents)
6710            (TestLayerVisibility.file_contents, TestLabels.file_contents)
6711            (TestLayerProjection.file_contents)
6712            (TestRasterLayer.file_contents, TestJoinedTable.file_contents)
6713            (TestJoinedTable.file_contents)
6714            (TestLoadError.file_contents): Update for new DTD
6715            (TestJoinedTable.file_contents, TestJoinedTable.setUp): Add test
6716            for new join type attribute
6717    
6718            * test/test_save.py (SaveSessionTest.dtd)
6719            (SaveSessionTest.testEmptySession)
6720            (SaveSessionTest.testSingleLayer)
6721            (SaveSessionTest.testLayerProjection)
6722            (SaveSessionTest.testRasterLayer)
6723            (SaveSessionTest.testClassifiedLayer)
6724            (SaveSessionTest.test_dbf_table)
6725            (SaveSessionTest.test_joined_table): Update for new DTD
6726            (SaveSessionTest.test_joined_table): Add test for new join type
6727            attribute
6728    
6729    2003-07-04  Bernhard Herzog  <[email protected]>
6730    
6731            * Thuban/Model/table.py (_find_dbf_column_names): New. Helper
6732            function for table_to_dbf
6733            (table_to_dbf): Deal with names longer than the 10 character limit
6734    
6735            * test/test_dbf_table.py (TestTableToDBF.test_table_to_dbf): Add
6736            doc-string
6737            (TestTableToDBF.test_table_to_dbf_long_col_names): New test for
6738            long column names
6739    
6740    2003-07-03  Bernhard Herzog  <[email protected]>
6741    
6742            * Doc/manual/thuban-manual.xml: Fix the CVS Revision Tag syntax
6743    
6744    2003-07-03  Bernhard Herzog  <[email protected]>
6745    
6746            * Doc/manual/thuban-manual.xml, Doc/manual/README: New. Skeleton
6747            for the Thuban manual and README with some basic information about
6748            the manual
6749    
6750    2003-07-03  Bernhard Herzog  <[email protected]>
6751    
6752            * Thuban/Model/transientdb.py (TransientJoinedTable.__init__):
6753            Update doc-string
6754            (TransientJoinedTable.create): Do not modify the column objects of
6755            the input tables in place and copy all columns of the input tables
6756            into the joined table after all.
6757    
6758            * test/test_transientdb.py
6759            (TestTransientTable.test_transient_joined_table_same_column_name):
6760            Update to reflect the new behavior
6761            (TestTransientTable.test_transient_joined_table_with_equal_column_names):
6762            Update to reflect the new behavior
6763            (TestTransientTable.test_transient_joined_table_name_collisions_dont_modify_in_place):
6764            New test case for a bug which modified the column objects in place
6765    
6766    2003-07-02  Jonathan Coles   <[email protected]>
6767    
6768            * Thuban/Model/classgen.py (generate_singletons,
6769            generate_uniform_distribution, generate_quantiles,
6770            GenQuantiles0): Make sure maxValue isn't less than
6771            one, otherwise we could divide by zero.
6772    
6773            * test/test_classgen.py (ClassGenTest.doClassRangeTest,
6774            ClassGenTest.doClassSingleTest): Call doBoundsTest to
6775            check the end classification groups against the
6776            proper property values.
6777            (ClassGenTest.doBoundsTest): New. Checks the first and
6778            last classification groups to make sure their properties
6779            are the correct upper and lower bounds for a color ramp.
6780    
6781    2003-07-02  Jonathan Coles   <[email protected]>
6782    
6783            * Thuban/Model/classgen.py (generate_singletons,
6784            generate_uniform_distribution, generate_quantiles,
6785            GenQuantiles0): The denominator was one to high when
6786            calculating the index for the ramp causing the index
6787            to never to reach one.
6788    
6789    2003-07-02  Jonathan Coles   <[email protected]>
6790    
6791            Changed the singature of ClassGroupRange.__init__ and
6792            ClassGroupRange.SetRange() so that the min/max values are
6793            passed as a tuple. This makes a better calling scheme for
6794            when a Range object is passed instead.
6795    
6796            * Thuban/Model/classgen.py: Fixed parameters to
6797            ClassGroupRange constructor.
6798    
6799            * Thuban/Model/classification.py (ClassGroupRange.__init__):
6800            Consolidate the min/max parameters into a single _range which
6801            can either be a tuple or a Range object.
6802            (ClassGroupRange.SetRange): Consolidate the min/max parameters
6803            into a single _range which can either be a tuple or a Range object.
6804    
6805            * Thuban/Model/load.py (SessionLoader.start_clrange): Fix
6806            call to ClassGroupRange constructor to use a tuple.
6807    
6808            * Thuban/Model/layer.py (Layer.SetClassification): Switch
6809            the classification instance variable to the new class
6810            before calling _set_layer otherwise subscribers to a
6811            LAYER_CHANGED event will not see any difference.
6812    
6813            * test/test_classification.py: Fix tests of ClassGroupRange
6814            so that they use the new signature.
6815    
6816            * test/test_load.py: Fix use of ClassGroupRange so that it
6817            uses the new signature.
6818    
6819            * test/test_load_0_2.py: Fix use of ClassGroupRange so that it
6820            uses the new signature.
6821    
6822            * test/test_save.py: Fix use of ClassGroupRange so that it
6823            uses the new signature.
6824    
6825    
6826    2003-07-01  Jonathan Coles   <[email protected]>
6827    
6828            * Thuban/Model/classgen.py: Fixes RTbug #1972, 1971.
6829            Import used objects/class from color.
6830            (generate_singletons): We don't
6831            need the numGroups parameter anymore because we are using
6832            the new ramps with GetProperties().
6833            (generate_uniform_distribution): Use new ramp method
6834            GetProperties().
6835            (generate_quantiles, GenQuantiles0): Use new ramp method
6836            GetProperties().
6837            (CustomRamp.SetNumGroups): Removed. The ramps now map
6838            a value from 0 to 1 to class properties so the number
6839            of groups is not needed ahead of time.
6840            (CustomRamp.next): Removed. CustomRamp does not support
6841            interation anymore.
6842            (CustomRamp.GetProperties): Returns a ClassGroupProperties
6843            object based on the index value from 0 to 1 that is
6844            passed to it.
6845            (GreyRamp, RedRamp, GreenRamp, BlueRamp, GreenToRedRamp):
6846            Made into instances of Monochromatic class instread of
6847            deriving from it.
6848            (HotToCold.SetNumGroups): Removed. See CustomRamp.
6849            (HotToCold.next): Removed. See CustomRamp.
6850    
6851            * Thuban/Model/classification.py: Fixes RTbug #1973, 1971.
6852            (Classification.SetField, Classification.SetFieldType):
6853            Replaced with SetFieldInfo.
6854            (Classification.SetFieldInfo): New. Does a better job of
6855            what SetField and SetFieldType used to do by combining
6856            their function since they should really always be done
6857            at the same time.
6858            (Classification.SetLayer): Renamed to _set_layer.
6859            (Classification._set_layer): Should only be called from
6860            Layer's SetClassification. This does not cause a recursive
6861            call as SetLayer did because we know that Layer knows about
6862            the classification.
6863    
6864            * Thuban/Model/color.py: Fixes RTbug #1971.
6865            (_Transparent): Renamed from Transparent so it doesn't
6866            conflict with the module variable.
6867            (Transparent, Black): Renamed from Color.Transparent,
6868            Color.Black so they are not class variables.
6869    
6870            * Thuban/Model/layer.py: Fixes RTbug #1971, 1973.
6871            (Layer.Destroy): We don't need to call SetClassification
6872            anymore to clear out the back reference in the classifcation
6873            to the layer. It's better to set it to None using _set_layer,
6874            and we won't be creating another clas object too.
6875            (Layer.SetClassification): Classification._set_layer is not
6876            recursive so remove all the locking variables. Also clean
6877            up the code so that it remains unchanged if something fails.
6878    
6879            * Thuban/Model/load.py: Fixes RTbug #1971.
6880            (SessionLoader.start_classification): Call
6881            Classification.SetFieldInfo().
6882    
6883            * Thuban/Model/save.py: Removed import of Color which wasn't
6884            being used.
6885    
6886            * Thuban/UI/classgen.py: Fixes RTbug #1972.
6887            (ClassGenDialog.__init__): Color ramps are now instances
6888            already so we don't need to create any new objects.
6889            (ClassGenDialog.OnOK): Check for numGroups is no longer
6890            necessary because we never use it.
6891    
6892            * Thuban/UI/classifier.py: Fixes RTbug #1971.
6893            (Classifier.__BuildClassification, Classifier.__SetGridTable):
6894            Call Classification.SetFieldInfo() instead of SetFieldType.
6895    
6896            * Thuban/UI/renderer.py: Fixes RTbug #1971.
6897    
6898            * Thuban/UI/view.py: Fixes RTbug #1974, 1971.
6899            (MapCanvas.__init__): Subscribe to the idle time event. Set
6900            background color to white.
6901            (MapCanvas.OnPaint): Set a flag indicating that we should
6902            render the map during idle time. If we already have a bitmap
6903            just draw it now.
6904            (MapCanvas.OnIdle): New. Render the map only during idle time.
6905            This also fixes a problem with the busy cursor under gtk.
6906    
6907            * test/test_classgen.py (ClassGenTest.test_generate_singletons):
6908            Fix calls to generate_singletons because the signature changed.
6909    
6910            * test/test_classification.py: Fix color references and
6911            change calls to Classification.[SetField|SetFieldType] to
6912            SetFieldInfo.
6913    
6914            * test/test_load.py: Fix color references.
6915    
6916            * test/test_load_0_2.py: Fix color references.
6917    
6918            * test/test_save.py (SaveSessionTest.testClassifiedLayer):
6919            Change calls to Classification.[SetField|SetFieldType] to
6920            SetFieldInfo.
6921    
6922    2003-07-01  Frank Koormann   <[email protected]>
6923    
6924            MERGE from the greater-ms3 branch.
6925    
6926            * test/test_transientdb.py
6927            (TestTransientTable.test_transient_joined_table_with_equal_column_names):
6928            New. Test join of two tables with partly equal column names.
6929    
6930            * Thuban/Model/transientdb.py (TransientJoinedTable.create):
6931            If duplicates in left and right tables column names are found,
6932            append '_' (underscores) to the name until it is unique.
6933            Create always new internal names for the resulting table and reference
6934            columns in the join statement with <table>.<column>
6935    
6936    2003-07-01  Bernhard Herzog  <[email protected]>
6937    
6938            * test/test_transientdb.py
6939            (TestTransientTable.test_transient_joined_table_same_column_name):
6940            New. Test whether joining on columns with the same names in both
6941            tables works.
6942            
6943            * Thuban/Model/transientdb.py (TransientJoinedTable.create): Make
6944            sure to use the right internal names even when joining on field
6945            with the same names in both tables. Also, detect duplicate names
6946            in the joined table correctly.
6947    
6948    2003-07-01  Frank Koormann   <[email protected]>
6949    
6950            * Thuban/UI/renderer.py (ExportRenderer.render_legend):
6951            Reverse List of layers to render in same order as in desktop legend.
6952    
6953    2003-06-30  Jonathan Coles   <[email protected]>
6954    
6955            * Thuban/version.py (make_tuple): Takes a version string
6956            and splits it into a tuple of at most three integers.
6957            Used make_tuple() to make tuple versions of the version
6958            numbers.
6959    
6960            * Thuban/UI/about.py: Add Thuban email addresses.
6961    
6962    2003-06-30  Jonathan Coles   <[email protected]>
6963    
6964            * Thuban/version.py: SQLite/PySQLite version dependencies
6965            were too high.
6966    
6967    2003-06-30  Jonathan Coles   <[email protected]>
6968    
6969            * Thuban/version.py: Update version to 0.8.1
6970            
6971            * MANIFEST.in: Added Projections so that default.proj is
6972            included.
6973    
6974    2003-06-26  Jonathan Coles   <[email protected]>
6975    
6976            New About box with lots more information including library
6977            versions and credits. More/better version checking before
6978            Thuban starts.
6979    
6980            * Thuban/UI/about.py: New. New About box that displays
6981            library version information and credits.
6982    
6983            * Thuban/version.py: Added new 'versions' dictionary which
6984            contains the verions of various libraries which are checked
6985            when the module loads.
6986            (verify_versions): Check all version numbers and returns
6987            a list of errors.
6988    
6989            * Thuban/UI/classifier.py (Classifier.__EnableButtons):
6990            Reset the status of the buttons as the situation warrants,
6991            but in a better more reliable way by not relying on the
6992            current status to determine what needs to change.
6993    
6994            * Thuban/UI/main.py (wxCHECK_VERSION): Removed. Not needed.
6995            (verify_versions): Remove most of the code since it is
6996            now in Thuban.version.verify_versions.o
6997    
6998            * Thuban/UI/mainwindow.py (MainWindow.About): Call new
6999            About box in Thuban.UI.about.
7000    
7001            * extensions/thuban/gdalwarp.cpp (get_gdal_version): New.
7002            Returns the version of gdal library being used as a string.
7003    
7004            * extensions/thuban/wxproj.cpp (check_version, check_version_gtk):
7005            Removed.
7006            (get_proj_version): Return the version of PROJ that the file
7007            was compiled with.
7008            (get_gtk_version): Return th version of GTK that the file
7009            was compiled with.
7010    
7011    2003-06-25  Jonathan Coles   <[email protected]>
7012    
7013            * Thuban/UI/classifier.py (Classifier.EditSymbol): The parent
7014            of the SelectPropertiesDialog should be self so the window
7015            appears on top.
7016            (ClassGroupPropertiesCtrl.DoEdit): The parent
7017            of the SelectPropertiesDialog should be self so the window
7018            appears on top.
7019    
7020            * Thuban/UI/resource.py: Cleaned up how we determine file
7021            extensions.
7022            (GetImageResource): Return an wxImage from our Resources.
7023    
7024    2003-06-24  Jonathan Coles   <[email protected]>
7025    
7026            * Thuban/UI/renderer.py (ExportRenderer.render_legend):
7027            Check that a layer has a classification before trying
7028            to get it. Raster layers don't have classifications.
7029    
7030    2003-06-23  Jonathan Coles   <[email protected]>
7031            
7032            * setup.py: Add Resources/XML to resource list.
7033        
7034    2003-06-23  Jonathan Coles   <[email protected]>
7035    
7036            * setup.cfg: Fix copyright dates
7037        
7038    2003-06-23  Jonathan Coles   <[email protected]>
7039    
7040            * MANIFEST.in: Update with Resources/XML
7041    
7042            * setup.py: Don't include Locale resources yet as we don't
7043            have any and it causes problems building the distribution
7044            for Windows. Update version to 0.8.0.
7045    
7046            * Doc/thuban.dtd: Removed since it is now in Resources/XML.
7047    
7048            * Thuban/UI/mainwindow.py: Add blank line at the end because
7049            file was not being read correctly building the Windows
7050            distribution.
7051    
7052    2003-06-23  Jonathan Coles   <[email protected]>
7053    
7054            * Thuban/UI/mainwindow.py (MainWindow.About): Fix text.
7055    
7056            * Thuban/version.py: Temporarily update longversion for
7057            the 0.8 release so that it doesn't have the cvs revision.
7058    
7059    2003-06-23  Jonathan Coles   <[email protected]>
7060    
7061            * Thuban/UI/common.py (ThubanBeginBusyCursor): Call wxSafeYield
7062            to make sure that we don't create reentrant possibilities with
7063            wxYield.
7064    
7065            * Thuban/UI/view.py (MapCanvas.OnPaint): Call wxBeginBusyCursor()
7066            directly to avoid the wxSafeYield() call which generates an
7067            OnPaint event causing infinite recursion. Don't try to catch
7068            exception anymore. This was for before there were limits on map
7069            scaling.
7070    
7071    2003-06-23  Bernhard Herzog  <[email protected]>
7072    
7073            Bug fix for RT #1961:
7074    
7075            * Thuban/Model/load.py (SessionLoader.start_derivedshapesource):
7076            Register DerivedShapestores with the session
7077    
7078            * Thuban/Model/session.py (Session.Tables): Make sure each table
7079            is only listed once.
7080    
7081            * test/test_load.py (TestJoinedTable.test): Add check_format call.
7082            Update file contents to match the one written out.
7083    
7084    2003-06-20  Bernhard Herzog  <[email protected]>
7085    
7086            * test/xmlsupport.py (SaxEventLister.startElementNS)
7087            (SaxEventLister.endElementNS): Do not include the qname. Python
7088            2.2.1 and 2.2.2 and 2.2.3 differ in this regard. In 2.2.1 qname it
7089            is (presumably incorrectly) None, whereas it's a string with the
7090            element name in the later versions.
7091    
7092            * test/test_xmlsupport.py (TestEventList.test_even_list_simple)
7093            (TestEventList.test_even_list_namespace): Update tests to reflect
7094            the new behaviour
7095            (TestEventList.test_even_list_id_normalization): Fix doc-string
7096    
7097    2003-06-20  Jonathan Coles   <[email protected]>
7098    
7099            * Thuban/Model/layer.py (BaseLayer.HasShapes): New. Overridden
7100            by deriving classes to determine if that layer supports shapes.
7101            (Layer): Override HasShapes and return true.
7102    
7103            * Thuban/UI/classgen.py: Use Thuban[Begin|End]BusyCursor()
7104            instead of a direct call to wx[Begin|End]CusyCursor().
7105            (GenUniquePanel._OnRetrieve): Set busy cursor while retrieving
7106            table data.
7107    
7108            * Thuban/UI/common.py (ThubanBeginBusyCursor, ThubanEndBusyCursor):
7109            New. Wrappers around the wxWindows functions that allow us to
7110            make additional calls such as wxYield which gives the native
7111            system a chance to update the cursor correctly.
7112    
7113            * Thuban/UI/tableview.py: Use Thuban[Begin|End]BusyCursor()
7114            instead of a direct call to wx[Begin|End]CusyCursor().
7115    
7116            * Thuban/UI/view.py: Use Thuban[Begin|End]BusyCursor()
7117            instead of a direct call to wx[Begin|End]CusyCursor().
7118            (MapCanvas.find_shape_at): Check if the current search layer
7119            support shapes, otherwise go on to the next layer.
7120    
7121            * test/test_layer.py: Add tests in each type of layer for
7122            HasClassification() and HasShapes()
7123    
7124    2003-06-20  Jonathan Coles   <[email protected]>
7125    
7126            * Thuban/UI/view.py (MapCanvas.OnPaint): Call wxYield after
7127            turning on the busy cursor to allow the system to change the
7128            cursor before we begin painting. This fixes a problem that
7129            was occuring only under GTK. Fixes RTbug #1840.
7130    
7131    2003-06-20  Bernhard Herzog  <[email protected]>
7132    
7133            * Resources/XML/thuban-0.8.dtd: New DTD for the new file format
7134            version.
7135    
7136            * Thuban/Model/save.py (sort_data_stores): New. Make topological
7137            sort of the data sources so they can be written with sources that
7138            data sources that depend on other data sources come after the
7139            sources they depend on.
7140            (SessionSaver.__init__): Add idmap instance variable to map from
7141            objects to the ids used in the file.
7142            (SessionSaver.get_id, SessionSaver.define_id)
7143            (SessionSaver.has_id): New. Methods to manage the idmap
7144            (SessionSaver.write): Use thuban-0.8.dtd
7145            (SessionSaver.write_session): Add a namespace on the session and
7146            write out the data sources before the maps.
7147            (SessionSaver.write_data_containers): New. Write the data
7148            containers.
7149            (SessionSaver.write_layer): Layer elements now refer to a
7150            shapestore and don't contain filenames anymore.
7151    
7152            * Thuban/Model/load.py (LoadError): Exception class to raise when
7153            errors in the files are discovered
7154            (SessionLoader.__init__): Define dispatchers for elements with a
7155            thuban-0.8 namespace too.
7156            (SessionLoader.check_attrs): New helper method to check and
7157            convert attributes
7158            (AttrDesc): New. Helper class for SessionLoader.check_attrs
7159            (SessionLoader.start_fileshapesource)
7160            (SessionLoader.start_derivedshapesource)
7161            (SessionLoader.start_filetable, SessionLoader.start_jointable):
7162            Handlers for the new elements in the new fileformat
7163            (SessionLoader.start_layer): Handle the shapestore attribute in
7164            addition to filename.
7165            (SessionLoader.start_table, SessionLoader.end_table): Removed.
7166            They were never used in the old formats and aren't needed for the
7167            new.
7168    
7169            * Thuban/Model/session.py (Session.DataContainers): New method to
7170            return all "data containers", i.e. shapestores and tables
7171    
7172            * test/xmlsupport.py (SaxEventLister.__init__)
7173            (SaxEventLister.startElementNS, sax_eventlist): Add support to
7174            normalize IDs.
7175    
7176            * test/test_xmlsupport.py
7177            (TestEventList.test_even_list_id_normalization): New test case for
7178            id normalization
7179    
7180            * test/test_load.py (LoadSessionTest.check_format): Use ID
7181            normalization
7182            (LoadSessionTest.thubanids, LoadSessionTest.thubanidrefs): New
7183            class atrributes used for ID normalization
7184            (TestSingleLayer, TestLayerVisibility, TestLabels.test)
7185            (TestLayerProjection.test, TestRasterLayer.test): Adapt to new
7186            file format
7187            (TestJoinedTable): New test for loading sessions with joined
7188            tables.
7189            (TestLoadError): New. Test whether missing required attributes
7190            cause a LoadError.
7191    
7192            * test/test_save.py (SaveSessionTest.thubanids)
7193            (SaveSessionTest.thubanidrefs): New class attributes for ID
7194            normalization in .thuban files.
7195            (SaveSessionTest.compare_xml): Use id-normalization.
7196            (SaveSessionTest.testEmptySession)
7197            (SaveSessionTest.testLayerProjection)
7198            (SaveSessionTest.testRasterLayer)
7199            (SaveSessionTest.testClassifiedLayer): Adapt to new file format.
7200            (SaveSessionTest.testLayerProjection): The filename used was the
7201            same as for testSingleLayer. Use a different one.
7202            (SaveSessionTest.test_dbf_table)
7203            (SaveSessionTest.test_joined_table): New test cases for saving the
7204            new data sources structures.
7205            (TestStoreSort, MockDataStore): Classes to test the sorting of the
7206            data stores for writing.
7207    
7208            * test/runtests.py: Add CVS keywords
7209    
7210    2003-06-20  Jonathan Coles   <[email protected]>
7211    
7212            * test/test_session.py
7213            (UnreferencedTablesTests.test_unreferenced_tables_with_joins):
7214            Use the cultural_landmark-point.dbf file for the store so that
7215            the table rows and shape count match.
7216    
7217    2003-06-20  Jonathan Coles   <[email protected]>
7218    
7219            * Thuban/Model/data.py (DerivedShapeStore.__init__): Raise
7220            an exception if the number of shapes is different from the
7221            number of rows in the table. Address RTbug #1933.
7222    
7223            * test/test_layer.py (TestLayer.test_derived_store): Add
7224            a test for the new exception in DerivedShapeStore.__init__.
7225    
7226            * test/support.py (FloatTestCase): Removed since there is
7227            already FloatComparisonMixin. Fixes RTbug #1954.
7228            (FloatComparisonMixin.assertFloatEqual): Include test for
7229            infinity that was part of FloatTestCase.
7230    
7231            * test/test_range.py (RangeTest): Inherit from
7232            support.FloatComparisonMixin now that we don't have
7233            support.FloatTestCase.
7234    
7235    2003-06-20  Bernhard Herzog  <[email protected]>
7236    
7237            * test/test_save.py (SaxEventLister, sax_eventlist): Removed. Use
7238            the implementation in xmlsupport instead.
7239            (SaveSessionTest.compare_xml): sax_eventlist is now in xmlsupport
7240    
7241            * test/test_proj.py: Import sax_eventlist from xmlsupport instead
7242            of test_save
7243    
7244    2003-06-20  Bernhard Herzog  <[email protected]>
7245    
7246            * test/test_load.py (LoadSessionTest.check_format): New helper
7247            method to make sure the test files we load might have been written
7248            by the current thuban version.
7249            (ClassificationTest.TestLayers, TestSingleLayer.test)
7250            (TestLayerVisibility.test, TestClassification.test)
7251            (TestLabels.test, TestLayerProjection.test, TestRasterLayer.test):
7252            Add check_format() calls and fix the thuban data to match the data
7253            that would be written by saving the session loaded from it.
7254    
7255            * test/xmlsupport.py (SaxEventLister, sax_eventlist): Copies of
7256            the same class and function in test_save.
7257    
7258            * test/test_xmlsupport.py (TestEventList): New. test cases for
7259            sax_eventlist
7260    
7261    2003-06-20  Bernhard Herzog  <[email protected]>
7262    
7263            * Resources/XML/thuban.dtd: Add comment about which versions of
7264            Thuban are covered by this DTD
7265            (map): Fix content model for layers and raster layers. There can
7266            be any number or layers and raster layers in any order.
7267    
7268    2003-06-20  Jonathan Coles   <[email protected]>
7269    
7270            This is mainly about fixing RTbug #1949.
7271    
7272            * Thuban/Model/classification.py: Remove "from __future__"
7273            import statement since python 2.2 is the earliest supported
7274            version.
7275    
7276            * Thuban/Model/proj.py (Projection.GetProjectedUnits): New.
7277            Currently returns PROJ_UNITS_METERS or PROJ_UNITS_DEGREES
7278            depending on the units this projection *forwards* into.
7279    
7280            * Thuban/Model/save.py (SessionSaver.write_classification):
7281            Remove unnecessary use of lambdas and nested functions.
7282    
7283            * Thuban/UI/legend.py (ScaleBarBitmap.__SetScale): Do scale
7284            adjustment here if the map projection uses degrees.
7285    
7286            * Thuban/UI/scalebar.py (ScaleBar.DrawScaleBar): Remove
7287            scale adjust code since it is now done before calling
7288            this method. Don't do anything if the map projection
7289            is None.
7290    
7291    2003-06-19  Bernhard Herzog  <[email protected]>
7292    
7293            Move version specific load tests to their own file.
7294    
7295            * test/test_load.py: Expand the doc-string to explain a bit how to
7296            handle file format changes.
7297            (TestClassification.test): Update the docstring as this test is
7298            not about Thuban 0.2 anymore.
7299    
7300            * test/test_load_0_2.py: New file with the load tests for thuban
7301            files created with Thuban 0.2 and earlier.
7302    
7303    2003-06-19  Bernhard Herzog  <[email protected]>
7304    
7305            Add XML validation to some of the tests. Validation will only be
7306            done if pyRXP is installed (http://reportlab.com/xml/pyrxp.html).
7307            To make the DTD available to the test cases it's moved into
7308            Resources/XML
7309    
7310            * Resources/XML/thuban.dtd: New. This is now the real Thuban DTD
7311            for versions up to and including 0.2. Two slight changes: added an
7312            encoding specification and fixed the comment which refered to
7313            GRASS, not Thuban
7314    
7315            * test/xmlsupport.py: New support module for tests involving XML.
7316            Currently there's a mix-in class for XML validation.
7317    
7318            * test/test_xmlsupport.py: New. Tests for the xmlsupport module
7319    
7320            * test/test_save.py (SaveSessionTest): Derive from ValidationTest
7321            so that we can validate the
7322            (SaveSessionTest.testEmptySession)
7323            (SaveSessionTest.testSingleLayer)
7324            (SaveSessionTest.testSingleLayer)
7325            (SaveSessionTest.testLayerProjection)
7326            (SaveSessionTest.testRasterLayer)
7327            (SaveSessionTest.testClassifiedLayer): Validate the generated XML
7328    
7329            * test/runtests.py (main): Call print_additional_summary instead
7330            of print_garbage_information
7331    
7332            * test/support.py (resource_dir): New function to return the
7333            "Resource" subdirectory
7334            (print_additional_summary): New function to combine several
7335            summary functions
7336            (run_tests): Use print_additional_summary instead of calling
7337            print_garbage_information directly
7338    
7339    2003-06-19  Bernhard Herzog  <[email protected]>
7340    
7341            * Doc/thuban.dtd (classification): Correct the content model of
7342            the classification element.
7343            (projection): Add the "name" attribute
7344    
7345    2003-06-19  Frank Koormann   <[email protected]>
7346    
7347            MERGE from the greater-ms3 branch.
7348    
7349            * Thuban/UI/scalebar.py (ScaleBar.DrawScaleBar): Apply conversion to
7350            scale if projection is latlong to get better estimate.
7351    
7352            Fix problem of hidden properties dialog under windows after double
7353            click on layer tree:
7354            The tree control always gets an Expanded / Collapsed event after
7355            the ItemActivated  on double click, which raises the main window again.
7356            We add a second ItemActivated event to the queue, which simply
7357            raises the already displayed window.
7358    
7359            * Thuban/UI/legend.py (LegendTree.__init__): Instance variable
7360            raiseProperties initialized to prevent endless loops
7361            (LegendTree._OnItemActivated): Depending on self.raiseProperties
7362            simply raise the properties or open the dialog and issue a second
7363            event.
7364    
7365    2003-06-18  Jonathan Coles   <[email protected]>
7366    
7367            * setup.py: Fix a few problems that occured under Windows.
7368    
7369    2003-06-18  Jonathan Coles   <[email protected]>
7370    
7371            When Thuban loaded the map was redrawn twice because the
7372            legend was being opened after the mainwindow was created
7373            and not during its creation. This meant the map was drawn
7374            initially and then had to be redrawn when the legend
7375            caused the display to change. Now the legend is opened
7376            in the mainwindow constructor which resolves this issue.
7377    
7378            Also, although we were checking for the existence of
7379            gdal and gdalwarp modules, the gdalwarp extension was
7380            still being compiled (which may fail if the system doesn't
7381            have gdal installed). the build_ext command to setup.py
7382            now accepts the flags --with-gdal and --without-gdal.
7383            If --without-gdal is specified setup.py will try to
7384            use the gdal parameters specified by gdal-config. Under
7385            windows, those parameters have to be set in setup.py
7386            as with proj4 an wxWindows.
7387    
7388            * setup.py: Use a list instead of seperate variables for
7389            extension parameters so we can create a generic function
7390            that runs an appropriate *-config script.
7391            (run_cs_script): Renamed from run_wx_script and modified
7392            to accept a second argument which is a list of lists to
7393            be filled in by the values returned from running the command.
7394            (thuban_build_ext): New. Extends the build_ext command and
7395            provides the options --with-gdal/--without-gdal which then
7396            optionally includes the gdalwarp extension.
7397    
7398            * Thuban/Model/resource.py: First check if we can import
7399            the gdalwarp Thuban extension before checking for gdal.
7400            Also added some comments.
7401            
7402            * Thuban/UI/legend.py (ScaleBarBitmap.__SetScale): Check if
7403            the map is None which may be the case if none has been loaded
7404            yet.
7405    
7406            * Thuban/UI/main.py (main): Remove call to ShowLegend.
7407    
7408            * Thuban/UI/mainwindow.py (MainWindow.__init__): Call ShowLegend().
7409    
7410            * Thuban/UI/renderer.py: Check for gdal support before importing
7411            gdalwarp.
7412            (MapRenderer.render_map): Only try to optimize if we have gdal
7413            support otherwise nothing will get drawn.
7414    
7415            * Thuban/UI/view.py (MapCanvas.FitMapToWindow): This may be called
7416            during startup before a map has been created. Check if map is None
7417            before using it and do nothing if it is.
7418    
7419    2003-06-17  Jonathan Coles   <[email protected]>
7420    
7421            Fix the problem with raster layers under Windows that caused
7422            Thuban to crash. The view should respond to layer projection
7423            changed events to update the display. Changes to a projection
7424            should not cause the map to be set to full extent.
7425            
7426            * Thuban/UI/view.py (MapCanvas.__init__): New instance variable
7427            current_map_proj to remember the current map projection so that
7428            when the projection changes we know what the previous projection
7429            was.
7430            (MapCanvas.SetMap): Unsubscribe and subscribe to
7431            LAYER_PROJECTION_CHANGED events.
7432            (MapCanvas.projection_changed): Split into two methods that respond
7433            to map and layer projection changes.
7434            (MapCanvas.map_projection_changed): New. Takes the current view and
7435            projects it using the new projection. This does not cause the
7436            map to be redrawn at full extent.
7437            (MapCanvas.layer_projection_changed): New. Cause a redraw which
7438            will draw each layer in its new projection.
7439            
7440            * extensions/thuban/bmpdataset.cpp (BMPDataset::Open): Call
7441            VSIFClose() not VSIFCloseL() to close the file. Fixes a crash
7442            under Windows.
7443            
7444            * extensions/thuban/gdalwarp.cpp (MFILENAME): Padding should be
7445            to twice sizeof(void*) because there are two digits for each
7446            hex byte.
7447    
7448    2003-06-16  Bernhard Herzog  <[email protected]>
7449    
7450            Update to the layer interface: Direct access to the table,
7451            shapetable, shapefile and filename attributes is now actively
7452            deprecated by issuing deprecation warnings for all places where
7453            this happens.
7454    
7455            * Thuban/Model/layer.py (Layer.__getattr__): New. Implement access
7456            to the instance variables table, shapetable, shapefile and
7457            filename via __getattr__ so that we can issue a deprecation
7458            warning.
7459            (Layer.SetShapeStore): Don't set the deprecated instance variables
7460            any more
7461            (Layer.SetShapeStore): Don't use deprecated layer instance
7462            variables
7463            (Layer.Destroy): No need to explicitly remove the instance
7464            variables any more
7465            (Layer.GetFieldType, Layer.Shape): Don't use deprecated layer
7466            instance variables
7467    
7468            * Thuban/UI/classgen.py (ClassGenDialog.__init__)
7469            (GenUniformPanel._OnRetrieve, GenUniquePanel._OnRetrieve)
7470            (GenQuantilesPanel.GetList, GenQuantilesPanel.OnRetrieve): Don't
7471            use deprecated layer instance variables
7472    
7473            * Thuban/UI/classifier.py (Classifier.__init__): Don't use
7474            deprecated layer instance variables
7475    
7476            * Thuban/UI/identifyview.py (IdentifyListCtrl.selected_shape)
7477            (IdentifyGridCtrl.selected_shape): Don't set the deprecated layer
7478            instance variables
7479    
7480            * Thuban/UI/tableview.py (LayerTableGrid.select_shapes): Don't use
7481            deprecated layer instance variables
7482    
7483            * Thuban/UI/mainwindow.py (MainWindow.LayerShowTable): Don't use
7484            deprecated layer instance variables
7485    
7486            * Thuban/Model/save.py (SessionSaver.write_layer): Don't use
7487            deprecated layer instance variables
7488    
7489            * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer)
7490            (MapRenderer.polygon_render_param): Don't use deprecated layer instance
7491            variables
7492    
7493            * test/runtests.py (main): Turn Thuban's deprecation warnings into
7494            errors so that they're cought by the tests
7495    
7496            * test/test_load.py (TestSingleLayer.test): Don't use deprecated
7497            layer instance variables
7498    
7499    2003-06-16  Jonathan Coles   <[email protected]>
7500    
7501            Fix a problem under Windows whereby if the user double-clicks on a
7502            layer in the legend that tree item will expand or collapse as well
7503            as open the layer properties dialog. The state of the tree item
7504            should not be affected.
7505    
7506            * Thuban/UI/legend.py (LegendTree.__init__): Add instance variable
7507            preventExpandCollapse and subscribe to expanding and collapsing
7508            events.
7509            (LegendTree.OnItemExpandCollapse): New. Responds to expanding and
7510            collapsing events and will veto the event if it has been triggered
7511            by the user double clicking on a layer.
7512            (LegendTree._OnItemActivated): Set preventExpandCollapse to indicate
7513            that an expanding/collapsing event should be vetoed.
7514    
7515    2003-06-13  Bernhard Herzog  <[email protected]>
7516    
7517            * Thuban/UI/classifier.py (Classifier.OnClose)
7518            (Classifier.map_layers_removed)
7519            (Classifier.layer_shapestore_replaced): Unsubscribe the messages
7520            in OnClose and not in map_layers_removed or
7521            layer_shapestore_replaced to make sure it always happens when the
7522            dialog is closed
7523    
7524    2003-06-13  Jonathan Coles   <[email protected]>
7525    
7526            This puts back a fix for Windows where a panel is needed so that
7527            the background of the table view appears correctly.
7528    
7529            * Thuban/UI/tableview.py (TableFrame.__init__): Add a panel
7530            object that can be used by derived classes to place any
7531            controls (including the grid) onto.
7532            (QueryTableFrame.__init__): Use the panel as the parent window
7533            for all the controls. Reparent the grid so that the panel is
7534            the parent. Call UpdateStatusText() to correctly initialize
7535            the status bar.
7536    
7537    2003-06-13  Jonathan Coles   <[email protected]>
7538    
7539            * Thuban/UI/dialogs.py (ThubanFrame): New: a class that inherits
7540            from wxFrame (as opposed to wxDialog like the other classes)
7541            but otherwise behaves like the other classes. This is needed
7542            for the TableView which isn't really a dialog and needs to
7543            have a status bar and control buttons.
7544    
7545            * Thuban/UI/tableview.py (TableGrid.__init__): Create an
7546            instance variable to keep track of how many rows are selected.
7547            Subscribe once to the the events we are interested in.
7548            (ThubanGrid.OnRangeSelect): Only handle event if event handling
7549            hasn't been turned off.
7550            (ThubanGrid.OnSelectCell): Only handle event if event handling
7551            hasn't been turned off.
7552            (ThubanGrid.ToggleEventListeners): Rather than subscribe None
7553            as an event listener (which changes the event handler stack)
7554            simply set an instance variable to False. This is checked in
7555            the event handlers.
7556            (ThubanGrid.GetNumberSelected): Return the number of currently
7557            selected rows.
7558            (TableFrame): Inherit from ThubanFrame so we can have a
7559            status bar and control buttons.
7560            (QueryTableFrame.__init__): Create a status bar. Fixes RTbug #1942.
7561            Explicitly set which items are selected in the operator choice and
7562            action choice so there is always a valid selection. Fixes RTbug #1941.
7563            Subscribe to grid cell selection events so we can update the
7564            status bar.
7565            (QueryTableFrame.UpdateStatusText): Update the status bar with
7566            how many rows are in the grid, how many columns, and how many
7567            rows are selected.
7568            (QueryTableFrame.OnGridSelectRange, QueryTableFrame.OnGridSelectCell):
7569            Call UpdateStatusText when cells are (de)selected.
7570            (QueryTableFrame.OnQuery): Use the string value in the value
7571            combo if either the selected item index is 0 or if the string
7572            cannot be found in the predefined list (this happens if the
7573            user changes the text). Fixes RTbug #1940.
7574            Only turn off the grid event listeners if there a query comes
7575            back with a none empty list of ids. in the case that the list
7576            is empty this causes a grid.ClearSelection() call to actually
7577            clear the grid selection which causes the selected items in
7578            the map to be deselected. Fixes RTbug #1939.
7579    
7580            * test/test_save.py (XMLWriterTest.Encode): Check return values.
7581            Fixes RTbug #1851.
7582    
7583    2003-06-13  Bernhard Herzog  <[email protected]>
7584    
7585            * Thuban/UI/identifyview.py (IdentifyView.__init__): Call
7586            self.selected_shape with the current selection to make sure the
7587            contents of the dialog are up to date when it's shown for the
7588            first time.
7589            The dialog used to work without this by luck. The recent fix to
7590            the connector module 'broke' a 'feature' the identify view was
7591            relying on, i.e that subscribing to a message in response to
7592            receiving a message of that type would mean that the new
7593            subscriber would also be called for the same message.
7594            
7595    2003-06-12  Jonathan Coles   <[email protected]>
7596    
7597            * extensions/thuban/gdalwarp.cpp: Removed debug printing as
7598            the image is rendered. Fixes RTbug #1937.
7599    
7600    2003-06-12  Jonathan Coles   <[email protected]>
7601    
7602            * Thuban/Lib/fileutil.py: As is done under Windows, create the
7603            user directory if it doesn't exist on a posix system.
7604            Fixes RTbug #1815.
7605    
7606            * Thuban/Model/resource.py (get_user_proj_files): Moved the
7607            called to get_application_dir here, so that the directory
7608            will only be called if this method is invoked.
7609    
7610            * Thuban/UI/projdialog.py (ProjFrame.__DoOnProjAvail): Clear
7611            the projfilepath if no projection is selected.
7612    
7613    2003-06-12  Jonathan Coles   <[email protected]>
7614    
7615            * Thuban/UI/legend.py (ScaleBarBitmap.__SetScale): Don't draw
7616            the scalebar if the current map has no projection set.
7617    
7618            * Thuban/UI/projdialog.py (ProjFrame.__DoOnProjAvail): Set the
7619            projfilepath label to just the basename of the projection file
7620            rather than include the entire path.
7621    
7622            * Thuban/Model/resource.py: Fix missed proj functions that
7623            needed to be renamed.
7624    
7625    2003-06-12  Jonathan Coles   <[email protected]>
7626    
7627            * Thuban/Model/classification.py: Removed assert statements that
7628            tested if the variable was an instance of Color.
7629    
7630            * Thuban/Model/color.py (Color): Remove commented code that isn't
7631            used.
7632            (Transparent): Renamed from NoColor. Doesn't inherit from Color.
7633            Fixes RTbug #1835.
7634            (Transparent.__eq__, Transparent.__ne, Transparent.__repr): New.
7635            Needed now that the class doesn't inherit from Color.
7636    
7637    2003-06-12  Jonathan Coles   <[email protected]>
7638    
7639            * test/test_save.py (XMLWriterTest.testEncode): Explicitly
7640            check unicode strings.
7641    
7642            * test/test_layer.py: Check for existence of gdal.
7643    
7644    2003-06-12  Jonathan Coles   <[email protected]>
7645        
7646            * Thuban/Model/xmlreader.py: New. Contains the XMLReader class
7647            that was in load.py
7648    
7649            * Thuban/Model/xmlwriter.py: New. Contains the XMLWriter class
7650            that was in save.py
7651    
7652    2003-06-12  Jonathan Coles   <[email protected]>
7653    
7654            This is largely a collection of bug fixes. We also handle the
7655            case where gdal is not on the system. The XMLReader and XMLWriter
7656            classes were moved into there own files to resolve some circular
7657            import references and because they shouldn't really be in the
7658            file that is dediciated to reading/writing session files since
7659            they are also used elsewhere.
7660    
7661            * Thuban/Model/classgen.py: Renamed functions to follow the
7662            function_names_with_underscores style. Fixes RTbug #1903.
7663            (calculate_quantiles): Raise ValueError if 'percents' is invalid.
7664    
7665            * Thuban/Model/layer.py: Import gdal only if it available.
7666            (RasterLayer): Handle the case where the gdal library is unavailable.
7667            Addresses RTbug #1877.
7668    
7669            * Thuban/Model/load.py (XMLReader): Moved into seperate file
7670            xmlreader.py.
7671    
7672    2003-06-12  Jonathan Coles   <[email protected]>
7673    
7674            This is largely a collection of bug fixes. We also handle the
7675            case where gdal is not on the system. The XMLReader and XMLWriter
7676            classes were moved into there own files to resolve some circular
7677            import references and because they shouldn't really be in the
7678            file that is dediciated to reading/writing session files since
7679            they are also used elsewhere.
7680    
7681            * Thuban/Model/classgen.py: Renamed functions to follow the
7682            function_names_with_underscores style. Fixes RTbug #1903.
7683            (calculate_quantiles): Raise ValueError if 'percents' is invalid.
7684    
7685            * Thuban/Model/layer.py: Import gdal only if it available.
7686            (RasterLayer): Handle the case where the gdal library is unavailable.
7687            Addresses RTbug #1877.
7688    
7689            * Thuban/Model/load.py (XMLReader): Moved into seperate file
7690            xmlreader.py.
7691    
7692            * Thuban/Model/save.py (escape, XMLWriter): Moved into seperate
7693            file xmlwriter.py.
7694    
7695            * Thuban/Model/resource.py: Renamed functions to following the
7696            function_names_with_underscores style.
7697            (has_gdal_support): New function that returns true if the gdal
7698            library is available. Addresses RTbug #1877.
7699    
7700            * Thuban/UI/application.py (ThubanApplication.OpenSession):
7701            Display a message box if the gdal library is not available, but
7702            only if there are any layers that would use it. Addresses RTbug #1877.
7703    
7704            * Thuban/UI/classgen.py: Use renamed projection resource functions.
7705            (GenUniformPanel.__CalcStepping): Fix a slight discrepency
7706            when using integers versus floats.
7707    
7708            * Thuban/UI/mainwindow.py (_has_gdal_support): New. Used to
7709            determine if the "Add Image Layer" menu option should be
7710            greyed out or not. Addresses RTbug #1877.
7711    
7712            * Thuban/UI/projdialog.py: Use renamed projection resource functions.
7713    
7714            * Thuban/UI/renderer.py (MapRenderer.render_map): Only try to
7715            optimize if a raster layer is visible. Fixes RTbug #1931.
7716            Only draw the raster layer if the gdal library is available.
7717            Addresses RTbug #1877.
7718    
7719            * test/test_classgen.py: Add tests for generate_singletons,
7720            generate_uniform_distribution, generate_quantiles. Fixes RTbug #1903.
7721            (test_calculate_quantiles): Fix some tests to catch the new
7722            ValueError that is raised.
7723    
7724            * test/test_proj.py: Use renamed projection resource functions.
7725    
7726            * test/test_save.py (SaveSessionTest.testClassifiedLayer): New
7727            test for saving classified layers. Fixes RTbug #1902.
7728            (XMLWriterTest): New. Tests the XMLWriter class. Fixes RTbug #1851.
7729    
7730    2003-06-12  Jan-Oliver Wagner <[email protected]>
7731    
7732            Fix for http://intevation.de/rt/webrt?serial_num=1900.
7733    
7734            * Thuban/UI/multiplechoicedialog.py: New. A multiple choice dialog.
7735    
7736            * Thuban/UI/mainwindow.py: import wxMultipleChoiceDialog from
7737            multiplechoicedialog.py rather than from the wxPython library.
7738    
7739    2003-06-11  Frank Koormann  <[email protected]>
7740    
7741            * Thuban/Lib/fileutil.py (get_application_dir): Minor stability
7742            update.
7743    
7744    2003-06-11  Frank Koormann  <[email protected]>
7745    
7746            * Thuban/Lib/fileutil.py (get_application_dir): New function to
7747            determine the absolute .thuban/thuban directory under
7748            "posix" (os.expanduser) and "nt" (read AppData registry key).
7749    
7750            * Thuban/Model/resource.py: Use get_application_dir
7751    
7752            * Thuban/UI/application.py (ThubanApplication.read_startup_files):
7753            Use get_application_dir.
7754    
7755    2003-06-10  Bernhard Herzog  <[email protected]>
7756    
7757            * Thuban/UI/tableview.py (LayerTableFrame.__init__): Subscribe to
7758            the messages MAP_LAYERS_REMOVED messages
7759            (LayerTableFrame.OnClose): Unsubscribe from it.
7760            (LayerTableFrame.map_layers_removed): New. Receiver for
7761            MAP_LAYERS_REMOVED. Close the dialog when the layer whose the
7762            dialog is showing is removed.
7763    
7764    2003-06-10  Bernhard Herzog  <[email protected]>
7765    
7766            * Thuban/Lib/connector.py (Connector.Issue): Iterate over a copy
7767            of the receivers list so that unsubscribing in a receiver doesn't
7768            modify it while iterating over it.
7769    
7770            * test/test_connector.py
7771            (ConnectorTest.test_disconnect_in_receiver): New. Test whether
7772            unsubscribing in a receiver works correctly. See docstring for
7773            details
7774    
7775    2003-06-10  Bernhard Herzog  <[email protected]>
7776    
7777            * Thuban/Model/messages.py (LAYER_SHAPESTORE_REPLACED): New
7778            message.
7779    
7780            * Thuban/Model/layer.py (Layer.SetShapeStore): Send
7781            LAYER_SHAPESTORE_REPLACED when the shapestore changes. A
7782            LAYER_CHANGED will still be sent if the classification changes.
7783    
7784            * Thuban/UI/classifier.py (Classifier.__init__): Add the map as
7785            parameter so we can subscribe to some of its messages
7786            (Classifier.__init__): Subscribe to the map's MAP_LAYERS_REMOVED
7787            and the layer's LAYER_SHAPESTORE_REPLACED
7788            (Classifier.unsubscribe_messages): New. Unsubscribe from message
7789            subscribed to in __init__
7790            (Classifier.map_layers_removed)
7791            (Classifier.layer_shapestore_replaced): receivers for the messages
7792            subscribed to in __init__. Unsubscribe and close the dialog
7793    
7794            * Thuban/UI/mainwindow.py (MainWindow.OpenLayerProperties): Pass
7795            the map to the Classifier dialog
7796    
7797            * test/test_layer.py (SetShapeStoreTests): Derive from
7798            SubscriberMixin as well so we can test messages
7799            (SetShapeStoreTests.setUp): Subscribe to some of the layer's
7800            messages
7801            (SetShapeStoreTests.tearDown): Clear the messages again
7802            (SetShapeStoreTests.test_sanity): Expand the doc-string and check
7803            for the modified flag too
7804            (SetShapeStoreTests.test_set_shape_store_modified_flag): New test
7805            to check whether SetShapeStore sets the modified flag
7806            (SetShapeStoreTests.test_set_shape_store_different_field_name)
7807            (SetShapeStoreTests.test_set_shape_store_same_field)
7808            (SetShapeStoreTests.test_set_shape_store_same_field_different_type):
7809            Add tests for the messages. This checks both the new
7810            LAYER_SHAPESTORE_REPLACED and the older LAYER_CHANGED
7811    
7812    2003-06-06  Jan-Oliver Wagner <[email protected]>
7813    
7814            * Thuban/UI/mainwindow.py: Improved and partly added help texts for
7815            the menu items.
7816    
7817    2003-06-05  Frank Koormann  <[email protected]>
7818    
7819            * Thuban/UI/identifyview.py (IdentifyView.__init__):
7820            Layout reimplemented without panel. Make life easier to fit the list
7821            in the dialog.
7822    
7823    2003-06-05  Frank Koormann  <[email protected]>
7824    
7825            * Thuban/UI/projdialog.py (ProjFrame.__init__): Fill the projchoice
7826            once on initialisation (Former implementation resulted in multiple
7827            entries for each projection).
7828            (ProjFrame.__FillAvailList): selectProj as second optional parameter,
7829            if set, select the projection found under the specified name. This
7830            overwrites any other selection estimate.
7831            Removed projchoice filling from this method.
7832            (ProjFrame._OnSave, ProjFrame._OnAddToList):
7833            Updated call of ProjFrame.__FillAvailList
7834            (LCCPanel._DoLayout): Moved parameter controls in more common order.
7835    
7836            * Resources/Projections/defaults.proj: Extended defaults representing
7837            various common European projections.
7838    
7839    2003-06-05  Frank Koormann  <[email protected]>
7840    
7841            * Thuban/UI/identifyview.py (IdentifyView.__init__):
7842            Use ListCtrl instead of GridCtrl
7843    
7844            * Thuban/Model/resource.py:
7845            Guess location of .thuban directory from tempdir parent directory.
7846    
7847            * Thuban/UI/application.py (ThubanApplication.read_startup_files):
7848            Guess location of .thuban directory from tempdir parent directory.
7849    
7850    2003-06-04  Bernhard Herzog  <[email protected]>
7851    
7852            Do not cache the values returned by the tree widget's
7853            GetFirstChild and GetNextChild methods because it led to lots of
7854            segfaults. The new way requires more brute force but is more
7855            reliable.
7856    
7857            * Thuban/UI/legend.py (LegendTree.__init__): Remove instance
7858            variable layer2id
7859            (LegendTree.find_layer): New method to do with brute force what
7860            layer2id tried to accomplish
7861            (LegendTree._OnMsgLayerChanged)
7862            (LegendTree._OnMsgLayerTitleChanged, LegendTree.__ShowHideLayer):
7863            Use find_layer instead of layer2id
7864            (LegendTree.__RemoveLayer, LegendTree.__AddLayer): No need to
7865            update layer2id anymore
7866            (LegendTree._OnMsgMapLayersRemoved)
7867            (LegendTree._OnMsgMapLayersAdded): Get by without layer2id.
7868    
7869    2003-06-03  Thomas Koester  <[email protected]>
7870    
7871            * Thuban/Model/classgen.py (GenQuantiles0): New function.
7872    
7873    2003-06-02  Bernhard Herzog  <[email protected]>
7874    
7875            * Thuban/UI/mainwindow.py (layer_rename command, table_rename command):
7876            New commands.
7877            (main_menu): Add the new commands.
7878            (MainWindow.TableRename): New. Implementation of the table_rename
7879            command.
7880            (MainWindow.RenameLayer): New. Implementation of the layer_rename
7881            command.
7882    
7883            * Thuban/Model/session.py (Session.AddTable): call self.changed to
7884            set the modified flag
7885    
7886            * test/test_session.py (TestSessionSimple.test_add_table): Test
7887            whether the modified flag is set properly
7888    
7889            * Thuban/Model/base.py (TitledObject.SetTitle): Call changed
7890            instead of issue so that the modified flags get updated.
7891    
7892            * test/test_base.py (SomeTitledObject): Derive from Modifiable
7893            instead of Publisher to reflect reality better and to accomodate
7894            the fact that SetTitle now calls changed instead of issue
7895    
7896    2003-06-02  Bernhard Herzog  <[email protected]>
7897    
7898            * Thuban/UI/classgen.py (GenQuantilesPanel.GetList): Resource
7899            acquisition has to happen before the try in a try-finally.
7900    
7901    2003-06-02  Bernhard Herzog  <[email protected]>
7902    
7903            * Thuban/UI/legend.py (LegendTree._OnMsgMapLayersRemoved): It's
7904            possible that a layer is removed that is not currently selected in
7905            the legend so don't check for this.
7906    
7907    2003-05-30  Bernhard Herzog  <[email protected]>
7908    
7909            * Thuban/Model/layer.py (Layer.Destroy): Set all instance
7910            variables to None that have direct or indirect references to
7911            shapefiles or dbf files to make sure that they do go away and the
7912            files are closed.
7913    
7914    2003-05-30  Bernhard Herzog  <[email protected]>
7915    
7916            * Thuban/UI/legend.py (LegendTree.GetRootItem): Reset
7917            availImgListIndices when a new image list is created
7918            
7919    2003-05-30  Bernhard Herzog  <[email protected]>
7920    
7921            * Thuban/UI/legend.py (LegendTree.__init__): New instance variable
7922            changing_selection to indicate whether the LegendTree code itself
7923            is currently changing the selection
7924            (LegendTree.normalize_selection): New method to normalize the
7925            selection by selecting the layer item even if the user clicked on
7926            the classification.
7927            (LegendTree._OnSelChanged): normalize the selection. This works
7928            around a bug in wx which doesn't keep track of the selection
7929            properly when subtrees are deleted.
7930    
7931    2003-05-30  Bernhard Herzog  <[email protected]>
7932    
7933            * Thuban/UI/view.py (MapCanvas.set_view_transform): Limit the
7934            maximum and minimum scale factors.
7935    
7936            * test/test_classgen.py (ClassGenTest.test): Update to reflect the
7937            changes in classgen.py
7938    
7939    2003-05-30  Jonathan Coles   <[email protected]>
7940    
7941            * Thuban/Model/classgen.py: Remove ClassGenerator class but make
7942            all the methods functions. Fixes RTBug #1903.
7943    
7944            * Thuban/Model/map.py (Map.TopLayer, Map.BottomLayer): Renamed
7945            to MoveLayerToTop and MoveLayerToBottom respectively. Fixes
7946            RTBug #1907.
7947    
7948            * Thuban/UI/classgen.py: Use classgen functions that were part
7949            of the ClassGenerator class. Put try/finally blocks around
7950            code that uses wxBeginBusyCursor()/wxEndBusyCursor(). Fixes
7951            RTBug #1904.
7952    
7953            * Thuban/UI/classifier.py: Remove unused import of ClassGenerator.
7954    
7955            * Thuban/UI/legend.py: The legend was cleared and repopulated any
7956            time something changed which caused some state to be lost such
7957            as which children were expanded or collapsed. Fixes RTBug #1901.
7958            (LegendTree._OnMsgMapLayersAdded): Add only new layers.
7959            (LegendTree.__OnMsgMapLayersRemoved): Remove layers that exist in
7960            the legend but not in the map.
7961            (LegendTree.__FillTree): Move main functionality out into smaller
7962            methods that can be used by other methods.
7963            (LegendTree.__FillTreeLayer): Reuse old slots in the image list
7964            if they are available.
7965            (LegendTree.DeleteAllItems): Renamed from __DeleteAllItems so
7966            that we override the wxTreeCtrl method. Iterate over children
7967            and call __RemoveLayer.
7968            (LegendTree.__AddLayer): New. Add a new layer to the legend.
7969            (LegendTree.__RemoveLayer): Remove a layer from the legend.
7970            (LegendTree.DeleteChildren): New, overrides wxTreeCtrl method.
7971            Should only be called with the id of a layer branch.
7972            (LegendTree.GetRootItem): New, overrides wxTreeCtrl method.
7973            Returns the root item or creates one if necessary.
7974    
7975            * Thuban/UI/renderer.py (MapRenderer.draw_raster_layer): Call
7976            ProjectRasterFile with tuple arguments instead of strings.
7977    
7978            * Thuban/UI/tableview.py (QueryTableFrame.OnQuery): Wrap code
7979            with try/finally. Fixes RTBug #1904.
7980    
7981            * Thuban/UI/view.py (MapCanvas.OnPaint): Wrap code
7982            with try/finally. Fixes RTBug #1904.
7983            (MapCanvas.FitSelectedToWindow): If a single point is selected
7984            simply center it on the display. Fixes RTBug #1849.
7985    
7986            * extensions/thuban/gdalwarp.cpp: Removed code that allowed gdalwarp
7987            to be compiled as a standalone app. Now the code can only be
7988            called from Python which simplifies the parameter passing.
7989            (ProjectRasterFile): Handle Python arguments. Remove code that
7990            checks for a destination dataset. Add more clean up code.
7991    
7992            * test/test_map.py (TestMapWithContents.test_raise_layer_top,
7993            TestMapWithContents.test_lower_layer_bottom):
7994            Test Map.MoveLayerToTop() and Map.MoveLayerToBottom() respectively.
7995            Fixes RTBug #1907.
7996    
7997            * Thuban/UI/mainwindow.py (MainWindow.ToggleLegend): Apply a full
7998            extent to the map when the legend is toggled. Fixes RTBug #1881.
7999    
8000    2003-05-29  Jan-Oliver Wagner <[email protected]>
8001    
8002            * Thuban/UI/tableview.py (LayerTableFrame.OnClose): Bug-fix: Now
8003            unsubscribes all that is subcribed in __init__.
8004    
8005    2003-05-28  Bernhard Herzog  <[email protected]>
8006    
8007            * Thuban/UI/mainwindow.py (MainWindow.DuplicateLayer)
8008            (MainWindow.CanDuplicateLayer): New methods to implement the
8009            Layer/Duplicate command.
8010            (layer_duplicate command): New.
8011            (main_menu): Add layer_duplicate to the Layer menu.
8012    
8013    2003-05-28  Bernhard Herzog  <[email protected]>
8014    
8015            * Thuban/UI/tableview.py (NullRenderer.Draw): New. Our own
8016            renderer so that NULL/None values get displayed differently (by a
8017            gray rectangle).
8018            (TableGrid.__init__): Override the default renderers
8019    
8020    2003-05-28  Bernhard Herzog  <[email protected]>
8021    
8022            * Thuban/Model/layer.py (Layer.SetShapeStore): Set the
8023            classification to "None" if the type of the field has changed.
8024    
8025            * test/test_layer.py (SetShapeStoreTests): New. Class with a few
8026            test for the Layer.SetShapeStore method
8027    
8028    2003-05-28  Jan-Oliver Wagner <[email protected]>
8029    
8030            * Thuban/Model/layer.py (Layer.TreeInfo): Fixed a bug (a layer
8031            does not necessarily have a filename).
8032    
8033    2003-05-28  Jan-Oliver Wagner <[email protected]>
8034    
8035            * Thuban/UI/mainwindow.py (MainWindow.TableClose, MainWindow.TableShow):
8036            sort the selection list for the dialog.
8037    
8038    2003-05-28  Frank Koormann  <[email protected]>
8039    
8040            * extensions/thuban/wxproj.cpp
8041            (project_point): Removed cast to int for projected point coordinates.
8042            (shape_centroid): Return last point if all polygon vertices fall
8043            to one point.
8044    
8045    2003-05-28  Bernhard Herzog  <[email protected]>
8046    
8047            * Thuban/UI/mainwindow.py (_can_unjoin): Add doc-string and cope
8048            with layers that don't have shapestores, i.e. raster layers.
8049    
8050    2003-05-28  Bernhard Herzog  <[email protected]>
8051    
8052            * Thuban/Model/table.py (DBFTable.__init__): Omit the extension
8053            when determining the title from the filename.
8054    
8055            * test/test_dbf_table.py (TestDBFTable.test_title): Update to
8056            reflect changes in the way the title is derived from the filename
8057    
8058    2003-05-28  Frank Koormann  <[email protected]>
8059    
8060            * Thuban/UI/mainwindow.py (MainWindow.TableShow):
8061            Added wxDEFAULT_DIALOG_STYLE to show table dialog styles.
8062    
8063    2003-05-27  Bernhard Herzog  <[email protected]>
8064    
8065            * Thuban/UI/mainwindow.py (MainWindow.delegated_messages): Also
8066            delegate SelectedLayer.
8067            (MainWindow.LayerUnjoinTable): Implement.
8068            (_can_unjoin): New. Helper function for the sensitivity of the
8069            layer/unjoin command.
8070    
8071            * Thuban/Model/data.py (ShapefileStore.OrigShapeStore)
8072            (DerivedShapeStore.OrigShapeStore): New. Return the original
8073            shapestore. Used to figure out how to unjoin.
8074            (DerivedShapeStore.Shapefile): Fix a typo.
8075    
8076    2003-05-27  Bernhard Herzog  <[email protected]>
8077    
8078            * Thuban/UI/join.py (JoinDialog): Extend to handle layer joins as
8079            well
8080            (JoinDialog.__init__): Use the layer parameter and only build the
8081            left choice when a layer is given
8082            (JoinDialog.OnJoin): Handle layer joins as well
8083            (JoinDialog.OnLeftTable, JoinDialog.OnRightTable): Handle the case
8084            that the user selects the "Select..." item. The sensitivitly
8085            updating is now in update_sensitivity
8086            (JoinDialog.y): New method to refactor the sensitivity update of
8087            the join button into its own method.
8088    
8089            * Thuban/UI/mainwindow.py (MainWindow.LayerJoinTable): Implement.
8090    
8091    2003-05-27  Bernhard Herzog  <[email protected]>
8092    
8093            * Thuban/UI/mainwindow.py (table_close command): Make it sensitive
8094            iff there are unreferenced tables in the session
8095    
8096    2003-05-27  Bernhard Herzog  <[email protected]>
8097    
8098            * Thuban/Model/messages.py (TABLE_REMOVED): New message.
8099    
8100            * Thuban/Model/session.py (Session.UnreferencedTables): New method
8101            to return tables that are not referenced by other tables or shape
8102            stores and can be removed.
8103            (Session.RemoveTable): Issue a TABLE_REMOVED message after
8104            removing the table
8105    
8106            * Thuban/UI/mainwindow.py: Remove unused imports
8107            (MainWindow.TableClose): Implement.
8108    
8109            * Thuban/UI/tableview.py (TableFrame.__init__): Subscribe to some
8110            messages so that the frame will be automatically closed when a new
8111            session is opened or the table is removed.
8112            (TableFrame.OnClose): Unsubscribe the Subscriptions made in
8113            __init__
8114            (TableFrame.close_on_session_replaced)
8115            (TableFrame.close_on_table_removed): New. Subscribers that close
8116            the window
8117    
8118            * test/test_session.py (TestSessionMessages.test_remove_table)
8119            (TestSessionSimple.test_remove_table): Move the test to
8120            TestSessionSimple and add test for the TABLE_REMOVED message
8121            (TestSessionBase.setUp): Also subscribe to TABLE_REMOVED
8122            (TestSessionSimple.test_unreferenced_tables) New. Test for the
8123            UnreferencedTables method.
8124            (UnreferencedTablesTests): New. Class with some more sophisticated
8125            tests for UnreferencedTables.
8126    
8127    2003-05-27  Frank Koormann  <[email protected]>
8128    
8129            * Thuban/UI/tableview.py (QueryTableFrame.__init__): The "_S_election"
8130            display has some unwanted side effects. Removed again.
8131    
8132    2003-05-27  Frank Koormann  <[email protected]>
8133    
8134            * Resources/Bitmaps/legend_icon_layer.xpm: New, icon for legend.
8135    
8136            * Thuban/UI/legend.py (LegendTree.__FillTree): Use "legend_icon_layer"
8137    
8138    2003-05-27  Jan-Oliver Wagner <[email protected]>
8139    
8140            * test/test_menu.py (MenuTest.test): Added test for
8141            Menu.RemoveItem().
8142    
8143            * Thuban/UI/menu.py (Menu.RemoveItem): New. Remove an item from
8144            the menu.
8145    
8146    2003-05-27  Frank Koormann  <[email protected]>
8147            
8148            Nonmodal dialogs without parent (i.e. they can fall behind the main
8149            window)
8150    
8151            * Thuban/UI/mainwindow.py (MainWindow.OnClose): Explicitly destroy
8152            all dialogs in the dialogs dictionary and the canvas.
8153    
8154            * Thuban/UI/dialogs.py (NonModalNonParentDialog): New class, without
8155            parent, i.e. can fall behind other windows.
8156            (NonModalDialog.OnClose): Check is dialog is in mainwindow.dialog
8157            dictionary before removing it.
8158    
8159            * Thuban/UI/classifier.py: Dialog derived from NonModalNonParentDialog
8160    
8161            * Thuban/UI/projdialog.py: Dialog derived from NonModalNonParentDialog
8162            * Thuban/UI/tableview.py: Dialog derived from NonModalNonParentDialog
8163            * Thuban/UI/tree.py: Dialog derived from NonModalNonParentDialog
8164    
8165    2003-05-27  Bernhard Herzog  <[email protected]>
8166    
8167            * Thuban/UI/mainwindow.py (MainWindow.ShowTableView): New. Open a
8168            tableview dialog
8169            (MainWindow.TableShow): Use ShowTableView to open the dialogs.
8170            Also, don't use the table's titles as the dialog names. The titles
8171            aren't guaranteed to be unique.
8172            (MainWindow.TableOpen): Open a table view dialog after opening the
8173            table
8174    
8175    2003-05-27  Bernhard Herzog  <[email protected]>
8176    
8177            * Thuban/UI/mainwindow.py: Remove the Table/Hide menu item. Its
8178            effect can be achieved by simply closing the window showing the
8179            table.
8180            (MainWindow.TableHide): Removed.
8181            (main_menu): Removed "table_hide"
8182    
8183    2003-05-27  Frank Koormann  <[email protected]>
8184    
8185            Fix legend tree display problems under Win32
8186    
8187            * Thuban/UI/legend.py:  BMP_SIZE_W = 15
8188            (LegendTree.__FillTree): Display "legend_icon_map.xpm" with layer title.
8189            (LegendTree.__FillTreeLayer): Explicitely set SelectedImage.
8190    
8191            * Resources/Bitmaps/legend_icon_map.xpm: New icon for legend.
8192    
8193    2003-05-27  Jan-Oliver Wagner <[email protected]>
8194    
8195            * Thuban/UI/menu.py (Menu.InsertSeparator): Additional optional parameter
8196            'after' now allows to insert separators almost anywhere in the menu.
8197    
8198    2003-05-27  Frank Koormann  <[email protected]>
8199    
8200            * Thuban/UI/tableview.py (QueryTableFrame.__init__): Underline the
8201            "S" of selection box label to hint on hot key (Alt-S). Works under
8202            Win32 but is ignored under GTK.
8203    
8204    2003-05-26  Frank Koormann  <[email protected]>
8205    
8206            * Thuban/UI/projdialog.py (ProjFrame.__do_layout, ProjPanel._DoLayout):
8207            Center Choices.
8208    
8209    2003-05-26  Bernhard Herzog  <[email protected]>
8210    
8211            Remove the Precision methods again. They're too DBF specific to be
8212            part of the table interface and they're only used in table_to_dbf
8213            anyway.
8214            
8215            * Thuban/Model/transientdb.py (TransientTableBase.Width):Use a
8216            fixed precision of 12 for doubles.
8217            (TransientTableBase.Precision): Removed
8218            (AutoTransientTable.Width): Delegate to self.table.
8219    
8220            * Thuban/Model/table.py (DBFTable.Precision)
8221            (MemoryTable.Precision): Removed.
8222            (MemoryTable.Width): Use a fixed precision of 12 for doubles.
8223            (table_to_dbf): Use a fixed precision of 12 for floats unless the
8224            column object specifies something else.
8225    
8226            * test/test_dbf_table.py (TestTableToDBF.test_table_to_dbf): New.
8227            test for table_to_dbf
8228    
8229    2003-05-26  Bernhard Herzog  <[email protected]>
8230    
8231            * test/test_transientdb.py
8232            (TestTransientTable.run_iceland_political_tests): Fix a comment.
8233    
8234    2003-05-26  Bernhard Herzog  <[email protected]>
8235    
8236            * Thuban/UI/mainwindow.py (MainWindow.TableOpen): Real
8237            implementation. Mark parts of the file format strings for
8238            localization.
8239    
8240            * Thuban/Model/session.py (Session.OpenTableFile): New. Open a dbf
8241            file and add the table to the tables managed by the session
8242    
8243            * test/test_session.py (TestSessionSimple.test_open_table_file):
8244            New. test case for OpenTableFile
8245    
8246    2003-05-26  Jan-Oliver Wagner <[email protected]>
8247    
8248            * Thuban/UI/controls.py, Thuban/UI/identifyview.py, Thuban/UI/join.py,
8249            Thuban/UI/labeldialog.py, Thuban/UI/mainwindow.py,
8250            Thuban/UI/proj4dialog.py, Thuban/UI/tableview.py, Thuban/UI/view.py:
8251            Replace the true/false of wxWindows by True/False of Python 2.2.1.
8252    
8253    2003-05-26  Jan-Oliver Wagner <[email protected]>
8254    
8255            * Thuban/UI/tableview.py (LayerTableFrame.__init__): If there is
8256            already a selection present, update the grid accordingly.
8257    
8258            * Thuban/UI/mainwindow.py (MainWindow.TableShow): Make the dialog
8259            resizeable and increase its initial size.
8260    
8261    2003-05-26  Frank Koormann  <[email protected]>
8262    
8263            Table export functionality
8264    
8265            * Thuban/Model/table.py (DBFTable.Width, MemoryTable.Width):
8266            Return width (in characters) for a column.
8267            (DBFTable.Precision, MemoryTable.Precision): Return decimal precision.
8268            (table_to_dbf): Write table to dbf file.
8269            (table_to_csv): Write table to csv file.
8270    
8271            * Thuban/Model/transientdb.py (TransientTableBase.Width,
8272            TransientTableBase.Precision): Return column width and precision.
8273    
8274            * Thuban/UI/tableview.py (QueryTableFrame.OnSaveAs): Call table_to_dbf
8275            or table_to_csv depending on file selection.
8276    
8277            * test/test_dbf_table.py:
8278            Test table_to_dbf (extension of former part of test).
8279    
8280            * test/test_csv_table.py:
8281            Test table_to_csv.
8282    
8283    2003-05-23  Jan-Oliver Wagner <[email protected]>
8284    
8285            * Thuban/UI/join.py (JoinDialog.OnJoin): Use _() for strings.
8286            Use QueryTableFrame instead of TableFrame.
8287    
8288            * Thuban/UI/mainwindow.py (MainWindow.LayerShowTable): Prefix the
8289            table window with 'Layer Table:' instead of 'Table:'.
8290    
8291    2003-05-23  Jan-Oliver Wagner <[email protected]>
8292    
8293            Give all tables a title via mix-in TitledObject.LayerShowTable
8294    
8295            * Thuban/Model/base.py (TitledObject.SetTitle): Call method 'issue'
8296            only if it exists.
8297    
8298            * Thuban/Model/table.py (DBFTable, MemoryTable): mix-in TitledObject
8299            and call its init-method with a default title. Remove Title() method.
8300    
8301            * Thuban/Model/transientdb.py (TransientTable, TransientJoinedTable,
8302            AutoTransientTable): mix-in TitledObject and call its init-method with
8303            a default title. Remove Title() method.
8304    
8305    2003-05-23  Bernhard Herzog  <[email protected]>
8306    
8307            * Thuban/Model/session.py (Session.AddShapeStore): Define
8308            AddShapeStore analogously to AddTable.
8309    
8310            * test/test_session.py (TestSessionSimple.test_add_shapestore):
8311            New. Test for AddShapeStore
8312    
8313    2003-05-23  Jan-Oliver Wagner <[email protected]>
8314    
8315            Introducing QueryTableFrame and a very coarse ShowTable implementation.
8316    
8317            * Thuban/UI/tableview.py (LayerTableFrame, QueryTableFrame): Split the
8318            class LayerTableFrame into two classes, LayerTableFrame and QueryTableFrame.
8319            The latter implements the selection GUI without dependency on a layer.
8320            LayerTableFrame now is derived from QueryTableFrame and connects
8321            to a layer.
8322    
8323            * Thuban/UI/mainwindow.py (MainWindow.TableShow): A very coarse
8324            implementation that still needs work.
8325    
8326            * Thuban/Model/layer.py (Layer.TreeInfo): Added filename.
8327    
8328    2003-05-22  Frank Koormann  <[email protected]>
8329    
8330            * Thuban/Model/transientdb.py (TransientJoinedTable.__init__):
8331            Added "outer_join = False" as optional parameter.
8332            (TransientJoinedTable.create): If outer join is true, perform a
8333            "LEFT OUTER JOIN" instead of "JOIN", which preserves all records of
8334            the left table. Records not matching are filled with 0 / None.
8335    
8336            * Thuban/UI/join.py (JoinDialog.__init__): Checkbox for outer join.
8337            (JoinDialog.OnJoin): Consider outer join check box.
8338    
8339    2003-05-22  Bernhard Herzog  <[email protected]>
8340    
8341            * Thuban/UI/join.py (JoinDialog.OnJoin): Use exc_info in a
8342            somewhat safer way. Storing the traceback in a local variable can
8343            lead to memory leaks
8344    
8345    2003-05-22  Bernhard Herzog  <[email protected]>
8346    
8347            * Thuban/UI/join.py (JoinDialog.OnJoin): Make sure to really call
8348            the wxMessageDialog's Destroy() method.
8349    
8350    2003-05-22  Frank Koormann  <[email protected]>
8351    
8352            * Thuban/UI/join.py (JoinDialog.__init__): Make use of
8353            TransientTable.Title()
8354    
8355    2003-05-22  Frank Koormann  <[email protected]>
8356    
8357            Join Dialog, initial version.
8358    
8359            * Thuban/UI/mainwindow.py (MainWindow.TableJoin): Removed print.
8360    
8361            * Thuban/UI/join.py (JoinDialog): Functional implementation of
8362            former framework. Renamed Table1/Table2 to LeftTable/RightTable
8363            in all occurences.
8364    
8365            * Thuban/Model/transientdb.py (TransientJoinedTable.__doc__):
8366            Typo fixed.
8367    
8368    2003-05-22  Bernhard Herzog  <[email protected]>
8369    
8370            Give the tables titles so that the GUI can display more meaningful
8371            names. For now the titles are fixed but depend on e.g. filenames
8372            or the titles of the joined tables.
8373    
8374            * Thuban/Model/transientdb.py (TransientTable.Title)
8375            (TransientJoinedTable.Title, AutoTransientTable.Title): New.
8376    
8377            * Thuban/Model/table.py (DBFTable.Title, MemoryTable.Title): New.
8378    
8379            * test/test_transientdb.py
8380            (TestTransientTable.test_auto_transient_table_title): New. Test
8381            for the Title method
8382            (TestTransientTable.test_transient_joined_table)
8383            (TestTransientTable.test_transient_table): Add test for the Title
8384            methods
8385    
8386            * test/test_memory_table.py (TestMemoryTable.test_title): New.
8387            Test for the Title method
8388    
8389            * test/test_dbf_table.py (TestDBFTable.test_title): New. Test for
8390            the Title method
8391    
8392    2003-05-22  Bernhard Herzog  <[email protected]>
8393    
8394            * test/test_layer.py (TestLayer.setUp, TestLayer.tearDown):
8395            Provide a better way to destroy the layers
8396            (TestLayer.test_base_layer, TestLayer.test_arc_layer)
8397            (TestLayer.test_point_layer, TestLayer.test_empty_layer)
8398            (TestLayer.test_polygon_layer, TestLayer.test_get_field_type): Use
8399            the new way to destroy the layers.
8400            (TestLayer.test_derived_store): New. Test for using a layer with a
8401            DerivedShapeStore
8402    
8403            * Thuban/Model/layer.py (Layer.SetShapeStore): Only set the
8404            filename if the shape store actually has one.
8405    
8406    2003-05-22  Bernhard Herzog  <[email protected]>
8407    
8408            * Thuban/Model/table.py (DBFTable.FileName): New. Accessor method
8409            for the filename
8410    
8411            * test/test_dbf_table.py (TestDBFTable.test_filename): New. Test
8412            for the FileName method
8413            (TestDBFTableWriting.test_write): Fix spelling of filename
8414    
8415    2003-05-22  Thomas Koester  <[email protected]>
8416    
8417            * Thuban/Model/range.py, test/test_range.py: Brought over new Range
8418            from SciParam that now really is immutable.
8419    
8420    2003-05-22  Frank Koormann  <[email protected]>
8421    
8422            Layer Top/Bottom placement added to legend.
8423    
8424            * Thuban/UI/legend.py
8425            (LegendPanel._OnMoveTop(), LayerPanel._OnMoveBottom): New, methods
8426            bound to tool events.
8427            (LegendTree.MoveCurrentItemTop(), LegendTree.MoveCurrentItemBottom):
8428            New, methods binding the event methods with the map methods.
8429    
8430            * Thuban/Model/map.py (Map.TopLayer(), Map.BottomLayer()): New, place
8431            layer at top/bottom of layer stack.
8432    
8433            * Resources/Bitmaps/top_layer.xpm: New button icon.
8434    
8435            * Resources/Bitmaps/bottom_layer.xpm: New button icon.
8436    
8437    2003-05-22  Bernhard Herzog  <[email protected]>
8438    
8439            * Thuban/Model/session.py (Session.RemoveTable): New method to
8440            remove tables
8441    
8442            * test/test_session.py (TestSessionSimple.test_remove_table): New.
8443            Test for RemoveTable
8444    
8445    2003-05-22  Thomas Koester  <[email protected]>
8446    
8447            * Thuban/Model/classgen.py: Added short module doc string and CVS id.
8448            (ClassGenerator.GenUniformDistribution): Use new Range __init__, too.
8449    
8450    2003-05-22  Bernhard Herzog  <[email protected]>
8451    
8452            Implement a way to discover dependencies between tables and
8453            shapestores.
8454    
8455            * Thuban/Model/transientdb.py (TransientTableBase.Dependencies)
8456            (TransientJoinedTable.Dependencies)
8457            (AutoTransientTable.SimpleQuery): New. Implement the dependencies
8458            interface
8459            (TransientJoinedTable.__init__): Keep tack of the original table
8460            objects in addition to the corresponding transient tables.
8461    
8462            * Thuban/Model/table.py (DBFTable.Dependencies)
8463            (MemoryTable.Dependencies): New. Implement the dependencies
8464            interface
8465    
8466            * Thuban/Model/data.py (ShapeTable): New. Helper class for
8467            ShapefileStore
8468            (ShapefileStore.__init__): Use ShapeTable instead of
8469            AutoTransientTable
8470            (ShapefileStore.Table, ShapefileStore.Shapefile): Add doc-strings
8471            (ShapefileStore.FileName, ShapefileStore.FileType): New. Accessor
8472            methods for filename and type
8473            (ShapefileStore.Dependencies): New. Implement the dependencies
8474            interface
8475            (DerivedShapeStore): New class to replace SimpleStore. The main
8476            difference to SimpleStore is that it depends not on a shapefile
8477            but another shapestore which expresses the dependencies a bit
8478            better
8479            (SimpleStore.__init__): Add deprecation warning.
8480    
8481            * test/test_dbf_table.py (TestDBFTable.test_dependencies): New.
8482            Test for the Dependencies method.
8483    
8484            * test/test_memory_table.py (TestMemoryTable.test_dependencies):
8485            New. Test for the Dependencies method.
8486    
8487            * test/test_transientdb.py
8488            (TestTransientTable.test_auto_transient_table_dependencies): New.
8489            Test for the Dependencies method.
8490            (TestTransientTable.test_transient_joined_table): Add test for the
8491            Dependencies method.
8492    
8493            * test/test_session.py (TestSessionSimple.setUp)
8494            (TestSessionSimple.tearDown): New. Implement a better way to
8495            destroy the sessions.
8496            (TestSessionSimple.test_initial_state)
8497            (TestSessionSimple.test_add_table): Bind session to self.session
8498            so that it's destroyed by tearDown
8499            (TestSessionSimple.test_open_shapefile): New. Test for
8500            OpenShapefile and the object it returns
8501    
8502    2003-05-22  Bernhard Herzog  <[email protected]>
8503    
8504            * Thuban/Model/session.py (Session.AddTable): New method to
8505            register tables with the session.
8506            (Session.Tables): Return the tables registered with AddTable too.
8507    
8508            * test/test_session.py (TestSessionSimple.test_add_table): New.
8509            Test case for the AddTable method
8510    
8511    2003-05-22  Frank Koormann  <[email protected]>
8512    
8513            UI polishing updates: Place main buttons (OK, Cancel, etc) in the
8514            lower right corner, center labels for selections, initialize controls
8515            in reasonable order for keyboard navigation.
8516    
8517            * Thuban/UI/projdialog.py (ProjFrame.__init__, ProjFrame.__doLayout)
8518            (ProjFrame.__DoOnProjAvail): Determine position of current projection
8519            using the wxListBox.FindString() method. Still a problem (#1886)
8520    
8521            * Thuban/UI/classifier.py
8522            (Classifier.__init__, SelectPropertiesDialog.__init__)
8523    
8524            * Thuban/UI/classgen.py (ClassGenDialog.__init__,
8525            (ClassGenDialog.__DoOnGenTypeSelect): Moved initialization of the
8526            different classification types from here to __init__.
8527            (GenUniquePanel.__init__): Set the column width of the first field
8528            in the Field ListCtrl to the full width.
8529    
8530            * Thuban/UI/tableview.py (LayerTableFrame.__init__): Rename 'Save As'
8531            Button to 'Export'. Center Buttons in Selection Box, set Focus to
8532            Grid.
8533            (LayerTableFrame.OnKeyDown()): New, bound to the grid with EVT_KEY_DOWN,
8534            changes focus to the Selection when pressing "Alt-S".
8535    
8536            * Thuban/UI/legend.py (LegendTree.__SetVisibilityStyle): Only gray out
8537            the text if not visible. The italic font sometimes exceeds the
8538            rendering area.
8539    
8540    2003-05-21  Jonathan Coles   <[email protected]>
8541    
8542            * Thuban/UI/dock.py (DockFrame): Rename references to _OnClose
8543            to OnClose so that Thuban closes correctly.
8544    
8545            * Thuban/UI/mainwindow.py (MainWindow.OnClose): Call
8546            DockFrame.OnClose, not DockFrame._OnClose.
8547    
8548    2003-05-21  Jonathan Coles   <[email protected]>
8549    
8550            * Thuban/Model/classgen.py (ClassGenerator.GenQuantiles): Remove
8551            references to 'inf' and use new Range __init__ to pass floats
8552            directly rather than converting them to strings first.
8553            Fixes RTBug #1876.
8554    
8555            * Thuban/Model/classification.py (ClassGroupRange.SetRange):
8556            Use new Range ___init__ to pass floats.
8557    
8558            * Thuban/Model/layer.py (RasterLayer.__init__): Test if the
8559            filename is a valid image file. Throw IOError otherwise.
8560    
8561            * Thuban/Model/range.py: Brought over new Range from SciParam that
8562            is immutable and has an __init__ which can accept floats.
8563    
8564            * Thuban/UI/mainwindow.py (MainWindow.AddLayer): Move OpenShapefile
8565            into try block. AddLayer doesn't throw any exceptions anymore.
8566            (MainWindow.AddRasterLayer): Move constructor of RasterLayer into
8567            try block.
8568    
8569            * Thuban/UI/projdialog.py (GeoPanel.__init__): Put Degrees as
8570            the first item in choices. Fixes RTBug #1882.
8571    
8572            * Thuban/UI/renderer.py (MapRenderer.render_map): Check if scale
8573            has gone to 0 which is a serious problem. abort.
8574            (MapRenderer.draw_raster_layer): Catch IOError seperately and
8575            print the error from GDAL.
8576    
8577            * Thuban/UI/tableview.py (TableGrid.__init__): Call
8578            ToggleEventListeners to turn on listening.
8579            (TableGrid.ToggleEventListeners): New. Turns event listening on
8580            and off so as to prevent excessive messages.
8581            (LayerTableFrame.OnQuery): Use TableGrid.ToggleEventListeners
8582            to suppress excessive messages when selecting many rows.
8583            Fixes RTBug #1880.
8584    
8585            * Thuban/UI/view.py: Added checks against if scale == 0. This
8586            is a serious problem that can occur when an image without
8587            geo data is loading and causes the map projection bounds to
8588            go to infinity. Right now, the solution is to simply try
8589            to recover.
8590    
8591            * extensions/thuban/cpl_mfile.cpp (MFILEClose): Make sure
8592            to set the MFILEReceiver attributes even if the data is NULL.
8593    
8594            * extensions/thuban/gdalwarp.cpp: Improved the error handling
8595            and passed GDAL messages back up to the Python layer. Also
8596            tried to fix some memory leaks that were present in the original
8597            utility but didn't matter because the program aborted.
8598    
8599            * test/test_range.py: Copied over tests from SciParam. Removed
8600            tests against importing. Fixes RTBug #1867.
8601    
8602    2003-05-21  Bernhard Herzog  <[email protected]>
8603    
8604            * test/test_load.py: Remove unused imports and restructure the
8605            test code
8606            (LoadSessionTest): Split into one class for each test and turn
8607            LoadSessionTest itself into the base class for all such session
8608            tests.
8609            (ClassificationTest): New base class for load tests that test
8610            classifications
8611            (TestSingleLayer, TestLayerVisibility, TestClassification)
8612            (TestLabels, TestLayerProjection, TestRasterLayer): New classes
8613            for the individual tests
8614    
8615            * test/support.py (FileLoadTestCase.filename): New base class for
8616            file loading tests
8617    
8618    2003-05-21  Jan-Oliver Wagner <[email protected]>
8619    
8620            * Resources/Projections/defaults.proj: Renamed 'Universal Transverse
8621            Mercator' to 'UTM Zone 32' as a more convenient example.
8622            Added 'Gauss Krueger Zone 6'.
8623    
8624            * Data/iceland_sample_raster.thuban: political polygon now
8625            filled transparent to have the raster image visible at once.
8626    
8627    2003-05-21  Frank Koormann  <[email protected]>
8628    
8629            * Thuban/UI/mainwindow.py (MainWindow): Renamed _OnClose() back to
8630            OnClose() to keep in sync with extensions. Internally Thuban
8631            still uses "underscored" names.
8632    
8633    2003-05-20  Jonathan Coles   <[email protected]>
8634    
8635            This puts back Raster layer support. These layers support projections
8636            through the GDAL library. Currently, the CVS version is being used.
8637            There are no Debian packages available although this may change soon.
8638            A GDAL driver was extended to support writing to memory rather to
8639            files.
8640    
8641            There is still some work that needs to be done, such as some error
8642            handling when loading invalid images or when there is a problem
8643            projecting the image. This putback simply checks in the majority
8644            of the work.
8645    
8646            * setup.py: Add gdalwarp library extension.
8647    
8648            * Thuban/Model/layer.py (BaseLayer.HasClassification): New.
8649            Defaults to False, but can be overridden by subclasses if they
8650            support classification.
8651            (RasterLayer): New. Defines a new layer that represents an
8652            image.
8653    
8654            * Thuban/Model/load.py (SessionLoader.__init__): Add rasterlayer
8655            tag handler.
8656            (SessionLoader.start_layer): Encode the filename.
8657            (SessionLoader.start_rasterlayer, SessionLoader.end_rasterlayer):
8658            New. Supports reading a rasterlayer tag.
8659    
8660            * Thuban/Model/map.py (Map.BoundingBox): Fix typo in comment.
8661    
8662            * Thuban/Model/save.py (XMLWriter.encode): Don't assume that we
8663            get a string in Latin1. If we get such as string convert it to
8664            unicode first, otherwise leave if alone before encoding.
8665            (SessionSaver.write_layer): Add support for writing both Layers
8666            and RasterLayers.
8667    
8668            * Thuban/Model/transientdb.py (AutoTransientTable.SimpleQuery):
8669            The right argument may not be a string, it could also be a Column.
8670    
8671            * Thuban/UI/application.py (ThubanApplication.CreateMainWindow):
8672            Make initial window size 600x400. Fixes RTBug #1872.
8673    
8674            * Thuban/UI/classifier.py (Classifier.__init__): Rearrange how
8675            the dialog is constructed so that we can support layers that
8676            do not have classifications.
8677            (Classifier._OnTry): Only build a classification if the layer
8678            supports one.
8679    
8680            * Thuban/UI/legend.py: Change all checks that a layer is an
8681            instance of Layer into checks against BaseLayer.
8682            (LegendTree.__FillTreeLayer): Only add children to a branch if
8683            the layer supports classification.
8684    
8685            * Thuban/UI/mainwindow.py (MainWindow.NewSession,
8686            MainWindow.OpenSession): Don't proceed with an action if the
8687            user chooses Cancel when they are asked to save changes.
8688            (MainWindow.AddRasterLayer): New. Open a dialog to allow the
8689            user to select an image file. Create a new RasterLayer and add
8690            it to the map.
8691    
8692            * Thuban/UI/renderer.py (MapRenderer.render_map): Add support
8693            for rendering RasterLayer layers.
8694            (MapRenderer.draw_raster_layer): Actually method that calls
8695            the GDALWarp python wrapper and constructs an image from the
8696            data returned.
8697    
8698            * Thuban/UI/tableview.py (LayerTableFrame.__init__): Change the
8699            Choices symbols to match those used in the table query method.
8700            Replace deprecated method calls on table with new method names.
8701    
8702            * Thuban/UI/view.py (MapCanvas.set_view_transform): Try to limit
8703            how small the scale can get. This still needs more testing.
8704    
8705            * extensions/thuban/bmpdataset.cpp: New, but copied from GDAL.
8706            Provides a driver to output in .bmp format.
8707    
8708            * extensions/thuban/cpl_mfile.cpp, extensions/thuban/cpl_mfile.h:
8709            New. Provides IO routines which write to memory, rather than a file.
8710    
8711            * extensions/thuban/gdalwarp.cpp: New, but basically a direct copy
8712            of the gdalwarp utility provided in GDAL. Added function calls
8713            that can be accessed from python.
8714    
8715            * Data/iceland_sample_raster.thuban: New. Sample file that uses
8716            a raster layer.
8717    
8718            * Data/iceland/island.tfw, Data/iceland/island.tif: New. Raster
8719            layer image data.
8720    
8721            * Doc/thuban.dtd: Added rasterlayer attribute definition.
8722    
8723            * test/test_layer.py, test/test_load.py, test/test_save.py: Added
8724            tests associated with the raster layer code.
8725    
8726            * test/test_transientdb.py
8727            (TestTransientTable.test_auto_transient_table_query): Added a test
8728            for using a Column object as the "right" parameter to a query.
8729    
8730    2003-05-19  Frank Koormann  <[email protected]>
8731    
8732            * Thuban/version.py (get_changelog_date):
8733            Catch exceptions if ChangeLog does not exist.
8734    
8735            * Thuban/UI/view.py (MapCanvas.Export): Bugfix
8736    
8737    2003-05-19  Frank Koormann  <[email protected]>
8738    
8739            Extended version information for Thuban
8740    
8741            * Thuban/version.py: New, version information for Thuban: Last
8742            modification date and last ChangeLog entry date.
8743    
8744            * Thuban/UI/mainwindow.py (MainWindow.About()): Extended version
8745            information: Display Thuban, wxPython and Python version.
8746    
8747    2003-05-16  Bernhard Herzog  <[email protected]>
8748    
8749            * Thuban/Model/save.py: Remove some unused imports including the
8750            __future__ import for nested_scopes as Thuban relies on Python 2.2
8751            now.
8752            (XMLWriter.encode): Remove the special case for a None argument.
8753            In the saver encode is always called with a string argument.
8754    
8755    2003-05-16  Bernhard Herzog  <[email protected]>
8756    
8757            * Thuban/UI/__init__.py: Remove the work-around for the locale bug
8758            in wxPython (at least when usinvg wxGTK) prior to 2.4. The symptom
8759            of the bug was that e.g. float("1.2") would fail. Thuban now
8760            requires 2.4.x.
8761            
8762    2003-05-16  Frank Koormann   <[email protected]>
8763    
8764            Printing enhancement and WMF export (under Win32)
8765    
8766            * Thuban/UI/renderer.py (ExportRenderer): New, derived from
8767            ScreenRenderer. Renders Map, Legend and Scalebar for export.
8768            (PrinterRenderer): New, derived from ExportRenderer. Replaces the old
8769            PrintRender.
8770    
8771            * Thuban/UI/view.py (MapPrintout.__init__): Enhanced parameter set
8772            to fullfil information needed for PrinterRenderer.
8773            (MapCanvas.Export): New. Export Map (currently only to WMF on Win32).
8774            (MapCanvas.Print): Adapted to new MapPrintout.
8775            (OutputTransform): General calculations to transform from canvas
8776            coordinates to export/printing devices.
8777    
8778            * Thuban/UI/mainwindow.py (MainWindow.ExportMap()): New. Added also
8779            new method_command to call ExportMap, with platform dependency (only
8780            __WXMSW__)
8781      
8782            * Thuban/UI/scalebar.py (ScaleBar.DrawScaleBar): Position and Size
8783            of scalebar drawing area as new parameters.
8784            
8785            * Thuban/Model/scalebar.py (roundInterval): round long instead of int
8786    
8787            * Thuban/UI/legend.py (ScalebarBitmap.__SetScale):
8788            Update to extended scalebar.DrawScalebar header.
8789    
8790            * test/test_export.py: New, test Thuban.UI.view.OutputTransform()
8791    
8792            * test/test_scalebar.py: Made test executable as standalone.
8793    
8794    2003-05-16  Bernhard Herzog  <[email protected]>
8795    
8796            * Thuban/Model/table.py (Table): Remove this compatibility alias
8797            for DBFTable.
8798    
8799            * test/test_table.py: Import DBFTable as Table because that alias
8800            doesn't exist anymore.
8801    
8802            * Thuban/UI/classgen.py: Remove some unused imports
8803    
8804    2003-05-14  Jonathan Coles   <[email protected]>
8805    
8806            * Thuban/Model/classgen.py (ClassGenerator.GenSingletonsFromList):
8807            Fix docstring.
8808            (ClassGenerator.GenUniformDistribution): Fix spelling of method name.
8809            (ClassGenerator.GenQuantiles): Use the left/right brackets and min/max
8810            values of the supplied range to determine the beginning and end
8811            bounds of the generated classes.
8812    
8813            * Thuban/Model/range.py (Range.number_re): Now accepts floats that
8814            do not have a leading 0 (.5 is now accepted as well as 0.5).
8815    
8816            * Thuban/UI/classgen.py (ClassGenDialog.OnOK): Fix name of method
8817            call to ClassGenerator.GenUniformDistribution.
8818    
8819            * Thuban/UI/projdialog.py (ProjFrame.__do_layout): Fix Windows
8820            layout bug with the 'Projection' label.
8821    
8822            * test/support.py (FloatTestCase): New. Needed for the Range tests.
8823    
8824            * test/test_range.py: New. Imported from SciParam.
8825    
8826    2003-05-12  Jonathan Coles   <[email protected]>
8827    
8828            * Thuban/UI/classgen.py (GenQuantilesPanel.GetList): Replace call
8829            to table.UniqueValues() with calls that retrieve all the values
8830            from the table. This will need to be replaced by a method on table
8831            which can simply return the list (perhaps more efficiently).
8832    
8833    2003-05-12  Jonathan Coles   <[email protected]>
8834    
8835            The return value of ClassGenerator.CalculateQuantiles has changed.
8836            Refer to the documentation for details.
8837    
8838            * test/test_classgen.py: Modified Quantile tests to use the
8839            new return values.
8840    
8841            * Thuban/Model/classgen.py
8842            (ClassGenerator.GenQuantiles): Add comments describing the parameters,
8843            use new return values from CalculateQuantiles to produce the correct
8844            range bounds in the Classification.
8845            (ClassGenerator.CalculateQuantiles): Add more comments describing
8846            the return values and parameters. Make minor adjustments to improve
8847            the legibility of the code. Fix problem with adjusted not being set
8848            in most cases.
8849    
8850    2003-05-12  Frank Koormann <[email protected]>
8851            
8852            * Thuban/Model/save.py (XMLWriter.encode()): Explicite call to unicode
8853            and latin1. Fixes #1851 finally.
8854    
8855    2003-05-09  Jonathan Coles   <[email protected]>
8856    
8857            * test/test_classgen.py: New. Tests the Quantile algorithm.
8858    
8859            * Thuban/Model/classgen.py (ClassGenerator.CalculateQuantiles):
8860            Clean up debugging statement, add comments, fix a small bug in the
8861            returned adjusted percentiles.
8862            
8863    2003-05-09  Jonathan Coles   <[email protected]>
8864    
8865            Introduces Range class from SciParam into the ClassGroupRange class,
8866            and such ranges can now be saved and loaded from disk.
8867    
8868            Quantiles are now available in the Classification Generator.
8869    
8870            Initial support for building Queries on a table. Doesn't do anything
8871            but run some tests.
8872    
8873            * Thuban/Model/classification.py: Explicit imports.
8874            (ClassGroupRange): Use the Range class to store the underlying
8875            range information. The interface remains the same, except for
8876            GetRange(), and you can also supply a Range object as the min
8877            parameter to SetRange or __init__.
8878    
8879            * Thuban/Model/load.py (XMLReader.encode): New. Encodes the given
8880            string appropriately for use in Thuban. Fixes RTbug #1851.
8881            (SessionLoader.end_projection): Handle the context of the
8882            projection tag a bit better by looking at what objects are not
8883            None. There was an assumption that a projection tag for a map
8884            could occur before any layers.
8885            (SessionLoader.start_clrange): Provide backward compatibility for
8886            reading min/max values as well as the new range parameter.
8887    
8888            * Thuban/Model/map.py: Explicit imports.
8889    
8890            * Thuban/Model/resource.py: Import _.
8891            (ProjFileSaver.write): write header using projfile.dtd.
8892    
8893            * Thuban/Model/save.py: Explicit imports.
8894            (XMLWriter.encode): New. Encode the given string from a format
8895            used by Thuban into UTF-8. Fixes RTbug #1851.
8896    
8897            * Thuban/UI/classgen.py: Explicit imports.
8898            (ClassGenDialog.__init__): Clean up the code and add support
8899            for Quantiles.
8900            (ClassGenDialog.OnOK): Add support for Quantiles.
8901            (GenQuantilesPanel): New. Input panel for Quantiles.
8902            (ClassGenerator, CustomRamp, MonochromaticRamp, GreyRamp, RedRamp,
8903            GreenRamp, BlueRamp, HotToColdRamp): Move to Thuban/Model/classgen.py
8904    
8905            * Thuban/Model/classgen.py: New. Contains all the classes named above.
8906    
8907            * Thuban/UI/classifier.py: Explicit imports.
8908            (ClassTable.GetValueAsCust, ClassTable.__ParseInput,
8909            ClassTable.SetValueAsCustom): Reworked to use new Range class.
8910    
8911            * Thuban/UI/legend.py: Explicit imports.
8912    
8913            * Thuban/UI/mainwindow.py: Add support for the Join Dialog. Added
8914            a Table menu and associated method calls.
8915            (MainWindow.choose_color): Removed. No longer needed.
8916    
8917            * Thuban/UI/projdialog.py (ProjFrame.__VerifyButtons): Save button
8918            should be disabled if no projection is selected in the available
8919            list.
8920    
8921            * Thuban/UI/renderer.py: Explicit imports.
8922    
8923            * Thuban/UI/tableview.py (TableGrid.OnRangeSelect): Fix some issues
8924            with correctly selecting the rows and issuing the right events.
8925            Be sure to call Skip() to allow the grid to do some of its own
8926            handling which allows the rows to actually be selected.
8927            (LayerTableGrid.select_shapes): Rename from select_shape. Supports
8928            selecting multiple shapes.
8929            (LayerTableFrame): Support for building Queries.
8930            (LayerTableFrame.select_shapes): Allow multiple shapes to be selected.
8931    
8932            * Thuban/UI/tree.py: Explicit imports.
8933    
8934            * Thuban/UI/view.py (MapCanvas): Delegate "SelectedShapes" so the
8935            table view can call it.
8936    
8937            * test/test_classification.py: Explicit imports.
8938            (TestClassification.test_ClassGroupRange): Fix test for new
8939            Range class.
8940    
8941            * Doc/thuban.dtd: Add range parameter for clrange.
8942    
8943            * Thuban/Model/range.py: Taken from SciParam. Used as the underlying
8944            object in ClassGroupRange, and also uesd for inputting ranges in
8945            the classifer table and elsewhere.
8946    
8947            * Thuban/UI/join.py: New. Initial Join dialog. No real functionality
8948            yet.
8949    
8950    2003-05-09  Frank Koormann <[email protected]>
8951    
8952            * Thuban/UI/scalebar.py (DrawScaleBar): Draw only if interval > 0.0.
8953    
8954    2003-05-08  Frank Koormann <[email protected]>
8955    
8956            Coding style updates
8957    
8958            * test/test_scalebar.py: Replaced tab indentation by spaces.
8959    
8960            * Thuban/UI/scalebar.py: Explicit imports.
8961    
8962    2003-05-08  Frank Koormann <[email protected]>
8963    
8964            * Thuban/UI/scalebar.py
8965            (ScaleBar.DrawScalebar): Format string bug fixed.
8966    
8967    2003-05-08  Frank Koormann <[email protected]>
8968    
8969            Reorganization of scalebar component (no wx in Thuban/Model)
8970    
8971            * Thuban/Model/scalebar.py: Rendering moved to Thuban/UI/scalebar.py
8972            (deriveInterval):
8973            Calculate scalebar interval and unit which fits in width for scale.
8974            (roundInterval): Round float.
8975    
8976            * Thuban/UI/scalebar.py (ScaleBar): Scalebar rendering
8977    
8978            * test/test_scalebar.py: Test for Thuban/Model/scalebar.py methods.
8979    
8980            * Thuban/UI/legend.py: Import Thuban.UI.scalebar
8981    
8982    2003-05-08  Frank Koormann <[email protected]>
8983    
8984            * Thuban/UI/legend.py (ScalebarBitmap.SetCanvas):
8985            Initialize ScaleBar with canvas.map
8986    
8987            * Thuban/Model/scalebar.py (ScaleBar.roundInterval()): New,
8988            round intervals to display smarter lengths
8989            (ScaleBar.DrawScalebar): Draw Scalebar only if the map contains a
8990            layer. If the maps has no projection applied grey the scalebar.
8991    
8992    2003-05-07  Frank Koormann <[email protected]>
8993            
8994            Basic Scalebar features added.
8995    
8996            * Thuban/Model/scalebar.py (ScaleBar): New, scalebar rendering.
8997    
8998            * Thuban/UI/legend.py (LegendPanel): Added scalebar bitmap
8999            (ScaleBarBitmap): New, links the scalebar bitmap with view messages
9000            and the renderer.
9001    
9002            * Thuban/UI/view.py (MapCanvas.set_view_transform): Issue SCALE_CHANGED.
9003    
9004            * Thuban/UI/messages.py: SCALE_CHANGED added.
9005    
9006    2003-05-07  Bernhard Herzog  <[email protected]>
9007    
9008            * Thuban/Model/session.py (Session.__init__): New instance
9009            variable shapestores to hold a list of all open shapestore objects
9010            (Session.ShapeStores): New. Accessor method for the shapestores
9011            list.
9012            (Session._add_shapestore, Session._clean_weak_store_refs): New.
9013            Internal methods to maintain the shapestores list.
9014            (Session.Tables): New. Return all tables open in the session.
9015            (Session.OpenShapefile): Insert the new ShapeStore into the
9016            shapestores list.
9017    
9018            * test/test_session.py (TestSessionSimple.test_initial_state): Add
9019            tests for ShapeStores and Tables
9020            (TestSessionWithContent.test_shape_stores)
9021            (TestSessionWithContent.test_tables): New. Test cases for
9022            ShapeStores and Tables
9023    
9024    2003-05-07  Bernhard Herzog  <[email protected]>
9025    
9026            * Thuban/Model/transientdb.py (TransientTableBase.ReadRowAsDict):
9027            Add comments about the optimizations used.
9028            (AutoTransientTable.ReadValue, TransientTableBase.ReadValue): New.
9029            Implement the ReadValue table interface method.
9030    
9031            * test/test_transientdb.py
9032            (TestTransientTable.run_iceland_political_tests)
9033            (TestTransientTable.test_transient_joined_table): Add tests for
9034            ReadValue
9035    
9036    2003-05-07  Frank Koormann <[email protected]>
9037    
9038            * Resources/Bitmaps/fulllayerextent.xpm,
9039            Resources/Bitmaps/fullselextent.xpm: Replaced the place holders with
9040            new icons.
9041    
9042    2003-05-06  Bernhard Herzog  <[email protected]>
9043    
9044            * Thuban/Model/transientdb.py (AutoTransientTable.SimpleQuery):
9045            New. Simply delegate to the transient table's version.
9046    
9047            * test/test_transientdb.py
9048            (TestTransientTable.test_auto_transient_table_query): New. Test
9049            case for AutoTransientTable's SimpleQuery
9050    
9051    2003-05-06  Bernhard Herzog  <[email protected]>
9052    
9053            * Thuban/Model/transientdb.py (TransientTableBase.SimpleQuery):
9054            Implement a simple query method for the query dialog
9055            (TransientTableBase.create): Add an INTEGER PRIMARY KEY that holds
9056            the row index or shapeid.
9057            (TransientTable.create): Insert the right value of the row index
9058            (TransientJoinedTable.create): Copy the row index of the left
9059            table to the joined result table
9060    
9061            * test/test_transientdb.py
9062            (TestTransientTable.test_transient_table_read_twice): Fix
9063            doc-string
9064            (TestTransientTable.test_transient_table_query): New. Test for the
9065            SimpleQuery method
9066    
9067    2003-05-06  Bernhard Herzog  <[email protected]>
9068    
9069            Convert all table users to use the new table interface. This only
9070            covers Thuban itself, not GREAT-ER or other applications built on
9071            Thuban yet, so the compatibility interface stays in place for the
9072            time being but it now issues DeprecationWarnings.
9073    
9074            Finally, the new Table interface has a new method, HasColumn.
9075    
9076            * Thuban/Model/table.py (OldTableInterfaceMixin): All methods
9077            issue deprecation warnings when they're. The warnings refer to the
9078            caller of the method.
9079            (OldTableInterfaceMixin.__deprecation_warning): New. Helper method
9080            for the deprecation warnings
9081    
9082            * test/test_table.py: Ignore the deprecation warnings for the old
9083            table in the tests in this module. The purpose of the tests is to
9084            test the old interface, after all.
9085    
9086            * test/test_transientdb.py
9087            (TestTransientTable.run_iceland_political_tests): Use the
9088            constants for the types. Add a test for HasColumn
9089            (TestTransientTable.test_transient_joined_table): Adapt to new
9090            table interface. Add a test for HasColumn
9091            (TestTransientTable.test_transient_table_read_twice): Adapt to new
9092            table interface
9093    
9094            * Thuban/UI/tableview.py (DataTable.SetTable, DataTable.GetValue):
9095            Adapt to new table interface
9096    
9097            * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Adapt to
9098            new table interface
9099    
9100            * Thuban/UI/controls.py (RecordListCtrl.fill_list)
9101            (RecordTable.SetTable): Adapt to new table interface
9102    
9103            * Thuban/UI/classifier.py (Classifier.__init__)
9104            (Classifier.__init__): Adapt to new table interface
9105    
9106            * Thuban/UI/classgen.py (ClassGenDialog.__init__)
9107            (GenUniformPanel._OnRetrieve, GenUniquePanel._OnRetrieve): Adapt
9108            to new table interface
9109    
9110            * Thuban/Model/transientdb.py (TransientTableBase.HasColumn)
9111            (AutoTransientTable.HasColumn): Implement the new table interface
9112            method
9113            (AutoTransientTable.ReadRowAsDict, AutoTransientTable.ValueRange)
9114            (AutoTransientTable.UniqueValues): Adapt to new table interface
9115    
9116            * Thuban/Model/layer.py (Layer.SetShapeStore, Layer.GetFieldType):
9117            Adapt to new table interface
9118    
9119            * test/test_layer.py (TestLayer.open_shapefile): Helper method to
9120            simplify opening shapefiles a bit easier.
9121            (TestLayer.test_arc_layer, TestLayer.test_polygon_layer)
9122            (TestLayer.test_point_layer): Use the new helper method
9123            (TestLayer.test_get_field_type): New. Test for the GetFieldType
9124            method
9125    
9126            * test/test_dbf_table.py (TestDBFTable.test_has_column): Test for
9127            the new table method
9128    
9129            * test/test_memory_table.py (TestMemoryTable.test_has_column):
9130            Test for the new table method HasColumn
9131    
9132    2003-05-06  Jonathan Coles   <[email protected]>
9133    
9134            Addresses the "Selection Extent" wish of RTbug #1787.
9135    
9136            * Resources/Bitmaps/fulllayerextent.xpm,
9137            Resources/Bitmaps/fullselextent.xpm: Bitmaps for layer and selection
9138            extent. These are just place holders for the real bitmaps.
9139    
9140            * Thuban/Model/layer.py (Shape): Since a Shape is immutable only
9141            calculate the bounding box once (the first time compute_bbox() is
9142            called).
9143            (Layer.ShapesBoundingBox): New. Given a list of shape ids, return
9144            the bounding box for the shapes in lat/long coordinates.
9145    
9146            * Thuban/UI/mainwindow.py: Added new "Full selection extent" menu
9147            option.
9148            (MainWindow.has_selected_shapes): New. Returns true if there are
9149            any selected shapes.
9150            (MainWindow.FullSelectionExtent): New. Calls
9151            MapCanvas.FitSelectedToWindow() when the user selects the menu option.
9152            (_has_selected_shapes): New. Returns true if there are any
9153            selected shapes.
9154    
9155            * Thuban/UI/selection.py (Selection.HasSelectedShapes): New. Returns
9156            true if there are any selected shapes.
9157    
9158            * Thuban/UI/view.py (MapCanvas): Added delegated method
9159            HasSelectedShapes.
9160            (MapCanvas.FitSelectedToWindow): New. Centers and scales any selected
9161            shapes on the canvas using the map projection (if any).
9162    
9163            * test/test_layer.py (TestLayer.test_arc_layer): Add some tests
9164            for Layer.ShapesBoundingBox().
9165    
9166    2003-05-06  Bernhard Herzog  <[email protected]>
9167    
9168            * Resources/Projections/defaults.proj: Fix spelling of Mercator
9169    
9170    2003-05-05  Jonathan Coles   <[email protected]>
9171    
9172            Addresses the "Full Layer Extent" wish of RTbug #1787.
9173    
9174            * Resources/Projections/defaults.proj: Added UK National Grid.
9175    
9176            * Thuban/UI/mainwindow.py: Added new "Full layer extent" menu option.
9177            (MainWindow.FullLayerExtent): New. Calls MapCanvas.FitLayerToWindow()
9178            when the user selects the menu option.
9179    
9180            * Thuban/UI/view.py (MapCanvas.FitLayerToWindow): New. Centers and
9181            scales the given layer on the canvas using the map projection.
9182    
9183    2003-05-05  Bernhard Herzog  <[email protected]>
9184    
9185            Convert the table implementations to a new table interface. All
9186            tables use a common mixin class to provide backwards compatibility
9187            until all table users have been updated.
9188    
9189            * Thuban/Model/table.py (OldTableInterfaceMixin): Mixin class to
9190            provide backwards compatibility for table classes implementing the
9191            new interface
9192            (DBFTable, MemoryTable): Implement the new table interface. Use
9193            OldTableInterfaceMixin as base for compatibility
9194            (DBFColumn, MemoryColumn): New. Column description for DBFTable
9195            and MemoryTable resp.
9196    
9197            * test/test_dbf_table.py: New. Test cases for the DBFTable with
9198            the new table interface.
9199    
9200            * test/test_memory_table.py: New. Test cases for the MemoryTable
9201            with the new table interface.
9202    
9203            * test/test_table.py: Document the all tests in this file as only
9204            for backwards compatibility. The equivalent tests for the new
9205            interface are in test_memory_table.py and test_dbf_table.py
9206            (MemoryTableTest.test_read): field_info should be returning tuples
9207            with four items
9208            (MemoryTableTest.test_write): Make doc-string a more precise.
9209    
9210            * Thuban/Model/transientdb.py (TransientTableBase): Convert to new
9211            table interface. Derive from from OldTableInterfaceMixin for
9212            compatibility.
9213            (TransientTableBase.create): New intance variable column_map to
9214            map from names and indices to column objects
9215            (TransientTable.create): Use the new table interface of the input
9216            table
9217            (AutoTransientTable): Convert to new table interface. Derive from
9218            from OldTableInterfaceMixin for compatibility.
9219            (AutoTransientTable.write_record): Removed. It's not implemented
9220            yet and we still have to decide how to handle writing with the new
9221            table and data framework.
9222    
9223            * test/test_transientdb.py
9224            (TestTransientTable.run_iceland_political_tests)
9225            (TestTransientTable.test_transient_joined_table): Use the new
9226            table interface
9227    
9228    2003-05-05  Jonathan Coles   <[email protected]>
9229    
9230            This is namely a collection of UI updates to improve user interactivity.
9231            Tabbing between controls now exists and you can use ESC to close dialog
9232            boxes; ENTER will active the default button.
9233    
9234            * Thuban/UI/classgen.py (ClassGenDialog.__init__): Rearrange the
9235            order that the controls are created so that tabbing works correctly.
9236            (ClassGenDialog.OnOK): Renamed from _OnGenerate() so that the
9237            wxDialog can handle the default button correctly.
9238            (ClassGenDialog.OnCancel): Renamed from _OnCloseBtn() for the
9239            same reasons as for OnOK.
9240            (GenUniformPanel._OnRetrieve): Call wxBeginBusyCursor/wxEndBusyCursor
9241            when we ask the table for the maximum/minimum values of a field
9242            which could take a very long time.
9243    
9244            * Thuban/UI/classifier.py (Classifier.__init__): Rearrange the
9245            order that the controls are created so that tabbing works correctly.
9246            (SelectPropertiesDialog.__init__): Rearrange the order that the
9247            controls are created so that tabbing works correctly.
9248    
9249            * Thuban/UI/dialogs.py: Copied NonModalDialog box and changed it
9250            to derive from a wxDialog but behave like the original implementation
9251            which was derived from a wxFrame. wxDialog provides useful key
9252            handling functionality like ESC calling OnCancel and ENTER calling
9253            OnOK which is lost with wxFrame.
9254    
9255            * Thuban/UI/mainwindow.py: Add "..." to menu items that will open
9256            new dialogs.
9257    
9258            * Thuban/UI/projdialog.py (ProjFrame.__init__): Rearrange the
9259            order that the controls are created so that tabbing works correctly.
9260            (ProjFrame.OnApply): Renamed from _OnTry() to use wxDialog behaviour.
9261            (ProjFrame.OnOK): Renamed from _OnOK() to use wxDialog behaviour.
9262            (ProjFrame.OnCancel): Renamed from _OnClose() to use wxDialog behaviour.
9263            (ProjPanel.__init__): Add "Airy" to the list of ellipsoids so we
9264            can provide the "UK National Grid" as a default projection.
9265            (UTMPanel.__init__): Rearrange the order that the controls are
9266            created so that tabbing works correctly.
9267    
9268    2003-05-05  Bernhard Herzog  <[email protected]>
9269    
9270            * extensions/thuban/wxproj.cpp: Fix some of the comments.
9271            (project_point): If a map projection but no layer projection is
9272            given, convert degrees to radians before applying the map
9273            projection.
9274    
9275            * Thuban/UI/tableview.py (TableGrid.disallow_messages)
9276            (TableGrid.allow_messages): New methods to make it possible to
9277            inhibit message sending.
9278            (TableGrid.issue): Only send the message if not inhibited.
9279            (LayerTableGrid.select_shape): Use the new methods to make sure
9280            that no ROW_SELECTED message is sent while we're updating the
9281            selected rows to match the selected shapes.
9282    
9283    2003-05-02  Jan-Oliver Wagner <[email protected]>
9284    
9285            Implementation of MemoryTable.
9286    
9287            * Thuban/Model/table.py (MemoryTable): New. Quite simple table
9288            implementation that operates on a list of tuples. All of the data
9289            are kept in the memory.
9290    
9291            * test/test_table.py (MemoryTableTest): New.
9292    
9293            * test/test_transientdb.py (SimpleTable): Removed.
9294            (TestTransientTable.test_transient_joined_table,
9295            (TestTransientTable.test_transient_table_read_twice): Replaced
9296            SimpleTable by MemoryTable.
9297    
9298    2003-04-30  Jonathan Coles   <[email protected]>
9299    
9300            * Data/iceland_sample.thuban: Now contains correct projections
9301            for each of the layers.
9302    
9303            * Resources/Projections/defaults.proj: Geographic projection
9304            contains unit conversion parameter.
9305    
9306    2003-04-30  Jonathan Coles   <[email protected]>
9307    
9308            The most important part of this putback is the projection changes.
9309            It should now be possible to specify the projection that a layer
9310            is in and then specify a different projection for the map. The
9311            projection dialog has an extra parameter for a geographic projection
9312            which lets the user select if the input is in degrees or radians.
9313    
9314            * Thuban/Model/layer.py (Layer.ShapesInRegion): Fix docstring
9315            to say that the parameter is a tuple of unprojected
9316            points (which is what the callers to this method were assuming).
9317            Also, since the points are unprojected we need to projected them.
9318    
9319            * Thuban/UI/legend.py (LegendTree.MoveCurrentItemUp,
9320            LegendTree.MoveCurrentItemDown): If the layer or any of the layer's
9321            groups are selected, move the layer up/down. Fixes RTbug #1833.
9322    
9323            * Thuban/UI/mainwindow.py: Move menu item map_rename up.
9324    
9325            * Thuban/UI/projdialog.py (ProjFrame._OnSave): Add missing
9326            parameter in call to SetClientData.
9327            (GeoPanel): Add support for selecting the units that the
9328            source data is in (Radians or Degrees).
9329    
9330            * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Optimize
9331            the rendering loop by reducing the number of if's, removing the
9332            unnecessary try/except block, and checking if the old group
9333            is the same as the new one (which happens a lot if there is
9334            no classification, or lots of shapes are in the same group).
9335    
9336            * Thuban/UI/view.py (MapCanvas.OnPaint): Add a try/except block
9337            around the redraw routine to try to catch problems that the user
9338            may create by selecting invalid projections for the data set and
9339            map. Clears the display if there are any problems and prints the
9340            error.
9341            (MapCanvas.do_redraw): Use DC.Clear() instead of drawing a filled
9342            rectangle.
9343    
9344            * extensions/thuban/wxproj.cpp (project_point): First invert the
9345            supplied point (which should be in projected coordinates) using
9346            the layer's projection and then project the point using the
9347            map's projection.
9348            (project_points): Use project_point() to project each point.
9349    
9350    2003-04-30  Jan-Oliver Wagner <[email protected]>
9351    
9352            * Thuban/Model/layer.py (Layer.SetShapeStore): Fixed a bug:
9353            don't set the Classification to None if the classfication field
9354            is None (ie only a DEFAULT).
9355    
9356    2003-04-30  Bernhard Herzog  <[email protected]>
9357    
9358            * Thuban/UI/view.py: Fix some typos.
9359    
9360            * Thuban/UI/mainwindow.py (MainWindow.identify_view_on_demand): Do
9361            not pop up the dialog if the selection becomes empty (this could
9362            happen if e.g. a new selection is opened while the identify tool
9363            is active and dialog had been closed)
9364    
9365    2003-04-30  Bernhard Herzog  <[email protected]>
9366    
9367            * Thuban/Model/transientdb.py (TransientTableBase.__init__): New
9368            instance variable read_record_last_result
9369            (TransientTableBase.read_record): Make sure reading the same
9370            record twice works. The implementation uses the new instance
9371            variable read_record_last_result
9372    
9373            * test/test_transientdb.py
9374            (TestTransientTable.test_transient_table_read_twice): New test
9375            case for the above bug-fix.
9376    
9377    2003-04-29  Jonathan Coles   <[email protected]>
9378    
9379            * Thuban/common.py: Removed. No longer needed Str2Num. RTbug #1832.
9380    
9381            * Thuban/UI/classgen.py: Remove all uses of Str2Num.
9382    
9383            * Thuban/UI/classifier.py: Remove all uses of Str2Num.
9384            (ClassTable.SetValueAsCustom): Rename keyword argument in
9385            ClassGroup* constructors to match argument name.
9386    
9387    2003-04-29  Bernhard Herzog  <[email protected]>
9388    
9389            * Thuban/Model/session.py (Session.Destroy): Explicitly close the
9390            transient DB if it exists to make sure it doesn't leave a journal
9391            file in the temp directory.
9392    
9393            * Thuban/Model/transientdb.py (TransientDatabase.close): Set
9394            self.conn to None after closing the connection to make sure it's
9395            not closed twice
9396    
9397    2003-04-29  Jonathan Coles   <[email protected]>
9398    
9399            Add a visible parameter in the layer XML tag. The default value is
9400            "true". If anything other than "false" is specified we also assume
9401            "true". Addresses RTbug #1025.
9402    
9403            * Doc/thuban.dtd: Add visible parameter to a layer.
9404    
9405            * Thuban/Model/layer.py (BaseLayer.__init__): Change default value
9406            of visible from 1 to True.
9407            (Layer.__init__): Change default value of visible from 1 to True.
9408    
9409            * Thuban/Model/load.py (SessionLoader.start_layer): Read visible
9410            parameter.
9411    
9412            * Thuban/Model/save.py (SessionSaver.write_layer): Save visible
9413            parameter.
9414    
9415            * test/test_load.py: Add new test data contents_test_visible.
9416            (LoadSessionTest.setUp): save test data.
9417            (LoadSessionTest.testLayerVisibility): Test if the visible flag
9418            is loaded correctly.
9419    
9420            * test/test_save.py (SaveSessionTest.testSingleLayer): Add test
9421            for saving an invisible layer.
9422    
9423    2003-04-29  Jonathan Coles   <[email protected]>
9424    
9425            * Thuban/UI/mainwindow.py (MainWindow.SetMap): Look up the
9426            legend dialog box and tell it to change its map to the one
9427            supplied to SetMap(). Fixes RTbug #1770.
9428    
9429    2003-04-29  Bernhard Herzog  <[email protected]>
9430    
9431            Next step of table implementation. Introduce a transient database
9432            using SQLite that some of the data is copied to on demand. This
9433            allows us to do joins and other operations that require an index
9434            for good performance with reasonable efficiency. Thuban now needs
9435            SQLite 2.8.0 and pysqlite 0.4.1. Older versions may work but I
9436            haven't tested that.
9437            
9438            * Thuban/Model/transientdb.py: New. Transient database
9439            implementation.
9440    
9441            * test/test_transientdb.py: New. Tests for the transient DB
9442            classes.
9443    
9444            * Thuban/Model/session.py (AutoRemoveFile, AutoRemoveDir): New
9445            classes to help automatically remove temporary files and
9446            directories.
9447            (Session.__init__): New instance variables temp_dir for the
9448            temporary directory and transient_db for the SQLite database
9449            (Session.temp_directory): New. Create a temporary directory if not
9450            yet done and return its name. Use AutoRemoveDir to have it
9451            automatically deleted
9452            (Session.TransientDB): Instantiate the transient database if not
9453            done yet and return it.
9454    
9455            * Thuban/Model/data.py (ShapefileStore.__init__): Use an
9456            AutoTransientTable so that data is copied to the transient DB on
9457            demand.
9458            (SimpleStore): New class that simply combines a table and a
9459            shapefile
9460    
9461            * Thuban/Model/table.py (Table, DBFTable): Rename Table into
9462            DBFTable and update its doc-string to reflect the fact that this
9463            is only the table interface to a DBF file. Table is now an alias
9464            for DBFTable for temporary backwards compatibility.
9465    
9466            * Thuban/UI/application.py (ThubanApplication.OnExit): Make sure
9467            the last reference to the session goes away so that the temporary
9468            files are removed properly.
9469    
9470            * test/test_load.py (LoadSessionTest.tearDown): Remove the
9471            reference to the session to make sure the temporary files are
9472            removed.
9473    
9474    2003-04-29  Bernhard Herzog  <[email protected]>
9475    
9476            * Thuban/Model/load.py (XMLReader.__init__, XMLReader.read): Turn
9477            the __parser instance variable into a normal local variable in
9478            read. It's only used there and read will never be called more than
9479            once. Plus it introduces a reference cycle that keeps can keep the
9480            session object alive for a long time.
9481    
9482    2003-04-29  Jonathan Coles   <[email protected]>
9483    
9484            * Thuban/Model/proj.py (Projection): Removed Set*() methods to make
9485            Projection an immutable item. Fixes RTbug #1825.
9486            (Projection.__init__): Initialize instance variables here.
9487            (ProjFile.Replace): New. Replace the given projection object with
9488            the new projection object. This solves the problem of needing the
9489            mutator Projection.SetProjection() in the ProjFrame class and
9490            allows a projection to change parameters without changing its
9491            location in the file.
9492    
9493            * Thuban/UI/mainwindow.py (MainWindow.SaveSessionAs): Dialog should
9494            be of type wxSAVE and should verify overwriting a file.
9495    
9496            * Thuban/UI/projdialog.py (ProjFrame._OnSave): Use the new
9497            ProjFile.Replace() method instead of the mutator
9498            Projection.SetProjection(). Also requires that we reassign the
9499            client data to the new projection.
9500    
9501            * test/test_proj.py (TestProjection.test): Test GetName() and
9502            GetAllParameters()
9503            (TestProjFile.test): Remove tests for Set*() methods. Add tests
9504            for Replace().
9505    
9506    2003-04-25  Jonathan Coles   <[email protected]>
9507    
9508            * Thuban/Model/save.py (SessionSaver.write_projection): Make sure
9509            to save the name of the projection.
9510    
9511            * test/test_save.py (SaveSessionTest.testLayerProjection): New
9512            test to verify layer projections are saved correctly.
9513    
9514    2003-04-25  Jonathan Coles   <[email protected]>
9515    
9516            * Thuban/Model/proj.py (Projection.SetName): Set the name
9517            to "Unknown" if name is None.
9518            (Projection.SetAllParameters): New. Set the projection's
9519            parameter list to the one supplied.
9520            (Projection.SetProjection): New. Set the projection's
9521            properties to those of the supplied Projection.
9522    
9523            * Thuban/UI/mainwindow.py (MainWindow.MapProjection): Set
9524            the dialog title to include the map's title.
9525            (MainWindow.LayerProjection): Set the dialog title to include
9526            the layer's title.
9527    
9528            * Thuban/UI/projdialog.py (ProjFrame.__ShowError): Consolidate
9529            error dialogs into a single method call.
9530            (ProjFrame.__VerifyButtons): Add more states to check.
9531            (ProjFrame.__GetProjection): Return the current state of an
9532            edited projection or None.
9533            (ProjFrame.__FillAvailList): Remove checks for states that
9534            shouldn't exist.
9535            (ProjFrame._OnNew): Clear all selected items and supply
9536            a projection panel if necessary.
9537    
9538            * test/test_proj.py (TestProjFile.test): Add tests for
9539            ProjFile.SetAllParameters, ProjFile.SetProjection,
9540            ProjFile.SetName.
9541    
9542    2003-04-25  Jonathan Coles   <[email protected]>
9543    
9544            * Thuban/UI/projdialog.py (ProjFrame.__FillAvailList): Now
9545            takes an optional argument to select the current projection.
9546            This does not guarantee that the item is visible due to
9547            limited wxWindows functionality. Fixes RTBug #1821.
9548    
9549    2003-04-25  Jonathan Coles   <[email protected]>
9550    
9551            * Thuban/Model/load.py (SessionLoader.start_projection): Remember
9552            the projection name and use it when constructing the Projection
9553            object.
9554    
9555            * Thuban/Model/proj.py (Projection.__init__): Change the default
9556            value for 'name' to None and then test if name is equal to None
9557            in the body of the constructor. This way the caller doesn't have to
9558            know what the default value should be. Namely, useful in load.py
9559            where we have to pick a default value if the 'name' parameter
9560            doesn't exist in the XML file.
9561    
9562            * test/test_load.py (LoadSessionTest.testLayerProjection): New.
9563            Tests a file where a layer has a projection.
9564    
9565    2003-04-25  Jonathan Coles   <[email protected]>
9566    
9567            * Thuban/Model/layer.py (Layer.TreeInfo): Add an item to the
9568            tree for projection information.
9569    
9570            * Thuban/Model/load.py (XMLReader.GetFilename): Renamed from
9571            XMLReader.GetFileName.
9572            (SessionLoader): Added support for loading projection tags that
9573            appear inside a layer.
9574    
9575            * Thuban/Model/proj.py (ProjFile): Document the class. Move
9576            back to using a list because the order of the projections in
9577            the file is important to maintain. Fixes RTbug #1817.
9578    
9579            * Thuban/Model/resource.py: Rename calls to ProjFile.GetFileName
9580            to ProjFile.GetFilename.
9581    
9582            * Thuban/Model/save.py (SessionSaver.write_layer): Save projection
9583            information.
9584    
9585            * Thuban/UI/projdialog.py (ProjFrame._OnAddToList): Renamed from
9586            ProjFrame._OnSaveAs. Removed old dead code from previous
9587            implementation.
9588            (ProjFrame._OnExport): Add support for exporting more than one
9589            projection to a single file.
9590            (ProjFrame.__FillAvailList): use string formatting (% operator)
9591            to build strings that are (partly) translated. Fixes RTbug #1818.
9592    
9593            * test/test_proj.py (TestProjFile.test): New. Tests the base ProjFile
9594            class.
9595    
9596    2003-04-24  Bernhard Herzog  <[email protected]>
9597    
9598            * po/es.po: Updated Spanish translation by Daniel Calvelo Aros
9599    
9600            * po/fr.po: New. French translation by Daniel Calvelo Aros
9601    
9602            * Thuban/UI/projdialog.py (ProjFrame._OnSaveAs): Don't translate
9603            empty strings.
9604    
9605    2003-04-24  Jonathan Coles   <[email protected]>
9606    
9607            * Thuban/Model/layer.py (Layer.GetProjection): New. Needed to
9608            implement the interface that the ProjFrame dialog expects.
9609    
9610            * Thuban/Model/proj.py (Projection.SetName): New. Allows the
9611            name of the projection to be changed.
9612            (ProjFile): Use a dictionary instead of a list so that removing
9613            projections is easier and we are sure about uniqueness.
9614            (ProjFile.Remove): Remove the given projection object.
9615    
9616            * Thuban/Model/resource.py (GetSystemProjFiles, GetUserProjFiles):
9617            Return a list with only one projection file instead of searching for
9618            any projection file. This simplifies many things if the user can
9619            only have one system file and one user file.
9620    
9621            * Thuban/UI/classgen.py: Change all references to
9622            genCombo to genChoice.
9623    
9624            * Thuban/UI/mainwindow.py: Add a Projection option under the
9625            layer menu.
9626            (MainWindow.LayerProjection): New. Open up a projection window
9627            for a layer.
9628    
9629            * Thuban/UI/projdialog.py: Large changes to how the dialog is
9630            laid out. Use three panels instead of one. One for the list of
9631            projections, one for the edit controls, and one for the buttons.
9632            Fixed resizing problems so that the dialog resizes correctly
9633            when the projection panel changes. Added import/export, save, and
9634            new buttons/functionality.
9635    
9636    2003-04-24  Bernhard Herzog  <[email protected]>
9637    
9638            First step towards table management. Introduce a simple data
9639            abstraction so that we replace the data a layer uses more easily
9640            in the next step.
9641    
9642            * Thuban/Model/data.py: New file with a simple data abstraction
9643            that bundles shapefile and dbffile into one object.
9644    
9645            * Thuban/Model/session.py (Session.OpenShapefile): New method to
9646            open shapefiles and return a shape store object
9647    
9648            * Thuban/Model/layer.py (Layer.__init__): Pass the data as a store
9649            object instead of a shapefile filename. This introduces a new
9650            instance variable store holding the datastore. For intermediate
9651            backwards compatibility keep the old instance variables.
9652            (open_shapefile): Removed. No longer needed with the shape store.
9653            (Layer.SetShapeStore, Layer.ShapeStore): New methods to set and
9654            get the shape store used by a layer.
9655            (Layer.Destroy): No need to explicitly destroy the shapefile or
9656            table anymore.
9657    
9658            * Thuban/UI/mainwindow.py (MainWindow.AddLayer)
9659            (MainWindow.AddLayer): Use the session's OpenShapefile method to
9660            open shapefiles
9661    
9662            * Thuban/Model/load.py (ProcessSession.start_layer): Use the
9663            session's OpenShapefile method to open shapefiles
9664    
9665            * test/test_classification.py
9666            (TestClassification.test_classification): Use the session's
9667            OpenShapefile method to open shapefiles and build the filename in
9668            a more platform independed way
9669    
9670            * test/test_layer.py (TestLayer.setUp, TestLayer.tearDown):
9671            Implement to have a session to use in the tests
9672            (TestLayer.test_arc_layer, TestLayer.test_polygon_layer)
9673            (TestLayer.test_point_layer, TestLayer.test_empty_layer): Use the
9674            session's OpenShapefile method to open shapefiles
9675            (TestLayerLegend.setUp): Instantiate a session so that we can use
9676            it to open shapefiles.
9677            (TestLayerLegend.tearDown): Make sure that all references to
9678            layers and session are removed otherwise we may get a resource
9679            leak
9680    
9681            * test/test_map.py (TestMapAddLayer.test_add_layer)
9682            (TestMapWithContents.setUp): Instantiate a session so that we can
9683            use it to open shapefiles.
9684            (TestMapWithContents.tearDown): Make sure that all references to
9685            layers, maps and sessions are removed otherwise we may get a
9686            resource leak
9687            ("__main__"): use support.run_tests() so that more info about
9688            uncollected garbage is printed
9689    
9690            * test/test_save.py (SaveSessionTest.testSingleLayer): Use the
9691            session's OpenShapefile method to open shapefiles
9692            ("__main__"): use support.run_tests() so that more info about
9693            uncollected garbage is printed
9694    
9695            * test/test_selection.py (TestSelection.tearDown): Make sure that
9696            all references to the session and the selection are removed
9697            otherwise we may get a resource leak
9698            (TestSelection.get_layer): Instantiate a session so that we can
9699            use it to open shapefiles.
9700            ("__main__"): use support.run_tests() so that more info about
9701            uncollected garbage is printed
9702    
9703            * test/test_session.py (TestSessionBase.tearDown)
9704            (TestSessionWithContent.tearDown): Make sure that all references
9705            to the session and layers are removed otherwise we may get a
9706            resource leak
9707            (TestSessionWithContent.setUp): Use the session's OpenShapefile
9708            method to open shapefiles
9709    
9710    2003-04-24  Jonathan Coles   <[email protected]>
9711    
9712            * Thuban/Model/load.py (XMLReader.read): Should have been checking
9713            if the file_or_filename object had the 'read' attribute.
9714    
9715    2003-04-23  Jonathan Coles   <[email protected]>
9716    
9717            * Thuban/Model/resource.py: Fixes RTbug #1813.
9718            (ReadProjFile): Add documentation about which exceptions are raised.
9719            Always pass the exceptions up to the caller.
9720            (GetProjFiles): If the directory can't be read return an empty list.
9721            If any of the proj files can't be read skip that file and go
9722            on to the next one.
9723    
9724            * test/test_proj.py: Added test cases to handle nonexistent files,
9725            unreadable files, and files that don't parse correctly.
9726    
9727    2003-04-23  Jonathan Coles   <[email protected]>
9728    
9729            Projection dialog. Allows the user to select from a list
9730            of projection templates and optionally edit them and save new ones.
9731    
9732            * Thuban/UI/projdialog.py (ProjFrame): New. Main dialog.
9733            (ProjPanel): Base class for projection specific panels.
9734            (TMPanel): Projection panel for Transverse Mercartor.
9735            (UTMPanel): Projection panel for Universal Transverse Mercartor.
9736            (LCCPanel): Projection panel for Lambert Conic Conformal.
9737            (GeoPanel): Projetion panel for Geographic Projection.
9738    
9739    2003-04-23  Jonathan Coles   <[email protected]>
9740    
9741            * Thuban/Model/load.py (XMLReader): Renamed from XMLProcessor to
9742            promote symmetry. There now exists XMLReader and XMLWriter.
9743            (XMLReader.read): New. Call to read the given file descriptor or
9744            filename.
9745            (XMLReader.close): New. Make sure the file is closed.
9746            (XMLReader.GetFileName): New. Return just the file name that is being
9747            read from.
9748            (XMLReader.GetDirectory): New. Return just the directory of the file
9749            that is being read.
9750            (XMLReader.AddDispatchers): New. Take a dictionary which contains
9751            the names of functions to call as the XML tree is parsed.
9752            (XMLReader.startElementNS): Updated to use new dispatcher dictionary.
9753            (XMLReader.endElementNS): Updated to use new dispatcher dictionary.
9754            (SessionLoader): Removed class variables start_dispatcher and
9755            end_dispatcher since this functionality is now part of a class
9756            instance. Fixes RTbug #1808.
9757            (SessionLoader.__init__): Add dispatcher functions.
9758            (load_xmlfile): Code was moved into the XMLReader.read().
9759            (load_session): Use modified SessionLoader.
9760    
9761            * Thuban/Model/map.py (Map.GetProjection): New. Returns the
9762            map's projection.
9763    
9764            * Thuban/Model/proj.py (Projection.GetParameters): Renamed to
9765            GetAllParameters.
9766            (Projection.GetParameter): Returns the value for the given parameter.
9767    
9768            * Thuban/Model/resource.py: Use XMLReader and XMLWriter.
9769            (GetProjFiles): Renamed from GetProjections. Now returns a list
9770            of ProjFile objects.
9771            (GetSystemProjFiles): Renamed from GetSuppliedProjections. Returns
9772            a list of ProjFile objects whose files are not user defined.
9773            (GetUserProjFiles): Renamed from GetUserProjections. Returns a
9774            list of ProjFile objects whose files are user defined.
9775            (ProjFileReader): Extend new XMLReader.
9776    
9777            * Thuban/Model/save.py (XMLWriter): Renamed from XMLSaver to
9778            promote symmetry.
9779    
9780            * Thuban/UI/classgen.py (ClassGenDialog.__init__): Use a wxChoice
9781            control instead of a wxComboBox. wxChoice controls do not generate
9782            events as the uses highlights possible choices which fixes problems
9783            with resizing the dialog when the use selects an option.
9784    
9785            * Thuban/UI/classifier.py (Classifier.__init__): Use a wxChoice
9786            control instead of a wxComboBox.
9787    
9788            * Thuban/UI/mainwindow.py (MainWindow.Projection): Use new projection
9789            dialog.
9790    
9791            * test/test_proj.py (TestProjection.test): New tests for GetParameter
9792            method.
9793    
9794    2003-04-22  Bernhard Herzog  <[email protected]>
9795    
9796            * Thuban/UI/mainwindow.py: Remove some unused imports and global
9797            constants
9798    
9799            * Thuban/UI/identifyview.py (IdentifyListCtrl.selected_shape)
9800            (IdentifyGridCtrl.selected_shape): Use table, not shapetable.
9801    
9802    2003-04-17  Bernhard Herzog  <[email protected]>
9803    
9804            * Thuban/Model/layer.py: Don't import LAYER_LEGEND_CHANGED.
9805            (Layer): Update doc-string since LAYER_LEGEND_CHANGED is not used
9806            anymore.
9807            (Layer.BoundingBox, Layer.GetFieldType, Layer.NumShapes)
9808            (Layer.ShapeType, Layer.Shape): No need to call
9809            self.open_shapefile since it's always called in __init__
9810    
9811            * Thuban/UI/application.py (ThubanApplication.MainLoop): Removed.
9812            In wxPython 2.4 there's no need to extend MainLoop anymore since
9813            wxPython itself makes sure OnExit is called.
9814    
9815    2003-04-16  Jonathan Coles   <[email protected]>
9816    
9817            Initial putback of projection management code. Includes new
9818            classes to read and write projection files. The current load
9819            and save classes were abstracted a bit so they could be reused.
9820            The Projection class was extended to provide new methods and
9821            have a name.
9822    
9823            * Thuban/Model/load.py (XMLProcessor): New. Contains all the
9824            general XML reading methods that were part of ProcessSession.
9825    
9826            * Thuban/Model/proj.py (Projection.__init__): Accepts an optional
9827            name.
9828            (ProjFile): New. Represents a file that contains projection
9829            information.
9830    
9831            * Thuban/Model/resource.py: New. Contains general utilities
9832            for read and writing projection files.
9833    
9834            * Thuban/Model/save.py (XMLSaver): New. Contains all the
9835            general XML writing methods that were part of SessionSaver.
9836            (SessionSaver): Renamed from Saver.
9837    
9838            * test/test_proj.py: New test cases for the projection
9839            file read and write functions.
9840    
9841    2003-04-16  Jonathan Coles   <[email protected]>
9842    
9843            * Thuban/Model/classification.py: Use repr() around values
9844            in the ClassGroup*.__repr__() methods so it is clearer when
9845            a value is a string and when it is a number.
9846    
9847            * test/test_load.py: Rework the classification test to test
9848            that we can load old files.
9849            (testLabels): Test a file where the groups have labels.
9850    
9851    2003-04-16  Bernhard Herzog  <[email protected]>
9852    
9853            Safer implementation of the performance enhancements of the
9854            low-level renderer:
9855            
9856            * extensions/thuban/wxproj.cpp (extract_projection)
9857            (extract_pointer): Rename extract_projection to extract_pointer
9858            and redefine its purpose to return the pointer stored in a CObject
9859            returned by the object's cobject method. Update all callers.
9860            (s_draw_info, free_draw_info, draw_polygon_init): Implement the
9861            handling of these low-level parameters so that each s_draw_info
9862            instance is handled as a CObject at python level that also
9863            contains real references to the actual python objects which
9864            contain the values in the struct. Add free_draw_info as the
9865            destructor.
9866            (draw_polygon_shape): Add the py_draw_info parameter which must a
9867            cobject containing an s_draw_info pointer.
9868    
9869            * Thuban/UI/renderer.py (MapRenderer.polygon_render_param): New
9870            method to instantiat the low-level render parameter
9871            (MapRenderer.draw_shape_layer): Use the new method. Remove some
9872            commented out code.
9873            (MapRenderer.draw_polygon_shape): Make the first parameter not the
9874            layer but the low-level render parameter
9875            (ScreenRenderer.draw_shape_layer): Use the low-level render
9876            parameter.
9877    
9878    2003-04-15  Jonathan Coles   <[email protected]>
9879    
9880            * Thuban/Model/classification.py: Implemented __repr__ for
9881            the ClassGroup* classes to make debugging a bit easier.
9882            (ClassGroup.SetLabel): Check that the string is an instance
9883            of StringTypes not StringType. Accounts for Unicode strings.
9884    
9885            * Thuban/Model/color.py: Implemented __repr__ to make
9886            debugging a bit easier.
9887    
9888            * Thuban/Model/save.py (Saver.write_classification): Need to
9889            save the group label.
9890    
9891            * test/test_load.py (testClassification): New. Loads the
9892            iceland_sample_test.thuban file and checks if it was loaded
9893            correctly.
9894    
9895    2003-04-15  Jonathan Coles   <[email protected]>
9896    
9897            * extensions/thuban/wxproj.cpp (draw_polygon_init): New. Used
9898            to improve rendering performance by initializing the variables
9899            that are not change each time draw_polygon_shape() is called.
9900            The values are stored in a global struct draw_info.
9901            (draw_polygon_shape): Removed initialization code that is
9902            now in draw_polygon_init().
9903    
9904            * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Make
9905            drawing initialization call to draw_polygon_init()
9906            (MapRenderer.draw_polygon_shape): Use new signature of
9907            draw_polygon_shape.
9908    
9909            * Thuban/UI/classgen.py (GenUniformPanel): Fix spin control
9910            weirdness by setting the range to (1, maxint).
9911    
9912            * Thuban/Model/classification.py (ClassGroupProperties): Make
9913            instance variables private and optimize comparison operator
9914            by first checking if the color references are the same.
9915            (ClassGroupSingleton): Make instance variables private.
9916            (ClassGroupRange): Make instance variables private.
9917    
9918            * HOWTO-Release: Filled in missing steps for releasing packages.
9919    
9920    2003-04-15  Bernhard Herzog  <[email protected]>
9921    
9922            First stab at internationalized messages:
9923    
9924            * Thuban/__init__.py (_): Implement the translation function for
9925            real using the python gettext module.
9926    
9927            * Thuban/UI/classifier.py (ClassTable.GetRowLabelValue): Don't
9928            translate empty strings.
9929    
9930            * Thuban/UI/application.py (ThubanApplication.read_startup_files):
9931            Add a missing space to a warning message
9932    
9933            * po/README: New. Notes about the management of the translation
9934            files.
9935    
9936            * po/Makefile: New. Makefile to help manage the translation files.
9937    
9938            * po/es.po: New. Spanish translation by Daniel Calvelo Aros
9939    
9940            * MANIFEST.in: Include the *.mo files in Resources/Locale and the
9941            translations and support files in po/
9942    
9943            * setup.py (data_files): Add the *.mo files to the data_files too
9944    
9945            * README: Add note about the translations when building from CVS
9946    
9947    2003-04-14  Jonathan Coles   <[email protected]>
9948    
9949            * Thuban/UI/dock.py: Fixes some window resizing problems most
9950            noticable under windows. Always assume the button bitmaps will
9951            be there. Code clean up.
9952            (DockabelWindow.Dock, DockableWindow.UnDock): Force all the
9953            images for the dock/undock button to the same images.
9954            Work around for RTbug #1801.
9955    
9956            * Thuban/UI/legend.py (LegendPanel.__init__): The toolbar should
9957            be allowed to grow within the sizer. Fixes a bug under Windows
9958            where the toolbar wasn't being drawn.
9959    
9960    2003-04-14  Frank Koormann   <[email protected]>
9961    
9962            * Resources/Bitmaps/dock_12.xpm, Resources/Bitmaps/undock_12.xpm:
9963            Updated design to try to make the button functionality more
9964            transparent.
9965    
9966    2003-04-14  Jonathan Coles   <[email protected]>
9967    
9968            * Thuban/UI/legend.py (LegendPanel.__init__): Call Create() to
9969            finalize the intialization of the panel.
9970    
9971            * Thuban/UI/dock.py (DockPanel.Create): New. Finalizes the
9972            creation of the panel. Should be the last thing called in the
9973            initializer of a subclass.
9974    
9975            * Thuban/UI/classgen.py (ClassGenDialog.__init__): Actively
9976            set the current selections in the combo boxes. This is needed
9977            under Windows.
9978    
9979            * Thuban/UI/classifier.py (Classifier.__init__): Add a top
9980            level panel to the dialog so that the background colors are
9981            consistent under Windows.
9982    
9983    2003-04-11  Jonathan Coles   <[email protected]>
9984    
9985            * Thuban/UI/classgen.py: Change color ramps to start at white
9986            not black.
9987    
9988            * Thuban/UI/legend.py: Enable/disable the legend buttons when
9989            the legend changes. Fixes RTbug #1793.
9990    
9991            * test/test_classification.py: Added test for copying of
9992            classifications.
9993    
9994    2003-04-11  Jonathan Coles   <[email protected]>
9995    
9996            * Thuban/UI/resource.py: New. Centralize the loading of resources
9997            such as bitmaps.
9998    
9999            * Thuban/UI/classgen.py (GenUniquePanel.__init__): Reordered buttons,
10000            added images to the move buttons, added 'reverse' button.
10001            (CustomRampPanel.__init__): Added images to the move buttons.
10002            (GreyRamp): New. Generates a ramp from white to black.
10003            (HotToColdRamp): New. Generates a ramp from cold to hot colors.
10004    
10005            * Thuban/UI/classifier.py: Refactored ID's from ID_CLASSIFY_* to
10006            ID_PROPERTY_*.
10007            (Classifier.__init__): Minor changes to the layout.
10008            (Classifier._OnTitleChanged): Listen for when the user edits the
10009            title and update the dialog's title and the layer's title.
10010    
10011            * Thuban/UI/dock.py: Use new bitmaps for the control buttons.
10012    
10013            * Thuban/UI/legend.py: Use new bitmaps for the control buttons.
10014            (LegendTree._OnMsgLayerTitleChanged): Change the displayed title
10015            if the layer's title changes.
10016    
10017            * Thuban/UI/mainwindow.py: Added new menu item and associated code
10018            to open a dialog to rename the map.
10019            (MainWindow): Use new resource class to import bitmaps.
10020    
10021    2003-04-11  Jonathan Coles   <[email protected]>
10022    
10023            * Resources/Bitmaps/close_12.xpm, Resources/Bitmaps/dock_12.xpm,
10024            Resources/Bitmaps/group_use.xpm, Resources/Bitmaps/group_use_all.xpm,
10025            Resources/Bitmaps/group_use_none.xpm,
10026            Resources/Bitmaps/group_use_not.xpm,
10027            Resources/Bitmaps/hide_layer.xpm,
10028            Resources/Bitmaps/layer_properties.xpm,
10029            Resources/Bitmaps/lower_layer.xpm, Resources/Bitmaps/raise_layer.xpm,
10030            Resources/Bitmaps/show_layer.xpm, Resources/Bitmaps/undock_12.xpm:
10031            New.
10032    
10033    2003-04-10  Jonathan Coles   <[email protected]>
10034    
10035            * Thuban/Model/classification.py: (ClassGroupRange.__init__):
10036            Should pass group to ClassGroup constructor.
10037    
10038    2003-04-10  Jonathan Coles   <[email protected]>
10039    
10040            * Thuban/Model/classification.py: (ClassGroup): Move all the common
10041            methods of the derived classes ([Set|Get]Properties(), __eq__, __ne__)
10042            here. Implement SetVisible(), IsVisible().
10043            (ClassGroup.__init__): Add group parameter which acts as a copy
10044            constructor.
10045    
10046            * Thuban/UI/classifier.py (ClassTable): Add a new column for the
10047            "Visible" check boxes.
10048            (Classifier): Rename the buttons and refactor the code to match
10049            the new labels.
10050    
10051            * Thuban/UI/legend.py: Classify button is now called "Properties".
10052            Refactored the code to change variable names.
10053            (LegendTree.__FillTreeLayer): Only list a group if it is visible.
10054    
10055            * Thuban/UI/mainwindow.py: MainWindow.OpenClassifier renamed to
10056            MainWindow.OpenLayerProperties. MainWindow.LayerEditProperties
10057            renamed to MainWindow.LayerEditProperties.
10058            (MainWindow.ToggleLegend): Don't include map name in legend title.
10059            (MainWindow.SetMap): Added the map name to the window title.
10060            (MainWindow.LayerFillColor, MainWindow.LayerTransparentFill,
10061            MainWindow.LayerOutlineColor, MainWindow.LayerNoOutline): Removed.
10062            Functionality is found in the layer properties dialog.
10063    
10064            * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Only
10065            draw visible groups.
10066    
10067    2003-04-09  Jonathan Coles   <[email protected]>
10068    
10069            * Thuban/UI/classgen.py: Modifications to allow simple
10070            addition and selection of new color schemes.
10071            (MonochromaticRamp): New. Generates a ramp between two colors.
10072            (RedRamp): New. Generates a ramp of all red.
10073            (GreenRamp): New. Generates a ramp of all green.
10074            (BlueRamp): New. Generates a ramp of all blue.
10075    
10076    2003-04-09  Jonathan Coles   <[email protected]>
10077    
10078            * Thuban/Model/classification.py (Classification.__deepcopy__):
10079            Need to copy over field and fieldType attributes.
10080    
10081            * Thuban/Model/table.py (Table.field_range): New. Retrive the
10082            maximum and minimum values over the entire table for a given
10083            field.
10084            (Table.GetUniqueValues): New. Retrieve all the unique values
10085            in the table for a given field.
10086    
10087            * Thuban/UI/classgen.py: Renamed GenRangePanel to GenUniformPanel.
10088            (GenUniquePanel): New. Controls to allow the user to select
10089            which unique field values they would like in the classification.
10090            (CustomRampPanel): Code that was in ClassGenDialog that allows
10091            the user to select the properties for a custom ramp.
10092            (ClassGenerator.GenUniformDistribution): Was called GenerateRanges.
10093    
10094            * Thuban/UI/classifier.py: Removed a lot of debugging code.
10095            (Classifier._SetClassification): Callback method so that the
10096            class generator can set the classification in the grid.
10097            (ClassGroupPropertiesCtrl): New. Encapsulates the drawing and
10098            editing of a group properties class into a wxWindows control.
10099    
10100            * Thuban/UI/dock.py: It was decided that if the user closes
10101            a dockable window the window should simply hide itself. That
10102            way if the user wants to show the dock again it appears in the
10103            same place as it was when it was closed.
10104            (DockableWindow.Destroy): Call renamed method OnDockDestroy().
10105            (DockableWindow._OnButtonClose): Hide the window instead of
10106            destroying it.
10107            (DockableWindow._OnClose): Hide the window instead of
10108            destroying it.
10109    
10110            * Thuban/UI/legend.py (LegendTree): Use a private method to
10111            consistently set the font and style of the text. Fixes RTbug #1786.
10112    
10113            * Thuban/UI/mainwindow.py: Import just the Classifier class.
10114    
10115    2003-04-07  Bernhard Herzog  <[email protected]>
10116    
10117            * Thuban/UI/mainwindow.py (main_menu): Move the toggle_legend item
10118            to the map module
10119    
10120    2003-04-07  Bernhard Herzog  <[email protected]>
10121    
10122            * Thuban/UI/mainwindow.py (MainWindow.ShowSessionTree): Removed in
10123            favor of ToggleSessionTree
10124            (MainWindow.ToggleSessionTree): New method to toggle visibility of
10125            the session tree.
10126            (MainWindow.SessionTreeShown): New method to return whether the
10127            session tree is currently shown.
10128            (MainWindow.ToggleLegend): New method to toggle visibility of the
10129            legend
10130            (MainWindow.ShowLegend): Implement in terms of ToggleLegend and
10131            LegendShown
10132            (MainWindow.LegendShown): New method to return whether the legend
10133            is currently shown.
10134            (_method_command): Add checked parameter so we can define check
10135            menu items
10136            (_has_tree_window_shown, _has_legend_shown): Use the appropriate
10137            mainwindow methods.
10138            (show_session_tree, show_legend commands): Removed.
10139            (toggle_session_tree, toggle_legend commands): New commands to
10140            toggle the visibility of the dialogs
10141    
10142    2003-04-07  Jonathan Coles   <[email protected]>
10143    
10144            * Thuban/UI/classgen.py: Fix Windows problem.
10145    
10146            * Thuban/UI/dock.py: Fix Windows problem.
10147    
10148            * Thuban/UI/mainwindow.py: Use False instead of false.
10149            (MainWindow.ShowLegend): Remove unnecessary switch parameter.
10150    
10151    2003-04-07  Jonathan Coles   <[email protected]>
10152    
10153            Since we now say that the order of the groups in a classification
10154            matters, it makes sense to be able to manipulate that order. Most
10155            of the changes to Thuban/Model/classification.py are to that end.
10156    
10157            * Thuban/Model/classification.py (Classification.AppendGroup,
10158            Classification.InsertGroup, Classification.ReplaceGroup,
10159            Classification.RemoveGroup, Classification.GetGroup): Do as the
10160            names imply.
10161            (Classification.FindGroup): This was called GetGroup, but GetGroup
10162            takes an index, while FindGroup takes a value.
10163            (Classification.__deepcopy__): Copy all the groups, BUT NOT THE LAYER
10164            REFERENCE. Currently there is a cyclic reference between the layer
10165            and its classification. If the classification doesn't need to know
10166            its owning layer we can change this, since it may make sense to be
10167            able to use the same classification with different layers.
10168    
10169            * Thuban/Model/load.py: Use Classification.AppendGroup(), not AddGroup()
10170    
10171            * Thuban/UI/classgen.py: Use Classification.AppendGroup(),
10172            not AddGroup()
10173    
10174            * Thuban/UI/classifier.py: Now that we can depend on the order in
10175            a Classification and have methods to manipulate that order we don't
10176            need to use our own data structures in the grid. We can simply make
10177            the grid/table access the information they need from a copy of
10178            the classification object.
10179            (Classifier._OnCloseBtn): Event handler for when the user clicks
10180            'Close'. This is needed so if the user applies changes and then
10181            continues to change the table the user has the option of discarding
10182            the most recent changes and keeping what they applied.
10183    
10184            * Thuban/UI/mainwindow.py: Put "Show Legend" and "Show Session Tree"
10185            into the same group.
10186    
10187            * extensions/thuban/wxproj.cpp (check_version): If Thuban is compiled
10188            with a really old version of proj, PJ_VERSION won't even be defined.
10189            If it isn't defined then just compile so that the function always
10190            returns Py_False.
10191    
10192            * test/test_classification.py: Fix tests to use the renamed methods.
10193            Still need to write tests for the new methods.
10194    
10195    2003-04-04  Jonathan Coles   <[email protected]>
10196    
10197            * Thuban/UI/classifier.py (Classifier.__SelectField): Move the
10198            call to SetSelection out of the method and before the call
10199            to __SelectField in __init__. This prevents a recursion of events
10200            when _OnFieldSelect is triggered by the user.
10201    
10202    2003-04-04  Jonathan Coles   <[email protected]>
10203    
10204            * Thuban/Model/classification.py: Rename Color.None to
10205            Color.Transparent.
10206            (ClassGroupProperties.SetLineColori, ClassGroupProperties.SetFill):
10207            Don't bother copying the color, since Colors are immutable.
10208    
10209            * Thuban/Model/color.py, Thuban/Model/layer.py, Thuban/Model/load.py,
10210            Thuban/UI/classifier.py, Thuban/UI/mainwindow.py,
10211            Thuban/UI/renderer.py, Thuban/UI/view.py:
10212            Rename Color.None to Color.Transparent.
10213        
10214            * test/test_classification.py, test/test_load.py: Rename Color.None
10215            to Color.Transparent.
10216    
10217    2003-04-04  Jonathan Coles   <[email protected]>
10218    
10219            * Thuban/Model/classification.py: Fix assert calls.
10220            (ClassGroupProperties.SetLineColor, ClassGroupProperties.SetFill):
10221            Copy the color parameter rather than hold onto a reference.
10222    
10223            * Thuban/Model/color.py (Color.__copy__, Color.__deepcopy): Copy
10224            the color object.
10225            (NoColor.__copy__, NoColor.__deepcopy): Return 'self' so that we
10226            are sure there exists only one refernce to Color.None in the system.
10227            This allows us to use 'is' rather than the comparision functions.
10228            
10229            * Thuban/Model/save.py: Fix assert calls.
10230            
10231            * Thuban/UI/classifier.py: Fix assert calls.
10232            (ClassGrid._OnCellDClick): Call up to the classifier to open the
10233            dialog to edit the groups properties.
10234            (ClassGrid._OnCellResize): Make sure that the scollbars are drawn
10235            correctly if a cell is resized.
10236            (ClassTable.SetClassification): New. Changes the classification
10237            that is in the table.
10238            (ClassTable.__SetRow): Allow groups to be prepended.
10239            (Classifier): New code for opening the EditProperties and
10240            GenerateRanges dialogs.
10241            (SelectPropertiesDialog.__GetColor): Only set the color in the
10242            color dialog if the current color is not None.
10243            
10244            * Thuban/UI/dock.py: Fix assert calls.
10245            
10246            * Thuban/UI/legend.py: Fix assert calls.
10247            
10248            * Thuban/UI/renderer.py: Fix assert calls.
10249            
10250            * Thuban/UI/classgen.py (ClassGenDialog): Dialog for generating
10251            classifications.
10252            (GenRangePanel): Panel specific to range generation.
10253            (GenSingletonPanel): Panel specific to singleton generation.
10254            (ClassGenerator): Class responsible for actually generating
10255            the classification from the data gathered in the dialog box.
10256            (PropertyRamp): Generates properties whose values range from
10257            a starting property to an ending property.
10258    
10259    2003-04-03  Bernhard Herzog  <[email protected]>
10260    
10261            * test/support.py (print_garbage_information): New function that
10262            prints information about still connected messages and memory
10263            leaks.
10264            (run_suite): Removed.
10265            (run_tests): New function for use as a replacement of
10266            unittest.main in the test_* files. This one calls
10267            print_garbage_information at the end.
10268    
10269            * test/runtests.py (main): Use support.print_garbage_information
10270    
10271            * test/test_layer.py: Use support.run_tests instead of
10272            unittest.main so we get memory leak information
10273            (TestLayer.test_arc_layer, TestLayer.test_polygon_layer)
10274            (TestLayer.test_point_layer, TestLayer.test_empty_layer)
10275            (TestLayerLegend.test_visibility): Call the layer's Destroy method
10276            to fix a memory leak.
10277    
10278            * test/test_classification.py: Use support.run_tests instead of
10279            unittest.main so we get memory leak information
10280            (TestClassification.test_classification): Call the layer's Destroy
10281            method to fix a memory leak.
10282    
10283    2003-04-02  Bernhard Herzog  <[email protected]>
10284    
10285            * extensions/thuban/wxproj.cpp (check_version, check_version_gtk):
10286            Handle the reference counts of the return value and errors in
10287            PyArg_ParseTuple correctly.
10288    
10289            * Thuban/UI/application.py (ThubanApplication.OpenSession): Make
10290            sure the filename is absolute to avoid problems when saving the
10291            session again
10292    
10293            * Thuban/Model/table.py: Remove unnecessary import. Fix a typo.
10294    
10295    2003-04-01  Jonathan Coles   <[email protected]>
10296    
10297            *  Thuban/UI/renderer.py (MapRenderer.draw_point_shape): Check
10298            that there actually are points in the returned list of points
10299            before trying to index into the list. The list may be empty if
10300            the shape is a Null Shape.
10301    
10302    2003-04-01  Bernhard Herzog  <[email protected]>
10303    
10304            * test/test_map.py: Don't use from <module> import *
10305    
10306    2003-04-01  Jonathan Coles   <[email protected]>
10307    
10308            * Thuban/Model/session.py: Use LAYER_CHANGED instead of
10309            LAYER_LEGEND_CHANGED
10310    
10311            * Thuban/UI/dock.py (DockableWindow._OnButtonClose): Call
10312            self.Destroy() to close the window after yesterday's changes.
10313    
10314            * test/test_map.py, test/test_session.py: Fix messages that
10315            are sent from maps and layers.
10316    
10317    2003-03-31  Jonathan Coles   <[email protected]>
10318    
10319            * Thuban/UI/classifier.py: Commented out some debugging statements.
10320            (ClassDataPreviewer.Draw): Draw rectangles for polygon layers per
10321            RTbug #1769.
10322    
10323            * Thuban/UI/dock.py (DockableWindow.UnDock): Restore size and
10324            position (although position doesn't work yet under GTK).
10325            (DockableWindow.Destroy): New. Called when the window must be
10326            closed. Namely needed when the DockFrame closes and must close
10327            its children.
10328            (DockFrame): Listen for EVT_CLOSE and destroy all children.
10329    
10330            * Thuban/UI/legend.py (LegendPanel.Destroy): New. Cleans up
10331            when then window is told to close.
10332            (LegendTree._OnMsgLayerChanged): Fixes a seg fault bug. See
10333            comment in source for more info.
10334    
10335            * Thuban/UI/main.py: Show the legend by default when Thuban starts.
10336    
10337            * Thuban/UI/mainwindow.py: Renamed OnClose to _OnClose for
10338            symmetry with other such methods.
10339            (MainWindow.ShowLegend): Show the legend docked by default.
10340    
10341    2003-03-28  Jonathan Coles   <[email protected]>
10342    
10343            * Thuban/UI/classifier.py: Support for highlighting a specific
10344            group within the grid when the classification dialog is opened.
10345            Also contains a lot of debugging printouts which will later
10346            be removed.
10347    
10348            * Thuban/UI/dock.py: Complete rework on the dock code so that
10349            that it is fairly removed from the rest of the Thuban application.
10350            It is easy to add new docks which the rest of the program having
10351            to be aware of them.
10352    
10353            * Thuban/UI/legend.py: Modifications to support selecting a
10354            specific group in the classification dialog. Changed how layers
10355            are drawn when the layer is visible/invisible.
10356    
10357            * Thuban/UI/mainwindow.py: Removed legend specific code and
10358            replaced it with calls to the new dock code.
10359    
10360            * Thuban/UI/renderer.py (MapRenderer.__init__): Added assert
10361            to check if scale > 0. Trying to track down a divide by zero.
10362    
10363    2003-03-26  Jonathan Coles   <[email protected]>
10364    
10365            * Thuban/UI/legend.py: Removed unnecessary LegendDialog class.
10366            (LegendPanel): Removed _OnDock()/_OnUnDock() methods which are
10367            now part of DockableWindow.
10368            (LegendPanel.DoOnSelChanged): Select the current layer in the
10369            map.
10370            (LegendTree._OnSelChanged): Call LegendPanel.DoOnSelChanged()
10371            with the selected layer and/or group.
10372    
10373    2003-03-26  Jonathan Coles   <[email protected]>
10374    
10375            This putback contains the code for dockable windows. There is
10376            no support in wxWindows as of this date for windows that can
10377            attach themselves to other windows.
10378    
10379            The current model contains a DockableWindow which has a parent
10380            window for when it is detached and a dock window that it puts
10381            its contents in when it is docked. The contents of a DockableWindow
10382            must be a DockPanel. DockPanel itself derives from wxPanel.
10383    
10384            * Thuban/Model/layer.py (Layer.ClassChanged): Send a LAYER_CHANGED
10385            message, not a LAYER_LEGEND_CHANGED message.
10386    
10387            * Thuban/Model/map.py (Map): Forward LAYER_CHANGED messages.
10388    
10389            * Thuban/UI/classifier.py (Classifier.__init__): Use wxADJUST_MINSIZE
10390            as one of the style properties for the fieldTypeText item to
10391            be sure that its size is correct when the text changes.
10392    
10393            * Thuban/UI/dock.py: New. Classes for the DockPanel and
10394            DockableWindow.
10395    
10396            * Thuban/UI/legend.py: Added some more buttons and made the
10397            LegendPanel a DockPanel.
10398    
10399            * Thuban/UI/mainwindow.py: Added sash windows to the main window
10400            and supporting functions for manipulating the sashes.
10401            (MainWindow.ShowLegend): Create a DockableWindow with the
10402            LegendPanel as the contents.
10403    
10404            * Thuban/UI/messages.py: Added DOCKABLE_* messages
10405    
10406            * Thuban/UI/view.py (MapCanves.SetMap): Listen for LAYER_CHANGED,
10407            not LAYER_LEGEND_CHANGED, messages.
10408    
10409    2003-03-25  Jonathan Coles   <[email protected]>
10410    
10411            * setup.py: Added custom script bdist_rpm_build_script so that
10412            when the rpm is built the path to wx-config is correct.
10413    
10414            * setup.cfg: Added line saying to use the custom build script
10415    
10416    2003-03-20  Jonathan Coles   <[email protected]>
10417    
10418            Initial implementation of the Legend.
10419    
10420            * Thuban/UI/legend.py: New. Creates a window that shows the map's
10421            Legend information and allows the user to add/modify classifications
10422            and how the layers are drawn on the map.
10423    
10424            * setup.py: New command 'build_docs' which currently uses
10425            happydoc to generate html documentation for Thuban.
10426    
10427            * Thuban/Model/classification.py (ClassGroup.GetDisplayText): New.
10428            Returns a string which is appropriately describes the group.
10429    
10430            * Thuban/Model/layer.py (Layer.SetClassification): Generate a
10431            LAYER_CHANGED event instead of a LAYER_LEGEND_CHANGED event.
10432    
10433            * Thuban/Model/map.py (Map): Rename messages and use new, more
10434            specific, messages.
10435    
10436            * Thuban/Model/messages.py: New message to indicate that a layer's
10437            data has changed (LAYER_CHANGED). New map messages to indicate
10438            when layers have been added/removed/changed or if the stacking order
10439            of the layers has changed.
10440    
10441            * Thuban/Model/session.py: Rename and use new messages.
10442    
10443            * Thuban/UI/classifier.py: Remember if any changes have actually
10444            been applied so that if the dialog is cancelled without an application
10445            of changes we don't have to set a new classification.
10446            (ClassDataPreviewer): Pulled out the window specific code and put it
10447            ClassDataPreviewWindow. ClassDataPreviewer can then be used to draw
10448            symbols on any DC.
10449            
10450            * Thuban/UI/mainwindow.py: New code to open the legend.
10451    
10452            * Thuban/UI/view.py: Use new message names.
10453    
10454    2003-03-19  Jonathan Coles   <[email protected]>
10455    
10456            * Thuban/UI/main.py (verify_versions): New. Checks the versions
10457            of Python, wxPython, and some other libraries.
10458    
10459            * extensions/thuban/wxproj.cpp (check_version): Checks the given
10460            version against what wxproj was compiled with.
10461            (check_version_gtk): If wxproj was compiled with gtk then check
10462            the given version against the version of the gtk library
10463            currently being used.
10464    
10465    2003-03-14  Bernhard Herzog  <[email protected]>
10466    
10467            * test/test_command.py: Run the tests when the module is run as a
10468            script
10469    
10470    2003-03-14  Bernhard Herzog  <[email protected]>
10471    
10472            Implement selection of multiple selected shapes in the same layer:
10473    
10474            - Introduce a new class to hold the selection. This basically
10475              replaces the interactor which was nothing more than the
10476              selection anyway. A major difference is of course that the new
10477              selection class supports multiple selected shapes in one layer
10478            
10479            - Move the object that represents the selection from the
10480              application to the canvas. The canvas is a better place than the
10481              application because the selection represents which shapes and
10482              layer of the map displayed by the canvas are selected and
10483              affects how the map is drawn.
10484    
10485            - Make the selection and its messages publicly available through
10486              the mainwindow.
10487    
10488            - The non-modal dialogs do not get a reference to the interactor
10489              anymore as they can simply refer to their parent, the
10490              mainwindow, for the what the interactor had to offer.
10491    
10492            * Thuban/UI/selection.py: New module with a class to represent the
10493            selection.
10494    
10495            * Thuban/UI/messages.py (SELECTED_TABLE, SELECTED_MAP): Remove
10496            these unused messages
10497    
10498            * Thuban/UI/application.py (ThubanApplication.OnInit)
10499            (ThubanApplication.OnExit, ThubanApplication.SetSession): The
10500            interactor is gone now.
10501            (ThubanApplication.CreateMainWindow): There is no interactor
10502            anymore so we pass None as the interactor argument for now for
10503            compatibility.
10504    
10505            * Thuban/UI/view.py (MapCanvas.delegated_messages)
10506            (MapCanvas.Subscribe, MapCanvas.Unsubscribe): In Subscribe and
10507            Unsubscribe, delegate messages according to the delegated_messages
10508            class variable.
10509            (MapCanvas.__getattr__, MapCanvas.delegated_methods): Get some
10510            attributes from instance variables as described with the
10511            delegated_methods class variable.
10512            (MapCanvas.__init__): New instance variable selection holding the
10513            current selection
10514            (MapCanvas.do_redraw): Deal with multiple selected shapes. Simply
10515            pass them on to the renderer
10516            (MapCanvas.SetMap): Clear the selection when a different map is
10517            selected.
10518            (MapCanvas.shape_selected): Simple force a complete redraw. The
10519            selection class now takes care of only issueing SHAPES_SELECTED
10520            messages when the set of selected shapes actually does change.
10521            (MapCanvas.SelectShapeAt): The selection is now managed in
10522            self.selection
10523    
10524            * Thuban/UI/mainwindow.py (MainWindow.delegated_messages)
10525            (MainWindow.Subscribe, MainWindow.Unsubscribe): In Subscribe and
10526            Unsubscribe, delegate messages according to the delegated_messages
10527            class variable.
10528            (MainWindow.delegated_methods, MainWindow.__getattr__): Get some
10529            attributes from instance variables as described with the
10530            delegated_methods class variable.
10531            (MainWindow.__init__): The interactor as ivar is gone. The
10532            parameter is still there for compatibility. The selection messages
10533            now come from the canvas.
10534            (MainWindow.current_layer, MainWindow.has_selected_layer):
10535            Delegate to the the canvas.
10536            (MainWindow.LayerShowTable, MainWindow.Classify)
10537            (MainWindow.identify_view_on_demand): The dialogs don't need the
10538            interactor parameter anymore.
10539    
10540            * Thuban/UI/tableview.py (TableFrame.__init__)
10541            (LayerTableFrame.__init__, LayerTableFrame.OnClose)
10542            (LayerTableFrame.row_selected): The interactor is gone. It's job
10543            from the dialog's point of view is now done by the mainwindow,
10544            i.e. the parent. Subscribe to SHAPES_SELECTED instead
10545            of SELECTED_SHAPE
10546            
10547            * Thuban/UI/dialogs.py (NonModalDialog.__init__): The interactor
10548            is gone. It's job from the dialog's point of view is now done by
10549            the mainwindow, i.e. the parent.
10550            
10551            * Thuban/UI/classifier.py (Classifier.__init__): The interactor is
10552            gone. It's job from the dialog's point of view is now done by the
10553            mainwindow, i.e. the parent.
10554    
10555            * Thuban/UI/tree.py (SessionTreeView.__init__): The interactor is
10556            gone. It's job from the dialog's point of view is now done by the
10557            mainwindow, i.e. the parent.
10558            (SessionTreeCtrl.__init__): New parameter mainwindow which is
10559            stored as self.mainwindow. The mainwindow is need so that the tree
10560            can still subscribe to the selection messages.
10561            (SessionTreeCtrl.__init__, SessionTreeCtrl.unsubscribe_all)
10562            (SessionTreeCtrl.update_tree, SessionTreeCtrl.OnSelChanged): The
10563            selection is now accessible through the mainwindow. Subscribe to
10564            SHAPES_SELECTED instead of SELECTED_SHAPE
10565    
10566            * Thuban/UI/identifyview.py (IdentifyView.__init__): Use the
10567            SHAPES_SELECTED message now.
10568            (IdentifyView.selected_shape): Now subscribed to SHAPES_SELECTED,
10569            so deal with multiple shapes
10570            (IdentifyView.__init__, IdentifyView.OnClose): The interactor is
10571            gone. It's job from the dialog's point of view is now done by the
10572            mainwindow, i.e. the parent.
10573    
10574            * Thuban/UI/controls.py (RecordListCtrl.fill_list): The second
10575            parameter is now a list of shape ids.
10576            (RecordTable.SetTable): The second parameter is now a list of
10577            indices.
10578    
10579            * Thuban/UI/renderer.py (ScreenRenderer.RenderMap): Rename the
10580            selected_shape parameter and ivar to selected_shapes. It's now a
10581            list of shape ids.
10582            (MapRenderer.draw_label_layer): Deal with multiple selected
10583            shapes. Rearrange the code a bit so that the setup and shape type
10584            distinctions are only executed once.
10585    
10586            * test/test_selection.py: Test cases for the selection class
10587    
10588    2003-03-11  Jonathan Coles   <[email protected]>
10589    
10590            * Thuban/Model/load.py: Temporary fix so that the xml reader
10591            doesn't cause Thuban to crash.
10592    
10593            * Thuban/Model/layer.py: Handle the cyclic references between
10594            a layer and its classification better, and be sure to disconnect
10595            the classification from the layer when the layer is destroyed
10596            so that we don't maintain a cyclic reference that may not be
10597            garbage collected.
10598    
10599            * Thuban/Model/classification.py: See comment for layer.py.
10600    
10601    2003-03-12  Jan-Oliver Wagner <[email protected]>
10602    
10603            * HOWTO-Release: New. Information on the steps for releasing
10604            a new version of Thuban.
10605    
10606    2003-03-11  Jonathan Coles   <[email protected]>
10607    
10608            * Thuban/UI/classifier.py: Add normal border to SelectPropertiesDialog.
10609            Use True instead of true.
10610            (Classifier): Should have a single panel in which all the controls lie.
10611    
10612            * Thuban/UI/proj4dialog.py: Add normal border.
10613    
10614            * Thuban/UI/tree.py: Fixed problem with bad item images under Windows.
10615    
10616            * Thuban/UI/mainwindow.py: Use True instead of true.
10617    
10618            * setup.py: Update some definitions to use wxWindows2.4 files
10619    
10620            * Data/iceland_sample_class.thuban: Fixed file so that the
10621            field_type information is present.
10622    
10623    2003-03-10  Jonathan Coles   <[email protected]>
10624    
10625            * Thuban/UI/classifier.py (Classifier.__init__): Make the
10626            field type label grow so that when the text changes the
10627            size is updated correctly. This may be a wxWindows bug.
10628    
10629    2003-03-10  Jonathan Coles   <[email protected]>
10630    
10631            * Thuban/UI/application.py: Changed SESSION_CHANGED to
10632            SESSION_REPLACED.
10633    
10634            * Thuban/UI/classifier.py: Wrap text with _().
10635            (ClassGrid.CreateTable): Set dimensions and size hints here,
10636            instead of in Reset, so we only set the size once.
10637    
10638            * Thuban/UI/dialogs.py: Don't need Shutdown(); just use Close()!
10639    
10640            * Thuban/UI/mainwindow.py (MainWindow.prepare_new_session):
10641            Call Close() instead of Shutdown().
10642    
10643            * Thuban/UI/messages.py: Changed SESSION_CHANGED to SESSION_REPLACED.
10644    
10645            * Thuban/UI/tree.py: Changed SESSION_CHANGED to SESSION_REPLACED.
10646            Go back to using OnClose() instead of Shutdown().
10647    
10648    2003-03-10  Jonathan Coles   <[email protected]>
10649    
10650            * Thuban/UI/classifier.py (Classifier): SelectField() needed
10651            to know the old field index as well as the new one.
10652    
10653    2003-03-10  Jonathan Coles   <[email protected]>
10654    
10655            * Thuban/UI/classifier.py (Classifier): Use __SelectField()
10656            to correctly set the table information and call this from
10657            __init__ and from _OnFieldSelect so that all the information
10658            is up to date when the dialog opens and when a field is changed.
10659    
10660    2003-03-10  Jonathan Coles   <[email protected]>
10661    
10662            * Thuban/Model/classification.py (Classification): Don't use
10663            layer's message function directly, use the ClassChanged() method
10664            when then classification changes. SetField/SetFieldType/SetLayer
10665            must keep the information about field name and field type in
10666            sync when an owning layer is set or removed.
10667    
10668            * Thuban/Model/layer.py: Added ClassChanged() so that the
10669            classification can tell the layer when its data has changed.
10670            (Layer.SetClassification): Accepts None as an arguement to
10671            remove the current classification and correctly handles
10672            adding a new classification.
10673    
10674            * Thuban/Model/load.py: Comment out print statement
10675    
10676            * test/test_classification.py, test/test_save.py: New and
10677            improved tests.
10678    
10679    2003-03-07  Jonathan Coles   <[email protected]>
10680    
10681            * Thuban/Model/classification.py: Implemented __copy__ and
10682            __deepcopy__ for ClassGroup* and ClassGroupProperites so
10683            they can easily be copied by the classifier dialog.
10684            (ClassGroupProperites.__init__): The default line color should
10685            have been Color.Black.
10686    
10687            * Thuban/UI/classifier.py: Setting and Getting table values now
10688            uses a consistent set of functions.
10689            (Classifier): Now non-modal. Has field type label which changes
10690            as the field changes. Keep track of buttons in a list so that
10691            we can enable/disable the buttons when the None field is selected.
10692            (SelectPropertiesDialog): Add buttons to make the colors transparent.
10693    
10694            * Thuban/UI/dialogs.py (NonModalDialog.Shutdown): New method which
10695            does what OnClose did, but can be called by the application to
10696            close a window. Needed when a session changes, and we have to
10697            close the classifier windows.
10698    
10699            * Thuban/UI/mainwindow.py (MainWindow.prepare_new_session):
10700            Shuts down open dialogs. Used when a new session is created
10701            or a session is opened.
10702            (MainWindow.SaveSession): Should only call application.SaveSession()
10703            if we don't call SaveSessionAs first.
10704            (MainWindow.Classify): Allow different classifier dialogs for
10705            different layers.
10706    
10707            * Thuban/UI/tree.py (SessionTreeView): Remove OnClose and let
10708            the parent class handle it. Add Shutdown() to unsubscibe from
10709            event notification and call the parent Shutdown(). This was
10710            necessary so the application can close the tree window.
10711    
10712    2003-03-06  Jonathan Coles   <[email protected]>
10713    
10714            * Thuban/Model/classification.py: Minor documentation changes,
10715            Addition of __eq__ and __ne__ methods.
10716            (Classification.SetLayer): prevent recursion between this method
10717            and Layer.SetClassification().
10718    
10719            * Thuban/Model/color.py: Addition of __eq__ and __ne__ methods.
10720    
10721            * Thuban/Model/layer.py (SetClassification): prevent recursion
10722            between this method and Classification.SetLayer().
10723    
10724            * test/test_classification.py, test/test_load.py,
10725            test/test_session.py: Fixed and added tests for the classification
10726            classes.
10727    
10728    2003-03-06  Bernhard Herzog  <[email protected]>
10729    
10730            * Thuban/UI/classifier.py (ClassGrid.__init__)
10731            (ClassGrid.CreateTable): Move the SetSelectionMode call to
10732            CreateTable because otherwise it triggers an assertion in
10733            wxPython/wxGTK 2.4.
10734    
10735    2003-03-05  Jonathan Coles   <[email protected]>
10736    
10737            * Thuban/common.py: Move FIELDTYPE constants back to table.py.
10738    
10739            * Thuban/Model/load.py: import FIELDTYPE constants from table.
10740    
10741            * Thuban/UI/classifier.py: import FIELDTYPE constants from table.
10742    
10743            * Thuban/Model/table.py: Put FIELDTYPE constants back.
10744    
10745    2003-03-05  Jonathan Coles   <[email protected]>
10746    
10747            * Thuban/UI/classifier.py: Added class documentation.
10748            Fixed RTbug #1713, #1714. Added Move[Up|Down] buttons.
10749            Store just the groups in the table and generate the other
10750            column information when it is requested. Add "None" field
10751            to pull-down to select no classification.
10752    
10753            * Thuban/common.py: Moved FIELDTYPE constants from table.py
10754            (Str2Num): Only catch ValueError exceptions.
10755    
10756            * Thuban/Model/classification.py: Class documentation. Renaming
10757            of methods with Stroke to Line. Groups are stored in a single
10758            list with the default as the first element. Groups are searched
10759            in the order they appear in the list.
10760    
10761            * Thuban/Model/color.py: Documentation.
10762    
10763            * Thuban/Model/layer.py (Layer): Add GetFieldType to retreive
10764            the kind of data represented by a field.
10765    
10766            * Thuban/Model/load.py (ProcessSession): Use proper string
10767            conversion function; fixes RTbug #1713.
10768    
10769            * Thuban/Model/save.py (Saver): Store field type information.
10770    
10771            * Thuban/Model/table.py: Put FIELDTYPE constants in common.py.
10772            (Table): Add field_info_by_name() to retrieve field information
10773            by specifying the field name, not the number.
10774    
10775            * Thuban/UI/mainwindow.py: Function name changes.
10776    
10777            * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Only
10778            get the layer classification once. Don't try to classify
10779            values when the field is None: just use the default properties.
10780    
10781            * Thuban/UI/view.py: Function name changes.
10782    
10783            * Doc/thuban.dtd: Add field_type attribute to a classification.
10784    
10785    2003-03-04  Bernhard Herzog  <[email protected]>
10786    
10787            * Doc/thuban.dtd: Use correct syntax for optional attributes. Make
10788            the fill and stroke layer attributes optional with suitable
10789            default values. Add the stroke_width layer attribute. Use correct
10790            syntax for empty elements. Make the attribute list for labels
10791            refer to the label element.
10792    
10793    2003-03-04  Bernhard Herzog  <[email protected]>
10794    
10795            * setup.py (thuban_build_py.build): Add a comment about distutils in
10796            Python 2.3 containing some of the functionality we implement in
10797            setup.py ourselves.
10798    
10799            * Thuban/UI/classifier.py (ClassGrid.__init__): Set the table
10800            before the selection mode. Doing it the other way round triggers
10801            an assertion in wxWindows.
10802    
10803            * Thuban/Model/save.py (escape): Fix typo in doc-string
10804    
10805            * Thuban/Model/classification.py: Remove unnecessary wxPython
10806            import
10807    
10808    2003-03-04  Jonathan Coles   <[email protected]>
10809    
10810            * Thuban/Model/classification.py (ClassGroupRange.GetProperties):
10811            Parameter 'value' should default to None.
10812    
10813            * Thuban/UI/mainwindow.py: Use Layer.GetClassification() since
10814            the class attribute __classification is now private.
10815    
10816            * Thuban/UI/classifier.py (ClassGrid): Moved OnCellDClick() from
10817            Classifier to ClassGrid. Added support for removing selected rows,
10818            which including code for keeping track of when cells are selected,
10819            and deselected.
10820            (ClassTable): Support for added/removing rows. Fixed a problem
10821            with __ParseInput whereby it would not allow strings (only numbers)
10822            to be entered.
10823            (Classifier): Added button and supporting code for removing
10824            selected rows.
10825    
10826    2003-02-27  Jonathan Coles   <[email protected]>
10827    
10828            * Thuban/common.py: Moved color conversion functions into
10829            Thuban/UI/common.py.
10830            (Str2Num): Now converts the float (not the string) to a long/int
10831            so that an exception isn't thrown.
10832    
10833            * Thuban/UI/common.py: Common functions used in several UI modules
10834    
10835            * Thuban/Model/classification.py: Changed the class hierarchy
10836            so that a Classification consists of Groups which return
10837            Properties when a value matches a Group.
10838    
10839            * Thuban/Model/layer.py: Fixed name resolution problem.
10840    
10841            * Thuban/Model/load.py: Use new Classification and Group functions.
10842    
10843            * Thuban/Model/save.py (Saver.write_attribs): Fixes a test case
10844            failure.
10845            (Saver.write_classification): Use new Classification and Group
10846            functions.
10847    
10848            * Thuban/UI/classifier.py: Changes to use new Classification and Group
10849            functions. Fix to create a tuple with a single value instead of
10850            simply returning the value.
10851    
10852            * Thuban/UI/renderer.py: Use new Classification and Group functions.
10853            Use common.py functions.
10854    
10855            * Thuban/UI/tree.py: Use common.py functions.
10856            
10857            * test/test_classification.py: Use new Classification and Group
10858            classes.
10859    
10860    2003-02-24  Jonathan Coles   <[email protected]>
10861    
10862            * Thuban/common.py (Color2wxColour, wxColour2Color): Conversion
10863            functions from Thuban color objects to wxWindow colour objects.
10864    
10865            * Thuban/Model/classification.py (Classification): Renamed
10866            GetProperties() to GetClassData(). Used the new iterator
10867            in TreeInfo().
10868            (ClassIterator): Iterator implementation to iterate over the
10869            ClassData objects in a classification object.
10870    
10871            * Thuban/Model/save.py (Saver.write_classificaton): Uses
10872            the new iterator to save the classification information.
10873    
10874            * Thuban/UI/classifier.py (SelectPropertiesDialog): Support
10875            for changing the stroke and fill colors and previewing the
10876            changes.
10877    
10878            * Thuban/UI/mainwindow.py (MainWindow.OpenSession,
10879            MainWindow.SaveSessionAs): Text string changes so the dialogs
10880            have more meaningful titles.
10881    
10882            * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Change
10883            Classification method name from GetProperties to GetClassData.
10884    
10885            * Thuban/UI/view.py (MapCanvas.find_shape_at): Use method calls
10886            instead of accessing now non-existent class variables.
10887    
10888    2003-02-24  Bernhard Herzog  <[email protected]>
10889    
10890            * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Remove
10891            unneeded Shape() call. Rendering is substantially faster without
10892            it and it avoids some problems with broken shape files.
10893    
10894    2003-02-20  Frank Koormann   <[email protected]>
10895    
10896            Force minimal size of identify and label dialogs. The autosizing
10897            looked too ugly.
10898    
10899            * Thuban/UI/controls.py (RecordListCtrl): Set minimal width for columns.
10900            * Thuban/UI/labeldialog.py (LabelDialog.dialog_layout):
10901            Set size of listctrl.
10902            * Thuban/UI/identifyview.py (IdentifyView.__init__):
10903            Set size of dialog.
10904    
10905    2003-02-19  Jonathan Coles   <[email protected]>
10906    
10907            * test/test_classification.py, test/test_layer.py,
10908            test/test_load.py, test/test_map.py, test/test_session.py:
10909            Updated the tests to use the new functions that are in the
10910            respective classes.
10911    
10912            * Thuban/Model/classification.py (Classification):
10913            Uses the new ClassData* classes. Modification messages are
10914            passed up to the parent layer (if it exists).
10915            (ClassData): New class to encapsulate the common data in each
10916            classification property.
10917            (ClassDataDefault): Represents the Default class. data.
10918            (ClassDataPoint): Represents a single class. data point
10919            (ClassDataRange): Represents a class. range
10920            (ClassDataMap): Represents a class. map (unused).
10921    
10922            * Thuban/Model/color.py: Added Color.None to represent something
10923            with no color. Color.Black represents the color black.
10924            (NoColor): Helper class derived from Color to represent something
10925            with no color.
10926    
10927            * Thuban/Model/layer.py (Layer): Removed references to fill, stroke,
10928            stroke_width attributes. Made the 'classification' attribute private.
10929            New methods for setting/getting the classification.
10930    
10931            * Thuban/Model/load.py (ProcessSession): Use new methods on Layer
10932            to get the classifcation and use the new ClassData* classes to
10933            hold the classification data. Use Str2Num to convert numbers
10934            properly.
10935    
10936            * Thuban/Model/save.py (Saver): Use new Color and Classification
10937            methods
10938    
10939            * Thuban/UI/classifier.py (ClassGrid): New class to represent a
10940            custom grid.
10941            (ClassTable): Support for editing Values and Labels and for
10942            changing what type (point or range) of data is stored in each
10943            property based on how the user enters the data.
10944            (Classifier): Support for saving the new classifications and
10945            launching the dialog to edit a property.
10946            (SelectPropertiesDialog): New class for editing the visual
10947            properties of a classification (stroke color, width, and fill color)
10948            (ClassPreviewer): Took the Draw method from ClassRenderer and
10949            made most of it into this new class. Intend to use this class in
10950            the SelectPropertiesDialog for previewing changes.
10951    
10952            * Thuban/UI/renderer.py: Use new Color and Classification methods.
10953    
10954            * Thuban/UI/tree.py: Formatting changes.
10955    
10956            * Doc/thuban.dtd: Add 'label' element
10957    
10958            * Thuban/common.py: New. Contains common routines used throughout
10959            the code.
10960            (Str2Num): Takes a string and converts it to the "best" type of
10961            number.
10962    
10963    2003-02-14  Bernhard Herzog  <[email protected]>
10964    
10965            * Thuban/UI/view.py (MapCanvas.OnLeftUp): Make sure that the
10966            dragging flag is always set to 0 even when the tool implementation
10967            raises an exception
10968    
10969    2003-02-11  Bernhard Herzog  <[email protected]>
10970    
10971            * Thuban/UI/application.py (ThubanApplication.splash_screen): New
10972            method to create a splash screen.
10973            (ThubanApplication.ShowMainWindow): New. Show the main window.
10974            Needed so the splash screen can display the mainwindow
10975            (ThubanApplication.OnInit): Call the
10976            new splash_screen method to determine whether the application
10977            should display a splash screen. If it displays a splash screen do
10978            not immediately show the main window.
10979    
10980    2003-02-11  Jonathan Coles  <[email protected]>
10981    
10982            * Thuban/Model/classification.py: Added import line to fix
10983            feature conflicts between running on python2.2 and python2.1.
10984    
10985            * Thuban/UI/classifier.py (ClassTable): Didn't need to hang
10986            onto the clinfo parameter, so removed the deepcopy().
10987    
10988    2003-02-10  Jonathan Coles  <[email protected]>
10989    
10990            * Thuban/Model/save.py (Saver.open_element, Saver.close_element):
10991            Added element_open variable to track opening and closing of tags
10992            so that tags that don't span more than one line are closed with
10993            /> instead of </tag_name>. Use the GetDefault*() methods of
10994            the Classification class.
10995    
10996            * Thuban/Model/classification.py (Classificaton): Added set and
10997            get methods for the default data. The class also takes a layer
10998            reference so that modification messages can be sent. Fixed the
10999            methods to use the new ClassData class.
11000            (ClassData): New class to encapsulate the classification data
11001    
11002            * Thuban/Model/layer.py (Layer): Remove the
11003            Set[Fill|Stroke|StrokeWidth]() methods. Code should call the
11004            SetDefault*() methods on the layer's classification object.
11005            (Layer.__init__): Use the new SetDefault*() methods in the
11006            Classification class.
11007    
11008            * Thuban/Model/load.py (ProcessSession): Use the new ClassData
11009            object instead of a dictionary.
11010    
11011            * Thuban/UI/classifier.py (ClassRenderer): New class to
11012            draw the classifications in the dialog box's table.
11013            (Classifier): Modified to use the ClassRenderer class.
11014    
11015            * Thuban/UI/mainwindow.py (MainWindow): Use the SetDefault*()
11016            methods of the Classification class.
11017    
11018            * Thuban/UI/renderer.py (MapRenderer): Use the Get*() methods
11019            of the ClassData class.
11020    
11021            * test/test_classification.py, test/test_layer.py,
11022            test/test_map.py, test/test_session.py: Fix the tests to work
11023            with the above code changes.
11024    
11025    2003-02-03  Jonathan Coles  <[email protected]>
11026    
11027            * Thuban/Model/classification.py (Classification): Added getNull()
11028            to return the NullData reference
11029    
11030            * Thuban/Model/layer.py (Layer.SetFill, Layer.SetStroke,
11031            Layer.SetStrokeWidth): Modified these functions to change the
11032            null data in the classification rather than keep these values
11033            directly in the Layer class. Menu options to change these values
11034            work again.
11035    
11036    2003-01-28  Jonathan Coles  <[email protected]>
11037    
11038            * Thuban/UI/classifier.py (Classifier): Resolved merging conflicts.
11039            Fixed crashing problem on some systems. Dialog box shows
11040            classification data.
11041    
11042            * Thuban/UI/tree.py (SessionTreeCtrl.add_items): Handle drawing
11043            Colors in the tree view.
11044    
11045            * Thuban/Model/layer.py (Layer.TreeInfo): Added a call to build
11046            the tree info for classifications. Commented out unnecessary lines.
11047    
11048            * Thuban/Model/classification.py (Classification.TreeInfo): New
11049            function to add information about the classification into the
11050            tree view.
11051    
11052    2003-01-27  Jan-Oliver Wagner <[email protected]>
11053    
11054            * Thuban/__init__.py (_): New.
11055    
11056            * Thuban/Model/classification.py, Thuban/Model/extension.py,
11057            Thuban/Model/layer.py, Thuban/Model/load.py, Thuban/Model/map.py,
11058            Thuban/Model/session.py, Thuban/UI/application.py,
11059            Thuban/UI/classifier.py, Thuban/UI/context.py, Thuban/UI/controls.py,
11060            Thuban/UI/identifyview.py, Thuban/UI/labeldialog.py,
11061            Thuban/UI/mainwindow.py, Thuban/UI/menu.py, Thuban/UI/proj4dialog.py,
11062            Thuban/UI/renderer.py, Thuban/UI/tree.py, Thuban/Lib/connector.py,
11063            Thuban/Lib/fileutil.py: Replace user string by _() for i18n.
11064    
11065  2003-01-27  Jonathan Coles  <[email protected]>  2003-01-27  Jonathan Coles  <[email protected]>
11066    
11067    * Thuban/Model/layer.py: Classification initialization calls.          * Thuban/Model/layer.py: Classification initialization calls.
11068    
11069    * Thuban/Model/classification.py: Created class to encapsulate          * Thuban/Model/classification.py: Created class to encapsulate
11070    a layer classification. Supports specific data points and          a layer classification. Supports specific data points and
11071    ranges.          ranges.
11072    
11073    * Thuban/Model/load.py: Added support for loading classification          * Thuban/Model/load.py: Added support for loading classification
11074    information.          information.
11075    
11076    * Thuban/Model/save.py: Added support for saving classification          * Thuban/Model/save.py: Added support for saving classification
11077    information.          information.
11078    
11079    * Thuban/UI/classifier.py: Initial class for a dialog box for          * Thuban/UI/classifier.py: Initial class for a dialog box for
11080    specifying classification information.          specifying classification information.
11081    
11082    * Thuban/UI/mainwindows.py: Support for opening the classifier          * Thuban/UI/mainwindows.py: Support for opening the classifier
11083    dialog.          dialog.
11084    
11085    * Thuban/UI/renderer.py: Support for drawing a layer with the          * Thuban/UI/renderer.py: Support for drawing a layer with the
11086    classification information.          classification information.
11087    
11088    * Data/iceland_sample_class.thuban: iceland_sample with          * Data/iceland_sample_class.thuban: iceland_sample with
11089    classification data.          classification data.
11090    
11091    * test/test_classification: Tests for the Classification class.          * test/test_classification: Tests for the Classification class.
11092    
11093  2002-12-09  Bernhard Herzog  <[email protected]>  2002-12-09  Bernhard Herzog  <[email protected]>
11094    
# Line 60  Line 11124 
11124          * Thuban/UI/mainwindow.py: Altered the order of tools in the          * Thuban/UI/mainwindow.py: Altered the order of tools in the
11125          toolbar: First now are all navigation tools (Zoom In/Out, Pan,          toolbar: First now are all navigation tools (Zoom In/Out, Pan,
11126          Full Extent).          Full Extent).
11127        
11128  2002-10-23  Bernhard Herzog  <[email protected]>  2002-10-23  Bernhard Herzog  <[email protected]>
11129    
11130          * setup.py (setup call): version now 0.1.3          * setup.py (setup call): version now 0.1.3
# Line 171  Line 11235 
11235          * Thuban/UI/mainwindow.py (MainWindow.OnClose): Unsubscribe          * Thuban/UI/mainwindow.py (MainWindow.OnClose): Unsubscribe
11236          VIEW_POSITION          VIEW_POSITION
11237    
11238  2002-09-04  Frank Koormann   <[email protected]>  2002-09-04  Frank Koormann  <[email protected]>
11239    
11240          * Resources/Bitmaps/fullextent.xpm: Updated Icon (removed "potatoe")          * Resources/Bitmaps/fullextent.xpm: Updated Icon (removed "potatoe")
11241    
# Line 258  Line 11322 
11322    
11323          * Thuban/Model/table.py (Table.write_record): New method to write          * Thuban/Model/table.py (Table.write_record): New method to write
11324          records.          records.
11325          (Table.__init__): Open the DBF file for writing too.          (Table.__init__): Open the DBF file for writing too.
11326    
11327          * Thuban/UI/controls.py (RecordTable.SetValue): Write the value          * Thuban/UI/controls.py (RecordTable.SetValue): Write the value
11328          into the underlying table.          into the underlying table.
# Line 296  Line 11360 
11360          * setup.py (ThubanInstall.run): Don't repr install_lib_orig          * setup.py (ThubanInstall.run): Don't repr install_lib_orig
11361          because thubaninit_contents will do it for us.          because thubaninit_contents will do it for us.
11362    
11363  2002-08-16      Jan-Oliver Wagner <[email protected]>  2002-08-16  Jan-Oliver Wagner <[email protected]>
11364    
11365          * Thuban/UI/mainwindow.py: menu item 'show session tree' now disable if          * Thuban/UI/mainwindow.py: menu item 'show session tree' now disable if
11366          tree window already open          tree window already open
# Line 424  Line 11488 
11488          * Thuban/UI/tree.py: We can now simply subscribe to the session's          * Thuban/UI/tree.py: We can now simply subscribe to the session's
11489          CHANGED channel to be informed of changes.          CHANGED channel to be informed of changes.
11490          (SessionTreeCtrl.session_channels): Not needed any longer.          (SessionTreeCtrl.session_channels): Not needed any longer.
11491          (SessionTreeCtrl.unsubscribe_all, SessionTreeCtrl.session_changed):          (SessionTreeCtrl.unsubscribe_all, SessionTreeCtrl.session_changed):
11492          Only have to (un)subscribe CHANGED          Only have to (un)subscribe CHANGED
11493    
11494          * Thuban/Model/map.py (Map.TreeInfo): Deal better with empty maps.          * Thuban/Model/map.py (Map.TreeInfo): Deal better with empty maps.
# Line 485  Line 11549 
11549          * Thuban/Model/layer.py (Layer.TreeInfo),          * Thuban/Model/layer.py (Layer.TreeInfo),
11550          Thuban/Model/extension.py (Extension.TreeInfo),          Thuban/Model/extension.py (Extension.TreeInfo),
11551          Thuban/Model/map.py (Map.TreeInfo),          Thuban/Model/map.py (Map.TreeInfo),
11552          Thuban/Model/session.py (Session.TreeInfo):          Thuban/Model/session.py (Session.TreeInfo):
11553          Add TreeInfo methods to implement the new tree view update scheme          Add TreeInfo methods to implement the new tree view update scheme
11554    
11555  2002-07-16  Bernhard Herzog  <[email protected]>  2002-07-16  Bernhard Herzog  <[email protected]>
# Line 566  Line 11630 
11630          * setup.py: In the setup call, make sure that the library          * setup.py: In the setup call, make sure that the library
11631          directories are under $prefix/lib not directly under $prefix.          directories are under $prefix/lib not directly under $prefix.
11632    
11633  2002-06-20      Jan-Oliver Wagner <[email protected]>  2002-06-20  Jan-Oliver Wagner <[email protected]>
11634    
11635          * Thuban/Model/extension.py: new module to handle extension objects.          * Thuban/Model/extension.py: new module to handle extension objects.
11636          * Thuban/Model/messages.py: new messages for extensions.          * Thuban/Model/messages.py: new messages for extensions.
# Line 795  Line 11859 
11859          * Thuban/UI/messages.py (VIEW_POSITION): New message for the          * Thuban/UI/messages.py (VIEW_POSITION): New message for the
11860          position in the statusbar          position in the statusbar
11861    
11862  2002-04-26      Frank Koormann <[email protected]>  2002-04-26  Frank Koormann <[email protected]>
11863    
11864          * Thuban/UI/mainwindow.py: AddLayer, Dialog title s/session/data          * Thuban/UI/mainwindow.py: AddLayer, Dialog title s/session/data
11865    
11866  2002-04-24      Frank Koormann <[email protected]>  2002-04-24  Frank Koormann <[email protected]>
11867            
11868          * Resources/Bitmaps/identify.xpm: shadow added          * Resources/Bitmaps/identify.xpm: shadow added
11869    
11870          * Resources/Bitmaps/fullextent.xpm: new          * Resources/Bitmaps/fullextent.xpm: new
           
 2002-04-22      Jan-Oliver Wagner <[email protected]>  
11871    
11872          * Thuban/UI/tree.py (update_tree): added test for None on map bounding box  2002-04-22  Jan-Oliver Wagner <[email protected]>
11873    
11874  2002-04-21      Jan-Oliver Wagner <[email protected]>          * Thuban/UI/tree.py (update_tree): added test for None on map bounding
11875            box
11876    
11877    2002-04-21  Jan-Oliver Wagner <[email protected]>
11878    
11879          * Thuban/UI/proj4dialog.py (UTMProposeZoneDialog): new          * Thuban/UI/proj4dialog.py (UTMProposeZoneDialog): new
11880    
11881          * Thuban/UI/tree.py (update_tree): added added map extent          * Thuban/UI/tree.py (update_tree): added added map extent
11882    
11883          * Thuban/UI/mainwindow.py (_method_command): extended by parameter          * Thuban/UI/mainwindow.py (_method_command): extended by parameter
11884          icon; added map_full_extend as tool          icon; added map_full_extend as tool
11885    
11886  2002-04-19      Jan-Oliver Wagner <[email protected]>  2002-04-19  Jan-Oliver Wagner <[email protected]>
11887    
11888          * Thuban/UI/mainwindow.py (SaveSession): launch save as dialog for          * Thuban/UI/mainwindow.py (SaveSession): launch save as dialog for
11889          saving _new_ sessions          saving _new_ sessions
# Line 920  Line 11985 
11985    
11986          * setup.py: increase version number to 0.1          * setup.py: increase version number to 0.1
11987          (data_dist): New command class for data distribution          (data_dist): New command class for data distribution
           
11988    
11989  2001-09-14  Bernhard Herzog  <[email protected]>  2001-09-14  Bernhard Herzog  <[email protected]>
11990    
11991          * Thuban/UI/identifyview.py (IdentifyListCtrl.selected_shape):          * Thuban/UI/identifyview.py (IdentifyListCtrl.selected_shape):
11992          Handle the case of no layer (i.e. layer is None) properly.          Handle the case of no layer (i.e. layer is None) properly.
11993    
11994          * Thuban/UI/proj4dialog.py (UTMDialog.__init__, Proj4Dialog.__init__):          * Thuban/UI/proj4dialog.py (UTMDialog.__init__, Proj4Dialog.__init__):
11995          Set the initial selection of the combo boxes to reflect the          Set the initial selection of the combo boxes to reflect the
11996          projection we're starting with in a way that works on windows,          projection we're starting with in a way that works on windows,
11997          too.          too.
# Line 1037  Line 12101 
12101          (MainWindow.identify_view_on_demand): Store the interactor in an          (MainWindow.identify_view_on_demand): Store the interactor in an
12102          instvar and use that reference instead of going through main.app          instvar and use that reference instead of going through main.app
12103    
12104          * Thuban/UI/mainwindow.py (MainWindow.ShowSessionTree):          * Thuban/UI/mainwindow.py (MainWindow.ShowSessionTree):
12105          * Thuban/UI/application.py (ThubanApplication.OnInit):          * Thuban/UI/application.py (ThubanApplication.OnInit):
12106          * Thuban/UI/main.py (main): Create the session tree view in main          * Thuban/UI/main.py (main): Create the session tree view in main
12107          with the new mainwindow method ShowSessionTree and not directly          with the new mainwindow method ShowSessionTree and not directly
12108          the application's OnInit method          the application's OnInit method
# Line 1054  Line 12118 
12118          layer to the tableview dialog.          layer to the tableview dialog.
12119    
12120          * Thuban/UI/tableview.py: Add some doc-strings          * Thuban/UI/tableview.py: Add some doc-strings
12121          (TableGrid):          (TableGrid):
12122          (TableGrid.OnRangeSelect):          (TableGrid.OnRangeSelect):
12123          (TableGrid.OnSelectCell):          (TableGrid.OnSelectCell):
12124          (TableFrame.__init__):          (TableFrame.__init__):
# Line 1121  Line 12185 
12185  2001-09-05  Bernhard Herzog  <[email protected]>  2001-09-05  Bernhard Herzog  <[email protected]>
12186    
12187          * Thuban/UI/view.py (MapCanvas.__init__): New argument, interactor.          * Thuban/UI/view.py (MapCanvas.__init__): New argument, interactor.
12188            
12189          * Thuban/UI/mainwindow.py (MainWindow.__init__): New argument          * Thuban/UI/mainwindow.py (MainWindow.__init__): New argument
12190          interactor to pass through to the MapCanvas          interactor to pass through to the MapCanvas
12191            
12192          * Thuban/UI/application.py (ThubanApplication.OnInit): Use the new          * Thuban/UI/application.py (ThubanApplication.OnInit): Use the new
12193          argument to the MainWindow constructor to get rid of the ugly hack          argument to the MainWindow constructor to get rid of the ugly hack
12194          that made main.app available early just so that the mapcanvas          that made main.app available early just so that the mapcanvas
# Line 1171  Line 12235 
12235          (ThubanInstall.run): Remove the leading install root from the          (ThubanInstall.run): Remove the leading install root from the
12236          script filename if an install root was specified and use the new          script filename if an install root was specified and use the new
12237          link_file method          link_file method
12238            
12239          * Thuban/UI/mainwindow.py (MainWindow.AddLayer): Fit the map to          * Thuban/UI/mainwindow.py (MainWindow.AddLayer): Fit the map to
12240          the window when the first layer is added to the map.          the window when the first layer is added to the map.
12241    
# Line 1208  Line 12272 
12272          (InnoIconItem): Helper class for bdist_inno          (InnoIconItem): Helper class for bdist_inno
12273          (thuban_bdist_inno): Thuban specific version of bdist_inno. Added          (thuban_bdist_inno): Thuban specific version of bdist_inno. Added
12274          this together with the appropriate parameters, to the setup call.          this together with the appropriate parameters, to the setup call.
12275            
12276          * setup.cfg (bdist_inno): added new section for the inno setup          * setup.cfg (bdist_inno): added new section for the inno setup
12277          installer          installer
12278    

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

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26